アイボ OPEN-Rプログラム開発

このページは開発成果などではなく、アイボとOPEN-Rを使った開発の手順を簡単に記載するものです。 時間が経つと意外と操作手順を忘れてしまうものなので、備忘録として記する。

Cygwin上のプログラムソースのディレクトリ構造を示す。この「LookBite」の場合、「IKRobot」と「LookBite」の二つのオブジェクトを使う。

上記のディレクトリにてmake作業を行う。

コマンド及びメモリースティックへのファイルコピー作業は以下のとおり、Iドライブがメモリースティックのドライブ

> make
> make install
> cp -r ms/open-r i:

コンソールはTelnetで接続する。アイボのIPアドレスが192.168.1.107の場合、

> telnet 192.168.1.107 59000

となる。ポートは59000となっている。

無線LAN設定は /MS/OPEN-R/SYSTEM/CONF/WLANCONF.TXT で設定する。設定例を示す。

HOSTNAME=PEPPER
ETHER_IP=192.168.1.107
ETHER_NETMASK=255.255.255.0
IP_GATEWAY=192.168.1.1
ESSID=SHIMADA
WEPENABLE=0
WEPKEY=
APMODE=1
#APMODE=2
CHANNEL=3

起動するオブジェクトは /MS/OPEN-R/MW\CONF/OBJECT.CFG で指定する。 例を示す。

/MS/OPEN-R/MW/OBJS/POWERMON.BIN
/MS/OPEN-R/MW/OBJS/LOOKBITE.BIN
/MS/OPEN-R/MW/OBJS/IKMOVE.BIN

オブジェクト間の接続は /MS/OPEN-R/MW\CONF/CONNECT.CFG で指定する。 例を示す。

#
# LookBite <-> ovirtualRobotComm
#
OVirtualRobotComm.FbkImageSensor.OFbkImageVectorData.S LookBite.Image.OFbkImageVectorData.O
OVirtualRobotComm.Sensor.OSensorFrameVectorData.S LookBite.Sensor.OSensorFrameVectorData.O
LookBite.Joint.OCommandVectorData.S OVirtualRobotComm.Effector.OCommandVectorData.O

#
# IKmove <-> ovirtualRobotComm
#
IKmove.Move.OCommandVectorData.S OVirtualRobotComm.Effector.OCommandVectorData.O
OVirtualRobotComm.Sensor.OSensorFrameVectorData.S IKmove.Sensor.OSensorFrameVectorData.O

#
# lookBite <-> ikRobot
#
LookBite.Direction.DirectionToIKM.S IKmove.ReceiveDirection.DirectionToIKM.O
IKmove.SendResult.ResultToHV.S LookBite.Result.ResultToHV.O

■プログラムソースの準備

□ OCFファイル(オブジェクト名.ocf)

オブジェクトに関する設定を行う。例の場合だと、OCFファイル名は「lookBite.ocf」

object lookBite 3072 16384 128 cache tlb user

□ stub.conf

オブジェクト間通信のために使用する、サブジェクトとオブザーバーの指定を行う。 

ObjectName : IKmove
NumOfOSubject : 2
NumOfOObserver : 2
Service : "IKmove.Move.OCommandVectorData.S", null, Ready()
Service : "IKmove.Sensor.OSensorFrameVectorData.O", null, NotifySensor()
Service : "IKmove.ReceiveDirection.DirectionToIKM.O", null, Execution()
Service : "IKmove.SendResult.ResultToHV.S", null, null

Extra : ListenCont()
Extra : SendCont()
Extra : ReceiveCont()
Extra : CloseCont()

サブジェクトもオブザーバーも最低1つは作らなければならない。オブジェクト間通信が不要な場合は下の例のようにダミーを作成する。

ObjectName : HelloWorld
NumOfOSubject : 1
NumOfOObserver : 1
Service : "HelloWorld.DummySubject.DoNotConnect.S", null, null
Service : "HelloWorld.DummyObserver.DoNotConnect.O", null, null

■オブジェクト間通信を使ったプログラムの概要

オブジェクト間通信を使ったイベントドリブン型プログラムなので、メッセージが途切れたところで動作が止まってしまう。
仕組みを理解して、動作が止まったりしないように構成しなければならない。

下記にしめる例ではオブジェクトAからBへのデータの送信と、オブジェクトBからAへのデータの送信が行われる。 それぞれ、@〜Aの流れに沿ってA→Bのデータが流れ、B〜Cの流れに沿ってB→Aのデータが流れる。

DoStart()にて全てのオブザーバーが通信先のサブジェクトに対してアサートレディーを送る。 実際にはオブジェクトの起動のタイミングなどによってメッセージが途切れてしまうことがあるので状況によってはアサートレディーを別途送らなければならない場合もある。

下の例では二つの流れが同時に進行することになるが、一つのオブジェクト内で呼び出される関数は一つである。(シングルスレッドなので) キー入力待ちなどでオブジェクトの動作が止まった場合、他の通信も止まってしまうことに注意しなければならない。 別のオブジェクトは止まらないが(マルチプロセスなので)下の例の場合はReady()がキー入力待ちで止まっている間は、Notify()が呼び出されることは無いため、B→Aの通信も止まってしまう。

NotifyObserver()を送るのはReady()でなくても構わないし、AssertReady()を送るのはNotify()からでなくてもよい。

CONNECT.CFG:
ObjectA.DataSend.data.S ObjectB.DataReceive.data.O

ObjectB.ResultSend.rslt.S ObjectA.ResultReceive.rslt.O
ObjectA:
DoStart()

 ENABLE_ALL_SUBJECT;
 ASSERT_READY_TO_ALL_OBSERVER; →B


Ready() ←@
{
  …
  …
 subject[sbjDataSend]->SetData(str, sizeof(data));
 subject[sbjDataSend]->NotifyObservers(); →A
}

Notify() ←C
{
  …
  …
observer[obsResultReceive]->AssertReady(); →B
}


ObjectB:
DoStart()

 ENABLE_ALL_SUBJECT;
 ASSERT_READY_TO_ALL_OBSERVER; →@


Ready() ←B
{
  …
  …
 subject[sbjResultSend]->SetData(str, sizeof(rslt));
 subject[sbjResultSend]->NotifyObservers(); →C
}


Notify() ←A
{
  …
  …
observer[obsDataReceive]->AssertReady(); →@

}