Open4

ロボット製作

ShimbeiShimbei

0. 必要な技術

0.1 ベース設計,開発(立つまで)

・c++
・運動学(順,逆)
・3DCAD,KiCAD(シミュレーションが完了したら.)
・PID制御(重力補償を加味した2自由度制御.小型の場合はシリアルバスサーボが使えるので不要)
・ZMP
・シミュレーション環境の構築(将来的にはGazebo)

・設計は領域外(2025/01時点)なので,一通り制御が出来て余裕があれば設計開発をしたいと思う.友人に外注するかも.

0.2 歩かせる

・FSMの実装
・足先軌道,歩容の決定
・外乱への対処
・通信システム

0.3 機能拡充

・ROS
・画像認識
・LiDAR

オムニ4輪と4足歩行やりたい
自作するならUI(コントローラ)も用意しろ

https://developers.agirobots.com/jp/worldmodel-quadruped/

参考文献

運動学:https://developers.agirobots.com/jp/quadruped-kinematics/
AGIROBOTS BLOG:https://developers.agirobots.com/jp/quadruped-robot-project/
開発チュートリアル:https://www.diva-portal.org/smash/get/diva2:1588775/FULLTEXT01.pdf
強化学習の基礎から関連手法まで(全21回):http://rail.eecs.berkeley.edu/deeprlcourse/
強化学習の理論:https://nanjiang.cs.illinois.edu/cs598/
ロボット制御の数理最適化・強化学習(全25回):https://people.eecs.berkeley.edu/~pabbeel/cs287-fa19/
世界モデルを利用した物流向けロボAI:https://www.icom-giken.com/blog/worldmodel_ai_paretizi/
4脚歩行ロボットの歩容に関する研究:https://tsukuba.repo.nii.ac.jp/record/8786/files/1.pdf

ShimbeiShimbei

1. モータ選定

市販品(Dogzilla,Pupperなど)を見ると小型の場合はサーボモータで十分トルクが足りそう.ということで今回はサーボモータを各関節のモータとして採用したい.

2. 運動学

別でまとめる.

3. PID制御について

サーボモータ以外を脚歩行ロボットのモータとして選定する場合,その関節角度を指定するためにPID制御が必要となる.PID制御の詳細はこちらから.今回開発する脚歩行ロボットはシリアルバスサーボモータを使用するため不要なはず

4. 足先の軌道制御

足先の軌道生成はロボットの歩行性能に大きな影響を与える。参考文献をもとに、三角形軌道、楕円軌道、ライブラリを活用したスプライン軌道、ベジェ軌道を実装する。これを比較することで足先軌道の生成に関する理解の深化を目指す。
この時点でそろそろ脚単体だけでなくロボット全体の動きを見たいので,物理シミュレーションで動作確認が出来るようにする.現状は簡単な動作確認と強化学習の準備が出来ればいいのでPybulletというシミュレーションライブラリを活用する.

まず楕円軌道は遊脚相が曖昧になるため後ろに進んでしまう.
次に三角形軌道は足先が水平移動する機関が十分にあるので遊脚相が確保でき,前に進むことが出来た.
しかしペース歩容にすると本体が傾き遊脚相がズレ,後ろに進んでしまった.

5. 歩容について

歩用は色々あるので、安定な歩容から始め不安定な歩容を試していく。順番としては以下の通り。

  1. クロール
  2. ウォーク
  3. トロット
  4. ペース
  5. バウンス、ギャロップは出来そうならやってみる。

以下動画にクロール歩容でのシミュレーション動作の様子をまとめる.シミュレーション用のurdfファイルはこちらから引用させていただいた.Copyright [2025] [aakmsk(AGIRobots)]

動画から分かる通り同じ位相で各脚を動かしても,クロール歩容だと不格好ながら前進できているのに対して,ペース歩容だと後退してしまう.これはペース歩容だとロボット全体が傾くことで十分な遊脚相を確保できていないからであると考える.これを改善するにはZMPなどの計算が必要になる.

6. 不整地への対応(段差,傾斜,不連続)

ここまでは水平な地面での歩行についてのみ対応できるような制御を考えていたが,ここからは不整地でも歩行ができるような制御を目指す.以下に主な対応策を示す.
・AI(深層強化学習による最適方策の探索),世界モデルの活用
・ZMPの制御 + ロボット本体の姿勢制御

また不連続な環境についてはセンサを追加しない限り対応することはできないと考える.これは実機を扱う際に必要か再検討する.

前提知識が足りていないと,深層強化学習を活用した現代制御を実装するのは非常に難しくなる(1年前に経験済み).したがって5月まではまず,シミュレーション上で古典的な制御を実装し精度を調査する.以降はAIを活用したロボット制御をシミュレーション上で行う.そのためにロボットモデルの制作も進める(CADデータができるまではネット上から拾ったロボットモデルでシミュレーションを行う)

