m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

464 lines
20 KiB

7 months ago
  1. from sympy.core.function import expand_mul
  2. from sympy.core.numbers import pi
  3. from sympy.core.singleton import S
  4. from sympy.functions.elementary.miscellaneous import sqrt
  5. from sympy.functions.elementary.trigonometric import (cos, sin)
  6. from sympy.matrices.dense import Matrix
  7. from sympy.core.backend import _simplify_matrix
  8. from sympy.core.symbol import symbols
  9. from sympy.physics.mechanics import dynamicsymbols, Body, PinJoint, PrismaticJoint
  10. from sympy.physics.mechanics.joint import Joint
  11. from sympy.physics.vector import Vector, ReferenceFrame
  12. from sympy.testing.pytest import raises
  13. t = dynamicsymbols._t # type: ignore
  14. def _generate_body():
  15. N = ReferenceFrame('N')
  16. A = ReferenceFrame('A')
  17. P = Body('P', frame=N)
  18. C = Body('C', frame=A)
  19. return N, A, P, C
  20. def test_Joint():
  21. parent = Body('parent')
  22. child = Body('child')
  23. raises(TypeError, lambda: Joint('J', parent, child))
  24. def test_pinjoint():
  25. P = Body('P')
  26. C = Body('C')
  27. l, m = symbols('l m')
  28. theta, omega = dynamicsymbols('theta_J, omega_J')
  29. Pj = PinJoint('J', P, C)
  30. assert Pj.name == 'J'
  31. assert Pj.parent == P
  32. assert Pj.child == C
  33. assert Pj.coordinates == [theta]
  34. assert Pj.speeds == [omega]
  35. assert Pj.kdes == [omega - theta.diff(t)]
  36. assert Pj.parent_axis == P.frame.x
  37. assert Pj.child_point.pos_from(C.masscenter) == Vector(0)
  38. assert Pj.parent_point.pos_from(P.masscenter) == Vector(0)
  39. assert Pj.parent_point.pos_from(Pj._child_point) == Vector(0)
  40. assert C.masscenter.pos_from(P.masscenter) == Vector(0)
  41. assert Pj.__str__() == 'PinJoint: J parent: P child: C'
  42. P1 = Body('P1')
  43. C1 = Body('C1')
  44. J1 = PinJoint('J1', P1, C1, parent_joint_pos=l*P1.frame.x,
  45. child_joint_pos=m*C1.frame.y, parent_axis=P1.frame.z)
  46. assert J1._parent_axis == P1.frame.z
  47. assert J1._child_point.pos_from(C1.masscenter) == m * C1.frame.y
  48. assert J1._parent_point.pos_from(P1.masscenter) == l * P1.frame.x
  49. assert J1._parent_point.pos_from(J1._child_point) == Vector(0)
  50. assert (P1.masscenter.pos_from(C1.masscenter) ==
  51. -l*P1.frame.x + m*C1.frame.y)
  52. def test_pin_joint_double_pendulum():
  53. q1, q2 = dynamicsymbols('q1 q2')
  54. u1, u2 = dynamicsymbols('u1 u2')
  55. m, l = symbols('m l')
  56. N = ReferenceFrame('N')
  57. A = ReferenceFrame('A')
  58. B = ReferenceFrame('B')
  59. C = Body('C', frame=N) # ceiling
  60. PartP = Body('P', frame=A, mass=m)
  61. PartR = Body('R', frame=B, mass=m)
  62. J1 = PinJoint('J1', C, PartP, speeds=u1, coordinates=q1,
  63. child_joint_pos=-l*A.x, parent_axis=C.frame.z,
  64. child_axis=PartP.frame.z)
  65. J2 = PinJoint('J2', PartP, PartR, speeds=u2, coordinates=q2,
  66. child_joint_pos=-l*B.x, parent_axis=PartP.frame.z,
  67. child_axis=PartR.frame.z)
  68. # Check orientation
  69. assert N.dcm(A) == Matrix([[cos(q1), -sin(q1), 0],
  70. [sin(q1), cos(q1), 0], [0, 0, 1]])
  71. assert A.dcm(B) == Matrix([[cos(q2), -sin(q2), 0],
  72. [sin(q2), cos(q2), 0], [0, 0, 1]])
  73. assert _simplify_matrix(N.dcm(B)) == Matrix([[cos(q1 + q2), -sin(q1 + q2), 0],
  74. [sin(q1 + q2), cos(q1 + q2), 0],
  75. [0, 0, 1]])
  76. # Check Angular Velocity
  77. assert A.ang_vel_in(N) == u1 * N.z
  78. assert B.ang_vel_in(A) == u2 * A.z
  79. assert B.ang_vel_in(N) == u1 * N.z + u2 * A.z
  80. # Check kde
  81. assert J1.kdes == [u1 - q1.diff(t)]
  82. assert J2.kdes == [u2 - q2.diff(t)]
  83. # Check Linear Velocity
  84. assert PartP.masscenter.vel(N) == l*u1*A.y
  85. assert PartR.masscenter.vel(A) == l*u2*B.y
  86. assert PartR.masscenter.vel(N) == l*u1*A.y + l*(u1 + u2)*B.y
  87. def test_pin_joint_chaos_pendulum():
  88. mA, mB, lA, lB, h = symbols('mA, mB, lA, lB, h')
  89. theta, phi, omega, alpha = dynamicsymbols('theta phi omega alpha')
  90. N = ReferenceFrame('N')
  91. A = ReferenceFrame('A')
  92. B = ReferenceFrame('B')
  93. lA = (lB - h / 2) / 2
  94. lC = (lB/2 + h/4)
  95. rod = Body('rod', frame=A, mass=mA)
  96. plate = Body('plate', mass=mB, frame=B)
  97. C = Body('C', frame=N)
  98. J1 = PinJoint('J1', C, rod, coordinates=theta, speeds=omega,
  99. child_joint_pos=lA*A.z, parent_axis=N.y, child_axis=A.y)
  100. J2 = PinJoint('J2', rod, plate, coordinates=phi, speeds=alpha,
  101. parent_joint_pos=lC*A.z, parent_axis=A.z, child_axis=B.z)
  102. # Check orientation
  103. assert A.dcm(N) == Matrix([[cos(theta), 0, -sin(theta)],
  104. [0, 1, 0],
  105. [sin(theta), 0, cos(theta)]])
  106. assert A.dcm(B) == Matrix([[cos(phi), -sin(phi), 0],
  107. [sin(phi), cos(phi), 0],
  108. [0, 0, 1]])
  109. assert B.dcm(N) == Matrix([
  110. [cos(phi)*cos(theta), sin(phi), -sin(theta)*cos(phi)],
  111. [-sin(phi)*cos(theta), cos(phi), sin(phi)*sin(theta)],
  112. [sin(theta), 0, cos(theta)]])
  113. # Check Angular Velocity
  114. assert A.ang_vel_in(N) == omega*N.y
  115. assert A.ang_vel_in(B) == -alpha*A.z
  116. assert N.ang_vel_in(B) == -omega*N.y - alpha*A.z
  117. # Check kde
  118. assert J1.kdes == [omega - theta.diff(t)]
  119. assert J2.kdes == [alpha - phi.diff(t)]
  120. # Check pos of masscenters
  121. assert C.masscenter.pos_from(rod.masscenter) == lA*A.z
  122. assert rod.masscenter.pos_from(plate.masscenter) == - lC * A.z
  123. # Check Linear Velocities
  124. assert rod.masscenter.vel(N) == (h/4 - lB/2)*omega*A.x
  125. assert plate.masscenter.vel(N) == ((h/4 - lB/2)*omega +
  126. (h/4 + lB/2)*omega)*A.x
  127. def test_pinjoint_arbitrary_axis():
  128. theta, omega = dynamicsymbols('theta_J, omega_J')
  129. # When the bodies are attached though masscenters but axess are opposite.
  130. N, A, P, C = _generate_body()
  131. PinJoint('J', P, C, child_axis=-A.x)
  132. assert (-A.x).angle_between(N.x) == 0
  133. assert -A.x.express(N) == N.x
  134. assert A.dcm(N) == Matrix([[-1, 0, 0],
  135. [0, -cos(theta), -sin(theta)],
  136. [0, -sin(theta), cos(theta)]])
  137. assert A.ang_vel_in(N) == omega*N.x
  138. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  139. assert C.masscenter.pos_from(P.masscenter) == 0
  140. assert C.masscenter.pos_from(P.masscenter).express(N).simplify() == 0
  141. assert C.masscenter.vel(N) == 0
  142. # When axes are different and parent joint is at masscenter but child joint
  143. # is at a unit vector from child masscenter.
  144. N, A, P, C = _generate_body()
  145. PinJoint('J', P, C, child_axis=A.y, child_joint_pos=A.x)
  146. assert A.y.angle_between(N.x) == 0 # Axis are aligned
  147. assert A.y.express(N) == N.x
  148. assert A.dcm(N) == Matrix([[0, -cos(theta), -sin(theta)],
  149. [1, 0, 0],
  150. [0, -sin(theta), cos(theta)]])
  151. assert A.ang_vel_in(N) == omega*N.x
  152. assert A.ang_vel_in(N).express(A) == omega * A.y
  153. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  154. angle = A.ang_vel_in(N).angle_between(A.y)
  155. assert angle.xreplace({omega: 1}) == 0
  156. assert C.masscenter.vel(N) == omega*A.z
  157. assert C.masscenter.pos_from(P.masscenter) == -A.x
  158. assert (C.masscenter.pos_from(P.masscenter).express(N).simplify() ==
  159. cos(theta)*N.y + sin(theta)*N.z)
  160. assert C.masscenter.vel(N).angle_between(A.x) == pi/2
  161. # Similar to previous case but wrt parent body
  162. N, A, P, C = _generate_body()
  163. PinJoint('J', P, C, parent_axis=N.y, parent_joint_pos=N.x)
  164. assert N.y.angle_between(A.x) == 0 # Axis are aligned
  165. assert N.y.express(A) == A.x
  166. assert A.dcm(N) == Matrix([[0, 1, 0],
  167. [-cos(theta), 0, sin(theta)],
  168. [sin(theta), 0, cos(theta)]])
  169. assert A.ang_vel_in(N) == omega*N.y
  170. assert A.ang_vel_in(N).express(A) == omega*A.x
  171. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  172. angle = A.ang_vel_in(N).angle_between(A.x)
  173. assert angle.xreplace({omega: 1}) == 0
  174. assert C.masscenter.vel(N).simplify() == - omega*N.z
  175. assert C.masscenter.pos_from(P.masscenter) == N.x
  176. # Both joint pos id defined but different axes
  177. N, A, P, C = _generate_body()
  178. PinJoint('J', P, C, parent_joint_pos=N.x, child_joint_pos=A.x,
  179. child_axis=A.x+A.y)
  180. assert expand_mul(N.x.angle_between(A.x + A.y)) == 0 # Axis are aligned
  181. assert (A.x + A.y).express(N).simplify() == sqrt(2)*N.x
  182. assert _simplify_matrix(A.dcm(N)) == Matrix([
  183. [sqrt(2)/2, -sqrt(2)*cos(theta)/2, -sqrt(2)*sin(theta)/2],
  184. [sqrt(2)/2, sqrt(2)*cos(theta)/2, sqrt(2)*sin(theta)/2],
  185. [0, -sin(theta), cos(theta)]])
  186. assert A.ang_vel_in(N) == omega*N.x
  187. assert (A.ang_vel_in(N).express(A).simplify() ==
  188. (omega*A.x + omega*A.y)/sqrt(2))
  189. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  190. angle = A.ang_vel_in(N).angle_between(A.x + A.y)
  191. assert angle.xreplace({omega: 1}) == 0
  192. assert C.masscenter.vel(N).simplify() == (omega * A.z)/sqrt(2)
  193. assert C.masscenter.pos_from(P.masscenter) == N.x - A.x
  194. assert (C.masscenter.pos_from(P.masscenter).express(N).simplify() ==
  195. (1 - sqrt(2)/2)*N.x + sqrt(2)*cos(theta)/2*N.y +
  196. sqrt(2)*sin(theta)/2*N.z)
  197. assert (C.masscenter.vel(N).express(N).simplify() ==
  198. -sqrt(2)*omega*sin(theta)/2*N.y + sqrt(2)*omega*cos(theta)/2*N.z)
  199. assert C.masscenter.vel(N).angle_between(A.x) == pi/2
  200. N, A, P, C = _generate_body()
  201. PinJoint('J', P, C, parent_joint_pos=N.x, child_joint_pos=A.x,
  202. child_axis=A.x+A.y-A.z)
  203. assert expand_mul(N.x.angle_between(A.x + A.y - A.z)) == 0 # Axis aligned
  204. assert (A.x + A.y - A.z).express(N).simplify() == sqrt(3)*N.x
  205. assert _simplify_matrix(A.dcm(N)) == Matrix([
  206. [sqrt(3)/3, -sqrt(6)*sin(theta + pi/4)/3,
  207. sqrt(6)*cos(theta + pi/4)/3],
  208. [sqrt(3)/3, sqrt(6)*cos(theta + pi/12)/3,
  209. sqrt(6)*sin(theta + pi/12)/3],
  210. [-sqrt(3)/3, sqrt(6)*cos(theta + 5*pi/12)/3,
  211. sqrt(6)*sin(theta + 5*pi/12)/3]])
  212. assert A.ang_vel_in(N) == omega*N.x
  213. assert A.ang_vel_in(N).express(A).simplify() == (omega*A.x + omega*A.y -
  214. omega*A.z)/sqrt(3)
  215. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  216. angle = A.ang_vel_in(N).angle_between(A.x + A.y-A.z)
  217. assert angle.xreplace({omega: 1}) == 0
  218. assert C.masscenter.vel(N).simplify() == (omega*A.y + omega*A.z)/sqrt(3)
  219. assert C.masscenter.pos_from(P.masscenter) == N.x - A.x
  220. assert (C.masscenter.pos_from(P.masscenter).express(N).simplify() ==
  221. (1 - sqrt(3)/3)*N.x + sqrt(6)*sin(theta + pi/4)/3*N.y -
  222. sqrt(6)*cos(theta + pi/4)/3*N.z)
  223. assert (C.masscenter.vel(N).express(N).simplify() ==
  224. sqrt(6)*omega*cos(theta + pi/4)/3*N.y +
  225. sqrt(6)*omega*sin(theta + pi/4)/3*N.z)
  226. assert C.masscenter.vel(N).angle_between(A.x) == pi/2
  227. N, A, P, C = _generate_body()
  228. m, n = symbols('m n')
  229. PinJoint('J', P, C, parent_joint_pos=m*N.x, child_joint_pos=n*A.x,
  230. child_axis=A.x+A.y-A.z, parent_axis=N.x-N.y+N.z)
  231. angle = (N.x-N.y+N.z).angle_between(A.x+A.y-A.z)
  232. assert expand_mul(angle) == 0 # Axis are aligned
  233. assert ((A.x-A.y+A.z).express(N).simplify() ==
  234. (-4*cos(theta)/3 - S(1)/3)*N.x + (S(1)/3 - 4*sin(theta + pi/6)/3)*N.y +
  235. (4*cos(theta + pi/3)/3 - S(1)/3)*N.z)
  236. assert _simplify_matrix(A.dcm(N)) == Matrix([
  237. [S(1)/3 - 2*cos(theta)/3, -2*sin(theta + pi/6)/3 - S(1)/3,
  238. 2*cos(theta + pi/3)/3 + S(1)/3],
  239. [2*cos(theta + pi/3)/3 + S(1)/3, 2*cos(theta)/3 - S(1)/3,
  240. 2*sin(theta + pi/6)/3 + S(1)/3],
  241. [-2*sin(theta + pi/6)/3 - S(1)/3, 2*cos(theta + pi/3)/3 + S(1)/3,
  242. 2*cos(theta)/3 - S(1)/3]])
  243. assert A.ang_vel_in(N) == (omega*N.x - omega*N.y + omega*N.z)/sqrt(3)
  244. assert A.ang_vel_in(N).express(A).simplify() == (omega*A.x + omega*A.y -
  245. omega*A.z)/sqrt(3)
  246. assert A.ang_vel_in(N).magnitude() == sqrt(omega**2)
  247. angle = A.ang_vel_in(N).angle_between(A.x+A.y-A.z)
  248. assert angle.xreplace({omega: 1}) == 0
  249. assert (C.masscenter.vel(N).simplify() ==
  250. (m*omega*N.y + m*omega*N.z + n*omega*A.y + n*omega*A.z)/sqrt(3))
  251. assert C.masscenter.pos_from(P.masscenter) == m*N.x - n*A.x
  252. assert (C.masscenter.pos_from(P.masscenter).express(N).simplify() ==
  253. (m + n*(2*cos(theta) - 1)/3)*N.x + n*(2*sin(theta + pi/6) +
  254. 1)/3*N.y - n*(2*cos(theta + pi/3) + 1)/3*N.z)
  255. assert (C.masscenter.vel(N).express(N).simplify() ==
  256. -2*n*omega*sin(theta)/3*N.x + (sqrt(3)*m +
  257. 2*n*cos(theta + pi/6))*omega/3*N.y
  258. + (sqrt(3)*m + 2*n*sin(theta + pi/3))*omega/3*N.z)
  259. assert expand_mul(C.masscenter.vel(N).angle_between(m*N.x - n*A.x)) == pi/2
  260. def test_pinjoint_pi():
  261. _, _, P, C = _generate_body()
  262. J = PinJoint('J', P, C, child_axis=-C.frame.x)
  263. assert J._generate_vector() == P.frame.z
  264. _, _, P, C = _generate_body()
  265. J = PinJoint('J', P, C, parent_axis=P.frame.y, child_axis=-C.frame.y)
  266. assert J._generate_vector() == P.frame.x
  267. _, _, P, C = _generate_body()
  268. J = PinJoint('J', P, C, parent_axis=P.frame.z, child_axis=-C.frame.z)
  269. assert J._generate_vector() == P.frame.y
  270. _, _, P, C = _generate_body()
  271. J = PinJoint('J', P, C, parent_axis=P.frame.x+P.frame.y, child_axis=-C.frame.y-C.frame.x)
  272. assert J._generate_vector() == P.frame.z
  273. _, _, P, C = _generate_body()
  274. J = PinJoint('J', P, C, parent_axis=P.frame.y+P.frame.z, child_axis=-C.frame.y-C.frame.z)
  275. assert J._generate_vector() == P.frame.x
  276. _, _, P, C = _generate_body()
  277. J = PinJoint('J', P, C, parent_axis=P.frame.x+P.frame.z, child_axis=-C.frame.z-C.frame.x)
  278. assert J._generate_vector() == P.frame.y
  279. _, _, P, C = _generate_body()
  280. J = PinJoint('J', P, C, parent_axis=P.frame.x+P.frame.y+P.frame.z,
  281. child_axis=-C.frame.x-C.frame.y-C.frame.z)
  282. assert J._generate_vector() == P.frame.y - P.frame.z
  283. def test_slidingjoint():
  284. _, _, P, C = _generate_body()
  285. x, v = dynamicsymbols('x_S, v_S')
  286. S = PrismaticJoint('S', P, C)
  287. assert S.name == 'S'
  288. assert S.parent == P
  289. assert S.child == C
  290. assert S.coordinates == [x]
  291. assert S.speeds == [v]
  292. assert S.kdes == [v - x.diff(t)]
  293. assert S.parent_axis == P.frame.x
  294. assert S.child_axis == C.frame.x
  295. assert S.child_point.pos_from(C.masscenter) == Vector(0)
  296. assert S.parent_point.pos_from(P.masscenter) == Vector(0)
  297. assert S.parent_point.pos_from(S.child_point) == - x * P.frame.x
  298. assert P.masscenter.pos_from(C.masscenter) == - x * P.frame.x
  299. assert C.masscenter.vel(P.frame) == v * P.frame.x
  300. assert P.ang_vel_in(C) == 0
  301. assert C.ang_vel_in(P) == 0
  302. assert S.__str__() == 'PrismaticJoint: S parent: P child: C'
  303. N, A, P, C = _generate_body()
  304. l, m = symbols('l m')
  305. S = PrismaticJoint('S', P, C, parent_joint_pos= l * P.frame.x,
  306. child_joint_pos= m * C.frame.y, parent_axis = P.frame.z)
  307. assert S.parent_axis == P.frame.z
  308. assert S.child_point.pos_from(C.masscenter) == m * C.frame.y
  309. assert S.parent_point.pos_from(P.masscenter) == l * P.frame.x
  310. assert S.parent_point.pos_from(S.child_point) == - x * P.frame.z
  311. assert P.masscenter.pos_from(C.masscenter) == - l*N.x - x*N.z + m*A.y
  312. assert C.masscenter.vel(P.frame) == v * P.frame.z
  313. assert C.ang_vel_in(P) == 0
  314. assert P.ang_vel_in(C) == 0
  315. _, _, P, C = _generate_body()
  316. S = PrismaticJoint('S', P, C, parent_joint_pos= l * P.frame.z,
  317. child_joint_pos= m * C.frame.x, parent_axis = P.frame.z)
  318. assert S.parent_axis == P.frame.z
  319. assert S.child_point.pos_from(C.masscenter) == m * C.frame.x
  320. assert S.parent_point.pos_from(P.masscenter) == l * P.frame.z
  321. assert S.parent_point.pos_from(S.child_point) == - x * P.frame.z
  322. assert P.masscenter.pos_from(C.masscenter) == (-l - x)*P.frame.z + m*C.frame.x
  323. assert C.masscenter.vel(P.frame) == v * P.frame.z
  324. assert C.ang_vel_in(P) == 0
  325. assert P.ang_vel_in(C) == 0
  326. def test_slidingjoint_arbitrary_axis():
  327. x, v = dynamicsymbols('x_S, v_S')
  328. N, A, P, C = _generate_body()
  329. PrismaticJoint('S', P, C, child_axis=-A.x)
  330. assert (-A.x).angle_between(N.x) == 0
  331. assert -A.x.express(N) == N.x
  332. assert A.dcm(N) == Matrix([[-1, 0, 0], [0, -1, 0], [0, 0, 1]])
  333. assert C.masscenter.pos_from(P.masscenter) == x * N.x
  334. assert C.masscenter.pos_from(P.masscenter).express(A).simplify() == -x * A.x
  335. assert C.masscenter.vel(N) == v * N.x
  336. assert C.masscenter.vel(N).express(A) == -v * A.x
  337. assert A.ang_vel_in(N) == 0
  338. assert N.ang_vel_in(A) == 0
  339. #When axes are different and parent joint is at masscenter but child joint is at a unit vector from
  340. #child masscenter.
  341. N, A, P, C = _generate_body()
  342. PrismaticJoint('S', P, C, child_axis=A.y, child_joint_pos=A.x)
  343. assert A.y.angle_between(N.x) == 0 #Axis are aligned
  344. assert A.y.express(N) == N.x
  345. assert A.dcm(N) == Matrix([[0, -1, 0], [1, 0, 0], [0, 0, 1]])
  346. assert C.masscenter.vel(N) == v * N.x
  347. assert C.masscenter.vel(N).express(A) == v * A.y
  348. assert C.masscenter.pos_from(P.masscenter) == x*N.x - A.x
  349. assert C.masscenter.pos_from(P.masscenter).express(N).simplify() == x*N.x + N.y
  350. assert A.ang_vel_in(N) == 0
  351. assert N.ang_vel_in(A) == 0
  352. #Similar to previous case but wrt parent body
  353. N, A, P, C = _generate_body()
  354. PrismaticJoint('S', P, C, parent_axis=N.y, parent_joint_pos=N.x)
  355. assert N.y.angle_between(A.x) == 0 #Axis are aligned
  356. assert N.y.express(A) == A.x
  357. assert A.dcm(N) == Matrix([[0, 1, 0], [-1, 0, 0], [0, 0, 1]])
  358. assert C.masscenter.vel(N) == v * N.y
  359. assert C.masscenter.vel(N).express(A) == v * A.x
  360. assert C.masscenter.pos_from(P.masscenter) == N.x + x*N.y
  361. assert A.ang_vel_in(N) == 0
  362. assert N.ang_vel_in(A) == 0
  363. #Both joint pos is defined but different axes
  364. N, A, P, C = _generate_body()
  365. PrismaticJoint('S', P, C, parent_joint_pos=N.x, child_joint_pos=A.x, child_axis=A.x+A.y)
  366. assert N.x.angle_between(A.x + A.y) == 0 #Axis are aligned
  367. assert (A.x + A.y).express(N) == sqrt(2)*N.x
  368. assert A.dcm(N) == Matrix([[sqrt(2)/2, -sqrt(2)/2, 0], [sqrt(2)/2, sqrt(2)/2, 0], [0, 0, 1]])
  369. assert C.masscenter.pos_from(P.masscenter) == (x + 1)*N.x - A.x
  370. assert C.masscenter.pos_from(P.masscenter).express(N) == (x - sqrt(2)/2 + 1)*N.x + sqrt(2)/2*N.y
  371. assert C.masscenter.vel(N).express(A) == v * (A.x + A.y)/sqrt(2)
  372. assert C.masscenter.vel(N) == v*N.x
  373. assert A.ang_vel_in(N) == 0
  374. assert N.ang_vel_in(A) == 0
  375. N, A, P, C = _generate_body()
  376. PrismaticJoint('S', P, C, parent_joint_pos=N.x, child_joint_pos=A.x, child_axis=A.x+A.y-A.z)
  377. assert N.x.angle_between(A.x + A.y - A.z) == 0 #Axis are aligned
  378. assert (A.x + A.y - A.z).express(N) == sqrt(3)*N.x
  379. assert _simplify_matrix(A.dcm(N)) == Matrix([[sqrt(3)/3, -sqrt(3)/3, sqrt(3)/3],
  380. [sqrt(3)/3, sqrt(3)/6 + S(1)/2, S(1)/2 - sqrt(3)/6],
  381. [-sqrt(3)/3, S(1)/2 - sqrt(3)/6, sqrt(3)/6 + S(1)/2]])
  382. assert C.masscenter.pos_from(P.masscenter) == (x + 1)*N.x - A.x
  383. assert C.masscenter.pos_from(P.masscenter).express(N) == \
  384. (x - sqrt(3)/3 + 1)*N.x + sqrt(3)/3*N.y - sqrt(3)/3*N.z
  385. assert C.masscenter.vel(N) == v*N.x
  386. assert C.masscenter.vel(N).express(A) == sqrt(3)*v/3*A.x + sqrt(3)*v/3*A.y - sqrt(3)*v/3*A.z
  387. assert A.ang_vel_in(N) == 0
  388. assert N.ang_vel_in(A) == 0
  389. N, A, P, C = _generate_body()
  390. m, n = symbols('m n')
  391. PrismaticJoint('S', P, C, parent_joint_pos=m*N.x, child_joint_pos=n*A.x,
  392. child_axis=A.x+A.y-A.z, parent_axis=N.x-N.y+N.z)
  393. assert (N.x-N.y+N.z).angle_between(A.x+A.y-A.z) == 0 #Axis are aligned
  394. assert (A.x+A.y-A.z).express(N) == N.x - N.y + N.z
  395. assert _simplify_matrix(A.dcm(N)) == Matrix([[-S(1)/3, -S(2)/3, S(2)/3],
  396. [S(2)/3, S(1)/3, S(2)/3],
  397. [-S(2)/3, S(2)/3, S(1)/3]])
  398. assert C.masscenter.pos_from(P.masscenter) == \
  399. (m + sqrt(3)*x/3)*N.x - sqrt(3)*x/3*N.y + sqrt(3)*x/3*N.z - n*A.x
  400. assert C.masscenter.pos_from(P.masscenter).express(N) == \
  401. (m + n/3 + sqrt(3)*x/3)*N.x + (2*n/3 - sqrt(3)*x/3)*N.y + (-2*n/3 + sqrt(3)*x/3)*N.z
  402. assert C.masscenter.vel(N) == sqrt(3)*v/3*N.x - sqrt(3)*v/3*N.y + sqrt(3)*v/3*N.z
  403. assert C.masscenter.vel(N).express(A) == sqrt(3)*v/3*A.x + sqrt(3)*v/3*A.y - sqrt(3)*v/3*A.z
  404. assert A.ang_vel_in(N) == 0
  405. assert N.ang_vel_in(A) == 0