RoombaをVisual C#で制御する(その3)
花岡ちゃんのウィークエンド:ルンバを試す
今回はRoombaの主なコマンドについて調べてみます。
Roombaのコマンドは1バイトのコマンドコードに続いて、1バイトずつのパラメータが続きます。コマンドパケットのヘッダーやフッターはなく、不完全なコマンドからのリカバリの機能はありません。そのためコマンドパラメータは必要数だけきちんと送らないとおかしなことになります。
Roombaにはいろいろなコマンドがありますが、今回はもっとも基本的な「モーターや移動のコマンド」と「センサ読み出しコマンド」について解説します。"iRobot Roomba 500 Open Interface(OI)Specification"の当該ページを見ながら読んでもらうとわかりやすいと思います。
■モードチェンジコマンド(P6,P7)
実際のコマンドを送る前にRoombaのモードを設定する特殊なコマンドです。基本的にStart[128]コマンドを送った後、Safe[131]かFull[132]のコマンドを送りモードを設定します。モード設定は最初に一度だけ行えばOKです。
多くのコマンドはいずれのモードでも有効です。Safeモードは落下回避などの安全機能が働きますが、そのときにPassiveモードに戻ってしまうので、またSafeコマンドを送らなければなりません。目の届くところで実験するならFullモードのほうがよいでしょう。
■モーター・移動コマンド
まずはコレから行きましょう。
・Driveコマンド(P10)
基本的な移動コマンドです。速度、旋回半径を与えると動きます。「どこまで」という指示は出来ません。あくまでも移動をスタートするコマンドです。コマンドのパケットは下記のようになっています。
[137][速度・上位バイト][速度・下位バイト][旋回半径・上位バイト][旋回半径・下位バイト]
速度→ -500~500mm/S(プラスで前進、マイナスで後退)
旋回半径→ -2000~2000mm(プラスで左回り、マイナスで右回り)
旋回半径はRoombaの中心(パワーボタンの位置)が描く円弧の半径です。なお、直進させたい場合は32768か32767、時計回りのその場回転は-1、反時計回りなら1を指定します。
コマンド例は前出のRoombaTESTERでやっていますので割愛します。
なお、動いているロボットを止めるには、速度パラメータを[0][0]にします。
せっかくテスト用の10進表記でパケットを作れるソフトを作ったのに、2バイトのパラメータを1バイトずつに分割して記載すると、10進表記のパラメーター→16進変換→上位・下位バイトに分割→各々10進変換→RoombaTESTERに入力、と、えらい遠回りをしなければなりません。残念ですがc電卓の助けを借りて作業します。これならX-CTUでやったほうがいいかもしれません。
・Motorsコマンド(P11)
Roombaには移動用以外に、サイドブラシ、掃除機、本体下のメインブラシのモーターが搭載されています。これをON/OFFするコマンドです。
[138][モーターバイト]
モーターバイト→ ビット0・サイドブラシON/OFF、ビット1・掃除機ON/OFF、ビット2メインブラシON/OFF、ビット3・サイドブラシ回転方向、ビット4・メインブラシ回転方向
ON/OFFビットは1で回転1で停止。
サイドブラシ回転方向は1で時計回り
メインブラシ回転方向は1で掻き込み方向
Roombaを移動ロボットプラットフォームだけではなく、リモートブレイン掃除機としても使いたいなら必要なコマンドです。純粋に移動プラットフォームとして使うなら、メインブラシは外しておいたほうがスムーズに動きます。
次のコマンドでモーターパワーも制御できます。
・PWM Motorsコマンド
[144][メインブラシパワー][サイドブラシパワー][掃除機パワー]
各ブラシパワー→ -127~127(符号が回転方向)
掃除機パワー→ 0~127
なんと、こっちでも回転方向が変えられるみたいです。前のコマンドとの相関関係はどうなっているのでしょうか?
とりあえず、これだけ知っていればRoombaを動かすことが出来ます。
■センサ読み出しコマンド
お次はセンサの読み出しです。これでリモートブレインの移動ロボットとして独り立ちさせることが出来ますね。
・Sensorsコマンド(P17)
これを送るとセンサの値を返します。パラメータは「パケットID」で読み込みたいセンサのIDを指定します。
[142][パケットID]
パケットIDはP35(最後のページ)に一覧表があります。下のスナップショットはSEND1にセットしたコマンドで体内の温度計(ID 24)を読み込んだところです。一番下のボックスに表示されているのが温度計の読み出し値です。充電したてなのでちょっと暖かいようです。
いくつかのセンサをまとめて読み込めるIDもあります。例えばID 1は落下センサや過電流といった移動ロボットの安全にかかわるセンサをグループ化してあります。ID 106は各方位の光電式障害物センサの値をまとめて読み込むのに便利です。また、ID 100はすべてのセンサを一気に読み込みます。
ID 19の移動距離センサとID 20の旋回角度センサはオドメトリの結果を返すセンサですが、シェーキーのような積算型ではなく、前回読み出したときからの移動距離と旋回角度なので、使い方には注意が必要です。
センサの詳細については、ひととおり実験した後にレポートします。(いずれ、ですが)
とりあえず、これでRoombaが移動ロボットのプラットフォームとして使えるようになりました。市場でもまれた商品、いろいろと良く考えられています。また、一見おもちゃのような作りながら、相応のタフさがあると思います。
実用的なロボットを試作したいなら、改造ベースとして一考の価値があるでしょう。
« RoombaをVisual C#で制御する(その2) | トップページ | NEDO国際ロボットフォーラムに行ってきました »
「花岡ちゃんのウィークエンド」カテゴリの記事
- レーザー距離センサVL53L0Xを複数使うには(2022.05.01)
- 【訂正!】PIC24Fでレーザー距離センサVL53L0Xを使う(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(おしまい)(2022.04.14)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その3)(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その2)(2022.04.12)
コメント
« RoombaをVisual C#で制御する(その2) | トップページ | NEDO国際ロボットフォーラムに行ってきました »
Roombaのセンサ読み出しコマンドについて質問です。
RoombaTESTERをダウンロードさせて頂き,前ページの「その2」に書かれていたテスト動作(前進)までは行うことができました。
そこで、今回のページ(その3)に書かれているセンサ値の呼び出しコマンドを行ったところ,Roombaからの応答がなく,温度センサ以外にもエンコーダの値を読み取ろうろしても応答がない状態です。
「その2」が行うことができたため,配線などには問題ないと考えているのですが,センサの応答がない問題の原因がどこにあるかわからない状態です。解決方法を、もしご存知でしたら,コメントいただけると助かります。
投稿: | 2014年1月 8日 (水) 19時19分
こんにちは、ブログオーナーのササガワです
roombaへのコマンド送信はうまくいっているようですので、パソコンからroombaへの送信の回路は問題ないでしょう。センサーが読めないのは、roombaからパソコンへの送信が出来ていないからだと思います。roombaコネクターの4番ピンがroombaからの送信になっているので、この辺りの回路を確認することをお勧めします。
投稿: ササガワ | 2014年1月 9日 (木) 21時16分
前回、回答して頂きありがとうごうざいます。
現状として、相変わらずセンサ値を取得できない状況です。
回路の見直しや、配線の通電チェックなど行いましたが、特にミスがないように思います。
現在RoombaTESTERのアプリケーションを,Arduinoマイコンを介して、USBケーブルによって
PCから命令を送信し、使用しています。
配線状況として、Roombaからのセンサ応答がある4ピンをArduino側の0ピン(RXD)へ、
PCからRoombaへの命令を送信する3ピンをArduino側の1ピン(TXD)へ、
Roomba側からのGNDは、Arduino側のGNDへ接続を行っています。
センサ値が取得できない原因として、Roomba側の故障なのではないかとも考えています。
それとも,Arduino側に何か問題が考えられるのでしょうか。
何か解決方法をご存知でしたら、コメントいただけると助かります。
投稿: 前回の質問者 | 2014年1月11日 (土) 16時41分
なるほど、アルディーノでUSB-シリアルの変換をしているのですね。roombaとの通信は115Kbpsとかなりの高速です。普通のアルディーノはあまり高速ではないので、受信データ(温度なら1バイト)を取りこぼしている可能性があります。なにせ、90usくらいで受信したデータをUSBに送信しなければなりません。この辺をしらべるのもいいですが、デジタルオシロがないと、なかなか難しいかと思います。
手っ取り早いのは、秋月の「FT232RL USBシリアル変換モジュール」を使って、きちんとPCとUSB接続することです。本ブログの「ご家庭のroombaを実験用ロボットにする(おしまい)」に回路図があります。これのラップトップI/Fの部分だけ作ればよいです。電源部分は作る必要はありません。ごく簡単ですし、お金もあまり掛かりません。
投稿: ササガワ | 2014年1月11日 (土) 21時27分
こちらの質問に対して、詳しく回答して頂き、ありがとうございました。
回答内容を参考にし、FT232RLを利用したところ、Roombaのセンサ値を取得することができました。
現在、取得したセンサ値を利用して,Roombaの制御に取り組んでいます。
たくさん参考になるコメントを頂き、ありがとうございました。
投稿: 前回の質問者 | 2014年1月17日 (金) 18時23分