Robotics StackExchange | Archived questions

ROS2 joy_node debugging?

Issue: How to debug joy_node not sending joy topics?

ROS2: Foxy

Joy_node:
- joystick/focal,now 1:1.7.0-1 arm64 [installed]
- ros-foxy-joy/focal,now 3.0.0-2focal.20210701.105425 arm64 [installed,automatic]

OS: Ubuntu 20.04.2 64-bit LTS Server Linux ROSbot 5.4.0-1036-raspi #39-Ubuntu SMP PREEMPT Wed May 12 17:37:51 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

Device: USB Wireless SNES Game Controller

Device is group input:
$ ls -l /dev/input/js0
crw-rw-rw- 1 root input 13, 0 May 27 11:16 /dev/input/js0

User in group input:
$ groups pi
pi : pi adm dialout cdrom floppy sudo audio dip video plugdev input netdev lxd ubuntu gpio i2c spi docker

$ jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (Controller) has 6 axes (X, Y, Z, Rz, Hat0X, Hat0Y)
and 13 buttons (BtnA, BtnB, BtnC, BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode).
Testing ... (interrupt to exit)
Axes: 0: 0 1: 0 2: 0 3: 0 4: 0 5: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off 12:off

None of these produce any output - not to stdout, not topic /joy
$ ros2 run joy joynode
$ ros2 run joy joy
node --ros-args -p devicename:="/dev/input/js0"
$ ros2 run joy joy
node --ros-args -p device_name:="/dev/input/event0"

The joynode is running:
$ ros2 topic list
/joy
/joy/set
feedback
/parameter_events
/rosout

$ ros2 topic info /joy
Type: sensor_msgs/msg/Joy
Publisher count: 1
Subscription count: 0

( Additionally, the joystick is readable on /dev/input/event0 with python3 evdev.readloop() and evdev.activekeys(0).value )

The joystick is readable on /dev/input/js0 with Python3 ioctl -- and the device name is "Controller".

$ sudo ./js_linux.py
Available devices:
/dev/input/js0
Opening /dev/input/js0...
Device name: Controller
6 axes found: x, y, z, rz, hat0x, hat0y
13 buttons found: X (remap: a), A (remap: b), B (remap: c), Y (remap: x), tl (remap: y), tr (remap: z), tl, tr, SELECT (remap: tl2), START (remap: tr2), select, start, mode

Looking at the joy_node code, it appears that it might be ignoring the device because it doesn't end in "-joystick"

UPDATE: Working after reboot. Guessing the event system was messed up by using Python-evdev.

Asked by RobotDreams on 2021-08-15 10:31:18 UTC

Comments

So in Foxy and later, the joystick node doesn't get its events through /dev/input/js0, so any tests that deal with that are irrelevant. Where it does get its events is from /dev/input/event*, so we have to concentrate on those. One way to examine those is to run:

$ ros2 run joy joy_enumerate_devices

Which should show you what devices SDL thinks are installed. If there are no devices there, then there is likely something wrong with your groups or permissions for /dev/input/event*. Once you have a device showing up there, then a simple:

$ ros2 run joy joy_node

Should start up and print something like "Opened joystick".

(as a side note, the "device_name" parameter expects the name as returned by joy_enumerate_devices, which is not a simple /dev/input/* name)

Asked by clalancette on 2021-08-16 12:46:29 UTC

Answers

Ok, well this is interesting - Today joy is seeing my controller, and publishing joy topics with xy axes and button values!

Thanks @clalancette - Looks like I was over thinking this. Today it works:

Perhaps running jstest or jscal yesterday before trying the node messed it up. Perhaps accessing it with Python-evdev didn't release it, I did have to CTRL-C twice to exit my programs. Perhaps it just needed a reboot. (Yesterday "$ ros2 run joy joy_node" was stuck with no printout, today it works.)

$ ros2 run joy joy_enumerate_devices
Joystick Device ID : Joystick Device Name
-----------------------------------------
                 0 : Controller
pi@ROSbot:~/rosbot-on-gopigo3/handsonros2$ ros2 run joy joy_node
[INFO] [1629144617.662619904] [joy_node]: No haptic (rumble) available, skipping initialization
[INFO] [1629144617.663449763] [joy_node]: Opened joystick: Controller.  deadzone: 0.050000  

$ ros2 topic echo /joy
header:
  stamp:
    sec: 1629144685
    nanosec: 390600086
  frame_id: joy
axes:
- -0.0
- -0.0
- -0.0
- -0.0
- 0.0
- 0.0
buttons:
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
---

And with y-axis-up rocker depressed:

---
header:
  stamp:
    sec: 1629144707
    nanosec: 519377462
  frame_id: joy
axes:
- -0.0         
- 1.0        <------ Y "Joy Pad" Up depressed
- -0.0
- -0.0
- 0.0
- 0.0
buttons:
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
---

Now I can figure out what config file I need to create for the SNES Controller to drive teleop_joy. I'm stoked!

Asked by RobotDreams on 2021-08-16 15:30:39 UTC

Comments

Did you finally figure out what exactly caused the issue?

I have a similar problem: yesterday I could run the joy_node (ros2 run joy joy_node) and I could echo the topic in a separate terminal (ros2 topic echo /joy), it was working perfectly.

But today I could not get the joystick working with ROS2 at all.

The joystick itself still works as jstest shows the type of the joystick and all axes and buttons correctly (also dynamically):

$ jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (Logitech Gamepad F710) has 8 axes (X, Y, Z, Rx, Ry, Rz, Hat0X, Hat0Y)
and 11 buttons (BtnA, BtnB, BtnX, BtnY, BtnTL, BtnTR, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).

But ROS can't find any joystick now:

$ ros2 run joy joy_enumerate_devices
Joystick Device ID : Joystick Device Name
-----------------------------------------

Permissions seems also OK (according to the joy tutorial):

$ ls -l /dev/input/js0
crw-rw-rw- 1 root input 13, 0 Sep  7 18:37

Asked by szeker on 2021-12-12 10:44:55 UTC

OK, I re-read all the comments again, and I just see, that /dev/input/js0 is not anymore relevant for the problem, but instead, I have to look around more about /dev/input/event*... I'll try to go on that path.

Sorry if it was any redundant question.

Asked by szeker on 2021-12-12 10:54:08 UTC

FYI:

The problem in my case was the lack of permissions for /dev/input/event0. After adding RW permissions, it is working fine now! :) (However, it is still a bit miraculous how or why it was working than yesterday - without having the right permissions...)

$ ls -al /dev/input/event0 
crw-rw-rw- 1 root input 13, 64 Sep  7 18:37 /dev/input/event0

Asked by szeker on 2021-12-12 11:07:11 UTC

Thanks @clalancette and @szeker for your inputs. They were really helpful. Fixed my issue. :)

Asked by dvy on 2022-09-19 18:19:36 UTC