• 机械臂速成小指南(九):正运动学分析


    指南目录📖:

    机械臂速成小指南(零):指南主要内容及分析方法

    机械臂速成小指南(一):机械臂发展概况

    机械臂速成小指南(二):机械臂的应用

    机械臂速成小指南(三):机械臂的机械结构

    机械臂速成小指南(四):机械臂关键部件之减速机

    机械臂速成小指南(五):末端执行器

    机械臂速成小指南(六):步进电机驱动器

    机械臂速成小指南(七):机械臂位姿的描述方法

    机械臂速成小指南(八):运动学建模(标准DH法)

    机械臂速成小指南(九):正运动学分析​​​​​​​

            在第八章中,我们已经得到了所使用机械臂的DH参数,如下表所示:

    DH参数及关节变量的范围
    连杆编号 关节变量范围
    164.2-90169.77θ1(-170,+170)
    230500θ2(-132,0)
    30900θ3(1,141)
    40-90-222.63θ4(-165,+ 165)
    50900θ5(-105,+105)
    600-36.25θ6(-155,+155)

            在确定机械臂的DH参数后,使用齐次变换矩阵描述各坐标系之间的旋转、平移关系,并利用齐次变换矩阵构建机械臂的正运动学方程,以此对六自由度机械臂展开正运动学分析。

    一、构建机械臂的正运动学方程

            从坐标系i到坐标系i-1 的齐次变换矩阵 是一个仅与关节变量有关的函数,本文记为 。下面列出推导 的过程,以坐标系​​​​​​​i与坐标系i-1 为例,坐标变换坐标系的旋转、平移过程如下图所示。

            首先,设一坐标系k 与坐标系i-1 排列一致,然后将坐标系k 沿轴zi-1 平移di 并绕轴zi-1 旋转θi。此时坐标系k 已与坐标系 排列一致,该过程可用齐次变换矩阵描述为

    式中 表示cos(n) 表示sin(n) ,计算时需考虑到两个坐标系的x 轴之间初始的夹角θ

            接着,将坐标系k 沿轴xi' 平移 并绕其旋转,这使得坐标系与坐标系i 排列一致,该过程可用齐次变换矩阵描述为

            从坐标系i 到坐标系i-1 的齐次变换矩阵可通过右乘单一变换矩阵 得出,为

            根据上式可得出表示各坐标系间相对位置和方向的齐次变换矩阵,将其看作各关节的齐次变换矩阵,计算结果如下表所示。

    关节编号齐次变换矩阵
    1
    2
    3
    4
    5
    6

            由于坐标系0与基坐标系重合,又由于坐标系6即为工具坐标系,所以有

            则用于表示工具坐标系相对于基坐标系的正运动学方程可以由上表中6个齐次变换矩阵右乘得出,为

            ​​​​前三个关节组成拟人臂,则其正运动学方程表示为

    其中, 分别表示sin⁡(qj+…+qk) cos⁡(qj+…+qk) 

            后三个关节组成球形腕,同理可得,球型腕的正运动学方程可表示为

            进而可以得出机械臂的正运动学方程为:

            其中,为关节变量组成的向量,向量q的空间称为关节空间

            经计算,末端执行器的位置表示为

            同理,可得到末端执行器的姿态表示为

    最终,末端执行器的RPY角可表示为关于关节变量的超越函数,即

            至此,机械臂的正运动学公式求解完毕,当我们将关节变量代入公式即可得到末端执行器的位姿。

    二、正运动学方程求解的编程实现

            由于正运动学方程运算量较大,为提高运算速度,我们选择使用上位机完成运算。使用Python编写机械臂正运动方程求解函数CalcFwdKin(),输入参数为6个关节变量,输出为末端执行器的位置与姿态。

            机械臂的正运动学方程是关节变量的超越函数,求解过程中存在大量的三角函数计算及矩阵运算,因此我们引入Python自带的math标准库,该模块提供了许多对浮点数的数学运算函数。

            在求解正运动学方程的过程中使用math.sin()、math.cos()及math.atan2()完成三角函数的计算;使用math.sqrt()求取平方根;通过math.degrees()及math.radians()完成弧度与角度之间的转换。

            要使用 math 函数必须先导入:

    import math

            效果如下图所示:

    1. ############## DH TABLE ################
    2. ############## DH 参数表 ###############
    3. C13 = C4
    4. C14 = C5
    5. C15 = C6
    6. C16 = C7
    7. C17 = C8
    8. C18 = C9
    9. D13 = math.radians(DHr1)
    10. D14 = math.radians(DHr2)
    11. D15 = math.radians(DHr3)
    12. D16 = math.radians(DHr4)
    13. D17 = math.radians(DHr5)
    14. D18 = math.radians(DHr6)
    15. E13 = DHd1
    16. E14 = DHd2
    17. E15 = DHd3
    18. E16 = DHd4
    19. E17 = DHd5
    20. E18 = DHd6
    21. F13 = DHa1
    22. F14 = DHa2
    23. F15 = DHa3
    24. F16 = DHa4
    25. F17 = DHa5
    26. F18 = DHa6
    27. ## WORK FRAME INPUT
    28. H13 = float(UFxEntryField.get())
    29. H14 = float(UFyEntryField.get())
    30. H15 = float(UFzEntryField.get())
    31. H16 = float(UFrxEntryField.get())
    32. H17 = float(UFryEntryField.get())
    33. H18 = float(UFrzEntryField.get())
    34. ## TOOL FRAME INPUT
    35. J13 = float(TFxEntryField.get())
    36. J14 = float(TFyEntryField.get())
    37. J15 = float(TFzEntryField.get())
    38. J16 = float(TFrxEntryField.get())
    39. J17 = float(TFryEntryField.get())
    40. J18 = float(TFrzEntryField.get())
    41. ## WORK FRAME TABLE
    42. B21 = math.cos(math.radians(H18))*math.cos(math.radians(H17))
    43. B22 = math.sin(math.radians(H18))*math.cos(math.radians(H17))
    44. B23 = -math.sin(math.radians(H18))
    45. B24 = 0
    46. C21 = -math.sin(math.radians(H18))*math.cos(math.radians(H16))+math.cos(math.radians(H18))*math.sin(math.radians(H17))*math.sin(math.radians(H16))
    47. C22 = math.cos(math.radians(H18))*math.cos(math.radians(H16))+math.sin(math.radians(H18))*math.sin(math.radians(H17))*math.sin(math.radians(H16))
    48. C23 = math.cos(math.radians(H17))*math.sin(math.radians(H16))
    49. C24 = 0
    50. D21 = math.sin(math.radians(H18))*math.sin(math.radians(H16))+math.cos(math.radians(H18))*math.sin(math.radians(H17))*math.cos(math.radians(H16))
    51. D22 = -math.cos(math.radians(H18))*math.sin(math.radians(H16))+math.sin(math.radians(H18))*math.sin(math.radians(H17))*math.cos(math.radians(H16))
    52. D23 = math.cos(math.radians(H17))*math.cos(math.radians(H16))
    53. D24 = 0
    54. E21 = H13
    55. E22 = H14
    56. E23 = H15
    57. E24 = 1
    58. ## J1 FRAME
    59. B27 = math.cos(C13)
    60. B28 = math.sin(C13)
    61. B29 = 0
    62. B30 = 0
    63. C27 = -math.sin(C13)*math.cos(D13)
    64. C28 = math.cos(C13)*math.cos(D13)
    65. C29 = math.sin(D13)
    66. C30 = 0
    67. D27 = math.sin(C13)*math.sin(D13)
    68. D28 = -math.cos(C13)*math.sin(D13)
    69. D29 = math.cos(D13)
    70. D30 = 0
    71. E27 = F13*math.cos(C13)
    72. E28 = F13*math.sin(C13)
    73. E29 = E13
    74. E30 = 1
    75. ## J2 FRAME
    76. B33 = math.cos(C14)
    77. B34 = math.sin(C14)
    78. B35 = 0
    79. B36 = 0
    80. C33 = -math.sin(C14)*math.cos(D14)
    81. C34 = math.cos(C14)*math.cos(D14)
    82. C35 = math.sin(D14)
    83. C36 = 0
    84. D33 = math.sin(C14)*math.sin(D14)
    85. D34 = -math.cos(C14)*math.sin(D14)
    86. D35 = math.cos(D14)
    87. D36 = 0
    88. E33 = F14*math.cos(C14)
    89. E34 = F14*math.sin(C14)
    90. E35 = E14
    91. E36 = 1
    92. ## J3 FRAME
    93. B39 = math.cos(C15)
    94. B40 = math.sin(C15)
    95. B41 = 0
    96. B42 = 0
    97. C39 = -math.sin(C15)*math.cos(D15)
    98. C40 = math.cos(C15)*math.cos(D15)
    99. C41 = math.sin(D15)
    100. C42 = 0
    101. D39 = math.sin(C15)*math.sin(D15)
    102. D40 = -math.cos(C15)*math.sin(D15)
    103. D41 = math.cos(D15)
    104. D42 = 0
    105. E39 = F15*math.cos(C15)
    106. E40 = F15*math.sin(C15)
    107. E41 = 0
    108. E42 = 1
    109. ## J4 FRAME
    110. B45 = math.cos(C16)
    111. B46 = math.sin(C16)
    112. B47 = 0
    113. B48 = 0
    114. C45 = -math.sin(C16)*math.cos(D16)
    115. C46 = math.cos(C16)*math.cos(D16)
    116. C47 = math.sin(D16)
    117. C48 = 0
    118. D45 = math.sin(C16)*math.sin(D16)
    119. D46 = -math.cos(C16)*math.sin(D16)
    120. D47 = math.cos(D16)
    121. D48 = 0
    122. E45 = F16*math.cos(C16)
    123. E46 = F16*math.sin(C16)
    124. E47 = E16
    125. E48 = 1
    126. ## J5 FRAME
    127. B51 = math.cos(C17)
    128. B52 = math.sin(C17)
    129. B53 = 0
    130. B54 = 0
    131. C51 = -math.sin(C17)*math.cos(D17)
    132. C52 = math.cos(C17)*math.cos(D17)
    133. C53 = math.sin(D17)
    134. C54 = 0
    135. D51 = math.sin(C17)*math.sin(D17)
    136. D52 = -math.cos(C17)*math.sin(D17)
    137. D53 = math.cos(D17)
    138. D54 = 0
    139. E51 = F17*math.cos(C17)
    140. E52 = F17*math.sin(C17)
    141. E53 = E17
    142. E54 = 1
    143. ## J6 FRAME
    144. B57 = math.cos(C18)
    145. B58 = math.sin(C18)
    146. B59 = 0
    147. B60 = 0
    148. C57 = -math.sin(C18)*math.cos(D18)
    149. C58 = math.cos(C18)*math.cos(D18)
    150. C59 = math.sin(D18)
    151. C60 = 0
    152. D57 = math.sin(C18)*math.sin(D18)
    153. D58 = -math.cos(C18)*math.sin(D18)
    154. D59 = math.cos(D18)
    155. D60 = 0
    156. E57 = F18*math.cos(C18)
    157. E58 = F18*math.sin(C18)
    158. E59 = E18
    159. E60 = 1
    160. ###################### TOOL FRAME ###########################
    161. ###################### 工具坐标系 ############################
    162. B63 = math.cos(math.radians(J18))*math.cos(math.radians(J17))
    163. B64 = math.sin(math.radians(J18))*math.cos(math.radians(J17))
    164. B65 = -math.sin(math.radians(J18))
    165. B66 = 0
    166. C63 = -math.sin(math.radians(J18))*math.cos(math.radians(J16))+math.cos(math.radians(J18))*math.sin(math.radians(J17))*math.sin(math.radians(J16))
    167. C64 = math.cos(math.radians(J18))*math.cos(math.radians(J16))+math.sin(math.radians(J18))*math.sin(math.radians(J17))*math.sin(math.radians(J16))
    168. C65 = math.cos(math.radians(J17))*math.sin(math.radians(J16))
    169. C66 = 0
    170. D63 = math.sin(math.radians(J18))*math.sin(math.radians(J16))+math.cos(math.radians(J18))*math.sin(math.radians(J17))*math.cos(math.radians(J16))
    171. D64 = -math.cos(math.radians(J18))*math.sin(math.radians(J16))+math.sin(math.radians(J18))*math.sin(math.radians(J17))*math.cos(math.radians(J16))
    172. D65 = math.cos(math.radians(J17))*math.cos(math.radians(J16))
    173. D66 = 0
    174. E63 = J13
    175. E64 = J14
    176. E65 = J15
    177. E66 = 1
    178. ## WF*J1
    179. G24 = (B21*B27)+(C21*B28)+(D21*B29)+(E21*B30)
    180. G25 = (B22*B27)+(C22*B28)+(D22*B29)+(E22*B30)
    181. G26 = (B23*B27)+(C23*B28)+(D23*B29)+(E23*B30)
    182. G27 = (B24*B27)+(C24*B28)+(D24*B29)+(E24*B30)
    183. H24 = (B21*C27)+(C21*C28)+(D21*C29)+(E21*C30)
    184. H25 = (B22*C27)+(C22*C28)+(D22*C29)+(E22*C30)
    185. H26 = (B23*C27)+(C23*C28)+(D23*C29)+(E23*C30)
    186. H27 = (B24*C27)+(C24*C28)+(D24*C29)+(E24*C30)
    187. I24 = (B21*D27)+(C21*D28)+(D21*D29)+(E21*D30)
    188. I25 = (B22*D27)+(C22*D28)+(D22*D29)+(E22*D30)
    189. I26 = (B23*D27)+(C23*D28)+(D23*D29)+(E23*D30)
    190. I27 = (B24*D27)+(C24*D28)+(D24*D29)+(E24*D30)
    191. J24 = (B21*E27)+(C21*E28)+(D21*E29)+(E21*E30)
    192. J25 = (B22*E27)+(C22*E28)+(D22*E29)+(E22*E30)
    193. J26 = (B23*E27)+(C23*E28)+(D23*E29)+(E23*E30)
    194. J27 = (B24*E27)+(C24*E28)+(D24*E29)+(E24*E30)
    195. ## (WF*J1)*J2
    196. G30 = (G24*B33)+(H24*B34)+(I24*B35)+(J24*B36)
    197. G31 = (G25*B33)+(H25*B34)+(I25*B35)+(J25*B36)
    198. G32 = (G26*B33)+(H26*B34)+(I26*B35)+(J26*B36)
    199. G33 = (G27*B33)+(H27*B34)+(I27*B35)+(J27*B36)
    200. H30 = (G24*C33)+(H24*C34)+(I24*C35)+(J24*C36)
    201. H31 = (G25*C33)+(H25*C34)+(I25*C35)+(J25*C36)
    202. H32 = (G26*C33)+(H26*C34)+(I26*C35)+(J26*C36)
    203. H33 = (G27*C33)+(H27*C34)+(I27*C35)+(J27*C36)
    204. I30 = (G24*D33)+(H24*D34)+(I24*D35)+(J24*D36)
    205. I31 = (G25*D33)+(H25*D34)+(I25*D35)+(J25*D36)
    206. I32 = (G26*D33)+(H26*D34)+(I26*D35)+(J26*D36)
    207. I33 = (G27*D33)+(H27*D34)+(I27*D35)+(J27*D36)
    208. J30 = (G24*E33)+(H24*E34)+(I24*E35)+(J24*E36)
    209. J31 = (G25*E33)+(H25*E34)+(I25*E35)+(J25*E36)
    210. J32 = (G26*E33)+(H26*E34)+(I26*E35)+(J26*E36)
    211. J33 = (G27*E33)+(H27*E34)+(I27*E35)+(J27*E36)
    212. ## (WF*J1*J2)*J3
    213. G36 = (G30*B39)+(H30*B40)+(I30*B41)+(J30*B42)
    214. G37 = (G31*B39)+(H31*B40)+(I31*B41)+(J31*B42)
    215. G38 = (G32*B39)+(H32*B40)+(I32*B41)+(J32*B42)
    216. G39 = (G33*B39)+(H33*B40)+(I33*B41)+(J33*B42)
    217. H36 = (G30*C39)+(H30*C40)+(I30*C41)+(J30*C42)
    218. H37 = (G31*C39)+(H31*C40)+(I31*C41)+(J31*C42)
    219. H38 = (G32*C39)+(H32*C40)+(I32*C41)+(J32*C42)
    220. H39 = (G33*C39)+(H33*C40)+(I33*C41)+(J33*C42)
    221. I36 = (G30*D39)+(H30*D40)+(I30*D41)+(J30*D42)
    222. I37 = (G31*D39)+(H31*D40)+(I31*D41)+(J31*D42)
    223. I38 = (G32*D39)+(H32*D40)+(I32*D41)+(J32*D42)
    224. I39 = (G33*D39)+(H33*D40)+(I33*D41)+(J33*D42)
    225. J36 = (G30*E39)+(H30*E40)+(I30*E41)+(J30*E42)
    226. J37 = (G31*E39)+(H31*E40)+(I31*E41)+(J31*E42)
    227. J38 = (G32*E39)+(H32*E40)+(I32*E41)+(J32*E42)
    228. J39 = (G33*E39)+(H33*E40)+(I33*E41)+(J33*E42)
    229. ## (WF*J1*J2*J3)*J4
    230. G42 = (G36*B45)+(H36*B46)+(I36*B47)+(J36*B48)
    231. G43 = (G37*B45)+(H37*B46)+(I37*B47)+(J37*B48)
    232. G44 = (G38*B45)+(H38*B46)+(I38*B47)+(J38*B48)
    233. G45 = (G39*B45)+(H39*B46)+(I39*B47)+(J39*B48)
    234. H42 = (G36*C45)+(H36*C46)+(I36*C47)+(J36*C48)
    235. H43 = (G37*C45)+(H37*C46)+(I37*C47)+(J37*C48)
    236. H44 = (G38*C45)+(H38*C46)+(I38*C47)+(J38*C48)
    237. H45 = (G39*C45)+(H39*C46)+(I39*C47)+(J39*C48)
    238. I42 = (G36*D45)+(H36*D46)+(I36*D47)+(J36*D48)
    239. I43 = (G37*D45)+(H37*D46)+(I37*D47)+(J37*D48)
    240. I44 = (G38*D45)+(H38*D46)+(I38*D47)+(J38*D48)
    241. I45 = (G39*D45)+(H39*D46)+(I39*D47)+(J39*D48)
    242. J42 = (G36*E45)+(H36*E46)+(I36*E47)+(J36*E48)
    243. J43 = (G37*E45)+(H37*E46)+(I37*E47)+(J37*E48)
    244. J44 = (G38*E45)+(H38*E46)+(I38*E47)+(J38*E48)
    245. J45 = (G39*E45)+(H39*E46)+(I39*E47)+(J39*E48)
    246. ## (WF*J1*J2*J3*J4)*J5
    247. G48 = (G42*B51)+(H42*B52)+(I42*B53)+(J42*B54)
    248. G49 = (G43*B51)+(H43*B52)+(I43*B53)+(J43*B54)
    249. G50 = (G44*B51)+(H44*B52)+(I44*B53)+(J44*B54)
    250. G51 = (G45*B51)+(H45*B52)+(I45*B53)+(J45*B54)
    251. H48 = (G42*C51)+(H42*C52)+(I42*C53)+(J42*C54)
    252. H49 = (G43*C51)+(H43*C52)+(I43*C53)+(J43*C54)
    253. H50 = (G44*C51)+(H44*C52)+(I44*C53)+(J44*C54)
    254. H51 = (G45*C51)+(H45*C52)+(I45*C53)+(J45*C54)
    255. I48 = (G42*D51)+(H42*D52)+(I42*D53)+(J42*D54)
    256. I49 = (G43*D51)+(H43*D52)+(I43*D53)+(J43*D54)
    257. I50 = (G44*D51)+(H44*D52)+(I44*D53)+(J44*D54)
    258. I51 = (G45*D51)+(H45*D52)+(I45*D53)+(J45*D54)
    259. J48 = (G42*E51)+(H42*E52)+(I42*E53)+(J42*E54)
    260. J49 = (G43*E51)+(H43*E52)+(I43*E53)+(J43*E54)
    261. J50 = (G44*E51)+(H44*E52)+(I44*E53)+(J44*E54)
    262. J51 = (G45*E51)+(H45*E52)+(I45*E53)+(J45*E54)
    263. ## (WF*J1*J2*J3*J4*J5)*J6
    264. G54 = (G48*B57)+(H48*B58)+(I48*B59)+(J48*B60)
    265. G55 = (G49*B57)+(H49*B58)+(I49*B59)+(J49*B60)
    266. G56 = (G50*B57)+(H50*B58)+(I50*B59)+(J50*B60)
    267. G57 = (G51*B57)+(H51*B58)+(I51*B59)+(J51*B60)
    268. H54 = (G48*C57)+(H48*C58)+(I48*C59)+(J48*C60)
    269. H55 = (G49*C57)+(H49*C58)+(I49*C59)+(J49*C60)
    270. H56 = (G50*C57)+(H50*C58)+(I50*C59)+(J50*C60)
    271. H57 = (G51*C57)+(H51*C58)+(I51*C59)+(J51*C60)
    272. I54 = (G48*D57)+(H48*D58)+(I48*D59)+(J48*D60)
    273. I55 = (G49*D57)+(H49*D58)+(I49*D59)+(J49*D60)
    274. I56 = (G50*D57)+(H50*D58)+(I50*D59)+(J50*D60)
    275. I57 = (G51*D57)+(H51*D58)+(I51*D59)+(J51*D60)
    276. J54 = (G48*E57)+(H48*E58)+(I48*E59)+(J48*E60)
    277. J55 = (G49*E57)+(H49*E58)+(I49*E59)+(J49*E60)
    278. J56 = (G50*E57)+(H50*E58)+(I50*E59)+(J50*E60)
    279. J57 = (G51*E57)+(H51*E58)+(I51*E59)+(J51*E60)
    280. ## (WF*J1*J2*J3*J4*J5*J6)*TF
    281. G60 = (G54*B63)+(H54*B64)+(I54*B65)+(J54*B66)
    282. G61 = (G55*B63)+(H55*B64)+(I55*B65)+(J55*B66)
    283. G62 = (G56*B63)+(H56*B64)+(I56*B65)+(J56*B66)
    284. G63 = (G57*B63)+(H57*B64)+(I57*B65)+(J57*B66)
    285. H60 = (G54*C63)+(H54*C64)+(I54*C65)+(J54*C66)
    286. H61 = (G55*C63)+(H55*C64)+(I55*C65)+(J55*C66)
    287. H62 = (G56*C63)+(H56*C64)+(I56*C65)+(J56*C66)
    288. H63 = (G57*C63)+(H57*C64)+(I57*C65)+(J57*C66)
    289. I60 = (G54*D63)+(H54*D64)+(I54*D65)+(J54*D66)
    290. I61 = (G55*D63)+(H55*D64)+(I55*D65)+(J55*D66)
    291. I62 = (G56*D63)+(H56*D64)+(I56*D65)+(J56*D66)
    292. I63 = (G57*D63)+(H57*D64)+(I57*D65)+(J57*D66)
    293. J60 = (G54*E63)+(H54*E64)+(I54*E65)+(J54*E66)
    294. J61 = (G55*E63)+(H55*E64)+(I55*E65)+(J55*E66)
    295. J62 = (G56*E63)+(H56*E64)+(I56*E65)+(J56*E66)
    296. J63 = (G57*E63)+(H57*E64)+(I57*E65)+(J57*E66)

  • 相关阅读:
    要被抖音笑死了,打开个网页就算黑客?
    我们是否生活在一个超大型生物的大脑之中?——对多元宇宙观与生命存在形式的哲学探讨
    【立创机械狗从0到成品PCB画图总结】
    PHP:枚举和对象的差异
    深入理解java和dubbo的SPI机制
    OpenCV变脸大法--‘让妖怪现原形‘(附源码)
    布隆过滤器及其用法
    no appropriate protocol (protocol is disabled or cipher suites are inappropr
    allatori8.0文档翻译-第五步:水印介绍
    js生成随机16进制数
  • 原文地址:https://blog.csdn.net/m0_53966219/article/details/125612152