汇总



0. 前言


在上一篇文章:“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.launchbebop_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.xlinear.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通讯来控制无人机的运动,就可以将主要的精力放在算法的理论推导上了。