一、簡介
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軟件進行集成。探索開源世界,貢獻開源社區,是每一位軟件開發者的使命,同時也應該是我們每一個人的追求。
原創文章,作者:WPWKG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331958.html