11: 2011-08-01 (月) 20:55:16 yoshida ソース 現: 2013-08-07 (水) 20:22:54 yoshida ソース
Line 3: Line 3:
**Dynamixel Configuratorで動かす [#i7e648cf] **Dynamixel Configuratorで動かす [#i7e648cf]
-まずは確認のため、[[Dynamixel Configurator>BTE068]]でAX-12+を作動させてみましょう。トルク設定をしていませんので、ポジション移動の際は十二分に注意して下さい。~+まずは確認のため、[[Dynamixel Configurator>BTE068#e84cbf19]]でAX-12+を作動させてみましょう。トルク設定をしていませんので、ポジション移動の際は十二分に注意して下さい。~
ID1からID6まで以下の手順を繰り返します。 ID1からID6まで以下の手順を繰り返します。
+「Read All」で状態を読み込む。 +「Read All」で状態を読み込む。
Line 10: Line 10:
**物を掴む [#a91d93dc] **物を掴む [#a91d93dc]
ID1~ID3でハンド部分の位置が決まり、ID5、6でハンド部分が開閉します。~ ID1~ID3でハンド部分の位置が決まり、ID5、6でハンド部分が開閉します。~
-空のペットボトル等を掴んで持ち上げてみましょう。 +空のペットボトル等を掴んで持ち上げてみましょう。~ 
-#ref(Clip.png)+#ref(DXCONF.png)
如何でしょうか。持ち上げることができたでしょうか。~ 如何でしょうか。持ち上げることができたでしょうか。~
Dynamixel Configuratorでは、個々のアクチュエータにそれぞれ手動で指令を行わなければならず、随分と手間がかかるのではないでしょうか。~ Dynamixel Configuratorでは、個々のアクチュエータにそれぞれ手動で指令を行わなければならず、随分と手間がかかるのではないでしょうか。~
Line 20: Line 20:
ロボットハンドの左につかむ物を設置して下さい。腕の先へ掴めるものが来るように配置しましょう。 ロボットハンドの左につかむ物を設置して下さい。腕の先へ掴めるものが来るように配置しましょう。
#html{{ #html{{
-<pre class="brush:c">+<pre class="brush:c;toolbar:false">
#include <fd.h> #include <fd.h>
// メイン関数 // メイン関数
Line 34: Line 34:
  fd_DXSetPosition (4, 512);   fd_DXSetPosition (4, 512);
  fd_DXSetPosition (5, 512);   fd_DXSetPosition (5, 512);
 +  fd_DXSetPosition (6, 512);
  fd_Wait (1000);   fd_Wait (1000);
Line 44: Line 45:
  fd_Wait (1000);   fd_Wait (1000);
  // 腕を下げる   // 腕を下げる
-  fd_DXSetPosition (2, 818);+  fd_DXSetPosition (2, 700); 
 +  fd_DXSetPosition (3, 400);
  fd_Wait (1000);   fd_Wait (1000);
  // 挟む   // 挟む
Line 52: Line 54:
  // 持ち上げる   // 持ち上げる
  fd_DXSetPosition (2, 512);   fd_DXSetPosition (2, 512);
 +  fd_DXSetPosition (3, 512);
  fd_Wait (1000);   fd_Wait (1000);
  // 右へ移動   // 右へ移動
Line 57: Line 60:
  fd_Wait (1000);   fd_Wait (1000);
  // 腕を下げる   // 腕を下げる
-  fd_DXSetPosition (2, 818);+  fd_DXSetPosition (2, 700); 
 +  fd_DXSetPosition (3, 400);
  fd_Wait (1000);   fd_Wait (1000);
  // 離す   // 離す
Line 69: Line 73:
  fd_DXSetPosition (4, 512);   fd_DXSetPosition (4, 512);
  fd_DXSetPosition (5, 512);   fd_DXSetPosition (5, 512);
 +  fd_DXSetPosition (6, 512);
  fd_Wait (1000);   fd_Wait (1000);
} }
Line 74: Line 79:
}} }}
今回はDynamixel Configuratorでの操作をそのままプログラムしました。指定位置は掴むものに合った値に変更して下さい。~ 今回はDynamixel Configuratorでの操作をそのままプログラムしました。指定位置は掴むものに合った値に変更して下さい。~
-まだ動きが随分とぎこちないですね。もう少し滑らかに動くように修正します。+いきなり動き出したり、このプログラムでは動きが随分とぎこちないですね。もう少し滑らかに動くように修正します。
**モーション [#q1da695a] **モーション [#q1da695a]
[[FREEDOM Ⅲライブラリ>FDIIILIB]]には、モーションに関するAPIが用意されていますので、動作をモーションに置き換えてみましょう。~ [[FREEDOM Ⅲライブラリ>FDIIILIB]]には、モーションに関するAPIが用意されていますので、動作をモーションに置き換えてみましょう。~
***概要 [#v0d80198] ***概要 [#v0d80198]
 +モーションを使用するには必要なidの宣言と初期設定値等を取りまとめた[[TSpec構造体>FDIIILIB#w18bc93a]]を初期処理で使用します。~
 +又、ホームポジションを設定するため、[[THomePosition構造体>FDIIILIB#fa1e627a]]を合わせて使用します。ホームポジションは各アクチュエータの基準になり、モーションの指定はホームポジションに対する角度の指定となります。~
 +モーションデータを再生するには、どの部分を稼働させるかを指示する[[TApplyPart構造体>FDIIILIB#q3b8aabf]]と、実際のモーションデータである[[TPose構造体>FDIIILIB#y2b4d82e]]を使用します。
 +#ref(outline.png)
-****ホームポジション [#i4a94692+****初期化 [#w63f4eb4
-基本となる位置を指定します。モーションはホームポジションを基準に指定された角度で動きます。+初期化には次の様にAPIを使用します。
#html{{ #html{{
-<pre class="brush:c;first-line:6">+<pre class="brush:c;toolbar:false"> 
 +fd_SetSpec (&HomePos, Spec, fd_SpecSize (Spec)); 
 +</pre> 
 +}} 
 + 
 +*****[[fd_SetSpec>FDIIILIB#r0f0534c]] [#a6a7bd34] 
 +指定された値を使用して、初期設定を行います。~ 
 +''第1引数''は、ホームポジションを指定した[[THomePosition構造体>FDIIILIB#fa1e627a]]変数のアドレスです。~ 
 +''第2引数''は、アクチュエータの情報を指定した[[TSpec構造体>FDIIILIB#w18bc93a]]変数のアドレスです。~ 
 +''第3引数''は、TSpec配列数です。 
 + 
 +*****[[THomePosition構造体>FDIIILIB#fa1e627a]] [#e87812da] 
 +基準となる位置を指定します。 
 +#html{{ 
 +<pre class="brush:c;toolbar:false">
const THomePosition HomePos = { 512, 512, 512, 512, 512 , 512 }; const THomePosition HomePos = { 512, 512, 512, 512, 512 , 512 };
</pre> </pre>
}} }}
-今回は全てのAX-12+に対し、512を指定しています。これはAX-12+の出力軸に対し150°の位置指定を行うことになります。+6軸のアクチュエータに対し、512(出力軸は150°)を指定しています。 
 + 
 +*****[[TSpec構造体>FDIIILIB#w18bc93a]] [#lbf8e4eb] 
 +各初期情報を指定します。 
 +#html{{ 
 +<pre class="brush:c;toolbar:false"> 
 +const TSpec Spec[] = { 
 +  { 1, DEV_AX12, fd_AxisOfs(0),  +341, {  257,  768},  0, 1023, { 1, 1, 32,  32} }, 
 +  { 2, DEV_AX12, fd_AxisOfs(1),  +341, {  390,  818},  0, 1023, { 1, 1, 32,  32} }, 
 +  { 3, DEV_AX12, fd_AxisOfs(2),  +341, {  64,  512},  0, 1023, { 1, 1, 32,  32} }, 
 +  { 4, DEV_AX12, fd_AxisOfs(10), +341, {    0, 1023},  0, 1023, { 1, 1, 32,  32} }, 
 +  { 5, DEV_AX12, fd_AxisOfs(11), +341, {    0,  592},  0, 1023, { 1, 1, 32,  32} }, 
 +  { 6, DEV_AX12, fd_AxisOfs(12), +341, {  432, 1023},  0, 1023, { 1, 1, 32,  32} }, 
 +}; 
 +</pre> 
 +}} 
 +AX-12+のIDを1~6と設定しているので、それらをオフセット0~2と10~12へ割り当てます。オフセットは60の配列の為、59まで使用可能となっており、[[TApplyPart>FDIIILIB#q3b8aabf]]で指定するオフセットと対応していればどのような順番であっても問題ありません。 
 + 
 +****モーション再生 [#u5c51edb] 
 +モーションを再生するには次の様にAPIを使用します。 
 +#html{{ 
 +<pre class="brush:c;toolbar:false"> 
 +fd_PlayMotion (GoToHomePosition, 1, sizeof(GoToHomePosition)/sizeof(TPose), 100, &HandParts); 
 +</pre> 
 +}} 
 + 
 +*****[[fd_PlayMotion>FDIIILIB#xc988ccc]]​ [#h4574808] 
 +指定されたモーションを指定部位にて再生します。~ 
 +''第1引数''は、モーションデータを指定した[[TPose構造体>FDIIILIB#y2b4d82e]]変数のアドレスです。~ 
 +''第2引数''は、モーションの開始位置を指定します。~ 
 +''第3引数''は、モーションの終了位置を指定します。~ 
 +''第4引数''は、モーションの再生スピード(%)を指定します。~ 
 +''第5引数''は、モーションを再生部位を指定した[[TApplyPart構造体>FDIIILIB#q3b8aabf]]変数のアドレスです。~ 
 +*****[[TPose構造体>FDIIILIB#y2b4d82e]] [#ra67c632] 
 +ホームポジションからの角度情報を指定します。ポーズが1つでも、配列として宣言します。 
 + 
 +#html{{ 
 +<pre class="brush:c;toolbar:false"> 
 +const TPose GoToHomePosition [] = { 
 +  { Structure:{ 0, 0, 0, 0, 0, 0 },  Adj:ADJ_SACC_SDECEL, Div:2000, }, 
 +}; 
 +</pre> 
 +}} 
 +上記は6軸全てを0°としており、全てのAX-12+をホームポジション位置へ移動させます。~ 
 + 
 +*****[[TApplyPart構造体>FDIIILIB#q3b8aabf]] [#fdec1af9] 
 +アクチュエータを取りまとめた部位の設定を行います。~ 
 +アクチュエータの指定はIDではなく、[[TSpec>FDIIILIB#w18bc93a]]で宣言したオフセット値を使用します。~ 
 +又、1つのアクチュエータを複数の部位で使用しても問題ありませんが、その場合はPriorityが有効になります。 
 +#html{{ 
 +<pre class="brush:c;toolbar:false"> 
 +TApplyPart ArmParts = { 
 +  Priority: 10, 
 +  PartNum:  3, 
 +  Part: { fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(2) } 
 +}; 
 +TApplyPart HandParts = { 
 +  Priority: 5, 
 +  PartNum:  3, 
 +  Part: { fd_AxisOfs(10), fd_AxisOfs(11), fd_AxisOfs(12) } 
 +}; 
 +TApplyPart AllParts = { 
 +  Priority: 1, 
 +  PartNum:  6, 
 +  Part: { fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(2), fd_AxisOfs(10), fd_AxisOfs(11), fd_AxisOfs(12) } 
 +}; 
 +</pre> 
 +}} 
 +Priorityは小さい方が優先となりますので、AllPart>HandPart>ArmPartの順になります。 
 +#ref(motion2_1.png) 
 +ArmPartを使用したモーションを再生するとID1~3が稼働します。 
 +#ref(motion2_2.png) 
 +ArmPartのモーション再生中にAllPartを使用したモーションを再生すると、ArmPartを使用したモーションは無効となりAllPartを使用したモーションで置き換わります。~ 
 +#ref(motion2_3.png) 
 +それではAllPartとHandPartのPriorityを逆転させてみましょう。 
 +#ref(motion3_1.png) 
 +AllPartのモーションを再生するとID1~6が稼働します。 
 +#ref(motion3_2.png) 
 +AllPartのモーション再生中にArmPartを使用したモーションを再生すると、ID1~3までがArmPartを使用したモーションで置き換わります。ID4~6はHandPartのモーションが稼働します。 
 +#ref(motion3_3.png)
***モーションプログラム [#s04f1e9e] ***モーションプログラム [#s04f1e9e]
-物を掴んで移動する一連の動作をプログラムにします。+それでは物を掴んで移動する一連の動作をプログラムにします。
#html{{ #html{{
-<pre class="brush:c">+<pre class="brush:c;toolbar:false">
#include <fd.h> #include <fd.h>
#define fd_SetSpec(a,b,c)                  fd_SetSpec((PHomePosition)a,(PSpec)b,c) #define fd_SetSpec(a,b,c)                  fd_SetSpec((PHomePosition)a,(PSpec)b,c)
-#define fd_SetHomePosition(a)              fd_SetHomePosition((PHomePosition)a) 
#define fd_PlayMotion(a,b,c,d,e)            fd_PlayMotion((PPose)a,b,c,d,e) #define fd_PlayMotion(a,b,c,d,e)            fd_PlayMotion((PPose)a,b,c,d,e)
Line 101: Line 202:
const TSpec Spec[] = { const TSpec Spec[] = {
  { 1, DEV_AX12, fd_AxisOfs(0), +341, {  257,  768},  0, 1023, { 1, 1, 32,  32} },   { 1, DEV_AX12, fd_AxisOfs(0), +341, {  257,  768},  0, 1023, { 1, 1, 32,  32} },
-  { 2, DEV_AX12, fd_AxisOfs(1), +341, {  390,  818},  0, 1023, { 1, 1, 32,  32} }, +  { 2, DEV_AX12, fd_AxisOfs(1), +341, {  300,  818},  0, 1023, { 1, 1, 32,  32} }, 
-  { 3, DEV_AX12, fd_AxisOfs(2), +331, {   64512},  0, 1023, { 1, 1, 32,  32} }, +  { 3, DEV_AX12, fd_AxisOfs(2), +341, { 180800},  0, 1023, { 1, 1, 32,  32} }, 
-  { 4, DEV_AX12, fd_AxisOfs(3), +331, {    0, 1023},  0, 1023, { 1, 1, 32,  32} }, +  { 4, DEV_AX12, fd_AxisOfs(3), +341, {    0, 1023},  0, 1023, { 1, 1, 32,  32} }, 
-  { 5, DEV_AX12, fd_AxisOfs(4), +331, {    0,  592},  0, 1023, { 1, 1, 32,  32} }, +  { 5, DEV_AX12, fd_AxisOfs(4), +341, {    0,  592},  0, 1023, { 1, 1, 32,  32} }, 
-  { 6, DEV_AX12, fd_AxisOfs(5), +331, {  432, 1023},  0, 1023, { 1, 1, 32,  32} },+  { 6, DEV_AX12, fd_AxisOfs(5), +341, {  432, 1023},  0, 1023, { 1, 1, 32,  32} },
}; };
TApplyPart HandParts = {  // 全軸ロボットハンド TApplyPart HandParts = {  // 全軸ロボットハンド
Line 112: Line 213:
  Part: { fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(2), fd_AxisOfs(3), fd_AxisOfs(4), fd_AxisOfs(5) }   Part: { fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(2), fd_AxisOfs(3), fd_AxisOfs(4), fd_AxisOfs(5) }
}; };
- 
-TPose pose [FD_MAX_POSE_NUM]; 
/*======================================​================================*/ /*======================================​================================*/
Line 149: Line 248:
  // モーション初期設定   // モーション初期設定
  fd_SetSpec (&HomePos, Spec, fd_SpecSize (Spec));   fd_SetSpec (&HomePos, Spec, fd_SpecSize (Spec));
-  // ホームポジションを設定 
-  fd_SetHomePosition (HomePos); 
  // モーション実行   // モーション実行
  fd_PlayMotion (WorkMotion, 1, sizeof(WorkMotion)/sizeof(TPose), 100, &HandParts);   fd_PlayMotion (WorkMotion, 1, sizeof(WorkMotion)/sizeof(TPose), 100, &HandParts);
Line 161: Line 258:
}} }}
-***解説 [#j28efc99+少しは滑らかに動くようになったのではないでしょうか。~ 
-少しは滑らかに動いたのではないでしょうか。では、モーションの使用について説明します。+最後に逆運動学で各アクチュエータの角度を算出してみます。~ 
 + 
 +[[次のチャプターへ>FDIIICHAPTER10.4]
 + 
 +[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]へ戻る


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom