welcom ! Handel home

2025年11月11日 星期二

PX4 官方指南的 ROS/MAVROS Offboard Control 模式

這是基於 PX4 官方指南的 ROS/MAVROS Offboard Control 模式 範例教學,目標是讓模擬的四旋翼(例如 Iris 模型)自動起飛到指定高度(通常是 2 公尺)。

這個範例使用 Python 編寫,是最常用且易於理解的 Offboard 控制基礎。


🚀 MAVROS Offboard Control 模式範例教學 (Python)

Offboard 模式允許您從外部電腦(透過 MAVROS)發送高層級的目標設定點(例如位置、速度或姿態),從而完全控制飛行器的導航。

步驟一:建立 ROS 工作空間與套件

如果您尚未建立 ROS 工作空間 (catkin_ws),請先建立並編譯。如果已經有了,則直接在其中建立新的功能套件。

Bash
# 進入 catkin 工作空間的 src 目錄
roscd # 進入 catkin_ws/devel
cd ..
cd src

# 建立一個名為 offboard_py 的新套件,依賴 rospy
catkin_create_pkg offboard_py rospy geometry_msgs mavros_msgs std_msgs

# 返回工作空間根目錄並編譯
cd .. 
catkin build 

# 載入新的環境變數 (重要)
source devel/setup.bash

# 進入新套件目錄
roscd offboard_py

步驟二:編寫 Python 控制腳本

offboard_py 套件目錄下,建立一個 scripts 資料夾,並創建您的控制腳本。

Bash
# 創建 scripts 資料夾並進入
mkdir scripts
cd scripts

# 創建 Python 腳本並賦予執行權限
touch offb_node.py
chmod +x offb_node.py

接下來,用您慣用的編輯器(如 nanovim)打開 offb_node.py,並貼入以下程式碼(此為官方範例的簡化版本,用於起飛到 2 公尺):

Python
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import PoseStamped
from mavros_msgs.msg import State
from mavros_msgs.srv import CommandBool, CommandBoolRequest, SetMode, SetModeRequest

current_state = State()

def state_cb(msg):
    """回調函數:儲存飛控的當前狀態 (連線, 加解鎖, 模式)"""
    global current_state
    current_state = msg

if __name__ == "__main__":
    rospy.init_node("offb_node_py")
    
    # 訂閱飛控狀態
    state_sub = rospy.Subscriber("mavros/state", State, callback = state_cb)
    
    # 發布本地位置設定點
    local_pos_pub = rospy.Publisher("mavros/setpoint_position/local", PoseStamped, queue_size=10)
    
    # 服務客戶端:用於加解鎖 (Arming) 和模式切換 (SetMode)
    arming_client = rospy.ServiceProxy("mavros/cmd/arming", CommandBool)
    set_mode_client = rospy.ServiceProxy("mavros/set_mode", SetMode)
    
    # **Offboard 命令的發布頻率必須 > 2Hz**,否則飛控會退出 Offboard 模式
    rate = rospy.Rate(20.0)

    # 1. 等待飛控連線
    rospy.loginfo("Waiting for FCU connection...")
    while(not rospy.is_shutdown() and not current_state.connected):
        rate.sleep()

    # 2. 定義目標位置:(0, 0, 2) - 在本地 NED 座標系下,2 米高度
    pose = PoseStamped()
    pose.pose.position.x = 0
    pose.pose.position.y = 0
    pose.pose.position.z = 2

    # 3. 確保飛控在進入 Offboard 模式前,至少已經接收到 100 個設定點
    rospy.loginfo("Sending initial setpoints...")
    for i in range(100):
        if(rospy.is_shutdown()):
            break
        local_pos_pub.publish(pose)
        rate.sleep()

    # 4. 準備 Offboard 模式和 Arming 命令
    offb_set_mode = SetModeRequest()
    offb_set_mode.custom_mode = 'OFFBOARD'

    arm_cmd = CommandBoolRequest()
    arm_cmd.value = True

    last_request = rospy.get_time()

    # 5. 進入主控制循環
    rospy.loginfo("Starting Offboard Control Loop...")
    while(not rospy.is_shutdown()):
        
        # 發送設定點
        local_pos_pub.publish(pose)

        # 檢查當前狀態,並嘗試切換模式和加解鎖
        if(current_state.mode != "OFFBOARD" and (rospy.get_time() - last_request > 5.0)):
            # 嘗試切換到 OFFBOARD 模式
            if(set_mode_client.call(offb_set_mode).mode_sent == True):
                rospy.loginfo("Offboard enabled")
            last_request = rospy.get_time()
        
        elif(not current_state.armed and (rospy.get_time() - last_request > 5.0)):
            # 嘗試加解鎖 (Arm)
            if(arming_client.call(arm_cmd).success == True):
                rospy.loginfo("Vehicle armed")
            last_request = rospy.get_time()

        rate.sleep()

