ROS与AR.Drone-ardrone_tutorials-游戏杆控制
游戏杆控制
说明
- 先阅读上一篇ROS与AR.Drone-ardrone_tutorials-键盘控制
- 通过键盘来控制AR.Drone还是有点苦难,本站这一篇通过游戏杆控制AR.Drone
控制流程图
流程描述
- 建立ROS包joy_node监听ROS包游戏杆或控制垫的输入。
- 输入转换成ROS消息,发布到的joy主题
- 我们的控制器订阅joy主题并转换游戏杆的运动成为飞行器的飞行命令并发布到cmd_vel主题
- 按下按钮实现起飞,降落和紧急降落,这些命令发布到相应的主题
- ardrone_driver发到各种命令,再发送到物理飞行器
- ardrone_driver反馈视频流发布到主题/ardrone/image_raw
- 我们的控制器在显示/ardrone/image_raw主题的内容
安装游戏杆
- 安装游戏杆驱动
$ sudo rosdep init
$ rosdep update
$ sudo apt-get install ros-indigo-joystick-drivers
$ rosdep install joy
- 检查是否识别游戏杆,一般是名为jsX的设备
$ ls /dev/input
- 测试游戏杆
$ jstest /dev/input/jsX
如果出现 “jstest: Permission denied” 错误,执行
$ sudo chmod a+r /dev/input/jsX
如果成功,你移动游戏杆应该会显示对应信息。
通过ROS来控制游戏杆
- 启动roscore
$ roscore
- 启动joy_node,X为你自己识别的设备号
$ rosparam set joy_node/dev "/dev/input/jsX"
$ rosrun joy joy_node
- 显示节点信息
$ rostopic echo joy
识别控制按钮和轴
- 识别按钮
我们要识别轴和按钮,总的来说,识别轴来控制飞行器飞行的左右,前后,转动。识别按钮触发紧急停止,起飞,降落等。
例如紧急按钮为例,按下按钮,观察终端输出,确定是那个按钮。目前我使用触发键作为应对紧急停止。当按下可以看到如下信息:
axes: [-0.0, -0.0, -0.0, -0.0, 0.0, 0.0]
buttons: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
上面的情况就是 Emergency = Button 0 (第一个按钮是从0开始)
- 识别轴
识别流程:
- 按下操纵杆完全向左。改变的轴(在列表中的第一个数字是轴0)是滚动轴,如果改变的数量是你的滚刻度(通常是+或- 1)
- 按下操纵杆完全向前。改变的是你的俯仰轴的轴,它的数量变化是俯仰刻度(通常是+或- 1)
- 旋转你的操纵杆完全逆时针,改变的轴是你的偏航轴和数量它变化的是偏航尺度(通常是+或- 1)
- 推动你的油门杆完全向前。轴的改变是你的Z轴和它的变化的数量是Z-规模(通常为+或- 1)。
例如按下操纵杆完全向左
axes: [1.0, -0.0, -0.0, -0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
从这个我确定,滚轴= 0和滚动范围= 1
通过上面的方法,识别所有的按钮和轴
配置游戏杆控制器
- 生成joystick_controller.launch
$ roscd ardrone_tutorials
$ cp launch/joystick_controller.launchtemplate joystick_controller.launch
$ vim joystick_controller.launch
编辑:
- 更新21行的设备号 (/dev/input/jsX 之前识别的).
- 更新27-29行,按钮对照表
- 更新32-35行,轴对照表
- 更新38-41行,设置范围值,通常是1或-1
- 请根据实际的情况做相应的调整,确认无误再保存。
试飞
启动AR.Drone,通过Wifi连接上AR.Drone
运行launch文件
$ roslaunch ardrone_tutorials joystick_controller.launch
- 在飞行前,先确认紧急键是否有效。没起飞前按下紧急键,飞行器的飞行指示灯应该都变红色。再一下紧急键应该变回绿色。同时终端会显示“Emergency Button Pressed”
参考:
- http://robohub.org/up-and-flying-with-the-ar-drone-and-ros-joystick-control/
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号