├── .github ├── codecov.yml ├── dependabot.yml └── workflows │ ├── cd.yml │ └── ci.yml ├── .gitignore ├── .readthedocs.yaml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── doc └── source │ ├── _templates │ ├── sdformat_element.rst │ ├── sdformat_model.rst │ └── transform_class.rst │ ├── api_reference.rst │ ├── conf.py │ ├── index.rst │ └── install.rst ├── examples ├── README.rst ├── plot_hexagonal_grids.py ├── plot_sdformat-read-write.py └── sdformat-read-write-thumb.png ├── pyproject.toml ├── setup.cfg ├── setup.py ├── skbot ├── __init__.py ├── _numba_overloads.py ├── ignition │ ├── __init__.py │ ├── fuel.py │ ├── messages.py │ ├── sdformat │ │ ├── __init__.py │ │ ├── bindings │ │ │ ├── __init__.py │ │ │ ├── v10 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v12 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v13 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v14 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v15 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── material.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v16 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── material.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ ├── v17 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── material.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ │ └── v18 │ │ │ │ ├── __init__.py │ │ │ │ ├── actor.py │ │ │ │ ├── collision.py │ │ │ │ ├── geometry.py │ │ │ │ ├── joint.py │ │ │ │ ├── light.py │ │ │ │ ├── link.py │ │ │ │ ├── material.py │ │ │ │ ├── model.py │ │ │ │ ├── physics.py │ │ │ │ ├── scene.py │ │ │ │ ├── sdf.py │ │ │ │ ├── sensor.py │ │ │ │ ├── state.py │ │ │ │ ├── visual.py │ │ │ │ └── world.py │ │ ├── create_frame_graph.py │ │ ├── exceptions.py │ │ ├── generic_sdf │ │ │ ├── __init__.py │ │ │ ├── actor.py │ │ │ ├── atmosphere.py │ │ │ ├── audio_sink.py │ │ │ ├── audio_source.py │ │ │ ├── base.py │ │ │ ├── battery.py │ │ │ ├── camera.py │ │ │ ├── collision.py │ │ │ ├── collision_engine.py │ │ │ ├── frame.py │ │ │ ├── geometry.py │ │ │ ├── gripper.py │ │ │ ├── gui.py │ │ │ ├── include.py │ │ │ ├── inertial.py │ │ │ ├── joint.py │ │ │ ├── light.py │ │ │ ├── light_state.py │ │ │ ├── link.py │ │ │ ├── link_state.py │ │ │ ├── material.py │ │ │ ├── model.py │ │ │ ├── model_state.py │ │ │ ├── noise.py │ │ │ ├── origin.py │ │ │ ├── particle_emitter.py │ │ │ ├── physics.py │ │ │ ├── plugin.py │ │ │ ├── population.py │ │ │ ├── projector.py │ │ │ ├── scene.py │ │ │ ├── sdf.py │ │ │ ├── sensor.py │ │ │ ├── sensors.py │ │ │ ├── shapes.py │ │ │ ├── state.py │ │ │ ├── surface.py │ │ │ ├── transceiver.py │ │ │ ├── urdf.py │ │ │ ├── visual.py │ │ │ └── world.py │ │ ├── load_as_generic.py │ │ ├── schema │ │ │ ├── 1.0 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.2 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.3 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.4 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.5 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── material.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.6 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── material.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ ├── 1.7 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── material.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ │ └── 1.8 │ │ │ │ ├── actor.xsd │ │ │ │ ├── collision.xsd │ │ │ │ ├── geometry.xsd │ │ │ │ ├── joint.xsd │ │ │ │ ├── light.xsd │ │ │ │ ├── link.xsd │ │ │ │ ├── material.xsd │ │ │ │ ├── model.xsd │ │ │ │ ├── physics.xsd │ │ │ │ ├── scene.xsd │ │ │ │ ├── sdf.xsd │ │ │ │ ├── sensor.xsd │ │ │ │ ├── state.xsd │ │ │ │ ├── types.xsd │ │ │ │ ├── visual.xsd │ │ │ │ └── world.xsd │ │ ├── sdformat.py │ │ └── transform_factory.py │ ├── subscriber.py │ └── transformations.py ├── inverse_kinematics │ ├── __init__.py │ ├── cyclic_coordinate_descent.py │ ├── gradient_descent.py │ └── targets.py ├── ros │ ├── __init__.py │ └── generic │ │ ├── __init__.py │ │ └── urdf.py ├── trajectory │ ├── __init__.py │ ├── linear.py │ ├── spline.py │ └── utils.py └── transform │ ├── __init__.py │ ├── _utils.py │ ├── affine.py │ ├── base.py │ ├── functions.py │ ├── joints.py │ ├── metrics.py │ ├── projections.py │ ├── simplfy.py │ ├── utils2d.py │ └── utils3d.py ├── tests ├── ignition │ ├── conftest.py │ ├── sdf │ │ ├── robots │ │ │ ├── double_pendulum │ │ │ │ ├── model-1_3.sdf │ │ │ │ ├── model-1_4.sdf │ │ │ │ ├── model.config │ │ │ │ ├── model.sdf │ │ │ │ └── thumbnails │ │ │ │ │ ├── 1.png │ │ │ │ │ ├── 2.png │ │ │ │ │ ├── 3.png │ │ │ │ │ ├── 4.png │ │ │ │ │ └── 5.png │ │ │ └── panda │ │ │ │ ├── meshes │ │ │ │ ├── collision │ │ │ │ │ ├── finger.stl │ │ │ │ │ ├── finger.stl:Zone.Identifier │ │ │ │ │ ├── hand.stl │ │ │ │ │ ├── hand.stl:Zone.Identifier │ │ │ │ │ ├── link0.stl │ │ │ │ │ ├── link0.stl:Zone.Identifier │ │ │ │ │ ├── link1.stl │ │ │ │ │ ├── link1.stl:Zone.Identifier │ │ │ │ │ ├── link2.stl │ │ │ │ │ ├── link2.stl:Zone.Identifier │ │ │ │ │ ├── link3.stl │ │ │ │ │ ├── link3.stl:Zone.Identifier │ │ │ │ │ ├── link4.stl │ │ │ │ │ ├── link4.stl:Zone.Identifier │ │ │ │ │ ├── link5.stl │ │ │ │ │ ├── link5.stl:Zone.Identifier │ │ │ │ │ ├── link6.stl │ │ │ │ │ ├── link6.stl:Zone.Identifier │ │ │ │ │ ├── link7.stl │ │ │ │ │ └── link7.stl:Zone.Identifier │ │ │ │ └── visual │ │ │ │ │ ├── finger.dae │ │ │ │ │ ├── finger.dae:Zone.Identifier │ │ │ │ │ ├── hand.dae │ │ │ │ │ ├── hand.dae:Zone.Identifier │ │ │ │ │ ├── link0.dae │ │ │ │ │ ├── link0.dae:Zone.Identifier │ │ │ │ │ ├── link1.dae │ │ │ │ │ ├── link1.dae:Zone.Identifier │ │ │ │ │ ├── link2.dae │ │ │ │ │ ├── link2.dae:Zone.Identifier │ │ │ │ │ ├── link3.dae │ │ │ │ │ ├── link3.dae:Zone.Identifier │ │ │ │ │ ├── link4.dae │ │ │ │ │ ├── link4.dae:Zone.Identifier │ │ │ │ │ ├── link5.dae │ │ │ │ │ ├── link5.dae:Zone.Identifier │ │ │ │ │ ├── link6.dae │ │ │ │ │ ├── link6.dae:Zone.Identifier │ │ │ │ │ ├── link7.dae │ │ │ │ │ └── link7.dae:Zone.Identifier │ │ │ │ ├── model.config │ │ │ │ ├── model.config:Zone.Identifier │ │ │ │ ├── model.sdf │ │ │ │ ├── model.sdf:Zone.Identifier │ │ │ │ └── thumbnails │ │ │ │ ├── 1.png │ │ │ │ ├── 1.png:Zone.Identifier │ │ │ │ ├── 2.png │ │ │ │ └── 2.png:Zone.Identifier │ │ ├── sdformat │ │ │ ├── audio_14.sdf │ │ │ ├── bad_syntax_double.sdf │ │ │ ├── bad_syntax_pose.sdf │ │ │ ├── bad_syntax_vector.sdf │ │ │ ├── box_bad_test.sdf │ │ │ ├── box_plane_low_friction_test.sdf │ │ │ ├── custom_and_unknown_elements.sdf │ │ │ ├── double_pendulum.sdf │ │ │ ├── empty.sdf │ │ │ ├── empty_axis.sdf │ │ │ ├── empty_invalid.sdf │ │ │ ├── empty_noversion.sdf │ │ │ ├── empty_road_sph_coords.sdf │ │ │ ├── ignore_sdf_in_namespaced_elements.sdf │ │ │ ├── ignore_sdf_in_plugin.sdf │ │ │ ├── include_with_interface_api_frame_semantics.sdf │ │ │ ├── include_with_interface_api_reposture.sdf │ │ │ ├── includes.sdf │ │ │ ├── includes_1.5.sdf │ │ │ ├── includes_missing_model.sdf │ │ │ ├── includes_missing_uri.sdf │ │ │ ├── includes_model_without_sdf.sdf │ │ │ ├── includes_without_top_level.sdf │ │ │ ├── inertial_complete.sdf │ │ │ ├── inertial_invalid.sdf │ │ │ ├── invalid_version.sdf │ │ │ ├── joint_axis_infinite_limits.sdf │ │ │ ├── joint_axis_xyz_normalization.sdf │ │ │ ├── joint_child_frame.sdf │ │ │ ├── joint_child_world.sdf │ │ │ ├── joint_complete.sdf │ │ │ ├── joint_invalid_child.sdf │ │ │ ├── joint_invalid_parent.sdf │ │ │ ├── joint_invalid_parent_same_as_child.sdf │ │ │ ├── joint_invalid_resolved_parent_same_as_child.sdf │ │ │ ├── joint_invalid_self_child.sdf │ │ │ ├── joint_invalid_self_parent.sdf │ │ │ ├── joint_nested_parent_child.sdf │ │ │ ├── joint_parent_frame.sdf │ │ │ ├── joint_parent_world.sdf │ │ │ ├── joint_sensors.sdf │ │ │ ├── light.sdf │ │ │ ├── link_duplicate_cousin_collisions.sdf │ │ │ ├── link_duplicate_cousin_visuals.sdf │ │ │ ├── link_duplicate_sibling_collisions.sdf │ │ │ ├── link_duplicate_sibling_visuals.sdf │ │ │ ├── material.sdf │ │ │ ├── material_invalid.sdf │ │ │ ├── material_normal_map_missing.sdf │ │ │ ├── material_pbr.sdf │ │ │ ├── material_script_no_uri.sdf │ │ │ ├── material_valid.sdf │ │ │ ├── model_canonical_link.sdf │ │ │ ├── model_duplicate_joints.sdf │ │ │ ├── model_duplicate_links.sdf │ │ │ ├── model_frame_attached_to.sdf │ │ │ ├── model_frame_attached_to_joint.sdf │ │ │ ├── model_frame_attached_to_nested_model.sdf │ │ │ ├── model_frame_invalid_attached_to.sdf │ │ │ ├── model_frame_invalid_attached_to_cycle.sdf │ │ │ ├── model_frame_relative_to.sdf │ │ │ ├── model_frame_relative_to_joint.sdf │ │ │ ├── model_include_with_interface_api.sdf │ │ │ ├── model_invalid_canonical_link.sdf │ │ │ ├── model_invalid_frame_relative_to.sdf │ │ │ ├── model_invalid_frame_relative_to_cycle.sdf │ │ │ ├── model_invalid_joint_relative_to.sdf │ │ │ ├── model_invalid_link_relative_to.sdf │ │ │ ├── model_invalid_placement_frame.sdf │ │ │ ├── model_invalid_root_reference.sdf │ │ │ ├── model_joint_axis_expressed_in.sdf │ │ │ ├── model_joint_relative_to.sdf │ │ │ ├── model_link_joint_same_name.sdf │ │ │ ├── model_link_relative_to.sdf │ │ │ ├── model_multi_nested_model.sdf │ │ │ ├── model_nested_frame_attached_to.sdf │ │ │ ├── model_nested_model_relative_to.sdf │ │ │ ├── model_nested_static_model.sdf │ │ │ ├── model_relative_to_nested_reference.sdf │ │ │ ├── model_with_placement_frame_attribute.sdf │ │ │ ├── model_without_links.sdf │ │ │ ├── nested_canonical_link.sdf │ │ │ ├── nested_explicit_canonical_link.sdf │ │ │ ├── nested_model.sdf │ │ │ ├── nested_model_cross_references.sdf │ │ │ ├── nested_multiple_elements_error_world.sdf │ │ │ ├── nested_without_links_invalid.sdf │ │ │ ├── placement_frame_missing_pose.sdf │ │ │ ├── root_duplicate_models.sdf │ │ │ ├── root_multiple_models.sdf │ │ │ ├── scene_with_sky.sdf │ │ │ ├── sensors.sdf │ │ │ ├── shapes.sdf │ │ │ ├── shapes_world.sdf │ │ │ ├── stricter_semantics_desc.sdf │ │ │ ├── unrecognized_elements.sdf │ │ │ ├── unrecognized_elements_with_namespace.sdf │ │ │ ├── whitespace.sdf │ │ │ ├── world_complete.sdf │ │ │ ├── world_duplicate.sdf │ │ │ ├── world_frame_attached_to.sdf │ │ │ ├── world_frame_invalid_attached_to.sdf │ │ │ ├── world_frame_invalid_attached_to_scope.sdf │ │ │ ├── world_frame_invalid_relative_to.sdf │ │ │ ├── world_frame_relative_to.sdf │ │ │ ├── world_include_with_interface_api.sdf │ │ │ ├── world_invalid_root_reference.sdf │ │ │ ├── world_model_frame_same_name.sdf │ │ │ ├── world_nested_frame.sdf │ │ │ ├── world_nested_frame_attached_to.sdf │ │ │ ├── world_nested_model.sdf │ │ │ ├── world_noname.sdf │ │ │ ├── world_relative_to_nested_reference.sdf │ │ │ ├── world_sibling_same_names.sdf │ │ │ └── world_with_state.sdf │ │ ├── v15 │ │ │ ├── camera.sdf │ │ │ ├── force_torque.sdf │ │ │ ├── frames.sdf │ │ │ ├── joint_attached_to_parent.sdf │ │ │ ├── light_only.sdf │ │ │ ├── population.sdf │ │ │ ├── pose_testing.sdf │ │ │ └── projector.sdf │ │ ├── v17 │ │ │ ├── crooked_double_pendulum.sdf │ │ │ ├── fuel_include.sdf │ │ │ ├── light_only.sdf │ │ │ └── population.sdf │ │ └── v18 │ │ │ ├── audio_source.sdf │ │ │ ├── camera.sdf │ │ │ ├── complete_world.sdf │ │ │ ├── crooked_double_pendulum.sdf │ │ │ ├── four_goals.sdf │ │ │ ├── fuel_include.sdf │ │ │ ├── fuel_include_no_pose.sdf │ │ │ ├── fuel_include_placement_frame.sdf │ │ │ ├── fuel_include_relative_to.sdf │ │ │ ├── fuel_include_rename.sdf │ │ │ ├── fuel_include_unknown_server.sdf │ │ │ ├── fuel_include_world.sdf │ │ │ ├── gripper.sdf │ │ │ ├── invalid_joint_type.sdf │ │ │ ├── invalid_same_scope_twice.sdf │ │ │ ├── invalid_sensor_type.sdf │ │ │ ├── light_only.sdf │ │ │ ├── link_offset.sdf │ │ │ ├── panda_cam.sdf │ │ │ ├── perspective_transform.sdf │ │ │ ├── perspective_transform_offset.sdf │ │ │ ├── perspective_transform_straight.sdf │ │ │ ├── population.sdf │ │ │ ├── pose_relative_to.sdf │ │ │ ├── pose_testing.sdf │ │ │ ├── projector.sdf │ │ │ └── world_with_state.sdf │ ├── test_fuel.py │ ├── test_sdformat.py │ ├── test_subscriber.py │ ├── test_transform_factory.py │ └── test_transformations.py ├── inverse_kinematics │ ├── conftest.py │ ├── test_ccd.py │ ├── test_gd.py │ └── test_targets.py ├── ros │ ├── conftest.py │ └── test_urdf.py ├── trajectory │ ├── test_linear.py │ ├── test_spline.py │ └── test_trajectory_utils.py └── transform │ ├── conftest.py │ ├── test_affine.py │ ├── test_base.py │ ├── test_functions.py │ ├── test_joints.py │ ├── test_projections.py │ ├── test_simplify_link.py │ ├── test_transform_utils.py │ ├── test_utils2d.py │ └── test_utils3d.py └── tools └── ignition ├── fallback_types.xsd ├── generate_bindings.py ├── generate_xsd_schema.py └── sdf_bindings_config.xml /.github/codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | status: 3 | # coverage of the current PR/commit 4 | patch: 5 | default: 6 | target: 100% 7 | # coverage of the full project 8 | project: 9 | default: 10 | target: auto 11 | comment: false -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "pip" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | commit-message: 8 | prefix: "MAINT: " 9 | 10 | - package-ecosystem: "github-actions" 11 | directory: "/" 12 | schedule: 13 | interval: "weekly" 14 | -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | test: 10 | name: "CPython ${{ matrix.python-version }}" 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | python-version: [3.7, 3.8, 3.9] 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: Set up Python ${{ matrix.python-version }} 18 | uses: actions/setup-python@v3 19 | with: 20 | python-version: ${{ matrix.python-version }} 21 | - name: Install dependencies 22 | run: | 23 | sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" >\ 24 | /etc/apt/sources.list.d/gazebo-stable.list' 25 | wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - 26 | sudo apt-get update 27 | sudo apt-get install ignition-dome 28 | python -m pip install --upgrade pip 29 | pip install -e .[testing,ignition] 30 | - name: Execute tests 31 | run: | 32 | coverage run -m pytest -v 33 | - name: Upload coverage to Codecov 34 | run: | 35 | curl -s https://codecov.io/bash | bash 36 | env: 37 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 38 | shell: bash 39 | 40 | build-n-publish: 41 | name: 🐍-semantic-release a 📦 42 | needs: test 43 | runs-on: ubuntu-latest 44 | steps: 45 | - uses: actions/checkout@v2 46 | with: 47 | fetch-depth: 0 48 | - name: Python Semantic Release 49 | uses: relekang/python-semantic-release@master 50 | with: 51 | github_token: ${{ secrets.GITHUB_TOKEN }} 52 | pypi_token: ${{ secrets.PYPI_API_TOKEN }} 53 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | linting: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: actions/setup-python@v3 12 | - uses: psf/black@stable 13 | with: 14 | args: ". --check" 15 | 16 | test: 17 | name: "CPython ${{ matrix.python-version }}" 18 | runs-on: ubuntu-latest 19 | strategy: 20 | matrix: 21 | python-version: [3.7, 3.8, 3.9] 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Set up Python ${{ matrix.python-version }} 25 | uses: actions/setup-python@v3 26 | with: 27 | python-version: ${{ matrix.python-version }} 28 | - name: Install dependencies 29 | run: | 30 | sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" >\ 31 | /etc/apt/sources.list.d/gazebo-stable.list' 32 | wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - 33 | sudo apt-get update 34 | sudo apt-get install ignition-dome 35 | python -m pip install --upgrade pip 36 | pip install -e .[testing,ignition] 37 | - name: Execute tests 38 | run: | 39 | coverage run -m pytest -v 40 | - name: Upload coverage to Codecov 41 | run: | 42 | curl -s https://codecov.io/bash | bash 43 | env: 44 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 45 | shell: bash 46 | 47 | build: 48 | name: Test Wheel Building 49 | runs-on: ubuntu-latest 50 | steps: 51 | - uses: actions/checkout@v2 52 | - name: Set up Python 3.8 53 | uses: actions/setup-python@v3 54 | with: 55 | python-version: 3.8 56 | - name: Install dependencies 57 | run: | 58 | python -m pip install --upgrade pip 59 | pip install -e .[build] 60 | - name: Build a binary wheel and a source tarball 61 | run: >- 62 | python -m build --sdist --wheel --outdir dist/ 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | dist/ 3 | doc/build/ 4 | doc/source/_autosummary 5 | doc/source/_gallery 6 | .vscode/ 7 | tools/ignition/sdformat/ 8 | 9 | *.egg-info 10 | .coverage 11 | /examples/my_world.sdf 12 | my_world.sdf 13 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yaml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | # Required 6 | version: 2 7 | 8 | # Build documentation in the docs/ directory with Sphinx 9 | sphinx: 10 | configuration: doc/source/conf.py 11 | fail_on_warning: true 12 | 13 | # Optionally set the version of Python and requirements required to build your docs 14 | python: 15 | install: 16 | - method: pip 17 | path: . 18 | extra_requirements: 19 | - docs 20 | -------------------------------------------------------------------------------- /doc/source/_templates/sdformat_element.rst: -------------------------------------------------------------------------------- 1 | {% set mod_parts = fullname.split(".") %} 2 | {% for mod_part in mod_parts %} 3 | {% set path = ".".join(mod_parts[:loop.index]) %} 4 | {% if mod_part == "bindings" %} 5 | 6 | {% set mod_path = ".".join(mod_parts[:loop.index]) %} 7 | {% set sdf_version = mod_parts[loop.index] %} 8 | {% set class_path = ".".join(mod_parts[(loop.index):]) %} 9 | {% set top_class = mod_parts[loop.index + 2] %} 10 | {% set sdf_ver = sdf_version[0] + sdf_version[1] + "." + sdf_version[2:] %} 11 | 12 | 13 | {{ class_path | escape | underline}} 14 | 15 | {% set link = "http://sdformat.org/spec?ver=" + sdf_ver[1:] + "&elem=" + top_class.lower() %} 16 | {% if loop.index + 2 != mod_parts | length - 1 %} 17 | {% set link = link + "#" + mod_parts[-2].lower() + "_" + mod_parts[-1].lower() %} 18 | {% endif%} 19 | 20 | .. warning:: 21 | This class is autogenerated. More detailed documentation can be found in the 22 | `SDFormat spec <{{link}}>`_. 23 | 24 | .. autoclass:: {{ mod_path }}::{{ class_path }} 25 | 26 | {# Recursively generate nested classes #} 27 | {# Cuz who needs :recursive: anyway B-) xD #} 28 | .. currentmodule:: {{ mod_path }} 29 | 30 | {% set sub_classes = members | reject("eq", "Meta") | reject("lower") %} 31 | {% for el in sub_classes %} 32 | {% if loop.first %} 33 | .. rubric:: {{_("Nested Elements")}} 34 | 35 | Note that only complex elements are listed here. Elements that resolve to simple 36 | types (int, str, bool) are inlined. 37 | 38 | .. autosummary:: 39 | :template: sdformat_element.rst 40 | :toctree: 41 | {% endif %} 42 | 43 | {{ class_path }}.{{ el }} 44 | {% endfor %} 45 | 46 | {% endif %} 47 | {% endfor %} -------------------------------------------------------------------------------- /doc/source/_templates/sdformat_model.rst: -------------------------------------------------------------------------------- 1 | {% set sdformat_version = name[0] + name[1] + "." + name[2:] %} 2 | {% set title = "SDFormat " + sdformat_version + " Bindings" %} 3 | 4 | .. py:module:: {{fullname}} 5 | 6 | {{ title | underline}} 7 | 8 | .. warning:: 9 | If you want to use these bindings explicitly, you need to import them 10 | first:: 11 | 12 | import skbot.ignition.sdformat.bindings.{{name}} as {{name}} 13 | 14 | Scikit-bot's version-specific SDFormat bindings are realized as a set of 15 | dataclasses. Each class corresponds to a unique element found within SDFormat 16 | XML and has an attribute for every attribute and child of the corresponding 17 | SDFormat element. Names generally match the names used within SDFormat; however, 18 | are adapted to python convention where needed. 19 | 20 | .. currentmodule:: {{ fullname.split(".")[:-1] | join(".") }} 21 | 22 | .. rubric:: {{ _("Elements") }} 23 | 24 | .. autosummary:: 25 | :template: sdformat_element.rst 26 | :toctree: sdformat_{{ sdformat_version }} 27 | 28 | {% for module_name in modules %} 29 | {% set class_path = module_name.split(".")[-1] %} 30 | {{ name }}.{{ class_path }}.{{ class_path.capitalize() }} 31 | {% if class_path == "state" %} 32 | {% if sdformat_version not in ["v1.0", "v1.2"] %} 33 | {{ name }}.{{ class_path }}.Model 34 | {% endif %} 35 | {% endif %} 36 | {% endfor %} 37 | -------------------------------------------------------------------------------- /doc/source/_templates/transform_class.rst: -------------------------------------------------------------------------------- 1 | {{ fullname | escape | underline}} 2 | 3 | .. currentmodule:: {{ module }} 4 | 5 | .. autoclass:: {{ objname }} 6 | 7 | {% if attributes %} 8 | .. rubric:: {{ _('Attributes') }} 9 | 10 | .. autosummary:: 11 | {% for item in attributes %} 12 | ~{{ name }}.{{ item }} 13 | {% endfor %} 14 | {% endif %} 15 | 16 | {% if methods %} 17 | .. rubric:: {{ _('Method Summary') }} 18 | 19 | .. autosummary:: 20 | {% if "__call__" in members %} 21 | __call__ 22 | {% endif %} 23 | {% for item in methods %} 24 | {% if not item == "__init__" %} 25 | ~{{ name }}.{{ item }} 26 | {% endif %} 27 | {%- endfor %} 28 | {% if "__inverse_transform__" in members %} 29 | __inverse_transform__ 30 | {% endif %} 31 | {% endif %} 32 | 33 | .. rubric:: Methods 34 | 35 | {% if methods %} 36 | {% if "__call__" in members %} 37 | .. automethod:: __call__ 38 | {% endif %} 39 | {% for item in methods %} 40 | {% if not item == "__init__" %} 41 | .. automethod:: {{ item }} 42 | {% endif %} 43 | {%- endfor %} 44 | {% if "__inverse_transform__" in members %} 45 | .. automethod:: __inverse_transform__ 46 | {% endif %} 47 | {% endif %} 48 | -------------------------------------------------------------------------------- /doc/source/api_reference.rst: -------------------------------------------------------------------------------- 1 | .. _api-reference: 2 | 3 | API Reference 4 | ============= 5 | 6 | Scikt-bot is structured into a set of independent modules which you can import via 7 | 8 | .. autosummary:: 9 | :toctree: _autosummary 10 | 11 | skbot.ignition 12 | skbot.inverse_kinematics 13 | skbot.ros 14 | skbot.trajectory 15 | skbot.transform 16 | 17 | Some modules have additional dependencies on top of the scipy stack. To 18 | use these modules you will have to install scikit-bot with the respective extra 19 | requirements, e.g. you will have to use 20 | 21 | .. code-block:: bash 22 | 23 | pip install -e .[ignition] 24 | 25 | to use :mod:`skbot.ignition`. Whenever a module has additional requirements it will state 26 | these in it's module-level documentation. 27 | 28 | .. _Ignitionrobotics: https://ignitionrobotics.org/ 29 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | Scikit-bot 2 | ========== 3 | 4 | .. toctree:: 5 | :hidden: 6 | 7 | install 8 | _gallery/index.rst 9 | api_reference 10 | 11 | You have found to the documentation of scikit-bot. You can find API 12 | documentation and examples here. 13 | 14 | Scikit-bot is a robotics library that aims to address the large heterogeneity of code 15 | in the robotics community by providing a selection of commonly used algorithms 16 | and functions in an easy access manner. It focusses on begin easy to use and on 17 | enabling rapid prototyping. 18 | 19 | Scikit-bot includes functions for coordinate transformations and projections, 20 | functions for trajectory generation and kinematics, and many more, yet, it is 21 | not a simulator or robotics framework. It is a library meant to complement 22 | existing tools. With scikit-bot, you can quickly try things in python first, get it 23 | working, and then integrate it into your framework of choice; potentially, using 24 | one of our existing modules to interface with the framework, saving you more 25 | time. 26 | 27 | Scikit-bot follows a python-first approach. Typically, robotics frameworks are written 28 | in plain C or C++ and, if it is possible to use via python, support is 29 | rudementary at best. In scikit-bot, python is a first-class citizen with the majority 30 | of the code being written in plain python. The rationale is that the majority of 31 | work done in robotics is prototyping, and prototyping is much (much) faster in 32 | an interpreted language than a compiled one. It is significantly more efficient 33 | to write code that works first (leveraging pythons amazing debugging 34 | capabilities) and then optimize for speed, than it is to debug broken, fast 35 | code. 36 | 37 | Curious? Check out our detailed :ref:`API documentation` to see 38 | if there is anything that meets your need. Got an idea for a new feature or 39 | spotted something that is missing? Submit a `feature request`_. 40 | 41 | .. _`feature request`: https://github.com/FirefoxMetzger/ropy/issues 42 | -------------------------------------------------------------------------------- /doc/source/install.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | Basic Installation 5 | ------------------ 6 | 7 | .. code-block:: bash 8 | 9 | pip install scikit-bot 10 | 11 | Install with Ignition Support 12 | ----------------------------- 13 | 14 | To use scikit-bot together with Ignition_, you first have to install Ignition 15 | following the `official instruction`_. Then you can install 16 | scikit-bot with additional dependencies 17 | 18 | .. code-block:: bash 19 | 20 | pip install scikit-bot[ignition] 21 | 22 | **Note**: This also works incrementally, meaning that you can do this on 23 | top of an existing scikit-bot installation. 24 | 25 | Development Installation 26 | ------------------------ 27 | 28 | This installation sets up an editable installation with docs, linting, and 29 | testing dependencies. If you want to develop modules that have additional 30 | depdencies, you need to install these dependencies on top of this installation. 31 | If you encounter difficulties during the setup, feel free to create a `new issue`_. 32 | 33 | .. code-block:: bash 34 | 35 | git clone https://github.com/FirefoxMetzger/ropy.git 36 | cd ropy 37 | pip install -e .[docs,linting,testing] 38 | 39 | Before you submit a PR make sure all tests pass, that all code is covered by tests, 40 | that you follow our code-style conventions, and that the documentation builds without 41 | errors. Here is how to perform each task (in the projects root directory). 42 | 43 | - Run all tests: ``pytest`` 44 | - Coverage: ``coverage run -m pytest .`` followed by ``coverage report`` 45 | - Code-Style: ``black .`` 46 | - Docs: ``sphinx-build -b html doc/source doc/build`` 47 | 48 | 49 | .. _Ignition: https://ignitionrobotics.org/home 50 | .. _`official instruction`: https://ignitionrobotics.org/docs/dome 51 | .. _`new issue`: https://github.com/FirefoxMetzger/ropy/issues -------------------------------------------------------------------------------- /examples/README.rst: -------------------------------------------------------------------------------- 1 | Examples 2 | ======== 3 | 4 | A collection of examples on how to use various modules of this library. 5 | 6 | .. note:: 7 | 8 | We need your help to populate this page. Please share any projects or 9 | examples that you create and - if you permit - we will add them here. 10 | -------------------------------------------------------------------------------- /examples/sdformat-read-write-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/examples/sdformat-read-write-thumb.png -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools>=42", "wheel"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [tool.coverage.run] 6 | branch = true 7 | source = ["./skbot"] 8 | 9 | [tool.coverage.report] 10 | omit = [ 11 | "./skbot/ignition/messages.py", 12 | "*tests*", 13 | "./skbot/ignition/sdformat/bindings/*", 14 | "./skbot/ignition/sdformat/create_frame_graph.py", 15 | "./skbot/ignition/sdformat/generic_sdf/*", 16 | "./skbot/_numba_overloads.py" 17 | ] 18 | 19 | exclude_lines = [ 20 | "pragma: no cover", 21 | "raise NotImplementedError", 22 | "@register_jitable", 23 | "@numba.jit", 24 | "@numba.generated_jit" 25 | ] 26 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = scikit-bot 3 | version = attr: skbot.__version__ 4 | description = Robotics in Python 5 | long_description = file: Readme.md 6 | license_file = LICENSE 7 | classifiers = 8 | Programming Language :: Python :: 3 9 | License :: OSI Approved :: Apache Software License 10 | Framework :: Robot Framework :: Library 11 | 12 | [options] 13 | packages = find: 14 | 15 | [flake8] 16 | exclude = 17 | # auto-generated file for ign-msgs bindings 18 | skbot/ignition/messages.py 19 | 20 | [semantic_release] 21 | branch = main 22 | version_variable = skbot/__init__.py:__version__ 23 | commit_parser = semantic_release.history.scipy_parser 24 | build_command = pip install -e .[build] && python -m build --sdist --wheel --outdir dist/ 25 | commit_subject = REL: Release scikit-bot v{version} 26 | major_on_zero = false 27 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | install_requires = ["numpy == 1.21.5", "scipy == 1.7.3", "numba == 0.55.1"] 4 | 5 | extras_require = { 6 | "ignition": [ 7 | "pyzmq == 22.3.0", 8 | "betterproto == 1.2.5", 9 | "psutil == 5.9.0", 10 | "requests == 2.27.1", 11 | "xsdata == 22.1", 12 | "lxml == 4.6.5", 13 | "cachetools == 5.0.0", 14 | ], 15 | "docs": [ 16 | "sphinx == 4.4.0", 17 | "numpydoc == 1.2", 18 | "sphinx-autodoc-typehints == 1.17.0", 19 | "matplotlib == 3.5.1", 20 | "pydata-sphinx-theme == 0.8.0", 21 | "cachetools == 5.0.0", 22 | "sphinx-gallery == 0.10.1", 23 | "xsdata == 22.1", 24 | "lxml == 4.6.5", 25 | ], 26 | "linting": ["flake8 == 4.0.1", "black == 21.12b0"], 27 | "testing": ["pytest == 7.0.1", "coverage[toml] == 6.3.2"], 28 | "dev": [ 29 | "lxml-stubs == 0.3.1", 30 | "python-semantic-release == 7.25.2", 31 | ], 32 | "build": [ 33 | "build == 0.7.0", 34 | "twine == 3.8.0", 35 | ], 36 | } 37 | 38 | # Note: This is a shim, because I am used to developing 39 | # under pip install -e . which PEP517 doesn't support (yet?) 40 | if __name__ == "__main__": 41 | setuptools.setup( 42 | install_requires=install_requires, 43 | extras_require=extras_require, 44 | package_data={"skbot": ["ignition/sdformat/schema/**/*.xsd"]}, 45 | ) 46 | -------------------------------------------------------------------------------- /skbot/__init__.py: -------------------------------------------------------------------------------- 1 | # register the numpy overloads 2 | from . import _numba_overloads 3 | 4 | __version__ = "0.14.0" 5 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/__init__.py: -------------------------------------------------------------------------------- 1 | from .sdformat import loads, dumps, get_version 2 | from .transform_factory import to_frame_graph 3 | from .load_as_generic import loads_generic 4 | from . import generic_sdf 5 | 6 | __all__ = ["get_version", "loads", "dumps", "to_frame_graph", "loads_generic"] 7 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/__init__.py: -------------------------------------------------------------------------------- 1 | # nothing here 2 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v10/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .model import Model 8 | from .physics import Physics 9 | from .scene import Scene 10 | from .sensor import Sensor 11 | from .state import State 12 | from .visual import Visual 13 | from .world import World 14 | 15 | __all__ = [ 16 | "Actor", 17 | "Collision", 18 | "Geometry", 19 | "Joint", 20 | "Light", 21 | "Link", 22 | "Model", 23 | "Physics", 24 | "Scene", 25 | "Sensor", 26 | "State", 27 | "Visual", 28 | "World", 29 | ] 30 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v10/light.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import Optional 3 | 4 | __NAMESPACE__ = "sdformat/v1.0/light.xsd" 5 | 6 | 7 | @dataclass 8 | class Light: 9 | class Meta: 10 | name = "light" 11 | 12 | origin: Optional[str] = field( 13 | default=None, 14 | metadata={ 15 | "type": "Element", 16 | "namespace": "", 17 | }, 18 | ) 19 | diffuse: Optional[str] = field( 20 | default=None, 21 | metadata={ 22 | "type": "Element", 23 | "namespace": "", 24 | "required": True, 25 | }, 26 | ) 27 | specular: Optional[str] = field( 28 | default=None, 29 | metadata={ 30 | "type": "Element", 31 | "namespace": "", 32 | "required": True, 33 | }, 34 | ) 35 | attenuation: Optional[str] = field( 36 | default=None, 37 | metadata={ 38 | "type": "Element", 39 | "namespace": "", 40 | }, 41 | ) 42 | direction: Optional[str] = field( 43 | default=None, 44 | metadata={ 45 | "type": "Element", 46 | "namespace": "", 47 | "required": True, 48 | }, 49 | ) 50 | spot: Optional[str] = field( 51 | default=None, 52 | metadata={ 53 | "type": "Element", 54 | "namespace": "", 55 | }, 56 | ) 57 | name: str = field( 58 | default="__default__", 59 | metadata={ 60 | "type": "Attribute", 61 | }, 62 | ) 63 | type: Optional[str] = field( 64 | default=None, 65 | metadata={ 66 | "type": "Attribute", 67 | "required": True, 68 | }, 69 | ) 70 | cast_shadows: bool = field( 71 | default=False, 72 | metadata={ 73 | "type": "Attribute", 74 | }, 75 | ) 76 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v10/scene.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import Optional 3 | 4 | __NAMESPACE__ = "sdformat/v1.0/scene.xsd" 5 | 6 | 7 | @dataclass 8 | class Scene: 9 | class Meta: 10 | name = "scene" 11 | 12 | ambient: Optional[str] = field( 13 | default=None, 14 | metadata={ 15 | "type": "Element", 16 | "namespace": "", 17 | }, 18 | ) 19 | background: Optional["Scene.Background"] = field( 20 | default=None, 21 | metadata={ 22 | "type": "Element", 23 | "namespace": "", 24 | }, 25 | ) 26 | shadows: Optional[str] = field( 27 | default=None, 28 | metadata={ 29 | "type": "Element", 30 | "namespace": "", 31 | }, 32 | ) 33 | fog: Optional[str] = field( 34 | default=None, 35 | metadata={ 36 | "type": "Element", 37 | "namespace": "", 38 | }, 39 | ) 40 | grid: Optional[str] = field( 41 | default=None, 42 | metadata={ 43 | "type": "Element", 44 | "namespace": "", 45 | }, 46 | ) 47 | 48 | @dataclass 49 | class Background: 50 | sky: Optional[str] = field( 51 | default=None, 52 | metadata={ 53 | "type": "Element", 54 | "namespace": "", 55 | }, 56 | ) 57 | rgba: Optional[str] = field( 58 | default=None, 59 | metadata={ 60 | "type": "Attribute", 61 | "required": True, 62 | "pattern": r"(\s*\+?(\d+(\.\d*)?|\.\d+|\d+\.\d+[eE][-\+]?[0-9]+)\s+){3}\+?(\d+(\.\d*)?|\.\d+|\d+\.\d+[eE][-\+]?[0-9]+)\s*", 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v12/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .model import Model 8 | from .physics import Physics 9 | from .scene import Scene 10 | from .sensor import Sensor 11 | from .state import State 12 | from .visual import Visual 13 | from .world import World 14 | 15 | __all__ = [ 16 | "Actor", 17 | "Collision", 18 | "Geometry", 19 | "Joint", 20 | "Light", 21 | "Link", 22 | "Model", 23 | "Physics", 24 | "Scene", 25 | "Sensor", 26 | "State", 27 | "Visual", 28 | "World", 29 | ] 30 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v13/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .model import Model 8 | from .physics import Physics 9 | from .scene import Scene 10 | from .sdf import Sdf 11 | from .sensor import Sensor 12 | from .state import State 13 | from .visual import Visual 14 | from .world import World 15 | 16 | __all__ = [ 17 | "Actor", 18 | "Collision", 19 | "Geometry", 20 | "Joint", 21 | "Light", 22 | "Link", 23 | "Model", 24 | "Physics", 25 | "Scene", 26 | "Sdf", 27 | "Sensor", 28 | "State", 29 | "Visual", 30 | "World", 31 | ] 32 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v13/sdf.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import List, Optional 3 | from .actor import Actor 4 | from .light import Light 5 | from .model import Model 6 | from .world import World 7 | 8 | __NAMESPACE__ = "sdformat/v1.3/sdf.xsd" 9 | 10 | 11 | @dataclass 12 | class Sdf: 13 | """ 14 | SDFormat base element. 15 | 16 | Parameters 17 | ---------- 18 | world: The world element encapsulates an entire world description 19 | including: models, scene, physics, joints, and plugins 20 | model: The model element defines a complete robot or any other 21 | physical object. 22 | actor: 23 | light: The light element describes a light source. 24 | version: Version number of the SDFormat specification. 25 | """ 26 | 27 | class Meta: 28 | name = "sdf" 29 | 30 | world: List[World] = field( 31 | default_factory=list, 32 | metadata={ 33 | "type": "Element", 34 | "namespace": "", 35 | }, 36 | ) 37 | model: List[Model] = field( 38 | default_factory=list, 39 | metadata={ 40 | "type": "Element", 41 | "namespace": "", 42 | }, 43 | ) 44 | actor: List[Actor] = field( 45 | default_factory=list, 46 | metadata={ 47 | "type": "Element", 48 | "namespace": "", 49 | }, 50 | ) 51 | light: List[Light] = field( 52 | default_factory=list, 53 | metadata={ 54 | "type": "Element", 55 | "namespace": "", 56 | }, 57 | ) 58 | version: Optional[str] = field( 59 | default=None, 60 | metadata={ 61 | "type": "Attribute", 62 | "required": True, 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v14/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .model import Model 8 | from .physics import Physics 9 | from .scene import Scene 10 | from .sdf import Sdf 11 | from .sensor import Sensor 12 | from .state import State 13 | from .visual import Visual 14 | from .world import World 15 | 16 | __all__ = [ 17 | "Actor", 18 | "Collision", 19 | "Geometry", 20 | "Joint", 21 | "Light", 22 | "Link", 23 | "Model", 24 | "Physics", 25 | "Scene", 26 | "Sdf", 27 | "Sensor", 28 | "State", 29 | "Visual", 30 | "World", 31 | ] 32 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v14/sdf.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import List, Optional 3 | from .actor import Actor 4 | from .light import Light 5 | from .model import Model 6 | from .world import World 7 | 8 | __NAMESPACE__ = "sdformat/v1.4/sdf.xsd" 9 | 10 | 11 | @dataclass 12 | class Sdf: 13 | """ 14 | SDFormat base element. 15 | 16 | Parameters 17 | ---------- 18 | world: The world element encapsulates an entire world description 19 | including: models, scene, physics, joints, and plugins 20 | model: The model element defines a complete robot or any other 21 | physical object. 22 | actor: 23 | light: The light element describes a light source. 24 | version: Version number of the SDFormat specification. 25 | """ 26 | 27 | class Meta: 28 | name = "sdf" 29 | 30 | world: List[World] = field( 31 | default_factory=list, 32 | metadata={ 33 | "type": "Element", 34 | "namespace": "", 35 | }, 36 | ) 37 | model: List[Model] = field( 38 | default_factory=list, 39 | metadata={ 40 | "type": "Element", 41 | "namespace": "", 42 | }, 43 | ) 44 | actor: List[Actor] = field( 45 | default_factory=list, 46 | metadata={ 47 | "type": "Element", 48 | "namespace": "", 49 | }, 50 | ) 51 | light: List[Light] = field( 52 | default_factory=list, 53 | metadata={ 54 | "type": "Element", 55 | "namespace": "", 56 | }, 57 | ) 58 | version: Optional[str] = field( 59 | default=None, 60 | metadata={ 61 | "type": "Attribute", 62 | "required": True, 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v15/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .material import Material 8 | from .model import Model as ModelModel 9 | from .physics import Physics 10 | from .scene import Scene 11 | from .sdf import Sdf 12 | from .sensor import Sensor 13 | from .state import ( 14 | Model as StateModel, 15 | State, 16 | ) 17 | from .visual import Visual 18 | from .world import World 19 | 20 | __all__ = [ 21 | "Actor", 22 | "Collision", 23 | "Geometry", 24 | "Joint", 25 | "Light", 26 | "Link", 27 | "Material", 28 | "ModelModel", 29 | "Physics", 30 | "Scene", 31 | "Sdf", 32 | "Sensor", 33 | "StateModel", 34 | "State", 35 | "Visual", 36 | "World", 37 | ] 38 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v15/sdf.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import List, Optional 3 | from .actor import Actor 4 | from .light import Light 5 | from .model import Model 6 | from .world import World 7 | 8 | __NAMESPACE__ = "sdformat/v1.5/sdf.xsd" 9 | 10 | 11 | @dataclass 12 | class Sdf: 13 | """ 14 | SDFormat base element. 15 | 16 | Parameters 17 | ---------- 18 | world: The world element encapsulates an entire world description 19 | including: models, scene, physics, joints, and plugins 20 | model: The model element defines a complete robot or any other 21 | physical object. 22 | actor: 23 | light: The light element describes a light source. 24 | version: Version number of the SDFormat specification. 25 | """ 26 | 27 | class Meta: 28 | name = "sdf" 29 | 30 | world: List[World] = field( 31 | default_factory=list, 32 | metadata={ 33 | "type": "Element", 34 | "namespace": "", 35 | }, 36 | ) 37 | model: List[Model] = field( 38 | default_factory=list, 39 | metadata={ 40 | "type": "Element", 41 | "namespace": "", 42 | }, 43 | ) 44 | actor: List[Actor] = field( 45 | default_factory=list, 46 | metadata={ 47 | "type": "Element", 48 | "namespace": "", 49 | }, 50 | ) 51 | light: List[Light] = field( 52 | default_factory=list, 53 | metadata={ 54 | "type": "Element", 55 | "namespace": "", 56 | }, 57 | ) 58 | version: Optional[str] = field( 59 | default=None, 60 | metadata={ 61 | "type": "Attribute", 62 | "required": True, 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v16/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .material import Material 8 | from .model import Model as ModelModel 9 | from .physics import Physics 10 | from .scene import Scene 11 | from .sdf import Sdf 12 | from .sensor import Sensor 13 | from .state import ( 14 | Model as StateModel, 15 | State, 16 | ) 17 | from .visual import Visual 18 | from .world import World 19 | 20 | __all__ = [ 21 | "Actor", 22 | "Collision", 23 | "Geometry", 24 | "Joint", 25 | "Light", 26 | "Link", 27 | "Material", 28 | "ModelModel", 29 | "Physics", 30 | "Scene", 31 | "Sdf", 32 | "Sensor", 33 | "StateModel", 34 | "State", 35 | "Visual", 36 | "World", 37 | ] 38 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v17/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .material import Material 8 | from .model import Model as ModelModel 9 | from .physics import Physics 10 | from .scene import Scene 11 | from .sdf import Sdf 12 | from .sensor import Sensor 13 | from .state import ( 14 | Model as StateModel, 15 | State, 16 | ) 17 | from .visual import Visual 18 | from .world import World 19 | 20 | __all__ = [ 21 | "Actor", 22 | "Collision", 23 | "Geometry", 24 | "Joint", 25 | "Light", 26 | "Link", 27 | "Material", 28 | "ModelModel", 29 | "Physics", 30 | "Scene", 31 | "Sdf", 32 | "Sensor", 33 | "StateModel", 34 | "State", 35 | "Visual", 36 | "World", 37 | ] 38 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v18/__init__.py: -------------------------------------------------------------------------------- 1 | from .actor import Actor 2 | from .collision import Collision 3 | from .geometry import Geometry 4 | from .joint import Joint 5 | from .light import Light 6 | from .link import Link 7 | from .material import Material 8 | from .model import Model as ModelModel 9 | from .physics import Physics 10 | from .scene import Scene 11 | from .sdf import Sdf 12 | from .sensor import Sensor 13 | from .state import ( 14 | Model as StateModel, 15 | State, 16 | ) 17 | from .visual import Visual 18 | from .world import World 19 | 20 | __all__ = [ 21 | "Actor", 22 | "Collision", 23 | "Geometry", 24 | "Joint", 25 | "Light", 26 | "Link", 27 | "Material", 28 | "ModelModel", 29 | "Physics", 30 | "Scene", 31 | "Sdf", 32 | "Sensor", 33 | "StateModel", 34 | "State", 35 | "Visual", 36 | "World", 37 | ] 38 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/bindings/v18/sdf.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | from typing import List, Optional 3 | from .actor import Actor 4 | from .light import Light 5 | from .model import Model 6 | from .world import World 7 | 8 | __NAMESPACE__ = "sdformat/v1.8/sdf.xsd" 9 | 10 | 11 | @dataclass 12 | class Sdf: 13 | """SDFormat base element that can include one model, actor, light, or 14 | worlds. 15 | 16 | A user of multiple worlds could run parallel instances of 17 | simulation, or offer selection of a world at runtime. 18 | 19 | Parameters 20 | ---------- 21 | world: The world element encapsulates an entire world description 22 | including: models, scene, physics, and plugins. 23 | model: The model element defines a complete robot or any other 24 | physical object. 25 | actor: A special kind of model which can have a scripted motion. 26 | This includes both global waypoint type animations and skeleton 27 | animations. 28 | light: The light element describes a light source. 29 | version: Version number of the SDFormat specification. 30 | """ 31 | 32 | class Meta: 33 | name = "sdf" 34 | 35 | world: List[World] = field( 36 | default_factory=list, 37 | metadata={ 38 | "type": "Element", 39 | "namespace": "", 40 | }, 41 | ) 42 | model: Optional[Model] = field( 43 | default=None, 44 | metadata={ 45 | "type": "Element", 46 | "namespace": "", 47 | }, 48 | ) 49 | actor: Optional[Actor] = field( 50 | default=None, 51 | metadata={ 52 | "type": "Element", 53 | "namespace": "", 54 | }, 55 | ) 56 | light: Optional[Light] = field( 57 | default=None, 58 | metadata={ 59 | "type": "Element", 60 | "namespace": "", 61 | }, 62 | ) 63 | version: Optional[str] = field( 64 | default=None, 65 | metadata={ 66 | "type": "Attribute", 67 | "required": True, 68 | }, 69 | ) 70 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/exceptions.py: -------------------------------------------------------------------------------- 1 | from xsdata.exceptions import ParserError as XSDataParserError 2 | 3 | 4 | class ParseError(XSDataParserError): 5 | pass 6 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/actor.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Actor(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Actor` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/atmosphere.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Atmosphere(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Atmosphere` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/audio_sink.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class AudioSink(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`AudioSink` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/audio_source.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class AudioSource(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`AudioSource` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/battery.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Battery(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Battery` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/collision.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Collision(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Collision` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/collision_engine.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class CollisionEngine(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`CollisionEngine` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/geometry.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Geometry(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Geometry` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/gripper.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Gripper(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Gripper` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/gui.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Gui(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Gui` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/inertial.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Inertial(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Inertial` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/light.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | from typing import List, Any 3 | 4 | from .base import ElementBase, NamedPoseBearing, Pose, should_warn_unsupported 5 | from .frame import Frame 6 | 7 | 8 | class Light(ElementBase): 9 | def __init__(self, *, sdf_version: str) -> None: 10 | if should_warn_unsupported(): 11 | warnings.warn("`Light` has not been implemented yet.") 12 | super().__init__(sdf_version=sdf_version) 13 | 14 | 15 | # class Light(NamedPoseBearing): 16 | # def __init__( 17 | # self, 18 | # *, 19 | # name: str, 20 | # pose: Pose = None, 21 | # frames: List["Frame"] = None, 22 | # ) -> None: 23 | # super().__init__(name=name, pose=pose) 24 | 25 | # self.frames = frames 26 | 27 | # if frames is None: 28 | # self.frames = list() 29 | 30 | # @classmethod 31 | # def from_specific(cls, light: Any, *, version: str) -> "Light": 32 | # raise NotImplementedError() 33 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/light_state.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Light(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Light` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/link_state.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Link(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Link` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/material.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Material(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Material` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/model_state.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Model(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Model` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/noise.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Noise(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Noise` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/origin.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | from .base import ElementBase, Pose 4 | 5 | 6 | class Origin(ElementBase): 7 | def __init__(self, *, pose: Pose = None, sdf_version: str) -> None: 8 | super().__init__(sdf_version=sdf_version) 9 | 10 | if pose is None: 11 | self.pose = Pose(sdf_version=sdf_version) 12 | else: 13 | self.pose = pose 14 | 15 | @classmethod 16 | def from_specific(cls, specific: Any, *, version: str) -> "Origin": 17 | return Origin( 18 | pose=Pose.from_specific(specific.pose, version=version), 19 | sdf_version=version, 20 | ) 21 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/particle_emitter.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class ParticleEmitter(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`ParticleEmitter` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/physics.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Physics(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Physics` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/plugin.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Plugin(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Plugin` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/population.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Population(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Population` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/projector.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Projector(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Projector` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/scene.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Scene(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Scene` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/state.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class State(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`State` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/surface.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Surface(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Surface` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/transceiver.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Transceiver(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Transceiver` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/urdf.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class URDF(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`URDF` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/generic_sdf/visual.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | from .base import ElementBase, should_warn_unsupported 4 | 5 | 6 | class Visual(ElementBase): 7 | def __init__(self, *, sdf_version: str) -> None: 8 | if should_warn_unsupported(): 9 | warnings.warn("`Visual` has not been implemented yet.") 10 | super().__init__(sdf_version=sdf_version) 11 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/load_as_generic.py: -------------------------------------------------------------------------------- 1 | from . import sdformat 2 | from .generic_sdf.sdf import Sdf 3 | 4 | 5 | def loads_generic(sdf: str): 6 | """Turn a SDFormat string into an object tree. 7 | 8 | The returned object tree is oppinionated. In addition to converting the 9 | tree, it does the following: 10 | 11 | - Some SDFormat elements are ignored/not implemented (contributions welcome!) 12 | - its variable names differ from SDFormat 13 | 14 | - If an element may have multiple children of the same kind, they 15 | corresponding attribute uses plural instead of singular, e.g. 16 | ``models`` instead of ``model``. 17 | - If different SDF versions use different names for the same variable, 18 | they are converted into the name used in the most recent SDFormat 19 | version. Old names are still available via a @property and will raise 20 | a depreciation warning. 21 | 22 | - it converts all vectors to numpy arrays 23 | - it resolves includes, removes them, and inserts the included element 24 | - it appends __model__ to frame references where necessary 25 | 26 | Parameters 27 | ---------- 28 | sdf : str 29 | A string containing SDFormat XML. 30 | 31 | Returns 32 | ------- 33 | root : generic.Sdf 34 | The root/sdf element of the generic SDF representation. 35 | 36 | """ 37 | 38 | version = sdformat.get_version(sdf) 39 | specific_tree = sdformat.loads(sdf) 40 | generic_tree = Sdf.from_specific(specific_tree, version=version) 41 | 42 | return generic_tree 43 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/collision.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/light.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/model.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/physics.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/scene.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/state.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.0/visual.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.2/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.3/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.4/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.5/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.6/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.7/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/sdformat/schema/1.8/types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /skbot/ignition/transformations.py: -------------------------------------------------------------------------------- 1 | from math import tan 2 | import numpy as np 3 | from numpy.typing import ArrayLike 4 | 5 | from ..transform.utils3d import FrustumProjection, EulerRotation 6 | from ..transform.base import Link 7 | 8 | 9 | class FrustumProjection(FrustumProjection): 10 | """Frustum based intrinsic camera transformation 11 | 12 | This links behavior is identical to 13 | :class:`skbot.transform.FrustumProjection`; however, here the camera points 14 | along the x-axis instead of the z-axis. This is done to match the behavior 15 | of ignition, which applies the robotic coordinate frame standard instead of 16 | the computer vision standard here. 17 | 18 | Parameters 19 | ---------- 20 | hfov : float 21 | The angle of the viewing frustum in radians. It is assumed to be less than 22 | pi (180°). 23 | image_shape : ArrayLike 24 | The shape (height, width) of the image plane in pixels. 25 | 26 | See Also 27 | -------- 28 | :class:`skbot.transform.FrustumProjection` 29 | 30 | Notes 31 | ----- 32 | This function assumes that ``hfov`` is less than pi (180°). 33 | 34 | Points outside the viewing frustum will still be projected; however, their values lie 35 | outside the applicable pixel range. 36 | 37 | """ 38 | 39 | def __init__(self, hfov: float, image_shape: ArrayLike) -> None: 40 | super().__init__(hfov, image_shape) 41 | 42 | self.initial_rotation = EulerRotation("yz", (-90, 90), degrees=True) 43 | 44 | def transform(self, x: ArrayLike) -> np.ndarray: 45 | x = self.initial_rotation.transform(x) 46 | return super().transform(x) 47 | -------------------------------------------------------------------------------- /skbot/inverse_kinematics/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Inverse Kinematics (IK) Algorithms. 3 | 4 | .. currentmodule:: skbot.inverse_kinematics 5 | 6 | The algorithms in this module find values for a set of joints (a glorified list 7 | of :class:`tf.Links `) such that the score of one or more 8 | Targets is below a given threshold. 9 | 10 | Targets are specified between two :class:`tf.Frames ` 11 | that are connected by a sequence of :class:`tf.Links ` 12 | (the kinematic chain). For example, the :class:`PositionTarget` can be used to 13 | specify that a position in a robot's tool frame should have a certain position 14 | when transformed into the world frame. The available IK algorithms will then 15 | attempt to find values for the chosen joints - which are assumed to be between 16 | these two frames - such that the value of the transformed tool position and the 17 | value of the world position is closer than some threshold. 18 | 19 | Targets 20 | ------- 21 | 22 | .. autosummary:: 23 | :toctree: 24 | 25 | PositionTarget 26 | RotationTarget 27 | 28 | IK Algorithms 29 | ------------- 30 | 31 | .. autosummary:: 32 | :toctree: 33 | 34 | skbot.inverse_kinematics.ccd 35 | skbot.inverse_kinematics.gd 36 | 37 | """ 38 | 39 | from .targets import Target, PositionTarget, RotationTarget 40 | from .cyclic_coordinate_descent import ccd 41 | from .gradient_descent import gd 42 | 43 | __all__ = ["ccd", "gd", "Target", "PositionTarget", "RotationTarget"] 44 | -------------------------------------------------------------------------------- /skbot/ros/__init__.py: -------------------------------------------------------------------------------- 1 | """ Interface with `ROS `_. 2 | 3 | Functions 4 | --------- 5 | 6 | .. autosummary:: 7 | :toctree: _autosummary 8 | 9 | create_frame_graph 10 | 11 | """ 12 | 13 | from .generic import create_frame_graph 14 | 15 | __all__ = ["create_frame_graph"] 16 | -------------------------------------------------------------------------------- /skbot/ros/generic/__init__.py: -------------------------------------------------------------------------------- 1 | from .urdf import create_frame_graph 2 | 3 | __all__ = ["create_frame_graph"] 4 | -------------------------------------------------------------------------------- /skbot/trajectory/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Interpolation of parameterized curves. 3 | 4 | A collection of functions to compute positions along parameterized trajectories. 5 | Here, trajectories are not limited to 3-dimensional space. Instead, they are 6 | arbitrary mathematical paths with time parameterization. This means that a 7 | trajectory may represent a sequence of positions in world space, but it may just 8 | as well represent a sequence of poses in joint space, or a sequence of 9 | combined positions and velocities. 10 | 11 | .. autosummary:: 12 | :toctree: 13 | 14 | skbot.trajectory.linear_trajectory 15 | skbot.trajectory.spline_trajectory 16 | 17 | """ 18 | 19 | from .spline import spline_trajectory 20 | from .linear import linear_trajectory 21 | from . import utils 22 | 23 | __all__ = ["spline_trajectory", "linear_trajectory", "utils"] 24 | -------------------------------------------------------------------------------- /skbot/transform/metrics.py: -------------------------------------------------------------------------------- 1 | """ Search Metrics for skbot.transform.Frame 2 | """ 3 | 4 | from .base import BreadthFirst, DepthFirst 5 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Double pendulum with base 5 | 1.0 6 | model-1_3.sdf 7 | model-1_4.sdf 8 | model.sdf 9 | 10 | 11 | Steve Peters 12 | scpeters@osrfoundation.org 13 | 14 | 15 | 16 | A double pendulum with cylindrical shapes and rotation on the x axis. 17 | The pendulum is attached to a heavy base that rests on the ground. 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/thumbnails/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/double_pendulum/thumbnails/1.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/thumbnails/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/double_pendulum/thumbnails/2.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/thumbnails/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/double_pendulum/thumbnails/3.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/thumbnails/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/double_pendulum/thumbnails/4.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/double_pendulum/thumbnails/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/double_pendulum/thumbnails/5.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/finger.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/finger.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/finger.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/hand.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/hand.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/hand.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link0.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link0.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link0.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link1.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link1.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link2.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link2.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link3.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link3.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link3.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link4.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link4.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link4.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link5.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link5.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link5.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link6.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link6.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link6.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link7.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/meshes/collision/link7.stl -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/collision/link7.stl:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/finger.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/hand.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link0.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link1.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link2.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link3.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link4.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link5.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link6.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/meshes/visual/link7.dae:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | panda 4 | 1.0.0 5 | model.sdf 6 | 7 | 8 | Franka Emika Panda robot compatible with Ignition and MoveIt2 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/model.config:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/model.sdf:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/thumbnails/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/thumbnails/1.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/thumbnails/1.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/thumbnails/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FirefoxMetzger/scikit-bot/215beb612f3951d0f7e80a8f75d253184d57caac/tests/ignition/sdf/robots/panda/thumbnails/2.png -------------------------------------------------------------------------------- /tests/ignition/sdf/robots/panda/thumbnails/2.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=C:\Users\Sebastian\Downloads\panda_ign-master.zip 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/audio_14.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 1 1 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | file://foo.mp3 17 | 2.0 18 | 1.0 19 | false 20 | 0 0 0 0 0 0 21 | collision 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/bad_syntax_double.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | bad 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/bad_syntax_pose.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | bad 0 0 0 0 0 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/bad_syntax_vector.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 1 bad 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/box_bad_test.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0.5 0.0 0.0 0.0 0.0 6 | 7 | 8 | 0.05 9 | 10 | 11 | 12 | 13 | 14 | 1.0 1.0 1.0 15 | 16 | 17 | 18 | 19 | 20 | 21 | 1.0 1.0 1.0 22 | 23 | 24 | 25 | 26 | 27 | .1 28 | .1 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/custom_and_unknown_elements.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/empty.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 9 | 10 | 11 | 0 0 1 12 | 100 100 13 | 14 | 15 | 16 | 17 | 0xffff 18 | 19 | 20 | 21 | 100 22 | 50 23 | 24 | 25 | 26 | 27 | 28 | false 29 | 30 | 31 | 0 0 1 32 | 100 100 33 | 34 | 35 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | true 47 | 0 0 10 0 0 0 48 | 0.8 0.8 0.8 1 49 | 0.2 0.2 0.2 1 50 | 51 | 1000 52 | 0.9 53 | 0.01 54 | 0.001 55 | 56 | -0.5 0.1 -0.9 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/empty_axis.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | link1 9 | link2 10 | 11 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/empty_invalid.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/empty_noversion.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/empty_road_sph_coords.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 15 | 16 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/ignore_sdf_in_namespaced_elements.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/ignore_sdf_in_plugin.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/include_with_interface_api_reposture.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 2 0 0 0 0 6 | 7 | 8 | nonexistent_reposture_test_file.nonce_1 9 | M0 10 | 1 0 0 0 0 0 11 | 12 | 13 | 1 0 0 0 0 0 14 | 15 | 0 0 3 0 0 0 16 | 17 | 18 | nonexistent_reposture_test_file.nonce_1 19 | M1 20 | 0 0 0 0.1 0 0 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | test_model 7 | 8 | 9 | 10 | test_model 11 | override_model_name 12 | 1 2 3 0 0 0 13 | true 14 | 15 | 16 | 17 | 18 | test_model/model.sdf 19 | test_model_with_file 20 | 21 | 22 | 23 | test_light 24 | 25 | 26 | 27 | test_light 28 | override_light_name 29 | 4 5 6 0 0 0 30 | 31 | 32 | 33 | test_actor 34 | 35 | 36 | 37 | test_actor 38 | override_actor_name 39 | 7 8 9 0 0 0 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes_1.5.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | test_model 7 | 8 | 9 | 10 | test_light 11 | 12 | 13 | 14 | test_actor 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes_missing_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | missing_model 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes_missing_uri.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes_model_without_sdf.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | box_missing_config 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/includes_without_top_level.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | model_without_top_level 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/inertial_complete.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0.01 0 0.02 0 0 0 7 | 17.982 8 | 9 | 0.125569 10 | 0.0008 11 | -0.000499757 12 | 0.0972062 13 | -0.0005 14 | 0.117937 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/inertial_invalid.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0.01 0 0.02 0 0 0 7 | -1 8 | 9 | 0.125569 10 | 0.0008 11 | -0.000499757 12 | 0.0972062 13 | -0.0005 14 | 0.117937 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/invalid_version.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_axis_infinite_limits.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | link1 12 | link2 13 | 14 | 1 0 0 15 | 16 | 17 | 18 | link3 19 | link4 20 | 21 | 1 0 0 22 | 23 | -1.5 24 | 1.5 25 | 2.5 26 | 5.5 27 | 28 | 29 | 30 | 31 | link4 32 | link5 33 | 34 | 1 0 0 35 | 36 | -inf 37 | inf 38 | inf 39 | inf 40 | 41 | 42 | 43 | 44 | link5 45 | link6 46 | 47 | 1 0 0 48 | 49 | -inf 50 | inf 51 | -1 52 | -1 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_axis_xyz_normalization.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | link1 12 | link2 13 | 14 | 0 0 1 15 | 16 | 17 | 18 | link3 19 | link4 20 | 21 | 10 0 0 22 | 23 | 24 | 25 | link4 26 | link5 27 | 28 | -10 0 0 29 | 30 | 31 | 0 10 0 32 | 33 | 34 | 35 | link5 36 | link6 37 | 38 | 0 0 0 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_child_frame.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 0 0 1 0 0 0 12 | 13 | 14 | 0 0 10 0 0 0 15 | 16 | 17 | 1 0 0 0 0 0 18 | 19 | 20 | 0 1 0 0 0 0 21 | parent_link 22 | child_frame 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_child_world.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | link 10 | world 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_child.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | link 10 | invalid 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_parent.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | invalid 10 | link 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_parent_same_as_child.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | link 10 | link 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_resolved_parent_same_as_child.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | L1 8 | J2 9 | 10 | 1 0 0 11 | 12 | 13 | 14 | 15 | J1 16 | L2 17 | 18 | 0 1 0 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_self_child.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | link 10 | self 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_invalid_self_parent.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | self 10 | link 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_nested_parent_child.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0 0 1 0 0 0 7 | 8 | 9 | 1 1 0 0 0 0 10 | 11 | 12 | 1 0 0 0 0 0 13 | 14 | 15 | 0 0 1 1.570796326790 0 0 16 | 17 | 18 | 19 | 20 | 21 | 0 0 10 0 1.57079632679 0 22 | 23 | 24 | 25 | 1 0 0 0 0 0 26 | 27 | 28 | 29 | 30 | 1 0 0 0 0 0 31 | M1::L1 32 | L1 33 | 34 | 35 | 36 | 0 1 0 0 0 0 37 | F1 38 | L1 39 | 40 | 41 | 42 | 0 0 1 0 0 0 43 | L1 44 | M1::L2 45 | 46 | 47 | 48 | 49 | 0 0 1 0 0 0 50 | L1 51 | M1::F1 52 | 53 | 54 | 55 | 56 | 0 0 1 0 0 0 57 | L1 58 | M1::M2 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_parent_frame.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 0 0 1 0 0 0 12 | 13 | 14 | 0 0 10 0 0 0 15 | 16 | 17 | 1 0 0 0 0 0 18 | 19 | 20 | 0 1 0 0 0 0 21 | parent_frame 22 | child_link 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_parent_world.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | 7 | 8 | 0 0 3 0 0 0 9 | world 10 | link 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/joint_sensors.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | link1 8 | link2 9 | 10 | 10 11 12 0 0 0 11 | 12 | parent 13 | parent_to_child 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/light.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 2 2 0 0 0 5 | 1 0 0 1 6 | .1 .1 .1 1 7 | 8 | 20 9 | 0.2 10 | 0.8 11 | 0.01 12 | 13 | false 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/link_duplicate_cousin_collisions.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 0 1 0 0 0 0 8 | 9 | 10 | 11 | 2 0 0 0 0 0 12 | 13 | 0 2 0 0 0 0 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/link_duplicate_cousin_visuals.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 0 1 0 0 0 0 8 | 9 | 10 | 11 | 2 0 0 0 0 0 12 | 13 | 0 2 0 0 0 0 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/link_duplicate_sibling_collisions.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/link_duplicate_sibling_visuals.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/material.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0.4 0.2 0.3 1.0 8 | 0.2 0.5 0.1 1.0 9 | 0.7 0.3 0.5 0.9 10 | 1.0 0.0 0.2 1.0 11 | false 12 | 5.1 13 | true 14 | 15 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | my_normal_map 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/material_invalid.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1.5 0 0 1 8 | 0 0.1 9 | 0.1 0.2 -1 10 | 0.1 0.2 0.3 0.4 0.5 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/material_normal_map_missing.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/material_script_no_uri.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/material_valid.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 0.1 0.2 8 | 0 0.1 0.2 0.3 9 | 0.12 0.23 0.34 0.56 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_canonical_link.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 0 2 0 0 0 0 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_duplicate_joints.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | link1 10 | link2 11 | 12 | 13 | link2 14 | link3 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_duplicate_links.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 1 1 0 0 0 6 | 7 | 8 | 2 2 2 0 0 0 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_attached_to_joint.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | P 8 | C 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_attached_to_nested_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_invalid_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_invalid_attached_to_cycle.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_frame_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 0 1 0 0 0 0 10 | 11 | 12 | 13 | 0 0 1 0 0 0 14 | 15 | 16 | 0 0 2 0 0 0 17 | 18 | 19 | 0 0 3 0 0 0 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_include_with_interface_api.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | double_pendulum.toml 7 | 1 0 0 0 0 0 8 | 9 | value1 10 | value2 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_canonical_link.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 0 2 0 0 0 0 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_frame_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 0 1 0 0 0 0 10 | 11 | 12 | 13 | 0 2 0 0 0 0 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_frame_relative_to_cycle.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 0 1 0 0 0 0 10 | 11 | 12 | 13 | 0 2 0 0 0 0 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_joint_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 1 0 0 0 0 8 | P 9 | C 10 | 11 | 12 | 0 2 0 0 0 0 13 | P 14 | C 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_link_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 2 0 0 0 0 0 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_placement_frame.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 0 2 0 0 0 0 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_invalid_root_reference.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_joint_axis_expressed_in.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 1.5707963267948966 0 6 | 7 | 8 | 2 0 0 0 -1.5707963267948966 0 9 | 10 | 11 | 0 0 1 0 0 0 12 | P1 13 | C1 14 | 15 | 0 0 1 16 | 17 | 18 | 19 | 20 | 3 0 0 0 1.5707963267948966 0 21 | 22 | 23 | 0 0 2 0 0 0 24 | P2 25 | C2 26 | 27 | 0 0 1 28 | 29 | 30 | 31 | 4 0 0 0 0 0 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_joint_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 1.5707963267948966 0 6 | 7 | 8 | 2 0 0 0 -1.5707963267948966 0 9 | 10 | 11 | 0 0 1 0 0 0 12 | P1 13 | C1 14 | 15 | 16 | 17 | 3 0 0 0 1.5707963267948966 0 18 | 19 | 20 | 0 0 2 0 0 0 21 | P2 22 | C2 23 | 24 | 25 | 4 0 0 0 0 0 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_link_joint_same_name.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 0 2 0 0 0 0 9 | 10 | 11 | 0 0 3 0 0 0 12 | base 13 | attachment 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_link_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 1.5707963267948966 0 6 | 7 | 8 | 2 0 0 0 0 0 9 | 10 | 11 | 3 0 0 0 0 0 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_multi_nested_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | world 8 | outer_link 9 | 10 | 11 | 12 | 1 0 0 0 1.5707963267948966 0 13 | 14 | 15 | world 16 | mid_link 17 | 18 | 19 | 20 | 21 | 22 | world 23 | inner_link 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_nested_frame_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | L 13 | F 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_nested_model_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 0 0 0 1.5707963267948966 0 7 | 8 | 9 | 10 | 2 0 0 0 0 0 11 | 12 | 13 | 14 | 3 0 0 0 0 0 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_nested_static_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_relative_to_nested_reference.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 0 0 0 1.5707963267948966 0 7 | 8 | 0 1 0 0 0 0 9 | 10 | 11 | L1 12 | L2 13 | 14 | 15 | 0 0 1 0 0 0 16 | 17 | 18 | 1 0 0 0 0 0 19 | 20 | 21 | 0 1 0 1.5707963267948966 0 0 22 | 23 | 1 0 0 0 -1.5707963267948966 0 24 | 25 | 26 | 27 | 28 | 2 0 0 0 0 0 29 | 30 | 31 | 32 | 3 0 0 0 0 0 33 | 34 | 35 | 36 | 4 0 0 0 0 0 37 | 38 | 39 | 40 | 5 0 0 0 0 0 41 | 42 | 43 | 44 | 6 0 0 0 0 0 45 | 46 | 47 | 48 | 7 0 0 0 0 0 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_with_placement_frame_attribute.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 0 10 0 0 0 5 | 6 | 1 0 0 0 0 0 7 | 8 | 9 | 0 2 0 0 0 0 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/model_without_links.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_canonical_link.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_explicit_canonical_link.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | parent 13 | child 14 | 15 | 1 0 0 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_model_cross_references.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_multiple_elements_error_world.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | model_actor_light 11 | 1 1 1 1.570796326794895 0 0 12 | nested_model 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/nested_without_links_invalid.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/placement_frame_missing_pose.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | placement_frame_without_pose 7 | test_model_with_frames 8 | L4 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/root_duplicate_models.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/root_multiple_models.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | true 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/scene_with_sky.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0.3 0.4 0.5 7 | 0.6 0.7 0.8 8 | true 9 | true 10 | true 11 | 12 | 13 | 4 14 | 21 15 | 16 | 1.2 17 | 1.5 18 | 0.2 19 | 0.9 20 | 0.1 0.2 0.3 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/stricter_semantics_desc.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/unrecognized_elements.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 1 0 0 0 6 | This should trigger a warning 7 | 8 | This should also trigger a warning 9 | 10 | Warnings time 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/unrecognized_elements_with_namespace.sdf: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 0 0 1 0 0 0 8 | 9 | This should be ignored because it's namespaced 10 | 11 | 12 | 13 | This should also be ignored 14 | 15 | 16 | 17 | Ignore this one tooo 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/whitespace.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | test_model 7 | 8 | 9 | 10 | 11 | test_model 12 | 13 | override_model_name 14 | 15 | 16 | 17 | test_light 18 | 19 | 20 | 21 | 22 | test_light 23 | 24 | override_light_name 25 | 4 5 6 0 0 0 26 | 27 | 28 | 29 | test_actor 30 | 31 | 32 | 33 | 34 | test_actor 35 | 36 | override_actor_name 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_duplicate.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_frame_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_frame_invalid_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_frame_invalid_attached_to_scope.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_frame_invalid_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 0 0 0 0 0 7 | 8 | 9 | 2 0 0 0 0 0 10 | 11 | 12 | 13 | 0 3 0 0 0 0 14 | 15 | 16 | 17 | 0 4 0 0 0 0 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_frame_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 0 0 0 0 0 8 | 9 | 10 | 2 0 0 0 0 0 11 | 12 | 13 | 14 | 15 | 16 | 0 3 0 0 0 0 17 | 18 | 19 | 20 | 21 | 3 0 0 0 0 0 22 | 23 | 24 | 25 | 0 0 4 0 0 0 26 | 27 | 28 | 29 | 30 | 0 0 5 0 0 0 31 | 32 | 33 | 34 | 35 | 0 0 6 0 0 0 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_include_with_interface_api.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | double_pendulum.toml 7 | 1 0 0 0 0 0 8 | 9 | value1 10 | value2 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_invalid_root_reference.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 0 0 6 | 7 | 8 | 9 | 10 | __root__ 11 | link2 12 | 13 | 14 | 15 | link1 16 | __root__ 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 1 0 0 0 0 0 33 | 34 | 35 | 36 | test_model_with_frames 37 | __root__ 38 | 1 0 0 0 0 0 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_model_frame_same_name.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 0 0 0 0 0 7 | 8 | 9 | 10 | 11 | 0 2 0 0 0 0 12 | 13 | 14 | 15 | 16 | 0 0 3 0 0 0 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_nested_frame.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | L 16 | top_level_model_frame 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_nested_frame_attached_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | L 15 | F0 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_nested_model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | parent 15 | child 16 | 17 | 1 0 0 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_noname.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_relative_to_nested_reference.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0 0 1.5707963267948966 0 6 | 7 | 0 1 0 0 0 0 8 | 9 | 10 | L1 11 | L2 12 | 13 | 14 | 0 0 1 0 0 0 15 | 16 | 17 | 1 0 0 0 0 0 18 | 19 | 20 | 0 1 0 1.5707963267948966 0 0 21 | 22 | 1 0 0 0 -1.5707963267948966 0 23 | 24 | 25 | 26 | 27 | 2 0 0 0 0 0 28 | 29 | 30 | 3 0 0 0 0 0 31 | 32 | 33 | 4 0 0 0 0 0 34 | 35 | 36 | 5 0 0 0 0 0 37 | 38 | 39 | 6 0 0 0 0 0 40 | 41 | 42 | 7 0 0 0 0 0 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /tests/ignition/sdf/sdformat/world_sibling_same_names.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.1 6 | 0.5 7 | 8 | 9 | 10 | true 11 | 12 | 0.1 13 | 0.5 14 | 2.2 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/camera.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | 8 | 9 | 1.13446 10 | 11 | 1920 12 | 1080 13 | 14 | 15 | 0.01 16 | 100 17 | 18 | 19 | 20 | 21 | 22 | 1 0 1 0 0 0 23 | random_link 24 | camera_link 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/force_torque.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | link1 8 | link2 9 | 10 | 10 11 12 0 0 0 11 | 12 | parent 13 | parent_to_child 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/frames.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | L 14 | L2 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/joint_attached_to_parent.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | true 8 | 9 | 10 | 0 0 0 0 0 1.57079632679 11 | 12 | 13 | 0 0 0 1.57079632679 0 1.57079632679 14 | 15 | 16 | 1 2 3 1.57079632679 0 1.57079632679 17 | true 18 | 19 | 20 | 1 0 1 0 0 0 21 | A 22 | B 23 | 24 | true 25 | 26 | 27 | 28 | 4 2 1 0 0 0 29 | B 30 | C 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/light_only.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 10 20 0 0 0 5 | 6 | -123.5 7 | -1.0 8 | 2.0 9 | -100.2 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/population.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 2 3 0 0 0 8 | true 9 | 10 | 11 | 12 | 13 | 14 | 3 3 3 0 0 0 15 | 16 | 17 | 1 2 3 0 0 0 18 | true 19 | 20 | 21 | 22 | grid 23 | 2 24 | 7 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/pose_testing.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | true 8 | 9 | 10 | 0 0 0 0 0 1.57079632679 11 | true 12 | 13 | 14 | 0 0 0 1.57079632679 0 1.57079632679 15 | true 16 | 17 | 18 | 1 2 3 1.57079632679 0 1.57079632679 19 | true 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v15/projector.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 2 3 0 0 0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v17/fuel_include.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | 0 0 0 0 -0 1.5708 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v17/light_only.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 10 20 0 0 0 5 | 6 | -123.5 7 | -1.0 8 | 2.0 9 | -100.2 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v17/population.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 2 3 0 0 0 8 | true 9 | 10 | 11 | 12 | 13 | 3 3 3 0 0 0 14 | 15 | 16 | 1 2 3 0 0 0 17 | true 18 | 19 | 20 | 21 | grid 22 | 2 23 | 7 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/audio_source.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 2 3 0 0 0 6 | 7 | /dev/radio0 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/camera.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | 8 | 9 | 1.13446 10 | 11 | 1920 12 | 1080 13 | 14 | 15 | 0.01 16 | 100 17 | 18 | 19 | 20 | 21 | 22 | 1 0 1 0 0 0 23 | random_link 24 | camera_link 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | 0 0 0 0 -0 1.5708 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_no_pose.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_placement_frame.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/AndrejOrsula/models/fidget_spinner 6 | 0 0 0 0 -0 1.5708 7 | rotor 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 2 3 0 0 0 5 | 6 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 7 | 0 0 0 0 -0 1.5708 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_rename.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | table1 7 | 0 0 0 0 -0 1.5708 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_unknown_server.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://unknown-server.org/1.0/Gambit/models/Pitcher Base 6 | table1 7 | 0 0 0 0 -0 1.5708 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/fuel_include_world.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | 0 0 0 0 -0 1.5708 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/gripper.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 2 3 0 0 0 6 | true 7 | 8 | 9 | 0 0 0 0 0 1.57079632679 10 | true 11 | 12 | 13 | 0 0 0 1.57079632679 0 1.57079632679 14 | true 15 | 16 | 17 | 1 2 3 1.57079632679 0 1.57079632679 18 | 19 | 20 | 21 | D 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/invalid_joint_type.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | 8 | 9 | 1 0 1 0 0 0 10 | random_link 11 | camera_link 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/invalid_same_scope_twice.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 6 | table1 7 | 0 0 0 0 -0 1.5708 8 | 9 | 10 | https://fuel.ignitionrobotics.org/1.0/Gambit/models/Pitcher Base 11 | table1 12 | 4 4 4 0 0 0 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/invalid_sensor_type.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 2 3 0 0 0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/light_only.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 10 20 0 0 0 5 | 6 | -123.5 7 | -1.0 8 | 2.0 9 | -100.2 10 | 11 | 1.8 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/panda_cam.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 0 0.5 0 0 0 6 | 7 | 8 | 9 | 1.13446 10 | 11 | 1920 12 | 1080 13 | 14 | 15 | 0.01 16 | 100 17 | 18 | 19 | 20 | 21 | 22 | world 23 | camera_link 24 | 25 | 26 | 27 | https://fuel.ignitionrobotics.org/1.0/AndrejOrsula/models/panda 28 | panda 29 | 30 | 31 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/population.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 2 3 0 0 0 8 | true 9 | 10 | 11 | 12 | 13 | 3 3 3 0 0 0 14 | 15 | 16 | 1 2 3 0 0 0 17 | true 18 | 19 | 20 | 21 | grid 22 | 2 23 | 7 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/pose_relative_to.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.794 0 0 0 -0 1.5708 6 | 7 | 8 | 0 0 1.015 0 0 0 9 | 10 | 11 | -0.2379753249844183 -0.036526411138213755 0.025 0 0 0 12 | 13 | 14 | 15 | true 16 | 2 0 1.75 -0 0.282863 3.14 17 | 18 | 0 -.2 0 0 0 0 19 | 20 | 30.0 21 | main_camera 22 | 23 | 1.13446 24 | 25 | 1920 26 | 1080 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/pose_testing.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 2 3 0 0 0 7 | true 8 | 9 | 10 | 0 0 0 0 0 1.57079632679 11 | true 12 | 13 | 14 | 0 0 0 1.57079632679 0 1.57079632679 15 | true 16 | 17 | 18 | 1 2 3 1.57079632679 0 1.57079632679 19 | true 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/ignition/sdf/v18/projector.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 1 2 3 0 0 0 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/ignition/test_subscriber.py: -------------------------------------------------------------------------------- 1 | import skbot.ignition as ign 2 | import subprocess 3 | import time 4 | import psutil 5 | import pytest 6 | import shutil 7 | 8 | 9 | HAS_IGN = False if shutil.which("ign") is None else True 10 | 11 | 12 | @pytest.fixture 13 | def ign_instance(): 14 | """Start a gazebo instance to test subscription""" 15 | 16 | gazebo = subprocess.Popen(["ign", "gazebo", "shapes.sdf", "-s"]) 17 | 18 | # wait for gazebo to start 19 | time.sleep(7) 20 | 21 | yield 22 | 23 | pobj = psutil.Process(gazebo.pid) 24 | for c in pobj.children(recursive=True): 25 | c.kill() 26 | pobj.kill() 27 | gazebo.terminate() 28 | 29 | 30 | @pytest.mark.skipif(not HAS_IGN, reason="Ignition executable not found.") 31 | def test_subscriber_raw(ign_instance): 32 | with ign.Subscriber("/clock") as clock: 33 | msg = clock.recv() 34 | 35 | assert msg.sim.sec == 0 and msg.sim.nsec == 0 36 | 37 | 38 | @pytest.mark.skipif(not HAS_IGN, reason="Ignition executable not found.") 39 | def test_subscriber_parse(ign_instance): 40 | def parse_clock(msg): 41 | return ign.messages.Clock().parse(msg[2]) 42 | 43 | with ign.Subscriber("/clock", parser=parse_clock) as clock: 44 | msg = clock.recv() 45 | 46 | assert msg.sim.sec == 0 and msg.sim.nsec == 0 47 | 48 | 49 | @pytest.mark.skipif(not HAS_IGN, reason="Ignition executable not found.") 50 | def test_subscriber_noblock(ign_instance): 51 | with pytest.raises(IOError): 52 | with ign.Subscriber("/clock") as clock: 53 | msg = clock.recv(blocking=False) 54 | 55 | 56 | @pytest.mark.skipif(not HAS_IGN, reason="Ignition executable not found.") 57 | def test_subscriber_address_error(): 58 | with pytest.raises(IOError): 59 | with ign.Subscriber("/clock") as clock: 60 | msg = clock.recv() 61 | -------------------------------------------------------------------------------- /tests/ignition/test_transformations.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import numpy as np 3 | 4 | import skbot.ignition as ign 5 | 6 | 7 | @pytest.mark.parametrize( 8 | "point_in, fov, im_shape, point_out", 9 | [ 10 | ((1, 0, 0), np.pi / 3, (240, 320), (120, 160)), 11 | ((3.5, 0, 0), np.pi / 2, (240, 320), (120, 160)), 12 | ((1, 0, 0), 1.5 * np.pi, (480, 640), (240, 320)), 13 | ((1, 1, 480 / 640), np.pi / 2, (480, 640), (0, 0)), 14 | ((1, -1, -480 / 640), np.pi / 2, (480, 640), (480, 640)), 15 | ], 16 | ) 17 | def test_perspective_transform(point_in, fov, im_shape, point_out): 18 | proj = ign.FrustumProjection(fov, im_shape) 19 | assert np.allclose(proj.transform(point_in), point_out) 20 | -------------------------------------------------------------------------------- /tests/inverse_kinematics/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import skbot.ignition as ign 3 | import skbot.transform as tf 4 | from typing import Tuple, List, Union 5 | from pathlib import Path 6 | 7 | 8 | joint_types = Union[tf.RotationalJoint, tf.PrismaticJoint] 9 | sdf_folder = Path(__file__).parents[1] / "ignition" / "sdf" 10 | ign.sdformat.generic_sdf.base.WARN_UNSUPPORTED = False 11 | 12 | 13 | @pytest.fixture() 14 | def panda(): 15 | sdf_string = (sdf_folder / "robots" / "panda" / "model.sdf").read_text() 16 | base_frame = ign.sdformat.to_frame_graph(sdf_string) 17 | 18 | tool_frame = base_frame.find_frame(".../panda_link8") 19 | 20 | joints = list() 21 | for link in tool_frame.links_between(base_frame): 22 | if isinstance(link, (tf.RotationalJoint, tf.PrismaticJoint)): 23 | joints.append(link) 24 | 25 | for value, joint in zip([0, -0.785, 0, -2.356, 0, 1.571, 0.785], reversed(joints)): 26 | joint.param = value 27 | return base_frame, joints 28 | 29 | 30 | @pytest.fixture() 31 | def double_pendulum(): 32 | sdf_string = (sdf_folder / "robots" / "double_pendulum" / "model.sdf").read_text() 33 | base_frame = ign.sdformat.to_frame_graph(sdf_string) 34 | 35 | tool_frame = base_frame.find_frame(".../lower_link") 36 | 37 | joints = list() 38 | for link in tool_frame.links_between(base_frame): 39 | if isinstance(link, (tf.RotationalJoint, tf.PrismaticJoint)): 40 | joints.append(link) 41 | 42 | return base_frame, joints 43 | 44 | 45 | @pytest.fixture() 46 | def circle_bot(): 47 | world = tf.Frame(3, name="world") 48 | ellbow = tf.Frame(3, name="ellbow") 49 | tool = tf.Frame(3, name="tool") 50 | 51 | rotate = tf.RotationalJoint((0, 0, 1), angle=0) 52 | reach = tf.PrismaticJoint((-1, 0, 0), upper_limit=10, lower_limit=-10) 53 | 54 | rotate(world, ellbow) 55 | reach(ellbow, tool) 56 | 57 | return world, [rotate, reach] 58 | -------------------------------------------------------------------------------- /tests/trajectory/test_linear.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import skbot.trajectory as rtj 3 | import pytest 4 | 5 | 6 | @pytest.mark.parametrize( 7 | "t,t_out,t_min,t_max", 8 | [ 9 | (0, [1, 2, 3], 0, 1), 10 | (1, [6, 7, 8], 0, 1), 11 | (1.5 / 5, [2.5, 3.5, 4.5], 0, 1), 12 | (3, [3.5, 4.5, 5.5], -2, 8), 13 | ], 14 | ) 15 | def test_even_spacing(t, t_out, t_min, t_max): 16 | control_points = np.array( 17 | [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] 18 | ) 19 | 20 | estimate = rtj.linear_trajectory(t, control_points, t_min=t_min, t_max=t_max) 21 | assert np.allclose(estimate, t_out) 22 | 23 | 24 | @pytest.mark.parametrize( 25 | "t,t_out,t_k", 26 | [ 27 | (0, (1, 2, 3), (0, 0.3, 0.5, 0.55, 0.75, 1)), 28 | (0.5, (3, 4, 5), (0, 0.3, 0.5, 0.55, 0.75, 1)), 29 | (0.75, (5, 6, 7), (0, 0.3, 0.5, 0.55, 0.75, 1)), 30 | ], 31 | ) 32 | def test_custom_spacing(t, t_out, t_k): 33 | control_points = np.array( 34 | [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] 35 | ) 36 | 37 | estimate = rtj.linear_trajectory(t, control_points, t_control=t_k) 38 | assert np.allclose(estimate, t_out) 39 | -------------------------------------------------------------------------------- /tests/trajectory/test_spline.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import skbot.trajectory as rtj 3 | import pytest 4 | 5 | 6 | @pytest.mark.parametrize( 7 | "t,t_out,t_min,t_max", 8 | [ 9 | (0, [1, 2, 3], 0, 1), 10 | (1, [6, 7, 8], 0, 1), 11 | (1.5 / 5, [2.5, 3.5, 4.5], 0, 1), 12 | (3, [3.5, 4.5, 5.5], -2, 8), 13 | ], 14 | ) 15 | def test_even_spacing(t, t_out, t_min, t_max): 16 | control_points = np.array( 17 | [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] 18 | ) 19 | 20 | estimate = rtj.spline_trajectory(t, control_points, t_min=t_min, t_max=t_max) 21 | assert np.allclose(estimate, t_out) 22 | 23 | 24 | @pytest.mark.parametrize( 25 | "t,t_out,t_k", 26 | [ 27 | (0, (1, 2, 3), (0, 0.3, 0.5, 0.55, 0.75, 1)), 28 | (0.5, (3, 4, 5), (0, 0.3, 0.5, 0.55, 0.75, 1)), 29 | (0.75, (5, 6, 7), (0, 0.3, 0.5, 0.55, 0.75, 1)), 30 | ], 31 | ) 32 | def test_custom_spacing(t, t_out, t_k): 33 | control_points = np.array( 34 | [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] 35 | ) 36 | 37 | estimate = rtj.spline_trajectory(t, control_points, t_control=t_k) 38 | assert np.allclose(estimate, t_out) 39 | 40 | 41 | def test_derivative(): 42 | x = np.linspace(0, 2, 10) 43 | y = (x**2)[:, None] 44 | t = np.linspace(0, 2, 100) 45 | dy = (2 * t)[:, None] 46 | estimate = rtj.spline_trajectory(t, y, t_control=x, derivative=1) 47 | 48 | assert np.allclose(estimate, dy) 49 | 50 | 51 | def test_1d_trajectory(): 52 | t = np.linspace(0, 1, 100) 53 | x = np.linspace(0, 1, 50) 54 | 55 | x_interpolated = rtj.spline_trajectory(t, x, t_control=x) 56 | 57 | assert np.allclose(x_interpolated.T, t) 58 | -------------------------------------------------------------------------------- /tests/trajectory/test_trajectory_utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pytest 3 | 4 | import skbot.trajectory as trj 5 | 6 | 7 | @pytest.mark.parametrize( 8 | ["t", "f", "expected"], 9 | [ 10 | [np.linspace(0, 5, 200), lambda x: x, 0.5 * 5**2], 11 | [np.linspace(0, 5, 500), lambda x: x**2, 1 / 3 * 5**3], 12 | [np.linspace(0, 0, 200), lambda x: x, 0], 13 | ], 14 | ) 15 | def test_integration(t, f, expected): 16 | f_val = f(t) 17 | estimate = trj.utils.integral(f_val, t) 18 | assert np.isclose(estimate, expected) 19 | 20 | 21 | def test_cumulative_integration(): 22 | t = np.linspace(0, 5, 200) 23 | f = lambda x: x 24 | f_val = f(t) 25 | estimate = trj.utils.cumulative_integral(f_val, t) 26 | expected = 0.5 * t**2 27 | assert np.allclose(estimate, expected) 28 | -------------------------------------------------------------------------------- /tests/transform/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | import skbot.transform as tf 4 | 5 | 6 | @pytest.fixture() 7 | def simple_graph(): 8 | frames = [tf.Frame(1, name=f"frame{str(idx)}") for idx in range(10)] 9 | 10 | def directional(idxA, idxB): 11 | # "degenerate" links that track path cost 12 | tf.CustomLink(1, 1, lambda x: x + 1)( 13 | frames[idxA], frames[idxB], add_inverse=False 14 | ) 15 | 16 | def undirectional(idxA, idxB): 17 | tf.CustomLink(1, 1, lambda x: x + 1)(frames[idxA], frames[idxB]) 18 | tf.CustomLink(1, 1, lambda x: x + 1)(frames[idxB], frames[idxA]) 19 | 20 | undirectional(0, 2) 21 | undirectional(3, 2) 22 | undirectional(4, 2) 23 | undirectional(6, 2) 24 | undirectional(4, 5) 25 | undirectional(5, 9) 26 | undirectional(5, 6) 27 | undirectional(6, 8) 28 | 29 | directional(6, 7) 30 | directional(2, 1) 31 | directional(5, 8) 32 | 33 | return frames 34 | -------------------------------------------------------------------------------- /tests/transform/test_functions.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import skbot.transform as tf 3 | import pytest 4 | 5 | 6 | @pytest.mark.parametrize( 7 | ("vector", "direction", "amount", "expected"), 8 | [ 9 | ((1, 1), (0, 1), (1, 0), (1, 2)), 10 | ((1, 1, 0), (0, 0, 1), (1, 0, 0), (1, 1, 1)), 11 | ((1, 1, 0), (0, 0, 1), (1, 1, 0), (1, 1, 2)), 12 | ( 13 | (1, 1, 1, 0, 0, 0), 14 | (0, 0, 0, 0, 1, 1), 15 | (1, 1, 0, 0, 0, 0), 16 | (1, 1, 1, 0, 2, 2), 17 | ), 18 | ], 19 | ) 20 | def test_shear(vector, direction, amount, expected): 21 | result = tf.shear(vector, direction, amount) 22 | assert np.allclose(result, expected) 23 | 24 | 25 | @pytest.mark.parametrize( 26 | ("vector", "scalar", "expected"), 27 | [ 28 | ((1, 1), (1, 2), (1, 2)), 29 | ((1, 1, 0), (1, 2, 3), (1, 2, 0)), 30 | ((1, 1, 1, 0, 0, 0), (0, 0, 0, 0, 1, 1), (0, 0, 0, 0, 0, 0)), 31 | ], 32 | ) 33 | def test_scale(vector, scalar, expected): 34 | result = tf.scale(vector, scalar) 35 | assert np.allclose(result, expected) 36 | -------------------------------------------------------------------------------- /tests/transform/test_joints.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import skbot.transform as tf 3 | import numpy as np 4 | 5 | 6 | def test_prismatic(): 7 | joint = tf.PrismaticJoint((1, 0, 0), upper_limit=10, lower_limit=0) 8 | 9 | expected = (1, 0, 0) 10 | result = joint.transform((0, 0, 0)) 11 | assert np.allclose(expected, result) 12 | 13 | joint.amount = 5 14 | assert joint.param == 5 15 | 16 | expected = (5, 0, 0) 17 | result = joint.transform((0, 0, 0)) 18 | assert np.allclose(expected, result) 19 | 20 | 21 | def test_prismatic_out_of_bounds(): 22 | joint = tf.PrismaticJoint((0, 0, 1)) 23 | 24 | with pytest.raises(ValueError): 25 | joint.amount = 10 26 | 27 | 28 | def test_rotational_out_of_bounds(): 29 | joint = tf.RotationalJoint((0, 0, 1), angle=90, degrees=True) 30 | 31 | with pytest.raises(ValueError): 32 | joint.angle = -45 33 | 34 | 35 | def test_angle_joint(): 36 | joint = tf.AngleJoint(angle=45, degrees=True) 37 | 38 | assert joint.param == np.pi / 4 39 | 40 | joint.angle = np.pi / 2 41 | assert joint.param == np.pi / 2 42 | 43 | with pytest.raises(ValueError): 44 | joint.angle = 3 * np.pi 45 | -------------------------------------------------------------------------------- /tests/transform/test_projections.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pytest 3 | 4 | import skbot.transform as tf 5 | 6 | 7 | @pytest.mark.parametrize( 8 | "parent_coords, child_coords, direction, amount", 9 | [ 10 | ((1, 1, 0), 1, ((1, 0, 0),), ((0, 1, 0),)), 11 | ((1, 1), 0.25, ((4, 0),), ((0, 1),)), 12 | ((4, 1), 1, ((4, 0),), ((0, 1),)), 13 | ], 14 | ) 15 | def test_1d_projections(parent_coords, child_coords, direction, amount): 16 | proj = tf.projections.PerspectiveProjection(direction, amount) 17 | result = proj.transform(parent_coords) 18 | assert np.allclose(result, child_coords) 19 | -------------------------------------------------------------------------------- /tools/ignition/fallback_types.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /tools/ignition/generate_bindings.py: -------------------------------------------------------------------------------- 1 | from xsdata.models.config import GeneratorConfig 2 | from xsdata.codegen.transformer import SchemaTransformer 3 | from pathlib import Path 4 | import os 5 | 6 | from generate_xsd_schema import gen_bindings 7 | 8 | sdf_versions = ["1.0", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8"] 9 | 10 | # download the SDF templates (spare-checkout woop woop) 11 | sdf_repo = "https://github.com/ignitionrobotics/sdformat.git" 12 | sdf_location = Path("tools/ignition/sdformat") 13 | current_path = os.getcwd() 14 | try: 15 | sdf_location.mkdir(exist_ok=False, parents=True) 16 | except FileExistsError: 17 | # has already been checked out ... ensure we are up to date 18 | os.chdir(sdf_location) 19 | os.system("git pull") 20 | os.chdir(current_path) 21 | else: 22 | # fresh (sparse) checkout 23 | os.chdir(sdf_location) 24 | os.system(f"git clone {sdf_repo} --no-checkout . --depth 1") 25 | os.system("git sparse-checkout init --cone") 26 | os.system("git sparse-checkout set sdf") 27 | os.chdir(current_path) 28 | 29 | # convert the SDF templates to XSD 30 | xsd_location = Path("skbot/ignition/sdformat/schema/") 31 | for version in sdf_versions: 32 | source_path = sdf_location / "sdf" / version 33 | out_dir = xsd_location / version 34 | out_dir.mkdir(exist_ok=True, parents=True) 35 | 36 | gen_bindings(source_path, out_dir, ns_prefix=f"sdformat/v{version}") 37 | 38 | # build python bindings from XSD 39 | config = GeneratorConfig.read(Path(__file__).parent / "sdf_bindings_config.xml") 40 | for version in sdf_versions: 41 | config.output.package = ( 42 | f"skbot.ignition.sdformat.bindings.v{version.replace('.', '')}" 43 | ) 44 | source_path = xsd_location / version 45 | uris = [x.absolute().as_uri() for x in source_path.iterdir()] 46 | if uris: 47 | tf = SchemaTransformer(print=False, config=config) 48 | tf.process(uris) 49 | -------------------------------------------------------------------------------- /tools/ignition/sdf_bindings_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | generated 5 | dataclasses 6 | filenames 7 | NumPy 8 | true 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | --------------------------------------------------------------------------------