文章目录
参考文档
电脑系统:ubuntu16.04
ROS版本:kinetic
参考书籍:Learning ROS for Robotics Programming Second Edition第四章
其内容为:
书籍的github库:https://github.com/AaronMR/Learning_ROS_for_Robotics_Programming_2nd_edition
操作步骤
利用microUSB线连接游戏手柄
连接以后手柄会震动。震感贼棒。哈哈哈!
下载安装游戏手柄驱动库
sudo apt-get install ros-kinetic-joystick-drivers
参考文档:http://wiki.ros.org/joy
里面的介绍:支持所有的游戏手柄
github库:https://github.com/ros-drivers/joystick_drivers
将github库中的源文件放到catkin工作空间的src文件夹下编译。此时会遇到很多问题:
解决方法参考链接:https://blog.csdn.net/p942005405/article/details/86559966
我的方法:
sudo apt-get install libbluetooth-dev
安装完蓝牙驱动后还是报错,然后把joystick_drivers下的wiimote文件夹删除或者移除到其他位置。
然后在工作空间下重新编译
catkin_make
因为wiimote文件介绍:http://wiki.ros.org/wiimote
这个包好像是关于蓝牙协议和通信的,具体可以参考上面ROS中的介绍。
测试游戏手柄
连接游戏手柄
查看游戏手柄是否识别:
ls /dev/input/
检查每个按钮的对应:
sudo jstest /dev/input/js0
提供的有:轴0-7 共8个 ; 按钮0-10 共11个
查看游戏手柄节点信息
启动ros,运行roscore。
然后,运行joy包中的节点:
rosrun joy joy_node
运行成功的标志:(力反馈后续在整)
rostopic list
rostopic echo /joy
操作按钮可以到上面轴或者按钮数值的变化。
rostopic type /joy
rosmsg show sensor_msgs/Joy
显示手柄发送的数据类型:
查看小乌龟消息类型
rosrun turtlesim turtlesim_node
rostopic list
rostopic type /turtle1/cmd_vel
rosmsg show geometry_msgs/Twist
编程控制一个小乌龟运动
创建ros包
创建joystick_example的ros包
在catkin_ws/src/joystick_drivers下运行命令:
catkin_create_pkg joystick_example roscpp std_msgs sensor_msgs joy geometry_msgs
因为依赖的比较多,我的package.xml文件为:
创建cpp文件:
在catkin_ws/src/joystick_drivers/joystick_example/src下新建一个example.cpp:
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<sensor_msgs/Joy.h>
#include<iostream>
using namespace std;
class TeleopJoy{
public:
TeleopJoy();
private:
void callBack(const sensor_msgs::Joy::ConstPtr& joy);
ros::NodeHandle n;
ros::Publisher pub;
ros::Subscriber sub;
int i_velLinear, i_velAngular;
};
TeleopJoy::TeleopJoy()
{
n.param("axis_linear",i_velLinear,i_velLinear);
n.param("axis_angular",i_velAngular,i_velAngular);
//pub = n.advertise<turtlesim::Velocity>("turtle1/command_velocity",1);
//sub = n.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopJoy::callBack, this);
pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);
sub = n.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopJoy::callBack, this);
}
void TeleopJoy::callBack(const sensor_msgs::Joy::