■センサーで目標を探す(KRS788使用)①
ビーチフラッグや、自律バトル競技など、自律ロボット競技に参加するためには、目標を探す処理が必要になります。今回はKRS788を頭部に使用して物体を探すプログラムを解説します。
・目標を探すには
目標を探す方法のひとつに、頭部を旋回している間に一定のタイミングでアナログ値を読み取り、最大値を求めるという方法があります。PSDセンサーや超音波センサーは、物体が近いほど高い値を示します。ビーチフラッグや自律バトル競技の場合、フィールド上で最も近い物体が目標になる確率が高いので、読み取った値の最大値を目標と判断し、その方向へ近づくプログラムを組みます。

(画像1 クリックで拡大)
画像1はロボットが目標を探しているところを、上から見た図です。0~24の番号はアナログ値を取るタイミングと順番です。
・プログラム作成の流れ
1) 頭部を180°旋回させるモーションをつくり、その動作時間を計る
2) 頭部が旋回している間にセンサーの値を読み取る
3) どの物体が一番近いのかを求める
4) ロボットを物体の方向に歩かせる
・用意するもの
1) 頭部を180°旋回させるモーションをつくり、その動作時間を計る
・モーション作成
まず、首を180°旋回するモーションをHeart to Heartで作成します。下記の三つのモーションを作ってください。
- モーション①. 頭部を正面(ホームポジション)から左に向かせる
- モーション②. 左に向いた頭部を180°旋回して右に向かせる
- モーション③. 右に向いた頭部を正面(ホームポジション)に向かせる
モーションを3つに分けた理由は、アナログ値を読むモーション②を別にして、読み込むタイミングを正確に取るためです。
・モーション②の移動時間を測る
左に向いている頭部が右へ動きだしたところから、右に向いて停止するところまでの時間を計ります。計った時間を分割してアナログ値を読む取るタイミングを取ります。
②へ続く
■2種類のモーション設定の違い
KCB-1とRCB-3をつないでのモーション再生方法は下記の2種類あります。
①コマンド再生 (rcb3_motion_play)
②コントロールコード再生 (rcb3_put_2Bcode / rcb3_put_7Bcode)
これらの再生方法には、Heart to HeartのオプションによるRCB-3の設定と、KCB-1とRCB3の接続に違いがあります。表1に違いをまとめたので、これを元に解説をしていきます。
RCB3のオプション設定とボードの接続方法 ()内は解説番号です。
| |
|
|
① rcb3_motion_play(コマンド再生) |
② rcb3_put_XBcode(コントロールコード再生) |
| Heart to Heart |
チェック項目 |
モーション終了時に返事をもらう |
○指定する(①-1)
|
×指定しない(②-1) |
| 送信機でのモーション・シナリオ再生を有効にする |
×指定しない(①-2) |
○指定する(②-2) |
| KRC-1から制御する |
△どちらでもよい(①-3) |
△2Byteのときのみ指定(②-3) |
| モーション選択項目 |
電源投入後、モーション・シナリオを再生する |
OFFを選択(start upはKCB-1から再生)(①-4) |
RCB-3から再生(②-4) |
| 通信ケーブル・ポート |
ケーブルの違い |
クロスケーブル |
接続ケーブル |
| RCB-3側接続ポート |
高速シリアルポート |
低速シリアルポート |
①コマンド再生
コマンド再生は高速シリアル通信でロボットを動かす関数です。再生方法は簡単ですが、モーション内分岐ができないため連続した動作ができません。
・Heart to Heartのオプション設定
- モーション終了の返事をもらってから次の処理に移るので、
「モーション再生終了時に返事をもらう」には必ずチェックを入れてください。
- 「送信機でのモーション・シナリオ再生を有効にする」にはチェックを入れないでください。RCB-3が受信機とつながっている場合に誤動作をする場合があります。
- 「KRC1から制御する」は低速シリアル通信の設定なので、チェックの必要はありません。
- 「電源投入時にモーション・シナリオを再生する」はOFF設定にして、スタートアップモーションはKCB-1から再生するようにしてください。
・通信ケーブルの種類と接続
ストレートケーブルで接続をすると、KCB-1の送信とRCB-3の送信、受信と受信がぶつかり、通信ができないため、接続にはクロスケーブルを使います。
・電源について
電源はKCB-1のシリアルポートとRCB3の空いているサーボ端子を接続してください。その際、通信線(白線)を必ず抜いてください。
②コントロールコード再生
コントロールコード再生は送信機と同じコマンドを低速シリアルで通信して、ロボットを動かす関数です。モーション内分岐ができるため連続歩行などが可能ですが、モーション終了後に返事が返ってこないため、プログラムに工夫が必要です。
・Heart to Heartのオプション設定
- コントロールコード再生のときはモーション終了の返事が来ないため、「モーション終了時に返事をもらう」にチェックの必要はありません。
- KCB-1は送信機と同じコマンドをRCB-3の低速シリアルに送信してモーションを再生するので、「送信機でのモーション・シナリオ再生を有効にする」にチェックを入れてください。
- 2Byteモードでモーションを再生するときは「KRC1から制御する」にチェックを入れてください。7Byteモードで再生するときはチェックをはずします。
- 「電源投入時にモーション・シナリオを再生する」を設定し、KCB-1起動後にstart upモーション再生終了を待ちます。KCB-1から再生してもかまいませんが、RCB-3のが起動するまでしばらく待つ必要があります。
・通信ケーブルの種類と接続
通常の接続ケーブルをKCB-1のCOMポートとRCB3の低速シリアル接続端子に接続してください。
・電源について
電源はKCB-1のシリアルポートとRCB3の空いているサーボ端子を接続してください。その際、通信線(白線)を必ず抜いてください。
■超音波センサー(受信部)
KHR4thアニバーサリーにて行われる自律ビーチフラッグ大会に、心強い味方「USRX-1 超音波センサー(受信部)」が発売されます!
フラッグから発信する中心周波数40kHzの超音波を受信し、フラッグの位置を知るためのセンサーです。
このセンサーは、KCB-1のアナログポートに差し込み、関数を書き込めばすぐにアナログ値を検出できます。また、約5mまでならフラッグの方向を検出できますので、サッカーコートのどこにいてもフラッグを見つけることが可能です。
また、USTX-1 超音波センサー(送信部)の発売も予定されていますので、ご自宅での実験も可能です。
販売はロボスポット限定です。また、KHRの頭部に取り付けの際は専用のフレームもありますので是非ご利用ください!

