您的位置:

mavros——开源自动驾驶系统

一、简介

mavros是一个轻量级的ROS节点,基于MAVLink协议,能够使ROS机器人系统连接、控制和接收来自无人机 (UAVs) 的MAVLink兼容信息。mavros在由UAVs驱动的应用程序和机器人控制应用程序之间建立了桥梁,促进了无人机和机器人技术的集成。mavros遵循BSD许可证,可免费下载使用。

mavros的主要功能有以下几方面:

  • 支持多种飞行器,如quadcopter、helicopter、plane等;
  • 支持传感器的读取和写入,如IMU、GPS等;
  • 集成了内置的安全控制,确保飞行的安全性;
  • 提供方便的API,方便与外部程序进行交互;
  • 支持ROS的消息类型,方便与ROS软件进行集成;

二、使用说明

使用mavros,我们需要添加下述依赖关系到我们的ROS package:

  <build_depend>mavros_msgs</build_depend>
  <exec_depend>mavros_msgs</exec_depend>
  <build_depend>mavlink</build_depend>
  <exec_depend>mavlink</exec_depend>

再进一步,可以使用ros_comm库的工具包实现mavros的安装,具体可以参考mavros官方文档进行安装。

安装完毕之后,我们只需要使用一个ROS node即可连接到无人机,下面是一个简单的例子:

    #include <ros/ros.h>
    #include <mavros_msgs/CommandBool.h>
    #include <mavros_msgs/SetMode.h>
    #include <mavros_msgs/State.h>

    mavros_msgs::State current_state;
    void state_cb(const mavros_msgs::State::ConstPtr& msg){
        current_state = *msg;
    }
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "offb_node");
        ros::NodeHandle nh;

        ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>("mavros/state", 10, state_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");

        // wait for FCU connection
        while(ros::ok() && !current_state.connected){
            ros::spinOnce();
            rate.sleep();
        }

        mavros_msgs::SetMode offb_set_mode;
        offb_set_mode.request.custom_mode = "OFFBOARD";
        mavros_msgs::CommandBool arm_cmd;
        arm_cmd.request.value = true;

        ros::Time last_request = ros::Time::now();

        while(ros::ok()){
            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.success){
                    ROS_INFO("Offboard 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();
                }
            }

            local_pos_pub.publish(pose);
            ros::spinOnce();
            rate.sleep();
        }

        return 0;
    }

在这个例子中,我们使用的是OFFBOARD模式进行无人机的控制。我们可以使用rosrun命令来启动这个node:rosrun my_package offb_node。然后就可以看到无人机开始执行我们的控制程序了。

三、通信协议

mavros节点使用的通信协议是MAVLink,MAVLink是一种紧凑的、可扩展的、异步的比特流协议,旨在支持在任意无线电环境中进行高带宽和低延迟通信。mavros是基于MAVLink v1.0和v2.0草案的实现。

MAVLink协议由头部、消息ID、payload和校验和四部分组成。头部包括了消息类型、消息方向和消息重复等信息,消息ID表示了消息的唯一标识符,payload是包含了消息内容的数据区。校验和用来校验消息中的数据是否被篡改。MAVLink还支持心跳包和参数设置等功能。

总的来说,MAVLink协议采用了面向字节的通信方式,可以很好地支持在高噪声、低可靠性的环境中进行无人机和多机协同任务。

四、ROS接口

mavros提供了丰富的ROS接口,可以帮助我们方便地进行无人机的控制和状态监控。下面是mavros常用的ROS消息类型和topic列表:

  • mavros_msgs/State mavros/state FCU的状态信息
  • sensor_msgs/Imu mavros/imu/data FCU的IMU传感器数据
  • sensor_msgs/NavSatFix mavros/global_position/global FCU的GPS输出
  • geometry_msgs/PoseStamped mavros/setpoint_position/local 发送位置控制命令
  • geometry_msgs/TwistStamped mavros/setpoint_velocity/cmd_vel 发送速度控制命令
  • mavros_msgs/CommandBool mavros/cmd/arming 请求无人机解锁/上锁
  • mavros_msgs/SetMode mavros/set_mode 设置无人机的模式
  • mavros_msgs/OverrideRCIn mavros/rc/override 发送RC信号到飞控
  • mavros_msgs/PositionTarget mavros/setpoint_raw/local 发送原始控制命令

五、开源贡献

mavros是一个开源项目,在Github上拥有超过3000个star和1500个forks。社区成员在维护和更新mavros的同时,也为项目的发展做出了各种贡献。可在Github的贡献列表中查看谁对该项目进行了哪些贡献,并观看一些激动人心的探求索寻的一角。

同时,mavros也是ROS机器人行业中非常受欢迎的无人机控制节点之一。通过使用mavros,我们可以轻松地创建自己的无人机领域应用,并与其他ROS软件进行集成。探索开源世界,贡献开源社区,是每一位软件开发者的使命,同时也应该是我们每一个人的追求。