1

Lets say I've a robotic arm with joints at points A,B,C,D in a 3D space. Let D be the end effector(bottommost child) and A be the topmost parent. Let T be the target point anywhere in the space. The aim is to make the end effector reach the target with minimum rotations in top levels(parents).

What I initially thought:

1) Rotate the arm C by angle TCD. 2) Then rotate the arm B by new angle TBD. 3) Then rotate the arm A by new angle TAD.

But the end effector seems to point away from the target after step 2. What am I doing wrong and how can I fix it?

4

2 に答える 2

1

より高度なアプローチを使用する前に、次のようにしました。

pe=desired_new_position;

for (i=0;i<number_of_actuators;i++)
 {
 // choose better direction
                   p=direct_kinematics(); d =|p-pe|; // actual step
 actuator(i)--;  p=direct_kinematics(); d0=|p-pe|; // previous step
 actuator(i)+=2; p=direct_kinematics(); d1=|p-pe|; // next step
 actuator(i)--;  dir=0; d0=d;
      if ((d0<d)&&(d0<d1)) dir=-1;
 else if ((d1<d)&&(d1<d0)) dir=+1;
 else continue;

 for (;;)
  {
  actuator(i)+=dir; p=direct_kinematics(); d =|p-pe|;
  if (d>d0) { actuator(i)-=dir; break; }
  if (actuator(i) on the edge limit) break;
  }

 }

[ノート]

  1. 1ではなく、いくつかのステップでインク/デクアクチュエータ位置に変更できます

    差がゼロを超えた場合は停止し、小さいステップで再び開始します。step == 1これによりパフォーマンスが向上しますがstep=1、新しい位置は通常最後の位置に近いため、ほとんどのアプリケーションでは十分です。

  2. これはローカルの最小値/最大値でスタックする可能性があることに注意してください

    出力が動かなくなった場合 (エフェクターの位置が変更されていない場合)、アクチュエーターをランダム化して再試行してください。これが発生するかどうかは、キネマティクスの複雑さと、使用するパスの種類によって異なります。

  3. 腕が下よりも上に動かされている場合

    次に、i-forループを逆にしてみてください

  4. エフェクターを正常に制御する必要がある場合

    次に、回転軸をCCDから除外し、CCDの前に設定する必要があります

于 2014-06-10T07:21:41.083 に答える