《机器人学一(Robotics(1))》_台大林沛群 第 4 周【机械臂 逆运动学】 Quiz 4

  • 待完善: 第5-7【暂时不清楚如何确定】

谁做出来了,麻烦指下路,谢谢!

  • 第6-7: 连猜带蒙🤣

####################################################
整个流程 走下来,只剩一个解了
在这里插入图片描述
不理解 第5-7题 为啥 还有双解。

##########################################################

coursera链接

文章目录

      • 第1题
      • 第2题
      • 第3题
      • 第4题
      • 第5题-8
        • 求解 θ3-θ1的 Python 代码
      • 第8题
        • 求解 θ4 - θ6的 Python 代码
        • θ 确定过程
        • 正运动学 求解 T_06 验证代码 _Python
        • Matlab代码_参考

第1题

在这里插入图片描述
i = 2
1)、根据右手定则 : 右手拇指(Z), 四指(X),掌心朝向(Y)

  • Z 为 垂直 纸面 朝外

2)、右手拇指指向 X ^ 1 \hat{X}_{1} X^1,将 Z ^ 1 \hat{Z}_{1} Z^1旋转到 Z ^ 2 \hat{Z}_{2} Z^2的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。

在这里插入图片描述

第2题

2、
在这里插入图片描述
在这里插入图片描述

第3题

3、
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
t a n ( θ 1 ) = Y X tan(θ_1)=\frac{Y}{X} tan(θ1)=XY

import math
θ1 = 180 * math.atan(40/69.28)/ math.pi  ## 弧度转角度
print(θ1)  ## 30

答案: 30

套了半天公式的我🤣

第4题

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参考点: D(桌角) Desk
杯子——> 桌角——> 机械手
易于找到P, 用这个公式:
在这里插入图片描述
求R:
这里的转轴为 Y
注意角度的正负判断: 右手拇指指向Y, 四指弯曲方向为正
在这里插入图片描述

题中 右手拇指指向 Y ^ C \hat{Y}_C Y^C X ^ C \hat{X}_C X^C 相对于 X ^ D \hat{X}_D X^D 转向 与四指弯曲方向相反, 为负

import numpy as np ## 无转动
R_WD = [[1, 0, 0],[0, 1, 0],[0, 0, 1]]
a = np.row_stack((R_WD,[[0, 0, 0]]))  ## 扩展 行
P = np.array([[830, 20, 330, 1]])
T_WD = np.column_stack((a,P.T))  ## 扩展 列, 注意 转置
# print(T_WD)## 绕  Y轴 转
θ = np.pi * (-60)/180   ## 注意 正负 判断
R_DC = [[np.cos(θ), 0, np.sin(θ)],[0, 1, 0],[-np.sin(θ), 0, np.cos(θ)]]
# print(R_DC)a = np.row_stack((R_DC,[[0, 0, 0]]))
P = np.array([[-500, 452, 410, 1]])
T_DC = np.column_stack((a,P.T))T_WC = np.dot(T_WD, T_DC) T_WC = [[float(format(x, '.3g')) for x in T_WC[i]] for i in range(len(T_WC))]  ## 保留 3位有效数字
print(T_WC)

在这里插入图片描述在这里插入图片描述

答案: 0.5//-0.866//0.866//330//472//740

############################

补充: 课件里 是沿着 Z轴转

在这里插入图片描述

在这里插入图片描述
############################

第5题-8

在这里插入图片描述
参考 PPT Pieper’s Solution 部分, 题5-8一起做,因为由于 θ1的范围限制,可以排除一些 θ3 值。 但 θ2, θ1的选项仍有很多。
在这里插入图片描述

求解 θ3-θ1的 Python 代码

最终版本:

