アイボ 頭部

2006.11.15 初

■目次

  1. 頭部オブジェクトについて
  2. 各クラスについて
  3. 構造体
  4. 型・状態変数
  5. 定数
  6. アイボヘッドコントローラ
  7. 課題

■1 頭部オブジェクトについて

頭部オブジェクトは物体認識・頭部関節制御・顎関節制御を行う。更には画像処理より行動を決定し、歩行オブジェクトへ指令を出す。

class LookBite : public OObject {
public:
LookBite();
virtual ~LookBite() {}

OSubject* subject[numOfSubject];
OObserver* observer[numOfObserver];

virtual OStatus DoInit (const OSystemEvent& event);
virtual OStatus DoStart (const OSystemEvent& event);
virtual OStatus DoStop (const OSystemEvent& event);
virtual OStatus DoDestroy(const OSystemEvent& event);

void NotifyImage(const ONotifyEvent& event);
void NotifySensor(const ONotifyEvent& event);
void Ready(const OReadyEvent& event);
void ResultReceive(const ONotifyEvent& event);

//Server関連
void ListenCont (void* msg);
void SendCont (void* msg);
void ReceiveCont(void* msg);
void CloseCont (void* msg);
//Server関連ここまで

private:
static const size_t NUM_COMMAND_VECTOR = 4;
static const size_t NUM_SENSOR_VECTOR = 2;
static const size_t NUM_JOINTS = 4;
static const size_t NUM_FRAMES = 5;
static const double FIELD_VIEW_H = 56.9;
static const double FIELD_VIEW_V = 45.2;

static const size_t NUM_PROCESS = 6;
static const int OBJ_RECOGNITION = 0;
static const int OBJ_TRACKING = 1;
static const int OBJ_APPROACH = 2;
static const int OBJ_ADJUST = 3;
static const int OBJ_PRE_BITE = 4;
static const int OBJ_BITE = 5;


void OpenPrimitives();
void NewCommandVectorData();
void SetJointGain();
void AdjustDiffJointValue();
RCRegion* FindFreeRegion();

void InitSensorIndex(OSensorFrameVectorData* sensorVec);
void GetHeadAngle(longword frameNum, IKangle &h);

double SetJointValue(int);
void Execution(int index);

byte* SetCDTImage(const OFbkImage& cdtImage, int& size, int& width, int& height);
byte* SetMonoImage(const OFbkImage& color, int& size, int& width, int& height);
byte* SetYrbImage(OFbkImageInfo* info, byte* image, int& size, int& width, int& height);
bool MakeMoveObject(const screenObjectInfo &so, screenObjectInfo &nso);
byte* ForecastObjectMove();
bool CalcDxDy(screenObjectInfo &so, int sclx, int scly);
byte* DivisioningImage(OFbkImageInfo* info, byte* image, int& size, int& width, int& height, int t);
void ExtractObject(byte* image, vector<screenObjectInfo>& ol);

bool MatchScreenObject(screenObjectInfo &soi, map<byte, word> &skipmap, int &match_index);
bool DuplicationScreenObject(const screenObjectInfo &so, int &idx);
void CalcDimentionObjectCentroid(const dimentionObjectInfo &doi, int &x, int &y);
int PosToObject(int x, int y);

byte* HeaderPackingBMP(byte *image, int& size, int width, int height);
byte* SetLineData(const char* header, list<Gline> &gline, int &size, byte mode); //幾何系データ
byte* SetTextData(const string text, int &size); //テキストデータ
void SetCdtVectorData();
bool ReadCdtTable(const char* path);
//Server関連
OStatus Listen (int index);
OStatus Send (int index);
OStatus Receive(int index);
OStatus Close (int index);
OStatus InitTCPConnection(int index);

void SetReceiveData(int index);
void SetSendData(int index, void* ptr, int size, const char* header);
void SetSendData(int index, byte* ptr);
void SetSendData(int index, list<void*> &ptrl, list<int> &sizel); //複合データタイプ

//Server関連ここまで

LookBiteState lbs;
OPrimitiveID fbkID;
OPrimitiveID jointID[NUM_JOINTS];
RCRegion* region[NUM_COMMAND_VECTOR];
bool initSensorIndex;
int sensoridx[NUM_JOINTS];
list<RCRegion*> sensorRegions;
static const size_t LINEBUFSIZE = 256;
static const size_t TXTBUFSIZE = 8;

double upper;
double lower;

//Server関連
antStackRef ipstackRef;
TCPConnection connection[COMMSERV_CONNECTION_MAX];
//Server関連ここまで

Head head;
Mouth mouth;
Posture posture;
longword pstr_fn;
ResultType ikmStatus;

//画像関連
int cycle; //イメージデータ転送頻度
int monitor; //イメージデータ転送スイッチ
byte object[10];
byte value[10];
IDataType idtype;
Filter ifilter;

//CDT関連
vector<int*> cdt_table;

//幾何データ表示
string geoMode;
//動作制御
processManageData pmd[NUM_PROCESS];
//画像処理モード
bool reduction; //物体認識時に物体整理をするかどうか。
bool forecast; //物体の移動予測
bool dynamic; //動体分析スイッチ。
bool substitution; //オブジェクト代替処理
bool approach; //物体に近づく。
//画像処理用パラメータ
int div_img_threshold; //同輝度判定の閾値
int obj_area_adj; //オブジェクト範囲の調整幅
int obj_area_diff; //オブジェクト範囲の調整幅(移動予測オブジェクト生成時との差)
int obj_overlay_dup_rate; //分割されてしまったオブジェクトを判別するための重複率(%)(縦または横)
int obj_duplication_dup_rate; //移動予測オブジェクトの重複判断時の重複率(%)(縦及び横)
int obj_duplication_color_tl; //移動予測オブジェクトの重複判断時の色ずれ許容値
int mvobj_life; //移動予測オブジェクトの寿命
char ymin_delay; //移動予測オブジェクト生成時の猶予値
char ymax_delay; //移動予測オブジェクト生成時の猶予値
unsigned int linerTable[17];
double tracking_speed; //トラッキング時の関節移動速度(deg/frame);

//物体認識
vector<screenObjectInfo> screen_objects[2];
vector<screenObjectInfo> lost_screen_objects;
int this_time;
int last_time;
byte *this_img, *last_img;
// vector<dimentionObjectInfo> dimention_objects;
map<word, dimentionObjectInfo> dimention_objects;
map<word, word> substitutionID; // <fromID, toID>
int obj_pos_cmp_threshold; //フレーム間オブジェクト照合の位置の閾値
int obj_pos_cmp_difflevel; //フレーム間オブジェクト照合の位置の第二閾値
int obj_clr_cmp_threshold; //フレーム間オブジェクト照合の色の閾値
int obj_clr_cmp_difflevel; //フレーム間オブジェクト照合の色の第二閾値
int obj_losttime_limit; //オブジェクト見失い猶予期間

list<word> target_id_list;
targetObject tgt_obj;

};

