久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3878|回復: 0
打印 上一主題 下一主題
收起左側

四軸飛行器算法調試心得

[復制鏈接]
跳轉到指定樓層
樓主
ID:148322 發表于 2016-11-16 19:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
PID調試心得
本人不是自動化出身,也沒有受過專業訓練,都是自己摸索,在這里淺述一下自己的PID參數整定心得。所言之物皆由實踐及自己的理解得出,如有不當之處還請指正。

首先例舉第一個例子,我調的第一臺四軸飛行器,十字型四軸飛行器,講下配置:
網上一百多的650機架,好贏20A電調,新西達2212 1000kV,1045的槳,2200mah電池。
主控是STM32F103
這是第一個四軸的帖子
www點amobbs點com/thread-5539270-1-1.html

采用位置式PID控制,位置式PID公式如下


PID的基本意義我在次就不作闡述了,我只講我的設計,我以姿態角作為被控制對象,所以
e(k) = 期望-測量 = 給定值-測量姿態角

對于微分項D,我做了一點改變,標準PID的微分項D=kd*(e(k)-e(k-1)),我在實踐過程中因為角度的微分就是角速度,而陀螺儀可以直接測出角速度,
所以我沒有將微分項作為偏差的差而是直接用D=kd*Gyro

實現代碼如下
float pidUpdate(pidsuite* pid, const float measured,float expect,float gyro)
{
  float output;
  static float lastoutput=0;

  pid->desired=expect;                                                         //獲取期望角度

  pid->error = pid->desired - measured;                   //偏差:期望-測量值

  pid->integ += pid->error * IMU_UPDATE_DT;          //偏差積分

  if (pid->integ > pid->iLimit)                                  //作積分限制
  {
    pid->integ = pid->iLimit;
  }
  else if (pid->integ < -pid->iLimit)
  {
    pid->integ = -pid->iLimit;
  }                                 

// pid->deriv = (pid->error - pid->prevError) / IMU_UPDATE_DT;                //微分         應該可用陀螺儀角速度代替
  pid->deriv = -gyro;
  if(fabs(pid->error)>Piddeadband)                                                                        //pid死區
  {
                  pid->outP = pid->kp * pid->error;                                                                 //方便獨立觀察
                  pid->outI = pid->ki * pid->integ;
                  pid->outD = pid->kd * pid->deriv;

                  output = (pid->kp * pid->error) +
                           (pid->ki * pid->integ) +
                           (pid->kd * pid->deriv);
  }
  else
  {
                    output=lastoutput;
  }

  pid->prevError = pid->error;                                                                         //更新前一次偏差
  lastoutput=output;

  return output;
}

我這么做的原因是因為,如果使用傳統的D的形式,在我快速打舵時會產生輸入的設定值變化頻繁且幅度較大,四軸飛行器會迅速回到新的期望點,說白了就是非常靈活,四軸回復很猛,也許造成系統的振蕩,對PID參數要求較高。如果用角速度代替的話,那怕你打舵非常快,四軸會較平穩的回到新位置,運動較柔和。對于我這種操作菜鳥來說無疑后面一種會更合適,所以我選擇了D=kd*Gyro的方式。



PID控制器我大概就是這么實現的,下面講講我在調試過程中具體遇到的問題。首先我將四軸固定在單軸平衡平臺上,讓飛行器完成單軸平衡,主要觀察姿態角的
(1)穩定性,能否平衡在期望角度;
(2)響應性,當操縱命令改變時,四軸能否即時的響應期望的變化;
(3)操縱性,由操縱員感受四軸的姿態是否已與操縱,會不會產生響應過沖。


