Summary
A number of examples in the RSDK use game controllers, or joysticks, to interact with Baxter. There is also a python utility for handling input devices like joysticks with common methods.
Overview
The ROS package joy
makes it easy to use gamepad controllers in ROS programs by publishing the buttons and stick axes on a ROS Topic. Examples in the RSDK use this package to let users control Baxter with a joystick.
Any joystick controller supported by Linux should be compatible with the ROS joy
package. Running the ROS joy_node
publishes the input values on the /joy
topic. The RSDK python examples then use a convenience class to map the array of button and axes values on this topic to a named dictionary. Every model of controller has a different definition of which button is which, so this class allows us to consistently map inputs to the same variables across brands. The RSDK examples themselves then use these consistent dictionary names and load the mapping the user indicates in an argument when you start the example.
Examples using joysticks
There are a couple RSDK examples already setup to use the joysticks to control Baxter. These can often be run in parallel with other tasks and programs and make it easier to position and coordinate Baxter while using the RSDK. Joystick examples include:
Running the Joystick Examples
Installing ROS Joystick Drivers
First ensure that the joy drivers are installed.
$ rospack find joy
= /opt/ros/indigo/share/joy =
If not run:
$ sudo apt-get install ros-indigo-joystick-drivers
Substitute the appropriate ROS 'distro' for indigo
if you are running other ROS distributions.
Running the ROS joystick publisher
Plug in your joystick and verify the computer can see the input device:
$ ls /dev/input/js*
/dev/input/js0
If using a PS3 joystick, see Using a PS3 Joystick in order to make the device appear.
From an RSDK Shell start the joy_node
:
$ rosrun joy joy_node
You should now be able to verify the ROS joystick part is working by echoing the /joy
topic and seeing the joystick inputs being published when you use the joystick:
= in an RSDK shell: =
$ rostopic echo /joy
Running the RSDK Joystick Examples
Manual Start Method
For the joystick examples to work, the joy_node
driver must be running at the same time as the example.
To manually start examples that use a joystick, you can run the joy_node program (joystick driver) in one terminal and the joint_position example in a second terminal:
1. If you haven't already run the joy_node
from the previous step:
$ rosrun joy joy_node
2. In a second RSDK Shell, run the example program and pass it the type of joystick you are using in the <joystick_type>
argument (e.g. 'logitech'):
$ rosrun joint_position joystick.py <joystick_type>
Where <joystick_type>
is 'xbox', 'logitech', or 'ps3'.
(If using a ps3, make sure you run the node from the ROS ps3joy package in a separate sudo terminal. See instructions here: ps3joy )
Alternative Automatic Starting Joystick Example Programs
Examples that offer joystick integration will also include a special start script specifically for starting up the joystick drivers and the example at the same time. This script is usually called joystart
.
RSDK Beta Version: To run the example:
$ rosrun joint_position joystart <joystick_type>
For the joystick examples to work, the joy_node driver must be running at the same time as the example. Using any one-line command to launch or start a joystick example is actually just using a short-cut to start the two programs at once.
Alternate Options
Specifying an input device
The joystick device used defaults to /dev/input/js0
. If you have multiple input devices connected or want to specify a specific device to use, you can use the following commands.
List current input devices:
$ ls /dev/input/js*
/dev/input/js0 /dev/input/js1
From an RSDK Shell, before starting the ROS node, set the joy_node
input device ROS Paramater, ~/dev
, to your desired input device:
$ rosparam set /joy_node/dev /dev/input/js1
Then start the example with either the Automatic or Manual method:
$ rosrun joint_position joystart <joystick_type>
Using the PS3 Joystick
The PS3 SIXAXIS or DUALSHOCK3 joysticks require an additional component to run in order to support the bluetooth and special features of the joysticks. These drivers are thankfully taken care of in the ROS ps3joy package (included in the ros-<distro>-joystick-drivers
install).
Install ROS Joystick drivers
$ sudo apt-get install ros-indigo-joystick-drivers
$ sudo apt-get install ros-hydro-joystick-drivers
$ sudo apt-get install ros-groovy-joystick-drivers
Make sure dependencies are installed:
$ rosdep update
$ rosdep install ps3joy
Pairing Controller
Set Controller’s target to this PC’s Bluetooth Address:
- Plug PS3 into computer using USB cable.
$ cd ~/ros_ws
$ sudo ./baxter.sh
$ rosrun ps3joy sixpair
Connecting Bluetooth Controller for Use (Each Session)
In a background terminal, run joystick connection/driver:
$ cd ~/ros_ws
$ sudo ./baxter.sh
$ rosrun ps3joy ps3joy.py
Activate connection:
- Press ‘Playstation’ Pairing Button on Controller (unplugged).
- Lights will start flashing rapidly and terminal will say Connection is Activated.
- Leave terminal / program running in background.
Controller will now show up as /dev/input/js*. Can now be run like normal joystick.
Running Examples with a PS3 Controller
Run joystart script for examples like normal, using ‘ps3’ mapping argument, e.g:
$ cd ~/ros_ws
$ ./baxter.sh
$ rosrun baxter_examples joint_position_joystick.py -j ps3
Joystick Button Mappings
Look at the wiki page for individual examples to see how the buttons are mapped. Make sure you start the examples with the correct type of joystick selected, as they change per device type. You can modify or create your own joystick mappings by editing the joystick script via rosed baxter_examples joystick.py
.