ros:游戏手柄控制海龟
手柄:罗技游戏手柄
Linux版本:14.04
Rose版本:ros-indigo
首先安装手柄驱动,进入/dev/input文件中含有js0的文件夹。
安装手柄测试程序:
$sudo apt-get install jstest
安装一个功能包
$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/s
n.param<double>("vel_angular",vangular,1);//默认角速度1 单位rad/s
pub = 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>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<node>
<node pkg="input_js_control" type="logitech" name="joy_to_turtle" output="screen">
<node>
<!--input axis -->
<param name="axis_linear" value="4" type="int"/>
<param name="axis_angular" value="3" type="int"/>
<!--input vel -->
<param name="vel_linear" value="2" type="double"/>
<param name="vel_angular" value="1.5" type="double"/>
<node respawn="true" pkg="joy" type="joy_node" name="joystick" >
<node>
</launch>
回到工作空间,准备编译功能包
完成后,运行roslaunch文件。转动手柄,完成!!
本教程中的手柄节点是通过 ros-indigo-joystick-drivers所提供的节点,想要自定义手柄的话,还需要自己修改设计程序。