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

なお、当ページは仮設段階にあります。いずれ、より整備した形でまとめ直すことを予定しています。 以下に利用に当たっての注意事項、制約、お願い等を記載します。
公開は"as is"な公開、つまり、当方で利用している物を、ただ、オンラインに掲載するものであって、これに対する内容の保証や、サポート、質問対応を十分に提供するものではありません。 また、ソースコードの開発段階では、他者への意図の伝達、教育的配慮などをしている余裕もあまりないため、全般にコメントが壊滅的に少なく、利用の際は、利用例やコードそのものを読み取れることを前提としています。つまり、「やれば自力でもできる方(できるようになる方)」が実現の短縮や手段の確認などに使うようなことを想定しており、初心者の方には向かない物と考えていますが、この点はご了承ください。
現時点では利用の制限条項は考えておりません。当方になんらかの不利益をもたらすような使い方をしなければ、(各自のご責任のもと)コピペしてそれぞれのプロジェクトに流用頂いてもかまいません。 ただし、他のサイト(3次元プリンタ向けデータ登録サイトなど)への単なる転載はお断りします(検索結果の分散、こちらの更新が反映されないなど他の方の不利益になるため)。
本ページの関する情報の多くを用いて・情報に基づいて有益な成果があった場合は、参考までご連絡頂ければ幸いです。
また、学術発表につながる成果の場合の引用先としては、

  • Masaaki Kumagai, Takaya Ochiai:
    "Development of a Robot Balanced on a Ball – First Report, Implementation of the Robot and Basic Control –", Journal of Robotics and Mechatronics, Vol.22 No.3, Fuji Technology Press
    文献リンク
  • 熊谷正朗:
    「3D プリンタを活用した小型玉乗りロボットの開発」
    Robomech2016, 2P1-16b6
     
をご利用ください。
本ページで公開する技術情報の設計等に用いたソフトウエアを列挙します。 参照、改造、ビルドする場合などには必要になる可能性が高いと思われます。
  • Autodesk社 3D CAD ソフト Inventor (pro) 2015
    学校教育機関および生徒・学生・教員の方々はAutodesk社より無償提供されています。
  • Hiramine.com STL表示ソフト Hira Stl Viewer (フリーウエア)
    設計データとともに用意したSTLファイルの参照に便利です。

  • Cadence社 OrCAD Schematics, PCB Editor
    設計はこれらのソフトで行っていますが、フリー版がないこと、細かなファイルが多数で整理が難しいことから設計ファイルそのものは公開していません。必要であれば、お知らせください。
  • Pentalogix社 ViewMate(Free版)
    基板設計データのガーバデータを参照するために使えます。印刷もでき、主に発注前のガーバの確認などに用いています(OrCAD PCBでは案外操作が面倒で)。

  • Microchip社 MPLABX + xc16コンパイラ
    制御には同社dsPIC33を使用しているため、開発には開発環境とコンパイラが必要です。 ともに、同社サイトから無償入手できます。
  • Microchip社MLA
    高度な機能を実装するために有用なライブラリ群。 dsPIC33のUSB機能を使うために利用しています。
    ※必要ソースはApache2.0ライセンスに基づき同梱再配布しています
  • Microchip社PeripheralLibraries
    古めのライブラリで、今のコンパイラには同梱されていないので、追加ダウンロード、インストールが必要です(uart.h, i2c.h)。
    コンパイラ配付英語ページのDownloads→下の方のPeripheral Librariesの16bit dsPIC~版を必要とします。
  • Masaaki Kumagai, Takaya Ochiai:
    "Development of a Robot Balanced on a Ball – First Report, Implementation of the Robot and Basic Control –", Journal of Robotics and Mechatronics, Vol.22 No.3, Fuji Technology Press
    文献@出版社(登録により無料で全文参照可)
  • 熊谷正朗、落合 恭也:
    「玉乗りロボットの開発 第一報 ロボットの実装と基本制御(翻訳論文)」
    東北学院大学工学部研究報告, Vol.48 No.1, 東北学院大学工学部工学会
    文献@機関リポジトリ
    ※上記英語論文の日本語訳
  • 熊谷正朗:
    「3D プリンタを活用した小型玉乗りロボットの開発」
    Robomech2016, 2P1-16b6
     
  • BallIP Mini on BallIP@YouTube
    小型玉乗りロボットの動画
  • 熊谷正朗:
    「ロボットをつくる ~玉乗りロボットができるわけ~」
    このロボットがすごい2016@日本ロボット学会学術講演会2016
      紹介動画

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

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