我先調一個軸的平衡再調另外一個軸,最后調YAW軸。
A:開始只調P,將I,D置0。由于不知道PID的大致范圍我就隨便給了一組值
:P=1,I=0,D=0觀察現象。一開電機四軸就開始劇烈左右搖擺,很明顯P給大了。然后P從小了往上加。從P=0.1開始試。調試的時候我就發現了一個現象就是我的四軸往一邊歪,離平衡的0度差了那么一個角度A,P=0.1時A較大,除非油門推到很大否則四周根本起不來,這是P說明給小了,我再將P=0.2這時四軸狀況無明顯改善。于是我直接將P加大一點P=0.8,P=0.8時已經可以看出在等幅震蕩了,但是不是在0度的平衡位置,也是偏離的一個角度B,此時B較小了。之后我再加大P到1四軸震蕩又變大了,但是到震蕩中心到零度的靜差還是存在。由于此時I=0,所以我決定不管這個靜差,先把P的臨界震蕩點找到。P=0.8時可以觀察到比較明顯的等幅震蕩了,P=0.2時四軸又顯得的無力,所以P應該在0.2~0.8之間。臨界震蕩點就是P從為震蕩到,剛開始震蕩的點。

在這里還應注意一點,當P太小時,四軸在很大傾斜的地方,在重力與P的作用下也會震蕩,這種震蕩不是等幅的,也不是對稱的,震蕩波谷的絕對值明顯要比波峰絕對值大而且距離0度會很遠。這種情況要加以區分。

我把P從0.2到0.8開始嘗試,找到一個適合的點,即剛開是出現震蕩的P值最后我定為0.5。注:此時還是有靜差。
在以上過程中在一開始我一直想通過P來消除靜差,但是我發現我把P加到很大,已經震蕩的很劇烈了,四軸的震蕩中心都不是在0度位置。所以我只能選擇先選好P,D最后加入I來解決這個問題。

P=0.5時四軸在他的穩定位置震蕩比較小了,但是在外力干擾下很難在穩定下來,抗干擾能力較差。然后我開始調D。
在平衡過程中P相當于四軸的回復力,它要努力時四軸在一個穩定的平衡位置,但這個位置不一定是你的期望點。個人認為就是當偏差不在變化時,pid的輸出也沒有變化了,所以有可能光用P時穩定的位置不一定是平衡的期望的位置。而D是阻尼力,他在四軸有速度的情況下才發揮作用,它與速度方向相反始終是抑制運動。所以他可以抑制震蕩,但是他同樣也可以抑制P的作用,當震動產生時,在震動的中心點四軸震動速度最大,也是D作用最強的時刻。

剛開始調D的時我就范了一個錯誤。因為我改了D的標準型,而D應該是抑制運動的,但是陀螺儀輸出的數據符號導致我這里D變成了增加運動,所以一開始無論我怎么調整D,都會激發震蕩。后來我在參數前加了個符號就好了。在這里我提醒要始終注意D是阻尼力,是其抑制震蕩也就是運動的作用的,它始終期望的是它所作用的對象沒有運動,至于停在什么位置不是D所關心的,那是P,I所關心的。所以直接用陀螺儀數據代替偏差的差得話就得注意下。修正這個問題后加了D效果就比較明顯了,四軸在外力的干擾先能明顯的有回復力且,能快速穩定在平衡點了,調D就是試,當然D大了也會產生震蕩,但是此時不加D時光P作用時的震蕩就很小,很明顯就可以看出隨著D的增大,震蕩減小又增大的過程。最后P=0.4,D=0.15。

最后定好了P,D后我的四軸還是有靜差,不能穩定在期望的0點。網上有很多四軸只用PD,在這里我決定根據我的實際情況加入I。調I的時候我先把積分限幅去掉。然后從小往大加,當調平衡時,隨著油門的變大,靜差應該是越來小的。我將油門推到差不多快要將四軸推離地面的位置,看I能不能消除靜差。因為如果油門給小了,靜差較大,調出來的I雖然能消除靜差但是I比較大,在加油門時有可能也會產生超調震蕩。最后I要再能消除靜差又不產生震蕩,個人認為要近可能小。最后加上合適的積分限幅。P:0.4,I:0.35,D:0.15。
別忘了以上調試過程中每次都需要給予平衡一個干擾,看看參數在外界干擾情況下做的如何,會不會產生超調震蕩,會不會長時間才能穩定。以上就是我第一臺四軸的PID調試。