■自律ロボット作例
今回は自律ロボットの作例を紹介します。
使用センサー:
-
SHARP社製GP2D12 PSD距離計測センサー(頭部 x 1、 足部先端 x 2)
(現在はGP2Y0A21YK0Fが販売されております)
両足のセンサーで壁を検知し、頭部のセンサーで目標を探します。肩部の加速度センサーは起き上がりの分岐に使用しています。また、腰関節をピボットターンユニットに交換することによって、KHR-2HVの細かい旋回を可能にしました。
自律ロボットの詳しい情報はこちらをご覧ください。
<自律ロボット制作例マニュアル>
ビーチフラッグ用のサンプルプログラムも公開しています。下からダウンロードしてください。
<サンプルプログラム ダウンロード>
今大会はセンサーの制限はありませんので、競技レギュレーションに準拠していればどんなセンサーも実装可能です(*1。
フラッグ(目標)には超音波送信機を実装しています。この信号を頼りにフラッグの位置を認識するのもいいし、フラッグ表面の赤を認識して探すのもいいかもしれません。
*1 機体から超音波を送信することは禁止ですので注意してください。
■RCB3のモーション再生(コマンド再生) (3)
今回は、rcb3_motion_play( )の特別な機能を紹介します。
ロボットがモーションを再生している間、KCB-1はモーション再生終了の信号が来るまで次の処理に進めません。実は、モーション再生中のKCB-1は手が空いている状態で、命令を送れば別の動作が可能です。この時間を利用してKCB-1に一つ処理をさせます。
#include <led.h>
#include <rcb3.h> // モーション再生に必要
#include <ad.h>
int adv;
void get_ad(void)
{
adv = ad_read(1);
}
void main(void)
{
cpu_init (); // CPUの初期設定を行います
ledgrn_on (); // 電源ON
wait (300000); // RCB-3の電源が安定するまで待ちます
// RCB3との通信設定を行います // スタートアップモーションを終了するまで待ちます
if (rcb3_open (80) == FALSE) { // RCB3とポートを接続します
ledred_on (); // スタートアップモーション80を再生できなかった場合
return; // 赤LEDを点灯して、プログラムは終了します
}
// スタートアップモーション終了後にモーション14番を再生します
rcb3_motion_play (14, get_ad);
}
プログラムは前回のものを使用しています。
motion_play関数の第2引数に関数名を指定(引数無し、返値無し)すると、モーション再生中に指定した関数が実行されます。つまり歩きながらセンサーの値を読み込むこともできるのです。
注意すべきことは、指定する関数はモーション再生が完了し、RCB-3から返事が返ってくる前に処理を終了しなければならないことです。そうしないとRCB-3からの返事をうまく受け取れずに、モーション再生が終了したかどうか分からなくなってしまいます。
センサー以外にも、PIOポートにLEDを接続して点灯パターンを関数化し、それを歩行モーション番号と一緒に書き込むことで歩行しながらイルミネーション点灯、ということも面白いと思います。お試しください。
■RCB3のモーション再生(コマンド再生) (2)
今回はKCB-1からRCB-3のモーションを再生するプログラムを紹介します。
以下はサンプルプログラム(RCB3_MotionPlay)から要点を抜粋したものです。
#include <led.h>
#include <rcb3.h> // モーション再生に必要
void main(void)
{
cpu_init (); // CPUの初期設定を行います
ledgrn_on (); // 電源ON
wait (300000); // RCB-3の電源が安定するまで待ちます
// RCB3との通信設定を行います
// スタートアップモーションを終了するまで待ちます
if (rcb3_open (80) == FALSE) { // RCB3とポートを接続します
ledred_on (); // スタートアップモーション80を再生できなかった場合
return; // 赤LEDを点灯して、プログラムは終了します
}
// スタートアップモーション終了後にモーション14番を再生します
rcb3_motion_play (14);
}
このプログラムでは、スタートアップモーション(80)の再生後に、続けてモーション番号14番を再生します。
rcb3_openはRCB-3とのシリアル接続通信の設定を行った後に、引数に指定したモーション番号(例では80)をスタートアップモーションとして再生します。ここに0を指定すると、モーションは何も再生されず、通信設定だけを行います。
モーション番号は、例えばM1なら1、S1は81と指定します。
接続設定と、スタートアップモーションの再生が終わったら、rcb3_motion_play関数で好きなモーションを再生して(例では14)下さい。rcb3_motion_play関数を続けて書けば、順番にモーションが再生されます。
ぜひお試し下さい。
■RCB3のモーション再生(コマンド再生)(1)
今回は、rcb3_motion_play関数を使って、KCB-1からRCB-3のモーション再生を行う準備をします。
モーションを再生中に別のモーションを再生すると、ロボットが転んだりするなど、うまく動作できなくなるため、KCB-1ではモーションが終了したことを確認してから、次のモーションを再生するようになっています。
そこで、まずはHeartToHeartを起動して、オプション画面で「モーション再生終了時に返事をもらう」にチェックを入れてください。これでKCB-1もモーション再生中か、そうでないかが分かるようになります。
そしてスタートアップモーションはKCB-1から再生※しますので、「電源投入時にスタートアップモーションを再生する」の項目はOFFにしておきます。
ここまででRCB-3の設定は終了です。

次に、「KCB-1のKHR-HVシリーズの実装例」で紹介した、クロスケーブルを接続して下さい。これでロボットの設定は終了です。次はいよいよモーション再生プログラムの実行です。
※RCB-3でスタートアップモーションを再生することもできますが、KCB-1が最初のモーション再生命令を送信する前にスタートアップモーションが終了していなくてはなりません。
■KCB-1のKHR-HVシリーズ実装例
今回はKCB-1のKHR-HVシリーズへの実装例を紹介したいと思います。
KCB-1とRCB-3の横方向の取り付け穴寸法は同じですので、RCB-3を左右どちらかにずらしてあげれば簡単に実装することができます。

KCB-1の電源は、RCB-3の空ている出力ポートとKCB-1の空いているSIOポートを接続ケーブルでつないでください。この際、余計な信号を送受信しないようにどちらかの白線、またはボードに対して一番内側の線は外しておきます。外したケーブルのピン部分にはビニールテープなどを巻いてショートしないように気をつけてください。
下の画像の赤いコネクタのケーブルは、KCB-1とRCB-3のシリアル通信用クロスケーブルです。ボードのCOMポート同士を接続しています。