import numpy as np ########################## 求 T_WC
## 无转动
R_WD = [[1, 0, 0],[0, 1, 0],[0, 0, 1]]
a = np.row_stack((R_WD,[[0, 0, 0]]))  ## 扩展 行
P = np.array([[830, 20, 330, 1]])
T_WD = np.column_stack((a,P.T))  ## 扩展 列, 注意 zhuan
# print(T_WD)## 绕  Y轴 转
θ = np.pi * (-60)/180   ## 注意 正负 判断
R_DC = [[np.cos(θ), 0, np.sin(θ)],[0, 1, 0],[-np.sin(θ), 0, np.cos(θ)]]
# print(R_DC)a = np.row_stack((R_DC,[[0, 0, 0]]))
P = np.array([[-500, 452, 410, 1]])
T_DC = np.column_stack((a,P.T))T_WC = np.dot(T_WD, T_DC) # T_WC = [[float(format(x, '.3g')) for x in T_WC[i]] for i in range(len(T_WC))]  
# print(T_WC)   ## 第 4 题答案
################################################ 求 T_06# 求 T_W0
# α, a, d, θ = 0, 0, 373, 0
## 无转动 
T_W0 = [[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 373],[0, 0, 0, 1]]
# print(T_W0)# 求 T_6C  Xc 和 Z6 方向相同,  Yc和 Y6 反向, Zc 和 X6 同向
T_6C = [[0, 0, 1, 0],[0, -1, 0, 0],[1, 0, 0, 206],[0, 0, 0, 1]]T = np.dot(np.linalg.inv(T_W0), T_WC)
T_06 = np.dot(T, np.linalg.inv(T_6C))
# print(T_06)P_04 = P_06 = np.array([[227, 472, 188.59876682, 1]])
x, y, z  = 227, 472, 188.59876682
################## α2, a2, d3 = 0, 340, 0   ## θ3
α3, a3, d4 = np.pi*(-90)/180, -40, 338   ## θ4
'''
## 仅与 θ3 有关
f1 = a3 * np.cos(θ3) + d4 * np.sin(α3)*np.sin(θ3) + a2 
#f2 = a3 * np.cos(α2)*np.sin(θ3) - d4 * np.sin(α3)*np.cos(α2)*np.cos(θ3) -\
#        d4 * np.sin(α2)*np.cos(α3) - d3 * np.sin(α2)
f2 = a3 * np.sin(θ3) - d4 * np.sin(α3) * np.cos(θ3)      #f3 = a3 * np.sin(α2)* np.sin(θ3)- d4 * np.sin(α3)* np.sin(α2) * np.cos(θ3) + \
#       d4 * np.cos(α2) * np.cos(α3) + d3 * np.cos(α2)
f3 = d4 * np.cos(α3)
# print(f3)
'''
# 对 i= 1 i= 2
α0, a0, d1 = 0, 0, 0   ## θ1
α1, a1, d2 = np.pi*(-90)/180, -30, 0  ## θ2'''
## 和 θ2,θ3有关
g1 = np.cos(θ2)* f1 - np.sin(θ2) * f2 + a1
# g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\
#      np.sin(α1) * f3 - d2 * np.sin(α1)
## 化简
g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\np.sin(α1) * f3
# g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\
#      np.cos(α1) * f3 + d2 * np.cos(α1)
## 化简
g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\np.cos(α1) * f3 ''''''
## a1 不等于 0 
k1 = f1 
k2 = -f2 
#k3 = f1**2 + f2**2 + f3**2 + a1**2 + d2**2 + 2*d2*f3
k3 = f1**2 + f2**2 + f3**2 + a1**2
#k4 = f3 * np.cos(α1) + d2 * np.cos(α1)
k4 = 0
'''## 
r = x**2 + y**2 + z**2   ## 可解'''
f1 = a3 * np.cos(θ3) + d4 * np.sin(α3)*np.sin(θ3) + a2
f2 = a3 * np.sin(θ3) - d4 * np.sin(α3) * np.cos(θ3) 
f3 = d4 * np.cos(α3)
k1 = f1 
k2 = -f2
k3 = f1**2 + f2**2 + f3**2 + a1**2
k4 = 0
'''
### 解 超越方程
from sympy import *
θ3 = symbols('θ3')f = (r-a1**2- (a3 * cos(θ3) + d4 * sin(α3)*sin(θ3) + a2 )**2 \- (a3 * sin(θ3) - d4 * sin(α3) * cos(θ3))**2 \- (d4 * cos(α3))**2 )**2/(4 * a1**2) \+ z**2/(sin(α1))**2 \- (a3 * cos(θ3) + d4 * sin(α3)*sin(θ3) + a2)**2 \- (a3 * sin(θ3) - d4 * sin(α3) * cos(θ3))**2# f = ((r - k3)**2)/(4*a1**2) + ((z-k4)**2)/(np.sin(α1))**2 - k1**2 - k2**2
root3 = solve([f],[θ3])
print('θ3(弧度值): ', root3)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ3_du = [180 * root3[i][0] / np.pi for i in range(len(root3))]  ## θ3 弧度换角度
print('θ3(以度为单位): ', θ3_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
## 求解 θ2
# 结果汇总
# θ3(以度为单位):  [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
# θ3 = -3.05085978803173(无满足要求的θ1), -2.76035600105476(符合), -0.616827296276209(符合), -0.326323509299240(无满足要求的θ1)# θ2 =[-2.82490122970046, -2.09516142685496],\# [0.207932140057394, 0.864458274997230]#  [-0.864458274997158, -0.207932140057458]# θ3的有效解   -2.76035600105476 ,  -0.616827296276209 
θ3 =  -0.616827296276209 f1 = a3 * np.cos(θ3) + d4 * np.sin(α3)*np.sin(θ3) + a2 
f2 = a3 * np.cos(α2)*np.sin(θ3) - d4 * np.sin(α3)*np.cos(α2)*np.cos(θ3) - d4 * np.sin(α2)*np.cos(α3) - d3 * np.sin(α2)
f3 = a3 * np.sin(α2)* np.sin(θ3)- d4 * np.sin(α3)* np.sin(α2) * np.cos(θ3) + d4 * np.cos(α2) * np.cos(α3) + d3 * np.cos(α2)k1 = f1 
k2 = -f2 
k3 = f1**2 + f2**2 + f3**2 + a1**2 + d2**2 + 2*d2*f3θ2 = symbols('θ2')f = (k1 * cos(θ2) + k2 * sin(θ2)) * 2 * a1 + k3 - r
root2 = solve([f],[θ2])
θ2 = [root2[i][0] for i in range(len(root2))]
print(θ2)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ2_du = [180 * root2[i][0] / np.pi for i in range(len(root2))]  ## θ3 弧度换角度
print('θ2(以度为单位): ', θ2_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
## 求解  θ1 [-90, 90]
## 结果汇总
# θ2 = -2.82490122970046(不满足要求)
# θ1 = θ1(以度为单位):  [-115.684399755325, 115.684399755325] 
###
# θ2 = -2.09516142685496(不满足要求)
# θ1 = θ1(以度为单位):  [-115.684399755325, 115.684399755325]################## θ31  满足
# θ2(以度为单位):  [11.9136340504118, 49.5298107225008]# θ2 = 0.207932140057394
# θ1(以度为单位):  [-64.3156002446740, 64.3156002446740]# θ2 = 0.864458274997230
# θ1(以度为单位):  [-64.3156002446740, 64.3156002446740]################## θ32  
# [-0.864458274997158, -0.207932140057458]
# θ2(以度为单位):  [-49.5298107224966, -11.9136340504155]# θ2 = -0.864458274997158 
# θ1(以度为单位):  [-64.3156002446747, 64.3156002446747]
# θ2 = -0.207932140057458
# θ1(以度为单位):  [-64.3156002446747, 64.3156002446747]# θ33θ2 = -0.207932140057458
g1 = np.cos(θ2)* f1 - np.sin(θ2) * f2 + a1
g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\np.sin(α1) * f3 - d2 * np.sin(α1)
g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\np.cos(α1) * f3 + d2 * np.cos(α1)θ1 = symbols('θ1')f = g1 * cos(θ1) - g2 * sin(θ1) - x
root1 = solve([f],[θ1])
θ1 = [root1[i][0] for i in range(len(root1))]
print(θ1)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ1_du = [180 * root1[i][0] / np.pi for i in range(len(root1))]  ## θ3 弧度换角度
print('θ1(以度为单位): ', θ1_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]

中间版本代码(可能有误):

import numpy as np ########################## 求 T_WC
## 无转动
R_WD = [[1, 0, 0],[0, 1, 0],[0, 0, 1]]
a = np.row_stack((R_WD,[[0, 0, 0]]))  ## 扩展 行
P = np.array([[830, 20, 330, 1]])
T_WD = np.column_stack((a,P.T))  ## 扩展 列, 注意 zhuan
# print(T_WD)## 绕  Y轴 转
θ = np.pi * (-60)/180   ## 注意 正负 判断
R_DC = [[np.cos(θ), 0, np.sin(θ)],[0, 1, 0],[-np.sin(θ), 0, np.cos(θ)]]
# print(R_DC)a = np.row_stack((R_DC,[[0, 0, 0]]))
P = np.array([[-500, 452, 410, 1]])
T_DC = np.column_stack((a,P.T))T_WC = np.dot(T_WD, T_DC) # T_WC = [[float(format(x, '.3g')) for x in T_WC[i]] for i in range(len(T_WC))]  
# print(T_WC)   ## 第 4 题答案
################################################ 求 T_06# 求 T_W0
# α, a, d, θ = 0, 0, 373, 0
## 无转动 
T_W0 = [[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 373],[0, 0, 0, 1]]
# print(T_W0)# 求 T_6C  Xc 和 Z6 方向相同,  Yc和 Y6 反向, Zc 和 X6 同向
T_6C = [[0, 0, 1, 0],[0, -1, 0, 0],[1, 0, 0, 206],[0, 0, 0, 1]]T = np.dot(np.linalg.inv(T_W0), T_WC)
T_06 = np.dot(T, np.linalg.inv(T_6C))
# print(T_06)P_04 = P_06 = np.array([[227, 472, 188.59876682, 1]])
x, y, z  = 227, 472, 188.59876682,
################## 
### 针对 i = 3, i = 4
α2, a2, d3 = 0, 340, 0   ## θ3
α3, a3, d4 = np.pi*(-90)/180, -40, 338   ## θ4"""
## 仅与 θ3 有关
f1  = a3 * np.cos(θ3) + d4 * np.sin(α3)*np.sin(θ3) + a2 
# f2_θ3 = a3 * np.cos(α2)*np.sin(θ3) - d4 * np.sin(α3)*np.cos(α2)*np.cos(θ3) -\
#         d4 * np.sin(α2)*np.cos(α3) - d3 * np.sin(α2)
## 化简:
f2  = a3 * np.sin(θ3) - d4 * np.sin(α3) * np.cos(θ3)
# f3  = a3 * np.sin(α2)* np.sin(θ3)- d4 * np.sin(α3)* np.sin(α2) * np.cos(θ3) + \
#         d4 * np.cos(α2) * np.cos(α3) + d3 * np.cos(α2)
## 化简
f3 = d4 * np.cos(α3)  ## 2.069653090559027e-14   ## 可求
# print(f3)"""
# 对 i= 1 i= 2
α0, a0, d1 = 0, 0, 0   ## θ1
α1, a1, d2 = np.pi*(-90)/180, -30, 0  ## θ2"""
## 和 θ2,θ3有关
g1 = np.cos(θ2)* f1 - np.sin(θ2) * f2 + a1
# g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\
#      np.sin(α1) * f3 - d2 * np.sin(α1)
## 化简
g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\np.sin(α1) * f3
# g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\
#      np.cos(α1) * f3 + d2 * np.cos(α1)
## 化简
g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\np.cos(α1) * f3 ## a1 不等于 0 
k1 = f1 
k2 = -f2 
# k3 = f1**2 + f2**2 + f3**2 + a1**2 + d2**2 + 2*d2*f3
## 化简
k3 = f1**2 + f2**2 + f3**2 + a1**2
# k4 = f3 * np.cos(α1) + d2 * np.cos(α1)
## 化简
k4 = 0
"""## 
r = x**2 + y**2 + z**2   ## 可解# from scipy.optimize import fsolve
# def func(θ3):
#     return # root = solve([func], [θ3] )
# print(root)from sympy import *
θ3 = symbols('θ3')f = (r-a1**2- (a3 * cos(θ3) + d4 * sin(α3)*sin(θ3) + a2 )**2 - (a3 * sin(θ3) - d4 * sin(α3) * cos(θ3))**2 - (d4 * cos(α3))**2 )**2/(4 * a1**2) + z**2/(sin(α1))**2 - (a3 * cos(θ3) + d4 * sin(α3)*sin(θ3) + a2)**2 - (a3 * sin(θ3) - d4 * sin(α3) * cos(θ3))**2root3 = solve([f],[θ3])
print('θ3(弧度值): ', root3)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ3_du = [180 * root3[i][0] / np.pi for i in range(len(root3))]  ## θ3 弧度换角度
print('θ3(以度为单位): ', θ3_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
## 求解 θ2
# 结果汇总
# θ3(以度为单位):  [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
# θ3 = -3.05085978803173(无满足要求的θ1), -2.76035600105476(符合), -0.616827296276209(符合), -0.326323509299240(无满足要求的θ1)# θ2 =[-2.82490122970046, -2.09516142685496],\# [0.207932140057394, 0.864458274997230]#  [-0.864458274997158, -0.207932140057458]θ3 =  -0.326323509299240
f1  = a3 * np.cos(θ3) + d4 * np.sin(α3) * np.sin(θ3) + a2 
f2  = a3 * np.sin(θ3) - d4 * np.sin(α3) * np.cos(θ3)
f3 = d4 * np.cos(α3) 
k1 = f1 
k2 = -f2 
k3 = f1**2 + f2**2 + f3**2 + a1**2θ2 = symbols('θ2')f = (k1 * cos(θ2) + k2 * sin(θ2))*2 * a1 + k3 - r
root2 = solve([f],[θ2])
θ2 = [root2[i][0] for i in range(len(root2))]
print(θ2)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ2_du = [180 * root2[i][0] / np.pi for i in range(len(root2))]  ## θ3 弧度换角度
print('θ2(以度为单位): ', θ2_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]
## 求解  θ1 [-90, 90]
## 结果汇总
# θ2 = -2.82490122970046(不满足要求)
# θ1 = θ1(以度为单位):  [-115.684399755325, 115.684399755325] 
###
# θ2 = -2.09516142685496(不满足要求)
# θ1 = θ1(以度为单位):  [-115.684399755325, 115.684399755325]## θ31  满足
# θ2(以度为单位):  [11.9136340504118, 49.5298107225008]
# θ2 = 0.207932140057394
# θ1(以度为单位):  [-64.3156002446740, 64.3156002446740]# θ2 = 0.864458274997230
# θ1(以度为单位):  [-64.3156002446740, 64.3156002446740]# θ32  
# θ2 = -0.864458274997158 
# θ1(以度为单位):  [-64.3156002446747, 64.3156002446747]
# θ2 = -0.207932140057458
# θ1(以度为单位):  [-64.3156002446747, 64.3156002446747]# θ33θ2 = 2.82490122970057
g1 = np.cos(θ2)* f1 - np.sin(θ2) * f2 + a1
g2 = np.sin(θ2)* np.cos(α1) * f1 + np.cos(θ2) * np.cos(α1)* f2 -\np.sin(α1) * f3
g3 = np.sin(θ2)* np.sin(α1) * f1 + np.cos(θ2) * np.sin(α1)* f2 +\np.cos(α1) * f3 θ1 = symbols('θ1')f = g1 * cos(θ1) - g2 * sin(θ1) - x
root1 = solve([f],[θ1])
θ1 = [root1[i][0] for i in range(len(root1))]
print(θ1)# lis = [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ1_du = [180 * root1[i][0] / np.pi for i in range(len(root1))]  ## θ3 弧度换角度
print('θ1(以度为单位): ', θ1_du )  # [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]

第5题答案:-158//-35

第6题和第7题不理解正负怎么定的

在这里插入图片描述
第6题答案: 12//-50
在这里插入图片描述
第7题答案: 64

第8题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

求解 θ4 - θ6的 Python 代码

import numpy as np#  求解  θ4, θ5, θ6   [-90, 90]## 沿着 Z  旋转 x, 先旋转θ1, 再旋转 θ2, 再旋转 θ3, 
# θ1   θ1(以度为单位):  [-64.3156002446747, 64.3156002446747]
θ = 1.12251898466604  ##   可选 [-1.12251898466604, 1.12251898466604]
α = 0
R_01 = [[np.cos(θ), -np.sin(θ), 0],[np.sin(θ)*np.cos(α), np.cos(θ)*np.cos(α), -np.sin(α)],[np.sin(θ)*np.sin(α), np.cos(θ)*np.sin(α), np.cos(α)]]# θ2 = np.pi * (-52.2)/180    ## 12//-50  -12  50
# 可选  4个
# [-0.864458274997158, -0.207932140057458]
# θ2(以度为单位):  [-49.5298107224966, -11.9136340504155]# [0.864458274997158, 0.207932140057458]
# θ2(以度为单位):   [49.5298107224966, 11.9136340504155]θ = -0.864458274997158  ## 
α = np.pi * (-90)/180
R_12 = [[np.cos(θ), -np.sin(θ), 0],[np.sin(θ)*np.cos(α), np.cos(θ)*np.cos(α), -np.sin(α)],[np.sin(θ)*np.sin(α), np.cos(θ)*np.sin(α), np.cos(α)]]# θ3 = np.pi * (2.5)/180  ## -158//-35
## 可选 2个 θ = -0.616827296276209 ## -2.76035600105476(符合), -0.616827296276209(符合)
α = 0
R_23 = [[np.cos(θ), -np.sin(θ), 0],[np.sin(θ)*np.cos(α), np.cos(θ)*np.cos(α), -np.sin(α)],[np.sin(θ)*np.sin(α), np.cos(θ)*np.sin(α), np.cos(α)]]R = np.dot(R_01, R_12)
R_03 = np.dot(R, R_23)
# print(R_03)## 由之前 计算的 T_06 
R_06 = [[ -0.8660254,  0. ,0.5],[  0., -1., 0.],[  0.5, 0., 0.8660254]]### 注意这一步处理,这里 和 PPT 里不一样
θ = np.pi * (-90)/180
R_34X = [[1, 0, 0],[0, np.cos(θ), -np.sin(θ)],[0, np.sin(θ), np.cos(θ)]]R_36 = np.dot(np.linalg.inv(np.dot(R_03, R_34X)), R_06)  ## 需要 先将 Z3 转到 Z4 , 才能 继续 使用 ZYZ 欧拉角  计算
# print(R_36)
r31 = R_36[2][0]
r32 = R_36[2][1]
r33 = R_36[2][2]
r23 = R_36[1][2]
r13 = R_36[0][2]
import math
β = math.atan2(math.sqrt(r31**2 + r32**2), r33)  ## 此外, 当 β 选负时,还有 一种 姿态选项, 而后续的θ4和 θ6 仅与 β的选值有关print("解1:")
# print(β)  ## 1.1033617668479667  63
## 由PPT P25 DH定义  与 ZYZ 欧拉角度  转换关系
print('θ5:',180*β/np.pi)# β = 1.1033617668479667
α = math.atan2(r23/np.sin(β), r13/np.sin(β))
print('θ4:',180*α/np.pi + 180)γ = math.atan2(r32/np.sin(β), -r31/np.sin(β))
print('θ6:', 180*γ/np.pi + 180)###
print("解2:")
β = -β  ## 另一组姿态
print('θ5:',180*β/np.pi)
α = math.atan2(r23/np.sin(β), r13/np.sin(β))
print('θ4:',180*α/np.pi + 180)
γ = math.atan2(r32/np.sin(β), -r31/np.sin(β))
print('θ6:', 180*γ/np.pi + 180)

θ 确定过程

1、
θ3(弧度值): [(-3.05085978803173,), (-2.76035600105476,), (-0.616827296276209,), (-0.326323509299240,)]
θ3(以度为单位): [-174.801389740395, -158.156748814047, -35.3416007650924, -18.6969598387445]

11、θ3 = -3.05085978803173
θ2(弧度值): [-2.82490122970046, -2.09516142685496]
θ2(以度为单位): [-161.854918003153, -120.043907157397]

θ1(弧度值): [-2.01907366892374, 2.01907366892374]
θ1(以度为单位): [-115.684399755325, 115.684399755325]

[]
θ1(以度为单位): []
没有符合条件[-90, 90]的θ1

12、θ3 = -2.76035600105476(-158)
θ2(弧度值): [0.207932140057394, 0.864458274997230]
θ2(以度为单位): [11.9136340504118, 49.5298107225008]

两个 θ2 求得的 θ1 一样:
θ1(弧度值): [-1.12251898466603, 1.12251898466603]
θ1(以度为单位): [-64.3156002446740, 64.3156002446740]

求解 θ5, θ4, θ6:

θ2θ1θ5θ4θ6与T_06一致
50-64-61-3177
5064-6131-77

根据 正运动学 方法 求解 T_06, 对比验证:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

13、θ3 = -0.616827296276209(-35)
θ2(弧度值): [-0.864458274997158, -0.207932140057458]
θ2(以度为单位): [-49.5298107224966, -11.9136340504155]

两个 θ2 求得的 θ1 一样:
θ1(弧度值): [-1.12251898466603, 1.12251898466603]
θ1(以度为单位): [-64.3156002446740, 64.3156002446740]

求解 θ5, θ4, θ6:

θ2θ1θ5θ4θ6
-5064-8227-65
-50-64-82-2765

根据 正运动学 方法 求解 T_06, 对比验证:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

14、θ3 = -0.326323509299240
θ2(弧度值): [2.09516142685485, 2.82490122970057]
θ2(以度为单位): [120.043907157391, 161.854918003159]

θ1(弧度值): [-2.01907366892376, 2.01907366892376]
θ1(以度为单位): [-115.684399755326, 115.684399755326]

θ1(弧度值): [-2.01907366892376, 2.01907366892376]
θ1(以度为单位): [-115.684399755326, 115.684399755326]
没有符合条件[-90, 90]的θ1

第8题答案: 27//-82//-65

正运动学 求解 T_06 验证代码 _Python

## 通过 T_06  再次验证 
import numpy as np
def getT(α, a, d, θ):α = np.pi * α / 180θ = np.pi * θ / 180T = [[np.cos(θ), -np.sin(θ), 0, a],[np.sin(θ)*np.cos(α), np.cos(θ)*np.cos(θ), -np.sin(α), -np.sin(α) * d],[np.sin(θ)*np.sin(α), np.cos(θ)*np.sin(α), np.cos(α), np.cos(α) * d],[0, 0, 0, 1]]return TT_01 = getT(0, 0, 0,    64)
T_12 = getT(-90, -30, 0, 50)
T = np.dot(T_01, T_12)
T_23 = getT(0, 340, 0,  -158)
T = np.dot(T, T_23)
T_34 = getT(-90, -40,338, 31)
T = np.dot(T, T_34)
T_45 = getT(90, 0, 0,     -61)
T = np.dot(T, T_45) 
T_56 = getT(-90, 0, 0,   -77)
T_06 = np.dot(T, T_56)
print(T_06)# R_06 = [[ -0.8660254,  0. ,0.5],
#         [  0., -1., 0.],
#         [  0.5, 0., 0.8660254]]

在这里插入图片描述

Matlab代码_参考

github链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/123666.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣每日一题05】数组篇--加一

一、题目 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入&#xff1…

【HTML专栏3】!DOCTYPE、lang、字符集的作用

本文属于HTML/CSS专栏文章,适合WEB前端开发入门学习,详细介绍HTML/CSS如果使用,如果对你有所帮助请一键三连支持,对博主系列文章感兴趣点击下方专栏了解详细。 博客主页:Duck Bro 博客主页系列专栏:HTML/CS…

nginx请求接口转发-浏览器访问80端口,要把请求转发至8882

1、需求 浏览器访问80端口,要把请求转发至8882 2、实现 修改ngixn配置文件 ngin配置文件在nginx安装目录/nginx/conf文件夹下 cd /usr/local/nginx/confvi ngin.conf修改server配置 server {listen 80;server_name localhost;location / {proxy_pass …

怎么做手机App测试?app测试详细流程和方法介绍

APP测试 1、手机APP测试怎么做? 手机APP测试,主要针对的是android和ios两大主流操作系统,主要考虑的就是功能性、兼容性、稳定性、易用性(也就是人机交互)、性能。 手机APP测试前的准备: 1.使用同类型的…

docker容器运行成功但无法访问,原因分析及对应解决方案(最新,以Tomcat为例,亲测有效)

原因分析: 是否能访问当运行docker容器虚拟机(主机)地址 虚拟机对应的端口号是否开启或者防墙是否关闭 端口映射是否正确(这个是我遇到的) tomcat下载的是最新版,docker运行后里面是没有东西的&am…

Json“牵手”阿里巴巴商品详情数据方法,阿里巴巴商品详情API接口,阿里巴巴API申请指南

阿里巴巴平台是全球领先的网上B2B交易市场。阿里巴巴(B2B.com)是全球国际贸易领域内最大、最活跃的网上交易市场和商人社区。它拥有来自200余个国家和地区超过360万的注册用户,阿里巴巴中国站在中国地区拥有超过2100万的注册用户。 阿里巴巴…

【笔试强训选择题】Day35.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言 一、Da…

Openvslam

文章目录 Openvslam 学习报告什么是Openvslam概念特点 安装和运行OpenVSLAM克隆源代码安装依赖库测试(环境已经安装成功)运行运行失败的总结运行成功 系统设计模块和函数接口调用流程流程图参考资料 Openvslam 学习报告 什么是Openvslam 概念 OpenVSL…

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run()函数是线程体函数,用于定义线程的功能…

SW的stp文件转成CAD格式文件学习笔记

SW的stp文件转成CAD格式文件 如图一个STP文件,右上角标注是什么文件呢 另存为零件图,即另存为part 如图所示 用solidworks打开另存为的零件图,点击是,会识别特征 . 直接默认点对勾 之后会出现可编辑的零件图 另存为CA…

文件上传漏洞-upload靶场13-16关 (图片木马-文件包含与文件上次漏洞)

文件上传漏洞-upload靶场13-16关 (图片木马-文件包含与文件上次漏洞) 简介 upload靶场到了第十三关,难度就直线上升了,在最后这7关中,包含了图片木马、竞争条件等上传技巧,这些漏洞的本质,都是…

如何修复老照片?老照片修复翻新的方法

老旧照片,尤其是黑白照片,往往因为年代久远、保存方式不当等原因而出现褪色、污损、划痕等问题,会比较难以修复,就算是技术精湛的专业修复师,也是需要投入极大时间精力的,效果也是不可预料的。 修复老照片…

算法:数组常见套路1---双指针、取模、打擂台法

一、数组的合并–双指针[快慢指针] 1、题目: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺…

3、Spring 之IOC 容器 详解

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的…

数据向好,分析师预测美联储GDP或将翻一番?

KlipC报道:最新公布的一些数据显示,美国经济看起来十分稳健,华尔街人士认为,这可能促使美联储本月公布的将2023年经济增长预测提高一倍,同时下调明年降息的预期幅度。 KlipC的合伙人Andi D表示:“在从消费者…

高压放大器在机械制造领域的应用有哪些

在机械制造领域,高压放大器扮演着至关重要的角色。它们被广泛应用于各种机械设备和系统中,提供高压力、高精度的电信号放大。下面安泰电子将详细介绍高压放大器在机械制造领域的几个关键应用。 材料测试和强度试验 高压放大器广泛应用于材料测试和强度试…

什么是跨域问题 ?Spring MVC 如何解决跨域问题 ?Spring Boot 如何解决跨域问题 ?

目录 1. 什么是跨域问题 ? 2. Spring MVC 如何解决跨域问题 ? 3. Spring Boot 如何解决跨域问题 ? 1. 什么是跨域问题 ? 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。 跨域问题的 3 种情况&#x…

【C++ Core Guidelines解析】C++学习之路的一盏明灯

前言:C语言的功能非常丰富,表达能力非常强。因为一种成功的通用编程语言拥有的功能必须比任何开发人员所需要的更多,任何一种有生命力且不断发展的语言都会不断积累用于表达程序员思想的替代用法。这会导致选择过载。那么,开发人员…

专业的视觉特效处理包,FxFactory 8 Pro for Mac助您打造精彩视频

FxFactory 8 Pro for Mac是一款强大的视觉特效处理包,专门为Mac用户设计。它集成了超过200种高质量的视觉效果和过渡效果,可以轻松地应用于各种视频项目中。该软件提供了一个直观的界面,用户可以通过简单拖放操作将特效应用到视频片段上。它支…

Lesson5-1:OpenCV视频操作---视频读写

学习目标 掌握读取视频文件,显示视频,保存视频文件的方法 1 从文件中读取视频并播放 在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件: 创建读取视频的对象 cap cv.VideoCapt…