Mavros在线控制 (C++)

注意:本文适用于所有Kerloud无人机产品

mavros ROS程序包可视为运行ROS的计算机、启用MAVLink的无人机和启用MAVLink的地面站三者间的网关,其安装流程可参考: https://dev.px4.io/v1.9.0/en/ros/mavros_installation.htmlhttps://github.com/mavlink/mavros/tree/master/mavros#installation. 我们提供了一个现成的工程环境,用户可以在如下目录中开发其应用程序: ~/src/uav_space/catkinws_offboard,该目录下包含三个文件夹:mavlink、mavros和offboard_demo。由于国内网络限制,如果用户想从头开始操作,可能会在尝试访问github资源或 rosdep时出现中断。

Hint

Kerloud 无人机的软件代码在产品升级中已经移到 ~/src/uav_space 目录下面,旧版代码用户可以在我们官方论坛 https://discourse.cloudkernel.cn 进行咨询

Pixhawk设置

为了使能Pixhawk的offboard控制模式,建议用户参照如下网页中的介绍: https://dev.px4.io/master/en/ros/offboard_control.html, https://dev.px4.io/master/en/companion_computer/pixhawk_companion.html。 在我们的环境下,用户可以按如下内容对Pixhawk板载参数进行设置:

MAV_0_CONFIG = TELEM 1
MAV_0_MODE = Normal
MAV_0_FORWARD = Enable
SER_TEL1_BAUD = 57600

MAV_1_CONFIG = TELEM 2
MAV_1_MODE = Onboard
MAV_1_FORWARD = Enable
SER_TEL2_BAUD = 921600

如何编译

编译环节我们采用catkin-tools,它比常规的catkin_make快很多。 有关catkin工具的详细信息,请参见:https://catkin-tools.readthedocs.io。 用户可以按以下指令对工程环境进行编译:

cd ~/src/uav_space/catkinws_offboard
catkin init  # initialize the workspace
catkin build -j2  # build the workspace with two threads only to avoid overloading in Jetson Nano

编译过程耗时超过十分钟,首次操作请耐心等待。使用如下指令可清除工程环境:

cd ~/src/uav_space/catkinws_offboard
catkin clean

例程代码讲解

offboard_demo文件夹下的例程实现航点飞行任务。航点信息在yaml文件中定义,其路径为src/ offboard_demo/launch/waypoints_xyzy.yaml,文件中还包含ENU坐标和相应的偏航值。该软件包支持SITL(软件在环)仿真,用户可以在实际飞行前对自身软件进行测试。 为了描述清晰,我们按顺序对main()函数进行讲解。

(1) 对于订阅、发布和服务信息的声明

//subscriptions, publications and services
ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
        ("mavros/state", 10, state_cb);
ros::Subscriber local_pose_sub = nh.subscribe<geometry_msgs::PoseStamped>
        ("mavros/local_position/pose", 10, local_pose_cb);
ros::Subscriber rc_input_sub = nh.subscribe<mavros_msgs::RCIn>
        ("mavros/rc/in", 5, rc_input_cb);
ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
        ("mavros/setpoint_position/local", 10);
ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>
        ("mavros/cmd/arming");
ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>
        ("mavros/set_mode");

我们通常会在main程序的开头对ROS订阅、发布和服务信息进行声明。 mavros软件包中的各类主题、服务易于使用,可用于查询状态信息、发送指令等,细节详见:http://wiki.ros.org/mavros。例如,若要获取飞机的本地位置信息, 则需要订阅mavros/setpoint_position/local主题。需注意,采用ENU(East-North-Up,东北上)坐标系。

  1. 载入航点信息,检查仿真结果

// load yaml files
XmlRpc::XmlRpcValue wp_list;
private_nh.getParam("waypoints",wp_list);

// simulation flag
int simulation_flag = 0;
private_nh.param("simulation_flag", simulation_flag, 0);

正常通过后,航点数据将从参数管理器中进行加载,并初始化为航点目标。

  1. 在SITL仿真中解锁飞机

