7: 2011-07-25 (月) 16:27:39 yoshida | 8: 2011-07-28 (木) 19:33:34 yoshida | ||
---|---|---|---|
Line 3: | Line 3: | ||
**Dynamixel Configuratorで動かす [#i7e648cf] | **Dynamixel Configuratorで動かす [#i7e648cf] | ||
- | まずは確認のため、[[Dynamixel Configurator>DXCONF]]でAX-12+を作動させてみましょう。トルク設定をしていませんので、ポジション移動の際は十二分に注意して下さい。~ | + | まずは確認のため、[[Dynamixel Configurator>BTE068]]でAX-12+を作動させてみましょう。トルク設定をしていませんので、ポジション移動の際は十二分に注意して下さい。~ |
ID1からID6まで以下の手順を繰り返します。 | ID1からID6まで以下の手順を繰り返します。 | ||
+「Read All」で状態を読み込む。 | +「Read All」で状態を読み込む。 | ||
Line 14: | Line 14: | ||
如何でしょうか。持ち上げることができたでしょうか。~ | 如何でしょうか。持ち上げることができたでしょうか。~ | ||
Dynamixel Configuratorでは、個々のアクチュエータにそれぞれ手動で指令を行わなければならず、随分と手間がかかるのではないでしょうか。~ | Dynamixel Configuratorでは、個々のアクチュエータにそれぞれ手動で指令を行わなければならず、随分と手間がかかるのではないでしょうか。~ | ||
+ | ID1のゴールポジションを変更することで右へ旋回します。旋回後、腕を下して掴み上げたものを下してください。~ | ||
では、Dynamixel Configuratorでの操作をプログラムで再現してみましょう。 | では、Dynamixel Configuratorでの操作をプログラムで再現してみましょう。 | ||
**プログラムする [#bc44f46d] | **プログラムする [#bc44f46d] | ||
- | 前提条件としてハンド部分は開いており、ペットボトルを挟むだけの状態(位置)にして下さい。 | + | ロボットハンドの左につかむ物を設置して下さい。腕の先へ掴めるものが来るように配置しましょう。 |
#html{{ | #html{{ | ||
<pre class="brush:c"> | <pre class="brush:c"> | ||
Line 27: | Line 28: | ||
DX_ChangeBaudrate (1000000); | DX_ChangeBaudrate (1000000); | ||
fd_Wait (2000); | fd_Wait (2000); | ||
+ | // 基本姿勢の作成 | ||
+ | fd_DXSetPosition (1, 512); | ||
+ | fd_DXSetPosition (2, 512); | ||
+ | fd_DXSetPosition (3, 512); | ||
+ | fd_DXSetPosition (4, 512); | ||
+ | fd_DXSetPosition (5, 512); | ||
+ | fd_Wait (1000); | ||
+ | |||
+ | // 左へターン | ||
+ | fd_DXSetPosition (1, 605); | ||
+ | fd_Wait (500); | ||
+ | // 開く | ||
+ | fd_DXSetPosition (5, 362); | ||
+ | fd_DXSetPosition (6, 662); | ||
+ | fd_Wait (1000); | ||
+ | // 腕を下げる | ||
+ | fd_DXSetPosition (2, 818); | ||
+ | fd_Wait (1000); | ||
// 挟む | // 挟む | ||
- | fd_DXSetPosition (5, 550); | + | fd_DXSetPosition (5, 542); |
- | fd_DXSetPosition (6, 420); | + | fd_DXSetPosition (6, 482); |
fd_Wait (1000); | fd_Wait (1000); | ||
// 持ち上げる | // 持ち上げる | ||
- | fd_DXSetPosition (2, 550); | + | fd_DXSetPosition (2, 512); |
- | fd_DXSetPosition (3, 500); | + | fd_Wait (1000); |
+ | // 右へ移動 | ||
+ | fd_DXSetPosition (1, 419); | ||
+ | fd_Wait (1000); | ||
+ | // 腕を下げる | ||
+ | fd_DXSetPosition (2, 818); | ||
+ | fd_Wait (1000); | ||
+ | // 離す | ||
+ | fd_DXSetPosition (5, 362); | ||
+ | fd_DXSetPosition (6, 662); | ||
+ | fd_Wait (1000); | ||
+ | // 基本姿勢へ戻る | ||
+ | fd_DXSetPosition (1, 512); | ||
+ | fd_DXSetPosition (2, 512); | ||
+ | fd_DXSetPosition (3, 512); | ||
+ | fd_DXSetPosition (4, 512); | ||
+ | fd_DXSetPosition (5, 512); | ||
fd_Wait (1000); | fd_Wait (1000); | ||
} | } | ||
Line 39: | Line 74: | ||
}} | }} | ||
今回はDynamixel Configuratorでの操作をそのままプログラムしました。指定位置は掴むものに合った値に変更して下さい。~ | 今回はDynamixel Configuratorでの操作をそのままプログラムしました。指定位置は掴むものに合った値に変更して下さい。~ | ||
- | 持ち上がったら、しばらくそのままの状態で放置してみてください。 | ||
- | **重量軽減 [#s3fbe750] | + | **モーションを使用する [#q1da695a] |
- | しばらくするとID2かID3のAX-12+でLEDが点滅し始めるのではないでしょうか。これはオーバーロードが発生しているためです。~ | + | 動作をモーションに置き換えてみます。 |
- | 負荷を軽減するために、ここではバックテンションを追加します。 | + | #html{{ |
- | #ref(BackTension.png) | + | <pre class="brush:c"> |
+ | #include <fd.h> | ||
+ | #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) | ||
- | **本格的なプログラミング [#m9646c50] | + | const THomePosition HomePos = { 512, 512, 512, 512, 512 , 512 }; |
- | 以上でロボットハンドの組み立てが完了しました。 | + | 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), +331, { 64, 512}, 0, 1023, { 1, 1, 32, 32} }, | ||
+ | { 4, DEV_AX12, fd_AxisOfs(3), +331, { 0, 1023}, 0, 1023, { 1, 1, 32, 32} }, | ||
+ | { 5, DEV_AX12, fd_AxisOfs(4), +331, { 0, 592}, 0, 1023, { 1, 1, 32, 32} }, | ||
+ | { 6, DEV_AX12, fd_AxisOfs(5), +331, { 432, 1023}, 0, 1023, { 1, 1, 32, 32} }, | ||
+ | }; | ||
+ | TApplyPart HandParts = { // 全軸ロボットハンド | ||
+ | Priority: 1, | ||
+ | PartNum: 6, | ||
+ | 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]; | ||
+ | |||
+ | /*======================================================================*/ | ||
+ | // * モーションデータ | ||
+ | const TPose WorkMotion [] = { | ||
+ | { Structure:{ 0, 0, 0, 0, 0, 0 }, Adj:ADJ_SACC_SDECEL, Div:2000, }, // ホームポジション | ||
+ | { Structure:{ 450, 0, 0, 0, 0, 0 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 左旋回 | ||
+ | { Structure:{ 450, 0, 0, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 指を開く | ||
+ | { Structure:{ 450, 300, -300, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:500, }, // 腕を下げる | ||
+ | { Structure:{ 450, 450, -450, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:500, }, | ||
+ | { Structure:{ 450, 600, -300, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:500, }, | ||
+ | { Structure:{ 450, 900, 0, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:500, }, | ||
+ | { Structure:{ 450, 900, 0, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 指を閉じる | ||
+ | { Structure:{ 450, 600, 0, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:500, }, // 腕を上げる | ||
+ | { Structure:{ 450, 450, -450, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:500, }, | ||
+ | { Structure:{ -900, 450, -450, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 右旋回 | ||
+ | { Structure:{ -900, 600, 0, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:500, }, // 腕を下げる | ||
+ | { Structure:{ -900, 900, 0, 0, 300, -300 }, Adj:ADJ_SACC_SDECEL, Div:500, }, | ||
+ | { Structure:{ -900, 900, 0, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 指を開く | ||
+ | { Structure:{ -900, 0, 0, 0, -900, 900 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // 腕を上げる | ||
+ | { Structure:{ 0, 0, 0, 0, 0, 0 }, Adj:ADJ_SACC_SDECEL, Div:1000, }, // ホームポジション | ||
+ | }; | ||
+ | |||
+ | |||
+ | /*======================================================================*/ | ||
+ | /* メイン関数 */ | ||
+ | /*======================================================================*/ | ||
+ | void main (void) { | ||
+ | // 初期化 | ||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | fd_Wait (2000); | ||
+ | |||
+ | // モーション初期設定 | ||
+ | fd_SetSpec (&HomePos, Spec, fd_SpecSize (Spec)); | ||
+ | // ホームポジションを設定 | ||
+ | fd_SetHomePosition (HomePos); | ||
+ | // モーション実行 | ||
+ | fd_PlayMotion (WorkMotion, 1, sizeof(WorkMotion)/sizeof(TPose), 100, &HandParts); | ||
+ | // モーション終了待機 | ||
+ | while (fd_GetMotionStat (&HandParts)) fd_Wait (10); | ||
+ | // トルクOFF | ||
+ | fd_SetDXEnableControl (false, &HandParts); | ||
+ | } | ||
+ | </pre> | ||
+ | }} |