Boiler Robotics ROS mini rover challenge.
To publish cmd_vel
data and control the rover, either run
ros2 run mini_rover twist_publisher
to read controller input via pygame
or
ros2 run mini_rover twist_publisher_middleman
ros2 run joy joy_node
to use the joy
ROS library to subscribe to and publish joystick data.
Note that if the joystick was detected, running joy_node
should look something like
kevin@ky28059:~$ ros2 run joy joy_node
[INFO] [1694708210.131486648] [joy_node]: No haptic (rumble) available, skipping initialization
[INFO] [1694708210.131830166] [joy_node]: Opened joystick: Core (Plus) Wired Controller. deadzone: 0.050000
and the topic list should look something like
kevin@ky28059:~$ ros2 topic list
/cmd_vel
/joy
/joy/set_feedback
/parameter_events
/rosout
You can also launch both nodes directly with
ros2 launch mini_rover minirover_launch.py
If running on the latest version of WSL, colcon build
may fail with setup,py install is deprecated.
Downgrade setuptools to 58.2.0
to fix:
pip3 install setuptools==58.2.0
To attach a USB device WSL, install the dependencies listed in this tutorial. In powershell, list USB devices with
PS C:\Users\kevin> usbipd wsl list
BUSID VID:PID DEVICE STATE
2-2 046d:c53f USB Input Device Not attached
2-6 045e:0990 Surface Camera Front, Surface IR Camera Front Not attached
2-10 8087:0026 Intel(R) Wireless Bluetooth(R) Not attached
3-2 20d6:a711 USB Input Device Not attached
3-4 0bda:8152 Realtek USB FE Family Controller Not attached
and attach the desired USB device to the running WSL instance with
usbipd wsl attach --busid <busid>
Within WSL, lsusb
should now show the connected device:
kevin@ky28059:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 20d6:a711 Core (Plus) Wired Controller
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
WSL's default kernel does not support input devices
(ie. /dev/input
does not exist). To circumvent this, you can install a custom kernel image and edit .wslconfig
to point to it.
More concretely, download the kotc9
kernel from this link
and extract the bzImage
, then edit the kernel
option in .wslconfig
to point to the location of the extracted bzImage
;
if the image is located at C:\kernel-xpad\bzImage
, update C:\Users\<username>\.wslconfig
to look something like
[wsl2]
kernel=C:\\kernel-xpad\\bzImage
After a wsl --shutdown
, the kernel should be updated and /dev/input
should work.
kevin@ky28059:~$ uname -a
Linux ky28059 5.10.102.1-kotc9 #7 SMP Sun Nov 27 15:22:50 +05 2022 x86_64 x86_64 x86_64 GNU/Linux
To simulate joy
publishing from the command line without connecting a controller,
kevin@ky28059:~$ ros2 topic pub /joy sensor_msgs/Joy "axes: [0.0, 1.0, 0.0]"
publisher: beginning loop
publishing #1: sensor_msgs.msg.Joy(header=std_msgs.msg.Header(stamp=builtin_interfaces.msg.Time(sec=0, nanosec=0), frame_id=''), axes=[0.0, 1.0, 0.0], buttons=[])
publishing #2: sensor_msgs.msg.Joy(header=std_msgs.msg.Header(stamp=builtin_interfaces.msg.Time(sec=0, nanosec=0), frame_id=''), axes=[0.0, 1.0, 0.0], buttons=[])
publishing #3: sensor_msgs.msg.Joy(header=std_msgs.msg.Header(stamp=builtin_interfaces.msg.Time(sec=0, nanosec=0), frame_id=''), axes=[0.0, 1.0, 0.0], buttons=[])