1. 程式人生 > >Pixhawk原生韌體PX4之offboard

Pixhawk原生韌體PX4之offboard

offboard

PX4中的offboard(暫譯作外部控制)是一個非常強大的功能。可以接受來自外部的控制指令,按照目前的瞭解來看,offboard搭配上MAVROS以及類似於TX1/NUC板載計算器,在PX4這個穩定的飛控平臺上加上視覺處理或者人工智慧,大有可為

配置說明

官網上有一個外部控制的例程,讓飛機起飛到2米的高度(x = 0, y = 0, z =0),這裡使用的是ROS裡面的座標系,並不是PX4韌體中的NED,MAVROS中已經完成了座標轉換,這一點的話暫時不用深究。

本文主要講一講使用數傳以及Pixhawk飛控板的外部控制方法:所需的只是一臺Ubuntu系統的電腦以及一架帶有數傳的飛機。首先還是環境的配置,

這一篇博文已經講的非常清楚了,不知道為什麼就是想裝ROS indigo + Gazebo7。按教程offboard模擬通過以後就可以上真機測試了。

需要做的只有三個步驟

  1. 配置Pixhawk上的Telema 2 修改SYS_COMPANION引數改成Companion Link(57600)
    comp
  2. 將飛控連上MAVROS

    roslaunch mavros px4.launch fcu_url:=serial:///dev/ttyUSB0:57600
  3. 執行外部控制例程

    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座標系的轉換
frame

如圖所示:iris四旋翼藍色槳對應的為機頭方向。
ROS中的座標是ENU(東北天)座標系,而PX4中是NED(北東地)座標系。MAVROS這個ROS包中已經進行了座標轉換。

通過ROS節點控制PX4飛機的位置時,座標有如下的對應關係

ROS PX4
x y
y x
z alt(-z)

進行控制時要把ROS座標系跟PX4的座標系分離開來,攝像頭座標系Z軸沿光軸向下,X軸朝機頭方向,根據右手法則確定Y軸指向飛機右側。使用AprilTagArUco庫可以直接通過相應編碼的二維碼得到飛機的位置姿態。對於位置誤差

err_x = pose.x;
err_y = -pose.y;
err_z = -pose.z;

根據位置誤差可以得到速度的設定值

ha
  • 目前存在的問題:

    1. 沒有GPS或者輔助定位裝置,這種直接設定位置的飛行是如何辦到的?
    2. MAVROS執行時,offboard模式無法打斷,遙控器都切不過去,危險
    3. ROS都不會,哪麼搞?

    問題2的話直接採用手動設定模式的方法即可

奇技淫巧

Nomachine是一款高階的遠端桌面訪問工具。
怎麼說呢,機載協同計算機(跑著Ubuntu系統)上裝一個這個軟體作為目的主機,然後本地計算機(Windows或者Ubuntu系統的電腦)上也裝上這個軟體,只要兩臺計算機在連在同一個區域網中,就能在本地操作飛機上的計算機了。
直接遠端控制飛機上的電腦,QQ遠端協助用過吧

haha

就像上面這樣,在win7上可以操作另一臺Ubuntu主機,這時你就可以進Ubuntu的Terminal跑你想執行的ROS節點了。

而且操作也是非常簡單

  1. 開啟軟體

    open

    可以看到這裡已經搜到一個網內的客戶機了
  2. 點選連線(Connect)

    connect

    這裡我是用Win7控制Ubuntu,因此在這裡需要輸入目標主機Ubuntu的賬號密碼,登陸後就可以看到上面圖中顯示的Ubuntu介面了。
  3. 操作說明

    close

    就但是遠端協助那樣去操作就行了。
    這裡要介紹的是退出操作,從客戶機退出需要將滑鼠移動到畫面的右上角,點下去你就知道了。

軟體面向使用者的體驗做的不錯,人人都能直接上手,贊一個!

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