Body MCU

シーケンスデータ

複数のサーボモータの協調運動をシーケンスといい、協調運動制御で使用するデータがシーケンスデータです。このデータをあらかじめ設定することにより一連の動作を自動的に行うことができます。

◀ この記事の前に: Motion sequencer( コード )
▶ この記事の次に: Servomotor driver( 概要 )

基本構造

ひとつのサーボモータの操作などを記述した「コマンド」が操作順に並べたデータがシーケンスデータです。

左の例は既定の姿勢「直立不動の姿勢( 気をつけ )」にするためのシーケンスデータです。

/*.... Sequence 1 ....*/
// Standat At Atention
struct CMD_SV svSqSTOP[]={
	{ SV_CMD_SET_SPEED, 4, 0 },
	{ SV_HD,  0, 1 },
	{ SV_AR,  0, 1 },
	{ SV_AL,  0, 1 },
	{ SV_FR,  0, 1 },
	{ SV_FL,  0, 1 },
	{ SV_LR,  0, 1 },
	{ SV_LL,  0, 1 },
	//.... end of one step ....
	{ SV_CMD_FINISH, 0, 0 }
};

シーケンスは複数設定できます。シーケンスを一覧にしたものがシーケンスリストです。シーケンスリスト、シーケンス、コマンドの関係は以下のとおりです。

コマンド

ひとつのサーボモータの操作を記述したデータです。サーボモータの操作指示以外に、シーケンスの流れの制御を指示するデータもあります。

構 造:

対象とするサーボモータの指定、動作後のサーボモータの軸の位置である目標角度、次のコマンドを実行するまでの待ち時間の3つの内容で構成します。

最初の svNo にはサーボモータの指定以外に他の操作を示す「指示」が入る場合もあります。

例は以下のとおりです。
 SV_HD: 頭部のサーボモータを
 0: 0(初期)の位置にして
 1: 1秒間待ってから次のコマンドに移る

コマンドの構造

コマンドの構造( コード )

//.... Element / motion command ....
struct CMD_SV {
	int		svNo;		// Target Servomotor
	int		svPos;		// Target Position
	int		period;		// Period by next motion
};			

コマンドの例

.... abbr. ....
	{ SV_HD,  90, 1 },
.... abbr. ....

種 類:

コマンドの種類は以下のとおりです。

  • 個別のサーボモータの指定
  • シーケンスの流れの制御
  • その他の制御の指定

最も多く使われるコマンドは、個別のサーボモータの指定です。シーケンスの流れの制御例は、基本構造のコード例の記述にある「SV_CMD_FINISH」です。このコマンドはシーケンスの終端を示すと同時に、その後に何もしないことを示しています。

その他の制御の指定は「可変パラメータ・シーケンスコマンド」があります。Qumcum Lab.の標準構成(サンプルプログラム)には搭載していませんが、他の可変要素を考慮しながら個別のサーボモータ制御を行うコマンドです。

コマンドの種類( svNo. )は右記のように割り当ています。

svNo.名 称対象 / 制御
0 ~ 8SV_HD, …. SV_FL操作の対象とするサーボモータ
20 ~ 28SV_HD_WK, …. SV_FL_WK可変パラメータ・シーケンスコマンド(一位はサーボモータの指定)
80SV_CMD_SET_SPEED基底速度を変更
99SV_CMD_FINISHシーケンスの終了
95SV_CMD_LOOPシーケンスを繰り返す
90SV_CMD_NEXT次のシーケンスを開始

記述方法:

コマンドの記述方法は以下のとおりです。

サーボモータの操作

記 述: Servomotor, Target position, Interval

  • Servomotor( 対象サーボモータ ): 操作の対象となるサーボモータ
    サーボモータの名称で指定します。名称は以下のとおりです。
  • Target position( 目標角度 ): 制御目標とするサーボモータの軸の角度
    サーボモータそのものの角度でなく、個々のサーボモータの取付位置や方向を考慮したロボットの部位としての角度です。サーボモータそのものの角度と分けるために「ポジション」と呼びます。
  • Interval( 待ち時間 ):この操作が開始してから次の操作を開始するまでの時間間隔
    操作が開始( 厳密には操作の指示 )が起点です。操作して動作が終了が起点ではありません。
    0 の場合は、次のコマンドを連続して実行します。

サーボモータの名称

名 称部 位
SV_HD頭部 / Head
SV_AR右腕 / Arm Right
SV_AL左腕 / Arm Left
SV_FR右足 / Foot Right
SV_FL左足 / Foot Left
SV_LR右脚 / Leg Right
SV_LL左脚 / Leg Left

足と脚の違い
足 / foot: 足首(ankle)より下の部分、足裏や足首から下の部分を指します。
脚 / leg: 足首(ankle)より上の部分、腿(もも)の付け根から足首までの部分を指します。

注 意: サーボモータの指定は名称で行います。
サーボモータの指定は内部では数字(番号)で行っています。部位とサーボモータの割り当てを分けることにより変更に対して柔軟に対応できるようにしています。( 名称と番号の対応表が別途あります。)
プログラム内ではサーボモータは一貫して名称で扱っています。番号で指定すると割り当てが異なった場合にエラーが発生する場合があります。

シーケンスの終了

記 述: SV_CMD_FINISH, 0, 0

  • SV_CMD_FINISH( フロー制御コマンド ): このコマンドでシーケンスを終了する。

シーケンスの繰り返し

記 述: SV_CMD_LOOP, 0, 0

  • SV_CMD_LOOP( フロー制御コマンド ): 最初から同じシーケンスを再び開始する。