步驟三:啟動模擬與控制

您需要開啟 兩個 終端機視窗來運行模擬和 ROS 控制節點。

終端機 1:啟動 PX4 SITL 和 Gazebo

進入您的 PX4-Autopilot 原始碼目錄,運行 SITL 模擬。

Bash
cd ~/PX4-Autopilot
# 啟動 Iris 模型和 Gazebo
make px4_sitl gazebo_iris

(如果您使用的是 Gazebo Classic,請使用 make px4_sitl gazebo-classic_iris

成功啟動後,您會看到 Gazebo 窗口和一個 PX4 Shell 提示符。

終端機 2:運行 ROS 控制節點

開啟第二個終端機,載入 ROS 工作空間環境,並運行您剛編寫的 Python 腳本。

Bash
# 進入您的 ROS 工作空間
cd ~/catkin_ws
source devel/setup.bash

# 運行 offboard 控制節點
rosrun offboard_py offb_node.py

預期結果

  1. 終端機 2 會開始打印日誌,先是等待飛控連線,然後發送初始化設定點。

  2. 幾秒後,終端機 2 會打印 Offboard enabledVehicle armed

  3. 在 Gazebo 窗口中,Iris 四旋翼模型將會自動起飛,並穩定懸停在 2 公尺 的高度。


警告: Offboard 控制模式是危險的。在真實飛行器上操作時,請務必設置實體開關,以便在緊急情況下迅速切換回手動控制。

PX4 官方指南

整理了利用 PX4 官方指南 提供的腳本

來設定 PX4、ROS、MAVROS 和 Gazebo 模擬環境 的步驟。

這個方法是設定 PX4 開發環境中最快速且最推薦的方式,它會自動處理許多依賴項和配置問題。


🛠️ PX4、ROS、MAVROS 和 Gazebo 模擬環境設定步驟 (使用官方腳本)

PX4 官方使用一個 Bash 腳本 (ubuntu.sh) 來一鍵安裝所有必要的工具鏈、依賴項和模擬器。

1. 取得 PX4 原始碼

首先,您需要下載 PX4 韌體的原始碼庫,其中包含安裝腳本和 Gazebo 模擬所需的檔案。

Bash
# 在您的主目錄 (或您偏好的工作目錄) 下執行
git clone https://github.com/PX4/PX4-Autopilot.git --recursive

2. 執行一鍵安裝腳本

進入下載的目錄,並執行安裝腳本。

Bash
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh

📌 腳本作用說明:

  • 完整安裝: 如果您直接運行 bash ./Tools/setup/ubuntu.sh,腳本會安裝所有元件,包括:

    • PX4 的編譯工具鏈。

    • Gazebo 模擬器 (版本取決於您的 Ubuntu 版本)。

    • ROS (版本取決於您的 Ubuntu 版本,例如 Ubuntu 20.04 對應 ROS Noetic)。

    • MAVROS 套件,用於 ROS 和 PX4 之間的通訊。

    • 其他必要的依賴項。

  • 指令提示: 腳本運行時會詢問您是否同意安裝各個元件,請在出現提示時輸入 y 或按 Enter 鍵確認。

  • 重要! 執行完畢後,官方強烈建議您重新啟動電腦,以確保所有環境變數和權限設定生效。

3. (選用) 針對 ROS 環境的細微調整

如果您的目的是與 ROS 協作,官方指南通常會建議您在安裝後確認 ROS 工作空間和環境變數已正確設定。

  • 確認 ROS 環境: 通常,腳本會將 ROS 環境設定在您的 ~/.bashrc~/.zshrc 檔案中,讓您在每次開啟新終端機時自動載入。 您可以開啟一個新的終端機,運行以下指令來檢查 ROS 是否成功載入:

    Bash
    echo $ROS_DISTRO
    

    如果顯示 noetic 或其他 ROS 版本名稱,則表示成功。

  • Gazebo 模型路徑: 在某些舊版本的設定中,您可能需要手動設定 Gazebo 模型的路徑,但如果使用官方腳本,通常會自動處理。如果未來遇到 Gazebo 找不到模型的錯誤,您可以嘗試手動載入 Gazebo 模型環境變數:

    Bash
    # (如果使用 Gazebo Classic)
    source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
    

🚀 啟動 Gazebo 模擬環境 (SITL + MAVROS)

設定完成後,您可以通過以下方式啟動 PX4、Gazebo 和 MAVROS:

方法一:使用 PX4 make 指令 (推薦)

這是最簡單的方式,它會在背景運行 PX4 SITL 實例並啟動 Gazebo。

Bash
# 啟動 Iris 四旋翼模型 (預設 Gazebo 模擬)
make px4_sitl gz_iris

或者,如果您的 Gazebo 版本較舊,使用 Gazebo Classic

Bash
# 啟動 Iris 四旋翼模型 (Gazebo Classic 模擬)
make px4_sitl gazebo-classic_iris

啟動後,您可以開啟 QGroundControl (QGC) 地面站軟體,它會自動連接到模擬的飛控。

方法二:使用 ROS Launch 檔案 (適用於 ROS 開發)

如果您打算使用 ROS 節點(Node)與飛控通訊,可以透過 ROS 的 launch 檔案來啟動 SITL 和 MAVROS。

  1. 開啟第一終端機: 啟動 Gazebo 模擬器和 PX4 飛控。

    Bash
    cd PX4-Autopilot
    # 啟動 Iris 模擬器
    roslaunch px4 iris.launch
    
  2. 開啟第二終端機: 啟動 MAVROS 節點,連接到 PX4 飛控。

    Bash
    roslaunch mavros px4.launch
    

    通常,mavros px4.launch 檔案會預設使用正確的 UDP 連接設定來連接到 SITL 模擬實例。


這就是使用 PX4 官方腳本設定 Gazebo 模擬環境的完整流程。

您現在是否希望我為您搜尋在 Gazebo 模擬中執行第一個 ROS/MAVROS 控制範例(例如,Offboard Control 模式)的教學?

安装 Gazebo 和 PX4 的仿真环境

 使用 Gazebo 仿真 PX4 需要先安装 Gazebo 和 PX4 的仿真环境,然后通过启动文件来运行仿真。最简单的方法是使用 PX4 官方指南 提供的安装脚本和 ROS/Gazebo 集成方法。启动仿真后,可通过 Gazebo 窗口监控无人机,并使用 QGroundControl 等地面站软件进行通信和控制。 

主要步骤
  1. 安装环境:
    • 安装 Gazebo 和 ROS(如果尚未安装)。
    • 按照 PX4 官方指南 上的说明,使用提供的脚本安装 PX4、ROS 和 MAVROS。
  2. 配置仿真环境:
    • 下载 Gazebo 需要的世界模型和车辆模型。
    • 如果需要,可以修改启动文件,例如 mavros_posix_sitl.launch,来指定要使用的世界模型。
  3. 启动仿真:
    • 在终端中运行 `roslaunch px4 mavros_posix_sitl.launch 来启动仿真。
    • 如果需要,可以先启动 QGroundControl。
  4. 进行交互:
    • 在 Gazebo 窗口中可以看到仿真的无人机和物理环境,并可以添加障碍物等对象。
    • 通过 QGroundControl 连接到仿真,可以监控无人机的状态、设置参数以及控制飞行。
    • 如果需要通过 ROS 进行更高级的控制,可以使用 ROS 节点与 PX4 SITL 应用程序进行通信。 
注意事项
  • 确保 Gazebo 和 ROS 在同一网段(如果需要进行多机仿真)。
  • 在进行仿真前,请确保已正确安装所有依赖项,包括 Gazebo、ROS 和 MAVROS。
  • 根据需要,可以创建自定义的仿真场景和模型。 

PX4 與 Gazebo 模擬器簡介

 


PX4 是一個開源的飛控軟體堆棧(Autopilot Software Stack),廣泛應用於無人機(UAVs)和其他無人駕駛系統。它提供了從低階感測器驅動到高階導航和控制的完整功能。

Gazebo 則是一個功能強大的 3D 機器人模擬環境。它能夠準確、高效地模擬機器人在複雜室內和室外環境中的運動和感測器數據。

PX4 在 Gazebo 模擬 中進行,是業界和學術界進行無人機軟體開發和測試的官方推薦最常用方法之一,也被稱為 SITL (Software-In-The-Loop) 模擬的一種。

🌟 核心優勢

  • 真實感: Gazebo 提供逼真的物理引擎、感測器模型(如 GPS、IMU、視覺感測器等)以及多樣化的環境(worlds),能高度模擬真實飛行情況。

  • 多平台支援: 支援旋翼機(四軸、六軸)、固定翼、複合翼(VTOL)甚至無人車等多種載具模型。

  • 非 ROS 依賴: PX4 SITL 可以獨立於 ROS 運行 Gazebo 進行模擬,但也可以輕鬆與 ROS 整合,以進行更複雜的機器人應用開發。


🛠️ 模擬架構與資料流程

在 PX4 Gazebo 模擬中,核心的資料流向如下:

方向傳輸內容作用說明
PX4 $\to$ Gazebo執行器控制量(HIL_ACTUATOR_CONTROLS MAVLink 訊息)PX4 飛控的核心姿態控制器輸出控制訊號,告訴模擬器「電機應該怎麼轉」。混控(Mixer)通常在 Gazebo 內部完成。
Gazebo $\to$ PX4模擬感測器狀態(GPS、IMU、高度計等)Gazebo 模擬器根據環境、物理模型和控制訊號,計算出當前載具的狀態,並將模擬的感測器數據回傳給 PX4 飛控。PX4 內部的估計模組(Estimator)會使用這些數據計算出飛行狀態。
外部 $\to$ PX4遙控指令、任務指令透過地面站軟體(如 QGroundControl, QGC)或開發工具(如 MAVROS),模擬操作者對飛機下達的控制或任務指令。

⚙️ 如何進行 Gazebo 模擬 (SITL)

進行 Gazebo 模擬的一般流程(以 PX4 韌體原始碼目錄為例):

  1. 安裝 Gazebo 和插件: 確保您的開發環境(通常是 Ubuntu)安裝了推薦版本的 Gazebo (如 Gazebo 9/11 或 Gazebo Classic) 以及 PX4 的模擬插件。

  2. 啟動模擬:

    • 在終端機中運行 make posix_sitl_default gazebo_<載具類型> (例如:make posix_sitl_default gazebo_iris)。

    • 這會啟動 PX4 的 SITL 應用,同時啟動 Gazebo 模擬器,並載入指定的載具模型(如四旋翼 iris)和環境(如 iris.world)。

  3. 連接地面站: 啟動 QGroundControl (QGC),它通常會自動連接到正在運行的 SITL 實例。

  4. 控制與測試: 您可以使用 QGC 或命令列(PX4 Console/Shell)來解鎖(Arm)、起飛(Takeoff)、切換飛行模式,並測試您開發的控制演算法或任務邏輯。

📌 常見載具模型

PX4 韌體支援多種 Gazebo 模擬模型,常見的有:

  • 四旋翼 (Multicopter): iris (標準四旋翼)、solo (3DR Solo)

  • 固定翼 (Fixed-wing): standard_vtol (標準複合翼)

  • 特殊載具: tiltrotor (傾轉旋翼)


如果您希望進一步了解如何在特定的作業系統上安裝和設定 Gazebo 模擬環境,或者想知道如何模擬特定的感測器或環境,我很樂意為您提供更多資訊。

請問您希望我為您搜尋關於 PX4 Gazebo 模擬環境的設定步驟,還是想了解如何在模擬中測試特定的飛行控制功能呢?