环境 与 准备

  1. Ubuntu 16.04(博主的是VM虚拟机)
  2. kinetic版本的ROS平台
  3. 手柄(博主的是索尼的PS4手柄)
  4. 能把这篇博客上的东西实现 仿真机器人的准备

一、连接手柄

如果你使用的是VM虚拟机,连接手柄后,可能会有提示,硬件以连接上。如果没有提示你需要在VM右下角找到你的手柄,如果是亮的则手柄已经连接,如果不亮,点击手柄图标,点击连接就可以了。

python解析游戏手柄 python模拟手柄_Python

python解析游戏手柄 python模拟手柄_ROS_02

如果提示连接不上,首先检查VM是否为最新版本

python解析游戏手柄 python模拟手柄_数据_03


更新完成后,再更新Tools

python解析游戏手柄 python模拟手柄_python解析游戏手柄_04


点击更新 VMware Tools 后会弹出一个窗口,把里面那个压缩包解压到home里面,然后在里面运行终端

sudo ./vmware-install.pl

python解析游戏手柄 python模拟手柄_ROS_05


然后一直回车就行了,最后重启下VM,在右下角找到手柄,连接虚拟机,看看是否成功。

二、编写手柄操控的Python程序
连接好手柄后在/dev/input 中应该会出现js0 这个文件,这个就是手柄设备,Python的evdev模块就可以读取事件。但在这里我们用一个已经封装完备的ROS节点,Joy包里的joy_node节点。

rosrun joy joy_node #启动joy_node
rostopic echo joy   #然后我们监听这个节点,看看有没有输出手柄事件

python解析游戏手柄 python模拟手柄_ROS_06


这些就是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

你会看到这样一个图示

python解析游戏手柄 python模拟手柄_python解析游戏手柄_07

很明显我们的小车节点arbotic订阅了cmd_vel话题(topic),我们只需要看看cmd_vel 传输的msg是什么类型的就行了。

rostopic type cmd_vel #查看cmd_vel 类型

输出geometry_msgs/Twist,然后在查看具体的类型

rosmsg info geometry_msgs/Twist

python解析游戏手柄 python模拟手柄_ROS_08

接下来的工作就是编写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文件中修改一些东西

python解析游戏手柄 python模拟手柄_python解析游戏手柄_09


加上这两个依赖,然后重新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中的仿真机器人

python解析游戏手柄 python模拟手柄_数据_10

推动左右摇杆就可以使机器人动起来了