玉乗りロボット BallIPMini 技術情報

[| ]  最終更新: 2018/07/10 11:17:20

はじめに

情報公開の意図

玉乗りロボット
玉乗りロボットBallIP Mini
このページは当研究室で開発した、小型玉乗りロボット BallIPMiniの技術情報を公開するページです。
ロボットの開発データを、ほぼ複製可能なレベルで公開することで、類似ロボット分野の発展、および技術データの部分的な切り取りによる活用を意図しています。
利用そのものについては、現時点で特に制約は考えていません。たとえば、これらのデータに基づいて営利活動をしてもかまいません。 ただし、当方ではその内容や確実性は保証しません。あくまで、利用の結果については、ご利用側でご対応ください。

なお、当ページは仮設段階にあります。いずれ、より整備した形でまとめ直すことを予定しています。

利用上の注意

以下に利用に当たっての注意事項、制約、お願い等を記載します。


本ページのデータを参照するための推奨ソフトウエア

本ページで公開する技術情報の設計等に用いたソフトウエアを列挙します。 参照、改造、ビルドする場合などには必要になる可能性が高いと思われます。


関連文献



技術データダウンロード

メカ・ハードウエア

両者は車輪まわり(とモータの固定方向)のみ異なり、大半の構造、制御回路、ソフトについては共通です。 厳密にはゲインが異なるはずですが、ロバストさの範囲で動作します。
(ただし、なめらかオムニのほうが動作時の音が大きい:おそらく外周ローラのガタのため)

前者については、理化学研究所&淺間先生らによる特許の方式の車輪を独自設計したものを使用しています。
この製造には、ProtoLabs社の射出成形を用いています(いくつも成形警告は出ますが、無視しうる範囲)。
※DMM.makeの3D出力サービスを試作段階で使ったことがあり、それでもできました。車輪全部作ると結局高く付きますが。
【重要】この車輪の設計データも公開しますが、この車輪を実際に製造し、業として使う場合は特許の許諾が必要になりますので、その場合は理化学研究所の知財部に必ずご確認ください(当方は研究目的の使用の範囲でご許可頂いております。たとえば、「なめらかオムニ」でもページに許諾記述あり)。


本体設計データのファイル名等参考: 各部品の構成は、基本要素(例:○○Plate、CircuitBasePole等)の部品ファイル、これを組み立てたアセンブリファイル(Plateが付かない)、これを簡略化して各部品の一体化をしたもの(○○_C.ipt)と、そこから生成したSTLファイルによります。
STLファイルは、XYZプリンティングのdaVinci 1.0シリーズ(当方では1.0無印, 1.0AiO, 1.0Aで確認)にて出力することを前提にしたクリアランス調整(概ね+0.2大きくなることを見越した穴径調整等)をしてあり、他のプリンタに使用する場合は再調整が必要と思います(ファイルによってはパラメータ化してある)。
全体組み立て図のモデル 各層のdaVinci成形品 球駆動部正面 球駆動部側面

制御回路

※詳細の部品リストは後日用意
主制御基板ガーバ 主制御基板 LEDスイッチ基板

制御ソフトウエア

制御ソフトウエアはGithub上に掲載しました。 kumarobo/BallIPMini


なお、本ロボットのパラメータ設定などには、PCとロボットをシリアル接続(USB-シリアル変換、3.3Vレベル)して行いますが、通信には独自のバイナリ通信のプロトコルSerialLoopを使っています(参考:周辺機器との接続のための通信日本ロボット学会誌Vol.26 No.2)。
通信用のPC側のツールとして、
sermon (2010/06/25, 276,480 bytes)(※実行exe本体)
と呼ぶソフトを使っていますが、かなり前に作って保守性の失われた
sermonソース (2016/06/04, 220,814 bytes)(ZIP)
によっているものと、各種研究用ソフトにいれて使うような、これまた開発技術は失われたもののいまも動作するライブラリしかありません。
sermon.exeの簡単な使い方:

その他資料



倒立振子のパラメータ調整

ここでは、玉乗りロボットを含む、「下端が車輪的なもので移動するタイプの倒立振子」のパラメータの実験的な調整方法を解説します。(車輪型、台車型、直動駆動型等)
倒立振子には反動車を回すタイプ(ムラタセイサク君のお腹のホイル状のもの、プール際で落ちる前に腕を振り回す動作も同)がありますが、これはこの方法では調整できません。

倒立振子の一般的制御式は
  操作量(加速度、力)=姿勢角ゲイン×傾斜角度+姿勢角速度ゲイン×傾斜角速度
             +位置ゲイン×移動量+速度ゲイン×移動速度
で、この4個のゲインを調整することで「望ましい」ように動作を調整します。そもそも、制御を成立させます。
この決定には、伝達関数からラウス・フルビッツの安定判別で範囲を絞る方法、現代制御理論による決定法などがありますが、以下に、これまで10種以上の倒立振子をさくっと調整してきた、経験的な実験的にゲインを決定する方法を紹介します。

なお、BallIPMiniでは、これが32bitレジスタ4,5,6,7にそれぞれ割り当てられているため、sermonで繋いだ場合は、それぞれ、
  set32 4 4 姿勢角ゲイン; set32 4 5 角速度ゲイン; set32 4 6 位置ゲイン; set32 4 7 速度ゲイン
