控制調(diào)參實(shí)戰(zhàn):從串級(jí)PID到MAVLink工具鏈)
很多搞飛控的朋友做完了傳感器校準(zhǔn)、電調(diào)油門行程校準(zhǔn)、解鎖自檢之后往往會(huì)卡在同一道坎上——飛機(jī)第一次離地就天旋地轉(zhuǎn)或者明明能飛但手感稀碎懸停時(shí)像喝醉了酒。其實(shí)這些問(wèn)題的根源基本都在同一個(gè)地方Ardupilot的姿態(tài)控制沒(méi)調(diào)明白。作為《Ardupilot姿態(tài)控制詳解》系列的完結(jié)篇這篇不打算再重復(fù)前幾篇講過(guò)的傳感器融合原理、電機(jī)動(dòng)力模型、濾波器選型這些“地基”我們直接把最核心的那部分補(bǔ)上姿態(tài)控制這個(gè)閉環(huán)到底怎么運(yùn)轉(zhuǎn)、代碼層面它干了什么事、以及你手里那些管理工具和編程接口Python、Dart該怎么用它干活。適合正在調(diào)參的飛手、做二次開(kāi)發(fā)的軟件工程師以及剛?cè)肟訜o(wú)人機(jī)但對(duì)“飛機(jī)為什么能站穩(wěn)”充滿好奇的新手。1. 姿態(tài)控制是怎么一環(huán)扣一環(huán)的上一代飛控或者說(shuō)初學(xué)階段大家對(duì)姿態(tài)控制的理解往往停留在“PID調(diào)一下就行”。但實(shí)際上去翻Ardupilot的源碼、看日志曲線你會(huì)發(fā)現(xiàn)姿態(tài)控制從來(lái)不是一個(gè)單一PID它是一整套串級(jí)閉環(huán)里面有三個(gè)繞不開(kāi)的概念期望姿態(tài)、機(jī)體角速度、以及電機(jī)的推力分配。1.1 先分清幾個(gè)“姿態(tài)”概念很多新手在接觸姿態(tài)控制時(shí)第一件事就是被歐拉角、四元數(shù)、機(jī)體軸角速度搞暈。這里我建議你用一個(gè)樸素的心智模型去記姿態(tài)就是飛機(jī)“相對(duì)于地面的朝向”角速度就是飛機(jī)“繞自己三個(gè)軸的轉(zhuǎn)動(dòng)快慢”。Ardupilot內(nèi)部幾乎全程用四元數(shù)來(lái)表示姿態(tài)原因很實(shí)際歐拉角在接近90°俯仰時(shí)會(huì)出萬(wàn)向鎖導(dǎo)致數(shù)值跳變而且四元數(shù)做姿態(tài)插值和旋轉(zhuǎn)串聯(lián)運(yùn)算比歐拉角方便得多。但在對(duì)外接口比如MAVLink的ATTITUDE消息里它又會(huì)把姿態(tài)轉(zhuǎn)成歐拉角給你看。所以你會(huì)看到roll、pitch、yaw三個(gè)角度和rollspeed、pitchspeed、yawspeed三個(gè)角速度同時(shí)出現(xiàn)??刂粕暇陀脙商琢拷嵌攘科谕麢M滾角、期望俯仰角、期望偏航角這是外環(huán)的輸入輸出對(duì)象角速度量機(jī)體繞X、Y、Z軸的旋轉(zhuǎn)速度單位rad/s這是內(nèi)環(huán)的直接控制對(duì)象。說(shuō)個(gè)容易踩的坑角速度符號(hào)方向和角度的符號(hào)方向在Ardupilot里是約定一致的都是右手定則。也就是繞X軸向右滾轉(zhuǎn)為正繞Y軸抬頭為正繞Z軸逆時(shí)針偏航為正。要是你自己寫代碼做控制律符號(hào)搞反了那飛機(jī)一定是炸雞收?qǐng)觥?.2 串級(jí)控制角度外環(huán)與角速度內(nèi)環(huán)的結(jié)構(gòu)Ardupilot的姿態(tài)控制采用典型的串級(jí)PID結(jié)構(gòu)。外環(huán)是角度控制器輸入是期望角度和當(dāng)前角度輸出是期望角速度內(nèi)環(huán)是角速度控制器輸入是外環(huán)給出的期望角速度和當(dāng)前角速度陀螺儀測(cè)量的角速度輸出是期望力矩最后通過(guò)混控器mixer轉(zhuǎn)化為每個(gè)電機(jī)的PWM指令。為什么會(huì)用兩層而不是直接把期望角度丟給PID去推電機(jī)原因很簡(jiǎn)單直接用角度誤差去輸出電機(jī)指令等效于一個(gè)P控制器去控制一個(gè)其實(shí)是二階系統(tǒng)的東西增益小了反應(yīng)慢增益大了就震蕩。串級(jí)的好處是內(nèi)環(huán)可以先把角速度這個(gè)“中間量”快速穩(wěn)住外環(huán)只需要調(diào)度“轉(zhuǎn)到什么角速度”即可。用大白話說(shuō)外環(huán)決定“你要多快轉(zhuǎn)過(guò)去”內(nèi)環(huán)保證“你確實(shí)按這個(gè)速度轉(zhuǎn)”。在Ardupilot參數(shù)里這層結(jié)構(gòu)體現(xiàn)在前綴上ATC_ANG_RLL_P、ATC_ANG_PIT_P、ATC_ANG_YAW_P外環(huán)角度P增益ATC_RAT_RLL_P/I/D、ATC_RAT_PIT_P/I/D、ATC_RAT_YAW_P/I/D內(nèi)環(huán)角速度PID。注意外環(huán)只有P沒(méi)有I和D。這是Ardupilot官方推薦的經(jīng)典配合。角度誤差不存在穩(wěn)態(tài)誤差問(wèn)題——因?yàn)橹灰嵌扔衅钔猸h(huán)就會(huì)產(chǎn)生期望角速度繼續(xù)糾偏所以積分項(xiàng)放在外環(huán)是多余且有害的反而會(huì)引入超調(diào)和緩震。角度環(huán)的D更是沒(méi)必要因?yàn)榻嵌缺旧硎怯勺藨B(tài)解算積分出來(lái)的求導(dǎo)放大噪聲純屬自討苦吃。2. 深入Ardupilot的姿態(tài)控制實(shí)現(xiàn)前一節(jié)講了閉環(huán)骨架這一節(jié)我們把骨架里的“器官”逐個(gè)解剖。Ardupilot這套姿態(tài)控制算法經(jīng)過(guò)十幾年的迭代已經(jīng)非常成熟但它的實(shí)現(xiàn)方式并不是教科書(shū)里那種隨手寫個(gè)PID就完事的里面有不少細(xì)節(jié)值得展開(kāi)。2.1 從期望姿態(tài)到期望角速度外環(huán)在算什么外環(huán)的輸入來(lái)自遙控器輸入或自主飛行邏輯比如航線任務(wù)、定高模式里的位置控制器通常表達(dá)為期望的橫滾角、俯仰角、偏航角。Ardupilot在計(jì)算時(shí)會(huì)先把期望姿態(tài)和當(dāng)前姿態(tài)都轉(zhuǎn)為四元數(shù)計(jì)算其誤差四元數(shù)然后從這個(gè)誤差中分解出機(jī)體坐標(biāo)系下的角度誤差。角度誤差在外環(huán)經(jīng)過(guò)比例控制分別乘上ATC_ANG_RLL_P、ATC_ANG_PIT_P、ATC_ANG_YAW_P這三個(gè)參數(shù)就得到了期望角速度。以橫滾軸為例數(shù)學(xué)上就是期望滾轉(zhuǎn)角速度 (期望橫滾角 - 當(dāng)前橫滾角) × ATC_ANG_RLL_P簡(jiǎn)單、直接、沒(méi)有任何花哨的東西。但Ardupilot還會(huì)做一些限制期望角速度不能超過(guò)ATC_RATE_RLL_MAX、ATC_RATE_PIT_MAX、ATC_RATE_YAW_MAX這個(gè)參數(shù)在老版本里叫ATC_RATE_YAW_MAX新版本拆成了幾個(gè)限制參數(shù)姿態(tài)角本身也會(huì)被限幅比如ATC_ANG_LIM_TC用來(lái)平滑搖桿輸入讓期望角度平滑變化避免桿量猛地打滿導(dǎo)致姿態(tài)突跳。ATC_ANG_LIM_TC這個(gè)參數(shù)很容易被忽略但它管著“搖桿打過(guò)去之后期望姿態(tài)追得多快”。調(diào)小立即使手感更跟手調(diào)大則飛機(jī)更柔和。實(shí)際調(diào)試時(shí)如果覺(jué)得飛機(jī)“跟手但容易過(guò)沖”或者“穩(wěn)但反應(yīng)慢”往往不需要?jiǎng)覲ID調(diào)這個(gè)時(shí)間常數(shù)就能解決問(wèn)題。2.2 角速度環(huán)PID每個(gè)參數(shù)到底在干啥內(nèi)環(huán)角速度PID是姿態(tài)控制的重中之重。網(wǎng)上流傳的“P管力度、I管消除靜差、D管阻尼”這句口訣放在這里確實(shí)沒(méi)錯(cuò)但真要落到參數(shù)上還是有很多細(xì)節(jié)值得深挖。先說(shuō)P項(xiàng)。期望角速度和當(dāng)前角速度之間的誤差乘上ATC_RAT_RLL_P對(duì)應(yīng)橫滾軸就成了P項(xiàng)輸出它決定飛機(jī)“抵抗外力擾動(dòng)”的剛度。P太低飛機(jī)受到陣風(fēng)就會(huì)歪P太高飛機(jī)會(huì)出現(xiàn)高頻的嗡嗡聲甚至持續(xù)震蕩這種震蕩頻率通常在幾赫茲以上從日志里看角速度曲線就像鋸齒一樣。再說(shuō)I項(xiàng)。角速度環(huán)的I項(xiàng)用來(lái)消除恒定的干擾力矩比如重心偏移、電機(jī)拉力不一致、機(jī)身不對(duì)稱等導(dǎo)致的持續(xù)偏轉(zhuǎn)。I項(xiàng)的問(wèn)題是積分飽和——當(dāng)飛機(jī)持續(xù)被施加一個(gè)由外環(huán)產(chǎn)生的角速度誤差指令時(shí)如果I項(xiàng)累計(jì)得太多一旦外界擾動(dòng)消失它還會(huì)繼續(xù)輸出好幾秒的偏轉(zhuǎn)力矩表現(xiàn)出來(lái)就是飛機(jī)“緩了一下又突然歪一下”。解決辦法是把I項(xiàng)的積分輸出限制住Ardupilot里專門有ATC_RAT_RLL_IMAX這個(gè)參數(shù)控制橫滾軸的積分限幅默認(rèn)是0.333調(diào)小一點(diǎn)能讓飛機(jī)在風(fēng)吹時(shí)恢復(fù)得更利落。最后說(shuō)D項(xiàng)。角速度環(huán)的D項(xiàng)對(duì)陀螺儀噪聲極其敏感它本質(zhì)上是“角加速度抑制”。D項(xiàng)高了飛機(jī)會(huì)在快速機(jī)動(dòng)后干凈利落地停下來(lái)但調(diào)太高就會(huì)出現(xiàn)陀螺儀噪聲被放大之后的dirty震動(dòng)整機(jī)發(fā)麻、電機(jī)發(fā)燙。Ardupilot里D項(xiàng)還可以再加一個(gè)D濾波器也就是ATC_RAT_RLL_D_FILTER參數(shù)默認(rèn)25Hz用來(lái)把陀螺儀高頻噪聲擋在前端。這個(gè)參數(shù)如果不是特別清楚自己在干嘛建議保持默認(rèn)。偏航軸和橫滾俯仰軸有個(gè)重要區(qū)別偏航軸的轉(zhuǎn)動(dòng)慣量小、響應(yīng)快而且偏航力矩主要靠電機(jī)反扭力差產(chǎn)生所以偏航軸的P和D通常比橫滾俯仰明顯低。新手上路容易犯的錯(cuò)是把三軸P設(shè)成一樣的結(jié)果偏航軸瘋狂抖頭。2.3 代碼層面去哪兒看Ardupilot的姿態(tài)控制代碼在Copter固件里主要由AC_AttitudeControl類負(fù)責(zé)源碼文件路徑大致在libraries/AC_AttitudeControl/AC_AttitudeControl.cpp和ArduCopter/Attitude.cpp。很多朋友想“看源碼學(xué)飛控”我個(gè)人建議先別從頭一行一句讀因?yàn)榇a里混了大量傳感器失效保護(hù)、限幅、模式切換分支直接讀完會(huì)很勸退。更好的方式是帶著問(wèn)題去搜關(guān)鍵函數(shù)名比如你搜a(bǔ)ttitude_controller_run_quat就能看到姿態(tài)控制器的主入口搜rate_controller_run就能看到內(nèi)環(huán)PID計(jì)算的地方。對(duì)著代碼再回頭看日志曲線理解速度會(huì)快很多。3. 配套工具與實(shí)操讀數(shù)據(jù)、發(fā)航點(diǎn)、調(diào)參姿態(tài)控制講得再多最終還是要落到工具鏈和實(shí)操上。這部分我會(huì)覆蓋三個(gè)熱詞里提到的點(diǎn)用哪個(gè)管理工具管理Ardupilot、用Python怎么讀取Ardupilot的姿態(tài)數(shù)據(jù)、以及用Dart通過(guò)MAVLink給Ardupilot發(fā)送航點(diǎn)。這些都是實(shí)際項(xiàng)目里高頻出現(xiàn)的真需求。3.1 管理工具選型Mission Planner、QGroundControl、MAVProxy怎么選Ardupilot的管理工具生態(tài)很豐富但大家最常見(jiàn)的就三個(gè)Mission Planner、QGroundControl、MAVProxy。Mission Planner是Windows平臺(tái)上的“老大哥”功能最全尤其適合做參數(shù)調(diào)優(yōu)、日志分析、傳感器校準(zhǔn)。姿態(tài)控制調(diào)參時(shí)我特別推薦它的“Flight Data”界面能同時(shí)看Pitch/Roll的期望值、實(shí)際值、角速度誤差還能拉出PID貢獻(xiàn)曲線。新版本里它甚至提供了一個(gè)自動(dòng)調(diào)參的“Tune”按鈕雖然我不建議對(duì)新手全自動(dòng)跑但用來(lái)做參數(shù)初篩非常高效。QGroundControl是跨平臺(tái)地面站macOS和Linux用戶的福音。它的航點(diǎn)規(guī)劃和任務(wù)上傳做得漂亮MAVLink可視化也清晰但單獨(dú)的PID分析工具不如Mission Planner豐富。如果你是純Ubuntu開(kāi)發(fā)環(huán)境QGC是首選。MAVProxy則完全是命令行工具對(duì)工程師更友好。它最核心的價(jià)值是可以在嵌入式環(huán)境里用python擴(kuò)展而且資源占用極低。如果你需要在地面站里跑自定義腳本去批量讀取參數(shù)、批量發(fā)指令MAVProxy pymavlink的組合比圖形化地面站靈活得多。選型建議Windows用戶直接上Mission PlannermacOS/Linux桌面用戶上QGroundControl做自動(dòng)化測(cè)試或二次開(kāi)發(fā)的MAVProxy pymavlink是生產(chǎn)力工具。3.2 Python讀取Ardupilot姿態(tài)數(shù)據(jù)pymavlink實(shí)戰(zhàn)Python讀取Ardupilot姿態(tài)數(shù)據(jù)最常用的庫(kù)是pymavlink。它本質(zhì)上是一個(gè)MAVLink協(xié)議解析庫(kù)負(fù)責(zé)把串口、UDP、TCP上的二進(jìn)制MAVLink消息轉(zhuǎn)成可讀的Python對(duì)象。第一步安裝pip install pymavlink第二步建立連接。常見(jiàn)的有兩種連接方式USB串口直連和UDP局域網(wǎng)連接。串口連接適合地面站和飛控用USB線連的場(chǎng)景UDP連接適合數(shù)傳或者模擬器SITL。模擬器調(diào)試時(shí)通常用的是UDPfrom pymavlink import mavutil # 串口連接示例Linux下通常是/dev/ttyUSB0Windows下是COM口 # master mavutil.mavlink_connection(/dev/ttyUSB0, baud115200) # UDP連接預(yù)設(shè)端口SITL默認(rèn)是14550 master mavutil.mavlink_connection(udp:127.0.0.1:14550) master.wait_heartbeat() print(已連接飛控心跳正常)第三步訂閱姿態(tài)消息。姿態(tài)數(shù)據(jù)對(duì)應(yīng)的MAVLink消息名是ATTITUDE里面包含roll、pitch、yaw、rollspeed、pitchspeed、yawspeed六個(gè)核心字段。讀取方式有兩種阻塞式讀取適合腳本里按順序處理一條條消息msg master.recv_match(typeATTITUDE, blockingTrue) print(froll: {msg.roll:.3f} rad, pitch: {msg.pitch:.3f} rad, yaw: {msg.yaw:.3f} rad)事件循環(huán)式讀取適合長(zhǎng)時(shí)間監(jiān)聽(tīng)、隨時(shí)抓取最新姿態(tài)while True: msg master.recv_match(typeATTITUDE, blockingTrue) if msg: # 注意ATTITUDE消息里的歐拉角單位是弧度 roll_deg int(msg.roll * 57.2958) pitch_deg int(msg.pitch * 57.2958) yaw_deg int(msg.yaw * 57.2958) print(froll: {roll_deg}°, pitch: {pitch_deg}°, yaw: {yaw_deg}°)一個(gè)非常容易踩的坑ATTITUDE消息的歐拉角單位是弧度不是角度。如果你直接拿數(shù)值去當(dāng)角度看會(huì)發(fā)現(xiàn)roll是0.03左右而不是1.7度左右搞得自己一頭霧水。做日志分析的時(shí)候統(tǒng)一轉(zhuǎn)成角度制再操作。如果要做姿態(tài)控制調(diào)參分析除了實(shí)時(shí)讀取更推薦直接讀Ardupilot的bin日志dataflash log。用pymavlink的mavlogdump.py腳本可以很方便地把.bin轉(zhuǎn)成.csv或者可讀文本再結(jié)合Excel或者Python的pandas去畫期望角速度、實(shí)際角速度、P/I/D各項(xiàng)貢獻(xiàn)的曲線。3.3 Dart通過(guò)MAVLink發(fā)送航點(diǎn)給Ardupilot的完整流程Dart這個(gè)語(yǔ)言在飛控生態(tài)里出現(xiàn)得不算多但做跨平臺(tái)App、桌面工具、甚至機(jī)器人控制面板時(shí)它確實(shí)是一個(gè)好選擇。Dart發(fā)航點(diǎn)給Ardupilot本質(zhì)上就是通過(guò)串口或網(wǎng)絡(luò)連接發(fā)送MAVLink的航點(diǎn)相關(guān)消息。Ardupilot這邊完全不知道對(duì)面是C、Python還是Dart它只認(rèn)MAVLink協(xié)議。第一步準(zhǔn)備一個(gè)可用的MavLink庫(kù)。Dart生態(tài)里有一個(gè)維護(hù)得比較好的dart_mavlink庫(kù)也可以直接用protocol生成器從mavlink.xml生成Dart代碼。這個(gè)步驟如果你不熟悉可以去pub.dev搜索mavlink找一個(gè)舊但能用的包通常都支持v1.0協(xié)議。第二步建立連接。Dart端通常用UDP連接到運(yùn)行著SITL的電腦上或者通過(guò)串口串口庫(kù)比如serial_port連真機(jī)。這里給一個(gè)UDP連接的示意寫法import dart:io; // 連接到SITL的UDP端口 var socket await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); socket.connect(InternetAddress(127.0.0.1), 14550);第三步發(fā)送航點(diǎn)消息。標(biāo)準(zhǔn)流程其實(shí)分幾步發(fā)送MISSION_COUNT消息告訴飛控“我要上傳N個(gè)航點(diǎn)”等待飛控回MISSION_REQUEST每收到一個(gè)請(qǐng)求就發(fā)送對(duì)應(yīng)的MISSION_ITEM_INT消息里面包含航點(diǎn)序號(hào)、經(jīng)緯度、高度、航點(diǎn)類型MAV_CMD_NAV_WAYPOINT全部發(fā)完后飛控會(huì)回復(fù)MISSION_ACK表示任務(wù)接收完成。以向Ardupilot上傳一個(gè)簡(jiǎn)單的“起飛到指定點(diǎn)”航點(diǎn)為例核心是要構(gòu)MAVLink消息。在dart_mavlink這類庫(kù)里MISSION_ITEM_INT的消息體通常長(zhǎng)這樣var item MavlinkMissionItemInt( seq: 0, frame: MavFrame.mavFrameGlobalRelativeAlt, command: MavCmd.mavCmdNavWaypoint, current: 0, autocontinue: 1, param1: 0, // 停留時(shí)間秒 param2: 20, // 接受半徑米 param3: 0, // 通過(guò)航點(diǎn)半徑米 param4: 0, // 偏航角 x: 47.397742, // 緯度 y: 8.545594, // 經(jīng)度 z: 100.0, // 高度米 );真正讓Ardupilot開(kāi)始執(zhí)行還需要切換飛行模式到AUTO/GUIDED然后發(fā)送MAV_CMD_MISSION_START消息。直接用MAVLink的SET_MODE消息切換模式是最穩(wěn)妥的方式Ardupilot這邊要設(shè)置自定義模式編號(hào)為AUTO在Copter里AUTO對(duì)應(yīng)模式序號(hào)是3。這個(gè)流程里最常見(jiàn)的坑有三個(gè)航點(diǎn)序號(hào)必須從0開(kāi)始而且MISSION_COUNT里的總數(shù)要和實(shí)際發(fā)送的消息數(shù)量完全一致多了少了都會(huì)卡在等待請(qǐng)求狀態(tài)坐標(biāo)系一定要用MAV_FRAME_GLOBAL_RELATIVE_ALT相對(duì)高度否則飛控會(huì)按絕對(duì)高度去執(zhí)行你把高度設(shè)成100米要是當(dāng)?shù)睾0握檬?00米可能沒(méi)事但要是在高原飛飛控會(huì)直接起飛拉升到幾百米如果飛控沒(méi)收到任務(wù)先檢查循環(huán)里有沒(méi)有處理好MISSION_REQUEST消息Ardupilot是一邊收一邊校驗(yàn)每收一個(gè)就要立即回一個(gè)不能批量發(fā)送。3.4 姿態(tài)調(diào)參標(biāo)準(zhǔn)流程與參數(shù)速查說(shuō)完了讀取和航點(diǎn)再回到姿態(tài)控制最核心的事情——調(diào)參。這里給出一個(gè)我自己實(shí)測(cè)下來(lái)比較穩(wěn)的流程。先確認(rèn)基礎(chǔ)條件飛機(jī)重心居中、電機(jī)編號(hào)和方向正確、螺旋槳規(guī)格一致、加速度計(jì)和陀螺儀校準(zhǔn)完成、遙控器通道和模式設(shè)置正確。這個(gè)前提沒(méi)滿足參數(shù)怎么調(diào)都是白搭。第一步把內(nèi)環(huán)PID全部恢復(fù)到一個(gè)安全的保守基準(zhǔn)值。對(duì)于一臺(tái)常見(jiàn)的250級(jí)別四軸或大疆F450級(jí)別四軸可以從Ardupilot自帶的參數(shù)文件里選一個(gè)相近機(jī)型的默認(rèn)參數(shù)或者用官方推薦的默認(rèn)值起步。一般來(lái)說(shuō)ATC_RAT_RLL_P和ATC_RAT_PIT_P可以先給0.135左右I給0.18左右D給0.003左右偏航軸的P給0.18I給0.015D給0.004。軸距更大、更重的飛機(jī)P值反而要適當(dāng)調(diào)小因?yàn)檗D(zhuǎn)動(dòng)慣量大。第二步先調(diào)內(nèi)環(huán)P。讓飛機(jī)解鎖油門推到一個(gè)中等懸停位置給一個(gè)小幅橫滾或俯仰階躍指令用手輕推桿然后回中觀察飛機(jī)是否震蕩。如果震蕩把P降低20%再試。如果響應(yīng)很軟、像“發(fā)面團(tuán)”把P提高20%。反復(fù)試到“打桿后快速響應(yīng)但沒(méi)有高頻震蕩”這個(gè)狀態(tài)為止。第三步加I。手動(dòng)把飛機(jī)在一個(gè)方向掰一下看它是否慢慢回中。如果不回中增加I如果回中后產(chǎn)生低頻率的“來(lái)回晃”就是I過(guò)高降低I。正常情況下姿態(tài)控制的I值不需要很大因?yàn)橥猸h(huán)已經(jīng)在持續(xù)消除角度誤差。第四步加D。把飛機(jī)快速?gòu)囊粋€(gè)姿態(tài)打到另一個(gè)姿態(tài)然后回中觀察能不能干脆利落停住。如果會(huì)“過(guò)沖”一下再回來(lái)說(shuō)明D不足如果電機(jī)發(fā)出尖銳鳴叫、機(jī)身發(fā)麻說(shuō)明D過(guò)大。D項(xiàng)的調(diào)整幅度要非常小一次±0.001因?yàn)橥勇輧x噪聲很容易被D放大。完整的參數(shù)速查表放在這里方便調(diào)參時(shí)對(duì)照參數(shù)名稱作用參考范圍250~550級(jí)四軸調(diào)大效果調(diào)小效果ATC_ANG_RLL_P / ATC_ANG_PIT_P外環(huán)角度P4.5 ~ 6.5更跟手、更激進(jìn)更柔和、更適合新手ATC_ANG_YAW_P外環(huán)偏航角度P4.0 ~ 5.5偏航響應(yīng)更快偏航發(fā)虛ATC_RAT_RLL_P / ATC_RAT_PIT_P內(nèi)環(huán)橫滾俯仰P0.12 ~ 0.18抵抗擾動(dòng)更強(qiáng)抗風(fēng)變差A(yù)TC_RAT_RLL_I / ATC_RAT_PIT_I內(nèi)環(huán)橫滾俯仰I0.15 ~ 0.25消除恒定偏差更快恢復(fù)力變?nèi)魽TC_RAT_RLL_D / ATC_RAT_PIT_D內(nèi)環(huán)橫滾俯仰D0.002 ~ 0.006快速制動(dòng)、抗過(guò)沖更容易過(guò)沖ATC_RAT_YAW_P內(nèi)環(huán)偏航P0.15 ~ 0.22機(jī)頭鎖定力更強(qiáng)鎖頭發(fā)軟ATC_ACCEL_MAX最大角加速度限制8000 ~ 45000 deg/s2機(jī)動(dòng)更猛機(jī)動(dòng)更柔和調(diào)參時(shí)一定要養(yǎng)成記日志的習(xí)慣。每一輪調(diào)整前用Mission Planner輸一個(gè)特定的“tag”在Flight Data里標(biāo)注品名這樣后面翻日志時(shí)一眼就知道當(dāng)前曲線對(duì)應(yīng)哪一組參數(shù)。別偷懶這個(gè)習(xí)慣能幫你少走非常多彎路。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄姿態(tài)控制調(diào)參這條路上幾乎每個(gè)人都踩過(guò)差不多的坑。我把這些年遇到的高頻問(wèn)題整理一下屬實(shí)都是“過(guò)來(lái)人”經(jīng)驗(yàn)很多人不看日志瞎調(diào)一晚上最后發(fā)現(xiàn)就是個(gè)幾百年沒(méi)人注意的小參數(shù)。4.1 高頻自激震蕩現(xiàn)象飛機(jī)解鎖后在空中或者地面就能聽(tīng)到高頻的“嗡嗡”聲甚至電機(jī)抖動(dòng)肉眼可見(jiàn)油門稍微拉高就會(huì)劇烈晃動(dòng)。排查思路直接看日志里的角速度曲線。如果角速度曲線呈現(xiàn)高頻10Hz以上正弦狀波動(dòng)通常意味著內(nèi)環(huán)P偏高或者D偏高。先降P再降D一般一次調(diào)整幅度不超過(guò)20%降完重新試飛。另一個(gè)隱藏原因是陀螺儀濾波器設(shè)置不當(dāng)INS_GYRO_FILTER默認(rèn)值是20Hz如果你用了一個(gè)噪聲特別大的飛控板可以嘗試降到10Hz但如果P和D本身已經(jīng)到了合理區(qū)間濾波扛不住不是因?yàn)檎{(diào)參而是硬件噪聲太大得考慮換減震泡沫墊。4.2 懸停漂移嚴(yán)重現(xiàn)象飛機(jī)在無(wú)風(fēng)條件下懸停姿勢(shì)一直在緩慢漂移往某個(gè)方向一直偏需要不斷手動(dòng)修正。排查思路優(yōu)先檢查傳感器校準(zhǔn)。加速度計(jì)水平偏了一點(diǎn)姿態(tài)估計(jì)就會(huì)一直有誤差飛控為了姿態(tài)回中會(huì)把飛機(jī)往“錯(cuò)誤”的方向推。重新做一次6面校準(zhǔn)然后用遙控桿把飛機(jī)保持水平懸??慈罩纠飏oll/pitch是否接近0。如果加速度計(jì)已經(jīng)校準(zhǔn)了那就是I項(xiàng)的問(wèn)題——看看飛機(jī)是不是偏向電機(jī)轉(zhuǎn)速高的一側(cè)如果是增大對(duì)應(yīng)軸的I值。還有一種被忽略的情況電機(jī)和螺旋槳本身不對(duì)稱比如有一個(gè)電機(jī)有點(diǎn)退磁拉力下降這屬于硬件問(wèn)題需要更換電機(jī)而不是盲目調(diào)參數(shù)。4.3 偏航軸“搖頭”或“鎖不緊”現(xiàn)象飛機(jī)懸停時(shí)機(jī)頭左右搖或者偏航后無(wú)法精確停住甚至出現(xiàn)低頻震蕩。排查思路偏航軸和橫滾俯仰完全不同它的轉(zhuǎn)動(dòng)慣量小、響應(yīng)快過(guò)大的P或者過(guò)大的D都極易引發(fā)振蕩。首先確認(rèn)偏航軸的P不要比橫滾軸高太多然后檢查偏航軸的D是否過(guò)大。還有一點(diǎn)特別容易被忽視偏航軸角速度環(huán)的I項(xiàng)如果設(shè)得過(guò)大會(huì)導(dǎo)致偏航響應(yīng)“軟”也就是機(jī)頭轉(zhuǎn)過(guò)去之后又慢慢彈回來(lái)。可以把ATC_RAT_YAW_IMAX調(diào)低一些。如果電機(jī)排布是X型偏航力矩靠的是四個(gè)電機(jī)的差速電機(jī)響應(yīng)跟不上偏航指令也會(huì)出現(xiàn)搖頭這時(shí)候可以檢查一下電機(jī)電調(diào)的響應(yīng)時(shí)間盡量選響應(yīng)快的電調(diào)。4.4 快速打桿后過(guò)沖現(xiàn)象快速把橫滾桿打到底再松手飛機(jī)不是立刻停住而是順著方向多轉(zhuǎn)了10°左右才回來(lái)。排查思路這是D項(xiàng)不足的典型表現(xiàn)。外環(huán)和P項(xiàng)已經(jīng)把飛機(jī)“加速”到位但缺了阻尼飛機(jī)停不住。先增加橫滾/俯仰的D值每次增加0.0005左右直到快速打桿后能干凈利落停住。如果D已經(jīng)加到0.006以上還是過(guò)沖回頭看看ATC_ANG_LIM_TC是不是設(shè)得太小因?yàn)橥猸h(huán)反應(yīng)過(guò)激會(huì)把一個(gè)很大的期望角速度灌給內(nèi)環(huán)內(nèi)環(huán)再激進(jìn)也容易過(guò)沖。這個(gè)情況下降一點(diǎn)外環(huán)角度響應(yīng)反而能改善手感。4.5 檢查清單速查表問(wèn)題現(xiàn)象優(yōu)先檢查項(xiàng)次要檢查項(xiàng)高頻震蕩內(nèi)環(huán)PID過(guò)高尤其D項(xiàng)INS_GYRO_FILTER過(guò)低減震墊問(wèn)題懸停漂移加速度計(jì)校準(zhǔn)偏差I(lǐng)項(xiàng)不足、重心偏移偏航搖頭偏航P/D過(guò)高電調(diào)響應(yīng)慢、ATC_RAT_YAW_IMAX過(guò)大打桿過(guò)沖內(nèi)環(huán)D不足ATC_ANG_LIM_TC過(guò)小、外環(huán)P過(guò)高響應(yīng)遲緩內(nèi)環(huán)P不足外環(huán)角度P不足、角加速度限幅過(guò)小電機(jī)發(fā)燙D項(xiàng)過(guò)大導(dǎo)致高頻調(diào)節(jié)電調(diào)頻率過(guò)低、電機(jī)損壞這里必須再?gòu)?qiáng)調(diào)一遍調(diào)試姿態(tài)控制最忌諱“想當(dāng)然”。不要憑感覺(jué)擰參數(shù)一定要用日志輔助分析。Mission Planner的Flight Data界面把pil和期望值曲線疊加在一起看一眼就能判斷誤差是角度誤差還是角速度誤差。如果角度偷差一段時(shí)間持續(xù)說(shuō)明外環(huán)有系統(tǒng)性問(wèn)題如果角度幾乎一致但角速度震蕩內(nèi)環(huán)問(wèn)題跑不掉。日志是你和失控之間唯一的真相。根據(jù)我個(gè)人這么多年的調(diào)機(jī)經(jīng)驗(yàn)姿態(tài)控制調(diào)參其實(shí)有60%的時(shí)間是在排除硬件和傳感器問(wèn)題只有40%的時(shí)間在真正碰PID。很多人一上來(lái)就調(diào)參數(shù)結(jié)果調(diào)了兩天發(fā)現(xiàn)是螺旋槳一個(gè)裝反了、電機(jī)一個(gè)堵轉(zhuǎn)白白浪費(fèi)精力。先把硬件、重心、校準(zhǔn)這些工作做實(shí)再動(dòng)手調(diào)PID你會(huì)發(fā)現(xiàn)所謂的“姿態(tài)控制難點(diǎn)”其實(shí)沒(méi)有傳說(shuō)中那么玄乎。最后再分享一個(gè)小技巧調(diào)參之前把Mission Planner里的“Pilot Tune”調(diào)參工具用起來(lái)它會(huì)自動(dòng)幫你做一次往返掃掠然后給出一組推薦PID。雖說(shuō)不一定完全貼合你的手感偏好但拿來(lái)做初始值和合理性驗(yàn)證很靠譜。省下的時(shí)間夠你多炸兩架模擬器了。