14: 2011-08-03 (水) 14:41:34 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 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] | ||
Line 112: | Line 117: | ||
<pre class="brush:c;toolbar:false"> | <pre class="brush:c;toolbar:false"> | ||
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, { 390, 818}, 0, 1023, { 1, 1, 32, 32} }, |
- | { 3, DEV_AX12, fd_AxisOfs(2), +341, { 64, 512}, 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} }, | { 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} }, | { 5, DEV_AX12, fd_AxisOfs(11), +341, { 0, 592}, 0, 1023, { 1, 1, 32, 32} }, | ||
Line 139: | Line 144: | ||
''第5引数''は、モーションを再生部位を指定した[[TApplyPart構造体>FDIIILIB#q3b8aabf]]変数のアドレスです。~ | ''第5引数''は、モーションを再生部位を指定した[[TApplyPart構造体>FDIIILIB#q3b8aabf]]変数のアドレスです。~ | ||
*****[[TPose構造体>FDIIILIB#y2b4d82e]] [#ra67c632] | *****[[TPose構造体>FDIIILIB#y2b4d82e]] [#ra67c632] | ||
- | ホームポジションからの角度情報を指定します。 | + | ホームポジションからの角度情報を指定します。ポーズが1つでも、配列として宣言します。 |
#html{{ | #html{{ | ||
<pre class="brush:c;toolbar:false"> | <pre class="brush:c;toolbar:false"> | ||
Line 147: | Line 153: | ||
</pre> | </pre> | ||
}} | }} | ||
- | 6軸全てを0°としており、ホームポジション位置への移動を指示します。~ | + | 上記は6軸全てを0°としており、全てのAX-12+をホームポジション位置へ移動させます。~ |
*****[[TApplyPart構造体>FDIIILIB#q3b8aabf]] [#fdec1af9] | *****[[TApplyPart構造体>FDIIILIB#q3b8aabf]] [#fdec1af9] | ||
- | モーションは[[TApplyPart>FDIIILIB#q3b8aabf]]で設定された部位単位に動きます。1つのアクチュエータを複数の部位で使用しても問題ありません。~ | + | アクチュエータを取りまとめた部位の設定を行います。~ |
- | 但し、その場合はPriorityが有効になります。 | + | アクチュエータの指定はIDではなく、[[TSpec>FDIIILIB#w18bc93a]]で宣言したオフセット値を使用します。~ |
+ | 又、1つのアクチュエータを複数の部位で使用しても問題ありませんが、その場合はPriorityが有効になります。 | ||
#html{{ | #html{{ | ||
<pre class="brush:c;toolbar:false"> | <pre class="brush:c;toolbar:false"> | ||
Line 173: | Line 180: | ||
Priorityは小さい方が優先となりますので、AllPart>HandPart>ArmPartの順になります。 | Priorityは小さい方が優先となりますので、AllPart>HandPart>ArmPartの順になります。 | ||
#ref(motion2_1.png) | #ref(motion2_1.png) | ||
- | HandPartを使用したモーションが稼働中にAllPartを使用したモーションを稼働させると、HandPartを使用したモーションは無効となりAllPartを使用したモーションのみが稼働します。~ | + | ArmPartを使用したモーションを再生するとID1~3が稼働します。 |
- | AllPartとHandPartのPriorityを逆転させてみましょう。 | + | |
#ref(motion2_2.png) | #ref(motion2_2.png) | ||
- | AllPartのモーション稼働時にHandPartのモーションが稼働すると、ID1~3はAllPartのモーションがそのまま稼働し、ID4~6はHandPartのモーションが稼働します。 | + | 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) | ||
- | *****[[TPose構造体>FDIIILIB#y2b4d82e]] [#if4363ee] | + | ***モーションプログラム [#s04f1e9e] |
- | モーションデータになります。部位と合わせて使用します。 | + | それでは物を掴んで移動する一連の動作をプログラムにします。 |
#html{{ | #html{{ | ||
<pre class="brush:c;toolbar:false"> | <pre class="brush:c;toolbar:false"> | ||
- | const TPose HomePos[] = { | ||
- | { Structure:{ 0, 0, 0, 0, 0, 0 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, | ||
- | }; | ||
- | </pre> | ||
- | }} | ||
- | モーションデータは配列で宣言して下さい。又、[[TSpec>FDIIILIB#w18bc93a]]で宣言したアクチュエータ分、作成して下さい。 | ||
- | |||
- | ***モーションプログラム [#s04f1e9e] | ||
- | 物を掴んで移動する一連の動作をプログラムにします。 | ||
- | #html{{ | ||
- | <pre class="brush:c"> | ||
#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) | ||
Line 200: | 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, { 64, 512}, 0, 1023, { 1, 1, 32, 32} }, | + | { 3, DEV_AX12, fd_AxisOfs(2), +341, { 180, 800}, 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 256: | Line 258: | ||
}} | }} | ||
- | ***解説 [#j28efc99] | + | 少しは滑らかに動くようになったのではないでしょうか。~ |
- | 少しは滑らかに動いたのではないでしょうか。では、モーションの使用について説明します。 | + | 最後に逆運動学で各アクチュエータの角度を算出してみます。~ |
+ | |||
+ | [[次のチャプターへ>FDIIICHAPTER10.4]] | ||
+ | |||
+ | [[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]へ戻る |