下面我講講我在調第二個X四軸過程中遇到的問題。
第二架四軸是我做了用來參加愛板網的ARM-STM32校園比賽的,因為第一架屬于學校了財產留在學校了,手里沒有,只好再搞一個。
第二架的配置采用的是飛越的650碳纖機架,電調用的是好贏的奔騰40A,電機同樣是新西達2212 1000kV。主控是STM32F407
其實這個機架和電調配這個電機是大才小用了,但是我的預算實在不夠了就只好買了個水一點的電機,等以后再升級。
這次我采用X型四軸,主要是掛了云臺。PID的設計與之前講的一樣,就不多說了直接說調試中遇到的問題。

調試方法還是先調平衡桿,如圖:


剛開始調X的時候我以為跟十字的差不多,于是我只是簡單的把原有PID參數按照新的程序里面的PWM值域縮放了一下倍數,但是發現不行,PID完全沒有起作用。

具體表現為四軸開機后直往一邊倒到底。只好重新開始調。
還是P=1,I=0,D=0開始,這組參數我發現,開機后四軸往一邊倒,但是沒有倒下就起不來了,而是在倒到一個很大的角度,大概70度左右,電機力量像是突然加大,四軸起來,反向,接著倒向另外一邊。進入失控的大幅震蕩。
因為一開始就倒,所以是P太小。于是我開始加大P,但是當我把P加到很大時,四軸還是一開始往一邊倒,然后電機力量增大,四軸翻倒向另外一邊,開始發散性的震蕩。此時我覺得開始P比較小的時候是P不足,電機的慣性的作用下開始震蕩。到后來是P太大了,直接進入震蕩。我始終沒有觀察到一個等幅震蕩或者說接近小幅震蕩的點。無論P大P小我的四軸都會進入失控的發散震蕩。換而言之這個X四軸光靠P根本進入不不了一個比較穩定的狀態或者接近穩定的狀態。連相對穩定的等幅震蕩都觀察不到就直接進入發散的震蕩。此時我開始困惑了。這個情況跟十字的很不一樣。我沒有明顯觀察到網上流傳最通俗的調節PID說法的那種情況,即:逐漸加大P直到開始發生等幅震蕩,然后P不變,加入D抑制震蕩。。。
我觀察到的是P無論怎么給,我的四軸都倒向一邊然后開始進入發散的震蕩,唯一的區別就是P小一開始倒下的角度大,P越大一開始倒下得角度越小,進入震蕩的越快。此種情況與前一個四軸的情況截然不同。

當我潛入困境時,以為名叫螃蟹的網友幫助了我。他告訴我定P要定在把手放開,開始震蕩,只要左右晃二三次就達到大晃動幅度,大晃動幅度大概是45度左右。定下這個P值后然后加入D,而且D有可能比P大。在這個基礎上我又開始了調試。

從頭來調P,這次我觀察到新現象。我把四軸稍微傾向一邊幾度,比如說左邊,當P小時,啟動電機松手后,四軸向左倒,如果P大了,四軸回向右倒。前者是補償不足,后者是補償過度。在這個兩個P值得區間就有我們要找的P,合適的P就是能在平衡位置掙扎左右晃幾下的值。此時我的P=3.0但是光靠P四軸還是站不住,只能在平衡位置堅持個1,2s。所以得加入D,嘗試D=1,2,3時沒什么明顯的效果只能觀察到起初的短時平衡跟穩定了點。D=10時可明顯觀察到平衡的時間跟長了,但還是會倒。當D=20,可明顯觀察到四軸可以基本平衡了,但還是有有小幅震蕩,一但有干擾還是不能很快恢復穩定了,D=30時四軸已經開始比之前大的等幅震蕩了,而且當有外力干擾時四軸也能抵抗住外力維持自身在平衡位置的震蕩狀態,說明D有起作用但是D大了。在這種情況下還說明P還是給小了,回復力不足。我把D定在25,再開始調節P,把P加大。增強恢復力。后面得的調節過程中我就是感覺,P會產生一種震蕩A,這種A震蕩是會發散的,頻率較低。D也會產生一種震蕩B,B是等幅的,頻率較高的。然后P會抑制震蕩B,但會激發A,D會抑制震蕩A,但會激發B。后面的調節參數就是要調好P后再調D,定好D再調節P,兩個參數互相扶持的趨近一個最佳點,想單靠一個參數一次就接近理想值是辦不到的。當然機體表現出的等幅震蕩時也不一定是D大了,P不合適同樣也會產生此種情況。還有調節參數時不要一味只加不減。當我P=4,D=50時我就是將P往回減了點才取得了更好的效果。最后離開平衡桿時P=3.5,D=50。這次沒有靜差,所以沒有I項。