と入力することになります。

パラメータ調整法:

  1. 全ゲインを0にします。
    制御を開始しても、当然、倒立振子は動作せず、倒れます。

  2. 姿勢角ゲインを徐々に上げていきます。
    鉛直に立てた状態で、手で支えながら制御を開始します。鉛直ならなにも起きないはずです。
    そこから少し傾けます。ゲインがある程度有効な大きさになっていれば、傾けた方向に車輪(球)を回し、鉛直に戻そうとする動きが生じます(加速度or力)。
    もし逆に移動して、より倒れそうになるなら、式のどこかがマイナスになってます(センサやアクチュエータ、回路の結線など)。とりあえず、ゲインをマイナス値に設定すればいいでしょう。
    以下のゲインも同様ですが、「数値を入れても反応がない」ときは、「10%増やす」というぬるい上げ方ではなく、「2,3倍にする」という上げ方で、最初は問題無いと思います。(そもそも数値のオーダが足りなすぎるので)

  3. さらに姿勢角ゲインを大きくすると、傾けたときに動き始めて、鉛直を通り過ぎて反対向きに傾くようになり、それを戻すためにまた逆に動き、という発振が生じます。場合によっては振幅が大きくなりどうしようもなくなります。

  4. 次に姿勢角速度ゲインを上げていきます。
    ※上記で、姿勢角ゲインをマイナスにしているときは、多分、角速度ゲインもマイナスです
    ある程度大きくしていくと、上記の「通り過ぎ」が低減し、振動が落ち着き、発振も見られなくなってきます。
    この状態では、振子の上部を指1本で軽く支え、指を動かすと振子が付いてくるような状態(お散歩モードと言ってますが)になります。
    この様子を確認しながら、姿勢角ゲイン、姿勢角速度ゲインを共に上げていきます。変な振動(ゆさゆさではなく、ガタガタ系)が生じる手前まで上げましょう。十分に上げ、問題無ければ、指で上部を左右に揺すったとき、それにさくさく追従し、なるべく鉛直を保つようになっているはずです。
    短時間であれば、もう、指を離しても立つはずです(通信ケーブルなどがつながっていると、その拘束で一点で立つと思います)。
    安定性のマージンのため、ゲインは限界よりは少し低めに戻しておきます。

  5. この状態は、位置のフィードバックがかかっていないため、いずれは原点からずれて移動して(走って行って)しまいます。この対策に、以下では位置系のゲインを追加していきます。

  6. 位置ゲインを上げていきます。
    すると、指を離して振子が原点から離れていったときに、ある程度いくと、逆に戻ってくるようになります。
    位置ゲインを高くするほど、すぐに戻ってくるようにはなりますが、これも原点を通り過ぎます。通り過ぎたところで、また戻ってこようとするので振動的になりますが、おそらく、通り過ぎたあとのほうが動きが大きくなって、発散します。
    なお、この位置ゲインの極性は「原点から遠ざかると、さらに遠ざかるほうに力・加速度を出す」という、ポジティブフィードバック側なので、注意してください。手で支えたまま、原点から遠ざける方向に動かすと、振子が原点側に傾くような平衡状態になる、のが極性があっている状態です(傾いて原点側に戻ろうとする)。

  7. 速度ゲインを上げていきます。
    ※位置ゲインとおそらく同極性
    先ほどと同様、速度ゲインを上げることで、位置の行き過ぎが低減し、ある程度以上速度ゲインを大きくすると振動が収まるようになります。
    ただし、振動は完全にはなくなりません。倒立振子は一般にある程度の振幅の振動がのこります。
    ここまでくると、手を離しても継続して立てるようになります。また、上げられるだけ上げて、なるべく綺麗に、しっかり立つところを探しましょう。

  8. ゲインのバランスを調整します。
    倒立振子は、傾斜角度に関するゲインと、位置に関するゲインは両立しません。
    前者を高めると、傾斜角度の鉛直さを保つ努力をしますが、その結果、位置の揺れ幅が大きくなります。一方、後者を高めると、姿勢角についてすこし甘くなります(ただし、傾斜すると位置を変えて補正することになるので、前者ほどはっきり位置重視になるわけではない)。さらに、全部高くすると、ガタガタ系の振動が起きて(主にメカ的な応答性;ガタなどや、センサの微分値の影響)、そもそも制御できなくなります。
    そのため、好みに応じて、ゲインのバランスを調整してください。そのとき、指先で支えつつ、揺すってみたときの応答は、感覚的な評価指標になります。

    参考:
    上記の式から、当方で採用している加速度操作型では動かなくなる平衡点、すなわち、加速度=0、速度=0の状況では、
      姿勢角ゲイン×傾斜角度=-位置ゲイン×移動量
    となります。つまり、ロボットを外力などで傾け、ずらしたときの、角度偏差と位置偏差は、単純にゲインの比で決まります。
    一方、力操作型の場合は、これに力も含めたバランスとなるので、少しやっかいですが、結果的には、同じ傾向がでるはずです。

以上の方法は、本学で近所の中学校に提供している実験実習プログラムにおいて、実際に中学生にもやってもらっている調整手順ですが、毎年、それで1時間もしないうちに車輪移動型の倒立振子を立てられるようになります。


熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]