if (simulation_flag == 1)
{
    //set offboard mode, then arm the vehicle
    if( current_state.mode != "OFFBOARD" &&
        (ros::Time::now() - last_request > ros::Duration(5.0))){
        if( set_mode_client.call(offb_set_mode) &&
            offb_set_mode.response.mode_sent){
            ROS_INFO("Offboard mode enabled");
        }
        last_request = ros::Time::now();
    } else {
        if( !current_state.armed &&
            (ros::Time::now() - last_request > ros::Duration(5.0))){
            if( arming_client.call(arm_cmd) &&
                arm_cmd.response.success){
                ROS_INFO("Vehicle armed");
            }
            last_request = ros::Time::now();
        }
    }
}

实际飞行中,我们只需要解锁飞机、切换到OFFBOARD模式即可开启任务。在SITL仿真中,我们需使用mavros/cmd/arming服务来解锁飞机。

(4) 发布当前航点

pose = waypoints.at(current_wpindex);
local_pos_pub.publish(pose);

程序将通过mavros主题将当前航点坐标发布到无人机。请注意,该主题必须在OFFBOARD模式下一直发布,否则Pixhawk将启动故障安全机制、关闭OFFBOARD模式。

(5) 降落后锁定

if( arming_client.call(disarm_cmd) &&
    arm_cmd.response.success){
    ROS_INFO("Vehicle disarmed");
}

到达最终航点并成功降落后,程序将调用mavros/cmd/arming服务自动对飞机进行锁定。

如何使用

软件在环仿真

软件在环仿真(Software In The Loop)需要和PX4固件一起运行,我们推荐用户使用我们维护的版本https://gitee.com/cloudkernel-tech/Firmware,以确保和飞机软件兼容性。

因为依赖特定的软件环境,软件在环仿真目前只支持在安装ubuntu 18.04的PC电脑中运行,而不能直接在机载电脑中运行。详细设置软件环境的说明可以参考<http://cloudkernel-tech.gitee.io/kerloud_mini/en/ADVANCEDDEV.html>。 用户还需要把位于 ~/src/uav_space/catkinws_offboard 的整个offboard_demo软件包迁移到PC中,

假设PX4固件在~/src/Firmware位置,那么基于gazebo的软件在环仿真可以按以下指令启动:

cd ~/src/Firmware
make px4_sitl_default gazebo

然后通过如下指令启动offboard控制飞机:

cd ~/src/uav_space/catkinws_offboard
source devel/setup.bash
roslaunch launch/wpmission_sitl.launch
../_images/ROS_sitlview.png

实际飞行

实际飞行中,需严格按如下顺序操作以避免出现未知异常:

  • 将带有接口的电池可靠安装到飞机,确保飞行中不会脱落;

  • 确保遥控器所有开关均处于初始位置,且油门降到最低;

  • 电池接通上电;

  • 等待GPS锁星:通常可在2-3分钟后听到提示音,且pixhawk主灯变绿;

  • 确保飞机出于正常待机模式,且飞机周围无人;

  • 按下安全按钮(保持1S)预解锁无人机,按钮指示灯将变为双闪;

  • 机载电脑启动需等待几分钟,通过本地wifi网络进行登录,确认路径~/src/uav_space/catkinws_offboard/src/offboard_demo/launch/waypoints_xyzy.yaml下的航行任务,运行如下指令启动offboard控制模块:

    # set read/write privilege for the USB-ttl port
    sudo chmod a+rw /dev/ttyPixhawk
    
    cd ~/src/uav_space/catkinws_offboard
    source devel/setup.bash
    roslaunch launch/wpmission.launch
    
  • 同时拉低油门、右推偏航摇杆解锁无人机,解锁成功将听到一次长音提示;

  • 使用指定的摇杆(如通道7)切换到OFFBOARD模式,然后无人机将自动开始航点飞行任务。恭喜飞行成功!

Hint

机载电脑也可以在启动期间自动执行offboard任务,用户可将工程目录下的 startup.sh作为参考模板。