RPU-10で6軸逆運動学の計算と速度
さっそくRPU-10(内部はATmega128)をGDLにてプログラムしてみました。
ザックリ移植したんで、変数名がへっぽこなのはご勘弁ください。
何をしたかというととりあえず、RPU-10のスペックが知りたかったので、逆運動学の計算を延々とさせるプログラムを書いてみました。
//----------------------------------------------------------------------------------------
// 逆運動学の計算速度の計測テスト
//
// 環境 RPU-10、GDL V2.00
// 説明 右足2回でワンセット、2回計算するごとにMoniterLEDを点滅させます。
// 高速なので目視ではわかりませんが、オシロスコープで計測します。
// だいたい、10msec間隔で波形が確認できると思います。
// 途中からゴミみたいな変数名ですみませんorz
//
// AUTHORED BY Micchy @ Dream Drive !!
//----------------------------------------------------------------------------------------
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <math.h>
#include <avr/boot.h>
#include <avr/wdt.h>
#include <sv.h>
#include <rs.h>
#define SQUARE(x) ((x) * (x))
#define RADIANS(deg) ((deg) * M_PI / 180.0)
#define DEGREES(rad) ((rad) * 180.0 / M_PI)
#define a 48
#define b 59
#define c 5
#define d 28
#define e 2.8
//6軸のサーボの値を一時的に保存するグローバル変数
int sv1,sv2,sv3,sv4,sv5,sv6;
int xyz(int goal_x,int goal_y,int goal_z,float goal_yo,float goal_pi,float goal_ro){
float x,y,z,yo,r,si,dax,day,daL,he_s,he_das,h,arufa,beta,d_arufa,d_beta,dd_beta;
float sig,ipu,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii;
float temp;
x = goal_x + d;
y = goal_y - e;
z = goal_z;
yo = goal_yo;
r = sqrt( (x * x ) + ( y * y ) );
if (x==0 && y==0)si = 0;
else si = atan2(y,x);
temp = si - RADIANS(yo);
dax = r * cos(temp) - d;
day = r * sin(temp) + e;
temp = sqrt( SQUARE(z) + SQUARE(day) ) - c;
daL =sqrt( SQUARE(dax) + SQUARE(temp) );
he_s = (a + b + daL )/2;
he_das =sqrt(he_s *(he_s - a)*(he_s-b)*(he_s-daL));
h = 2 * he_das / daL;
arufa = asin( h / a );
beta = acos( h / a );
d_arufa = asin( h / b );
d_beta = acos( h / b );
dd_beta = beta + d_beta;
sig = asin(dax / daL);
ipu = atan(day/z);
aaa = DEGREES(arufa + sig);
bbb = DEGREES(d_arufa - sig);
ccc = 180-DEGREES(dd_beta);
ddd = DEGREES(ipu);
eee = yo;
fff = goal_pi * cos(RADIANS(goal_yo));
ggg = goal_pi * sin(RADIANS(goal_yo));
hhh = -goal_ro * sin(RADIANS(goal_yo));
iii = goal_ro*cos(RADIANS(goal_yo));
sv1 = 10 * (-eee);
sv3 = 10 * (ddd);
sv2 = 10 * (aaa);
sv4 = 10 * (-ccc);
sv5 = 10 * (-bbb + hhh - fff);
sv6 = 10 * (ddd - iii + ggg);
return 0;
}
int main( void )
{
RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
SV_Init( br115200 ); // サーボ制御ライブラリの初期化
sei(); // 割り込み処理開始
// 1秒待つ(よく知らないけど必要らしい)
RPU_ResetTimerCounter();
while( RPU_GetTimerCounter10() < 100 );
// 起動メッセージの表示
rs0_puts( "逆運動学 計算速度 実測TEST" );
while( 1 ){
xyz(0,30,104,0,0,0); //右足分計算
xyz(0,30,104,0,0,0); //右足分計算(2回目)
LED_ON; //LED点灯
xyz(0,30,104,0,0,0); //右足分
xyz(0,30,104,0,0,0); //右足分計算(2回目)
LED_OFF; //LED消灯
}
return 1;
}
G-ROBOTSは直交軸が微妙に直交してなかったり、意外と煩雑な計算になってます。
設計段階でちゃんと直交させれば計算は楽になるのですが、逆に可動域が小さくなるので、このあたりは、設計とプログラムのバランスですね。
もう少し簡単な機構なら計算が少なくなります。
で、実行してみた結果ですが、

こんな感じです。
RPU-10を分解してMoniterLEDの根本をオシロスコープでモニターしてみました。
2脚ワンセットの計算でMoniterLEDが約10msで点滅してます。
というわけで計算自体は10msで可能ということになります。
あと、サーボとの通信、コントローラーからのインプット、歩容の計算、これらを含めて最終的に制御周期を何msに出来るか…。
って感じですね。

コメントを残す