複数のサーボモータの協調運動をシーケンスといい、協調運動制御で使用するデータがシーケンスデータです。このデータをあらかじめ設定することにより一連の動作を自動的に行うことができます。
◀ この記事の前に: 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 ~ 8 | SV_HD, …. SV_FL | 操作の対象とするサーボモータ |
20 ~ 28 | SV_HD_WK, …. SV_FL_WK | 可変パラメータ・シーケンスコマンド(一位はサーボモータの指定) |
80 | SV_CMD_SET_SPEED | 基底速度を変更 |
99 | SV_CMD_FINISH | シーケンスの終了 |
95 | SV_CMD_LOOP | シーケンスを繰り返す |
90 | SV_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
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- Motion Interrupter( 概要 ): サーボモータ制御の最上位、Motion Interrupter の概要です。
- Motion Interrupter( 操作説明 ): アプリケーションからの操作方法です。( API )
- Motion Interrupter( コード ): コードの詳細を説明します。
- Motion sequencer( 概要 ): サーボモータの協調運動制御の概要です。
- Motion sequencer( 操作説明 ): シーケンスの開始・停止等の操作方法です。( API )
- Motion sequencer( コード ): コードの詳細を説明します。
- シーケンスデータ: シーケンスデータの仕様と作成方法です。
- Servomotor Driver( 概要 ): サーボモータそのものの制御です。( API )
- Servomotor Driver( 操作説明 ): 個々のサーボモータを制御する方法です。
- Servomotor Driver( コード ): コードの詳細を説明します。
- サーボモータの制御( コード詳説 ): バックグラウンド処理の分散化の実現方法です。
- サーボモータ: サーボモータの回路です。ハードウエアの説明です。