アイボ 頭部 |
2006.11.15 初
■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