次のシーケンスの開始

記 述: SV_CMD_NEXT, Next Sequence, 0

  • SV_CMD_NEXT( フロー制御コマンド ): 現在のシーケンスを終了して、指定したシーケンスを開始する。
  • Next Sequence: 次のシーケンスを指定

基底速度の変更

記 述: SV_CMD_SET_SPEED, Interval base, 0

  • SV_CMD_NEXT( フロー制御コマンド ): 基底速度を指定した速度に変更する。
  • Interval base: 変更する基底速度

シーケンス

コマンドを操作順( 時系列 )に並べたデータがシーケンスデータです。

構 造:

シーケンスデータはコマンドを操作順に並べたデータです。

コマンドの構造体を要素にした配列です。

左の例は既定の姿勢「直立不動の姿勢( 気をつけ )」にするためのシーケンスデータです。

最初に SV_CMD_SET_SPEED で基底速度を設定します。この例では 4に設定しています。
次に頭部のサーボモータ SV_HD を 0のポジションに設定しています。頭部の角度が 0以外のポジションの場合は 0になるように動作します。
その次に基底速度の時間単位で 1経過後に、右腕のサーボモータ SV_ARを 0のポジションに設定しています。右腕の角度が 0以外のポジションの場合は 0になるように動作します。

あとは順番に、左腕( SV_AL )、右足( SV_FR )、左足( SV_LR )、右足( SV_LL )が基底速度の時間単位でそれぞれ 1経過後に 0のポジションに設定しています。各サーボモータの角度が 0のポジションでない場合は 0になるように動作します。

最後のコマンドは、これでシーケンスが完了したことを示す SV_CMD_FINISHになっています。

シーケンスデータの構造

シーケンスデータの構造( コード )

struct CMD_SV table[]={
	command list
};

シーケンスデータの例

/*.... Sequence 1 ....*/
// Standat At Atention
struct CMD_SV svSqSTOP[]={
	{ SV_CMD_SET_SPEED, 4, 0 },
	{ SV_HD,  0, 1 },
	{ SV_AR,  0, 1 },
	{ SV_AL,  0, 1 },
	{ SV_FR,  0, 1 },
	{ SV_FL,  0, 1 },
	{ SV_LR,  0, 1 },
	{ SV_LL,  0, 1 },
	//.... end of one step ....
	{ SV_CMD_FINISH, 0, 0 }
};

複数のシーケンスデータの配置:

シーケンスデータは複数持つことができます。複数のシーケンスは名称(番号)で指定します。

シーケンスリストは配列です。シーケンスデータのポインタ( 保存してあるメモリの場所 )を保存します。
配列の添字が各シーケンスデータの識別子になります。そのままでは使いづらいので enum( 列挙型 )により名称を付けています。コード中ではこの名称によりシーケンスデータを指定します。

シーケンスデータの構造

シーケンスリストの例

//.... List of sequence ....
CMD_SV *sequenceSV[] = {						
	svSqWritable,		// 0: writable sequence
	svSqSTOP,			// 1: stop / standart at atention
	svSqFF0,			// 2: Forward strong fast
	svSqFF1,			// 3: Forward fast first step
	svSqFF1L,			// 4: Forward fast continuous walking
	svSqFF2,			// 5: Forward slowly first step
	svSqFF2L,			// 6: Forward slowly continuous walking
	svSqFR1,			// 7: Right turn
	svSqFL1,			// 8: Left turn
	svSqFR2,			// 9: Righ turn sharp
	svSqFL2,			// 10: Left turn fast sharp
	svSqBB1				// 11: Back fast
};

添字を名称に割り当てるための enum

enum SV_SQ {								
	SV_SQ_WRITABLE = 0,	// 0: writable sequence
	SV_SQ_STOP,			// 1: stop / standart at atention
	SV_SQ_FF0,			// 2: Forward strong fast
	SV_SQ_FF1,			// 3: Forward fast first step
	SV_SQ_FF1L,			// 4: Forward fast continuous walking
	SV_SQ_FF2,			// 5: Forward slowly first step
	SV_SQ_FF2L,			// 6: Forward slowly continuous walking
	SV_SQ_FR1,			// 7: Right turn
	SV_SQ_FL1,			// 8: Left turn
	SV_SQ_FR2,			// 9: Right turn sharp
	SV_SQ_FL2,			// 10: Left turn fast sharp
	SV_SQ_BB1			// 11: Back fast
}	svSQ;

複数のシーケンスの連携

複数のシーケンスを連携して実行することができます。
連携の仕方はは以下のとおりです。

  • 同じシーケンスの繰り返し
  • 次のシーケンスを開始
  • シーケンスの終了

例)二足歩行
最初の一歩と二歩目からの歩行は重心の移動が異なります。最初の一歩は静止状態から踏み出すため勢いが必要です。二歩目以降は後ろにある脚を前方向に一気に振り出すため慣性力が異なります。
そのため、最初の一歩(半歩)のシーケンスと、連続して歩行するときのシーケンスは別々に設定した方が適した動きになります。

例では以下のとおりです。
・最初の一歩: シーケンスデータ svSqFF0
・二歩目以降: シーケンスデータ svSqFF1

参考情報

参考になる情報は以下のとおりです。

このホームページ内

他のWebサイト

カテゴリー
最近の記事 おすすめ記事

記事一覧を表示するには、カスタム投稿「ブログ」にて、4つ以上記事を作成してください。

記事一覧を表示するには、カスタム投稿「ブログ」にて、4つ以上記事を作成してください。

TOP