前回は自律ローバーを(自律じゃないけど)動かせるよう、ソフトウェアの構造をざっくりと説明しました。
実際は汚いながらもなんとかROSの枠組みを使えるようにPythonでコーディングして、一通りモーターが回ったりするところまで確認しました。
今回は試運転です。
既に作ったことがある人にとっては自明のことだったのかもしれませんが、僕はほとんど初めてだったので、実際に走り回らせて初めてわかったこともありました。
母艦PCに繋いだ状態でのテスト・ゲイン調整
まずは車体は動かさず、駆動輪を宙に浮かせた亀の子状態にした上で、基本的なテストと速度制御ゲインの調整を行いました。
速度制御ゲイン調整して、ついでに動作モードがLEDでわかるようになった。待機が青、低速遠隔が緑、高速遠隔が黄、通信ロスト等の異常状態が赤、(写ってないけど)自律モードが白。片方が点滅しているのは低電圧アラート(JetsonNano用のバッテリを積んでいないため)。 pic.twitter.com/v44Drd6Smx
— りんごろう@自律ローバー作り (@KtdPrototype) April 25, 2020
速度制御は制御量が車体速度(ホイールオドメトリから取得)、操作量がモータドライバに入力するPWM(最終出力段では255段階)のPID制御を行っています。
低速モードは最高1km/h、高速モードは最高4km/hと設定し、同じPIDゲインをセットしました。
低速モードでゲインを上げてしまうと簡単に制御量が発振してしまい、Dゲインを調整してもどうにもうまくいかず、結果的に全体的にかなりゲインを抑え目にしました。
明らかに後で悪いことが起きそうですが、代わりにIゲインを大きめに設定することで、一応目標速度に追従するようになりました。
後で、というかこの時点でも悪いことは起きていて、急に速度を変えた時にIゲインによる成分が残っており、上手く追従しませんでした。
実際の速度がわかっていさえすれば、目標速度に追従しなかったからといって特に悪いことは起きないので、Iゲインの値や、Iゲインを乗じる前の累積誤差の処理(リセットのタイミングなど)は要検討かな、と言った所です。
母艦PCから切り離しての屋内遠隔操縦試験
バッテリの搭載・固縛
今までは開発用の母艦PC(デスクトップ)が速度制御を行い、直接車載ArduinoにPWM指令を送ってモータを回していました。
次は母艦PCから車体を切り離し、車体に搭載したJetsonNanoを制御用PCとして走行試験を行いました。
それにあたり、今までは床置きや車体の上に固縛せず置いていた車体駆動用のバッテリを固定する必要があり、また、JetsonNano用のバッテリも用意する必要があります。
バッテリはJetsonNano用に1つ、車体(モータ)駆動用に1つと計2つのラジコン用リポバッテリ(4セル - 14.8V)を車体の底面に搭載するようにしました。
2個搭載、それもPC用と車体用に分割したのは、可動時間延伸の意味もありますが、基本的には気分です。特に工学や論理とは関係ありません。
放電容量には余裕がありますし、DCDCコンバータを噛ませているので何となく問題ない気もしますが、デリケートそうなJetsonNanoに、ガサツ(?)なモータ駆動の影響が乗りそうで気持ち悪かったため、2個分割して搭載としました。
下の写真のように、3Dプリンタでバッテリマウントを製作しています。留具はスナップ式で、そこを外すと輸送用航空機のランプドアのようにバッテリ搭載部が現れ、ベルクロでバッテリを固定できます。
屋内稼働テスト
バッテリを繋いだら、実際に動かしてみます。事前に亀の子にした状態で色々試したこともあり、特に異常動作もせず動かすことが出来ました。
initial operation capability! pic.twitter.com/RTkCJsNIPg
— りんごろう@自律ローバー作り (@KtdPrototype) April 29, 2020
繰り返しになりますが、車体後部に搭載したLEDは、待機モードで青、低速遠隔操縦モードで緑、高速遠隔操縦モードで黄色に光ります。
LEDが2個搭載されているのは、2個搭載したバッテリそれぞれの電圧監視用です。バッテリ電圧が下がってくると、その電圧に応じたパターン(というか周期)でLEDが点滅します。
屋内走行気づき(1) - ゲイン調整は実走行条件でやった方が良い
亀の子を解除して実走行をさせると、走行抵抗が良い感じに出力速度の振動を抑えてくれるようで、速度制御ゲインを増しても安定して動くことがわかりました。
このタイミングで再度ゲイン調整を行い、Pゲインを増やし、代わりにIゲインを減らしておきました。Dゲインも、Pゲインの増分に応じて少し増やしておきます。
この辺をなんとなくで済ませるのが良いことなのかは疑問ですが、当面はこのままとしておきます。
屋内走行気づき(2) - 思ったより段差乗り越えは大変
以前の記事で、段差を乗り越えるためのモータトルク等を計算し、大体5cmくらいの段差ならば余裕で乗り越えられるだろう、という見積もりでした。
- 基本計算:
倒立振子ロボットを作る(3)-車体設計(車輪とモータ) - 技術開発日記
- この車体の見積もり:
が、実際に走らせてみると全くダメでした。
気づいてみればなんてことはなく、むしろ設計時点で気付かなかったのがお恥ずかしいんですが、前輪駆動のローバーのため、前輪が段差に差し掛かって床面から離れた途端、車体を前進させる力(=車輪を段鼻に押し付ける力)を失うんですね。
こうなると結局、車輪が段差を掴めず、モータが発揮している「地面を掻いて車体を持ち上げるのに十分なトルク」は全て行き場を失い、折角床から浮いた車体がまた床面に落ちてしまうということのようです。
勢いよく段差に進入すればドサクサで乗り上げてしまえるのですが、ゆっくり進むとなると、精々1〜2cmの段差を乗り越えるのが精一杯のようでした。
後輪駆動または全輪駆動にしてしまえば解決する問題ですが、今の所致命的というわけでもないので、当面このまま進めようと思います。
野外での試験
ここまでできていれば、野外に持ち出しても基本的には全く同じです。
今回は近所の森で試験を行いました。
動作の様子は、Maker Faire Kyoto 2020にオンライン出展した際の動画で見られます。
動画本体:
Demonstration movie for open ABC rover
が、実際にはここでも苦難の連続というか、もっと早く気づきたかったなあ・・・と思うことがたくさんありました。
野外走行気づき(1) - 車輪のグリップ力が足りない
駆動輪は幅2cmくらいのポリウレタン製、従動輪は硬質ゴム製の自在キャスター輪ですが、土と砂利が混じった地面だと、中々地面をしっかり掴まないんですね。
進まないということはないですが、結構車輪が空転するシーンも多かったです。
駆動輪だけでも、エア充填タイプのもう少し柔らかい車輪とかにした方が良いかも知れません。
それから例によって段差の乗り越えが大変で、大きな木の根等は(モータトルクは十分あるのに)乗り越えられませんでした。
野外走行気づき(2) - 各部の固定は確実に
車体の振動が大きく、色んな場所が走行中に外れて大変でした。
具体的には
- Jetson Nanoの電源プラグ(5.5-2.1mmのDCジャック)
- 上で説明した、バッテリ搭載部のスナップフィット部
あたりが外れました。
前者は結構しっかりささっていたし、ケーブルが暴れるわけでもないので問題ないだろうと思っていたのですが・・・
外れると当然ながら即時にJetson Nanoが落ちて、その場合の安全措置(Arduino側で、通信が一定期間行われなかったらモータ駆動をOFFにするなど)が無かったため、車体が止まらなくなり大変でした。
幸い、最後の実験を終えた後だったので、そのまま主電源を切って退散しました。
野外走行気づき(3) - 積分制御には要注意
これは本当にIゲインが原因なのか、通信断など別の要因かはわかりませんが、、、仮にそうだとして。
屋外、しかも土と砂利の路面でしたので、走行抵抗が大きく、速度指令値通りに速度が出ない期間が想定より長くなっていたと思います。
この場合、速度制御としてPIDを実施しているうちのIの成分、積分制御の成分ですが、蓄積誤差が大きくなりすぎていた可能性があります。
手元のゲームパッドから操縦指令を送るのをやめてもかなり長い間ローバーが進んだりと、結構ヒヤヒヤする場面が多かったです。
ゲームパッドから手を離したら蓄積誤差もリセットするとか、そういった工夫が必要だと思いました。
野外走行気づき(4) - 屋外での実験は大変
これは本当に大変というだけです。
3kg近い車体も結構重いし、車輪が大きいのもあって、ロボット以外の野外活動でも愛用している大型のトートバックにすらギリギリでしか入らない。
それとは別に、ノートパソコン、リポバッテリを入れたアルミケース(防炎バッグに入れたバッテリを更にこれに入れている)、ゲームパッド、カメラ、三脚を持っていく必要があります。
別に暑い時期でもなんでもなかったのですが、近所の森に行くだけで汗だくでした。
そしていざ着いてみれば、気付き(1)〜(3)のトラブルに見舞われたり、こんなときに限ってゲームパッドの電池が切れ、急いで自宅に戻ったり、たまに通る通行人の視線がちょっと恥ずかしかったり・・・
実験は楽じゃないなと思った次第です。
まとめ
なにはともあれ、遠隔操縦限定とはいえ、それなりに安定して動くローバーを作ることができました。
ここまでの成果は、繰り返しになりますが、Maker Faire Kyoto 2020に出展しています。
既にこの時点で相当疲弊していますがようやくここから本題、自律走行の実現に向けて頑張っていこうと思います。