自作ロボットをROSで動かす(1)
ROSさんお手やわらかに:ROS青雲編
Hanabot1はこんなふうにROSに接続する。
専用のドライバノードをpythonで書く。あとはこのシリーズ投稿のように、まずはゲームパッドでロボットを動かしてみることにする。ノードがパブリッシュ/サブスクライブするメッセージはroombaのドライバと同じにする。こうしておけば、ドライバ以外は変更なしで動かせそうだ。日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
« 2014年4月 | トップページ | 2014年6月 »
ROSさんお手やわらかに:ROS青雲編
Hanabot1はこんなふうにROSに接続する。
専用のドライバノードをpythonで書く。あとはこのシリーズ投稿のように、まずはゲームパッドでロボットを動かしてみることにする。ノードがパブリッシュ/サブスクライブするメッセージはroombaのドライバと同じにする。こうしておけば、ドライバ以外は変更なしで動かせそうだ。花岡ちゃんのウィークエンド
ウチの中を片付けていて、こんなものを発見しちゃいました。
eVY1を使った打ち込みシンセサイザです。作りかけをアマゾンの箱に入れておいたら、いつの間にか奥さんが納戸の奥にしまい込んでしまったようです。僕もなんとなく忘れてしまい、そのままになっていたのでした。
一応、音源とボーカロイドの打ち込みと再生、データのEEPへの保存などが動くようになったので、じゃあひとまずケースに組み込んでから、その後の開発を続けるかというところで、問題が発覚しました。
最初の問題は、データの記憶容量が5KBと小さいことでした。ボーカロイド1トラックと伴奏4トラック、これにリズムセクションなので、シェアすると各トラックごとに最大でも数百音符くらいになってしまい、下手をすると歌謡曲1曲も入らなくなりそうでした。I2Cに接続するシリアルRAMなんかを接続しないと、まともなモノにはならないかも… でも、所詮オモチャなんだから、このままで兎に角作ってしまったら… と、なかなか悩ましいところでした。
もう一つの問題は、ちょっと深刻でした。以前アルディーノで伴奏付きシーケンサを試したとき気づいていたのですが、ボーカロイドはMIDIデータを送ってから発声までの遅れ時間が、発音毎に異なるということです。例えば、子音+母音の音よりも、母音だけの音の方が、遅れがかなり小さいことです。「あなたの心に」で、「風があるなら〜」のくだりがわかりやすいでしょう。「あ」が走っているのがわかると思います。簡単にシンクロでチェックしたところ、結構ばらついているみたいでした。
試作したシーケンサは、ボーカルトラックに一律の遅延パラメータを設定し、他トラックとの遅れを補正するようにしているので、これでは具合が悪いようです。遅れの小さい母音だと、発音タイミングが早すぎてボーカルが走る感じになります。発音ごとに違ったパラメータで補正するのがスジのようです。どうも、ボーカルが少したどたどしい感じがしていたのは、これが一因でないかと思います。
これにはちょっと困ってしまいました。根本的に対応するには、遅れの測定やなんやかやで、結構な手間が掛かりそう… なんてところですっかり止まってしまっていた訳です。うーん、どうしましょう。このままだとガラクタに成り下がってしまうので、オモチャとして格好を付けた方がいいでしょうか… とりあえず、アマゾンの箱を目の届くところに置いて、しばらく検討することにします。
ROSさんお手やわらかに/花岡ちゃんのウィークエンド
R1350NはUART2に接続します。仕組みが複雑になってきたので、回路図を起こしました。
電源はアルカリ単三4本、モーターはタミヤのミニモーター低速ギアボックスを使っています。液晶は秋月の小型I2C液晶です。コレ以外は使えません。初期化関数を手直しする必要があります。付けなくとも動きますが、イロイロと不便です。
モータードライバはTB6552FNG、あまりなじみがないものだと思います。兄貴分のTB6612FNGならブレイクアウトボードがあります。こちらを使うことをお勧めします。
R1350Nのリセット駆動に使っているトランジスタは、小信号用のものなら大抵のものが使えます。デスコンになった1815にこだわる必要はありません。
R1350Nはデフォルトの設定で使っています。リセット(初期化)もハードでおこなっているため、R1350Nへのデータ送信は使っていません。受信データは割込みで配列"R1350data"に自動的に取り込まれるので、この配列を読むだけで角度や加速度が読み込めます。
MPLAB Xのプロジェクトファイルを公開しますので、参考にしてください。中身はXG1300Lでやったものと同じです。
ROSさんお手やわらかに/花岡ちゃんのウィークエンド
XG1300Lは入手困難なようなので、同様の性能であろうR1350Nもテストしておくことにしました。これはスイッチサイエンスで販売しています。長いこと品切れで心配していたのですが、最近また入荷したようです。
R1350NはXG1300Lとは異なり、ロジックレベルのシリアル通信でインターフェイスします。デフォルトのボーレートは115200bpsと高速なので、ソフトでのシリアル通信ではなく、UARTを割り当てるのが順当です。PIC24FにはUARTが2チャンネルあり、こういうときは便利です。1チャンネルをR1350Nに割り当てても、もう1チャンネル残るので、ホストコンピュータとの通信などが、簡単に実装できます。
もう一つの相違点は、角度データなどの読み出し方です。XG1300LはI2Cなので、読み出しコマンドでデータを読み出しますが、R1350Nは一定周期毎にデータをまとめて送りつけてきます。デフォルトの送信周期は100Hzです。
R1350Nからは1:Vdd 2,8:Gnd 11:TxD 12:RxD 18:nRSTの5本を引き出します。たったこれだけなので、直接電線をハンダ付けして引っ張りだしました。日本語のマニュアルにはピン番号が入っていないので、英文マニュアルを参照することをお勧めします。
R1350Nはロボットのシャーシに厚手の両面テープで貼付けました。再利用がしにくいのであまりお勧めしません。ブレイクアウトボードを使って、ねじ止めするのがよいでしょう。取り付け角度はどうでもかまいません。初期化のときに、どこを向いているにせよ、その方向を0として相対的に±180°の範囲を計測するようセットアップされるからです。ただし、床面に対してはなるべく水平になるように取り付ける必要があります。本機では、シャーシが水平になるよう、水準器で計りながらキャスターの高さを調節し、そのうえでシャーシにピッタリと貼付けました。
デモプログラムでロボットを動かしてみたところでは、XG1300Lと全く同じに使えます。安定度も遜色ありません。おそらく同じモジュールのファーム替えなのではないでしょうか。
ROSさんお手やわらかに/花岡ちゃんのウィークエンド
今回の実験の総括です。
ジャイロコンパスについて:かなり安定ですが、とはいえ、時間経過に伴って誤差が発生します。30分程連続動作を続けたところ、数度の誤差が発生するようです。角度がドリフトする感じです。この辺は、スリップがない場合の、オドメトリによる角度計測に分があります。ただ実際は、カーペットに乗り上げるなどでスリップは発生しがちなので、実環境での自己位置推定にはジャイロの方が向いているように思います。問題は、時間経過に伴う角度の補正をどのように考え、また実行するかのコンセプトの作りようでは無いかと思います。
身体性について:キャタピラのモデルから、上の車輪モデルに組み替えても、実のところ、全く同じプログラムで動作しました。その後、車輪モデルに適応したモーターパワーを設定しましたが、そのままでも多少進路が不安定になるだけで、精度は問題ないものでした。この方式は、単純な自律ロボットプログラムにありがちな身体性をあまり持たず、どんなモデルにも、おなじプログラムで対応できそうです。
ここらへんで工作の時間はおしまいです。1/8計画に戻りましょう。手始めは、この試作機をroombaのように、ROSで動かしてみようと思います。
ROSさんお手やわらかに/花岡ちゃんのウィークエンド
まずは回路図ですが、今回は作成していません。公開するPICのソースコードの最初の部分にポート割当がありますので、それを参照してください。PIC周りの回路はこのシリーズの投稿を参照願います。
ジャイロの接続はこの投稿を見てください。
使用している液晶は秋月の小型i2cタイプです。他のモノを使うにはコードを修正する必要があります。今回はこちらの変換基板がついたものを使いました。プルアップ抵抗が内蔵されているので便利です。
モータードライバは一般的なものでOKです。パワー制御はソフトでやっているので、ドライバにPWMの機能は必要ありません。小型モーターならTB6612FNGを使ったこのボードがお勧めです。PWMはHレベルに固定して使います。
ソフトウェアはおなじみMPLAB XとXC16で開発しました。
main.cに全てが記述してあります。ソフトを起動するとクレジットを表示した後、"PUSH START"を表示して待機します。このとき、LEDは1秒周期で点滅します。ボタンを押すと"INIT GYRO"としばらく表示します。ジャイロに初期化コマンドを送っているので、ロボットを動かさないようにしてください。その後、この投稿にあるように、1m四方の正方形を描いて走行します。走行中は、液晶にX座標(上側)Y座標(下側)を表示します。停止後、10秒すると再度"PUSH START"が表示されます。
使用する前に55行目からの「身体性パラメータ」を自作のロボットボディに合わせて設定する必要があります。
測距輪やジャイロ、モーターのテストのためのテストプログラムも入っています。1229行から、テストプログラムの使用法が記載されているので、参照してください。
プログラムは単純です。navigation(double x,double y)に目標地点のx,y座標を与えると、その位置へ直線移動します。目標地点との距離が3cm以下になると、モーターブレーキをかけてリターンします。座標系は一つ前の投稿を参照してください。
ロボットの初期位置はRposX,RposYにセットします。デモプログラムでは初期位置を0,0にしています。(1219,1220行)、同様にアタマの向いている方位(ヘッディング)はinit_Gcompass(double val)に与えてジャイロを初期化します。デモでは0(Y軸方向)に初期化しています。(1224行)
次回は実験を総括します。