新埔國中的薛尤榮是一位對 NXT 研究非常熱衷的老師,也是蒲公英的願望部落格的版主,他已經研究 Segway 一陣子,但一直找不到良好控制的方法,因此私下電郵討論相關議題,我沒製作過 Segway,不過就個人所知儘可能答覆,以後會找時間研究研究這個議題。
下面是我節錄及整理討論的重點內容:
他曾提到─
參考 http://www.youtube.com/watch?v=4ulBRQKCwd4&feature=player_embedded 發現別人設計的Segway在啟動時,其實很smooth,而偏擺的校正過程,也不會有很劇烈的擺動。
曾看過某一個原始碼:http://www.techbricks.nl/My-NXT-projects/nxt-self-balancing-segway-nxtway-robot.html ,他的原始碼中,用 MotorTacho 以及 Gyro value 當作變數,看他們做的作品也是很smooth,我也試過套用他們的程式用在我自己的 Segway上(機構一樣),不過發現其實是不行的。
目前我用 Fuzzy Control,可以直立但不久,而且因 gyro value左右偏擺,而使車身在校正的過程有劇烈的擺動,而且其實車身還是容易在不穩定的過程中有爆衝的現象。
在離散時間的情況下,從感測器得到角速度,想做角度偏擺實驗,通常會採用對時間積分的概念,所以algorithm會對第k-1時刻及第k時刻的角速度累加後,乘上取樣時間(Δt)。換句話說,即 Σ(wi)‧Δti
不過也因如此而有累積誤差。想請問對於累積誤差,像網路上有提到用 Kalman filter 的概念去做,不過 Kalman 的公式內的參數,其實不容易覓得,所以應用時其實也不容易使用,所以我想問問您有無比較簡易的作法?
目前仍持續在研究 Segway,用了不少方法於 Segway上,基於 PID 或 Fuzzy 都有嘗試過。
主要卡在積分計算會有累積誤差的情形,所以 Segway 很容易就會前傾而導致傾倒的現象。
感測器定位於 balance 的地位時,當開始進行控制的過程,每當回到原點之際,其角度偏擺值並不是0,而是有正負2~3度的誤差讀值,所以持續幾秒後,幾乎已經前傾。
所以我看到有很多論文討論利用 Kalman filter 來做動態系統觀測值的推測。
我對這個議題的看法─
如果 PID 與 FUZZY 控制二選一,我會選擇 PID,因為 FUZZY 大多使用於系統數學模型不明或是難以建立時,主要是它的控制沒有 PID 的平滑順暢。
數值積分主要目的在計算曲線與 X 軸之間面積,如果使用矩形方法來近似計算誤差較大,
你就當成一個曲線面積紙板用小刀裁成等寬長條紙片,梯形積分方法誤差較小。所有的數值方法結果,只能近似無法 100% 準確。
薛老師的 Segway 控制,只能平衡幾秒鐘就傾倒,最後分析問題的癥結在數值積分所累積的誤差,俗稱蝴蝶效應。確實以積分計算,經過長時間累計誤差確實會越來越大,這是無法避免的,只能靠其它方法修正。
對於 Segway 左右兩輪物體,想要平衡不倒,在不向前行進時,應該是一輪微幅前進,另一輪微幅後退,然後再反向修正。前進時有向前傾的狀況,應瞬間加速讓它後傾修正,反之亦然。
關於 Kalman Filter 正好研究所論文有研究過,我利用它來控制船舶操作控制,大型油輪或商船在開闊海域航行,利用左右滿舵與Zig-Zag操控 所得的航行軌跡資料,來推估該船舶的一些重要運動參數,有專業論文描述它的一般性運動方程式 (二階微分方程式),因為 F = ma,所以我可以推估 Segway 運動方程式,也會是二階微分方程式。
當時採用 Extended KF 除了估測位移、速度、加速度之外,同時估測其它不明參數,濾除測量誤差、海浪、風力、潮流等因素干擾,這一切方法的前提,必須列出相關數學模式。
從這些數學式可以直接求解微分方程式的部分就直接求解,以降低數值積分的累計誤差,不能解的部分就只能數值積分,所有的數值方法永遠有誤差,只是多寡程度。
關於有沒有其他方法建立數學模型,我有想到一個 ─ 先建靜態模型:
你可以把 Segway 用線吊起來,也就是「吊鋼絲」成某種姿勢,紀錄各種角度時,感測器資料值,這樣就可以建起靜態數學式,然後分析各種角度,應該怎樣控制馬達平衡到你期望的姿勢,最後再修正成動態數學式。
其它精采的討論,請參考下面連結:
Fuzzy control for NXT motor
Apply PID to control speed and angle
Study Segway by NXT - Math model
圓冪定理
-
圓冪定理包括相交弦定理,割線定理,切割線定理。 相交弦定理 切割線定理 資料來源:
https://zh.wikipedia.org/zh-tw/%E5%9C%86%E5%B9%82%E5%AE%9A%E7%90%86
1 天前
Bridan大師:相信有很多人在做segway時,都會遇到跟我一樣的情形。謝謝你的指導!
回覆刪除薛老師您好,
回覆刪除稱大師不敢當,很多地方我也只懂一些皮毛,反而從您的問題,給了很多關鍵知識,我只是從研發人員的角度看待這個問題,給予意見方向,其實很多事情,親自動手動腦過才學的深刻,學的專精。
基本上,我不會從頭到尾主動教學,從人性觀點來看,主動求知者學習最快,因為有強烈學習動機,有問我就答,如果我太熱心教導大家,把所有步驟詳儘解剖,反而會讓學習者喪失思考的空間,這在某些教學上真的不易拿捏。
近期內,我會研究看看這個難度頗高的議題,因為成立部落格主要在啟智一些學子,所以儘可能給予意見方向,至於細節,很多還是要自己琢磨,敬請包涵。
一些做segway的作者,提供的原始碼,其實都不包含累積誤差修正(例如:外加kalman filter),他們的segway都可以定位地很好,但我的segway目前還是會有累積誤差,而造成車身傾斜。不知道是不是原作者有留一手? :p
回覆刪除薛老師您好,
回覆刪除您的猜疑是可能的,在維基百科有提到真正商用 Segway 使用五顆 Gyro sensor,從學理分析也應該要有三顆,因為 NXT Segway 不會遇到傾斜的地面,可以簡化到一顆。
關於累積誤差,你可以考慮定期清除,比如說你的 Segway 歸位到正直的姿勢時,就將誤差歸零。
最近開始依照人體使用手冊提早睡眠進行作息調整,因此這個議題,我只開始數學模式分析文件整理中,應該這個月底前會發佈,敬請期待。
Dear Bridan:
回覆刪除綜觀目前有做segway研究的專題,在機身維持平衡的控制器,都會計算車輪的移動角度以及移動角速度(RotationCount),想說為何要考慮車輪移動的角度及轉動角速度?一般說來,只要陀螺儀測到機身有前傾或後仰,得到傾斜角度,不就可以利用所得數據,給予控制?
薛老師您好,
回覆刪除如果 Segway 只是原地平衡直立,我認為偵測車輪角度及加裝一顆光感應器應該足夠,因為從光感應器可以判別傾倒方向,然後控制車輪轉動角度,應該可以直立平衡,當原地直立平衡可以達成,再嘗試前進控制。
以上是我看了您的留言的想法,看來有空要試看看,況且不用再額外添購感應器。個人認為利用車輪角度控制最大的好處,應該是取值快速避免時間延遲誤差。
感謝Bridan回應。後來我也再次思考這個問題:測量輪子的轉角與轉角速度,並提供控制量,似乎有一種加速促成的作用。1.假設一開始輪子的rotationcount()值為0,當segway前傾一個角度θ,控制器驅動車子往前移動,此刻車輪的rotationcount()有讀值且有轉角變化,所以控制器的控制量加成,驅使車子前進速度加快。
回覆刪除2.當車子移動使機身由前傾回到筆直的0度,對機身角度所提供的控制量會減少逼近至0,但因車子仍屬於移動狀態,所以rotationcount()仍有提供相對的控制量,所以極有機會使機身從筆直的狀態往後仰;
3.當機身後仰,控制器提供反向的控制量,促使機身往後退。
但據觀察,當機身由筆直狀態至後仰
,因在此狀態交替的瞬間,車輪仍有可能處於前進而非後退,所以提供的控制量有可能有抵消的作用,使控制量減少,也許還是正值,可能仍會促使車子往前走,而這樣的結果反倒加速車子後仰。
所以實際的結果,會變成segway搖擺現象。不過很佩服目前採用上述作法的作品,竟然感受不到機身搖擺。真是厲害,看樣子try error不少時間,才能測驗出一個比較好的參數。
薛老師您好,
回覆刪除您所提的問題關鍵在第二項細節中,
2.當車子移動使機身由前傾回到筆直的0度,對機身 角度所提供的控制量會減少逼近至0,但因車子仍屬 於移動狀態,所以rotationcount()仍有提供相對的控 制量,所以極有機會使機身從筆直的狀態往後仰;
當機身扶正後,轉角應該不會是零,如果取這資料來平衡控制,將會發生你所說後仰情形,想避免這樣狀況,我會重置狀態,也就是每次機身扶正時,把轉角歸零重新平衡。
dear bridan:
回覆刪除假設x1=機身角度與期望的誤差
x2=(x1(k)-x1(k-1))/dt
若P=kp*x1
I=I+ki*x1
D=kd*x2
U=P+I+D
取樣時間設定8ms
發現機身微傾一角度,雖平台會往相同方向移動,然而其移動速度卻不及機身傾倒速度,即便馬達已全速運轉。
不知您有何指教?
薛老師您好
回覆刪除先討論你的 PID 公式,發現你所運用的是第三種形式。請比較 http://4rdp.blogspot.com/2008/12/apply-pid-to-control-lego-nxts-speed.html,雖然沒特別研究,直覺你的公式用於 Segway 上,應該沒問題。
以你的公式延伸分析,假設 Segway 偏差一角度 b 靜置許久,則開始時
x1 = b
x2 = 0
P = Kp * b
I = I + Ki * b = Ki * b, 初值 I = 0
D = Kd * 0 = 0
U = P + I = (Kp + Ki) * b
假設這力道正好可以讓 Segway 在下一 8ms 時間停在平衡點,
x1 = 0
x2 = (0 - b) / 8ms
P = 0
I = I + Ki * 0 = Ki * b
D = Kd * (0 - b) / 8ms = -kd * b / 8ms
U = I + D = (Ki - Kd/8ms) * b = 0
由此可知,PID 的 K 係數安排會決定馬達動作狀態。
這些係數可以設計成
U = (Kp + Ki) * b
Ki = Kd / 8ms
假設電力 U = 100 時,b = 800 degree/sec = 800 degree / (125*8ms) = 6.4 degree / 8ms
Kp + Ki = 1 / 6.4
假設 Ki = 0.1 則 Kp = 0.05625,Ki = 0.1
你可以參考這樣計算,調出適合的係數
Dear Bridan:
回覆刪除請問最後U=(Kp+Ki)b
U=100全速運轉,若取樣時間8ms,換句話說每8ms轉6.4degree
b=6.4degree/8ms
U此刻為100,所以Kp+Ki=100/6.4=15.625
不過您是寫Kp+Ki=1/6.4
是否筆誤或為正確?
薛老師,
回覆刪除謝謝您的指正,是我計算錯誤,正確計算應該如下:
這些係數可以設計成
U = (Kp + Ki) * b
Ki = Kd / 8ms
假設電力 U = 100 時,b = 800 degree/sec = 800 degree / (125*8ms) = 6.4 degree / 8ms
Kp + Ki = U / b = 100 / 6.4 = 15.625
假設 Ki = 10 則 Kp = 5.625,Kd = 10
今天讀一篇文章,原來segway的兩輪平衡車並非最早的發明。早在中國西元前就有獨輪車:
回覆刪除清朝野史大觀卷11:
黃履莊所製雙輪小車一輛,長三尺餘,可坐一人,不須推挽,能自行,行時,以手挽軸旁曲拐,則複行如初,隨住隨挽日足行八十里。
這可能是史上有史記載最早的自行車。
薛老師您好,
回覆刪除先人的智慧處處可見,謝謝您為本文追加野史趣聞。暑假期間想找個時間拜訪您,請教可動結構滑動模式,細節我們在電郵中再詳談吧 !
期待與您相會 ^_^
最近看到一篇nxt控制平衡自行车paper(http://audiophile.tam.cornell.edu/~als93/Publications/06PA0459BicyclePaperv45.pdf)
回覆刪除看樣子比segway更有挑戰性
薛老師您好,
回覆刪除謝謝你提供專業論文參考,看來要好好研究,去年個人有一篇貼文探討腳踏車的力學模型 http://4rdp.blogspot.com/2010/07/force-model-of-bike.html,應該可以找到一些線索解答我的困惑。
不好意思找很久找不到答案
回覆刪除在這提問一下,請問
segway之類兩輪可用前進和後退來平衡不會前仰及後傾,那如果只有一輪(單輪機車)左右兩邊的平衡是怎麼做到的ㄋ?
Ed 您好,
回覆刪除你提問單輪車如何平衡?個人看法如下:
車子只要一直保持前行,它就可以維持平衡,就像我們騎單車或機車一樣,這是藉由向心力平衡。
但是車子低速行駛時,向心力不夠,這時將會左右傾倒,那需要一個轉向系統來修正,如機車的龍頭。
那單輪車則藉由騎士身體擺動平衡,如果你想做一個單輪車機器人,則需要兩個馬達,一個前進,另一個平衡。
抱歉還是想不通
回覆刪除你的意思是一個馬達控制左右轉嗎(控制平衡)?
但是只有一個輪子應該無法用轉速差控制左右轉
還是一個馬達要像飛機螺旋槳一樣裝法,那轉速不就要調很高,高速之下有辦法馬上改變方向在反轉嗎?
Ed 您好,
回覆刪除單輪車平衡需要機構移動重心位置,才能達成平衡目的,致於如何達成?它超乎我的專業,只能給你符合常識的建議。
觀察單輪車騎士,在原地站立時,他們除了會車輪前進後退,並靠身體擺動轉向及平衡,因此才會建議再加第二個馬達來控制,如果你有辦法設計免馬達的調整機構也可以。
利用高速運轉馬達來產生慣性也是好方法,如陀螺儀原理,可參考我以前的舊文。