最后來總結幾點:
1.我覺得調節PID首先要明白最基本PID三項的意義P是回復力是系統平衡的主力,D是阻尼力,始終是抑制作用,I雖然能使系統回復但是I大了容易激發震蕩,所以I只能是輔助P
2.一般從P開始調節時候首先要找到臨界震蕩點,要學會辨識系統臨界震蕩點的特點,不同系統臨界狀態可能不同,在這一點上用曲線代替肉眼直接觀察效果好的多。
3.P不一定就比D大,切不可經驗主義,一切遵循實際,多嘗試可能性
4.調節PID最麻煩的就是會產生震蕩,只要參數不合適都會產生震蕩,初學者往往心急不知如何下手,其實是不同參數不合適而產生的震蕩都有所區別,要細心觀察,最好是能看PID輸出,被調量,設定值三者的曲線圖,通過圖來對比特征曲線得出震蕩產生的原因,關于曲線特征判別我推薦下面附件中的篇文獻。
5.調節參數是個令人蛋疼的活,一定要心平氣和,切莫急躁,多多嘗試,我覺得一個平靜的心態是在調PID時很重要,能讓你腦子清醒的看清問題。調參數很枯燥,如果 你很煩或者很著急,調不出來只會讓你更加煩躁,更迷糊。還有就是耐心,多試。參數選擇剛開始不知道大致范圍時參數嘗試變化范圍可以大一點。確定范圍后就要耐心的一點點的加。
6.以上所言都是針對位置式PID,增量式PID三組參數所起作用與位置式大相徑庭,不可套用。
7.多與人交流,在這里再次感謝指導我的諸多網友
8.調節PID最好能看曲線圖,判別特征曲線,又曲線來看特征比直接看物體表現好得多

然后貼上我認為對我幫助比較大的兩個PID資料,一個講PID基本定義,一個講PID參數整

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 玖玖在线免费视频 | 精品九九在线 | 91久久久久久久 | 蜜桃av鲁一鲁一鲁一鲁 | 狠狠ri| 成人久久久久 | 毛片久久久 | 91精品国产91久久久久久吃药 | 国产一区二区三区在线 | 国产91 在线播放 | 天天躁日日躁狠狠的躁天龙影院 | 欧美日韩电影免费观看 | 国产成人免费在线 | 欧美高清hd | 在线观看欧美日韩视频 | 欧美1—12sexvideos | 九九热九九 | 美女三区| 国产精品毛片一区二区三区 | 日韩精品一区二区三区免费观看 | 欧美一区二区在线播放 | 精品久久久久久亚洲精品 | 欧美韩一区二区三区 | 日韩成人在线播放 | 免费网站国产 | 亚洲精品视 | 黑人巨大精品欧美一区二区免费 | 日韩电影一区 | 国产91丝袜在线播放 | 婷婷色在线播放 | 成人性视频免费网站 | 色视频在线观看 | 久久综合香蕉 | 97精品久久| 日韩欧美精品一区 | 久久久久久久久久久福利观看 | 亚洲 欧美 日韩在线 | 亚洲网站观看 | 国产高清免费 | 96国产精品久久久久aⅴ四区 | 欧美阿v|