■2 各クラスについて

■ Head
class Head {
public:
 Head();
 ~Head() {}

 HeadData indicate; //指示値
 HeadData real; //実値
 CameraPosture pstr_ang; //姿勢(角度)0:tilt 1:pan 2:roll

 void SetTarget(double, double, double);
 void SetTarget(HeadData &);
 void SetMode(HeadMoveMode, double);
 void Reset(); //first を true に
 double Next();
 IKpos GetGravityPoint();
 void CalcCameraPosture(double bodytilt); //realの値から、post_ang(カメラ姿勢角度)を計算する。

private:

 HeadData start;
 HeadData target;

 HeadMoveMode mode;
 double speed;
 bool first; //初回ならtrue

 HeadPos upos; //フレーム当りの移動座標
 HeadAngle uangle; //フレーム当りの移動角度

 double frame; //残りフレーム数

 //// その他 ////
 int verbose; //メッセージ出力レベル
};

■3 構造体

       

■4 型・状態変数

       

■5 定数

       

■6 アイボヘッドコントローラ

フォーム左側は頭部関節制御・中央は顎関節制御。右下のテキストボックスは汎用コマンド入力用。 コマンドは「コマンド」の項による。



■カメラモニターフォーム
BMP RGB画像
YRB YCrCb画像
MONO モノラル画像 3つめのコンボ 0:Y 1:Cr 2:Cb 3:オブジェクト
(3:は物体認識時のみ)
CDT CDT画像 表示チャンネルは3つ目のコンボで決定
LINE 未実装
NONE フィルターなし
EDGE エッジ処理
REGION 領域分割
HOUGH ハフ変換
OBJECT

スライダーでコントラストを調整できる。 ホワイト:上側 ブラック:下側。 ホワイトを0にすればコントラストOFF



■胴体操作フォーム


■コマンド
HEAD 頭部姿勢指示
 0 直交座標指定
  x y z
 1 角度指定
  tilt1 pan tilt2
