はじめに
実際に完成して歩いた動画はこちらです。
新しく作った製品(RECore)で、かねてから挑戦してみたかった小型の4足歩行ロボットの自作に挑戦してみました。
https://www.omniment.co.jp/products/recore
現状では
- 2軸IK(逆運動学)を使用した座標指定での足の動作
のみがまともに動いています。
今後は
- IKの3軸への拡張
- IMUを使用した重心位置の推定と、姿勢安定
- 歩行パターンの変更(高速化)
を追加していきたいところです。
ハードウェア
構成は以下の通りです。
- RECore
- フタバ RS304MD 12台
- DMM3Dで頼んだMJF部品一式
- ユニバーサル基板の切れ端で作ったサーボ端子台
脚ユニット
RECoreをベースに、そのまま本体をフレームの一部にして前後に共通の脚ユニットを装着しています。
(脚ユニットだけ見るとなんとも生き物感があって…)
関節は開く方向に1自由度、前後方向に2自由度、合計3自由度を設定しました。基本的な関節はよくある4脚のロボットそのものです。
バッテリーなどはRECore側にすべて入っているので、ハードウェア構成としては以上です。
コマンドサーボについて
RS304は比較的安価に使えるコマンドサーボで、角度指定、移動時間、トルクなど各種設定が行えるため、このような多関節ロボットを実装するのに扱いやすいサーボです。
バルク品を購入すれば更に安く購入できます。
https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&products_id=2685
コマンドサーボの通信方式はいくつかありますが、RS304はTTL方式(要はTX RXを1線に混ぜたUARTです)で、ハードウェア的にはトランシーバーのような通信ICを用意しなくても使用できる気軽さがあります。
(単純にTXRXを一つの結線にしてしまうと、自分の送信も受信してしまうのでソフトウェアで分離する必要があります。一応バッファを使うと分離できますが)
サーボのための端子台は、2.54mmピッチのピンヘッダを3列並べて、それぞれの列を全て繋げるだけで使用できるため簡単に作成できます。
ソフトウェア
今回の初期ソフトウェア実装は以下の2点に絞って実装を行いました。
- サーボ動作ライブラリの実装
- 2軸IKライブラリの実装
サーボ動作ライブラリの実装
RS304はシリアルサーボなので、UARTを使用してサーボの設定変更や制御を行う必要があります。
パケットをいちいち書いていては膨大な手間がかかるので、ライブラリにしてしまいます。
フタバさんのところのArduinoサンプルスケッチと、サーボのデータシートを元にライブラリを作成していきます。
http://www.futaba.co.jp/img/uploads/files/robot/command_type_servos/RS303MR_RS304MD_118.pdf
http://www.futaba.co.jp/robot/download/sample_programs
ライブラリ実装後に最初に行うのはサーボのID変更です。
シリアルサーボは、全てを同じ信号線に接続するため、各サーボを識別するためにIDを割り振ることができます。
このIDですが工場出荷時はすべて「1」になっているため、当たり前のごとく全員一斉に動き始めて大パニックを起こします。
1台ずつ接続して、地道にすべてのIDを変更します。
2軸IKライブラリの実装
サーボが自由に動かせるようになったら、2軸IK(逆運動学)ライブラリを作成します。
逆運動学とは、ロボットアームなどで使用されるもので、目標位置を設定し、その目標位置に到達するために関節をどう動かすかを計算するためのものです。
https://jp.mathworks.com/discovery/inverse-kinematics.html
こちらのサイトがシミュレーターもあるため非常にわかりやすかったです。
https://so-zou.jp/robot/tech/kinematics/inverse-kinematics.htm
今回は一番根本の開閉する軸に関して一旦置いておき、その下の前後動に関わる部分のみのIKを実装しています。
開閉方向が無いため計算はかなりシンプルです。結果がラジアンで出力されるので、サーボで使用する前に角度(Deg)に戻す必要があることに注意してください。
2軸IK計算
void calc_ik(float pos_x, float pos_y, float* result) {
float pow_p_xy = ( pow(pos_x, 2) + pow(pos_y, 2) );
float sqrt_p_xy = sqrt(pow_p_xy);
float acos_calc = -acos((pow_p_xy + pow_len_l12) / ( 2 * len_1 * sqrt_p_xy ));
float atan_calc = atan(pos_y / pos_x);
float th1 = acos_calc + atan_calc;
float th2 = atan( (pos_y - len_1 * sin(th1)) / (pos_x - len_1 * cos(th1)) ) - th1;
//結果はRad
result[0] = th1;
result[1] = th2;
}
歩行パターンと結果
今回はフィードフォワードの決め打ち歩行しかできないので、一歩ずつのごくごくシンプルな静歩行パターンになりました。
以下実際に歩かせた動画です。
IKとサーボの移動時間が効いていることが、上体が前進するときの各脚のズレの無さに出ています。
ヨタヨタ歩く姿はなかなかに可愛いのですが、ちょっとした障害物を踏んでも転ぶくらいにか弱いので(重心移動がかなり大きくギリギリのバランスになってるらしい)フィードバックしつつうまく歩いてくれる方法を実装する必要がありそうです。
-
r-tamura
さんが
2021/09/09
に
編集
をしました。
(メッセージ: 初版)
-
r-tamura
さんが
2021/09/09
に
編集
をしました。
-
r-tamura
さんが
2021/09/09
に
編集
をしました。
-
r-tamura
さんが
2021/09/09
に
編集
をしました。
-
r-tamura
さんが
2021/12/07
に
編集
をしました。
ログインしてコメントを投稿する