位置制御設定パケット(UDP 12350)¶
CM4 の位置制御ゲインを、crane から稼働中に変更するためのパケット。外部から設定できる項目と値の範囲をこの文書で定義する。制御則と既定値はCM4位置制御を参照する。CM4 を再起動する必要はない。
これは CM4 が処理する設定で、Orion と Atlas の STM 側のハードウェアや車輪制御を指定するものではない。以下の G474 に関する実装説明は Orion を指す。
65 バイトの制御パケットには相乗りさせず、**別ポートで 28 バイトのデータグラム**として運ぶ。64 バイトのレイアウトは crane / G474 / framework / CM4 の 4 者で一致させることを不変条件にしているうえ、使用中のコマンドの byte 28..31 と 38..63 がゼロとは限らないためである。別ポートにすれば G474 と framework に一切影響しない。
形式¶
通信契約の正本はこの文書で、CM4の実装はcm4/bridge/config_packet.hにある。送信側は対象機体の 192.168.20.(100 + N):12350 へユニキャストで送る。複数の機体に同じ設定を適用するときは、各機体へ個別に送る。
| byte | 内容 |
|---|---|
| 0..3 | magic 'O' 'C' '4' 'C' |
| 4 | version(2) |
| 5 | robot_id(0xFF は全機に適用する値という意味。UDP は各機体へ個別に送る) |
| 6..7 | 予約(0) |
| 8..11 | position_gain(kp)float32 little endian |
| 12..15 | deceleration float32 little endian |
| 16..19 | position_tolerance float32 little endian |
| 20..23 | integral_gain(ki)float32 little endian |
| 24..27 | derivative_gain(kd)float32 little endian |
2 バイト固定小数ではなく素の float32 を使う。量子化を挟まないので、crane の表示値と CM4 の実効値を一致させられる。
受信時の検査¶
受信ポートは、実機の ai_cmd_v2.out もシミュレータの cm4_sim.out も --config-port(既定 12350)。受信、検証、適用、ログ出力はどちらも同じ config_packet.h を通るので、シミュレータで確かめた値は実機でも同じように扱われる。
- サイズは 28 バイト、version は
2でなければならない。サイズ違いはWrongSize、version 違いはUnsupportedVersionとして拒否し、理由をログに出す。 - 次の範囲を検査する。外れていたら**クランプせず、データグラムごと捨てて**拒否理由をログに出す。黙ってクランプすると、crane の表示と実機の実効値が食い違ったまま気付けない。
| フィールド | 範囲 |
|---|---|
position_gain(kp) |
0 <= v <= 20 [1/s] |
integral_gain(ki) |
0 <= v <= 20 [1/s²] |
derivative_gain(kd) |
0 <= v <= 5 [無次元] |
deceleration |
0 <= v <= 20 [m/s²] |
position_tolerance |
0 <= v <= 1.0 [m] |
- 検査は**データグラム単位**で行う。ki だけが範囲外でも、kp を含めて何も適用しない。一部だけ適用すると、crane の表示と実機の実効値が食い違う。
- 拒否したときは現在のゲインを保持する。
Important
サイズと version は完全一致で検査するので、crane と CM4 は対応する版を同時に配ること。 cm4_sim を使う場合は Docker イメージのタグ(crane の CM4_SIM_TAG)も合わせて更新する(シミュレーション)。