Load Mars 2020 rover model from a URDF file

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