前回は実機を使ってROS2プログラミングを行いました。
今回は4足歩行ロボットの姿勢制御について学びます。

立ち姿勢角度を変える
まず ROS2で必要な「基礎ノード」を起動し、機体とROSが連携できる状態にします。
前回作成したDockerを立ち上げます。
./start_dogzilla_container.sh1つ目のターミナルで以下を実行します。
ros2 launch bringup Navigation_bringup.launch.pyこれはROS2 ノードの基盤を起動し、機体状態を取得できる状態にしています
- LiDAR ノードが起動
→ 周囲の距離情報を計測できる - IMU ノードが起動
→ 姿勢(傾き・加速度・角速度)が分かる - joint_state ノードが起動
→ 各関節(サーボ)の現在角度を読み取り - robot_state_publisher
→ TF などロボットの全体姿勢を管理
・ROS に必要な「感覚器(IMU・LiDAR)」
・「関節状態(joint_state)」
・「ロボットの姿勢管理(TF)」
がそろい、
後から送る姿勢や歩行コマンドが正しく反映できる状態になります。
この状態で2つ目のターミナルで以下のコマンドを実行します。
ros2 launch yahboom_set_height yahboomSetHeghtLaunch.launch.py \
xGoHeight:=95 attitude_p:=10 move_x:=0 move_y:=0| パラメータ | 意味 |
|---|---|
attitude_p | 前後の傾き(−15〜+15)+:前かがみ / −:反り |
xGoHeight | 胴体高さ(75〜115) |
move_x | 前進速度(0〜25 → 0より大きいと歩く) |
内部では何が起きているのでしょうか?
① パラメータを受け取る
- 「どれだけ前傾させる?」
- 「どの高さに保つ?」
→ 値をノード内に取り込む
② ロボット本体(Body)の目標姿勢を計算
attitude_p=10 → 前に10°ほど傾く姿勢をターゲットにする
数学的には
「Body が前に何度傾いているか?」
を表す姿勢行列を作る
③ 足先の理想位置を計算
ロボットの体(Body)は傾くため、
**各脚の目標位置(X,Y,Z)**が変わる。
例
- 前足:体が前に倒れる → 足を少し前に出す
- 後足:バランスを取る → 少し後ろへ
→ 脚全体で重心を支える位置を計算
④ 逆運動学(IK)で「サーボ角度」を計算
**IK(Inverse Kinematics:逆運動学)**とは
「足先をこの位置に持ってくるには、各関節を何度曲げる?」
を計算する仕組み。
四足1脚は
ヒップ → 大腿 → 膝 (3つの関節)
例
足先(X,Y,Z) → 関節角(θ1, θ2, θ3)
⑤ サーボへ送信
- 計算した角度 → モータへ
- 実機の姿勢が変わる
結果 ⇒ 前傾姿勢が完成!
という流れです。
歩行速度を変える
歩行速度は以下のコマンドで変えられます。
ros2 launch yahboom_set_height yahboomSetHeghtLaunch.launch.py \
xGoHeight:=95 attitude_p:=10 move_x:=10 move_y:=0内部では何が起きているのでしょうか
① 速度パラメータ move_x を受け取る
「どれだけ進みたい?」を数値で取る
② Gait(歩容)生成器に指示
Gait(ゲイト)
→ 歩き方のスタイルのこと
(ここでは多くが“トロット”)
move_x が大きいほど
- ステップ幅
- 周期(テンポ)
が大きくなる。
③ 足先の軌道(trajectory)を作る
1歩には
- 支持期(床を押す)
- 遊脚期(次の位置へ脚を運ぶ)
がある。
move_x が大きい
→ 前へ踏み出す距離が増える
④ IK で関節角を計算
(先ほどと同じ)
⑤ サーボに送信
→ 実際に歩行が速くなる
歩行高さを変える
以下のコマンドで胴体の高さを変更可能です。
ros2 launch yahboom_set_height yahboomSetHeghtLaunch.launch.py \
xGoHeight:=95 attitude_p:=0 move_x:=0 move_y:=0内部では何が起きているのでしょうか
① Body高さ xGoHeight を受け取る
例:xGoHeight=95
→ 胴体を床から 95mm 程度に保つ
② 足先位置を再計算
重心が上下する →
足先(XYZ)も再調整
③ IK 計算
「その高さで立つには、各関節を何度曲げる?」
を計算
④ サーボへ送信
→ 実機の高さが変わる
キーボード操作
好きな姿勢にした状態でキーボードで移動指示を出すことができます。
3つ目のターミナルで以下のコマンドを実行します。
ros2 run teleop_twist_keyboard teleop_twist_keyboardキー
i:前,:後ろj:左回転l:右回転k:停止
課題14
姿勢角と胴体高さの変化により「立ち姿勢の変化」「前進のしやすさ」「旋回のしやすさ」を観察し考察してください。
次回はこちら
Comming soon
