PICマイコンで制御する4足歩行ロボットの製作 2014.4.29


    1.はじめに

     数年前に、吉野耕司さんが公開している「吉野のロボット」のページを見て、 2足歩行ロボットの作成に挑戦してみたのですが、満足に歩かせることができず、暫くロボットの製作からは遠のいていたのですが、またまたロボットづくりをやってみることにしました。

     今回は、確実に歩かせることができる4足歩行ロボットに挑戦してみることにしました。ロボットのデザインなどは、今回も吉野さんの4足ロボットの作品を大いに参考にさせて頂きました。

     吉野さんが作品で使われていたマイコンボードは、今では、ちょっと古いものとなります。そこで、16ビットのPICマイコン1個を使ってコントロールボードを作りました。このボードは、2足歩行ロボットの製作の時に試作したものです。

     ロボットのデザインやアイデアは、吉野さんのページに倣っていますが、制御系の部分については、マイコンやプログラムは、全く別物となっています。


    2.ロボットの概要

     1足あたり、3個のサーボモーターを使います。4足全体で12個のモーターとなります。モーターを収納するケースを、タミヤのプラ板を使って作成し、組み上げました。

     出来上がったデザインは、胴体から左右に水平に2本の足が突き出ている爬虫類型のロボットとなりました。静止時は、胴体部分が着地しています。この辺りの設計は、吉野さんの作例を倣ったものです。

    ロボットの足のパーツを作っている所です。
    ちまちまと面倒ではありますが、楽しい時でもあります。
    dsPIC30F4013を使った制御ボードです。
    PCと接続するUARTのケーブルとPICKit3を接続するケーブルが付いています。
    デモンストレーション用のプログラムを作って、組上がったロボットを動かしてみました。
    背に制御ボードを搭載しています。歩き出す前の準備運動をしているような感じになっています。

    3.PICマイコン制御ボード

     16ビット、30MIPSのdsPIC30F4013を使っています。このPICは、40ピンディップタイプのマイコンです。約30MHzのクロックで動作します。

     16個のアナログサーボモーターを一度に動かすことができるようにしました。また、アナログ出力の加速度センサーなどを8個繋ぐことができます。モーター用の動力として、電池あるいはACアダプタにて+6Vを供給します。マイコン用の+5Vは、基板上の3端子レギュレータで生成しています。

     dsPIC30F4013は、プログラム用のROMメモリが48KB、RAMが2KBとなっています。プログラムメモリに比べRAMが少ないのでプログラムを作る時には考慮が必要です。


    3−1 モーターの制御
    サーボモータ制御パルスの生成

     サーボモータの制御信号は、PICに内蔵されているタイマーモジュールを使って生成するようにしました。

     dsPIC30F4013には5つのタイマーが備わっています。その中のひとつのタイマー1を2.5msecのインターバルタイマーとして動かし、2.5msec毎の割り込みを発生させています。その割り込み処理の中で各サーボモーターの制御信号を作るようにしました。

     1つのサーボモーターには、1つのタイマーを割り当て、タイマー2からタイマー5までの4つのタイマーを使って、同時に4つのモーターを制御します。

     2.5msec毎に、別の4つのモーターへとタイマーの割り当てを切り替えて行くことで、10msecの間に16個のモーターを制御できるようにしました。この方法では、更に16個、計32個までのサーボモーターを動かすことができます。

     タイマー1の割り込み処理の中で制御パルスの立ち上げを行うとともに、タイマー2からタイマー5までの起動を行います。そして、タイマー2からタイマー5までの各タイマーの割り込み処理の中で制御パルスの立ち下げを行います。

     各サーボモータを動かすための制御パルスは、0.7msec〜2.3msecの範囲にありますからこれでうまく動いてくれます。パルスの周期は、20msec(2.5msecの割り込み8回)となるようにしました。

     一度に動作するモーターは、4つまでとなりますので、動力用電源の電流容量もそれに見合ったもので済ますことができます。


    3−2 歩行プログラム

     ロボットを動かすやり方として、ロボットの動きに対応したサーボモーターの角度データを予めパソコンなどで計算しておき、 マイコン側に数値データとして格納しておく方法や、パソコンからリアルタイムに送信しながら動かす方法がありますが、 これらの方法では、柔軟な動きをさせようとすると事前のデータ作成が大変です。また、前進歩行一つ取ってみても、胴体の高さを変えようとすれば、 データは異なったものが必要になります。

     今回の製作では、このようなデータを予め準備しておくのではなく、歩行時のロボットの体の状況に応じて、リアルタイムにPICマイコンで計算する方法を採用しました。 ただし、「足を20mm上げて、胴体を10mm下ろして、前に5秒進んだら後退する」などのような一連のシーケンスは、デモパターンとして予めプログラムしています。

     このようにして作成した、動作実験を兼ねたデモンストレーション動作を次に示します。


    胴体を着地させながらの歩行です。
    少し前進した後、後退し、また前進します。
    立ち歩行をさせるとプラ製の胴体では安定しませんでしたので、木製の胴体に変更しました。
    這い出してから、体を持ち上げ、立って歩き出します。
    立ち歩行で前進し、壁の前で信地旋回します。足が床をたたく大きな音がしています。

    3−3 サーボーモーターの角度計算

     足を動かすためのサーボーモーターの角度計算については、逆運動学に基づく計算を行っています。

     今回の作例では、4つの足は、同じ構造をしています。1つの足には、モーターを3個使っていますが、胴体に近い方からモーター0、モーター1、モーター2とします。 モーター0は、足全体を前後に回転させる役目をしており、モーター1と2は、2本のリンクを回転させて足先を目的の位置に持っていく働きをします。

    角度計算のための座標設定
     右の写真のように、モーター0の回転軸の中心が地面と接する点を原点(0,0)とした時、モーター1の回転軸の中心座標を、(d1、h1)で表し、足先の座標を、(d2、h2)で表すものとします。足先が地面に接地している時は、h2=0です。 モーター1とモーター2の回転軸を結ぶリンクの長さをr1とし、モーター2の回転軸から足先まで伸びているリンクの長さをr2とします。

     この状態におけるモーター1とモーター2のそれぞれの回転角、αとβを、逆運動学によって求めます。αは、水平軸から上側を+の角度、下側を−の角度とします。βは、+の角度のみとなります。

     逆運動学によるαとβを求める計算式は、次のようになります。

     逆運動学とはいっても、今回のケースでは、3辺の長さが既知の三角形の内角を求める計算を行っているだけです。
     パラメータh1を増減させることにより、胴体を上下に動かす時のモーターの角度を求めることができます。

    足先を前後に動かす時の角度計算
     足を前後に動かしたり、胴体を前後に動かす場合には、モーター0の回転角度を求める必要があります。

     右の写真を見てください。足先がP1の位置からP2まで、距離Lだけ後退する場合を考えて見ます。

     足先のモーター0の回転軸中心からの距離を、それぞれd2、d2’とします。この時のモーター0の回転角θと、d2’は、次のように求めることが出来ます。

     d2’を、新しいd2として、先に説明しました方法で、モーター1とモーター2の回転角度も合わせて求めれば、足先をLだけ後退させることが出来ます。

     今回の4足ロボットにおいては、どのような動きであっても、上記のような計算方法で3つのモーターの回転角度だけ求めればよい訳です。


    3−4 信地旋回時の足先の移動

     ロボットが一箇所に留まって、体の中心を軸に、右回りや左回りに回転することを信地旋回といいます。その時のモーターの角度を求めることを考えて見ます。

     まず最初に、この場合の足先の移動を考えます。右図はロボットを上から見た図です。

    信地旋回時の足先の移動
     この図に示すように、4本の足先を、体の中心0を原点とする半径Rの円周上の円弧の上を、角度α1からα2まで移動させれば信地旋回となります。

     旋回開始時点では、足先が左右に水平に伸びているものとします(モーター0の回転角度が0度)。

     この時のd2を使って半径Rを決定し、適当な角度α1からα2まで足先を移動させた時、各移動先の座標をP(dx、dy)としますと、下記のような計算式で、モーター0の角度θや、足先の距離d2を求めることができます。


    3−5 滑らかな動きのために

     例えば、胴体を10mm上げるというような動作の場合、足のパラメータであるh1に10を加算し、モーター1とモーター2の回転角度を求めて、サーボモーターを制御すれば良いのですが、 いきなり10mm上げると、その動作は、滑らかではなくカクカクとした動きになってしまいます。

     このような場合には、面倒ですが、1〜2mmだけ胴体を持ち上げる動作を5回、あるいは10回繰り返すと自然で滑らかな動きとなります。

     角度計算を何度も行いますので大変なように思いますが、サーボモーターの制御パルスは、20msec周期ですので、計算する時間は十分あります。

     先の信地旋回においても、α1からα2まで、1度〜1.5度のステップで、細かく変化させて行くことで滑らかな旋回動作をするようになります。また直線歩行などの場合も、3〜5mmステップによる繰り返しを行うと違和感のない動きとなります。


    4.無線コントロール

     ロボットが動き出すと、デモプログラムを作っているだけでは面白くありません。やはり、自分の手で自由に操縦してみたくなります。そこで、無線によるコントロール装置を作成しました。いわゆるラジコンの実現です。

     ラジコンのコントローラーには、ジョイスティックや押しボタンがたくさんあるUSBインタフェースのゲームコントローラーを使うことにしました。そこで、USBインタフェースを持つ「PIC24FJ64GB002」マイコンを使いました。

     無線部分については、SPIインタフェースで接続するノルディックセミコンダクター社の2.4GHz無線モジュール「nRF24L01」を使いました。

    USBゲームコントローラーを使ったラジコン送信機です。
    屋外に持ち出す時は、単3乾電池3本(4.5V)で動かします。
    PICマイコンと無線モジュールを基板に組み込みました。
    緑は電源ランプです。赤は、無線リンクの監視ランプです。
     ロボットとの無線リンクが途絶えると赤のランプが点灯します。
    ロボット側の無線モジュールです。
    マイコン制御ボードにSPIで接続しています。
     特別なアンテナはなくても部屋の中なら無線通信が出来ています。

    5.測距センサーと加速度センサーの取り付け

    <測距センサー>

     ロボットの歩行時における壁などへの衝突防止のために、シャープの測距センサー「GP2Y0A21YK」をロボットの前部と後部に取り付けました。

     このセンサーは、アナログ電圧出力ですので、マイコン制御ボードのアナログ入力端子に接続しました。センサー感度は、約15cmで、障害物を検出するようにしました。

     ラジコンでロボットを歩行させている時、壁に15cmほどに近づくと停止します。ここで自動的に後退させるなどの動作をプログラムすることもできましたが、今回は、オペレータの判断を待つという仕様にしました。

    <加速度センサー>

     4足歩行ロボットでは、転倒などの心配はありませんので、2足歩行ロボットのようなジャイロセンサーや加速度センサーによる姿勢制御は必要ありませんが、お遊びとセンサーの使い方の学習を目的に加速度センサーを取り付けてみました。

     こちらの加速度センサーも使ったものは、アナログ出力のものです。X軸、Y軸、Z軸の3方向の加速度が計測できます。

     加速度センサーは、ロボット歩行中の加速度を計るのではなく、停止中に、外部から胴体に力が加えられたかどうかを検出することに使うことにしました。

     停止している時に、ロボットの前部を手で叩いてやるとそのショック(0.5Gオーバー)を検出し後退を始めます。逆に、後部を叩いてやると前進を始めます。その後の動作はラジコンで操縦します。

    測距センサーを取り付けました。
    胴体は、布で覆いを付けています。
    緑の小さな基板が加速度センサーです。
    無線モジュールの基板に搭載しました。
    ロボット全体を布でカバーしました。
    今回のロボット製作は、ここまでで一応完成とします。

    6.最後に

    自作のラジコン装置でロボットを操縦して遊んでいます。

     このロボットの更なる発展として、次のようなことが考えられます。

     ラズベリーパイのような小さなLinuxボードを搭載すれば、USBカメラによる画像認識やマイクによる音声認識、音声合成が出来るようになります。ラジコンだけでなく、自律で動作するロボットを作ることも夢ではありません。 また機会があればこれらに挑戦し、回を改めて報告したいと思います。

     出来上がったロボットは、爬虫類型ということもあって、動く姿がなんとも不気味で薄気味悪いと、家族から不評を買っています。 まずは、デザイン変更が先かなと思っています。アイボーのような犬型にしないと愛着も沸かないようです。

     足からボディまで、全て手作りしましたが、やはりというかなんというか、工作精度が甘くて、直進時にまっすぐに歩いてくれません。

     足の部分の重量も結構あって、重心を取るのが難しいようです。立ち歩行時には、2本の足が地面から離れないと駄目なのですが、足が地面を擦っています。

     センサーを使って補正することも考えてみたのですが、工作精度を高めるのがまずは第一と思い諦めました。次回の製作に期待し、今回のロボット製作はこれで終わりにしたいと思います。