PRIMER-V2自転車に乗る二足歩行ロボット■製作のきっかけ以前近くの科学館(るくる)に村田製作所のセイサク君を見に行きました。そのとき「私もこんな自転車ロボを作りたいな」と思ったのがきっかけです。方がリアルで面白そう、と考えチャレンジしてみました。取り付けた衝撃吸収用のピアノ線です。・一人で操縦と撮影をしたの?操縦は私が、撮影は助手(妻)に手伝ってもらいました(前日、撮影の特訓を行なったのですがどーもこれ以上にはうまく撮れないようです)−−−−−−以下技術的な内容−−−−−−■コンセプトバランス制御は古典的なPID制御を基本とする。)のパラメタまでも変数として関数化する必要がある。それらを全て実験orシミュレーションすることは殆ど不可能に近い。実現したい(今は単なる夢)。その「前段階の実験機」という位置付け。・足首が長すぎ、ペダルを漕ぐ際、不自然に見えましたので足首ロール軸部分を削除しました。・ソールは、甲が少し長めの仕様に変更。これにより、発進時、爪先立ちからペダルに足を乗せるまでの時間を短縮。股を広げずに足裏を横方向に対し平行にできるため、ペダルを回す際の駆動モーションをスムースでシンプルなものにすることができます。写真4.バックパックに搭載された制御ボード・制御基板はSH7125をコアとする自作基板に交換。市販品がありませんでしたので、ホームセンタや100円ショップなどで集めた材料を利用。素材レベルから自作したものです。フレーム部は角パイプと削り出しの継ぎ手によって組み上げました。・小型自転車を製作するにあたって最初に悩んだのが適合するギアとチェーンの入手です。調べましたがそのまま使えるものが無かったので、ラジコンカー用のプリーとドライブベルトで代用することにしました。・ペダルは写真の様に丸棒の状態になっています。・ロボットの足には、半円形の溝とテーパが付いていてペダルと嵌合します。・ハンドルは6mmの鉄棒を曲げただけのもので、手を固定するための特別な機構はありません。ロボットの腕を外側にスライドさせれば、ハンドルから手が外れます。・ホイール部分は5mmのアクリル板を使用。そこにゴム管(100円ショップで入手したエクササイズ用のもの)を接着、外れないよう中心にワイヤを通し、締め付けてあります。制御基板は、KHR-3HVのキットに添付(RCB-4HV)されていますが、プログラムをC言語で記述したい等の事情で、自作の制御基板に乗せ換えることにしました。自作基板の概要は以下の通りです。高精度な絶対角を生成。自転車ロボットでは使用せず、角速度の積分はソフト的に行うことにしました。�B加速度センサ:KXM52-1050モジュール使用(3軸)�CRS232Cインタフェエース:AMD3202AN使用、外部PCとの通信用。�E角速度センサインタフェース:レートジャイロ(現在TAG-201使用)からの出力をマイコンのアナログポートに入力。�F無線モジュール:KRR-1モジュール使用(ADバンド)�G圧力センサインタフェース:ロボット足裏の圧力センサ用ですが、自転車ロボットでは使用していません。�Hシリアルサーボインタフェース:サーボ(KRS-2552HV)信号をマルチドロップ(後述)でマイコンのシリアルポートに接続。Ni-MHバッテリー(10.8V,800mAh)から電源供給。■ソフトウェア概略ソフトウェアは、RenesasのHEW環境を利用し、C言語で作成しました。図2ににサーボ制御廻りを中心としたゼネラルフローを示します。ロボットの状態毎に分岐したフェーズ別処理を行います。これら一連の処理は、タイマ割込みのタイミングに合わせ、10msの周期で実行されます。[タイマ割込み]10ms周期で内部割込みを発生させ、この割込みをメイン処理に通知するためのフラグを立てます。サーボコマンド形式に変換した後、送信用リングバッファに書き込みます。最後に送信割込みを有効にして、コマンドの送信を待ちます。[送信割込み0]各サーボに115.2Kbpsの速度でリングバッファ内のコマンドデータを送信します。送信割込み2(表記省略)を左側サーボ用に振分けることで全サーボへの送信完了時間を短縮し、送信ポートのドライブ付加を軽減しています。[受信割込み0]右側サーボからのレスポンスデータ(コマンド送信後)を受信します。左側サーボのレスポンスは受信割込み2(表記省略)で受信します。[受信割込み1]無線モジュールからのデータ(2.4Kbps)を受信し、データは受信用リングバッファに格納されます。内容の解析はメインルーチンで行ないます。[TE割込み0]送信キャラクタの最終ビットが送信され、その後、送信キャラクタがセットされない場合、本割込みが発生します。この割込みタイミングで送信ポートを入力に設定することでサーボからのレスポンス信号との衝突を回避します。図3.バランス制御の流れ図3は、自転車が傾いた際に、ロボットがハンドル操作によって車体を立て直すまでの大まかな制御の流れを示したものです。車体が傾いた際�@、ロボット側は、ジャイロセンサの出力を積分して求めた絶対角※によって検知�Aします。その傾き角から車体を垂直に戻すための適切なハンドル角をPID制御�Bの手法で求めます。各関節のサーボ駆動量を逆運動学計算�D※によって求めます。角度ハンドルを切る�Fことで車体の立て直し�Gを行ないます。自転車ロボットを安定に走行させるための重要な条件です。絶対角の算出処理はメイン処理の中にあり10ms周期で実行します。処理内容は、ジャイロセンサの出力をAD変換した値(角速度)が格納されるデータレジスタ(ADD.ADDR0)を右に6bit分シフト(SHマイコンの場合、下位6bitは無効)し、その値から静止時のジャイロ基準レベル(base_RLは、予めイニシャルルーチンで計測)を引くことで、オフセット0の角速度に変換します�@。次にノイズ等による誤差(本ロボットの場合、1程度)以上の角速度の変化があったときのみ�@の角速度(J0)を加算してゆく(積分する)ことで絶対角(RL_ANGLE_I)を求めます�A。温度ドリフトなどで基準レベルが変化した場合を考慮し、基準レベル補正レジスタ(jyrBaseAdj_RL)�B�Cを介してbase_RLが基準レベルの変化に緩やかに追従できるようにしています�D。符号を反転し、更に1/4することで最終的な絶対角(RL_ANGL)に変換します�E。RL_ANGLは30・degの倍率に設定されており、これはサーボ(KRS-2552HV)から読み出せるポジションデータと同じ単位となります。■ハンドルを切る写真12.ハンドルを切る場面(動画「二足歩行ロボットを自転車に乗せてみた」より)自転車の場合、自動車などとは違って、行きたい方向にハンドルを切るだけでは目的の方向に曲がることができません。曲がるためには、例えば右に曲がるには先ず、右側に重心を移動させる必要があります。今度は逆に右にハンドルを切り、傾いた状態でバランスを取ります。今度はやや内側にハンドルを切って、車体を垂直に戻すことで直進状態に復帰させます。駆動目標と、実際の足位置との位相関係が狂い、ペダルが回らなくなったり、最悪サーボを壊してしまう可能性があります。そこからΘ進んだ位置を駆動目標にしています。ペダルを漕ぐことができ、また、この進み角Θの調整によって、自転車の走行速度を変えることもできます。自転車にはプレーキが付いていないので、止まる時は地面に足を着けて停止します。股関節サーボの駆動トルクを小さく(電流制限)しています。結果、車体が横に振動します。股関節の負担軽減と、トルク負けによる転倒を防止ししています。その一例として本ロボットで用いた技術を紹介したいと思います。図8.シリアルサーボ制御部分シリアルサーボは、受信信号と送信信号が共通な半二重通信方式になっていて、複数のサーボをマルチドロップにより1本の信号線で制御します。KCB-1の回路図を参考に設計した本ロボットのシリアルサーボ制御部分です。サーボ制御用のシリアルポートは、KCB-1と同様、SIポート0と2を使用していて、RXD(受信ポート)とTXD(送信ポート)は抵抗を介して1線に纏め、直接、サーボに接続しています。ここで注意しなければならないのは、TXD0,2はオープンドレインではないということです。従って、ワイヤードオア的に使用する場合、マイコン側がコマンド送信後、サーボからのレスポンス受信待ちとなったとき、出力の衝突を避け、マイコン側送信ポートをハイインピーダンス状態にする必要があります(出力ハイレベル許容電流IOH=2mA)。具体的にはリスト4のようにコマンドの最終ビットが送信されたタイミングでTE割込みを発生させ、送信ポートを入力(ハイインピーダンス状態)に設定し、サーボのレスポンス信号との衝突を回避します。PA1ポートをTXD0ポート(出力)に設定�Bします。End)割込みを有効�Eにします。出力されるレスポンス信号との衝突を回避します。シリアルサーボをマイコンから直接制御する際、出力の衝突回避を考慮していないケースは多いのではないかと思われます。以上の例を参考に確認して頂ければと思います。