roboticstoolbox-python 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. roboticstoolbox/__init__.py +107 -0
  2. roboticstoolbox/backends/Connector.py +113 -0
  3. roboticstoolbox/backends/Dynamixel/README.md +9 -0
  4. roboticstoolbox/backends/Dynamixel/dynamixel.json +581 -0
  5. roboticstoolbox/backends/Dynamixel/dynamixel_io.py +450 -0
  6. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/LICENSE +201 -0
  7. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/README.md +28 -0
  8. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/ReleaseNote.md +181 -0
  9. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/__init__.py +27 -0
  10. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_bulk_read.py +163 -0
  11. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_bulk_write.py +109 -0
  12. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_sync_read.py +166 -0
  13. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_sync_write.py +99 -0
  14. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/packet_handler.py +33 -0
  15. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/port_handler.py +155 -0
  16. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/protocol1_packet_handler.py +548 -0
  17. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/protocol2_packet_handler.py +1080 -0
  18. roboticstoolbox/backends/Dynamixel/dynamixel_sdk/robotis_def.py +75 -0
  19. roboticstoolbox/backends/Dynamixel/dyndata.py +121 -0
  20. roboticstoolbox/backends/PyPlot/EllipsePlot.py +256 -0
  21. roboticstoolbox/backends/PyPlot/PyPlot.py +778 -0
  22. roboticstoolbox/backends/PyPlot/PyPlot2.py +537 -0
  23. roboticstoolbox/backends/PyPlot/README.md +67 -0
  24. roboticstoolbox/backends/PyPlot/RobotPlot.py +247 -0
  25. roboticstoolbox/backends/PyPlot/RobotPlot2.py +123 -0
  26. roboticstoolbox/backends/PyPlot/__init__.py +4 -0
  27. roboticstoolbox/backends/ROS/ROS.py +129 -0
  28. roboticstoolbox/backends/ROS/__init__.py +3 -0
  29. roboticstoolbox/backends/__init__.py +39 -0
  30. roboticstoolbox/backends/swift/__init__.py +165 -0
  31. roboticstoolbox/bin/__init__.py +0 -0
  32. roboticstoolbox/bin/_bintools.py +61 -0
  33. roboticstoolbox/bin/rtbtool.py +404 -0
  34. roboticstoolbox/blocks/Icons/250x250/armplot.png +0 -0
  35. roboticstoolbox/blocks/Icons/250x250/bicycle.png +0 -0
  36. roboticstoolbox/blocks/Icons/250x250/camera.png +0 -0
  37. roboticstoolbox/blocks/Icons/250x250/circlepath.png +0 -0
  38. roboticstoolbox/blocks/Icons/250x250/coriolis.png +0 -0
  39. roboticstoolbox/blocks/Icons/250x250/ctraj.png +0 -0
  40. roboticstoolbox/blocks/Icons/250x250/delta2tr.png +0 -0
  41. roboticstoolbox/blocks/Icons/250x250/diffsteer.png +0 -0
  42. roboticstoolbox/blocks/Icons/250x250/fdyn.png +0 -0
  43. roboticstoolbox/blocks/Icons/250x250/fdynx.png +0 -0
  44. roboticstoolbox/blocks/Icons/250x250/fkine.png +0 -0
  45. roboticstoolbox/blocks/Icons/250x250/gravload.png +0 -0
  46. roboticstoolbox/blocks/Icons/250x250/idyn.png +0 -0
  47. roboticstoolbox/blocks/Icons/250x250/idynx.png +0 -0
  48. roboticstoolbox/blocks/Icons/250x250/ikine.png +0 -0
  49. roboticstoolbox/blocks/Icons/250x250/inertia.png +0 -0
  50. roboticstoolbox/blocks/Icons/250x250/jacobian.png +0 -0
  51. roboticstoolbox/blocks/Icons/250x250/jtraj.png +0 -0
  52. roboticstoolbox/blocks/Icons/250x250/lspb.png +0 -0
  53. roboticstoolbox/blocks/Icons/250x250/multirotor.png +0 -0
  54. roboticstoolbox/blocks/Icons/250x250/multirotormixer.png +0 -0
  55. roboticstoolbox/blocks/Icons/250x250/multirotorplot.png +0 -0
  56. roboticstoolbox/blocks/Icons/250x250/point2tr.png +0 -0
  57. roboticstoolbox/blocks/Icons/250x250/tr2delta.png +0 -0
  58. roboticstoolbox/blocks/Icons/250x250/tr2t.png +0 -0
  59. roboticstoolbox/blocks/Icons/250x250/unicycle.png +0 -0
  60. roboticstoolbox/blocks/Icons/250x250/vehicleplot.png +0 -0
  61. roboticstoolbox/blocks/Icons/50x50/armplot.png +0 -0
  62. roboticstoolbox/blocks/Icons/50x50/bicycle.png +0 -0
  63. roboticstoolbox/blocks/Icons/50x50/camera.png +0 -0
  64. roboticstoolbox/blocks/Icons/50x50/circlepath.png +0 -0
  65. roboticstoolbox/blocks/Icons/50x50/coriolis.png +0 -0
  66. roboticstoolbox/blocks/Icons/50x50/delta2tr.png +0 -0
  67. roboticstoolbox/blocks/Icons/50x50/diffsteer.png +0 -0
  68. roboticstoolbox/blocks/Icons/50x50/fdyn.png +0 -0
  69. roboticstoolbox/blocks/Icons/50x50/fdynx.png +0 -0
  70. roboticstoolbox/blocks/Icons/50x50/fkine.png +0 -0
  71. roboticstoolbox/blocks/Icons/50x50/gravload.png +0 -0
  72. roboticstoolbox/blocks/Icons/50x50/idyn.png +0 -0
  73. roboticstoolbox/blocks/Icons/50x50/idynx.png +0 -0
  74. roboticstoolbox/blocks/Icons/50x50/ikine.png +0 -0
  75. roboticstoolbox/blocks/Icons/50x50/inertia.png +0 -0
  76. roboticstoolbox/blocks/Icons/50x50/jacobian.png +0 -0
  77. roboticstoolbox/blocks/Icons/50x50/jtraj.png +0 -0
  78. roboticstoolbox/blocks/Icons/50x50/lspb.png +0 -0
  79. roboticstoolbox/blocks/Icons/50x50/multirotor.png +0 -0
  80. roboticstoolbox/blocks/Icons/50x50/multirotormixer.png +0 -0
  81. roboticstoolbox/blocks/Icons/50x50/multirotorplot.png +0 -0
  82. roboticstoolbox/blocks/Icons/50x50/point2tr.png +0 -0
  83. roboticstoolbox/blocks/Icons/50x50/tr2delta.png +0 -0
  84. roboticstoolbox/blocks/Icons/50x50/tr2t.png +0 -0
  85. roboticstoolbox/blocks/Icons/50x50/unicycle.png +0 -0
  86. roboticstoolbox/blocks/Icons/50x50/vehicleplot.png +0 -0
  87. roboticstoolbox/blocks/Icons/armplot.png +0 -0
  88. roboticstoolbox/blocks/Icons/bicycle.png +0 -0
  89. roboticstoolbox/blocks/Icons/camera.png +0 -0
  90. roboticstoolbox/blocks/Icons/circlepath.png +0 -0
  91. roboticstoolbox/blocks/Icons/coriolis.png +0 -0
  92. roboticstoolbox/blocks/Icons/ctraj.png +0 -0
  93. roboticstoolbox/blocks/Icons/delta2tr.png +0 -0
  94. roboticstoolbox/blocks/Icons/diffsteer.png +0 -0
  95. roboticstoolbox/blocks/Icons/fdyn.png +0 -0
  96. roboticstoolbox/blocks/Icons/fdynx.png +0 -0
  97. roboticstoolbox/blocks/Icons/fkine.png +0 -0
  98. roboticstoolbox/blocks/Icons/gravload.png +0 -0
  99. roboticstoolbox/blocks/Icons/idyn.png +0 -0
  100. roboticstoolbox/blocks/Icons/idynx.png +0 -0
  101. roboticstoolbox/blocks/Icons/ikine.png +0 -0
  102. roboticstoolbox/blocks/Icons/inertia.png +0 -0
  103. roboticstoolbox/blocks/Icons/jacobian.png +0 -0
  104. roboticstoolbox/blocks/Icons/jtraj.png +0 -0
  105. roboticstoolbox/blocks/Icons/lspb.png +0 -0
  106. roboticstoolbox/blocks/Icons/multirotor.png +0 -0
  107. roboticstoolbox/blocks/Icons/multirotormixer.png +0 -0
  108. roboticstoolbox/blocks/Icons/multirotorplot.png +0 -0
  109. roboticstoolbox/blocks/Icons/point2tr.png +0 -0
  110. roboticstoolbox/blocks/Icons/tr2delta.png +0 -0
  111. roboticstoolbox/blocks/Icons/tr2t.png +0 -0
  112. roboticstoolbox/blocks/Icons/unicycle.png +0 -0
  113. roboticstoolbox/blocks/Icons/vehicleplot.png +0 -0
  114. roboticstoolbox/blocks/README.md +43 -0
  115. roboticstoolbox/blocks/__init__.py +6 -0
  116. roboticstoolbox/blocks/arm.py +1591 -0
  117. roboticstoolbox/blocks/mobile.py +522 -0
  118. roboticstoolbox/blocks/quad_model.py +132 -0
  119. roboticstoolbox/blocks/spatial.py +245 -0
  120. roboticstoolbox/blocks/uav.py +949 -0
  121. roboticstoolbox/demo/__init__.py +0 -0
  122. roboticstoolbox/demo/eigdemo.py +112 -0
  123. roboticstoolbox/demo/tripleangledemo.py +239 -0
  124. roboticstoolbox/demo/twistdemo.py +175 -0
  125. roboticstoolbox/ets/ET.py +439 -0
  126. roboticstoolbox/ets/ET2.py +179 -0
  127. roboticstoolbox/ets/ETS.py +2013 -0
  128. roboticstoolbox/ets/ETS2.py +449 -0
  129. roboticstoolbox/ets/_ET.py +668 -0
  130. roboticstoolbox/ets/_ETS.py +781 -0
  131. roboticstoolbox/ets/__init__.py +11 -0
  132. roboticstoolbox/ets/cpp-extensions/Eigen/Cholesky +45 -0
  133. roboticstoolbox/ets/cpp-extensions/Eigen/CholmodSupport +48 -0
  134. roboticstoolbox/ets/cpp-extensions/Eigen/Core +384 -0
  135. roboticstoolbox/ets/cpp-extensions/Eigen/Dense +7 -0
  136. roboticstoolbox/ets/cpp-extensions/Eigen/Eigen +2 -0
  137. roboticstoolbox/ets/cpp-extensions/Eigen/Eigenvalues +60 -0
  138. roboticstoolbox/ets/cpp-extensions/Eigen/Geometry +59 -0
  139. roboticstoolbox/ets/cpp-extensions/Eigen/Householder +29 -0
  140. roboticstoolbox/ets/cpp-extensions/Eigen/IterativeLinearSolvers +48 -0
  141. roboticstoolbox/ets/cpp-extensions/Eigen/Jacobi +32 -0
  142. roboticstoolbox/ets/cpp-extensions/Eigen/KLUSupport +41 -0
  143. roboticstoolbox/ets/cpp-extensions/Eigen/LU +47 -0
  144. roboticstoolbox/ets/cpp-extensions/Eigen/MetisSupport +35 -0
  145. roboticstoolbox/ets/cpp-extensions/Eigen/OrderingMethods +70 -0
  146. roboticstoolbox/ets/cpp-extensions/Eigen/PaStiXSupport +49 -0
  147. roboticstoolbox/ets/cpp-extensions/Eigen/PardisoSupport +35 -0
  148. roboticstoolbox/ets/cpp-extensions/Eigen/QR +50 -0
  149. roboticstoolbox/ets/cpp-extensions/Eigen/QtAlignedMalloc +39 -0
  150. roboticstoolbox/ets/cpp-extensions/Eigen/SPQRSupport +34 -0
  151. roboticstoolbox/ets/cpp-extensions/Eigen/SVD +50 -0
  152. roboticstoolbox/ets/cpp-extensions/Eigen/Sparse +34 -0
  153. roboticstoolbox/ets/cpp-extensions/Eigen/SparseCholesky +37 -0
  154. roboticstoolbox/ets/cpp-extensions/Eigen/SparseCore +69 -0
  155. roboticstoolbox/ets/cpp-extensions/Eigen/SparseLU +50 -0
  156. roboticstoolbox/ets/cpp-extensions/Eigen/SparseQR +36 -0
  157. roboticstoolbox/ets/cpp-extensions/Eigen/StdDeque +27 -0
  158. roboticstoolbox/ets/cpp-extensions/Eigen/StdList +26 -0
  159. roboticstoolbox/ets/cpp-extensions/Eigen/StdVector +27 -0
  160. roboticstoolbox/ets/cpp-extensions/Eigen/SuperLUSupport +64 -0
  161. roboticstoolbox/ets/cpp-extensions/Eigen/UmfPackSupport +40 -0
  162. roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LDLT.h +688 -0
  163. roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LLT.h +558 -0
  164. roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
  165. roboticstoolbox/ets/cpp-extensions/Eigen/src/CholmodSupport/CholmodSupport.h +682 -0
  166. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArithmeticSequence.h +413 -0
  167. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Array.h +417 -0
  168. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArrayBase.h +226 -0
  169. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArrayWrapper.h +209 -0
  170. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Assign.h +90 -0
  171. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/AssignEvaluator.h +1010 -0
  172. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Assign_MKL.h +178 -0
  173. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/BandMatrix.h +353 -0
  174. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Block.h +448 -0
  175. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/BooleanRedux.h +162 -0
  176. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CommaInitializer.h +164 -0
  177. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ConditionEstimator.h +175 -0
  178. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CoreEvaluators.h +1741 -0
  179. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CoreIterators.h +132 -0
  180. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseBinaryOp.h +183 -0
  181. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseNullaryOp.h +1001 -0
  182. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseTernaryOp.h +197 -0
  183. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseUnaryOp.h +103 -0
  184. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseUnaryView.h +132 -0
  185. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseBase.h +701 -0
  186. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseCoeffsBase.h +685 -0
  187. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseStorage.h +652 -0
  188. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Diagonal.h +258 -0
  189. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DiagonalMatrix.h +391 -0
  190. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DiagonalProduct.h +28 -0
  191. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Dot.h +318 -0
  192. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/EigenBase.h +160 -0
  193. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ForceAlignedAccess.h +150 -0
  194. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Fuzzy.h +155 -0
  195. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GeneralProduct.h +465 -0
  196. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GenericPacketMath.h +1040 -0
  197. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GlobalFunctions.h +194 -0
  198. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/IO.h +258 -0
  199. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/IndexedView.h +237 -0
  200. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Inverse.h +117 -0
  201. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Map.h +171 -0
  202. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MapBase.h +310 -0
  203. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MathFunctions.h +2057 -0
  204. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MathFunctionsImpl.h +200 -0
  205. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Matrix.h +565 -0
  206. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MatrixBase.h +547 -0
  207. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NestByValue.h +85 -0
  208. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NoAlias.h +109 -0
  209. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NumTraits.h +335 -0
  210. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  211. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PermutationMatrix.h +605 -0
  212. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PlainObjectBase.h +1128 -0
  213. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Product.h +191 -0
  214. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ProductEvaluators.h +1179 -0
  215. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Random.h +218 -0
  216. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Redux.h +515 -0
  217. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Ref.h +381 -0
  218. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Replicate.h +142 -0
  219. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Reshaped.h +454 -0
  220. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ReturnByValue.h +119 -0
  221. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Reverse.h +217 -0
  222. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Select.h +164 -0
  223. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SelfAdjointView.h +365 -0
  224. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
  225. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Solve.h +188 -0
  226. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SolveTriangular.h +235 -0
  227. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SolverBase.h +168 -0
  228. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/StableNorm.h +251 -0
  229. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/StlIterators.h +463 -0
  230. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Stride.h +116 -0
  231. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Swap.h +68 -0
  232. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Transpose.h +464 -0
  233. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Transpositions.h +386 -0
  234. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/TriangularMatrix.h +1001 -0
  235. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/VectorBlock.h +96 -0
  236. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/VectorwiseOp.h +784 -0
  237. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Visitor.h +381 -0
  238. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/Complex.h +372 -0
  239. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/MathFunctions.h +228 -0
  240. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/PacketMath.h +1574 -0
  241. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/TypeCasting.h +115 -0
  242. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  243. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/MathFunctions.h +362 -0
  244. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/PacketMath.h +2303 -0
  245. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  246. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/Complex.h +417 -0
  247. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MathFunctions.h +90 -0
  248. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  249. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  250. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  251. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/PacketMath.h +2711 -0
  252. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/CUDA/Complex.h +258 -0
  253. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  254. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/ConjHelper.h +117 -0
  255. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  256. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  257. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/Half.h +942 -0
  258. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/Settings.h +49 -0
  259. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  260. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/MathFunctions.h +103 -0
  261. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  262. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  263. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  264. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  265. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  266. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  267. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/Complex.h +584 -0
  268. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  269. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/MathFunctions.h +75 -0
  270. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/PacketMath.h +4587 -0
  271. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  272. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/Complex.h +351 -0
  273. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/MathFunctions.h +199 -0
  274. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/PacketMath.h +1505 -0
  275. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/TypeCasting.h +142 -0
  276. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  277. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  278. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  279. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  280. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  281. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  282. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  283. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  284. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/Complex.h +426 -0
  285. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/MathFunctions.h +233 -0
  286. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/PacketMath.h +1060 -0
  287. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/AssignmentFunctors.h +177 -0
  288. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/BinaryFunctors.h +541 -0
  289. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/NullaryFunctors.h +189 -0
  290. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/StlFunctors.h +166 -0
  291. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
  292. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/UnaryFunctors.h +1131 -0
  293. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2645 -0
  294. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrix.h +517 -0
  295. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +317 -0
  296. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
  297. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +124 -0
  298. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixVector.h +518 -0
  299. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
  300. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/Parallelizer.h +180 -0
  301. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +544 -0
  302. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +295 -0
  303. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixVector.h +262 -0
  304. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
  305. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
  306. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointRank2Update.h +94 -0
  307. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixMatrix.h +472 -0
  308. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +317 -0
  309. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
  310. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
  311. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverMatrix.h +337 -0
  312. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +167 -0
  313. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverVector.h +148 -0
  314. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/BlasUtil.h +583 -0
  315. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  316. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Constants.h +563 -0
  317. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/DisableStupidWarnings.h +106 -0
  318. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ForwardDeclarations.h +322 -0
  319. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  320. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/IntegralConstant.h +272 -0
  321. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/MKL_support.h +137 -0
  322. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Macros.h +1464 -0
  323. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Memory.h +1163 -0
  324. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Meta.h +812 -0
  325. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/NonMPL2.h +3 -0
  326. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ReenableStupidWarnings.h +31 -0
  327. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  328. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/StaticAssert.h +221 -0
  329. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  330. roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/XprHelper.h +856 -0
  331. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
  332. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexSchur.h +462 -0
  333. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
  334. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
  335. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
  336. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
  337. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
  338. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
  339. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealQZ.h +657 -0
  340. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealSchur.h +558 -0
  341. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
  342. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +904 -0
  343. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
  344. roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/Tridiagonalization.h +561 -0
  345. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/AlignedBox.h +486 -0
  346. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/AngleAxis.h +247 -0
  347. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/EulerAngles.h +114 -0
  348. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Homogeneous.h +501 -0
  349. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Hyperplane.h +282 -0
  350. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/OrthoMethods.h +235 -0
  351. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/ParametrizedLine.h +232 -0
  352. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Quaternion.h +870 -0
  353. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Rotation2D.h +199 -0
  354. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/RotationBase.h +206 -0
  355. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Scaling.h +188 -0
  356. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Transform.h +1563 -0
  357. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Translation.h +202 -0
  358. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Umeyama.h +166 -0
  359. roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  360. roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/BlockHouseholder.h +110 -0
  361. roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/Householder.h +176 -0
  362. roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/HouseholderSequence.h +545 -0
  363. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
  364. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +212 -0
  365. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +229 -0
  366. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +394 -0
  367. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +453 -0
  368. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +444 -0
  369. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +198 -0
  370. roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +117 -0
  371. roboticstoolbox/ets/cpp-extensions/Eigen/src/Jacobi/Jacobi.h +483 -0
  372. roboticstoolbox/ets/cpp-extensions/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  373. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/Determinant.h +117 -0
  374. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/FullPivLU.h +877 -0
  375. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/InverseImpl.h +432 -0
  376. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/PartialPivLU.h +624 -0
  377. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
  378. roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/arch/InverseSize4.h +351 -0
  379. roboticstoolbox/ets/cpp-extensions/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  380. roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Amd.h +435 -0
  381. roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Eigen_Colamd.h +1863 -0
  382. roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Ordering.h +153 -0
  383. roboticstoolbox/ets/cpp-extensions/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
  384. roboticstoolbox/ets/cpp-extensions/Eigen/src/PardisoSupport/PardisoSupport.h +545 -0
  385. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/ColPivHouseholderQR.h +674 -0
  386. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
  387. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/CompleteOrthogonalDecomposition.h +635 -0
  388. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/FullPivHouseholderQR.h +713 -0
  389. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/HouseholderQR.h +434 -0
  390. roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
  391. roboticstoolbox/ets/cpp-extensions/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +335 -0
  392. roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/BDCSVD.h +1366 -0
  393. roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/JacobiSVD.h +812 -0
  394. roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
  395. roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/SVDBase.h +376 -0
  396. roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
  397. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCholesky/SimplicialCholesky.h +697 -0
  398. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +174 -0
  399. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/AmbiVector.h +378 -0
  400. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/CompressedStorage.h +274 -0
  401. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
  402. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
  403. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseAssign.h +270 -0
  404. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseBlock.h +571 -0
  405. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  406. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCompressedBase.h +370 -0
  407. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +722 -0
  408. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +150 -0
  409. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDenseProduct.h +342 -0
  410. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
  411. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDot.h +98 -0
  412. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
  413. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMap.h +305 -0
  414. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMatrix.h +1518 -0
  415. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMatrixBase.h +398 -0
  416. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparsePermutation.h +178 -0
  417. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseProduct.h +181 -0
  418. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseRedux.h +49 -0
  419. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseRef.h +397 -0
  420. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSelfAdjointView.h +659 -0
  421. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
  422. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
  423. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseTranspose.h +92 -0
  424. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
  425. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseUtil.h +186 -0
  426. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseVector.h +478 -0
  427. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseView.h +254 -0
  428. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/TriangularSolver.h +315 -0
  429. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU.h +923 -0
  430. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  431. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
  432. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
  433. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +375 -0
  434. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  435. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
  436. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
  437. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
  438. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
  439. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
  440. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  441. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  442. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  443. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  444. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
  445. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  446. roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseQR/SparseQR.h +758 -0
  447. roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdDeque.h +116 -0
  448. roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdList.h +106 -0
  449. roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdVector.h +131 -0
  450. roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/details.h +84 -0
  451. roboticstoolbox/ets/cpp-extensions/Eigen/src/SuperLUSupport/SuperLUSupport.h +1025 -0
  452. roboticstoolbox/ets/cpp-extensions/Eigen/src/UmfPackSupport/UmfPackSupport.h +642 -0
  453. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/Image.h +82 -0
  454. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/Kernel.h +79 -0
  455. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/RealSvd2x2.h +55 -0
  456. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/blas.h +440 -0
  457. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapack.h +152 -0
  458. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapacke.h +16292 -0
  459. roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapacke_mangling.h +17 -0
  460. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ArrayCwiseBinaryOps.h +358 -0
  461. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ArrayCwiseUnaryOps.h +696 -0
  462. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/BlockMethods.h +1442 -0
  463. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
  464. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/CommonCwiseUnaryOps.h +177 -0
  465. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  466. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
  467. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/MatrixCwiseUnaryOps.h +95 -0
  468. roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ReshapedMethods.h +149 -0
  469. roboticstoolbox/ets/cpp-extensions/README.md +73 -0
  470. roboticstoolbox/ets/cpp-extensions/fknm_nb.cpp +534 -0
  471. roboticstoolbox/ets/cpp-extensions/ik.cpp +301 -0
  472. roboticstoolbox/ets/cpp-extensions/ik.h +59 -0
  473. roboticstoolbox/ets/cpp-extensions/linalg.cpp +316 -0
  474. roboticstoolbox/ets/cpp-extensions/linalg.h +64 -0
  475. roboticstoolbox/ets/cpp-extensions/methods.cpp +372 -0
  476. roboticstoolbox/ets/cpp-extensions/methods.h +32 -0
  477. roboticstoolbox/ets/cpp-extensions/structs.cpp +24 -0
  478. roboticstoolbox/ets/cpp-extensions/structs.h +62 -0
  479. roboticstoolbox/ets/fknm.py +366 -0
  480. roboticstoolbox/mobile/Animations.py +485 -0
  481. roboticstoolbox/mobile/Bug2.py +455 -0
  482. roboticstoolbox/mobile/CurvaturePolyPlanner.py +179 -0
  483. roboticstoolbox/mobile/DistanceTransformPlanner.py +395 -0
  484. roboticstoolbox/mobile/DstarPlanner.py +591 -0
  485. roboticstoolbox/mobile/DubinsPlanner.py +474 -0
  486. roboticstoolbox/mobile/EKF.py +1617 -0
  487. roboticstoolbox/mobile/LatticePlanner.py +419 -0
  488. roboticstoolbox/mobile/OccGrid.py +613 -0
  489. roboticstoolbox/mobile/PRMPlanner.py +348 -0
  490. roboticstoolbox/mobile/ParticleFilter.py +706 -0
  491. roboticstoolbox/mobile/PlannerBase.py +1009 -0
  492. roboticstoolbox/mobile/PoseGraph.py +544 -0
  493. roboticstoolbox/mobile/QuinticPolyPlanner.py +349 -0
  494. roboticstoolbox/mobile/RRTPlanner.py +359 -0
  495. roboticstoolbox/mobile/ReedsSheppPlanner.py +545 -0
  496. roboticstoolbox/mobile/Vehicle.py +1909 -0
  497. roboticstoolbox/mobile/__init__.py +194 -0
  498. roboticstoolbox/mobile/drivers.py +397 -0
  499. roboticstoolbox/mobile/landmarkmap.py +181 -0
  500. roboticstoolbox/mobile/sensors.py +789 -0
  501. roboticstoolbox/models/DH/AL5D.py +121 -0
  502. roboticstoolbox/models/DH/Ball.py +87 -0
  503. roboticstoolbox/models/DH/Baxter.py +91 -0
  504. roboticstoolbox/models/DH/Cobra600.py +63 -0
  505. roboticstoolbox/models/DH/Coil.py +80 -0
  506. roboticstoolbox/models/DH/Hyper.py +81 -0
  507. roboticstoolbox/models/DH/Hyper3d.py +83 -0
  508. roboticstoolbox/models/DH/IRB140.py +159 -0
  509. roboticstoolbox/models/DH/Jaco.py +102 -0
  510. roboticstoolbox/models/DH/KR5.py +112 -0
  511. roboticstoolbox/models/DH/LWR4.py +80 -0
  512. roboticstoolbox/models/DH/Mico.py +102 -0
  513. roboticstoolbox/models/DH/Orion5.py +91 -0
  514. roboticstoolbox/models/DH/P8.py +80 -0
  515. roboticstoolbox/models/DH/Panda.py +213 -0
  516. roboticstoolbox/models/DH/Planar2.py +69 -0
  517. roboticstoolbox/models/DH/Planar3.py +51 -0
  518. roboticstoolbox/models/DH/Puma560.py +326 -0
  519. roboticstoolbox/models/DH/README.md +216 -0
  520. roboticstoolbox/models/DH/Sawyer.py +85 -0
  521. roboticstoolbox/models/DH/Stanford.py +147 -0
  522. roboticstoolbox/models/DH/TwoLink.py +153 -0
  523. roboticstoolbox/models/DH/UR10.py +124 -0
  524. roboticstoolbox/models/DH/UR3.py +98 -0
  525. roboticstoolbox/models/DH/UR5.py +98 -0
  526. roboticstoolbox/models/DH/Uprighttl.py +24 -0
  527. roboticstoolbox/models/DH/__init__.py +52 -0
  528. roboticstoolbox/models/ETS/Frankie.py +90 -0
  529. roboticstoolbox/models/ETS/GenericSeven.py +54 -0
  530. roboticstoolbox/models/ETS/Omni.py +74 -0
  531. roboticstoolbox/models/ETS/Panda.py +69 -0
  532. roboticstoolbox/models/ETS/Planar2.py +49 -0
  533. roboticstoolbox/models/ETS/Planar_Y.py +65 -0
  534. roboticstoolbox/models/ETS/Puma560.py +70 -0
  535. roboticstoolbox/models/ETS/XYPanda.py +84 -0
  536. roboticstoolbox/models/ETS/__init__.py +20 -0
  537. roboticstoolbox/models/README.md +9 -0
  538. roboticstoolbox/models/URDF/AL5D.py +45 -0
  539. roboticstoolbox/models/URDF/Fetch.py +96 -0
  540. roboticstoolbox/models/URDF/Frankie.py +67 -0
  541. roboticstoolbox/models/URDF/FrankieOmni.py +94 -0
  542. roboticstoolbox/models/URDF/Jaco.py +49 -0
  543. roboticstoolbox/models/URDF/KinovaGen3.py +63 -0
  544. roboticstoolbox/models/URDF/LBR.py +57 -0
  545. roboticstoolbox/models/URDF/PR2.py +66 -0
  546. roboticstoolbox/models/URDF/Panda.py +60 -0
  547. roboticstoolbox/models/URDF/Puma560.py +90 -0
  548. roboticstoolbox/models/URDF/UR10.py +43 -0
  549. roboticstoolbox/models/URDF/UR3.py +43 -0
  550. roboticstoolbox/models/URDF/UR5.py +64 -0
  551. roboticstoolbox/models/URDF/URDFRobot.py +402 -0
  552. roboticstoolbox/models/URDF/Valkyrie.py +110 -0
  553. roboticstoolbox/models/URDF/YuMi.py +107 -0
  554. roboticstoolbox/models/URDF/__init__.py +51 -0
  555. roboticstoolbox/models/URDF/px100.py +48 -0
  556. roboticstoolbox/models/URDF/px150.py +48 -0
  557. roboticstoolbox/models/URDF/rx150.py +48 -0
  558. roboticstoolbox/models/URDF/rx200.py +48 -0
  559. roboticstoolbox/models/URDF/vx300.py +48 -0
  560. roboticstoolbox/models/URDF/vx300s.py +48 -0
  561. roboticstoolbox/models/URDF/wx200.py +48 -0
  562. roboticstoolbox/models/URDF/wx250.py +48 -0
  563. roboticstoolbox/models/URDF/wx250s.py +48 -0
  564. roboticstoolbox/models/__init__.py +7 -0
  565. roboticstoolbox/models/catalog.py +226 -0
  566. roboticstoolbox/robot/BaseRobot.py +2589 -0
  567. roboticstoolbox/robot/DHFactor.py +522 -0
  568. roboticstoolbox/robot/DHLink.py +949 -0
  569. roboticstoolbox/robot/DHRobot.py +2591 -0
  570. roboticstoolbox/robot/Dynamics.py +1537 -0
  571. roboticstoolbox/robot/ELink.py +23 -0
  572. roboticstoolbox/robot/ERobot.py +25 -0
  573. roboticstoolbox/robot/Gripper.py +242 -0
  574. roboticstoolbox/robot/IK.py +1378 -0
  575. roboticstoolbox/robot/Link.py +1557 -0
  576. roboticstoolbox/robot/PoERobot.py +352 -0
  577. roboticstoolbox/robot/Robot.py +2157 -0
  578. roboticstoolbox/robot/RobotKinematics.py +1505 -0
  579. roboticstoolbox/robot/RobotPlottingMPL.py +355 -0
  580. roboticstoolbox/robot/RobotProto.py +156 -0
  581. roboticstoolbox/robot/__init__.py +57 -0
  582. roboticstoolbox/robot/cpp-extensions/README.md +29 -0
  583. roboticstoolbox/robot/cpp-extensions/frne.h +96 -0
  584. roboticstoolbox/robot/cpp-extensions/frne_nb.cpp +237 -0
  585. roboticstoolbox/robot/cpp-extensions/ne.c +495 -0
  586. roboticstoolbox/robot/cpp-extensions/vmath.c +163 -0
  587. roboticstoolbox/robot/cpp-extensions/vmath.h +32 -0
  588. roboticstoolbox/robot/frne.py +51 -0
  589. roboticstoolbox/tools/DHFactor.py +375 -0
  590. roboticstoolbox/tools/Ticker.py +53 -0
  591. roboticstoolbox/tools/__init__.py +54 -0
  592. roboticstoolbox/tools/data.py +187 -0
  593. roboticstoolbox/tools/jsingu.py +51 -0
  594. roboticstoolbox/tools/null.py +48 -0
  595. roboticstoolbox/tools/numerical.py +96 -0
  596. roboticstoolbox/tools/p_servo.py +108 -0
  597. roboticstoolbox/tools/params.py +11 -0
  598. roboticstoolbox/tools/plot.py +109 -0
  599. roboticstoolbox/tools/trajectory.py +1152 -0
  600. roboticstoolbox/tools/types.py +13 -0
  601. roboticstoolbox/tools/urdf/__init__.py +45 -0
  602. roboticstoolbox/tools/urdf/tests/data/ur5.urdf +341 -0
  603. roboticstoolbox/tools/urdf/tests/test_urdf.py +116 -0
  604. roboticstoolbox/tools/urdf/urdf.py +1930 -0
  605. roboticstoolbox/tools/urdf/utils.py +50 -0
  606. roboticstoolbox_python-1.4.0.dist-info/METADATA +664 -0
  607. roboticstoolbox_python-1.4.0.dist-info/RECORD +610 -0
  608. roboticstoolbox_python-1.4.0.dist-info/WHEEL +5 -0
  609. roboticstoolbox_python-1.4.0.dist-info/entry_points.txt +6 -0
  610. roboticstoolbox_python-1.4.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1930 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ @author (Original) Matthew Matl, Github: mmatl
