无人机控制模块教学例程 - 起飞降落

<span style="display: flex; flex-direction: column; width: 100%"> <img src = https://qiniu.md.amovlab.com/img/m/202206/20220630/1050113953508024345067520.gif>

运行结果展示

起飞降落demo对应脚本文件位于 ~/Prometheus/Scripts/simulation/tutorial_demo/takeoff_land/takeoff_land_P450.sh

操作步骤

  1. 将遥控器开机并通过USB接口接入电脑

  2. 输入以下命令启动起飞降落仿真demo

    cd ~/Prometheus/Scripts/simulation/tutorial_demo/takeoff_land
    # 第一次启动该脚本时,需要添加可执行权限
    chmod +x takeoff_land_P450.sh
    ./takeoff_land_P450.sh
    
  3. 遥控器SWA档杆向下拨解锁无人机

  4. 遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

  5. 遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

  6. 无人机将自动起飞,到达预设高度后悬停30秒,随后自动降落

检查终端运行是否正常

  • ros主节点
    • 下图所示为正常运行

74.png

  • PX4飞控仿真
    • 下图所示为正常运行

75.png

  • Prometheus控制
    • 下图所示为正常运行

76.png

  • Prometheus控制demo,起飞降落
    • 下图所示为正常运行

77.png

  • 正常启动仿真界面
    • 下图所示为正常运行

78.png

运行仿真功能

  • 拨动遥控器的SW-A拨杆,到最下面,解锁无人机

79.png

  • 拨动遥控器的SW-B拨杆,到中间位置,切换到RC_POS_CONTROL模式

80.png

  • 拨动遥控器的SW-B拨杆,到最下面,切换到COMMAND_CONTROL模式

81.png

  • 此时无人机会在初始点悬停

82.png

  • 在COMMAND_CONTROL模式下可以使用代码控制无人机飞行了,此处运行代码控制无人机,到达预设高度后悬停30秒,随后自动降落

83.png

节点运行图

起飞降落节点运行图.png

起飞降落例程主要包含 /joy_node/uav1/mavros/uav_control_main_1/takeoff_land等ROS节点。

  • /joy_node节点为遥控器ROS驱动节点,用以获取遥控器数据。
  • /uav1/mavros节点为飞控ROS驱动节点,与飞控进行数据交互。在仿真中,该驱动节点与模拟飞控进行数据交互。
  • /uav_control_main_1节点为Prometheus项目中最基础的ROS节点,所有Prometheus项目的功能模块都通过该节点与无人机进行数据交互。
  • /takeoff_land节点为起飞降落节点,通过 /uav_control_main_1节点提供的数据接口获取无人机数据以及控制无人机。

从节点运行图中,我们可以看到 /takeoff_land节点与 /uav_control_main_1节点进行数据交互主要有三个ROS话题

  • /uav1/prometheus/command:无人机控制接口,对应的消息为 prometheus_msgs/UAVCommand
  • /uav1/prometheus/state:无人机状态,对应的消息为 prometheus_msgs/UAVState
  • /uav1/prometheus/control_state:无人机控制状态,对应的消息为 prometheus_msgs/UAVControalState

建议阅读 /Prometheus/Modules/common/prometheus_msgs/msg内对应的消息文件,了解上面提到的三个消息的详细定义。

代码讲解

源码文件名为 takeoff_land.cpp

位于 /Prometheus/Modules/tutorial_demo/basic/takeoff_land/src文件夹下

起飞降落demo-1.png

起飞降落demo-2.png

该demo为Prometheus 起飞&降落控制接口开发示例,核心代码如上图所示;主要是填充以下数据:

  1. Agent_CMD设置为Init_Pos_Hover模式,该模式为起飞;Agent_CMD设置为Land,该模式为降落
  2. 每发送一次数据,Command_ID加1
  3. 时间戳通过调用 ros::Time::now()函数获取当前ROS系统时间并赋值即可,frame_id并不影响功能,但建议与控制命令所采用的坐标系一致。