MOUT 顎動作指示
 angle mode speed
 angle:deg(整数)
 mode: 0:LINEAR(mm/s) 1:ROUND(deg/s) 2:FRAME(frame/s)
 speed: 単位はmodeで指定。
BITE 咥える動作指示
 power threshold speed
 power:指示角度と現在角度の差(deg)
 threshold:閾値 咥える動作失敗を判断(deg)
 speed:顎動作速度(deg/s)
RELS 放す動作指示
 angle speed
 angle:deg
 speed:deg/s
TRCK 未実装
STOP 動作停止
MOVE 歩行(連続)
 speed x y angle step walk standing
WALK 歩行(歩数指示)
 speed cx cy step walk standing
MOTN モーション再生
 motion
SWCH 姿勢移行
 speed dx dy thita1 thita2 height
AJST 微調整
 speed angle cx cy cycle
IMOD 画像モード
 type
 0:idtBMP RGB画像
 1:idtYRB YRB画像
 2:idtMONO モノクロ画像
 3:idtCDT CDT画像
 4:idtLIN 線分データ(未実装)
 5:idtRCT 矩形データ(未実装)
 6:idtTXT テキストデータ(未実装)
IFLT 画像フィルター
 0:fNone フィルターなし
 1:fEdge エッジ処理
 2:fRegion 領域区分処理
 3:fHough ハフ変換
 4:fObject
IDAT
 ID object[ID]
 :モノクロ画像の時(フィルターなし)
 0:Yチャンネル
 1:Crチャンネル
 2:Cbチャンネル
 3:物体表示(物体認識ONの時)
 :CDT画像の時
 0〜7チャンネル
 :フィルターがエッジの時
 0〜4 エッジ強調レベル
VDAT
 ID value[ID]
 :モノクロ画像の時(フィルターなし)
 「value[0]>0」かつ「value[0]<value[1]」ならコントラスト調整が有効になる。
 value[0]:black level
 value[1]:white level
 ※モノクロ画像表示時しか調整が効かない。
CYCL イメージデータ転送頻度
 cycle
MNSW イメージデータ転送スイッチ
 bool
CMND コマンド
 geo 線画データ送信
  mode
  "CONTRAST" コントラスト モノクロ画像時コントラストグラフ表示
  "HISTGRAM" ヒストグラム モノクロ画像時ヒストグラム表示
  "LINERIZE" リニアライズグラフ表示 モノクロ画像時リニアライズグラフ表示
 value
  threshold 同輝度判定の閾値
   div_img_threshold
  linertable リニアライズテーブルの数値更新
   id linerTable[id]
  areaadj オブジェクト範囲の調整幅
   obj_area_adj
  adjdiff オブジェクト範囲の調整幅(移動予測オブジェクト生成時との差)
   obj_area_diff
  cmpobject
  overlyarate 分割されてしまったオブジェクトを判別するための重複率(%)(縦または横)
   obj_overlay_dup_rate
  duplicationrate 移動予測オブジェクトの重複判断時の重複率(%)(縦及び横)
   obj_duplication_dup_rate
  duplicationcolor 移動予測オブジェクトの重複判断時の色ずれ許容値
   obj_duplication_color_tl
  objposcmpth フレーム間オブジェクト照合の位置の閾値
   obj_pos_cmp_threshold
  objposcmpdl フレーム間オブジェクト照合の位置の第二閾値
   obj_pos_cmp_difflevel
  objclrcmpth フレーム間オブジェクト照合の色の閾値
   obj_clr_cmp_threshold
  objclrcmpdl フレーム間オブジェクト照合の色の第二閾値
   obj_clr_cmp_difflevel
  objectlife 移動予測オブジェクトの寿命
   mvobj_life
  ymindelay 移動予測オブジェクト生成時の猶予値
   ymin_delay
  ymaxdelay 移動予測オブジェクト生成時の猶予値
   ymax_delay
  trackspeed トラッキング時の関節移動速度(deg/frame)
   tracking_speed
switch
 recognition 物体認識スイッチ
  bool (boolは1か0)
 track 物体追尾スイッチ
  bool
 approach 物体にアプローチスイッチ
  bool
 bite 物体を咥えに行くスイッチ
  bool
 reduction 物体認識時に物体整理をするかどうか
  bool
 forecast 物体の移動予測スイッチ
  bool
 dynamic 動体分析スイッチ
  bool
 subst オブジェクト代替処理
  bool
SLPT 追尾したい物体の座標指示 指示した座標に物体があれば追尾開始
 x y