一、简介
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软件进行集成。探索开源世界,贡献开源社区,是每一位软件开发者的使命,同时也应该是我们每一个人的追求。