汇总
Gazebo下无人机目标跟踪①——环境搭建 Gazebo下无人机目标跟踪②——运动控制和查看图像
前言
在上一篇文章:“Gazebo下无人机目标跟踪①——环境搭建”中我们已经实现了 Parrot Bebop 2 无人机在 Gazebo 软件中的仿真环境搭建,接下来,我们就可以和控制 Bebop 实物一样控制 Gazebo 里的这个 Bebop 无人机了 步骤参考Bebop_autonomy的官方文档
1. 安装 bebop_autonomy 包
此时可以先关闭Gazebo界面,然后按照上文将drone文件修改为 eth0 然后打开新终端,安装依赖包
sudo apt-get install build-essential python-rosdep python-catkin-tools
创建和初始化工作空间
mkdir -p ~/bebop_ws/src && cd ~/bebop_ws
catkin init
克隆bebop_autonomy程序包
git clone https://github.com/AutonomyLab/bebop_autonomy.git src/bebop_autonomy
更新依赖库并安装依赖
rosdep update
rosdep install --from-paths src -i
编译工作空间
catkin build -DCMAKE_BUILD_TYPE=RelWithDebInfo
新建链接到路径
- 如果是ROS Kinetic和Ubuntu16.04环境,忽略以下步骤,直接到2.2
cd ~/bebop_ws/devel/lib
ln -s /opt/ros/melodic/lib/parrot_arsdk parrot_arsdk
echo "export LD_LIBRARY_PATH="~/bebop_ws/devel/lib/parrot_arsdk:$LD_LIBRARY_PATH"" >> ~/.bashrc
source ~/.bashrc
2. 启动程序
查看launch文件
cd ~/bebop_ws/src/bebop_autonomy/bebop_driver/launch/
ls
可以看到,Bebop这里有两个启动文件,分别是 bebop_node.launch
和 bebop_nodelet.launch
,其中 bebop_nodelet.launch
启动文件可以获取图像信息 修改launch文件
cd ~/bebop_ws/src/bebop_autonomy/bebop_driver/launch/
sudo gedit bebop_nodelet.launch
使用Gazebo仿真环境的话,可以将launch文件修改为如图内容
- 如果是实物的话,需要将ip修改为Bebop的ip,默认为 192.168.42.1(也可以修改实体机的ip实现对多无人机的控制,这个之后讲编队的时候再说)
- 如果是多架无人机的话,这里的namespace也需要进行修改。
重新启动Gazebo仿真环境
- 注意先查看此时的接口名和drone文件是否对应
sudo sphinx /opt/parrot-sphinx/usr/share/sphinx/drones/bebop2.drone
打开新终端到工作空间
cd ~/bebop_ws
source devel/setup.bash
运行launch程序
roslaunch bebop_driver bebop_nodelet.launch
之后可以打开新终端查看此时的rostopic
rostopic list
如图,看到一堆以 /bebop2
开头的话题即说明程序包运行成功。
- 如果roslaunch报错的话,若不影响ROS的运行则可忽略,如果不能通过ROS控制,需要重新启动一下roslaunch,这个问题比较玄学,我在实物实验时也经常会遇到。
3. 飞行控制
- 发送
std_msgs/Empty
的消息类型到takeoff
话题实现起飞,通过命令行发送消息进行测试
rostopic pub --once bebop2/takeoff std_msgs/Empty
得到 publishing and latching message for 3.0 seconds
的反馈 然后回到Gazebo界面中,可以看到飞机起飞到一定高度之后定高飞行
- 发送
std_msgs/Empty
的消息类型到land
话题实现降落,通过命令行发送消息进行测试
rostopic pub --once bebop2/land std_msgs/Empty
- 发送
std_msgs/Empty
的消息类型到reset
话题实现紧急停止,通过命令行发送消息进行测试
rostopic pub --once bebop2/reset std_msgs/Empty
- 起飞后,发送
geometry_msgs/Twist
的消息类型到话题cmd_vel
话题可以对Bebop进行运动控制,具体控制指令为:
linear.x (+) 前进 (-) 后退 linear.y (+) 左转 (-) 右转 linear.z (+) 上升 (-) 下降 angular.z (+) 顺时针自转 (-) 逆时针自转
- 在
cmd_vel
中需要注意的是
- 接受值的范围为 -1 到 1
- 收到起飞,降落,紧急命令时,运动控制命令重设为 0
- 要使Bebop悬停并保持其当前位置,则发送字段全为 0 的消息至
cmd_vel
- 下面是一些转换
roll_degree = linear.y _ max_tilt_angle pitch_degree = linear.x _ max_tilt_angle ver_vel_m_per_s = linear.z _ max_vert_speed rot_vel_deg_per_s = angular.z _ max_rot_speed
- 以上控制消息测试也可以在rqt工具中进行
需要说明的是,Bebop还有很多其他的控制指令,如 移动相机镜头、GPS导航、GPS下自主飞行、设置相机参数等等,因为目前暂时用不到,所以这里就不一一列举了,有需要的同学可以移步官方文档。
4. 控制参量介绍
因为后续的跟踪控制、编队控制等都需要对无人机的控制参数进行详细的了解,因此这里先提前对 cmd_vel
中的一些控制参数进行一下简单的说明
linear.x
和linear.y
消息分别控制的是Bebop的俯仰和侧倾角,单位为度
因此这里相当于直接控制飞行器的前向和横向加速度(这样就符合常规操作了,即系统的控制输入量为无人机的加速度),因此在控制系统的理论分析中,可以将无人机系统视为一个二阶系统(这块我会在后续的无人机控制中详细讲解)linear.z
消息控制的是Bebop的垂直速度(即控制输入量为无人机的速度),单位为米/秒
angular.z
消息控制的是Bebop绕Z轴的旋转速度(即控制输入量为无人机的角速度),单位为度/秒
5. 查看相机图像
我们可以打开rqt,在里面调用相机的图像信息查看
rqt
在菜单栏依次选择:Pluggins -> Visualization -> Image View,之后在Toplic里选择 /bebop2/image_raw
话题,即可查看 Bebop 自带的相机图像信息。
- 在代码中只需要通过
/bebop2/image_raw
话题来订阅摄像头信息即可做一些图像处理相关的工作。
到此为止,Bebop2无人机的仿真环境和通讯环境都已经配置完成,接下来我们就可以通过编写代码,通过简单的几个Topic通讯来控制无人机的运动,就可以将主要的精力放在算法的理论推导上了。