Udacity机器人软件工程师课程笔记(二十五) - 使用PID控制四轴飞行器 - 四轴飞行器(四旋翼)模拟器
1.四軸飛行器運動學和動力學模型
在討論四軸飛行器時,明確定義兩個參考坐標系會很有幫助:一個固定的世界坐標系W{W}W和一個牢固地附著到四軸飛行器的質心(CoM)的運動坐標系B{B}B。
假設運動坐標系B{B}B{B}B的x軸指向電動機編號1,y軸指向電動機編號2,并且當四軸飛行器電機靜止在水平表面上時,z軸指向“上”。
FiF_iFi? = 電動機iii的推力(N) 、 MiM_iMi? = 螺旋槳iii對B{B}B的轉矩(力矩)(N*m), 其中i ∈ [1, 2, 3, 4]。
我們可以通過使用三個歐拉角來描述運動框架B{B}B相對于W{W}W的方向。具體來說,讓我們定義一下橫滾(側傾)角(?\phi?),俯仰角(θ\thetaθ)和偏航角(ψ\psiψ)作為固有(ZXY)旋轉序列,其中,
換句話說,左乘一個向量p,由BWR{}^{W}_BRBW?R表示的B{B}B將給出以W{W}W表示的p的坐標。
[pxpypz]W=BWR[pxpypz]B\begin{bmatrix} p_x \\ p_y \\p_z \end{bmatrix}_W = {}^{W}_{B}R\begin{bmatrix} p_x \\ p_y \\p_z \end{bmatrix}_B???px?py?pz?????W?=BW?R???px?py?pz?????B?
軸飛行器飛機具有許多功能,使它們在動力學和控制方面變得有趣起來。如前所述,3D空間中的剛體具有六個自由度。但是,四軸飛行器只有四個電機作為控制輸入,因此四軸飛行器是欠驅動系統的一個示例。這意味著四軸飛行器不能獨立控制每個平移和旋轉自由度。
四軸飛行器的欠驅動特性迫使某些旋轉運動和平移運動之間發生運動學耦合。為了使四軸飛行器向前或向后移動,bx\bold {b_x}bx?表示“前進”方向,四軸飛行器必須圍繞by\bold{b_y}by?軸有一個正的俯仰角。同樣,為了“向右”移動,即朝-方向移動by\bold{b_y}by?軸,四軸飛行器必須具有正側傾角bx\bold {b_x}bx?。
從概念上講,垂直方向的移動要簡單得多。每個電機沿電機產生一個力bz\bold{b_z}bz?與電機角速度平方成比例的軸,
Fi=kFωi2F_i = k_F\omega^{2}_iFi?=kF?ωi2?
其中, kFk_FkF?是常數,并且iii ∈[1,2,3,4]。每個電機的力沿著bz\bold{b_z}bz?。如果電動機的凈推力大于重力,則四旋翼將“向上”加速。當然,反之亦然。
偏航(yaw)運動-關于 bz\bold{b_z}bz?。電機位于bx\bold{b_x}bx? 軸,電動機1和3順時針旋轉(關于bz\bold{b_z}bz? 軸),而位于 by\bold{b_y}by?軸2和4逆時針旋轉。需要相反的旋轉對來抵消來自四軸飛行器機體上的旋轉葉片的感應扭矩。每個轉子轉矩的大小與電動機角速度的平方成正比,
Ti=kMωi2T_i = k_M\omega^{2}_iTi?=kM?ωi2?
其中, kMk_MkM?是常數,并且iii∈[1,2,3,4]。
根據牛頓第三定律,在四軸飛行器上產生的扭矩與螺旋槳的旋轉方向相反。,對于Unity模擬器中的四軸飛行器(下圖),電機1和3位于bx\bold{b_x}bx?軸上,并順時針旋轉(從上圖可見),而電機2和4位于by\bold{b_y}by?軸上,并逆時針旋轉。因此,來自電動機1和3的扭矩作用于+bz\bold {b_z}bz?電機2和4的扭矩作用于-bz\bold {b_z}bz? 方向。
為了執行一個純粹的偏航運動,即如果在不改變仰角的情況下進行旋轉,一對電機的角速度增加的幅度與另一對電機的角速度減少的幅度應相同。
通常,四軸飛行器需要12個廣義坐標才能完整描述其在3D空間中的位置和方向(位置3個,方向3個及其時間導數)。更具體地說,我們將這些廣義坐標定義為
- x,y和z =四軸飛行器質心(CoM)的位置
- 側傾角(?\phi?),俯仰角(θ\thetaθ)和偏航角(ψ\psiψ) = 四軸飛行器運動坐標系B{B}B相對于固定世界坐標系W{W}W的方向
- x˙\dot {x}x˙,y˙\dot {y}y˙?和 z˙\dot {z}z˙ = 四軸飛行器CoM的線速度
- ?˙\dot {\phi}?˙?,θ˙\dot {\theta}θ˙和ψ˙\dot {\psi}ψ˙? = B{B}B相對于{W}的角速度
因此,四軸飛行器的全狀態向量為
ξ=[x,y,z,?,θ,ψ,x˙,y˙,z˙,?˙,θ˙,ψ˙]\bold {\xi} = [x,y,z,\phi,\theta,\psi,\dot {x},\dot {y},\dot {z},\dot {\phi},\dot {\theta},\dot {\psi}]ξ=[x,y,z,?,θ,ψ,x˙,y˙?,z˙,?˙?,θ˙,ψ˙?]
在古典力學中,了解狀態以及描述狀態如何隨時間變化的方程(即運動的動力學方程),就可以在將來的某個時間計算系統的狀態。
當然,控制的目的是確定執行器輸入的大小,以便獲得所需的響應。四軸飛行器飛機很有趣,因為它們需要一個非零的電動機輸入,以在空中保持簡單的恒定位置。然后,在為四軸飛行器設計控制器時,一個訣竅是首先定義“平衡”(懸停)狀態ξeq\bold {\xi_ {eq}}ξeq?,然后計算相對于以所需方式驅動系統的平衡的電動機速度變化。
計算平衡狀態下懸停的標稱電動機推力非常簡單-這只是一個靜力學問題。如果作用在Wz^\hat{\bold{W_z}}Wz?^?方向等于零,則世界坐標系的z方向上沒有加速度。用粗體符號表示矢量,所有外力(重量+ 4個電機的推力)之和為:
在平衡懸停狀態下,可以假定:
- 所有電機產生相等的推力,即F1 = F2 = F3 = F4
- 四軸坐標系B{B}B和世界坐標系W{W}W坐標系的Z軸是平行的。從而,bz?Wz=1\bold {b_z} \cdot \bold {W_z} = 1bz??Wz?=1
由于每個馬達產生的推力是
Fi=kFωi2F_i = k_F\omega^{2}_iFi?=kF?ωi2?
平衡懸停時的標稱電動機速度為
?mg+4Fi=0-mg +4F_i=0?mg+4Fi?=0
?mg+4kFωi2=0-mg +4k_F\omega^{2}_i=0?mg+4kF?ωi2?=0
ωi=mg4kF\omega_i=\sqrt{\frac{mg}{4k_F}}ωi?=4kF?mg??
盡管電機速度是由車載計算機直接控制的,但實際上,考慮凈推力以及圍繞側傾,俯仰和偏航軸的力矩來控制四旋翼實際上更容易。這種抽象使將整體控制問題細分為各個組件變得更加容易。
例如,一個控制器可能負責維持四旋翼的位置和航向(偏航角),而另一控制器則影響四旋翼的姿態。通常,這種細分策略涉及將一個反饋循環“包裝”或“嵌套”在另一個反饋循環內部。然后,將整個控制器稱為級聯控制器。
2.級聯PID控制器
前面使用的海拔控制示例是SISO(單輸入單輸出)系統。實際上,大多數實際系統是MIMO(多輸入,多輸出)。處理MIMO系統的一種方法是級聯 結構。
級聯控制器的一般形式如下所示:
注意有兩個閉環反饋控制器,其中主控制器環繞次級回路。這種安排通常要求內部(輔助)循環比外部(主要)循環執行得快得多(快10倍以上)。換句話說,如果外環以10 Hz的頻率運行,則內環需要至少100 Hz的頻率運行。由于更新頻率的這種差異,外環的主要設定值對于內環而言基本上是靜態的。
在四旋翼飛機的背景下,主控制器負責維持其3D位置和偏航角,而內環則控制姿態(即,側傾角,俯仰角和偏航角)。該控制方案將允許操作員“放開”控制輸入,并使四旋翼飛機在3D空間中保持穩定的位置和方向(假設外部干擾不太大!)。
在不深入研究所涉及的數學的情況下,讓我們用rrr表示四旋翼飛行器當前3D位置與其目標位置之間的向量。
可以從該位置誤差的PID反饋中找到四旋翼質量中心的所需線性加速度。通過假設側傾角和俯仰角保持在平衡懸停狀態附近,可以使運動方程線性化,并根據所需的線性加速度來計算所需的側傾角和俯仰角。位置控制器將所需的側傾角,俯仰角和偏航角傳遞給姿態控制器。姿態控制器返回標稱電動機速度的變化,該變化會將四旋翼移向這些所需的側傾角和俯仰角。
3.環境設置
如果沒有活動的ROS工作空間,則可以通過鍵入以下內容來創建一個:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
現在已經建立了工作區,將實驗室資料庫克隆或下載到工作區的src目錄中:
$ cd ~/catkin_ws/src
$ git clone https://github.com/udacity/RoboND-Controls-Lab.git
下一步使用rosdep install安裝缺少的依賴項:
$ cd ~/catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
catkin_make:
$ cd ~/catkin_ws
$ catkin_make
若沒有,可以將以下行添加到.bashrc中,以自動獲取所有新終端:
$ source ~/catkin_ws/devel/setup.bash
下載適用于OS的Quad模擬器的最新文件,并將其放在方便的位置。
注意: 需要將模擬器添加到本地系統/OS中,而不要添加到VM中。
可以閱讀README.md在github上找到的更多信息。
4.模擬器設置
對于此模塊的實驗室組件,使用ROS與Udacity基于Unity的仿真環境DroneSim中的四旋翼接口。
DroneSim提供了一套全面的工具,可在開始調試四旋翼飛行控制器并對其進行故障排除時提供極大的幫助。
(1)更新ROS設置文件
在第一次啟動DroneSim之前,我們需要確保已正確配置它以與Linux VM上的ROS Master通信。為此,檢查ros_settings.txt配置文件。
注意:在大多數不使用虛擬機的系統上,不需要進行更新ros_settings.txt。
ros_settings.txt可以在以下位置找到該文件:
- Windows:
DroneSim_Win_Data/ros_settings.txt - MacOS
DroneSim_OSX.app/Contents/ros_settings.txt
警告:請勿使用默認的Mac文本編輯器,因為它將導致字符問題。如果在VM上連接到ROS時遇到問題,請嘗試將行尾的雙引號更改vm-ip為正確的雙引號。
下面是一個示例配置:
{"vm-ip" : "192.168.30.111","vm-port" : 11311,"vm-override" : false,"host-ip": "0.0.0.0","host-override" : false
}
vm-ip
Linux虛擬機的IP地址。可以在提供的Udacity虛擬機中選擇的終端中輸入echo $(hostname -I)來確定這個IP。
注意:VM的ip地址可能會改變。如果遇到問題,一定要檢查VM的ip是否與ros_settings.txt中的ip匹配.
vm-port
虛擬機上的ROS主端口號。雖然端口11311是默認端口,但是可以通過查看roscore命令的控制臺輸出來進行驗證,該命令作為ROS_MASTER_URI的一部分進行打印(例如 ROS_MASTER_URI=http://hostname:11311/)。
vm-override
這控制是否使用以上信息。如果要從虛擬機外部運行模擬器,則應將其設置為true。因此應設置為true。
host-ip
與主機關聯的IP地址。如果host-override為false,則忽略此設置。
host-override
當且僅當正在更新host-ip設置時,才應將其設置為true 。
(2)啟動模擬器
要啟動模擬器,只需雙擊DroneSim可執行文件。如果要更改模擬器的分辨率,請執行以下操作。
- Windows:在模擬器啟動時按住crtl鍵。
- Mac:在啟動時按住Option鍵。
- Linux:添加
-show-screen-selector作為從終端啟動sim時的參數
(3) 按鍵命令和GUI概述
下面,將介紹模擬器中可用的一些基本GUI功能。除了以下說明之外,模擬器還提供了該模擬器使用的所有鍵映射的說明。鍵入“ L”喚起這個圖例。
(4)使用鍵盤移動
要在不使用控制器的情況下圍繞模擬器飛行四邊形,只需單擊左下角的“ Input On”(輸入打開)按鈕即可。要獲取關鍵命令的列表,這些命令將可以在打開本地輸入的情況下四處飛行。
注意:啟用本地輸入后,來自ROS的強制命令將被忽略。在測試飛行控制器時,請確保未啟用該功能!
(5)改變觀察方向
要更改場景攝像機相對于四軸飛行器的位置,可以使用鍵盤上的數字鍵。如果要更改場景攝像機與四邊形之間的距離,可以使用鼠標上的滾輪。要將視點重設為原始視圖,只需在相機視口中右鍵單擊即可。
(6)話題
以下是模擬器發布/訂閱的主題列表。有關相關消息類型的更多詳細信息,只需使用命令$ rosmsg show。要通過命令行獲取此主題列表,可以使用命令$ rostopic list。
/quad_rotor/cmd_force(已訂閱)
通過該主題,力和扭矩可以傳遞給四旋翼。所有力單位均為牛頓,所有扭矩單位均為牛頓米。所有力和扭矩均符合ROS單位和坐標約定(REP-103),并將應用于或圍繞相應的車身框架軸。
注意:cmd_force命令被模擬器“鎖存”。這意味著將連續施加命令的力或扭矩命令,直到模擬器接收到新命令為止。
/quad_rotor/cmd_vel(已訂閱)
通過該主題,可以在四邊形的車體框架上設置速度。提供此主題僅用于調試目的。
/quad_rotor/image(已發布)
來自四軸深度相機的深度圖像已發布到該主題。
/quad_rotor/imu(已發布)
四旋翼的IMU可估算線性加速度,角速度和四旋體的方向。我們不會在此控件實驗室中使用此主題,而將使用pose主題提供的完美位置和方向。
/quad_rotor/pose(已發布)
本主題提供四邊形的“地面真相”位置和方向,以慣性(世界)框架表示。在實際的四旋翼飛行器中,地面真實姿態無法供我們使用,而是可以使用許多傳感器(例如GPS,IMU和大氣壓力傳感器)進行估算。
(7)服務
/quad_rotor/camera_distance
設置攝像機到四軸飛行器機身的距離。單位為米。
/quad_rotor/camera_pose_type
設置相機姿勢。以下是可接受值的列表。
0:與慣性坐標系的YZ平面正交,面向X的正方向。
1:垂直于慣性坐標系的XZ平面,面向Y方向正。
2:與慣性坐標系的XY平面正交,面向負Z方向。
3:透視圖,從-X,-Y,+ Z象限面向四邊形的主坐標系。
/quad_rotor/get_path
獲得模擬器的路徑
/quad_rotor/set_path
將路徑加載到模擬器中
5.其他工具
擁有如此多的自由度,調試和故障排除可能是一個痛苦的過程。為了使事情更簡單,我們提供了一些可以使生活更輕松的工具。
(1) 約束力和扭矩
可以限制四邊形轉子車體框架上的力和扭矩。如果僅嘗試調試單個自由度,則此功能很有用。
示例:不允許沿四軸的X軸移動
$ rosservice call /quad_rotor/x_force_constrained "data: true"
示例:不允許圍繞四軸的X軸旋轉
$ rosservice call /quad_rotor/x_torque_constrained "data: true"
(2) 設定相機姿勢
要設置相機姿勢,可以在模擬器中右鍵單擊并拖動,也可以使用以下服務呼叫,其中數據參數可以采用以下值:
0:與慣性框架的YZ平面正交,面向正X方向。
1:垂直于慣性框架的XZ平面,面向Y方向正。
2:與中間框架的XY平面正交,面向負Z方向。
3:透視圖,從-X,-Y,+ Z象限面向四邊形的主體框架。
$ rosservice call /quad_rotor/camera_pose_type "data: 0"
要將相機姿勢重置為默認姿勢,可以使用服務電話或右鍵單擊。
(3) 設定相機距離
要設置相機與四軸機身之間的距離,可以使用該 /quad_rotor/camera_distance服務。例如,要將攝像頭距離設置為20米,可以按以下方式調用服務:
$ rosservice call /quad_rotor/camera_distance "data: 20.0"
要將相機距離重置為默認值,只需在模擬器中右鍵單擊即可。
(4) 禁用重力
重力可能是殘酷的現實。特別是在處理姿態調整時。幸運的是,出于調試目的,我們可以在模擬器中禁用重力。為此,請/quad_rotor/gravity按以下方式調用服務:
$ rosservice call /quad_rotor/gravity "data: false"
(5) 設定姿勢
要設置四軸飛行器姿勢,請使用/quad_rotor/set_pose服務。以下服務調用會將四軸飛行器置回原點:
$ rosservice call /quad_rotor/set_pose "pose:position:x: 0.0y: 0.0z: 0.0orientation:x: 0.0y: 0.0z: 0.0w: 0.0"
(6) 繪圖使用 quad_plotter_node
這quad_plotter_node是一個方便的工具,可用于捕獲和繪制四邊形運動。在仿真中調整四轉子時,這可能有用。
服務:
/quad_plotter/start_recording-開始記錄劇情數據(姿勢)
/quad_plotter/stop_recording-停止記錄繪圖數據(姿勢)
/quad_plotter/clear_path_history -清除劇情歷史記錄(姿勢)
/quad_plotter/clear_waypoints -明確的航點
/quad_plotter/load_waypoints_from_sim-從無人機模擬器獲取航點
/quad_plotter/get_path_history -返回路徑歷史記錄為位姿數組
/quad_plotter/plot_one-在給定平面上繪制2D路徑(即將選擇平面!)
/quad_plotter/plot_3d -創建3D圖以透視圖描述路徑
/quad_plotter/plot_grid-創建一個網格圖,顯示4個不同的視圖
示例:捕獲網格圖
從模擬器加載航點(可選) $ rosservice call /quad_plotter/load_waypoints_from_sim
開始記錄姿勢$ rosservice call /quad_plotter/start_recording "{}"
執行我們希望在模擬器中捕獲的行為。
停止記錄姿勢 $ rosservice call /quad_plotter/stop_recording "{}"
生成圖 $ rosservice call /quad_plotter/plot_gird "{}"
執行上述步驟后,應生成一個新的帶有時間戳的PNG圖像并將其放置在/quad_controller/output_data目錄中。
6.PIDController類
class PIDController:def __init__(self, kp=0.0, ki=0.0, kd=0.0, max_windup=10):self.kp_ = kpself.kd_ = kdself.ki_ = kiself.alpha = 0.5self.target_ = 0.0self.max_windup_ = float(max_windup)self.umin = -100.0self.umax = 100.0self.last_timestamp_ = 0.0self.set_point_ = 0.0self.start_time_ = 0.0self.error_sum_ = 0.0self.error_past_ = 0.0self.u_p = [0]self.u_d = [0]self.u_i = [0]def reset(self):self.kp_ = 0.0self.kd_ = 0.0self.ki_ = 0.0self.target_ = 0.0self.last_timestamp_ = 0.0self.set_point_ = 0.0self.error_sum_ = 0.0self.error_past_ = 0.0def setTarget(self, target):self.target_ = float(target)def setKP(self, kp):self.kp_ = float(kp)def setKI(self, ki):self.ki_ = float(ki)def setalpha(self, alpha):self.alpha = float(alpha)def setKD(self, kd):self.kd_ = float(kd)def setMaxWindup(self, max_windup):self.max_windup_ = float(max_windup)def update(self, measured_value, timestamp):delta_time = timestamp - self.last_timestamp_self.last_timestamp_ = timestamperror = self.set_point_ - measured_valueself.error_sum_ += errordelta_error = error - self.error_past_self.error_past_ = errorif self.error_sum_ > self.max_windup_:self.error_sum_ = self.max_windup_elif self.error_sum_ < -self.max_windup_:self.error_sum_ = -self.max_windup_p = self.kp_ * errori = self.ki_ * self.error_sum_d = self.kd_ * (self.alpha * delta_error / delta_time + (1 - self.alpha) * self.error_past_ / delta_time)u = p + i + dif u > self.umax:u = self.umaxelif u < self.umin:u = self.uminself.u_p.append(p)self.u_d.append(d)self.u_i.append(i)return u
7.懸停控制器
如前所述,四旋翼具有四個獨立的自由度:
- 側傾(繞X軸旋轉)-導致Y軸同時平移
- 俯仰(繞Y軸旋轉)-導致X軸同時平移
- 偏航(繞Z軸旋轉)
- 沿Z軸運動
本質上,懸停控制器僅控制一個獨立的自由度,即沿Z軸的運動。
一個簡單的基于PID的懸停控制器計算給定目標高度與四旋翼飛機當前高度之間的差值以獲得誤差信號,然后嘗試通過調整(控制)沿四旋翼飛機z軸的總推力來最小化此誤差。
軟件包中hover_controller_node提供了一個示例,該示例quad_controller利用了已實現的PID控制器類。
要測試此懸停控制器,需要啟動四旋翼模擬器并啟動hover_controller_node。
由于四旋翼模擬器使用ros主題和服務進行交互,因此必須在啟動模擬器之前啟動ROS Master。
為此,請打開一個新的終端并啟動roscore
$ roscore
現在可以在主機平臺上啟動Quad仿真器了。
啟動模擬器
對于每個主機平臺(Win / Mac / Linux),圍繞此過程的詳細信息將有所不同,請參閱實驗README文件的“Using the Simulator”部分。
如果提供了該選項,選擇計算機系統可以舒適地處理的所需屏幕解決方案和圖形質量,然后單擊“確定”。
注意,屏幕左下角顯示“ Connected to ROS”消息。
如果消息顯示“正在連接到ROS”超過幾秒鐘,則可能要檢查主機VM上的防火墻設置,或嘗試重新啟動模擬器。
此外,可以驗證是否可以在以下/quad_rotor/pose主題上看到模擬器發布的姿勢:
$ rostopic echo /quad_rotor/pose
如果看到正在發布的消息,那就很好。如果沒有看到發布的消息,則可能再次需要檢查主機VM上的防火墻設置,或嘗試重新啟動模擬器。
將模擬器正確連接到ROS后,啟動hover_controller_node
$ roslaunch quad_controller hover_controller.launch
如果腳本正常運行,則四軸飛行器的視圖應如下所示。如果不是,退出所有內容,然后重試步驟。
四旋翼的hover_controller_node正在運行,但它實際上是置于在地面上的。
這是因為控制器的默認目標高度設置為零。為了命令它在運行時移動到新的目標高度,我們將使用功能強大的ROS實用程序dynamic_reconfigure。
8.dynamic_reconfigure
dynamic_reconfigure是一個ROS軟件包,利用它我們可以在運行時修改節點參數,而不必重新啟動節點。通常,希望在運行節點時手動修改這些參數,尤其是出于測試或調整目的。
我們在關于節點和主題的討論中簡要討論了參數服務器,并在arm_mover代碼中探討了參數的簡單使用案例。
話雖如此,讓我們快速回顧一下。參數服務器是一個共享字典,各種ROS節點都使用它來在運行時存儲和檢索參數。
它本來就很慢,因此主要用于靜態數據,例如配置參數。
例如,在感知拾取和放置實驗室中,使用實驗室啟動文件以參數的形式存儲了“ 選擇列表”,然后在節點中對其進行了檢索。
ROS參數可以是以下數據類型:
- Integers (32-bit)
- Doubles
- Booleans
- Strings
- Lists
- Dictionaries
- …
為了更好地理解dynamic_reconfigure,我們使用它來控制hover_controller_node。
如果Quadrotor Sim已經開始仿真并且hover_controller_node節點啟動并正在運行,則可以繼續進行下一步。否則,在繼續之前參考前面部分。
現在從一個新終端啟動一個rqt_reconfigure實例,一個dynamic_reconfigure基于GUI的客戶端程序:
$ rosrun rqt_reconfigure rqt_reconfigure
rqt_dynamic_reconfigure GUI的左側面板列出了所有具有可重新配置參數的活動節點,這里為hover_controller。單擊hover_controller顯示該節點的可重新配置參數列表。
最初,四旋翼飛機將靜止在地面上。將“目標”高度設置為10(單位為米),然后通過增加kp來開始調節控制器,直到產生的推力足夠強到足以將四軸飛行器抬離地面為止。
可以嘗試使用的Ziegler-Nichols調整方法hover_zn_tuner_node或使用的轉動調優算法hover_twiddle_tuner_node。確保運行:
$ roslaunch quad_controller hover_controller.launch
在嘗試運行hover_zn_tuner_node或hover_twiddle_tuner_node之前
要運行hover_zn_tuner_node:
$ rosrun quad_controller hover_zn_tuner_node
運行twiddle_tuner_node:
$ rosrun quad_controller hover_twiddle_tuner_node
9.姿態控制器
現在,讓我們通過添加其余的獨立自由度:
- 側傾(繞X軸旋轉)-導致Y軸同時平移
- 俯仰(繞Y軸旋轉)-導致X軸同時平移
- 偏航(繞Z軸旋轉)
姿態控制器本質上控制姿態,即四旋翼的側傾、俯仰和偏航角。
基于PID的姿態控制器運行PID控制器類的三個獨立實例,分別用于控制側傾、俯仰和偏航角。
根據四旋翼的期望角度值與當前角度值之間的差異來計算各個誤差值。控制器然后嘗試通過調整(控制)沿四旋翼的x,y和z軸的總扭矩來最小化此誤差。
套件中attitude_controller_node提供的示例實現,該實現quad_controller利用已實現的PID控制器類。
要測試此Attitude Controller,需要遵循與之前類似的步驟,并確保針對每種類型的控制器都重新開始操作,并且一次最多只能運行一個控制器:
- 啟動roscore:
$ roscore
-
啟動模擬器:參考實驗室README文件的“使用模擬器”部分,以獲取特定于操作系統的啟動模擬器的說明。
-
運行titude_controller_node:
$ roslaunch quad_controller attitude_controller.launch
我們會觀察到即使attitude_controller_node正在運行,四旋翼的行為也沒有改變。
這是因為默認目標側傾,俯仰和偏航設置為零。就像懸停控制器一樣,使用dynamic_reconfigure設置目標值,并分別針對三個自由度側傾,俯仰和偏航分別調整PID控制器。
需要記下這些PID參數,因為將在位置控制器中使用它們。
注意:ZN和Twiddle Tuner節點僅適用于Hover Controller,它們不能與Attitude Controller一起正常工作。
10.位置控制器
到現在為止,我們有一個經過微調的懸停和一個姿態控制器。
如級聯控制中所述,位置控制器位于級聯PID控制器的外環中,負責命令姿態和推力矢量,以便在三維空間中實現目標定向。
要控制四旋翼飛機沿其x軸的運動,必須調整俯仰角(沿y軸的旋轉)。沿著y軸的運動可以通過調節側傾(沿著x軸的旋轉)來控制。
位置控制器根據分別從四旋翼的期望和當前y位置和x位置之間的差計算得出的誤差值來確定期望的側傾角和俯仰角值。
然后將這些所需的側傾角和俯仰角饋送到在內部回路中運行的姿態控制器,以進行最終的側傾角和俯仰角控制。
另外,位置控制器還包括先前討論的懸停控制器,用于控制四旋翼沿z軸的運動。
在quad_controller軟件包中提供了position_controller_node的示例實現,該軟件包利用已實現的PID控制器類。
要測試此位置控制器,需要執行與之前類似的步驟,并確保針對每種控制器類型都重新開始操作,并且一次不能運行多個控制器
- 啟動roscore:
sh $ roscore
-
啟動模擬器:按照README文件中提供的步驟進行操作。
-
運行position_controller_node:
sh $ roslaunch quad_controller position_controller.launch
和以前一樣,必須使用dynamic_reconfigure設置x,y和z位置的目標值,并為x和y控制器調整PID控制器。
我們必須已經從懸停控制器中保存了PID參數,這些參數可以直接用于z控制器。同樣,姿態控制器保存的參數可以重復使用。
注意:ZN和Twiddle Tuner節點僅適用于Hover Controller,它們將無法與Positional Controller一起正常使用。
現在我們可以使用PID控制器在空間中控制位置和姿態了,接下來我們將通過深度神經網絡來確定一個移動目標的位置,然后實現控制四軸飛行器來跟隨目標。
總結
以上是生活随笔為你收集整理的Udacity机器人软件工程师课程笔记(二十五) - 使用PID控制四轴飞行器 - 四轴飞行器(四旋翼)模拟器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Udacity机器人软件工程师课程笔记(
- 下一篇: Udacity机器人软件工程师课程笔记(