Skip to content

Commit

Permalink
Merge pull request #101 from JamieMair/100-when-a-model-cannot-be-loa…
Browse files Browse the repository at this point in the history
…ded-returns-a-null-pointer-which-is-not-error-handled

Added better error handling and more test coverage for loading models
  • Loading branch information
JamieMair authored Mar 4, 2024
2 parents e0acd5b + 847ffe8 commit c7676d2
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 5 deletions.
22 changes: 17 additions & 5 deletions src/io.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,26 @@ function load_model(path::AbstractString, type::Symbol)
throw(ArgumentError("Supplied model path could not be found. Path: $path"))
end

absolute_path = abspath(path)


!(type in (:MJCF, :MJB)) && error("The file type must be either MJCF or MJB.")
mpointer = if type == :MJCF
error_msg = "Could not load XML model from $path"
LibMuJoCo.mj_loadXML(path, Ptr{Cvoid}(), error_msg, length(error_msg))
nbytes = 1000;
error_buffer = zeros(UInt8, nbytes);
mpointer = C_NULL
GC.@preserve error_buffer begin
mpointer = LibMuJoCo.mj_loadXML(absolute_path, C_NULL, pointer(error_buffer), length(error_buffer))
if mpointer == C_NULL
error_str = unsafe_string(pointer(error_buffer))
error(error_str)
end
end
error_buffer = nothing # make sure the error_buffer is marked as unused
mpointer
elseif type == :MJB
error_msg = "Could not load MJB model from $path"
mpointer = LibMuJoCo.mj_loadModel(path, Ptr{Cvoid}())
mpointer == C_NULL && error(error_msg)
mpointer = LibMuJoCo.mj_loadModel(absolute_path, C_NULL)
mpointer == C_NULL && error("Could not load MJB model from $absolute_path")
mpointer
end

Expand Down
Binary file added test/configs/binary_cartpole.mjb
Binary file not shown.
75 changes: 75 additions & 0 deletions test/configs/broken_config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<!-- Cartpole Model
State-Space (name/joint/parameter):
- cart slider position (m)
- pole hinge angle (rad)
- cart slider velocity (m/s)
- pole hinge angular velocity (rad/s)
Actuators (name/actuator/parameter):
- cart motor force x (N)
-->
<mujoco model='test_cartpole'>
<compiler inertiafromgeom='true' coordinate='local' />

<size nkey="1" />

<custom>
<numeric name="control_timestep" data="0.04" />
<numeric name="three_numbers" data="1.0 2.0 3.0" />
</custom>

<option timestep='0.01' />

<default>
<joint damping='0.05' solreflimit='.08 1' />
<geom contype='0' friction='1 0.1 0.1' />
</default>

<worldbody>
<camera name='fixed' pos='0 -2.5 0' quat='0.707 0.707 0 0' />
<geom name='floor' pos='0 0 -1' size='4 4 4' type='plane' />
<geom name='rail1' type='capsule' pos='0 .07 0' quat='0.707 0 0.707 0'
size='0.02 1.2' />
<geom name='rail2' type='capsule' pos='0 -.07 0' quat='0.707 0 0.707 0'
size='0.02 1.2' />
<body name='cart' pos='0 0 0'>
<camera name='cart' pos='0 -2.5 0' quat='0.707 0.707 0 0' />
<joint name='slider' type='slide' limited='true' pos='0 0 0'
axis='1 0 0' range='-1 1' />
<geom name='cart' type='box' pos='0 0 0'
size='0.2 0.1 0.05' rgba='0.7 0.7 0 1' />
<site name='cart sensor' type='box' pos='0 0 0'
size='0.2 0.1 0.05' rgba='0.7 0.7 0 0' />
<body name='pole' pos='0 0 0'>
<camera name='pole' pos='0 -2.5 0' quat='0.707 0.707 0 0' />
<joint name='hinge' type='hinge' pos='0 0 0' axis='0 1 0' />
<geom name='cpole' type='capsule' fromto='0 0 0 0 0 0.6'
size='0.045 0.3' rgba='0 0.7 0.7 1' />
<site type='sphere' size='.01' name='tip' pos='.001 0 .6'
</body>
</body>
<body name='mocap1' pos='1 0 0.5' mocap='true'>
<geom name='mocap_cube' type='box' size='0.05 0.05 0.05' rgba='1 0 0 0.5' />
</body>
<body name='mocap2' pos='-1 0 0.5' mocap='true'>
<geom name='mocap_sphere' type='sphere' size='0.05' rgba='0 1 0 0.5' />
</body>
</worldbody>

<actuator>
<motor name='slide' joint='slider' gear='50' ctrllimited='true' ctrlrange='-1 1' />
</actuator>

<sensor>
<accelerometer name="accelerometer" site="cart sensor" />
<touch name="collision" site="cart sensor" />
</sensor>

<keyframe>
<key name="hanging_down" qpos="0 1.57" />
</keyframe>

</mujoco>
10 changes: 10 additions & 0 deletions test/loading.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ using TestItemRunner
@test load_model(MuJoCo.humanoid_model_file()) isa MuJoCo.Model
end

@testitem "Load Broken XML" begin
path = joinpath(@__DIR__, "configs", "broken_config.xml")
@test_throws Exception load_model(path)
end

@testitem "Load binary MuJoCo" begin
path = joinpath(@__DIR__, "configs", "binary_cartpole.mjb")
@test load_model(path) isa MuJoCo.Model
end

@testitem "Initialise Data" begin
model = load_model(MuJoCo.humanoid_model_file())

Expand Down

0 comments on commit c7676d2

Please sign in to comment.