本体設計データのファイル名等参考: 各部品の構成は、基本要素(例:○○Plate、CircuitBasePole等)の部品ファイル、これを組み立てたアセンブリファイル(Plateが付かない)、これを簡略化して各部品の一体化をしたもの(○○_C.ipt)と、そこから生成したSTLファイルによります。
STLファイルは、XYZプリンティングのdaVinci 1.0シリーズ(当方では1.0無印, 1.0AiO, 1.0Aで確認)にて出力することを前提にしたクリアランス調整(概ね+0.2大きくなることを見越した穴径調整等)をしてあり、他のプリンタに使用する場合は再調整が必要と思います(ファイルによってはパラメータ化してある)。 全体組み立て図 電池搭載層 主制御基板層 ※タカスICB301基板相当寸法用 LEDスイッチ基板搭載層(天板) ステッピングモータドライバ基板層 各層の支持パイプ部(iPart機能で長さパラメータ化) 基板取り付けボス 車輪配置を決定する座標系を規定したファイル。このなかのパラメータを修正すると車輪配置(=モータ配置)が調整できるが、条件によっては形状生成が不能になるので注意が必要(論文中の配置角度パラメータ×3とモータマウント部品の基準面位置)。 モータ取り付け部の設計 80mm車輪をモータ(オリエンタル PKP245U12B、両軸、シャフト5.00mm)に取り付けるハブ部品 MotorMount系(FixtureFrameで規定)とハブ部品の設計が異なる。

制御マイコンdsPIC33EP256MU806と姿勢センサMPU6050を搭載する主要ボード。 ほぼ、マイコンのピンとコネクタ類を接続した構成であり、オンボードで小型SW電源モジュールを搭載することで、24V程度までの回路主電源を直接供給できる。
ステッピングモータ指令出力コネクタを最大で2ch×3系統持つが、以下のドライブ回路と接続するため、変則的な14pinコネクタがある。

  展開済み (※Elecrow, Seeed 注文対応型ファイルセット)
東芝製TB6560AHQを3個搭載した、3モータ用のモータドライバ。 なお、発注時には2oz(70um)の基板を指定している。

  展開済み (※Elecrow, Seeed 注文対応型ファイルセット)
動作デバッグ時に姿勢角を表示させたりするための4桁のLED(ダイナミック点灯)と16bitの入力(10進or16進スイッチ×4)とLED内蔵スイッチを搭載した基板。

  展開済み (※Elecrow, Seeed 注文対応型ファイルセット)
※詳細の部品リストは後日用意
制御ソフトウエアはGithub上に掲載しました。 kumarobo/BallIPMini
なお、本ロボットのパラメータ設定などには、PCとロボットをシリアル接続(USB-シリアル変換、3.3Vレベル)して行いますが、通信には独自のバイナリ通信のプロトコルSerialLoopを使っています(参考:周辺機器との接続のための通信日本ロボット学会誌Vol.26 No.2)。
通信用のPC側のツールとして、
(※実行exe本体)
と呼ぶソフトを使っていますが、かなり前に作って保守性の失われた
(ZIP)
によっているものと、各種研究用ソフトにいれて使うような、これまた開発技術は失われたもののいまも動作するライブラリしかありません。
sermon.exeの簡単な使い方:
  • メニューからポート設定と通信設定をする(BallIPMiniは115200bps)
  • 送受信変換をSerialLoop11に設定する
  • (メニューから設定を保存する)
  • set16 [対象ノード番号] [16bitレジスタ番号(コード中RegFileS[i])] 値
    set32 [対象ノード番号] [32bitレジスタ番号(コード中RegFileL[i])] 値
    レジスタへの値の設定
  • get16 [対象ノード番号] [16bitレジスタ番号] / get32 [対象ノード番号] [32bitレジスタ番号]
    現在値の取得
  • nop / nops :No operation、空バイトを送る(問題無ければ、戻ってくるピリオドが表示される)。通信が乱れたときなどにnopsを打つと回復しやすい。
  • reqprof [対象ノード番号]
    ノードのプロフィール文字列要求(使用例:reqprof bcast で全ノードの応答が帰ってくる:ノード番号の確認など)
  • [対象ノード番号]は、マイコン側のInitializeSerialLoopで指定(本ロボットの場合は4)。"bcast"を指定するとブロードキャストとなり、全ノードへの一括指定、一括値リクエストになる。
ここでは、玉乗りロボットを含む、「下端が車輪的なもので移動するタイプの倒立振子」のパラメータの実験的な調整方法を解説します。(車輪型、台車型、直動駆動型等)
倒立振子には反動車を回すタイプ(ムラタセイサク君のお腹のホイル状のもの、プール際で落ちる前に腕を振り回す動作も同)がありますが、これはこの方法では調整できません。

倒立振子の一般的制御式は
  操作量(加速度、力)=姿勢角ゲイン×傾斜角度+姿勢角速度ゲイン×傾斜角速度
             +位置ゲイン×移動量+速度ゲイン×移動速度
で、この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時間もしないうちに車輪移動型の倒立振子を立てられるようになります。