4
+ @author (Adapted by) Jesse Haviland
5
+ """
6
+
7
+ import numpy as np
8
+ import roboticstoolbox as rtb
9
+ import spatialgeometry as gm
10
+ import copy
11
+ import os
12
+ import xml.etree.ElementTree as ETT
13
+ from spatialmath import SE3
14
+ from spatialmath.base import unitvec_norm, angvec2r, tr2rpy
15
+
16
+ from io import BytesIO
17
+ from roboticstoolbox.tools.data import rtb_path_to_datafile
18
+ from pathlib import PurePosixPath
19
+
20
+
21
+ from .utils import parse_origin, configure_origin
22
+
23
+ # Global variable for the base path of the robot meshes
24
+ _base_path = None
25
+
26
+
27
+ class URDFType():
28
+ """Abstract base class for all URDF types.
29
+ This has useful class methods for automatic parsing/unparsing
30
+ of XML trees.
31
+ There are three overridable class variables:
32
+ - ``_ATTRIBS`` - This is a dictionary mapping attribute names to a tuple,
33
+ ``(type, required)`` where ``type`` is the Python type for the
34
+ attribute and ``required`` is a boolean stating whether the attribute
35
+ is required to be present.
36
+ - ``_ELEMENTS`` - This is a dictionary mapping element names to a tuple,
37
+ ``(type, required, multiple)`` where ``type`` is the Python type for the
38
+ element, ``required`` is a boolean stating whether the element
39
+ is required to be present, and ``multiple`` is a boolean indicating
40
+ whether multiple elements of this type could be present.
41
+ Elements are child nodes in the XML tree, and their type must be a
42
+ subclass of :class:`.URDFType`.
43
+ - ``_TAG`` - This is a string that represents the XML tag for the node
44
+ containing this type of object.
45
+ """
46
+
47
+ _ATTRIBS = {} # Map from attrib name to (type, required)
48
+ _ELEMENTS = {} # Map from element name to (type, required, multiple)
49
+ _TAG = "" # XML tag for this element
50
+
51
+ def __init__(self): # pragma nocover
52
+ pass
53
+
54
+ @classmethod
55
+ def _parse_attrib(cls, val_type, val):
56
+ """Parse an XML attribute into a python value.
57
+ Parameters
58
+ ----------
59
+ val_type : :class:`type`
60
+ The type of value to create.
61
+ val : :class:`object`
62
+ The value to parse.
63
+ Returns
64
+ -------
65
+ val : :class:`object`
66
+ The parsed attribute.
67
+ """
68
+ if val_type == np.ndarray:
69
+ val = np.fromstring(val, sep=" ")
70
+ else:
71
+ val = val_type(val)
72
+ return val
73
+
74
+ @classmethod
75
+ def _parse_simple_attribs(cls, node):
76
+ """Parse all attributes in the _ATTRIBS array for this class.
77
+ Parameters
78
+ ----------
79
+ node : :class:`lxml.etree.Element`
80
+ The node to parse attributes for.
81
+ Returns
82
+ -------
83
+ kwargs : dict
84
+ Map from attribute name to value. If the attribute is not
85
+ required and is not present, that attribute's name will map to
86
+ ``None``.
87
+ """
88
+ kwargs = {}
89
+ for a in cls._ATTRIBS:
90
+ t, r = cls._ATTRIBS[a] # t = type, r = required (bool)
91
+ if r:
92
+ try:
93
+ v = cls._parse_attrib(t, node.attrib[a])
94
+ except Exception: # pragma nocover
95
+ raise ValueError(
96
+ "Missing required attribute {} when parsing an object "
97
+ "of type {}".format(a, cls.__name__)
98
+ )
99
+ else:
100
+ v = None
101
+ if a in node.attrib:
102
+ v = cls._parse_attrib(t, node.attrib[a])
103
+ kwargs[a] = v
104
+ return kwargs
105
+
106
+ @classmethod
107
+ def _parse_simple_elements(cls, node, path):
108
+ """Parse all elements in the _ELEMENTS array from the children of
109
+ this node.
110
+ Parameters
111
+ ----------
112
+ node : :class:`lxml.etree.Element`
113
+ The node to parse children for.
114
+ path : str
115
+ The string path where the XML file is located (used for resolving
116
+ the location of mesh or image files).
117
+ Returns
118
+ -------
119
+ kwargs : dict
120
+ Map from element names to the :class:`URDFType` subclass (or list,
121
+ if ``multiple`` was set) created for that element.
122
+ """
123
+ kwargs = {}
124
+ for a in cls._ELEMENTS:
125
+ t, r, m = cls._ELEMENTS[a]
126
+ if not m:
127
+ v = node.find(t._TAG)
128
+ if r or v is not None:
129
+ v = t._from_xml(v, path)
130
+ else:
131
+ vs = node.findall(t._TAG)
132
+ if len(vs) == 0 and r: # pragma nocover
133
+ raise ValueError(
134
+ "Missing required subelement(s) of type {} when "
135
+ "parsing an object of type {}".format(t.__name__, cls.__name__)
136
+ )
137
+ v = [t._from_xml(n, path) for n in vs]
138
+ kwargs[a] = v
139
+ return kwargs
140
+
141
+ @classmethod
142
+ def _parse(cls, node, path):
143
+ """Parse all elements and attributes in the _ELEMENTS and _ATTRIBS
144
+ arrays for a node.
145
+ Parameters
146
+ ----------
147
+ node : :class:`lxml.etree.Element`
148
+ The node to parse.
149
+ path : str
150
+ The string path where the XML file is located (used for resolving
151
+ the location of mesh or image files).
152
+ Returns
153
+ -------
154
+ kwargs : dict
155
+ Map from names to Python classes created from the attributes
156
+ and elements in the class arrays.
157
+ """
158
+ kwargs = cls._parse_simple_attribs(node)
159
+ kwargs.update(cls._parse_simple_elements(node, path))
160
+ return kwargs
161
+
162
+ @classmethod
163
+ def _from_xml(cls, node, path):
164
+ """Create an instance of this class from an XML node.
165
+ Parameters
166
+ ----------
167
+ node : :class:`lxml.etree.Element`
168
+ The node to parse.
169
+ path : str
170
+ The string path where the XML file is located (used for resolving
171
+ the location of mesh or image files).
172
+ Returns
173
+ -------
174
+ obj : :class:`URDFType`
175
+ An instance of this class parsed from the node.
176
+ """
177
+ return cls(**cls._parse(node, path))
178
+
179
+
180
+ ###############################################################################
181
+ # Link types
182
+ ###############################################################################
183
+
184
+
185
+ class Box(URDFType):
186
+ """A rectangular prism whose center is at the local origin.
187
+ Parameters
188
+ ----------
189
+ size : (3,) float
190
+ The length, width, and height of the box in meters.
191
+ """
192
+
193
+ _ATTRIBS = {"size": (np.ndarray, True)}
194
+ _TAG = "box"
195
+
196
+ def __init__(self, size):
197
+ self.size = size
198
+
199
+ def __repr__(self): # pragma nocover
200
+ return "Box(size={})".format(self.size)
201
+
202
+ @property
203
+ def size(self):
204
+ """(3,) float : The length, width, and height of the box in meters."""
205
+ return self._size
206
+
207
+ @size.setter
208
+ def size(self, value):
209
+ self._size = np.asanyarray(value).astype(np.float64)
210
+
211
+
212
+ class Cylinder(URDFType):
213
+ """A cylinder whose center is at the local origin.
214
+ Parameters
215
+ ----------
216
+ radius : float
217
+ The radius of the cylinder in meters.
218
+ length : float
219
+ The length of the cylinder in meters.
220
+ """
221
+
222
+ _ATTRIBS = {
223
+ "radius": (float, True),
224
+ "length": (float, True),
225
+ }
226
+ _TAG = "cylinder"
227
+
228
+ def __init__(self, radius, length):
229
+ self.radius = radius
230
+ self.length = length
231
+
232
+ def __repr__(self): # pragma nocover
233
+ return "Cylinder(radius={}, length={})".format(self.radius, self.length)
234
+
235
+ @property
236
+ def radius(self):
237
+ """float : The radius of the cylinder in meters."""
238
+ return self._radius
239
+
240
+ @radius.setter
241
+ def radius(self, value):
242
+ self._radius = float(value)
243
+
244
+ @property
245
+ def length(self):
246
+ """float : The length of the cylinder in meters."""
247
+ return self._length
248
+
249
+ @length.setter
250
+ def length(self, value):
251
+ self._length = float(value)
252
+
253
+
254
+ class Sphere(URDFType):
255
+ """A sphere whose center is at the local origin.
256
+ Parameters
257
+ ----------
258
+ radius : float
259
+ The radius of the sphere in meters.
260
+ """
261
+
262
+ _ATTRIBS = {
263
+ "radius": (float, True),
264
+ }
265
+ _TAG = "sphere"
266
+
267
+ def __init__(self, radius):
268
+ self.radius = radius
269
+
270
+ def __repr__(self): # pragma nocover
271
+ return "Sphere(radius={})".format(self.radius)
272
+
273
+ @property
274
+ def radius(self):
275
+ """float : The radius of the sphere in meters."""
276
+ return self._radius
277
+
278
+ @radius.setter
279
+ def radius(self, value):
280
+ self._radius = float(value)
281
+
282
+
283
+ class Mesh(URDFType):
284
+ """A triangular mesh object.
285
+ Parameters
286
+ ----------
287
+ filename : str
288
+ The path to the mesh that contains this object. This can be
289
+ relative to the top-level URDF or an absolute path.
290
+ scale : (3,) float, optional
291
+ The scaling value for the mesh along the XYZ axes.
292
+ If ``None``, assumes no scale is applied.
293
+ """
294
+
295
+ _ATTRIBS = {"filename": (str, True), "scale": (np.ndarray, False)}
296
+ _TAG = "mesh"
297
+
298
+ def __init__(self, filename, scale=None):
299
+ self.filename = filename
300
+ self.scale = scale
301
+
302
+ def __repr__(self): # pragma nocover
303
+ return "Mesh(filename={}, scale={})".format(self.filename, self.scale)
304
+
305
+ @property
306
+ def filename(self):
307
+ """str : The path to the mesh file for this object."""
308
+ return self._filename
309
+
310
+ @filename.setter
311
+ def filename(self, value):
312
+
313
+ global _base_path
314
+
315
+ if value.startswith("package://"):
316
+ value = value.replace("package://", "")
317
+ elif value.startswith("file://"):
318
+ value = value.replace("file://", "")
319
+
320
+ if _base_path is None:
321
+ value = rtb_path_to_datafile("xacro", value)
322
+ else:
323
+ value = _base_path / PurePosixPath(value)
324
+
325
+ self._filename = str(value)
326
+
327
+ @property
328
+ def scale(self):
329
+ """(3,) float : A scaling for the mesh along its local XYZ axes."""
330
+ return self._scale
331
+
332
+ @scale.setter
333
+ def scale(self, value):
334
+ if value is not None:
335
+ value = np.asanyarray(value).astype(np.float64)
336
+ self._scale = value
337
+
338
+ @classmethod
339
+ def _from_xml(cls, node, path):
340
+ kwargs = cls._parse(node, path)
341
+ return Mesh(**kwargs)
342
+
343
+
344
+ class Material(URDFType):
345
+ """A material for some geometry.
346
+ Parameters
347
+ ----------
348
+ name : str
349
+ The name of the material.
350
+ color : (4,) float, optional
351
+ The RGBA color of the material in the range [0,1].
352
+ texture : :class:`.Texture`, optional
353
+ A texture for the material.
354
+ """
355
+ def __repr__(self): # pragma nocover
356
+ return "Material(name={}, color={}, texture={})".format(
357
+ self.name, self.color, self.texture
358
+ )
359
+
360
+ _ATTRIBS = {"name": (str, True)}
361
+ _ELEMENTS = {}
362
+ _TAG = "material"
363
+
364
+ def __init__(self, name, color=None, texture=None):
365
+ # if color is None:
366
+ # color = name
367
+
368
+ self.name = name
369
+ self.color = color
370
+ self.texture = texture
371
+
372
+ @classmethod
373
+ def _from_xml(cls, node, path): # pragma nocover
374
+ kwargs = cls._parse(node, path)
375
+
376
+ # Extract the color -- it's weirdly an attribute of a subelement
377
+ color = node.find("color")
378
+ if color is not None:
379
+ color = np.fromstring(color.attrib["rgba"], sep=" ", dtype=np.float64)
380
+ kwargs["color"] = color
381
+
382
+ return Material(**kwargs)
383
+
384
+
385
+ class Geometry(URDFType):
386
+ """A wrapper for all geometry types.
387
+ Only one of the following values can be set, all others should be set
388
+ to ``None``.
389
+ Parameters
390
+ ----------
391
+ box : :class:`.Box`, optional
392
+ Box geometry.
393
+ cylinder : :class:`.Cylinder`
394
+ Cylindrical geometry.
395
+ sphere : :class:`.Sphere`
396
+ Spherical geometry.
397
+ mesh : :class:`.Mesh`
398
+ Mesh geometry.
399
+ """
400
+
401
+ _ELEMENTS = {
402
+ "box": (Box, False, False),
403
+ "cylinder": (Cylinder, False, False),
404
+ "sphere": (Sphere, False, False),
405
+ "mesh": (Mesh, False, False),
406
+ }
407
+ _TAG = "geometry"
408
+
409
+ def __init__(self, box=None, cylinder=None, sphere=None, mesh=None):
410
+ if (
411
+ box is None and cylinder is None and sphere is None and mesh is None
412
+ ): # pragma nocover
413
+ raise ValueError("At least one geometry element must be set")
414
+
415
+ if box is not None:
416
+ self.box = box
417
+ self.ob = gm.Cuboid(box.size)
418
+
419
+ if cylinder is not None:
420
+ self.cylinder = cylinder
421
+ self.ob = gm.Cylinder(cylinder.radius, cylinder.length)
422
+
423
+ if sphere is not None:
424
+ self.sphere = sphere
425
+ self.ob = gm.Sphere(sphere.radius)
426
+
427
+ if mesh is not None:
428
+ self.mesh = mesh
429
+ self.ob = gm.Mesh(mesh.filename, scale=mesh.scale)
430
+
431
+ def __repr__(self): # pragma nocover
432
+ return "Geometry(box={}, cylinder={}, sphere={}, mesh={})".format(
433
+ self.box, self.cylinder, self.sphere, self.mesh
434
+ )
435
+
436
+ @property
437
+ def box(self):
438
+ """:class:`.Box` : Box geometry."""
439
+ return self._box
440
+
441
+ @box.setter
442
+ def box(self, value):
443
+ if value is not None and not isinstance(value, Box): # pragma nocover
444
+ raise TypeError("Expected Box type")
445
+ self._box = value
446
+
447
+ @property
448
+ def cylinder(self):
449
+ """:class:`.Cylinder` : Cylinder geometry."""
450
+ return self._cylinder
451
+
452
+ @cylinder.setter
453
+ def cylinder(self, value):
454
+ if value is not None and not isinstance(value, Cylinder):
455
+ raise TypeError("Expected Cylinder type") # pragma nocover
456
+ self._cylinder = value
457
+
458
+ @property
459
+ def sphere(self):
460
+ """:class:`.Sphere` : Spherical geometry."""
461
+ return self._sphere
462
+
463
+ @sphere.setter
464
+ def sphere(self, value):
465
+ if value is not None and not isinstance(value, Sphere):
466
+ raise TypeError("Expected Sphere type") # pragma nocover
467
+ self._sphere = value
468
+
469
+ @property
470
+ def mesh(self):
471
+ """:class:`.Mesh` : Mesh geometry."""
472
+ return self._mesh
473
+
474
+ @mesh.setter
475
+ def mesh(self, value):
476
+ if value is not None and not isinstance(value, Mesh):
477
+ raise TypeError("Expected Mesh type") # pragma nocover
478
+ self._mesh = value
479
+
480
+ @property
481
+ def geometry(self): # pragma nocover
482
+ """:class:`.Box`, :class:`.Cylinder`, :class:`.Sphere`, or
483
+ :class:`.Mesh` : The valid geometry element.
484
+ """
485
+ if self.box is not None:
486
+ return self.box
487
+ if self.cylinder is not None:
488
+ return self.cylinder
489
+ if self.sphere is not None:
490
+ return self.sphere
491
+ if self.mesh is not None:
492
+ return self.mesh
493
+ return None
494
+
495
+
496
+ class Collision(URDFType):
497
+ """Collision properties of a link.
498
+ Parameters
499
+ ----------
500
+ geometry : :class:`.Geometry`
501
+ The geometry of the element
502
+ name : str, optional
503
+ The name of the collision geometry.
504
+ origin : (4,4) float, optional
505
+ The pose of the collision element relative to the link frame.
506
+ Defaults to identity.
507
+ """
508
+
509
+ _ATTRIBS = {"name": (str, False)}
510
+ _ELEMENTS = {
511
+ "geometry": (Geometry, False, False),
512
+ }
513
+ _TAG = "collision"
514
+
515
+ def __init__(self, name, origin, geometry):
516
+ self.geometry = geometry
517
+ self.name = name
518
+ self.origin = origin
519
+ self.geometry.ob.T = origin
520
+
521
+ def __repr__(self): # pragma nocover
522
+ return "Collision(name={}, origin={}, geometry={})".format(
523
+ self.name, self.origin, self.geometry
524
+ )
525
+
526
+ @property
527
+ def geometry(self):
528
+ """:class:`.Geometry` : The geometry of this element."""
529
+ return self._geometry
530
+
531
+ @geometry.setter
532
+ def geometry(self, value):
533
+ if not isinstance(value, Geometry): # pragma nocover
534
+ raise TypeError("Must set geometry with Geometry object")
535
+ self._geometry = value
536
+
537
+ @property
538
+ def name(self):
539
+ """str : The name of this collision element."""
540
+ return self._name
541
+
542
+ @name.setter
543
+ def name(self, value):
544
+ if value is not None:
545
+ value = str(value)
546
+ self._name = value
547
+
548
+ @property
549
+ def origin(self):
550
+ """(4,4) float : The pose of this element relative to the link frame."""
551
+ return self._origin
552
+
553
+ @origin.setter
554
+ def origin(self, value):
555
+ self._origin = configure_origin(value)
556
+
557
+ @classmethod
558
+ def _from_xml(cls, node, path):
559
+ kwargs = cls._parse(node, path)
560
+ kwargs["origin"], _ = parse_origin(node)
561
+ return Collision(**kwargs)
562
+
563
+
564
+ class Visual(URDFType):
565
+ """Visual properties of a link.
566
+ Parameters
567
+ ----------
568
+ geometry : :class:`.Geometry`
569
+ The geometry of the element
570
+ name : str, optional
571
+ The name of the visual geometry.
572
+ origin : (4,4) float, optional
573
+ The pose of the visual element relative to the link frame.
574
+ Defaults to identity.
575
+ material : :class:`.Material`, optional
576
+ The material of the element.
577
+ """
578
+
579
+ _ATTRIBS = {"name": (str, False)}
580
+ _ELEMENTS = {
581
+ "geometry": (Geometry, False, False),
582
+ "material": (Material, False, False),
583
+ }
584
+ _TAG = "visual"
585
+
586
+ def __init__(self, geometry, name=None, origin=None, material=None):
587
+ self.geometry = geometry
588
+ geometry.ob.T = origin
589
+ self.name = name
590
+ self.origin = origin
591
+ self.material = material
592
+
593
+ # Do not set material color yet. The top level URDF colors have not
594
+ # been parsed/defined yet so we do not know what 'Grey' or 'Blue2'
595
+ # mean yet. We set colors after these top level definitions come in
596
+
597
+ # Do set it if the color was defined in line by the URDF
598
+ if material is not None and material.color is not None:
599
+ self.geometry.ob.color = material.color
600
+
601
+
602
+ def __repr__(self): # pragma nocover
603
+ return "Visual(name={}, origin={}, geometry={}, material={})".format(
604
+ self.name, self.origin, self.geometry, self.material
605
+ )
606
+
607
+ @property
608
+ def geometry(self):
609
+ """:class:`.Geometry` : The geometry of this element."""
610
+ return self._geometry
611
+
612
+ @geometry.setter
613
+ def geometry(self, value):
614
+ if not isinstance(value, Geometry): # pragma nocover
615
+ raise TypeError("Must set geometry with Geometry object")
616
+ self._geometry = value
617
+
618
+ @property
619
+ def name(self):
620
+ """str : The name of this visual element."""
621
+ return self._name
622
+
623
+ @name.setter
624
+ def name(self, value):
625
+ if value is not None:
626
+ value = str(value)
627
+ self._name = value
628
+
629
+ @property
630
+ def origin(self):
631
+ """(4,4) float : The pose of this element relative to the link frame."""
632
+ return self._origin
633
+
634
+ @origin.setter
635
+ def origin(self, value):
636
+ self._origin = configure_origin(value)
637
+
638
+ @classmethod
639
+ def _from_xml(cls, node, path):
640
+ kwargs = cls._parse(node, path)
641
+ kwargs["origin"], _ = parse_origin(node)
642
+ return Visual(**kwargs)
643
+
644
+
645
+ class Inertial(URDFType):
646
+ """The inertial properties of a link.
647
+ Parameters
648
+ ----------
649
+ mass : float
650
+ The mass of the link in kilograms.
651
+ inertia : (3,3) float
652
+ The 3x3 symmetric rotational inertia matrix.
653
+ origin : (4,4) float, optional
654
+ The pose of the inertials relative to the link frame.
655
+ Defaults to identity if not specified.
656
+ """
657
+
658
+ _TAG = "inertial"
659
+
660
+ def __init__(self, mass=None, inertia=None, origin=None):
661
+ self._mass = mass
662
+ self._inertia = inertia
663
+ self._origin = origin
664
+
665
+ def __repr__(self): # pragma nocover
666
+ return "Inertial(mass={}, inertia={}, origin={})".format(self.mass, self.inertia, self.origin)
667
+
668
+ @property
669
+ def mass(self):
670
+ """float : The mass of the link in kilograms."""
671
+ return self._mass
672
+
673
+ @mass.setter
674
+ def mass(self, value):
675
+ self._mass = float(value)
676
+
677
+ @property
678
+ def inertia(self):
679
+ """(3,3) float : The 3x3 symmetric rotational inertia matrix."""
680
+ return self._inertia
681
+
682
+ @inertia.setter
683
+ def inertia(self, value):
684
+ value = np.asanyarray(value).astype(np.float64)
685
+ if not np.allclose(value, value.T): # pragma nocover
686
+ raise ValueError("Inertia must be a symmetric matrix")
687
+ self._inertia = value
688
+
689
+ @property
690
+ def origin(self):
691
+ """(4,4) float : The pose of the inertials relative to the link frame."""
692
+ return self._origin
693
+
694
+ @origin.setter
695
+ def origin(self, value):
696
+ self._origin = configure_origin(value)
697
+
698
+ @classmethod
699
+ def _from_xml(cls, node, path):
700
+ origin, _ = parse_origin(node)
701
+ mass = float(node.find("mass").attrib["value"])
702
+ n = node.find("inertia")
703
+ xx = float(n.attrib["ixx"])
704
+ xy = float(n.attrib["ixy"])
705
+ xz = float(n.attrib["ixz"])
706
+ yy = float(n.attrib["iyy"])
707
+ yz = float(n.attrib["iyz"])
708
+ zz = float(n.attrib["izz"])
709
+ inertia = np.array([[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]], dtype=np.float64)
710
+ return Inertial(mass=mass, inertia=inertia, origin=origin)
711
+
712
+
713
+ ###############################################################################
714
+ # Joint types
715
+ ###############################################################################
716
+
717
+
718
+ class JointCalibration(URDFType): # pragma nocover
719
+ """The reference positions of the joint.
720
+ Parameters
721
+ ----------
722
+ rising : float, optional
723
+ When the joint moves in a positive direction, this position will
724
+ trigger a rising edge.
725
+ falling :
726
+ When the joint moves in a positive direction, this position will
727
+ trigger a falling edge.
728
+ """
729
+
730
+ _ATTRIBS = {"rising": (float, False), "falling": (float, False)}
731
+ _TAG = "calibration"
732
+
733
+ def __init__(self, rising=None, falling=None):
734
+ self.rising = rising
735
+ self.falling = falling
736
+
737
+ def __repr__(self): # pragma nocover
738
+ return "JointCalibration(rising={}, falling={})".format(self.rising, self.falling)
739
+
740
+ @property
741
+ def rising(self):
742
+ """float : description."""
743
+ return self._rising
744
+
745
+ @rising.setter
746
+ def rising(self, value):
747
+ if value is not None:
748
+ value = float(value)
749
+ self._rising = value
750
+
751
+ @property
752
+ def falling(self):
753
+ """float : description."""
754
+ return self._falling
755
+
756
+ @falling.setter
757
+ def falling(self, value):
758
+ if value is not None:
759
+ value = float(value)
760
+ self._falling = value
761
+
762
+ def copy(self, prefix="", scale=None):
763
+ """Create a deep copy of the visual with the prefix applied to all names.
764
+ Parameters
765
+ ----------
766
+ prefix : str
767
+ A prefix to apply to all joint and link names.
768
+ Returns
769
+ -------
770
+ :class:`.JointCalibration`
771
+ A deep copy of the visual.
772
+ """
773
+ return JointCalibration(
774
+ rising=self.rising,
775
+ falling=self.falling,
776
+ )
777
+
778
+
779
+ class JointDynamics(URDFType):
780
+ """The dynamic properties of the joint.
781
+ Parameters
782
+ ----------
783
+ damping : float
784
+ The damping value of the joint (Ns/m for prismatic joints,
785
+ Nms/rad for revolute).
786
+ friction : float
787
+ The static friction value of the joint (N for prismatic joints,
788
+ Nm for revolute).
789
+ """
790
+
791
+ _ATTRIBS = {
792
+ "damping": (float, False),
793
+ "friction": (float, False),
794
+ }
795
+ _TAG = "dynamics"
796
+
797
+ def __init__(self, damping, friction):
798
+ self.damping = damping
799
+ self.friction = friction
800
+
801
+ def __repr__(self): # pragma nocover
802
+ return "JointDynamics(damping={}, friction={})".format(self.damping, self.friction)
803
+
804
+ @property
805
+ def damping(self): # pragma nocover
806
+ """float : The damping value of the joint."""
807
+ return self._damping
808
+
809
+ @damping.setter
810
+ def damping(self, value):
811
+ if value is not None:
812
+ value = float(value)
813
+ self._damping = value
814
+
815
+ @property
816
+ def friction(self):
817
+ """float : The static friction value of the joint."""
818
+ return self._friction
819
+
820
+ @friction.setter
821
+ def friction(self, value):
822
+ if value is not None:
823
+ value = float(value)
824
+ self._friction = value
825
+
826
+
827
+ class JointLimit(URDFType):
828
+ """The limits of the joint.
829
+ Parameters
830
+ ----------
831
+ effort : float
832
+ The maximum joint effort (N for prismatic joints, Nm for revolute).
833
+ velocity : float
834
+ The maximum joint velocity (m/s for prismatic joints, rad/s for
835
+ revolute).
836
+ lower : float, optional
837
+ The lower joint limit (m for prismatic joints, rad for revolute).
838
+ upper : float, optional
839
+ The upper joint limit (m for prismatic joints, rad for revolute).
840
+ """
841
+
842
+ _ATTRIBS = {
843
+ "effort": (float, True),
844
+ "velocity": (float, True),
845
+ "lower": (float, False),
846
+ "upper": (float, False),
847
+ }
848
+ _TAG = "limit"
849
+
850
+ def __init__(self, effort, velocity, lower=None, upper=None):
851
+ self.effort = effort
852
+ self.velocity = velocity
853
+ self.lower = lower
854
+ self.upper = upper
855
+
856
+ def __repr__(self): # pragma nocover
857
+ return "JointLimit(effort={}, velocity={}, lower={}, upper={})".format(
858
+ self.effort, self.velocity, self.lower, self.upper
859
+ )
860
+
861
+ @property
862
+ def effort(self):
863
+ """float : The maximum joint effort."""
864
+ return self._effort
865
+
866
+ @effort.setter
867
+ def effort(self, value):
868
+ self._effort = float(value)
869
+
870
+ @property
871
+ def velocity(self):
872
+ """float : The maximum joint velocity."""
873
+ return self._velocity
874
+
875
+ @velocity.setter
876
+ def velocity(self, value):
877
+ self._velocity = float(value)
878
+
879
+ @property
880
+ def lower(self):
881
+ """float : The lower joint limit."""
882
+ return self._lower
883
+
884
+ @lower.setter
885
+ def lower(self, value):
886
+ if value is not None:
887
+ value = float(value)
888
+ self._lower = value
889
+
890
+ @property
891
+ def upper(self):
892
+ """float : The upper joint limit."""
893
+ return self._upper
894
+
895
+ @upper.setter
896
+ def upper(self, value):
897
+ if value is not None:
898
+ value = float(value)
899
+ self._upper = value
900
+
901
+
902
+ class JointMimic(URDFType): # pragma nocover
903
+ """A mimicry tag for a joint, which forces its configuration to
904
+ mimic another joint's.
905
+ This joint's configuration value is set equal to
906
+ ``multiplier * other_joint_cfg + offset``.
907
+ Parameters
908
+ ----------
909
+ joint : str
910
+ The name of the joint to mimic.
911
+ multiplier : float
912
+ The joint configuration multiplier. Defaults to 1.0.
913
+ offset : float, optional
914
+ The joint configuration offset. Defaults to 0.0.
915
+ """
916
+
917
+ _ATTRIBS = {
918
+ "joint": (str, True),
919
+ "multiplier": (float, False),
920
+ "offset": (float, False),
921
+ }
922
+ _TAG = "mimic"
923
+
924
+ def __init__(self, joint, multiplier=None, offset=None):
925
+ self.joint = joint
926
+ self.multiplier = multiplier
927
+ self.offset = offset
928
+
929
+ def __repr__(self): # pragma nocover
930
+ return "JointMimic(joint={}, multiplier={}, offset={})".format(
931
+ self.joint, self.multiplier, self.offset
932
+ )
933
+
934
+ @property
935
+ def joint(self):
936
+ """float : The name of the joint to mimic."""
937
+ return self._joint
938
+
939
+ @joint.setter
940
+ def joint(self, value):
941
+ self._joint = str(value)
942
+
943
+ @property
944
+ def multiplier(self):
945
+ """float : The multiplier for the joint configuration."""
946
+ return self._multiplier
947
+
948
+ @multiplier.setter
949
+ def multiplier(self, value):
950
+ if value is not None:
951
+ value = float(value)
952
+ else:
953
+ value = 1.0
954
+ self._multiplier = value
955
+
956
+ @property
957
+ def offset(self):
958
+ """float : The offset for the joint configuration"""
959
+ return self._offset
960
+
961
+ @offset.setter
962
+ def offset(self, value):
963
+ if value is not None:
964
+ value = float(value)
965
+ else:
966
+ value = 0.0
967
+ self._offset = value
968
+
969
+
970
+ class SafetyController(URDFType): # pragma nocover
971
+ """A controller for joint movement safety.
972
+ Parameters
973
+ ----------
974
+ k_velocity : float
975
+ An attribute specifying the relation between the effort and velocity
976
+ limits.
977
+ k_position : float, optional
978
+ An attribute specifying the relation between the position and velocity
979
+ limits. Defaults to 0.0.
980
+ soft_lower_limit : float, optional
981
+ The lower joint boundary where the safety controller kicks in.
982
+ Defaults to 0.0.
983
+ soft_upper_limit : float, optional
984
+ The upper joint boundary where the safety controller kicks in.
985
+ Defaults to 0.0.
986
+ """
987
+
988
+ _ATTRIBS = {
989
+ "k_velocity": (float, True),
990
+ "k_position": (float, False),
991
+ "soft_lower_limit": (float, False),
992
+ "soft_upper_limit": (float, False),
993
+ }
994
+ _TAG = "safety_controller"
995
+
996
+ def __init__(
997
+ self, k_velocity, k_position=None, soft_lower_limit=None, soft_upper_limit=None
998
+ ):
999
+ self.k_velocity = k_velocity
1000
+ self.k_position = k_position
1001
+ self.soft_lower_limit = soft_lower_limit
1002
+ self.soft_upper_limit = soft_upper_limit
1003
+
1004
+ def __repr__(self): # pragma nocover
1005
+ return "SafetyController(k_velocity={}, k_position={}, soft_lower_limit={}, soft_upper_limit={})".format(
1006
+ self.k_velocity, self.k_position, self.soft_lower_limit, self.soft_upper_limit
1007
+ )
1008
+
1009
+ @property
1010
+ def soft_lower_limit(self):
1011
+ """float : The soft lower limit where the safety controller kicks in."""
1012
+ return self._soft_lower_limit
1013
+
1014
+ @soft_lower_limit.setter
1015
+ def soft_lower_limit(self, value):
1016
+ if value is not None:
1017
+ value = float(value)
1018
+ else:
1019
+ value = 0.0
1020
+ self._soft_lower_limit = value
1021
+
1022
+ @property
1023
+ def soft_upper_limit(self):
1024
+ """float : The soft upper limit where the safety controller kicks in."""
1025
+ return self._soft_upper_limit
1026
+
1027
+ @soft_upper_limit.setter
1028
+ def soft_upper_limit(self, value):
1029
+ if value is not None:
1030
+ value = float(value)
1031
+ else:
1032
+ value = 0.0
1033
+ self._soft_upper_limit = value
1034
+
1035
+ @property
1036
+ def k_position(self):
1037
+ """float : A relation between the position and velocity limits."""
1038
+ return self._k_position
1039
+
1040
+ @k_position.setter
1041
+ def k_position(self, value):
1042
+ if value is not None:
1043
+ value = float(value)
1044
+ else:
1045
+ value = 0.0
1046
+ self._k_position = value
1047
+
1048
+ @property
1049
+ def k_velocity(self):
1050
+ """float : A relation between the effort and velocity limits."""
1051
+ return self._k_velocity
1052
+
1053
+ @k_velocity.setter
1054
+ def k_velocity(self, value):
1055
+ self._k_velocity = float(value)
1056
+
1057
+
1058
+ ###############################################################################
1059
+ # Transmission types
1060
+ ###############################################################################
1061
+
1062
+
1063
+ class Actuator(URDFType):
1064
+ """An actuator.
1065
+ Parameters
1066
+ ----------
1067
+ name : str
1068
+ The name of this actuator.
1069
+ mechanicalReduction : str, optional
1070
+ A specifier for the mechanical reduction at the joint/actuator
1071
+ transmission.
1072
+ hardwareInterfaces : list of str, optional
1073
+ The supported hardware interfaces to the actuator.
1074
+ """
1075
+
1076
+ _ATTRIBS = {
1077
+ "name": (str, True),
1078
+ }
1079
+ _TAG = "actuator"
1080
+
1081
+ def __init__(self, name, mechanicalReduction=None, hardwareInterfaces=None):
1082
+ self.name = name
1083
+ self.mechanicalReduction = mechanicalReduction
1084
+ self.hardwareInterfaces = hardwareInterfaces
1085
+
1086
+
1087
+ def __repr__(self): # pragma nocover
1088
+ return "Actuator(name={}, mechanicalReduction={}, hardwareInterfaces={})".format(
1089
+ self.name, self.mechanicalReduction, self.hardwareInterfaces
1090
+ )
1091
+
1092
+ @property
1093
+ def name(self): # pragma nocover
1094
+ """str : The name of this actuator."""
1095
+ return self._name
1096
+
1097
+ @name.setter
1098
+ def name(self, value):
1099
+ self._name = str(value)
1100
+
1101
+ @property
1102
+ def mechanicalReduction(self): # pragma nocover
1103
+ """str : A specifier for the type of mechanical reduction."""
1104
+ return self._mechanicalReduction
1105
+
1106
+ @mechanicalReduction.setter
1107
+ def mechanicalReduction(self, value):
1108
+ if value is not None:
1109
+ value = str(value)
1110
+ self._mechanicalReduction = value
1111
+
1112
+ @property
1113
+ def hardwareInterfaces(self): # pragma nocover
1114
+ """list of str : The supported hardware interfaces."""
1115
+ return self._hardwareInterfaces
1116
+
1117
+ @hardwareInterfaces.setter
1118
+ def hardwareInterfaces(self, value): # pragma nocover
1119
+ if value is None:
1120
+ value = []
1121
+ else:
1122
+ value = list(value)
1123
+ for i, v in enumerate(value):
1124
+ value[i] = str(v)
1125
+ self._hardwareInterfaces = value
1126
+
1127
+ @classmethod
1128
+ def _from_xml(cls, node, path): # pragma nocover
1129
+ kwargs = cls._parse(node, path)
1130
+ mr = node.find("mechanicalReduction")
1131
+ if mr is not None:
1132
+ mr = float(mr.text)
1133
+ kwargs["mechanicalReduction"] = mr
1134
+ hi = node.findall("hardwareInterface")
1135
+ if len(hi) > 0:
1136
+ hi = [h.text for h in hi]
1137
+ kwargs["hardwareInterfaces"] = hi
1138
+ return Actuator(**kwargs)
1139
+
1140
+
1141
+ class TransmissionJoint(URDFType):
1142
+ """A transmission joint specification.
1143
+ Parameters
1144
+ ----------
1145
+ name : str
1146
+ The name of this actuator.
1147
+ hardwareInterfaces : list of str, optional
1148
+ The supported hardware interfaces to the actuator.
1149
+ """
1150
+
1151
+ _ATTRIBS = {
1152
+ "name": (str, True),
1153
+ }
1154
+ _TAG = "joint"
1155
+
1156
+ def __init__(self, name, hardwareInterfaces):
1157
+ self.name = name
1158
+ self.hardwareInterfaces = hardwareInterfaces
1159
+
1160
+ def __repr__(self): # pragma nocover
1161
+ return "TransmissionJoint(name={}, hardwareInterfaces={})".format(
1162
+ self.name, self.hardwareInterfaces
1163
+ )
1164
+
1165
+ @property
1166
+ def name(self): # pragma nocover
1167
+ """str : The name of this transmission joint."""
1168
+ return self._name
1169
+
1170
+ @name.setter
1171
+ def name(self, value):
1172
+ self._name = str(value)
1173
+
1174
+ @property
1175
+ def hardwareInterfaces(self): # pragma nocover
1176
+ """list of str : The supported hardware interfaces."""
1177
+ return self._hardwareInterfaces
1178
+
1179
+ @hardwareInterfaces.setter
1180
+ def hardwareInterfaces(self, value): # pragma nocover
1181
+ if value is None:
1182
+ value = []
1183
+ else:
1184
+ value = list(value)
1185
+ for i, v in enumerate(value):
1186
+ value[i] = str(v)
1187
+ self._hardwareInterfaces = value
1188
+
1189
+ @classmethod
1190
+ def _from_xml(cls, node, path):
1191
+ kwargs = cls._parse(node, path)
1192
+ hi = node.findall("hardwareInterface")
1193
+ if len(hi) > 0:
1194
+ hi = [h.text for h in hi]
1195
+ kwargs["hardwareInterfaces"] = hi
1196
+ return TransmissionJoint(**kwargs)
1197
+
1198
+
1199
+ ###############################################################################
1200
+ # Top-level types
1201
+ ###############################################################################
1202
+
1203
+
1204
+ class Transmission(URDFType):
1205
+ """An element that describes the relationship between an actuator and a
1206
+ joint.
1207
+ Parameters
1208
+ ----------
1209
+ name : str
1210
+ The name of this transmission.
1211
+ trans_type : str
1212
+ The type of this transmission.
1213
+ joints : list of :class:`.TransmissionJoint`
1214
+ The joints connected to this transmission.
1215
+ actuators : list of :class:`.Actuator`
1216
+ The actuators connected to this transmission.
1217
+ """
1218
+
1219
+ _ATTRIBS = {
1220
+ "name": (str, True),
1221
+ }
1222
+ _ELEMENTS = {
1223
+ "joints": (TransmissionJoint, False, True),
1224
+ "actuators": (Actuator, False, True),
1225
+ }
1226
+ _TAG = "transmission"
1227
+
1228
+ def __init__(self, name, trans_type, joints=None, actuators=None):
1229
+ self.name = name
1230
+ self.trans_type = trans_type
1231
+ self.joints = joints
1232
+ self.actuators = actuators
1233
+
1234
+ def __repr__(self): # pragma nocover
1235
+ return "Transmission(name={}, trans_type={}, joints={}, actuators={})".format(
1236
+ self.name, self.trans_type, self.joints, self.actuators
1237
+ )
1238
+
1239
+ @property
1240
+ def name(self):
1241
+ """str : The name of this transmission."""
1242
+ return self._name
1243
+
1244
+ @name.setter
1245
+ def name(self, value):
1246
+ self._name = str(value)
1247
+
1248
+ @property
1249
+ def trans_type(self): # pragma nocover
1250
+ """str : The type of this transmission."""
1251
+ return self._trans_type
1252
+
1253
+ @trans_type.setter
1254
+ def trans_type(self, value):
1255
+ self._trans_type = str(value)
1256
+
1257
+ @property
1258
+ def joints(self): # pragma nocover
1259
+ """:class:`.TransmissionJoint` : The joints the transmission is
1260
+ connected to.
1261
+ """
1262
+ return self._joints
1263
+
1264
+ @joints.setter
1265
+ def joints(self, value): # pragma nocover
1266
+ if value is None:
1267
+ value = []
1268
+ else:
1269
+ value = list(value)
1270
+ for v in value:
1271
+ if not isinstance(v, TransmissionJoint):
1272
+ raise TypeError("Joints expects a list of TransmissionJoint")
1273
+ self._joints = value
1274
+
1275
+ @property
1276
+ def actuators(self): # pragma nocover
1277
+ """:class:`.Actuator` : The actuators the transmission is connected to."""
1278
+ return self._actuators
1279
+
1280
+ @actuators.setter
1281
+ def actuators(self, value): # pragma nocover
1282
+ if value is None:
1283
+ value = []
1284
+ else:
1285
+ value = list(value)
1286
+ for v in value:
1287
+ if not isinstance(v, Actuator):
1288
+ raise TypeError("Actuators expects a list of Actuator")
1289
+ self._actuators = value
1290
+
1291
+ @classmethod
1292
+ def _from_xml(cls, node, path):
1293
+ kwargs = cls._parse(node, path)
1294
+ if node.find("type") is not None:
1295
+ kwargs["trans_type"] = node.find("type").text
1296
+ else:
1297
+ kwargs["trans_type"] = " " # pragma nocover
1298
+
1299
+ return Transmission(**kwargs)
1300
+
1301
+
1302
+ class Joint(URDFType):
1303
+ """A connection between two links.
1304
+ There are several types of joints, including:
1305
+ - ``fixed`` - a joint that cannot move.
1306
+ - ``prismatic`` - a joint that slides along the joint axis.
1307
+ - ``revolute`` - a hinge joint that rotates about the axis with a limited
1308
+ range of motion.
1309
+ - ``continuous`` - a hinge joint that rotates about the axis with an
1310
+ unlimited range of motion.
1311
+ - ``planar`` - a joint that moves in the plane orthogonal to the axis.
1312
+ - ``floating`` - a joint that can move in 6DoF.
1313
+ Parameters
1314
+ ----------
1315
+ name : str
1316
+ The name of this joint.
1317
+ parent : str
1318
+ The name of the parent link of this joint.
1319
+ child : str
1320
+ The name of the child link of this joint.
1321
+ joint_type : str
1322
+ The type of the joint. Must be one of :obj:`.Joint.TYPES`.
1323
+ axis : (3,) float, optional
1324
+ The axis of the joint specified in joint frame. Defaults to
1325
+ ``[1,0,0]``.
1326
+ origin : (4,4) float, optional
1327
+ The pose of the child link with respect to the parent link's frame.
1328
+ The joint frame is defined to be coincident with the child link's
1329
+ frame, so this is also the pose of the joint frame with respect to
1330
+ the parent link's frame.
1331
+ limit : :class:`.JointLimit`, optional
1332
+ Limit for the joint. Only required for revolute and prismatic
1333
+ joints.
1334
+ dynamics : :class:`.JointDynamics`, optional
1335
+ Dynamics for the joint.
1336
+ safety_controller : :class`.SafetyController`, optional
1337
+ The safety controller for this joint.
1338
+ calibration : :class:`.JointCalibration`, optional
1339
+ Calibration information for the joint.
1340
+ mimic : :class:`JointMimic`, optional
1341
+ Joint mimicry information.
1342
+ """
1343
+
1344
+ TYPES = ["fixed", "prismatic", "revolute", "continuous", "floating", "planar"]
1345
+ _ATTRIBS = {
1346
+ "name": (str, True),
1347
+ }
1348
+ _ELEMENTS = {
1349
+ "dynamics": (JointDynamics, False, False),
1350
+ "limit": (JointLimit, False, False),
1351
+ "mimic": (JointMimic, False, False),
1352
+ "safety_controller": (SafetyController, False, False),
1353
+ "calibration": (JointCalibration, False, False),
1354
+ }
1355
+ _TAG = "joint"
1356
+
1357
+ def __init__(
1358
+ self,
1359
+ name,
1360
+ joint_type,
1361
+ parent,
1362
+ child,
1363
+ axis=None,
1364
+ origin=None,
1365
+ limit=None,
1366
+ dynamics=None,
1367
+ safety_controller=None,
1368
+ calibration=None,
1369
+ mimic=None,
1370
+ rpy=None,
1371
+ ):
1372
+ self.name = name
1373
+ self.parent = parent
1374
+ self.child = child
1375
+ self.joint_type = joint_type
1376
+ self.axis = axis
1377
+ self.origin = origin
1378
+ self.rpy = rpy
1379
+ self.limit = limit
1380
+ self.dynamics = dynamics
1381
+ self.safety_controller = safety_controller
1382
+ self.calibration = calibration
1383
+ self.mimic = mimic
1384
+
1385
+ def __repr__(self):
1386
+ return "Joint(name={}, joint_type={}, parent={}, child={})".format(
1387
+ self.name, self.joint_type, self.parent, self.child
1388
+ )
1389
+
1390
+ @property
1391
+ def name(self):
1392
+ """str : Name for this joint."""
1393
+ return self._name
1394
+
1395
+ @name.setter
1396
+ def name(self, value):
1397
+ self._name = str(value)
1398
+
1399
+ @property
1400
+ def joint_type(self):
1401
+ """str : The type of this joint."""
1402
+ return self._joint_type
1403
+
1404
+ @joint_type.setter
1405
+ def joint_type(self, value):
1406
+ value = str(value)
1407
+ if value not in Joint.TYPES: # pragma nocover
1408
+ raise ValueError("Unsupported joint type {}".format(value))
1409
+ self._joint_type = value
1410
+
1411
+ @property
1412
+ def parent(self):
1413
+ """str : The name of the parent link."""
1414
+ return self._parent
1415
+
1416
+ @parent.setter
1417
+ def parent(self, value):
1418
+ self._parent = str(value)
1419
+
1420
+ @property
1421
+ def child(self):
1422
+ """str : The name of the child link."""
1423
+ return self._child
1424
+
1425
+ @child.setter
1426
+ def child(self, value):
1427
+ self._child = str(value)
1428
+
1429
+ @property
1430
+ def axis(self):
1431
+ """(3,) float : The joint axis in the joint frame."""
1432
+ return self._axis
1433
+
1434
+ @axis.setter
1435
+ def axis(self, value):
1436
+ if value is None:
1437
+ value = np.array([1.0, 0.0, 0.0], dtype=np.float64)
1438
+ else:
1439
+ value = np.asanyarray(value, dtype=np.float64)
1440
+ if value.shape != (3,): # pragma nocover
1441
+ raise ValueError("Invalid shape for axis, should be (3,)")
1442
+ norm = np.linalg.norm(value)
1443
+
1444
+ if norm != 0:
1445
+ value = value / norm
1446
+ self._axis = value
1447
+
1448
+ @property
1449
+ def origin(self):
1450
+ """(4,4) float : The pose of child and joint frames relative to the
1451
+ parent link's frame.
1452
+ """
1453
+ return self._origin
1454
+
1455
+ @origin.setter
1456
+ def origin(self, value):
1457
+ self._origin = configure_origin(value)
1458
+
1459
+ @property
1460
+ def rpy(self):
1461
+ return self._rpy
1462
+
1463
+ @rpy.setter
1464
+ def rpy(self, value):
1465
+ self._rpy = value
1466
+
1467
+ @property
1468
+ def limit(self):
1469
+ """:class:`.JointLimit` : The limits for this joint."""
1470
+ return self._limit
1471
+
1472
+ @limit.setter
1473
+ def limit(self, value):
1474
+ if value is None:
1475
+ if self.joint_type in ["prismatic", "revolute"]: # pragma nocover
1476
+ raise ValueError(
1477
+ "Require joint limit for prismatic and revolute joints"
1478
+ )
1479
+ elif not isinstance(value, JointLimit): # pragma nocover
1480
+ raise TypeError("Expected JointLimit type")
1481
+ self._limit = value
1482
+
1483
+ @property
1484
+ def dynamics(self):
1485
+ """:class:`.JointDynamics` : The dynamics for this joint."""
1486
+ return self._dynamics
1487
+
1488
+ @dynamics.setter
1489
+ def dynamics(self, value):
1490
+ if value is not None:
1491
+ if not isinstance(value, JointDynamics): # pragma nocover
1492
+ raise TypeError("Expected JointDynamics type")
1493
+ self._dynamics = value
1494
+
1495
+ @property
1496
+ def safety_controller(self): # pragma nocover
1497
+ """:class:`.SafetyController` : The safety controller for this joint."""
1498
+ return self._safety_controller
1499
+
1500
+ @safety_controller.setter
1501
+ def safety_controller(self, value):
1502
+ if value is not None:
1503
+ if not isinstance(value, SafetyController): # pragma nocover
1504
+ raise TypeError("Expected SafetyController type")
1505
+ self._safety_controller = value
1506
+
1507
+ @property
1508
+ def calibration(self): # pragma nocover
1509
+ """:class:`.JointCalibration` : The calibration for this joint."""
1510
+ return self._calibration
1511
+
1512
+ @calibration.setter
1513
+ def calibration(self, value):
1514
+ if value is not None:
1515
+ if not isinstance(value, JointCalibration): # pragma nocover
1516
+ raise TypeError("Expected JointCalibration type")
1517
+ self._calibration = value
1518
+
1519
+ @property
1520
+ def mimic(self): # pragma nocover
1521
+ """:class:`.JointMimic` : The mimic for this joint."""
1522
+ return self._mimic
1523
+
1524
+ @mimic.setter
1525
+ def mimic(self, value):
1526
+ if value is not None:
1527
+ if not isinstance(value, JointMimic): # pragma nocover
1528
+ raise TypeError("Expected JointMimic type")
1529
+ self._mimic = value
1530
+
1531
+ def is_valid(self, cfg): # pragma nocover
1532
+ """Check if the provided configuration value is valid for this joint.
1533
+ Parameters
1534
+ ----------
1535
+ cfg : float, (2,) float, (6,) float, or (4,4) float
1536
+ The configuration of the joint.
1537
+ Returns
1538
+ -------
1539
+ is_valid : bool
1540
+ True if the configuration is valid, and False otherwise.
1541
+ """
1542
+ if self.joint_type not in ["fixed", "revolute"]:
1543
+ return True
1544
+ if self.joint_limit is None:
1545
+ return True
1546
+ cfg = float(cfg)
1547
+ lower = -np.infty
1548
+ upper = np.infty
1549
+ if self.limit.lower is not None:
1550
+ lower = self.limit.lower
1551
+ if self.limit.upper is not None:
1552
+ upper = self.limit.upper
1553
+ return cfg >= lower and cfg <= upper
1554
+
1555
+ @classmethod
1556
+ def _from_xml(cls, node, path):
1557
+ kwargs = cls._parse(node, path)
1558
+ kwargs["joint_type"] = str(node.attrib["type"])
1559
+ kwargs["parent"] = node.find("parent").attrib["link"]
1560
+ kwargs["child"] = node.find("child").attrib["link"]
1561
+ axis = node.find("axis")
1562
+ if axis is not None:
1563
+ axis = np.fromstring(axis.attrib["xyz"], sep=" ")
1564
+ kwargs["axis"] = axis
1565
+ kwargs["origin"], kwargs["rpy"] = parse_origin(node)
1566
+ return Joint(**kwargs)
1567
+
1568
+
1569
+ class Link(URDFType):
1570
+ """A link of a rigid object.
1571
+ Parameters
1572
+ ----------
1573
+ name : str
1574
+ The name of the link.
1575
+ inertial : :class:`.Inertial`, optional
1576
+ The inertial properties of the link.
1577
+ visuals : list of :class:`.Visual`, optional
1578
+ The visual properties of the link.
1579
+ collsions : list of :class:`.Collision`, optional
1580
+ The collision properties of the link.
1581
+ """
1582
+
1583
+ _ATTRIBS = {
1584
+ "name": (str, True),
1585
+ }
1586
+ _ELEMENTS = {
1587
+ "inertial": (Inertial, False, False),
1588
+ "visuals": (Visual, False, True),
1589
+ "collisions": (Collision, False, True),
1590
+ }
1591
+ _TAG = "link"
1592
+
1593
+ def __init__(self, name, inertial, visuals, collisions):
1594
+ self.name = name
1595
+ self.inertial = inertial
1596
+ self.visuals = visuals
1597
+ self.collisions = collisions
1598
+
1599
+ def __repr__(self): # pragma nocover
1600
+ return "Link(name={}, inertial={}, visuals={}, collisions={})".format(
1601
+ self.name, self.inertial, self.visuals, self.collisions
1602
+ )
1603
+
1604
+ @property
1605
+ def name(self):
1606
+ """str : The name of this link."""
1607
+ return self._name
1608
+
1609
+ @name.setter
1610
+ def name(self, value):
1611
+ self._name = str(value)
1612
+
1613
+ @property
1614
+ def inertial(self):
1615
+ """:class:`.Inertial` : Inertial properties of the link."""
1616
+ return self._inertial
1617
+
1618
+ @inertial.setter
1619
+ def inertial(self, value):
1620
+ if value is not None and not isinstance(value, Inertial):
1621
+ raise TypeError("Expected Inertial object") # pragma nocover
1622
+ # Set default inertial
1623
+ if value is None:
1624
+ value = Inertial()
1625
+ self._inertial = value
1626
+
1627
+ @property
1628
+ def visuals(self):
1629
+ """list of :class:`.Visual` : The visual properties of this link."""
1630
+ return self._visuals
1631
+
1632
+ @visuals.setter
1633
+ def visuals(self, value):
1634
+ if value is None: # pragma nocover
1635
+ value = []
1636
+ else:
1637
+ value = list(value)
1638
+ for v in value:
1639
+ if not isinstance(v, Visual): # pragma nocover
1640
+ raise ValueError("Expected list of Visual objects")
1641
+ self._visuals = value
1642
+
1643
+ @property
1644
+ def collisions(self):
1645
+ """list of :class:`.Collision` : The collision properties of this link."""
1646
+ return self._collisions
1647
+
1648
+ @collisions.setter
1649
+ def collisions(self, value):
1650
+ if value is None: # pragma nocover
1651
+ value = []
1652
+ else:
1653
+ value = list(value)
1654
+ for v in value:
1655
+ if not isinstance(v, Collision): # pragma nocover
1656
+ raise ValueError("Expected list of Collision objects")
1657
+ self._collisions = value
1658
+
1659
+
1660
+ class URDF(URDFType):
1661
+ """The top-level URDF specification.
1662
+ The URDF encapsulates an articulated object, such as a robot or a gripper.
1663
+ It is made of links and joints that tie them together and define their
1664
+ relative motions.
1665
+ Parameters
1666
+ ----------
1667
+ name : str
1668
+ The name of the URDF.
1669
+ links : list of :class:`.Link`
1670
+ The links of the URDF.
1671
+ joints : list of :class:`.Joint`, optional
1672
+ The joints of the URDF.
1673
+ transmissions : list of :class:`.Transmission`, optional
1674
+ The transmissions of the URDF.
1675
+ materials : list of :class:`.Material`, optional
1676
+ The materials for the URDF.
1677
+ other_xml : str, optional
1678
+ A string containing any extra XML for extensions.
1679
+ """
1680
+
1681
+ _ATTRIBS = {
1682
+ "name": (str, True),
1683
+ }
1684
+ _ELEMENTS = {
1685
+ "links": (Link, True, True),
1686
+ "joints": (Joint, False, True),
1687
+ "transmissions": (Transmission, False, True),
1688
+ "materials": (Material, False, True),
1689
+ }
1690
+ _TAG = "robot"
1691
+
1692
+ def __init__(
1693
+ self,
1694
+ name,
1695
+ links,
1696
+ joints=None,
1697
+ transmissions=None,
1698
+ materials=None,
1699
+ other_xml=None,
1700
+ ):
1701
+ if joints is None: # pragma nocover
1702
+ joints = []
1703
+ if transmissions is None: # pragma nocover
1704
+ transmissions = []
1705
+ if materials is None:
1706
+ materials = []
1707
+
1708
+ # TODO, what does this next line do?
1709
+ # why arent the other things validated
1710
+ try:
1711
+ self._validate_transmissions()
1712
+ except Exception:
1713
+ pass
1714
+
1715
+ self.name = name
1716
+ self.other_xml = other_xml
1717
+
1718
+ # No setters for these
1719
+ self._links = list(links)
1720
+ self._joints = list(joints)
1721
+ self._transmissions = list(transmissions)
1722
+ self._materials = list(materials)
1723
+ self._material_map = {}
1724
+
1725
+ for x in self._materials:
1726
+ if x.name in self._material_map:
1727
+ raise ValueError("Two materials with name {} found".format(x.name))
1728
+ self._material_map[x.name] = x
1729
+
1730
+ # check for duplicate names
1731
+ if len(self._links) > len(
1732
+ set([x.name for x in self._links])
1733
+ ): # pragma nocover # noqa
1734
+ raise ValueError("Duplicate link names")
1735
+ if len(self._joints) > len(
1736
+ set([x.name for x in self._joints])
1737
+ ): # pragma nocover # noqa
1738
+ raise ValueError("Duplicate joint names")
1739
+ if len(self._transmissions) > len(
1740
+ set([x.name for x in self._transmissions])
1741
+ ): # pragma nocover # noqa
1742
+ raise ValueError("Duplicate transmission names")
1743
+
1744
+ @property
1745
+ def name(self):
1746
+ """str : The name of the URDF."""
1747
+ return self._name
1748
+
1749
+ @name.setter
1750
+ def name(self, value):
1751
+ self._name = str(value)
1752
+
1753
+ @property
1754
+ def links(self):
1755
+ """list of :class:`.Link` : The links of the URDF.
1756
+ This returns a copy of the links array which cannot be edited
1757
+ directly. If you want to add or remove links, use
1758
+ the appropriate functions.
1759
+ """
1760
+ return copy.copy(self._links)
1761
+
1762
+ @property
1763
+ def link_map(self): # pragma nocover
1764
+ """dict : Map from link names to the links themselves.
1765
+ This returns a copy of the link map which cannot be edited
1766
+ directly. If you want to add or remove links, use
1767
+ the appropriate functions.
1768
+ """
1769
+ return copy.copy(self._link_map)
1770
+
1771
+ @property
1772
+ def joints(self):
1773
+ """list of :class:`.Joint` : The links of the URDF.
1774
+ This returns a copy of the joints array which cannot be edited
1775
+ directly. If you want to add or remove joints, use
1776
+ the appropriate functions.
1777
+ """
1778
+ return copy.copy(self._joints)
1779
+
1780
+ @property
1781
+ def joint_map(self): # pragma nocover
1782
+ """dict : Map from joint names to the joints themselves.
1783
+ This returns a copy of the joint map which cannot be edited
1784
+ directly. If you want to add or remove joints, use
1785
+ the appropriate functions.
1786
+ """
1787
+ return copy.copy(self._joint_map)
1788
+
1789
+ @property
1790
+ def transmissions(self):
1791
+ """list of :class:`.Transmission` : The transmissions of the URDF.
1792
+ This returns a copy of the transmissions array which cannot be edited
1793
+ directly. If you want to add or remove transmissions, use
1794
+ the appropriate functions.
1795
+ """
1796
+ return copy.copy(self._transmissions)
1797
+
1798
+ @property
1799
+ def transmission_map(self): # pragma nocover
1800
+ """dict : Map from transmission names to the transmissions themselves.
1801
+ This returns a copy of the transmission map which cannot be edited
1802
+ directly. If you want to add or remove transmissions, use
1803
+ the appropriate functions.
1804
+ """
1805
+ return copy.copy(self._transmission_map)
1806
+
1807
+ @property
1808
+ def other_xml(self): # pragma nocover
1809
+ """str : Any extra XML that belongs with the URDF."""
1810
+ return self._other_xml
1811
+
1812
+ @other_xml.setter
1813
+ def other_xml(self, value):
1814
+ self._other_xml = value
1815
+
1816
+ @property
1817
+ def actuated_joints(self): # pragma nocover
1818
+ """list of :class:`.Joint` : The joints that are independently
1819
+ actuated.
1820
+ This excludes mimic joints and fixed joints. The joints are listed
1821
+ in topological order, starting from the base-most joint.
1822
+ """
1823
+ return self._actuated_joints
1824
+
1825
+ def _merge_materials(self):
1826
+ """Merge the top-level material set with the link materials."""
1827
+ for link in self.links:
1828
+ for v in link.visuals:
1829
+ if v.material is None:
1830
+ continue
1831
+ if v.material.name in self.material_map:
1832
+ v.material = self._material_map[v.material.name]
1833
+ v.geometry.ob.color = v.material.color
1834
+ else:
1835
+ self._materials.append(v.material)
1836
+ self._material_map[v.material.name] = v.material
1837
+
1838
+ @staticmethod
1839
+ def load(file_obj): # pragma nocover
1840
+ """Load a URDF from a file.
1841
+ Parameters
1842
+ ----------
1843
+ file_obj : str or file-like object
1844
+ The file to load the URDF from. Should be the path to the
1845
+ ``.urdf`` XML file. Any paths in the URDF should be specified
1846
+ as relative paths to the ``.urdf`` file instead of as ROS
1847
+ resources.
1848
+ Returns
1849
+ -------
1850
+ urdf : :class:`.URDF`
1851
+ The parsed URDF.
1852
+ """
1853
+ if isinstance(file_obj, str):
1854
+ if os.path.isfile(file_obj):
1855
+ parser = ETT.XMLParser()
1856
+ tree = ETT.parse(file_obj, parser=parser)
1857
+ path, _ = os.path.split(file_obj)
1858
+ else:
1859
+ raise ValueError("{} is not a file".format(file_obj))
1860
+ else:
1861
+ parser = ETT.XMLParser()
1862
+ tree = ETT.parse(file_obj, parser=parser)
1863
+ path, _ = os.path.split(file_obj.name)
1864
+
1865
+ node = tree.getroot()
1866
+ return URDF._from_xml(node, path)
1867
+
1868
+ @staticmethod
1869
+ def loadstr(str_obj, file_obj, base_path=None):
1870
+ """Load a URDF from a file.
1871
+ Parameters
1872
+ ----------
1873
+ file_obj : str or file-like object
1874
+ The file to load the URDF from. Should be the path to the
1875
+ ``.urdf`` XML file. Any paths in the URDF should be specified
1876
+ as relative paths to the ``.urdf`` file instead of as ROS
1877
+ resources.
1878
+ Returns
1879
+ -------
1880
+ urdf : :class:`.URDF`
1881
+ The parsed URDF.
1882
+ """
1883
+ global _base_path
1884
+
1885
+ if base_path is not None:
1886
+ _base_path = base_path
1887
+
1888
+ if isinstance(str_obj, str):
1889
+ # if os.path.isfile(file_obj):
1890
+ parser = ETT.XMLParser()
1891
+ bytes_obj = BytesIO(bytes(str_obj, "utf-8"))
1892
+ tree = ETT.parse(bytes_obj, parser=parser)
1893
+ # path, _ = os.path.split(file_obj)
1894
+
1895
+ else: # pragma nocover
1896
+ parser = ETT.XMLParser()
1897
+ tree = ETT.parse(file_obj, parser=parser)
1898
+ path, _ = os.path.split(file_obj.name)
1899
+
1900
+ node = tree.getroot()
1901
+ path = None
1902
+ return URDF._from_xml(node, path)
1903
+
1904
+ def _validate_transmissions(self):
1905
+ """Raise an exception if any transmissions are invalidly specified.
1906
+ Checks for the following:
1907
+ - Transmission joints have valid joint names.
1908
+ """
1909
+ for t in self.transmissions: # pragma nocover
1910
+ for joint in t.joints:
1911
+ if joint.name not in self._joint_map:
1912
+ raise ValueError(
1913
+ "Transmission {} has invalid joint name {}".format(
1914
+ t.name, joint.name
1915
+ )
1916
+ )
1917
+
1918
+ @classmethod
1919
+ def _from_xml(cls, node, path):
1920
+ valid_tags = set(["joint", "link", "transmission", "material"])
1921
+ kwargs = cls._parse(node, path)
1922
+
1923
+ extra_xml_node = ETT.Element("extra")
1924
+ for child in node:
1925
+ if child.tag not in valid_tags:
1926
+ extra_xml_node.append(child)
1927
+
1928
+ # data = ETT.ostring(extra_xml_node)
1929
+ # kwargs['other_xml'] = data
1930
+ return URDF(**kwargs)