根据手柄操控仿真机器人

环境 与 准备

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

一、连接手柄 如果你使用的是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中的仿真机器人

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

经验分享 程序员 微信小程序 职场和发展