导师买了个游戏手柄,就研究了一下怎么用游戏手柄控制机器人。想不到有点简单,编写一断代码即可,同时对我这两天学习的复习。
开始教程。
(1)游戏手柄控制乌龟。
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
当我们运行上面的两句,发现键盘的方向键可以乌龟移动,它们俩是通过话题通信。
/turtle1/cmd_vel[geometry_msgs/Twist]
geometry_msgs/Twist是这个话题的类型,即消息的类型,我们看看内部结构
rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
我们只用linear.x这个来控制速度,angular.z来控制方向。
思路:我们知道乌龟会订阅上面这个话题,因此我们要写这样一个代码,有订阅器,发布器。订阅游戏手柄的指令,然后发布速度到/turtle1/cmd_vel话题上,这样乌龟就可以订阅了。
现在我们要了解游戏手柄的发送的数据类型,然后经过订阅处理,发送自己想要的速度。
首先在终端运行:
ls /dev/input/
看看有哪些端口,其中会有js0这个端口,我们就用这个端口接收游戏手柄发来的数据。然后
sudo jstest /dev/input/js0
会发现
axes: 0: 0 1:0 2: 0...
buttons: 0: 0 1:0 2:0 3:0 4:0...
接下来,我们运行接收游戏手柄数据的节点
rosrun joy joy_node
这个节点与手柄传过来的数据是通过/joy这个话题通信的。我们要知道哪些键控制着什么,于是我们移动手柄,看看这个话题接收的数据
rostopic echo /joy
会看到
---
header:
seq: 837
stamp:
secs: 1500642610
nsecs: 656011953
frame_id: ''
axes: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---
左右移动摇杆1,发现axes[0]变化-1到1,我们把它当成角度赋值给angualr.z,前后移动摇杆1,发现axes[1]变化-1到1,我们把它的当成速度赋