と思っていたが,古典制御が複雑かつ応用範囲も狭いと感じたため先にAIによる制御を試す.

7. 自律走行

ROSを導入.

8. 外乱への対応

シミュレーション環境の構築

ロボットを歩かせるために,まずはシミュレーション環境で実装したい.そこで今回はPybulletというライブラリを使用してシミュレーションを行ってみる.公式サイトに基づいて作業を進める.またシミュレーションで使うモデルはAGIRobotsのこちらを使わせていただいた.

ShimbeiShimbei

運動学について

まず順運動学を導出する.以下に導出した順運動学の計算結果をプログラムにしたものをまとめる.パラメータは以下の図を参照.

# シミュレーションを描画する順運動学
def forward_kin(theta1, theta2, theta3):
    global x0,x1,x2,x3,y0,y1,y2,y3,z0,z1,z2,z3
    x1 = 0
    y1 = L1 * np.cos(theta1)
    z1 = - L1 * np.sin(theta1)

    x2 = L2 * np.sin(theta2)
    y2 = y1 + L2 * np.cos(theta2) * np.sin(theta1)
    z2 = z1 + L2 * np.cos(theta2) * np.cos(theta1)

    x3 = x2 + L3 * np.sin(theta2 + theta3)
    y3 = y2 + L3 * np.cos(theta2 + theta3) * np.sin(theta1)
    z3 = z2 + L3 * np.cos(theta2 + theta3) * np.cos(theta1)

次にここから逆運動学を導出する.これが非常に面倒だった(おかげで三週間かかった).以下に導出した逆運動学の計算結果をプログラムにしたものをまとめる.

def inverse_kinematics(parameters, target_position):
    global theta1, theta2, theta3
    L1, L2, L3 = parameters["L1"], parameters["L2"], parameters["L3"]
    X, Y, Z = target_position[0], target_position[1], target_position[2]
    R = (Y**2+Z**2)
    h = np.sqrt(Y**2+Z**2-L1**2)
    Rp = np.sqrt(X**2+h**2)
    # theta1 = np.arccos((L1*Y+h*Z)/R) # 合ってるけどarccosやから定義域が面倒なので今回はパス
    theta1 =np.arctan2(h, L1) - np.arctan2(Z, Y) # これは合ってる
    # theta1 = np.arcsin((h*Y-L1*Z)/R)             # これもなぜか合ってる
    theta2 = np.arctan2(X, h) - np.arccos((-L3**2+Rp**2+L2**2)/(2*L2*Rp)) # θ3が0以下にならない前提(arccosの性質)
    theta3 = np.radians(180) - np.arccos((L2-h*np.cos(theta2)-X*np.sin(theta2))/L3) # なんで180から引かないといけないのかは不明

ここで注意するべき点は以下の二点である.
・±hをhでおいている : 足先の座標が胴体より上に行くような制御をする予定はないから
・θ3の定義域は0~180(後ろに回転しない):arccosを使う際に条件分岐が必要になるから
詳細はiPadにまとめた計算過程(以下の図)を参照.

3自由度かつ脚の付け根にオフセットがあるせいで計算が非常に複雑になってしまった.順運動学もところどころ間違いがあった.更に逆三角関数の扱いに慣れていなかったため定義域や値域が曖昧だったせいで余計に混乱していた.

不整地への対応(段差,傾斜,不連続)

まずシミュレーション環境に不整地を準備する必要がある.さて,Pybulletの環境にどうやって不整地を生み出せばいい?
まず問題がサイズ.ロボットが小さいので不整地もそれに合わせて小さな段差や傾斜にする必要がある.もう1つの問題はガタガタな平面を作る方法が不明である点.
早急に上記2点調べましょう.とりあえずPybulletはシンプルなモデルが準備されているはずなのでそれを呼び出すところから.サンプルはここから探す

・heightfield.py
・manyspheres.py

➡heighfield.pyを流用することで不整地が再現できた.

ShimbeiShimbei

DEVELOP LOG

2025/04
大学入学で忙しい上に,シミュレーション環境に不整地を作り出すところで躓き大ブレーキ.
2025/03
学校でやることが落ち着いたので本格的に取り組む
・順運動学と逆運動学の導出(3週間かかった)

2025/02
学校にあったDogzilla S2を制御して市販の4脚歩行ロボットについて調査
・ROSは不要
・バッテリーの管理がボトルネック
・設計のインスピレーション
・シリアルバスサーボについて理解

2024/12
構想を練る
・小型4脚歩行ロボットの制作 ⇒ PID制御は不要のはず(やりたいとは思う)
・バッテリーは最後に考える
・現代制御とAIを使って自律制御したい
・ROSもそのうち組み込みたい