手柄:罗技游戏手柄
Linux版本:14.04
ROS版本:ros-indigo
首先安装手柄驱动,进入/dev/input文件中含有js0的文件夹。
安装手柄测试程序:
$sudo apt-get install joystick
安装一个功能包
$sudo apt-get install ros-indigo-joystick-drivers
测试手柄
$sudo jstest /dev/input/js0
出现如下的数据,按下手柄时,数据变化。
在四个终端数上分别运行
$roscore$rosrun turtlesim turtlesim_node$rosrun turtlesim turtle_teleop_key$rosrun rqt_graph
可以直观的得到,控制turtlesim的话题名是turtle1/cmd_vel.
查看话题/cmd_vel的消息类型
启动手柄的节点:
$rosrun joy joy_node
查看手柄的话题名和消息类型。
也可以用管道符命令,直接获取消息类型。
现在准备写代码了。
我们想让手柄/joy_node节点控制/turtlesim_node节点,必须创建一个节点,一边接受/joy_node节点发布的/sensor_msgs/Joy的话题消息,一边再通过话题/turtle1/cmd_vel发布消息给/turtlesim_node。这个节点就得完场消息数据的转换。
首先在工作目录下创建package,进入package的src目录下,创建源文件。
我得文件目录为/home/ys/catkin_ws/src/input_js_control
$catkin_creat_pkg input_js_control roscpp rospy std_msgs
设置依赖为roscpp rospy std_msgs
在input_js_control/src文件目录下创建源文件logitech.cpp文件
#include<ros/ros.h>#include<geometry_msgs/Twist.h>#include <sensor_msgs/Joy.h>#include<iostream>using namespace std;class Teleop{public:Teleop();private:/* data */void callback(const sensor_msgs::Joy::ConstPtr& Joy);ros::NodeHandle n; //实例化节点ros::Subscriber sub ;ros::Publisher pub ;double vlinear,vangular;//我们控制乌龟的速度,是通过这两个变量调整int axis_ang,axis_lin; //axes[]的键};Teleop::Teleop(){//我们将这几个变量加上参数,可以在参数服务器方便修改n.param<int>("axis_linear",axis_lin,1); //默认axes[1]接收速度n.param<int>("axis_angular",axis_ang,0);//默认axes[0]接收角度n.param<double>("vel_linear",vlinear,1);//默认线速度1 m/sn.param<double>("vel_angular",vangular,1);//默认角速度1 单位rad/spub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);//将速度发给乌龟sub = n.subscribe<sensor_msgs::Joy>("joy",10,&Teleop::callback,this);} //订阅游戏手柄发来的数据}void Teleop::callback(const sensor_msgs::Joy::ConstPtr& Joy){geometry_msgs::Twist v;v.linear.x =Joy->axes[axis_lin]*vlinear; //将游戏手柄的数据乘以你想要的速度,然后发给乌龟v.angular.z =Joy->axes[axis_ang]*vangular;ROS_INFO("linear:%.3lf angular:%.3lf",v.linear.x,v.angular.z);pub.publish(v);}int main(int argc,char** argv){ros::init(argc, argv, "joy_to_turtle");Teleop teleop_turtle;ros::spin();return 0;}
修改package.xml文件和CMakeLists.txt文件】
在package.xml文件添加
<exec_depend>message_runtime</exec_depend>
或者<run_depend>.这只是格式format的区别,如果是2就是exec
在CMakeLists.txt文件添加
add_executable( logitech src/logitech.cpp)add_dependencies( logitech ${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS})target_link_libraries(logitech ${catkin_LIBRARIES})
创建launch文件
代码
<launch><nodepkg="turtlesim"type="turtlesim_node"name="turtlesim_node"><node><nodepkg="input_js_control"type="logitech"name="joy_to_turtle"output="screen"><node><!--inputaxis--><paramname="axis_linear"value="4"type="int"/><paramname="axis_angular"value="3"type="int"/><!--inputvel--><paramname="vel_linear"value="2"type="double"/><paramname="vel_angular"value="1.5"type="double"/><noderespawn="true"pkg="joy"type="joy_node"name="joystick"><node></launch>
回到工作空间,准备编译功能包
完成后,运行roslaunch文件。转动手柄,完成!!
本教程中的手柄节点是通过ros-indigo-joystick-drivers所提供的节点,想要自定义手柄的话,还需要自己修改设计程序。
如果觉得《ros:游戏手柄控制海龟》对你有帮助,请点赞、收藏,并留下你的观点哦!