シンクロ

前のページ
目次
次のページ


このページの内容


シンクロとは

 シンクロとは、シンクロナイズドスイミングという競技にもあるように、複数の物がタイミングを合わせて動くことです。
 日本語では同期という意味になります。
 複数のアイボをタイミングを合わせて動かしたい場合に使用します。
 例えば、複数のアイボにタイミングを合わせてダンスさせたい場合などです。
 シンクロさせるには、パソコンから複数のアイボに対して同期の合図を送信します。
 アイボは合図を受け取ると、同時に動き始めます。


プログラム

 ここでは「状態機械によるモーション実行」の章で説明した MyStateMotion.h を改造してシンクロのプログラムを作ります。
 MyStateMotion.h で、「伏せ」の状態で待機し、合図が来たら「座り」に遷移するように改造しましょう。


 例: 同期プログラム MyStateSync.h

 パソコンからの合図を受信するための部品ファイル StartCommFromPC.h をインクルードします。

   #include "StartCommFromPC.h" // PCから合図を受信するための部品ファイル

 パソコンからの合図を受信するためのオブジェクト fromPC を protected 変数として定義します。

   StartCommFromPC fromPC; // PCからの合図を受け取るオブジェクト

 アイボは合図を TextMessageEvent として受信します。
 したがって、合図をもとに動かしたい部分を TextMessageEvent の遷移として記述します。

   // PCからの合図(TextMessageEvent)による遷移(伏せ→座り)
   EventTrans * textTrans = new EventTrans(sit_node,EventBase::textmsgEGID);
   lie_node->addTransition(textTrans);

 DoStart() 関数の中で、fromPC をスタートさせます。

   fromPC.DoStart(); // fromPCオブジェクトをスタート

 DoStop() 関数の中で、fromPC をストップさせます。

   fromPC.DoStop(); // fromPCオブジェクトをストップ

#ifndef INCLUDED_MyStateSync_h_	// このファイル INCLUDED_MyStateSync_h_ が定義されていなければ
#define INCLUDED_MyStateSync_h_	// このファイル INCLUDED_MyStateSync_h_ を定義する

#include "Shared/ERS7Info.h"	// AIBOの機種(ERS7)に関する部品ファイル
#include "Shared/WorldState.h"	// 状態を監視するための部品ファイル
#include "StateHeader.h"		// 状態と遷移に必要な部品ファイル
#include "StartCommFromPC.h"	// PCから合図を受信するための部品ファイル

// クラス MyStateSync
class MyStateSync : public StateNode {
protected:
	StateNode * start_node; // start_nodeは、クラス全体で使用するのでココに定義する
	StartCommFromPC fromPC; // PCからの合図を受け取るオブジェクト

public:
	// コンストラクタ
	MyStateSync() : StateNode("MyStateSync"), start_node(NULL), fromPC() {}

	// デコンストラクタ
	~MyStateSync() {
		if(issetup)
			teardown();
	}

virtual void setup() {

	// 親クラスStateNodeのsetup()関数を呼ぶ
	StateNode::setup();

	// 伏せノード作成
	StateNode * lie_node = new SmallMotionSequenceNode("Lie","lielie.mot");
	addNode(lie_node);

	// 座り姿勢ノード
	StateNode * sit_node = new SmallMotionSequenceNode("Sit","sitsit.mot");
	addNode(sit_node);

	// 立ち姿勢ノード
	StateNode * stand_node = new MediumMotionSequenceNode("Stand","sitwalk.mot");
	addNode(stand_node);

	// 頭ニュートラル_ノード
	StateNode * headneutral_node = new SmallMotionSequenceNode("HeadNeutral","headneut.mot");
	addNode(headneutral_node);

	// 立ち→座りモーション_ノード
	StateNode * standsit_node = new MediumMotionSequenceNode("StandSit","standsit.mot");
	addNode(standsit_node);

	// スタートは伏せ姿勢
	start_node = lie_node;

	// PCからの合図(TextMessageEvent)による遷移(伏せ→座り)
	EventTrans * textTrans = new EventTrans(sit_node,EventBase::textmsgEGID);
	lie_node->addTransition(textTrans);

	// 遷移(座り→立ち→頭正面)
	sit_node->addTransition(new CompletionTrans(stand_node));
	stand_node->addTransition(new CompletionTrans(headneutral_node));

	// 頭正面の状態で1秒経過したら立ち→座り
	headneutral_node->addTransition(new TimeOutTrans(standsit_node,1000));

}

virtual void DoStart() {
	StateNode::DoStart();
	start_node->DoStart();
	fromPC.DoStart();	// fromPCオブジェクトをスタート
}

virtual void DoStop() {
	StateNode::DoStop();
	fromPC.DoStop();	// fromPCオブジェクトをストップ
}

virtual void teardown() {
	StateNode::teardown();
}

private:  // コンパイル時の警告を避けるためのダミー関数
	MyStateSync(const MyStateSync&);
	MyStateSync operator=(const MyStateSync&);
};

#endif

 秀丸を開き、上記プログラム(背景が黄色)をコピー&貼り付け、次の通り保存してください。

    保 存 先 : マイドキュメント → usXX → project
    ファイル名 : MyStateSync.h
    ファイル種類: C言語ヘッダーファイル(*.h)

 次に、合図を送信するためのプログラムを準備します(この準備は1度やれば、2度目は不要です)。


  1. ここをクリックして、ウィンドウが開いたら保存ボタンを押してデスクトップにダウンロードして下さい。
  2. デスクトップにダウンロードした sync.EXE をダブルクリックして解凍してください。
  3. 解凍すると、デスクトップに sync というフォルダができます。
  4. syncフォルダを次のフォルダの中に入れてください。
        マイドキュメント → usXX
 MyStateSync をTekkotsuに組み込んでください。同じプログラム名ならば1度組み込めばOKです。

 コンパイルしてください。これはプログラムを修正するたびに必要です。

 動かすアイボの台数とIPアドレスを設定します。アイボの台数とIPアドレスが変わるたびに設定が必要です。


  1. 次のフォルダを開いてください。
        マイドキュメント → usXX → sync
  2. aiboip.txt を秀丸で開いて、アイボの台数とIPアドレスを設定してください。
    1行目・・・アイボの台数
    2行目・・・7777(ポート番号。変更不要)
    3行目以降・・・アイボのIPアドレス

    2台の場合の例↓
    2
    7777
    10.0.1.11
    10.0.1.12
    [EOF]
 実行してください。

 ただし、実行してもアイボは「伏せ」の状態で待機しますから、次のようにしてパソコンから合図を送信します。
 合図の送信方法はアイボが1台の場合と、2台以上の場合で異なります。

  • アイボが1台の場合
    コントロール画面の Send Input: 欄で、 !msg  を打ち込み、キーボードのEnterキーを押せば、アイボがスタートします。
  • アイボが2台以上の場合
    1. さきほど準備した 合図送信プログラムの出番です。
    2. 新たに Cygwin 画面を開いてください。
    3. Cygwin画面で次の通り打ち込んでください。
      us0X@xxxxx ~
      
      $ cd sync      
      us0X@xxxxx ~sync        
      
      $ java startaibo
    4. あとは、Cygwin画面に出る指示にしたがってください。


前のページ
目次
次のページ