Set Up a Generic Gamepad for ROS Teleoperation
This article describes the process of adding a gamepad controller to a complex ROS control network to allow a robot’s intuitive and/or low-latency teleoperation. The set-up uses three packages provided by the ROS community; the joy driver
, the twist multiplexor
, and the twist joy teleop
packages.
This is a standard pattern used in many ROS robots around the world. See an example in the sphero_rvr_ros source
Multiple Inputs
By using multiplexed command velocity signals, this approach allows a hierarchy of controls from different sources including a navigation system or remote desktop keyboard.
Steps
-
Select a gamepad with a supported Linux driver
Some good examples come from Logitech
-
Create a
<robot>_contollers
package or similar to store theconfig
andlaunch
filesIf your robot software packages are named with jackobot, then the package might be
jackobot_controllers
-
Add the joy and joy-twist, and twist-mux packages as dependencies
<depend>joy</depend> <depend>teleop_twist_joy</depend> <depend>twist_mux</depend>
-
Decide on a multiplexed
cmd_vel
topic namespaceFor example:
If
nav
uses/nav/cmd_vel
, then joystick could be/joy/cmd_vel
Add this to the
twist_mux
config file with the joystick at a higher priority than the nav command topic -
Create a config file for the joystick and button inputs
axis_linear: 1 # LS vert scale_linear: 0.4 scale_linear_turbo: 0.7 axis_angular: 3 # RS hori scale_angular: 6.0 scale_angular_turbo: 6.0 enable_button: 4 # LB enable_turbo_button: 5 # RB
-
Create a launch file and include the config and namespace remapping
<?xml version="1.0"?> <launch> <arg name="joy_dev" default="/dev/input/js0" /> <arg name="teleop_joy_config" default="$(find sphero_rvr_controllers)config/joy_config.yaml" /> <arg name="twist_mux_config" default="$(find sphero_rvr_controllers)config/twist_mux.yaml"/> <!-- joy driver --> <node pkg="joy" type="joy_node" name="joy_node"> <param name="dev" value="$(arg joy_dev)" /> <param name="deadzone" value="0.3" /> <param name="autorepeat_rate" value="20" /> </node> <!-- joy teleop --> <node pkg="teleop_twist_joy" name="teleop_twist_joy" type="teleop_node"> <remap from="cmd_vel" to="/joy_teleop/cmd_vel" /> <rosparam command="load" file="$(arg teleop_joy_config)" /> </node> <!-- twist mux --> <node pkg="twist_mux" type="twist_mux" name="twist_mux" output="screen"> <remap from="cmd_vel_out" to="/controller/tracks/cmd_vel" /> <rosparam file="$(arg twist_mux_config)" command="load"/> </node> </launch>
-
Optionally: set a device rule for the joystick device connection
TBC