环境 与 准备
- 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中的仿真机器人
推动左右摇杆就可以使机器人动起来了