Pixhawk原生韌體PX4之offboard
offboard
PX4中的offboard(暫譯作外部控制)是一個非常強大的功能。可以接受來自外部的控制指令,按照目前的瞭解來看,offboard搭配上MAVROS以及類似於TX1/NUC板載計算器,在PX4這個穩定的飛控平臺上加上視覺處理或者人工智慧,大有可為。
配置說明
官網上有一個外部控制的例程,讓飛機起飛到2米的高度(x = 0, y = 0, z =0),這裡使用的是ROS裡面的座標系,並不是PX4韌體中的NED,MAVROS中已經完成了座標轉換,這一點的話暫時不用深究。
本文主要講一講使用數傳以及Pixhawk飛控板的外部控制方法:所需的只是一臺Ubuntu系統的電腦以及一架帶有數傳的飛機。首先還是環境的配置,
需要做的只有三個步驟:
- 配置Pixhawk上的
Telema 2
修改SYS_COMPANION
引數改成Companion Link(57600)
- 將飛控連上MAVROS
roslaunch mavros px4.launch fcu_url:=serial:///dev/ttyUSB0:57600
執行外部控制例程
rosrun offb_ctrl offb_ctrl_node
搞定 起飛了
- 其中offboard的C++例程如下
/**
* @file offb_node.cpp
* @brief offboard example node, written with mavros version 0.14.2, px4 flight
* stack and tested in Gazebo SITL
*/
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.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"); //節點重新命名為offb_node 供ROS呼叫
ros::NodeHandle nh; // 開啟roscpp節點
ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
("mavros/state", 10, state_cb);// 訂閱函式的引數1表示主題 引數2表示快取的訊息佇列長度 訊息3表示訊息更新時呼叫的回撥函式
ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped> // 公告發布者的主題,引數2表示輸出到訂閱者的最大訊息佇列長度
("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"); // 建立一個客戶端來設定模式
//the setpoint publishing rate MUST be faster than 2Hz
ros::Rate rate(20.0);
// wait for FCU connection
while(ros::ok() && current_state.connected){
ros::spinOnce();
rate.sleep();
}
geometry_msgs::PoseStamped pose;
pose.pose.position.x = 2;
pose.pose.position.y = 2;
pose.pose.position.z = 2;
//send a few setpoints before starting
for(int i = 100; ros::ok() && i > 0; --i){
local_pos_pub.publish(pose);
ros::spinOnce();
rate.sleep(); // 保證更新頻率為20Hz,自動調整睡眠時間
}
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;
}
- 關於ROS座標系與PX4座標系的轉換
如圖所示:iris四旋翼藍色槳對應的為機頭方向。
ROS中的座標是ENU(東北天)座標系,而PX4中是NED(北東地)座標系。MAVROS這個ROS包中已經進行了座標轉換。
通過ROS節點控制PX4飛機的位置時,座標有如下的對應關係
ROS | PX4 |
---|---|
x | y |
y | x |
z | alt(-z) |
進行控制時要把ROS座標系跟PX4的座標系分離開來,攝像頭座標系Z軸沿光軸向下,X軸朝機頭方向,根據右手法則確定Y軸指向飛機右側。使用AprilTag或ArUco庫可以直接通過相應編碼的二維碼得到飛機的位置姿態。對於位置誤差
err_x = pose.x;
err_y = -pose.y;
err_z = -pose.z;
根據位置誤差可以得到速度的設定值
目前存在的問題:
- 沒有GPS或者輔助定位裝置,這種直接設定位置的飛行是如何辦到的?
- MAVROS執行時,offboard模式無法打斷,遙控器都切不過去,危險
- ROS都不會,哪麼搞?
問題2的話直接採用手動設定模式的方法即可
奇技淫巧
Nomachine是一款高階的遠端桌面訪問工具。
怎麼說呢,機載協同計算機(跑著Ubuntu系統)上裝一個這個軟體作為目的主機,然後本地計算機(Windows或者Ubuntu系統的電腦)上也裝上這個軟體,只要兩臺計算機在連在同一個區域網中,就能在本地操作飛機上的計算機了。
直接遠端控制飛機上的電腦,QQ遠端協助用過吧
就像上面這樣,在win7上可以操作另一臺Ubuntu主機,這時你就可以進Ubuntu的Terminal跑你想執行的ROS節點了。
而且操作也是非常簡單
開啟軟體
可以看到這裡已經搜到一個網內的客戶機了點選連線(Connect)
這裡我是用Win7控制Ubuntu,因此在這裡需要輸入目標主機Ubuntu的賬號密碼,登陸後就可以看到上面圖中顯示的Ubuntu介面了。操作說明
就但是遠端協助那樣去操作就行了。
這裡要介紹的是退出操作,從客戶機退出需要將滑鼠移動到畫面的右上角,點下去你就知道了。
軟體面向使用者的體驗做的不錯,人人都能直接上手,贊一個!
TroubleShooting
GeographicLib報錯
[FATAL] [1506043767.570923014]: UAS: GeographicLib exception: File not readable /usr/share/GeographicLib/geoids/egm96-5.pgm | Run install_geographiclib_dataset.sh script in order to install Geoid Model dataset! [mavros-1] process has died [pid 14648, exit code -5, cmd /home/donghee/catkin_ws/devel/lib/mavros/mavros_node __name:=mavros __log:=/home/donghee/.ros/log/a61f72a6-9f34-11e7-80c3-7cb0c21790bc/mavros-1.log]. log file: /home/donghee/.ros/log/a61f72a6-9f34-11e7-80c3-7cb0c21790bc/mavros-1*.log
解決方案
到catkin空間中下載mavros原始碼,並執行其中的指令碼,應該是解決依賴性問題。cd ~/catkin_ws/src/mavros/mavros/scripts sudo ./install_geographiclib_dataset.sh