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
from Karana.Frame import FrameContainer
from Karana.Dynamics.SOADyn_types import MultibodyDS
from Karana.Core import discard
resources = Path().absolute().parent / "resources"
urdf_file = resources / "m2020" / "m2020.urdf"
multibody_info = MultibodyDS.fromUrdf(urdf_file)
frame_container = FrameContainer("root")
multibody = multibody_info.toMultibody(frame_container)
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])
[WebUI] Listening at http://newton:45759
Display the contents of the multibody system
multibody.displayModel()
Body Parent Hinge Dofs
____ ______ _____ ____
1. Body_Chassis Perseverance_MBVROOT_ FULL6DOF 6
2. Body_MHS_DebrisShield Body_Chassis FULL6DOF 6
3. Body_Differential Body_Chassis PIN 1
4. Frame_DIFF Body_Differential LOCKED 0
5. Body_RockerLeft Body_Chassis PIN 1
6. Body_BogieLeft Body_RockerLeft PIN 1
7. Body_SteerLeftRear Body_BogieLeft PIN 1
8. Body_WheelLeftRear Body_SteerLeftRear PIN 1
9. Frame_WHEEL_LR Body_WheelLeftRear LOCKED 0
10. Frame_STEER_LR Body_SteerLeftRear LOCKED 0
11. Body_WheelLeftMiddle Body_BogieLeft PIN 1
12. Frame_WHEEL_LM Body_WheelLeftMiddle LOCKED 0
13. Frame_BOGIE_L Body_BogieLeft LOCKED 0
14. Body_SteerLeftFront Body_RockerLeft PIN 1
15. Body_WheelLeftFront Body_SteerLeftFront PIN 1
16. Frame_WHEEL_LF Body_WheelLeftFront LOCKED 0
17. Frame_STEER_LF Body_SteerLeftFront LOCKED 0
18. Frame_ROCKER_L Body_RockerLeft LOCKED 0
19. Body_RockerRight Body_Chassis PIN 1
20. Body_BogieRight Body_RockerRight PIN 1
21. Body_SteerRightRear Body_BogieRight PIN 1
22. Body_WheelRightRear Body_SteerRightRear PIN 1
23. Frame_WHEEL_RR Body_WheelRightRear LOCKED 0
24. Frame_STEER_RR Body_SteerRightRear LOCKED 0
25. Body_WheelRightMiddle Body_BogieRight PIN 1
26. Frame_WHEEL_RM Body_WheelRightMiddle LOCKED 0
27. Frame_BOGIE_R Body_BogieRight LOCKED 0
28. Body_SteerRightFront Body_RockerRight PIN 1
29. Body_WheelRightFront Body_SteerRightFront PIN 1
30. Frame_WHEEL_RF Body_WheelRightFront LOCKED 0
31. Frame_STEER_RF Body_SteerRightFront LOCKED 0
32. Frame_ROCKER_R Body_RockerRight LOCKED 0
33. Body_RSM_AZ Body_Chassis PIN 1
34. Body_RSM_EL Body_RSM_AZ PIN 1
35. Frame_MEL Body_RSM_EL LOCKED 0
36. Frame_SCI Body_RSM_EL LOCKED 0
37. Frame_SCRMI Body_RSM_EL LOCKED 0
38. Frame_SCLIBS Body_RSM_EL LOCKED 0
39. Frame_SCIR Body_RSM_EL LOCKED 0
40. Frame_MCL Body_RSM_EL LOCKED 0
41. Frame_MCR Body_RSM_EL LOCKED 0
42. Frame_NCL Body_RSM_EL LOCKED 0
43. Frame_NCR Body_RSM_EL LOCKED 0
44. Frame_NCL_FOV Body_RSM_EL LOCKED 0
45. Frame_NCR_FOV Body_RSM_EL LOCKED 0
46. Frame_MAZ Body_RSM_AZ LOCKED 0
47. Body_HGA_AZ Body_Chassis PIN 1
48. Body_HGA_EL Body_HGA_AZ PIN 1
49. Frame_ANT Body_HGA_EL LOCKED 0
50. Frame_HGAG Body_HGA_AZ LOCKED 0
51. Body_RA_Base Body_Chassis LOCKED 0
52. Body_RA_Link1 Body_RA_Base PIN 1
53. Body_RA_Link2 Body_RA_Link1 PIN 1
54. Body_RA_Link3 Body_RA_Link2 PIN 1
55. Body_RA_Link4 Body_RA_Link3 PIN 1
56. Body_RA_Link5 Body_RA_Link4 PIN 1
57. Body_Turret Body_RA_Link5 LOCKED 0
58. Body_CorerFeed Body_Turret SLIDER 1
59. Body_StabilizerFar Body_Turret SLIDER 1
60. Body_StabilizerNear Body_Turret SLIDER 1
61. Body_WATSON_Cap Body_Turret PIN 1
62. Body_SHERLOC_Cap Body_Turret PIN 1
63. Frame_RA5 Body_RA_Link5 LOCKED 0
64. Frame_RA6 Body_RA_Link5 LOCKED 0
65. Frame_TURRET Body_RA_Link5 LOCKED 0
66. Frame_DOCKING_POST Body_RA_Link5 LOCKED 0
67. Frame_DRILL Body_RA_Link5 LOCKED 0
68. Frame_FCS Body_RA_Link5 LOCKED 0
69. Frame_GDRT Body_RA_Link5 LOCKED 0
70. Frame_PIXL Body_RA_Link5 LOCKED 0
71. Frame_SHERLOC Body_RA_Link5 LOCKED 0
72. Frame_WATSON Body_RA_Link5 LOCKED 0
73. Frame_RA4 Body_RA_Link4 LOCKED 0
74. Frame_RA3 Body_RA_Link3 LOCKED 0
75. Frame_RA2 Body_RA_Link2 LOCKED 0
76. Frame_RA1 Body_RA_Link1 LOCKED 0
77. Frame_CAL_PIXL Body_RA_Link1 LOCKED 0
78. Frame_RNAV Body_Chassis LOCKED 0
79. Frame_RMECH Body_Chassis LOCKED 0
80. Frame_FHCB Body_Chassis LOCKED 0
81. Frame_FHC1 Body_Chassis LOCKED 0
82. Frame_FHC2 Body_Chassis LOCKED 0
83. Frame_FHC3 Body_Chassis LOCKED 0
84. Frame_FHC4 Body_Chassis LOCKED 0
85. Frame_FHC1_FOV Body_Chassis LOCKED 0
86. Frame_FHC2_FOV Body_Chassis LOCKED 0
87. Frame_FHC3_FOV Body_Chassis LOCKED 0
88. Frame_FHC4_FOV Body_Chassis LOCKED 0
89. Frame_RHC1 Body_Chassis LOCKED 0
90. Frame_RHC2 Body_Chassis LOCKED 0
91. Frame_RHC1_FOV Body_Chassis LOCKED 0
92. Frame_RHC2_FOV Body_Chassis LOCKED 0
93. Frame_ATS1 Body_Chassis LOCKED 0
94. Frame_ATS2 Body_Chassis LOCKED 0
95. Frame_ATS3 Body_Chassis LOCKED 0
96. Frame_ATS4 Body_Chassis LOCKED 0
97. Frame_ATS5 Body_Chassis LOCKED 0
98. Frame_HS Body_Chassis LOCKED 0
99. Frame_ICU Body_Chassis LOCKED 0
100. Frame_RDS Body_Chassis LOCKED 0
101. Frame_TIRS Body_Chassis LOCKED 0
102. Frame_WS1 Body_Chassis LOCKED 0
103. Frame_WS2 Body_Chassis LOCKED 0
104. Frame_MOXIE Body_Chassis LOCKED 0
105. Frame_MI Body_Chassis LOCKED 0
106. Frame_RIMUA Body_Chassis LOCKED 0
107. Frame_RIMUB Body_Chassis LOCKED 0
108. Frame_RIMFAX Body_Chassis LOCKED 0
109. Frame_HGAS Body_Chassis LOCKED 0
110. Frame_RA_BASE Body_Chassis LOCKED 0
111. Frame_CAL_MC1 Body_Chassis LOCKED 0
112. Frame_CAL_MC2 Body_Chassis LOCKED 0
113. Frame_CAL_SC Body_Chassis LOCKED 0
114. Frame_CAL_SHERLOC Body_Chassis LOCKED 0
____
41
Nodes
---
Display the bodies topology
multibody.dumpTree()
|-Perseverance_MBVROOT_
|-Body_Chassis
|-Body_MHS_DebrisShield
|-Body_Differential
|-Frame_DIFF
|-Body_RockerLeft
|-Body_BogieLeft
|-Body_SteerLeftRear
|-Body_WheelLeftRear
|-Frame_WHEEL_LR
|-Frame_STEER_LR
|-Body_WheelLeftMiddle
|-Frame_WHEEL_LM
|-Frame_BOGIE_L
|-Body_SteerLeftFront
|-Body_WheelLeftFront
|-Frame_WHEEL_LF
|-Frame_STEER_LF
|-Frame_ROCKER_L
|-Body_RockerRight
|-Body_BogieRight
|-Body_SteerRightRear
|-Body_WheelRightRear
|-Frame_WHEEL_RR
|-Frame_STEER_RR
|-Body_WheelRightMiddle
|-Frame_WHEEL_RM
|-Frame_BOGIE_R
|-Body_SteerRightFront
|-Body_WheelRightFront
|-Frame_WHEEL_RF
|-Frame_STEER_RF
|-Frame_ROCKER_R
|-Body_RSM_AZ
|-Body_RSM_EL
|-Frame_MEL
|-Frame_SCI
|-Frame_SCRMI
|-Frame_SCLIBS
|-Frame_SCIR
|-Frame_MCL
|-Frame_MCR
|-Frame_NCL
|-Frame_NCR
|-Frame_NCL_FOV
|-Frame_NCR_FOV
|-Frame_MAZ
|-Body_HGA_AZ
|-Body_HGA_EL
|-Frame_ANT
|-Frame_HGAG
|-Body_RA_Base
|-Body_RA_Link1
|-Body_RA_Link2
|-Body_RA_Link3
|-Body_RA_Link4
|-Body_RA_Link5
|-Body_Turret
|-Body_CorerFeed
|-Body_StabilizerFar
|-Body_StabilizerNear
|-Body_WATSON_Cap
|-Body_SHERLOC_Cap
|-Frame_RA5
|-Frame_RA6
|-Frame_TURRET
|-Frame_DOCKING_POST
|-Frame_DRILL
|-Frame_FCS
|-Frame_GDRT
|-Frame_PIXL
|-Frame_SHERLOC
|-Frame_WATSON
|-Frame_RA4
|-Frame_RA3
|-Frame_RA2
|-Frame_RA1
|-Frame_CAL_PIXL
|-Frame_RNAV
|-Frame_RMECH
|-Frame_FHCB
|-Frame_FHC1
|-Frame_FHC2
|-Frame_FHC3
|-Frame_FHC4
|-Frame_FHC1_FOV
|-Frame_FHC2_FOV
|-Frame_FHC3_FOV
|-Frame_FHC4_FOV
|-Frame_RHC1
|-Frame_RHC2
|-Frame_RHC1_FOV
|-Frame_RHC2_FOV
|-Frame_ATS1
|-Frame_ATS2
|-Frame_ATS3
|-Frame_ATS4
|-Frame_ATS5
|-Frame_HS
|-Frame_ICU
|-Frame_RDS
|-Frame_TIRS
|-Frame_WS1
|-Frame_WS2
|-Frame_MOXIE
|-Frame_MI
|-Frame_RIMUA
|-Frame_RIMUB
|-Frame_RIMFAX
|-Frame_HGAS
|-Frame_RA_BASE
|-Frame_CAL_MC1
|-Frame_CAL_MC2
|-Frame_CAL_SC
|-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 multibody_info, graphics
del multibody_info, graphics
cleanup_viz()
discard(multibody)
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