根据手柄操控仿真机器人
环境 与 准备
- Ubuntu 16.04(博主的是VM虚拟机)
- kinetic版本的ROS平台
- 手柄(博主的是索尼的PS4手柄)
- 能把这篇博客上的东西实现
一、连接手柄 如果你使用的是VM虚拟机,连接手柄后,可能会有提示,硬件以连接上。如果没有提示你需要在VM右下角找到你的手柄,如果是亮的则手柄已经连接,如果不亮,点击手柄图标,点击连接就可以了。
如果提示连接不上,首先检查VM是否为最新版本 更新完成后,再更新Tools 点击更新 VMware Tools 后会弹出一个窗口,把里面那个压缩包解压到home里面,然后在里面运行终端 sudo ./vmware-install.pl 然后一直回车就行了,最后重启下VM,在右下角找到手柄,连接虚拟机,看看是否成功。
二、编写手柄操控的Python程序 连接好手柄后在/dev/input 中应该会出现js0 这个文件,这个就是手柄设备,Python的evdev模块就可以读取事件。但在这里我们用一个已经封装完备的ROS节点,Joy包里的joy_node节点。
rosrun joy joy_node #启动joy_node rostopic echo joy #然后我们监听这个节点,看看有没有输出手柄事件
这些就是joy_node传输的数据格式
header #Header 类型 axes #摇杆数据 buttons #按钮数据
这些数据就是sensor_msgs/msg/Joy.msg 这个msg文件格式。 现在我们有了手柄数据,那么只需要将手柄数据发送给仿真小车节点,就能使小车移动了。 这次我们依然使用rbx_vol_1作为模拟小车,不清楚的朋友可以看下最上面准备工作中的第四条。 想要使rbx_vol_1中的仿真小车移动,我们需要知道小车移动所接收的Msg类型,我们启动仿真机器人
roscore roslaunch rbx1_bringup fake_pi_robot.launch rosrun rqt_graph rqt_graph
你会看到这样一个图示
很明显我们的小车节点arbotic订阅了cmd_vel话题(topic),我们只需要看看cmd_vel 传输的msg是什么类型的就行了。 rostopic type cmd_vel #查看cmd_vel 类型 输出geometry_msgs/Twist,然后在查看具体的类型 rosmsg info geometry_msgs/Twist
接下来的工作就是编写Python节点。
#!/usr/bin/env python3#我用的是python3,如果你用的是2,删掉3就行了 #coding=utf-8 import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist class JoyRob(): """docstring for JoyRob""" listener_joy = None#监听joy话题 talker_rob = None#向机器人话题发布数据 joy_msg = None def __init__(self): self.theNode = rospy.init_node(wtmsb) self.listener_joy = rospy.Subscriber(joy,Joy,self.callback) self.talker_rob = rospy.Publisher(cmd_vel,Twist,queue_size=10) self.rate = rospy.Rate(50) # 定义hz while not rospy.is_shutdown(): self.publish() self.rate.sleep() def publish(self): if self.joy_msg: self.talker_rob.publish(self.joy_msg) def callback(self,date): cmd = Twist() cmd.linear.x = date.axes[3]#axes是摇杆数据 cmd.linear.y = date.axes[4]#右摇杆控制移动 cmd.angular.z = date.axes[0]#左摇杆用来控制方向 cmd.angular.y = date.axes[1] self.joy_msg = cmd if __name__ == __main__: JoyRob()
因为我们在Python脚本中使用了
from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist
所以我们要在CMakeLists.txt文件中修改一些东西 加上这两个依赖,然后重新catkin_make就行了。 三、运行
roscore rosrun joy joy_node roslaunch rbx1_bringup fake_pi_robot.launch rosrun 你的工作空间 刚写的节点名称.py#运行刚写好的Python节点 rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
不出意外你应该可以看到rviz中的仿真机器人
推动左右摇杆就可以使机器人动起来了