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

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