この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 最新リビジョン 両方とも次のリビジョン | ||
ja:manual:additional_function [2014/07/08 14:56] sugiura [マルチジョイント(リンク機構)] |
ja:manual:additional_function [2014/08/12 19:53] sugiura [トルク指令の制御プログラム(DLL)] |
||
---|---|---|---|
ライン 2: | ライン 2: | ||
Go Simulation!はリリース後も随時機能を追加しております。\\ | Go Simulation!はリリース後も随時機能を追加しております。\\ | ||
ここでは追加機能についてまとめます。 | ここでは追加機能についてまとめます。 | ||
- | ===== 距離センサ ===== | + | ===== 13.1 距離センサ ===== |
距離センサを追加することが可能です。\\ | 距離センサを追加することが可能です。\\ | ||
ライン 25: | ライン 25: | ||
- | ===== マルチジョイント(リンク機構) ===== | + | ===== 13.2 マルチジョイント(リンク機構) ===== |
Go Simulation!ではロボットのリンク構成は、基本的に図 13-3 (1)のようにスター型の構造を対象としています。即ち一つのボディに、一つのジョイント(モータ)という構成になっています。\\ | Go Simulation!ではロボットのリンク構成は、基本的に図 13-3 (1)のようにスター型の構造を対象としています。即ち一つのボディに、一つのジョイント(モータ)という構成になっています。\\ | ||
Ver1.3.4より新たに図 13-3 (2)のように、サブジョイントを追加できるようにしました。これにより、リンク構造、即ち閉ループ型の構造をシミュレーションできるようになりました。なお、GUIからは設定操作できず、直接設定ファイルを書き込むことで対応できるようになっています。 | Ver1.3.4より新たに図 13-3 (2)のように、サブジョイントを追加できるようにしました。これにより、リンク構造、即ち閉ループ型の構造をシミュレーションできるようになりました。なお、GUIからは設定操作できず、直接設定ファイルを書き込むことで対応できるようになっています。 | ||
ライン 45: | ライン 45: | ||
\\ | \\ | ||
\\ | \\ | ||
+ | |||
+ | ===== 13.3力・トルク指令===== | ||
+ | |||
+ | Go Simulation!では従来、各関節への指令は角度か速度が可能でしたが、__Ver 1.3.6より__力やトルクで指令を与えることが出来るようになりました。 | ||
+ | 関節のタイプがヒンジの場合はトルク指令、スライダの場合は力指令になります。 | ||
+ | |||
+ | 本章では、チュートリアル形式で、力・トルク指令を使ったシミュレーションについて解説します。デフォルトのロボットをベースに、右肩をトルク指令、左肩をスライダにして力指令タイプにしてみます。\\ | ||
+ | |||
+ | ==== トルク指令に設定==== | ||
+ | 新規にロボットを作成してください。\\ | ||
+ | そして、本チュートリアルでは左肩(#18)をスライダ指令にしたいので、設計エディタで図13-5のように変更してください。\\ | ||
+ | |||
+ | {{:ja:manual:add_trq1.png?400|}}\\ | ||
+ | {{:ja:manual:add_trq2.png?400|}}\\ | ||
+ | 図 13-5 右肩のジョイントをスライダに変更\\ | ||
\\ | \\ | ||
+ | |||
+ | サーボモータをトルク指令にするために、サーボモータ設定エディタで図13-6のように#17と#18をトルク指令に変更してください。\\ | ||
+ | {{:ja:manual:add_trq3.png?500|}}\\ | ||
+ | 図 13-6 サーボモータをトルク指令に変更\\ | ||
\\ | \\ | ||
- | 株式会社テクノロード\\ | + | ==== トルク指令の制御プログラム(DLL)==== |
- | 川崎市幸区新川崎7-7 KBIC 222\\ | + | トルク制御のモデルを作成でたので、制御プログラムの作り方について解説します。本サンプルではDLL(C++)でプログラムする方法を示します。 |
- | http:// techno-road.com/\\ | + | |
- | {{:ja:mail.png|}}\\ | + | DLLのサンプルプロジェクト一式を掲示板にアップしました(http://techno-road.com/board/view-postlist/forum-9-go-simulation-/topic-141-cdll.html)。ダウンロードしてください。 |
+ | |||
+ | main_11TestDll4_basic.cppの、Dll4_Run関数の中を以下のように書き換えてください(testTorqueRef(sim)が実行されるようにする)。 | ||
+ | <code cpp> | ||
+ | void __stdcall Dll4_Run( DLL_SIM_ROBOT4 *sim) { | ||
+ | //Time count up | ||
+ | int idt = (int)(sim->dt/0.001); | ||
+ | gImsec+=idt; | ||
+ | |||
+ | //select a test function | ||
+ | // testAnalogJoypad(sim); | ||
+ | // testMotionDSensor(sim); | ||
+ | // testCamera(sim); | ||
+ | testTorqueRef(sim); | ||
+ | return; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | testTorqueRef()は次のようになっています。\\ | ||
+ | 右肩(17番関節)と左肩(18番関節)にそれぞれPD制御を施しています。\\ | ||
+ | PF_SetRefMotorTorque(int id, double torque);を使用し、idに関節番号、torqueに指令トルク(力)を設定しています。\\ | ||
+ | |||
+ | <code cpp> | ||
+ | void testTorqueRef(DLL_SIM_ROBOT4 *sim){ | ||
+ | if(sim->Axis<=18){ | ||
+ | return; | ||
+ | } | ||
+ | int axis; | ||
+ | |||
+ | //Sholder Pitch Right Joint(ShoP_R) is set as "Hinge Joint" and "Torque Control Motor" | ||
+ | axis = 17; //ShoP_R | ||
+ | if(sim->ServoMode[axis]==3) | ||
+ | { | ||
+ | //トルク制御モードなら | ||
+ | static double bx=0; | ||
+ | static double ref=0; | ||
+ | |||
+ | |||
+ | //angle ref 0 to 120[deg] | ||
+ | ref+=0.1; | ||
+ | if(ref>120){ | ||
+ | ref=120; | ||
+ | } | ||
+ | |||
+ | double x = sim->ServoNowDeg[axis];//angle | ||
+ | double v = (x-bx)/sim->dt;//vel | ||
+ | |||
+ | //PD Control | ||
+ | double kp = 0.04; | ||
+ | double kd = 0.001; | ||
+ | double f = kp*(ref-x) - kd*v; | ||
+ | |||
+ | //output torque | ||
+ | SetRefMotorTorque(axis,f); | ||
+ | |||
+ | //message | ||
+ | wchar_t s[128]; | ||
+ | swprintf(s,L"ang ref=%lf x=%lf\n",ref,x); | ||
+ | sim->PrintCommandWindow(s); | ||
+ | |||
+ | bx = x;//back up | ||
+ | } | ||
+ | |||
+ | //Sholder Pitch Left Joint(ShoP_L) is set as "Slider Joint" and "Force Control Motor" | ||
+ | axis = 18; //ShoP_L | ||
+ | if(sim->ServoMode[axis]==3) | ||
+ | { | ||
+ | static double bx=0; | ||
+ | static double ref=0; | ||
+ | |||
+ | //position ref 0 to 0.3[m] | ||
+ | ref+=0.001; | ||
+ | if(ref>0.3){ | ||
+ | ref=0.3; | ||
+ | } | ||
+ | |||
+ | //double f = 0.1; | ||
+ | |||
+ | double x = sim->ServoNowDeg[axis];//position | ||
+ | double v = (x-bx)/sim->dt;//vel | ||
+ | |||
+ | //PD Control | ||
+ | double kp = 0.8; | ||
+ | double kd = 0.5; | ||
+ | double f = kp*(ref-x) - kd*v; | ||
+ | |||
+ | //output torque | ||
+ | SetRefMotorTorque(axis,f); | ||
+ | |||
+ | //message | ||
+ | wchar_t s[128]; | ||
+ | swprintf(s,L"pos ref=%lf x=%lf\n",ref,x); | ||
+ | sim->PrintCommandWindow(s); | ||
+ | |||
+ | bx = x;//back up | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | それではこのサンプルの動かし方を解説します。 | ||
+ | |||
+ | ビルドして、Releaseフォルダ内に出来た、DllCont4.dllをコピーし、先程つくったロボットプロジェクトのPROGRAMフォルダ下に入れてください。 | ||
+ | |||
+ | そして、コマンドウィンドウから | ||
+ | <code> | ||
+ | dll_run(DllCont4) | ||
+ | </code> | ||
+ | と入力すると先ほどのDLLが実行されトルク制御が行われるようになります。 | ||
+ | |||
+ | この例では最初に説明したように、\\ | ||
+ | 「右肩=ヒンジ=トルク指令」\\ | ||
+ | 「左肩=スライダ=力指令」\\ | ||
+ | になっているので、下図のような結果になり、サンプルでは右肩120[deg]上方、左肩0.3[m]前方 の位置に制御しています。 | ||
+ | |||
+ | {{:ja:manual:add_trq4.png?400|}} | ||
\\ | \\ | ||
- | <html><img src="http://go-simulation.com/wiki/_media/ja/mail.png" /> | + | \\ |
+ | \\ | ||
+ | \\ | ||
+ | <html> | ||
+ | <div style="border:solid 1px #666; | ||
+ | padding:16px; display:inline-block; background-color: #fbfaf9; | ||
+ | border-radius: 2px; | ||
+ | box-shadow: 0 0 0.3em #ccc inset; | ||
+ | color: #333; | ||
+ | border:solid #ccc 1px;"> | ||
+ | 株式会社テクノロード<br /> | ||
+ | 川崎市幸区新川崎7-7 KBIC 222<br /> | ||
+ | <a href="http://techno-road.com/">http:// techno-road.com/</a><br /> | ||
+ | <img src="http://go-simulation.com/wiki/_media/ja/mail.png" /> | ||
+ | </div> | ||
</html> | </html> | ||
- |