視頻:
項目地址:
unitysir/6DOF-robot-arm-IK: I built the Unity3d project with meuse.co.jp code. (github.com)
Final IK
單臂機器人逆運動學解析方法
逆運動學解析正文:

解釋機器人手臂逆運動學的解析方法。 此方法僅適用於具有球形手腕(關節P4,P5,P6的軸在一個點處交匯)的機器人。 並且機器人不應有關節偏移。(Explaining analytical approach to inverse kinematics for robot arm. This method is applyed only for robots that have a spherical wrist (axis of joints P4,P5,P6 meets at one point). And robot should not have joint offsets.)
參考:Hirose的教科書“ Robotics”
向量(a,b) 表示末端執行器的方向和旋轉。(Vector (a,b) represents the direction and rotation of end effector.)
偏航角,俯仰角,滾動角由單位滑塊指定。(Yaw,Pitch,Roll angles are given by unity sliders.)
px = S_Slider.value; //position
py = L_Slider.value;
pz = U_Slider.value;
rx = R_Slider.value; //rotation
ry = B_Slider.value;
rz = T_Slider.value;
ax = Mathf.Cos(rz * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
ay = Mathf.Sin(rz * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
az = -Mathf.Sin(ry * 3.14f / 180.0f);
bx = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Sin(ry * 3.14f / 180.0f) * Mathf.Cos(rz * 3.14f / 180.0f)
- Mathf.Sin(rx * 3.14f / 180.0f) * Mathf.Sin(rz * 3.14f / 180.0f);
by = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Sin(ry * 3.14f / 180.0f) * Mathf.Sin(rz * 3.14f / 180.0f)
- Mathf.Sin(rx * 3.14f / 180.0f) * Mathf.Cos(rz * 3.14f / 180.0f);
bz = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
點P5在向量上與Pr的直線上。 (Point P5 is on the vector a line from Pr)
或者 (or)
p5x = px - (L5 + L6) * ax;
p5y = py - (L5 + L6) * ay;
p5z = pz - (L5 + L6) * az;
從手臂機器人的結構來看,(From the structure of arm robot,)
theta[0] = Mathf.Atan2(p5y, p5x);
形成手臂機器人的運動學 (Form the Kinematics of arm robot,)
平方和 (Sum of squares,)
(以上使用余弦定理)((Above used Cosine theorem))
因為 (for)
C3 = (Mathf.Pow(p5x, 2) + Mathf.Pow(p5y, 2) + Mathf.Pow(p5z - L1, 2) - Mathf.Pow(L2, 2) - Mathf.Pow(L3+L4, 2)) / (2 * L2 * (L3+ L4));
theta[2] = Mathf.Atan2(Mathf.Pow(1 - Mathf.Pow(C3, 2), 0.5f), C3);
((①的平方+②的平方))和③的平方根,使用 (Squareroot of (squre of (1) + square of (2)) and (3),using)
當我們定義時 (when we define)
得到 S2 , C2 (to get S2 , C2)
因此 θ2 是 (so θ2 is)
float M = L2 + (L3+ L4) * C3;
float N = (L3+ L4) * Mathf.Sin((float)theta[2]);
float A = Mathf.Pow(p5x*p5x + p5y*p5y, 0.5f);
float B = p5z - L1;
theta[1] = Mathf.Atan2(M*A - N*B, N*A + M*B);
現在我們有 **θ1,θ2,θ3 (theta[0],theta[1],theta[2]) ** (Now we haveθ1,θ2,θ3 (theta[0],theta[1],theta[2]).)
末端執行器(a,b)的位姿與基座(a,b)的位姿的關系為 (Relation between pose of end effector (a,b)(a,b) and pose of base (a,b)(a,b) is)
應用反向旋轉(apply reverse rotations)
左邊可以用已知的值來計算。(Left side can be calculated with know values.)
右邊是 (Right side is)
因此 θ4,θ5,θ6 都是 (So θ4,θ5,θ6 are)
C1 = Mathf.Cos((float)theta[0]);
C23 = Mathf.Cos((float)theta[1] + (float)theta[2]);
S1 = Mathf.Sin((float)theta[0]);
S23 = Mathf.Sin((float)theta[1] + (float)theta[2]);
asx = C23 * (C1 * ax + S1 * ay) - S23 * az;
asy = -S1 * ax + C1 * ay;
asz = S23 * (C1 * ax + S1 * ay) + C23 * az;
bsx = C23 * (C1 * bx + S1 * by) - S23 * bz;
bsy = -S1 * bx + C1 * by;
bsz = S23 * (C1 * bx + S1 * by) + C23 * bz;
theta[3] = Mathf.Atan2(asy, asx);
theta[4] = Mathf.Atan2(Mathf.Cos((float)theta[3]) * asx + Mathf.Sin((float)theta[3]) * asy, asz);
theta[5] = Mathf.Atan2(Mathf.Cos((float)theta[3]) * bsy - Mathf.Sin((float)theta[3]) * bsx,
-bsz / Mathf.Sin((float)theta[4]));
END
UnityでアームロボットIK | unity | Meuse Robotics
網站原文1:
[のアムロボットシミュレショに]運動(反向運動學を導してみました]スライダーでアーム先端の位置と姿勢(6軸)を指定するとロボットがこれを満足するように動きます。
我知道の計は広瀬[ロボット]をにしました]あまり広範囲には動かせないようにしていますのでとりあえずうまくいっているようです。
翻譯:
[對Amrobot模擬]運動(我試圖指導反向運動)如果您用滑塊指定了臂尖的位置和姿勢(6個軸),則機器人將滿足此要求。
我完全選擇了Hirose [Robot]。]暫時看來它運行良好,因為我嘗試不將其移至很大范圍。
源代碼1
public class CalcIK : MonoBehaviour {
public Slider S_Slider; //PositionX min=4 max=12
public Slider L_Slider; //PositionY min=-4 max=4
public Slider U_Slider; //PositionZ min=4 max=12
public Slider R_Slider; //RotationX min=-90 max=90
public Slider B_Slider; //RotationY min=-90 max=90
public Slider T_Slider; //RotationZ min=-90 max=90
public static double[] theta = new double[6]; //angle of the joints
private float L1, L2, L3, L4, L5, L6; //arm length in order from base
private float C3;
void Start () {
theta[0] = theta[1] = theta[2] = theta[3] = theta[4] = theta[5] = 0.0;
L1 = 4.0f;
L2 = 6.0f;
L3 = 3.0f;
L4 = 4.0f;
L5 = 2.0f;
L6 = 1.0f;
C3 = 0.0f;
}
void Update () {
float px, py, pz;
float rx, ry, rz;
float ax, ay, az, bx, by, bz;
float asx, asy, asz, bsx, bsy, bsz;
float p5x, p5y, p5z;
float C1, C23, S1, S23;
px = S_Slider.value;
py = L_Slider.value;
pz = U_Slider.value;
rx = R_Slider.value;
ry = B_Slider.value;
rz = T_Slider.value;
ax = Mathf.Cos(rz * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
ay = Mathf.Sin(rz * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
az = -Mathf.Sin(ry * 3.14f / 180.0f);
p5x = px - (L5 + L6) * ax;
p5y = py - (L5 + L6) * ay;
p5z = pz - (L5 + L6) * az;
theta[0] = Mathf.Atan2(p5y, p5x);
C3 = (Mathf.Pow(p5x, 2) + Mathf.Pow(p5y, 2) + Mathf.Pow(p5z - L1, 2) - Mathf.Pow(L2, 2) - Mathf.Pow(L3+L4, 2))
/ (2 * L2 * (L3+ L4));
theta[2] = Mathf.Atan2(Mathf.Pow(1 - Mathf.Pow(C3, 2), 0.5f), C3);
float M = L2 + (L3+ L4) * C3;
float N = (L3+ L4) * Mathf.Sin((float)theta[2]);
float A = Mathf.Pow(p5x*p5x + p5y*p5y, 0.5f);
float B = p5z - L1;
theta[1] = Mathf.Atan2(M*A - N*B, N*A + M*B);
C1 = Mathf.Cos((float)theta[0]);
C23 = Mathf.Cos((float)theta[1] + (float)theta[2]);
S1 = Mathf.Sin((float)theta[0]);
S23 = Mathf.Sin((float)theta[1] + (float)theta[2]);
bx = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Sin(ry * 3.14f / 180.0f) * Mathf.Cos(rz * 3.14f / 180.0f)
- Mathf.Sin(rx * 3.14f / 180.0f) * Mathf.Sin(rz * 3.14f / 180.0f);
by = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Sin(ry * 3.14f / 180.0f) * Mathf.Sin(rz * 3.14f / 180.0f)
- Mathf.Sin(rx * 3.14f / 180.0f) * Mathf.Cos(rz * 3.14f / 180.0f);
bz = Mathf.Cos(rx * 3.14f / 180.0f) * Mathf.Cos(ry * 3.14f / 180.0f);
asx = C23 * (C1 * ax + S1 * ay) - S23 * az;
asy = -S1 * ax + C1 * ay;
asz = S23 * (C1 * ax + S1 * ay) + C23 * az;
bsx = C23 * (C1 * bx + S1 * by) - S23 * bz;
bsy = -S1 * bx + C1 * by;
bsz = S23 * (C1 * bx + S1 * by) + C23 * bz;
theta[3] = Mathf.Atan2(asy, asx);
theta[4] = Mathf.Atan2(Mathf.Cos((float)theta[3]) * asx + Mathf.Sin((float)theta[3]) * asy, asz);
theta[5] = Mathf.Atan2(Mathf.Cos((float)theta[3]) * bsy - Mathf.Sin((float)theta[3]) * bsx,
-bsz / Mathf.Sin((float)theta[4]));
}
}
Unityでアームロボットをシミュレーション | unity | Meuse Robotics
網站原文2:
安川電機のアームロボットを遠隔操作する案件があり、基本的にはWebカメラで見るのですが、ロボットの現在狀況を3Dで表示したいということでUnityを使ってみました。
Unityに関しては、Courseraのゲーム開発のコースを途中まで視聴した程度のレベルです。ですのでシミュレーションといってもアニメーションを表示するだけのものです。
ここではわかりやすくするためにロボットの関節角度をUnityのUIスライダーで與えています。実際にはロボットの関節角度データはロボットのコントローラからもらいます.
台座から手先に向けて順番に入れ子構造にしていくことで、ある関節を回した時にそこから先のアームを一體で動かすことができます。各アームは根元から、S、L、U、R、B、Tと名前がついています。アームにはそれぞれ円柱部材(Axis)があって、それより手先側のアセンブリの回転軸となっています。
Cadのデータを使ってかっこよくしたものがこちらです。
描畫フレームごとにスクリプト(RotationScript.cs)で各軸の回転処理を行います。
翻譯
有一個可以遠程控制Yasukawa Electric手臂機器人的項目,我基本上可以通過網絡攝像頭看到它,但是我想以3D方式顯示機器人的當前狀態,因此我嘗試使用Unity。
至於Unity,則是大約觀看Coursera的游戲開發課程的水平。因此,模擬只是顯示動畫。
在這里,為清楚起見,機器人的關節角度由Unity UI滑塊給出。實際上,機器人的關節角度數據是從機器人的控制器獲得的。
通過從基座到手按順序創建嵌套結構,當轉動某個關節時,可以整體移動超出該范圍的手臂。從根開始,每個手臂都被命名為S,L,U,R,B,T。每個臂都有一個圓柱形的構件(軸),該構件是手側組件的旋轉軸。
這是一個使用Cad數據的不錯的版本。
使用每個圖紙框架的腳本(RotationScript.cs)旋轉每個軸。
源代碼:
public class RotationScript : MonoBehaviour
{
public Transform target;
public Vector3 direction;
public int axisNum;
private Vector3 targetPos;
private float[] data = new float[6];
private float[] angle = new float[6];
public Slider S_Slider;
public Slider L_Slider;
public Slider U_Slider;
public Slider R_Slider;
public Slider B_Slider;
public Slider T_Slider;
void Start()
{
for (int i = 0; i < 6; i++)
{
angle[i] = 0;
}
}
void Update()
{
data[0] = S_Slider.value;
data[1] = L_Slider.value;
data[2] = U_Slider.value;
data[3] = R_Slider.value;
data[4] = B_Slider.value;
data[5] = T_Slider.value;
if (angle[axisNum] != data[axisNum])
{
targetPos = target.position;
transform.RotateAround(targetPos, target.up, data[axisNum]-angle[axisNum]);
angle[axisNum] = data[axisNum];
}
}
}
國外網站參考:
愛好機器人和電子玩具的規划和開發 • 嵌入式電路設計、軟件開發
• 機電一體化設備開發和設計
• 制造商大規模生產設計支持
• 工業臂機器人控制軟件開發
機器人、逆運動學:
個人信息:
姓名:鄒建
19年加入 四川省裝備制造機器人應用技術工程實驗室,Dream Studio 軟件工作室,負責軟件開發相關工作
擅長:Unity游戲開發,Unity機器人仿真,C#編程語言,工業軟件開發
QQ:451991189
B站ID:UnitySir
個人博客:
UnitySir - github.io
UnitySir - 博客園 (cnblogs.com)
- UnitySir (gitee.io)
UnitySir (bilibili)
B站ID:UnitySir
如果內容對你有所幫助:

