Load Mars 2020 rover model from a URDF file#
Requirements:
Acknowledgements
The rover model is sourced from the Jet Propulsion Laboratory, California Institute of Technology, from their public repository nasa-jpl/m2020-urdf-models.
import atexit
from pathlib import Path
import atexit
import Karana.Core as kc
import Karana.Frame as kf
import Karana.Dynamics.SOADyn_types as kdt
import Karana.KUtils.BasicPrefab as kub
resources = Path().absolute().parent / "resources"
urdf_file = resources / "m2020" / "m2020.urdf"
basic_prefab_ds = kub.BasicPrefabDS.fromFile(urdf_file)
frame_container = kf.FrameContainer("root")
prefab, prop = kub.BasicPrefab.createStandalone(basic_prefab_ds, frame_container)
multibody = prop.getSubTree().multibody()
multibody.ensureHealthy()
multibody.resetData()
cleanup_viz, graphics = multibody.setupGraphics(port=0)
graphics.defaultCamera().pointCameraAt(offset=[3, 3, -2], target=[1, 0, -1], up=[0, 0, -1])
Display the contents of the multibody system
multibody.displayModel()
[WebUI] Web server is running on port 32773
You may be able to connect in your browser at:
http://newton:32773
LEGEND: <body number> <body name> <parent body> <hinge type> [prescribed subhinges] <U dofs/offset> [flex dofs/offset]
Body Parent Hinge Dofs
____ ______ _____ ____
1. Body_Chassis Perseverance_MBVROOT_ FULL6DOF 6/0
2. Body_MHS_DebrisShield Body_Chassis FULL6DOF 6/6
3. Body_Differential Body_Chassis REVOLUTE 1/12
4. Frame_DIFF Body_Differential LOCKED 0/13
5. Body_RockerLeft Body_Chassis REVOLUTE 1/13
6. Body_BogieLeft Body_RockerLeft REVOLUTE 1/14
7. Body_SteerLeftRear Body_BogieLeft REVOLUTE 1/15
8. Body_WheelLeftRear Body_SteerLeftRear REVOLUTE 1/16
9. Frame_WHEEL_LR Body_WheelLeftRear LOCKED 0/17
10. Frame_STEER_LR Body_SteerLeftRear LOCKED 0/17
11. Body_WheelLeftMiddle Body_BogieLeft REVOLUTE 1/17
12. Frame_WHEEL_LM Body_WheelLeftMiddle LOCKED 0/18
13. Frame_BOGIE_L Body_BogieLeft LOCKED 0/18
14. Body_SteerLeftFront Body_RockerLeft REVOLUTE 1/18
15. Body_WheelLeftFront Body_SteerLeftFront REVOLUTE 1/19
16. Frame_WHEEL_LF Body_WheelLeftFront LOCKED 0/20
17. Frame_STEER_LF Body_SteerLeftFront LOCKED 0/20
18. Frame_ROCKER_L Body_RockerLeft LOCKED 0/20
19. Body_RockerRight Body_Chassis REVOLUTE 1/20
20. Body_BogieRight Body_RockerRight REVOLUTE 1/21
21. Body_SteerRightRear Body_BogieRight REVOLUTE 1/22
22. Body_WheelRightRear Body_SteerRightRear REVOLUTE 1/23
23. Frame_WHEEL_RR Body_WheelRightRear LOCKED 0/24
24. Frame_STEER_RR Body_SteerRightRear LOCKED 0/24
25. Body_WheelRightMiddle Body_BogieRight REVOLUTE 1/24
26. Frame_WHEEL_RM Body_WheelRightMiddle LOCKED 0/25
27. Frame_BOGIE_R Body_BogieRight LOCKED 0/25
28. Body_SteerRightFront Body_RockerRight REVOLUTE 1/25
29. Body_WheelRightFront Body_SteerRightFront REVOLUTE 1/26
30. Frame_WHEEL_RF Body_WheelRightFront LOCKED 0/27
31. Frame_STEER_RF Body_SteerRightFront LOCKED 0/27
32. Frame_ROCKER_R Body_RockerRight LOCKED 0/27
33. Body_RSM_AZ Body_Chassis REVOLUTE 1/27
34. Body_RSM_EL Body_RSM_AZ REVOLUTE 1/28
35. Frame_MEL Body_RSM_EL LOCKED 0/29
36. Frame_SCI Body_RSM_EL LOCKED 0/29
37. Frame_SCRMI Body_RSM_EL LOCKED 0/29
38. Frame_SCLIBS Body_RSM_EL LOCKED 0/29
39. Frame_SCIR Body_RSM_EL LOCKED 0/29
40. Frame_MCL Body_RSM_EL LOCKED 0/29
41. Frame_MCR Body_RSM_EL LOCKED 0/29
42. Frame_NCL Body_RSM_EL LOCKED 0/29
43. Frame_NCR Body_RSM_EL LOCKED 0/29
44. Frame_NCL_FOV Body_RSM_EL LOCKED 0/29
45. Frame_NCR_FOV Body_RSM_EL LOCKED 0/29
46. Frame_MAZ Body_RSM_AZ LOCKED 0/29
47. Body_HGA_AZ Body_Chassis REVOLUTE 1/29
48. Body_HGA_EL Body_HGA_AZ REVOLUTE 1/30
49. Frame_ANT Body_HGA_EL LOCKED 0/31
50. Frame_HGAG Body_HGA_AZ LOCKED 0/31
51. Body_RA_Base Body_Chassis LOCKED 0/31
52. Body_RA_Link1 Body_RA_Base REVOLUTE 1/31
53. Body_RA_Link2 Body_RA_Link1 REVOLUTE 1/32
54. Body_RA_Link3 Body_RA_Link2 REVOLUTE 1/33
55. Body_RA_Link4 Body_RA_Link3 REVOLUTE 1/34
56. Body_RA_Link5 Body_RA_Link4 REVOLUTE 1/35
57. Body_Turret Body_RA_Link5 LOCKED 0/36
58. Body_CorerFeed Body_Turret SLIDER 1/36
59. Body_StabilizerFar Body_Turret SLIDER 1/37
60. Body_StabilizerNear Body_Turret SLIDER 1/38
61. Body_WATSON_Cap Body_Turret REVOLUTE 1/39
62. Body_SHERLOC_Cap Body_Turret REVOLUTE 1/40
63. Frame_RA5 Body_RA_Link5 LOCKED 0/41
64. Frame_RA6 Body_RA_Link5 LOCKED 0/41
65. Frame_TURRET Body_RA_Link5 LOCKED 0/41
66. Frame_DOCKING_POST Body_RA_Link5 LOCKED 0/41
67. Frame_DRILL Body_RA_Link5 LOCKED 0/41
68. Frame_FCS Body_RA_Link5 LOCKED 0/41
69. Frame_GDRT Body_RA_Link5 LOCKED 0/41
70. Frame_PIXL Body_RA_Link5 LOCKED 0/41
71. Frame_SHERLOC Body_RA_Link5 LOCKED 0/41
72. Frame_WATSON Body_RA_Link5 LOCKED 0/41
73. Frame_RA4 Body_RA_Link4 LOCKED 0/41
74. Frame_RA3 Body_RA_Link3 LOCKED 0/41
75. Frame_RA2 Body_RA_Link2 LOCKED 0/41
76. Frame_RA1 Body_RA_Link1 LOCKED 0/41
77. Frame_CAL_PIXL Body_RA_Link1 LOCKED 0/41
78. Frame_RNAV Body_Chassis LOCKED 0/41
79. Frame_RMECH Body_Chassis LOCKED 0/41
80. Frame_FHCB Body_Chassis LOCKED 0/41
81. Frame_FHC1 Body_Chassis LOCKED 0/41
82. Frame_FHC2 Body_Chassis LOCKED 0/41
83. Frame_FHC3 Body_Chassis LOCKED 0/41
84. Frame_FHC4 Body_Chassis LOCKED 0/41
85. Frame_FHC1_FOV Body_Chassis LOCKED 0/41
86. Frame_FHC2_FOV Body_Chassis LOCKED 0/41
87. Frame_FHC3_FOV Body_Chassis LOCKED 0/41
88. Frame_FHC4_FOV Body_Chassis LOCKED 0/41
89. Frame_RHC1 Body_Chassis LOCKED 0/41
90. Frame_RHC2 Body_Chassis LOCKED 0/41
91. Frame_RHC1_FOV Body_Chassis LOCKED 0/41
92. Frame_RHC2_FOV Body_Chassis LOCKED 0/41
93. Frame_ATS1 Body_Chassis LOCKED 0/41
94. Frame_ATS2 Body_Chassis LOCKED 0/41
95. Frame_ATS3 Body_Chassis LOCKED 0/41
96. Frame_ATS4 Body_Chassis LOCKED 0/41
97. Frame_ATS5 Body_Chassis LOCKED 0/41
98. Frame_HS Body_Chassis LOCKED 0/41
99. Frame_ICU Body_Chassis LOCKED 0/41
100. Frame_RDS Body_Chassis LOCKED 0/41
101. Frame_TIRS Body_Chassis LOCKED 0/41
102. Frame_WS1 Body_Chassis LOCKED 0/41
103. Frame_WS2 Body_Chassis LOCKED 0/41
104. Frame_MOXIE Body_Chassis LOCKED 0/41
105. Frame_MI Body_Chassis LOCKED 0/41
106. Frame_RIMUA Body_Chassis LOCKED 0/41
107. Frame_RIMUB Body_Chassis LOCKED 0/41
108. Frame_RIMFAX Body_Chassis LOCKED 0/41
109. Frame_HGAS Body_Chassis LOCKED 0/41
110. Frame_RA_BASE Body_Chassis LOCKED 0/41
111. Frame_CAL_MC1 Body_Chassis LOCKED 0/41
112. Frame_CAL_MC2 Body_Chassis LOCKED 0/41
113. Frame_CAL_SC Body_Chassis LOCKED 0/41
114. Frame_CAL_SHERLOC Body_Chassis LOCKED 0/41
____
41
Display the bodies topology
multibody.dumpTree()
Nodes
---
LEGEND: [<hinge type> <prescribed subhinges>] <body name>[/num embedded bodies > 0] <flex dofs > 0>
|-Perseverance_MBVROOT_
|-[FULL6DOF] Body_Chassis
|-[FULL6DOF] Body_MHS_DebrisShield
|-[REVOLUTE] Body_Differential
|-[LOCKED] Frame_DIFF
|-[REVOLUTE] Body_RockerLeft
|-[REVOLUTE] Body_BogieLeft
|-[REVOLUTE] Body_SteerLeftRear
|-[REVOLUTE] Body_WheelLeftRear
|-[LOCKED] Frame_WHEEL_LR
|-[LOCKED] Frame_STEER_LR
|-[REVOLUTE] Body_WheelLeftMiddle
|-[LOCKED] Frame_WHEEL_LM
|-[LOCKED] Frame_BOGIE_L
|-[REVOLUTE] Body_SteerLeftFront
|-[REVOLUTE] Body_WheelLeftFront
|-[LOCKED] Frame_WHEEL_LF
|-[LOCKED] Frame_STEER_LF
|-[LOCKED] Frame_ROCKER_L
|-[REVOLUTE] Body_RockerRight
|-[REVOLUTE] Body_BogieRight
|-[REVOLUTE] Body_SteerRightRear
|-[REVOLUTE] Body_WheelRightRear
|-[LOCKED] Frame_WHEEL_RR
|-[LOCKED] Frame_STEER_RR
|-[REVOLUTE] Body_WheelRightMiddle
|-[LOCKED] Frame_WHEEL_RM
|-[LOCKED] Frame_BOGIE_R
|-[REVOLUTE] Body_SteerRightFront
|-[REVOLUTE] Body_WheelRightFront
|-[LOCKED] Frame_WHEEL_RF
|-[LOCKED] Frame_STEER_RF
|-[LOCKED] Frame_ROCKER_R
|-[REVOLUTE] Body_RSM_AZ
|-[REVOLUTE] Body_RSM_EL
|-[LOCKED] Frame_MEL
|-[LOCKED] Frame_SCI
|-[LOCKED] Frame_SCRMI
|-[LOCKED] Frame_SCLIBS
|-[LOCKED] Frame_SCIR
|-[LOCKED] Frame_MCL
|-[LOCKED] Frame_MCR
|-[LOCKED] Frame_NCL
|-[LOCKED] Frame_NCR
|-[LOCKED] Frame_NCL_FOV
|-[LOCKED] Frame_NCR_FOV
|-[LOCKED] Frame_MAZ
|-[REVOLUTE] Body_HGA_AZ
|-[REVOLUTE] Body_HGA_EL
|-[LOCKED] Frame_ANT
|-[LOCKED] Frame_HGAG
|-[LOCKED] Body_RA_Base
|-[REVOLUTE] Body_RA_Link1
|-[REVOLUTE] Body_RA_Link2
|-[REVOLUTE] Body_RA_Link3
|-[REVOLUTE] Body_RA_Link4
|-[REVOLUTE] Body_RA_Link5
|-[LOCKED] Body_Turret
|-[SLIDER] Body_CorerFeed
|-[SLIDER] Body_StabilizerFar
|-[SLIDER] Body_StabilizerNear
|-[REVOLUTE] Body_WATSON_Cap
|-[REVOLUTE] Body_SHERLOC_Cap
|-[LOCKED] Frame_RA5
|-[LOCKED] Frame_RA6
|-[LOCKED] Frame_TURRET
|-[LOCKED] Frame_DOCKING_POST
|-[LOCKED] Frame_DRILL
|-[LOCKED] Frame_FCS
|-[LOCKED] Frame_GDRT
|-[LOCKED] Frame_PIXL
|-[LOCKED] Frame_SHERLOC
|-[LOCKED] Frame_WATSON
|-[LOCKED] Frame_RA4
|-[LOCKED] Frame_RA3
|-[LOCKED] Frame_RA2
|-[LOCKED] Frame_RA1
|-[LOCKED] Frame_CAL_PIXL
|-[LOCKED] Frame_RNAV
|-[LOCKED] Frame_RMECH
|-[LOCKED] Frame_FHCB
|-[LOCKED] Frame_FHC1
|-[LOCKED] Frame_FHC2
|-[LOCKED] Frame_FHC3
|-[LOCKED] Frame_FHC4
|-[LOCKED] Frame_FHC1_FOV
|-[LOCKED] Frame_FHC2_FOV
|-[LOCKED] Frame_FHC3_FOV
|-[LOCKED] Frame_FHC4_FOV
|-[LOCKED] Frame_RHC1
|-[LOCKED] Frame_RHC2
|-[LOCKED] Frame_RHC1_FOV
|-[LOCKED] Frame_RHC2_FOV
|-[LOCKED] Frame_ATS1
|-[LOCKED] Frame_ATS2
|-[LOCKED] Frame_ATS3
|-[LOCKED] Frame_ATS4
|-[LOCKED] Frame_ATS5
|-[LOCKED] Frame_HS
|-[LOCKED] Frame_ICU
|-[LOCKED] Frame_RDS
|-[LOCKED] Frame_TIRS
|-[LOCKED] Frame_WS1
|-[LOCKED] Frame_WS2
|-[LOCKED] Frame_MOXIE
|-[LOCKED] Frame_MI
|-[LOCKED] Frame_RIMUA
|-[LOCKED] Frame_RIMUB
|-[LOCKED] Frame_RIMFAX
|-[LOCKED] Frame_HGAS
|-[LOCKED] Frame_RA_BASE
|-[LOCKED] Frame_CAL_MC1
|-[LOCKED] Frame_CAL_MC2
|-[LOCKED] Frame_CAL_SC
|-[LOCKED] Frame_CAL_SHERLOC
Uncomment this line below to see an animation of all the hinges in the model (this can take a while to run!).
# multibody.articulateBodies()
Cleanup
def cleanup():
"""Cleanup the simulation."""
global basic_prefab_ds, graphics, prefab
del basic_prefab_ds, graphics, prefab
kc.discard(prop)
cleanup_viz()
kc.discard(multibody)
kc.discard(frame_container)
atexit.register(cleanup)
<function __main__.cleanup()>
Summary#
You now know how to import a Mars 2020 Perseverance rover URDF.
Further Readings#
Load a robotic arm urdf
Enforce loop constraints in a double-wishbone model
Create and use constraints in a slider-crank model
Drive an ATRVjr rover