カエデ自動機械

ちょっとしたものづくりや電子工作のメモなど。技術開発とは今は呼べないかな。

倒立振子ロボットを作る(7)-試運転!!(あとチューニングとか課題とか)

前回、IMUの情報に基づいてモータ制御を行うノードを実装しました。
今回は倒立振子ロボットのPID制御用のゲインを調整し、いよいよ試運転をしていきます。

試運転!!

順番が前後しますが、動いている所をボンヤリ眺めるのが(僕にとっての)ロボット趣味の最大の醍醐味なので、いきなり試運転の状況を載せてしまいます。
Lambda PlusとPCを接続し、今まで実装してきた各ノードを立ち上げれば、倒立振子ロボットが動きます。
(実際はLaunchファイルを準備して、同時に自律走行機能を実装する予定の空ノード等も立ち上げます)

倒立振子ロボットver 1
多少ブルブルしますが、先に説明したGUIでチューニングすれば、上の動画のように安定して立つようになりました!!


PID制御のゲインチューニング

さて、上のように倒立振子を立たせるためには、大抵の場合制御パラメータのチューニングが必要で、今回はロボットの角度、角速度を基に角度をPID制御していますので、PID制御ゲインのチューニングをすることになります。。

前回は触れませんでしたが、モータ制御用のノードには、PID制御用のゲインのトピックをサブスクライブし、制御パラメータとして反映する機能を持っていました。

というのも、倒立振子のPID制御に限らず、制御パラメータの微調整というものは非常に面倒なものです。いちいちロボットの電源を切り、エディタでパラメータを更新し、再コンパイルしなければなりません。
そこで今回はこの機能により、PID制御ゲインをメッセージ化しトピックとしてパブリッシュすれば、逐一ロボットを再起動することなく制御パラメータの更新が可能としました。

更に、いちいちメッセージを打ち込むのも面倒なので、GUI上でグリグリ動かしてゲイン調整ができるようにしたい。
GUIのプログラミングは全くやったことがなく苦しんだのですが、ネット上の記事の見様見真似で、なんとか動くものを作ることができました。
本来は参考にしたサイト様のリンク等を貼るべき所なのかもしれませんが、色々なサイトからつまみ食い的に情報を引っ張ってきた上、コードを書いたのが1ヶ月近く前のため忘れてしまいました。

ROSノードとしてpythonスクリプトを実行すると、GUIが立ち上がり、スライダで調整した結果が逐次新しい制御パラメータとしてパブリッシュされます。

f:id:ktd-prototype:20190812021749p:plain
PIDゲインの調整画面
スライダは全部で9段ありますが、使うのは姿勢制御用の上3段のみです。下6段は、速度制御用(並進速度、回転速度それぞれのP、I、D)として一応準備したもので、まだ使ってはおりません。

コードは以下に格納しています。
今回は今まで以上に雑で、自分でもどの行が何を意味しているのかわかっていないレベルのため、直接この記事にコードを貼るのは止そうと思います。
今までは、ダメなりに1行1行、何をしているか説明できているつもりでしたが・・・
自分でいじれるのは、各スライダが取れる値の範囲くらいです。
github.com


課題

これでめでたしめでたし、次は遠隔操縦や自律走行に・・・と行きたいところなのですが、実はここまで来るのにも紆余曲折がありまして。
実は当初、倒立振子は高重心の方が安定するだろうと思っていて、バッテリをロボットの頂上に搭載していたんですね。で、いくらチューニングしても安定して立つようにならなかった。
当時の動画がこちら。

倒立振子ロボットver 1(高重心版)

上で試運転と称してアップロードした、安定して立つ倒立振子は、この失敗を受け、ダメ元で低重心化した結果だったというわけです。

高重心でダメで、低重心ならOK、なら、低重心のまま重量を積みました場合は・・・?と思って実験したのがこちら。

倒立振子ロボットver 1(積載量増加版)
こちらもやはりだめで、あまり安定しませんでした。

高重心にせよ、低重心にせよ、今後この倒立振子ロボットを当初目的であるホームロボットに拡張させていくには、センサ等を積み増し、それに伴いロボットの慣性モーメントは著しく増えます。こちとらロボットアームすら載せたいと思ってるんですよ。
次回はこの辺の要因分析と対策検討をしようと思います。



(おまけ)各ノードの動作状況

rqt_graphコマンドで、ノードの立ち上がり状況の確認ができます。

$ rqt_graph

f:id:ktd-prototype:20190812145556p:plain
ROSノードの立ち上がり状況
軽く各ノードの説明をしていくと、

  • /get_sensor : Lambda Plusと通信してIMU情報を取得し、パブリッシュするノード(リンク
  • /motor_control : 種々の情報(主にIMU)を受け取り、PID計算をして、モータへのトルク指令値をパブリッシュするノード(リンク
  • /motor_command : 実際にモータに駆動指令を送るノード(近藤科学サーボのROSドライバノード
  • /set_param : 上で述べたPID制御をGUIから行うためのノード
  • /wheel_odometry : 説明は割愛しているが、モータから情報を受け取ってホイールオドメトリを計算するノード
  • /motion_generator : 遠隔操縦ノードや自律走行ノードから移動指令を受け取り、速度指令値を生成して/motor_controlノードに送るノード。今は空。
  • /joy_node : ROSにもともと入っているジョイスティック(ゲームパッド)取得ノード。遠隔操縦用。
  • /whipbot_main : 自律走行用のノード。今は空。