抑郁症健康,内容丰富有趣,生活中的好帮手!
抑郁症健康 > ros:游戏手柄控制海龟

ros:游戏手柄控制海龟

时间:2019-12-21 08:58:16

相关推荐

手柄:罗技游戏手柄

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:游戏手柄控制海龟》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。