scikit-robot 0.4.3__tar.gz → 0.4.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {scikit_robot-0.4.3/scikit_robot.egg-info → scikit_robot-0.4.4}/PKG-INFO +1 -1
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/pyproject.toml +1 -1
- {scikit_robot-0.4.3 → scikit_robot-0.4.4/scikit_robot.egg-info}/PKG-INFO +1 -1
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/SOURCES.txt +1 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/robot_model.py +75 -7
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/__init__.py +16 -1
- scikit_robot-0.4.4/skrobot/viewers/_offscreen.py +495 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/LICENSE +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/MANIFEST.in +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/README.md +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/dependency_links.txt +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/entry_points.txt +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/not-zip-safe +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/requires.txt +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/scikit_robot.egg-info/top_level.txt +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/setup.cfg +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/_lazy_imports.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/canonicalize_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/change_urdf_root.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/cli.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/convert_urdf_mesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/convert_urdf_to_mjcf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/convert_urdf_to_primitives.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/convert_urdf_to_usd.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/convert_wheel_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/extract_sub_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/generate_robot_class.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/modularize_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/scale_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/transform_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/urdf_hash.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/urdf_tree.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/visualize_mesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/apps/visualize_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/assembly/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/assembly/module_assembly.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/assembly/module_registry.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/backend/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/backend/jax_backend.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/backend/math_utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/backend/numpy_backend.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/backend/registry.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/distance.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/environment_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/geometry.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/robot_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/collision/self_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/coordinates/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/coordinates/base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/coordinates/geo.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/coordinates/math.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/kuka.urdf +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/finger_base_left.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/finger_base_right.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/finger_tip_left.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/finger_tip_right.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_0.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_0.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_0.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_1.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_1.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_1.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_2.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_2.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_2.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_3.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_3.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_3.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_4.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_4.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_4.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_5.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_5.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_5.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_6.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_6.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_6.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_7.mtl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_7.obj +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/kuka_description/meshes/link_7.stl +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/robot_descriptions/urdf/r8_6.urdf +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/CMakeLists.txt.ros2.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/gazebo.launch.py.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/gazebo_moveit.launch.py.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/isaac_fjt_server.py.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/moveit.rviz.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/package.xml.ros2.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/ros2_control.xacro.joint.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/ros2_control.xacro.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/data/ros_config_templates/setup_assistant.template +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/dynamics/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/dynamics/differentiable.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/dynamics/gravity.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/contact_links.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/isaac/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/isaac/fjt_server.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/task.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/export/usd.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/_pybullet.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/move_base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/nextage.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/panda.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/pr2.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/tf_utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros/transform_listener.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros2/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros2/base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros2/gripper.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/interfaces/ros2/panda.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/_base_placement_jax.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/base_placement.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/differentiable.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/inverse_reachability_map.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/loop_closure.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/kinematics/reachability_map.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/joint.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/joint_limit_table.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/link.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/primitives.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/model/skeleton.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/aero.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/differential_wrist_sample.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/fetch.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/g1.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/griphis.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/hydrus.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/jaxon_jvrc.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/jedy.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/kuka.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/nextage.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/panda.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/pr2.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/r8_6.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/tycoon.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/models/urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/collision_checker.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/inverse_kinematics_optimization.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/sqp_based.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/swept_sphere.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/fk_utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/gridsdf_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/problem.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/residuals.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/augmented_lagrangian.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/gradient_descent.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/jaxls_solver.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/scipy_solver.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/solvers/solver_utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/trajectory.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/trajectory_optimization/world_surface_collision.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/planner/utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/pycompat.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/sdf/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/sdf/signed_distance_function.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/aggregate.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/canonicalize.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/compare.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/extract_sub_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/flip_axis.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/hash.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/link_origins.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/llm_grouping.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/merge_fixed_links.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/modularize_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/primitives_converter.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/robot_class_generator.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/export.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/gazebo_generator.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/moveit_generator.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/moveit_package.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_config/urdf_parser.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_package.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/ros_package_exporter.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/sanitize.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/scale_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/structure.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/transform_urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/wheel_collision_converter.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/urdf/xml_root_link_changer.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/__init__.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/_blender_decimate_core.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/_blender_remesh_core.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/archive.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/blender_mesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/checksum.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/convex_decomposition.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/draco.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/inertia.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/listify.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/mesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/mjcf_converter.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/package.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/primitive_fitting.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/urdf.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/urdf_mesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/video.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/utils/visualization.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_base.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_manipulability_ellipse.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_mitsuba.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_notebook.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_path_utils.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_pyrender.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_trimesh.py +0 -0
- {scikit_robot-0.4.3 → scikit_robot-0.4.4}/skrobot/viewers/_viser.py +0 -0
|
@@ -214,6 +214,7 @@ skrobot/viewers/_base.py
|
|
|
214
214
|
skrobot/viewers/_manipulability_ellipse.py
|
|
215
215
|
skrobot/viewers/_mitsuba.py
|
|
216
216
|
skrobot/viewers/_notebook.py
|
|
217
|
+
skrobot/viewers/_offscreen.py
|
|
217
218
|
skrobot/viewers/_path_utils.py
|
|
218
219
|
skrobot/viewers/_pyrender.py
|
|
219
220
|
skrobot/viewers/_trimesh.py
|
|
@@ -1433,18 +1433,36 @@ class CascadedLink(CascadedCoords):
|
|
|
1433
1433
|
% (use_base,))
|
|
1434
1434
|
root_link = self._find_fullbody_root_link()
|
|
1435
1435
|
virtual_link = Link(name='_fullbody_ik_virtual_world')
|
|
1436
|
+
# The virtual joint moves root_link relative to root_link's
|
|
1437
|
+
# coordinate parent (usually the robot model), so the joint's
|
|
1438
|
+
# frame is that parent's world frame. Left at the world origin,
|
|
1439
|
+
# the Jacobian's base columns ignore the robot's own pose: once
|
|
1440
|
+
# the robot is turned, x/y/yaw point the wrong way and the solve
|
|
1441
|
+
# diverges.
|
|
1442
|
+
if root_link.parent is not None:
|
|
1443
|
+
virtual_link.newcoords(root_link.parent.copy_worldcoords())
|
|
1436
1444
|
state = {
|
|
1437
1445
|
'root_link': root_link,
|
|
1438
1446
|
'virtual_link': virtual_link,
|
|
1439
1447
|
'orig_parent_link': root_link._parent_link,
|
|
1440
1448
|
'orig_joint': root_link.joint,
|
|
1441
1449
|
'rel_entries': [],
|
|
1450
|
+
# root_link's own coords, relative to its coordinate parent
|
|
1451
|
+
'orig_local': Coordinates(pos=root_link.translation.copy(),
|
|
1452
|
+
rot=root_link.rotation.copy()),
|
|
1442
1453
|
}
|
|
1443
1454
|
virtual_joint = joint_cls(
|
|
1444
1455
|
parent_link=virtual_link,
|
|
1445
1456
|
child_link=root_link,
|
|
1446
1457
|
name='_fullbody_ik_base_joint',
|
|
1447
1458
|
)
|
|
1459
|
+
# joint_angle writes default_coords (+ the joint's motion) into
|
|
1460
|
+
# root_link's local coords, but Joint.__init__ took them from
|
|
1461
|
+
# copy_coords(), which is the world pose: away from the origin,
|
|
1462
|
+
# the first step would move root_link by the robot's own pose.
|
|
1463
|
+
virtual_joint.default_coords = Coordinates(
|
|
1464
|
+
pos=root_link.translation.copy(),
|
|
1465
|
+
rot=root_link.rotation.copy())
|
|
1448
1466
|
# Detach root_link from its original parent's _child_links before
|
|
1449
1467
|
# reparenting so the kinematic graph stays consistent (a link must
|
|
1450
1468
|
# appear in at most one parent's child list at a time).
|
|
@@ -1496,6 +1514,18 @@ class CascadedLink(CascadedCoords):
|
|
|
1496
1514
|
if self._relevance_predicate_table is not None:
|
|
1497
1515
|
for key in state['rel_entries']:
|
|
1498
1516
|
self._relevance_predicate_table.pop(key, None)
|
|
1517
|
+
# The solve left the base pose in root_link's local coords, i.e.
|
|
1518
|
+
# root_link is now offset from the robot. Move that pose onto the
|
|
1519
|
+
# robot and put root_link back where it was in it, so the robot's
|
|
1520
|
+
# coords are its base pose (as batch IK's base_poses are) and a
|
|
1521
|
+
# later robot.newcoords() does not carry the offset along.
|
|
1522
|
+
if root_link.parent is self:
|
|
1523
|
+
root_world = root_link.copy_worldcoords()
|
|
1524
|
+
root_link.newcoords(state['orig_local'].copy_worldcoords())
|
|
1525
|
+
self.newcoords(
|
|
1526
|
+
root_world.transform(
|
|
1527
|
+
state['orig_local'].inverse_transformation()),
|
|
1528
|
+
relative_coords='world')
|
|
1499
1529
|
|
|
1500
1530
|
def _attach_batch_virtual_base_chain(self, use_base, link_list):
|
|
1501
1531
|
"""Inject a chain of single-DoF virtual joints above ``root_link``.
|
|
@@ -1541,7 +1571,14 @@ class CascadedLink(CascadedCoords):
|
|
|
1541
1571
|
% (use_base,))
|
|
1542
1572
|
|
|
1543
1573
|
root_link = self._find_fullbody_root_link()
|
|
1574
|
+
# The chain starts where root_link stands, so its DoFs move the
|
|
1575
|
+
# base in the base's own frame (as PlanarJoint / FloatingJoint do
|
|
1576
|
+
# with their default_coords). At the world origin they would turn
|
|
1577
|
+
# the robot about the origin, and the angles would mean nothing
|
|
1578
|
+
# without the start pose.
|
|
1579
|
+
root0 = root_link.copy_worldcoords()
|
|
1544
1580
|
virtual_world = Link(name='_batch_ik_virtual_world')
|
|
1581
|
+
virtual_world.newcoords(root0.copy_worldcoords())
|
|
1545
1582
|
|
|
1546
1583
|
chain_links = []
|
|
1547
1584
|
chain_joints = []
|
|
@@ -1553,6 +1590,7 @@ class CascadedLink(CascadedCoords):
|
|
|
1553
1590
|
else:
|
|
1554
1591
|
child = Link(name='_batch_ik_virtual_{}_{}'.format(
|
|
1555
1592
|
i, axis))
|
|
1593
|
+
child.newcoords(root0.copy_worldcoords())
|
|
1556
1594
|
chain_links.append(child)
|
|
1557
1595
|
if kind == 'lin':
|
|
1558
1596
|
j = LinearJoint(
|
|
@@ -1592,6 +1630,12 @@ class CascadedLink(CascadedCoords):
|
|
|
1592
1630
|
'orig_parent_link': root_link._parent_link,
|
|
1593
1631
|
'orig_joint': root_link.joint,
|
|
1594
1632
|
'orig_parent_had_child': False,
|
|
1633
|
+
# The chain's angles move root_link from root0, in its own
|
|
1634
|
+
# frame; keep root0 (and root_link in the robot's frame) so
|
|
1635
|
+
# base_poses can be returned as the robot's world pose.
|
|
1636
|
+
'base_frame': (root0,
|
|
1637
|
+
self.copy_worldcoords().inverse_transformation()
|
|
1638
|
+
.transform(root0)),
|
|
1595
1639
|
}
|
|
1596
1640
|
# Detach root_link from its original parent's child list before
|
|
1597
1641
|
# reparenting so the graph stays consistent (a link must appear in
|
|
@@ -2800,7 +2844,8 @@ class BatchIKAttempts(object):
|
|
|
2800
2844
|
|
|
2801
2845
|
def __init__(self, solutions, success, errors, angle_vector,
|
|
2802
2846
|
robot_joint_indices, solution_indices,
|
|
2803
|
-
use_base=None, base_solution_indices=None
|
|
2847
|
+
use_base=None, base_solution_indices=None,
|
|
2848
|
+
base_frame=None):
|
|
2804
2849
|
self._solutions = solutions
|
|
2805
2850
|
self.success = success
|
|
2806
2851
|
self.errors = errors
|
|
@@ -2809,6 +2854,7 @@ class BatchIKAttempts(object):
|
|
|
2809
2854
|
self._solution_indices = solution_indices
|
|
2810
2855
|
self._use_base = use_base
|
|
2811
2856
|
self._base_solution_indices = base_solution_indices
|
|
2857
|
+
self._base_frame = base_frame
|
|
2812
2858
|
self._angle_vectors = None
|
|
2813
2859
|
self._base_poses = None
|
|
2814
2860
|
|
|
@@ -2859,7 +2905,8 @@ class BatchIKAttempts(object):
|
|
|
2859
2905
|
indices = self._base_solution_indices
|
|
2860
2906
|
self._base_poses = [
|
|
2861
2907
|
[RobotModel._virtual_chain_angles_to_base_pose(
|
|
2862
|
-
self._solutions[pose][attempt][indices], self._use_base
|
|
2908
|
+
self._solutions[pose][attempt][indices], self._use_base,
|
|
2909
|
+
self._base_frame)
|
|
2863
2910
|
for attempt in range(self.n_attempts)]
|
|
2864
2911
|
for pose in range(self._solutions.shape[0])
|
|
2865
2912
|
]
|
|
@@ -4452,7 +4499,8 @@ class RobotModel(CascadedLink):
|
|
|
4452
4499
|
base_solution_indices = np.arange(n_dof, dtype=np.int64)
|
|
4453
4500
|
base_poses = [
|
|
4454
4501
|
self._virtual_chain_angles_to_base_pose(
|
|
4455
|
-
solutions_np[i, :n_dof], use_base
|
|
4502
|
+
solutions_np[i, :n_dof], use_base,
|
|
4503
|
+
_base_state['base_frame'])
|
|
4456
4504
|
for i in range(n_poses)
|
|
4457
4505
|
]
|
|
4458
4506
|
|
|
@@ -4464,20 +4512,38 @@ class RobotModel(CascadedLink):
|
|
|
4464
4512
|
joint_indices,
|
|
4465
4513
|
fk_indices_for_actual_joints,
|
|
4466
4514
|
use_base=use_base,
|
|
4467
|
-
base_solution_indices=base_solution_indices
|
|
4515
|
+
base_solution_indices=base_solution_indices,
|
|
4516
|
+
base_frame=(None if _base_state is None
|
|
4517
|
+
else _base_state['base_frame']))
|
|
4468
4518
|
|
|
4469
4519
|
return BatchIKResult(full_solutions, success_flags, attempt_counts,
|
|
4470
4520
|
base_poses=base_poses, attempts=attempts)
|
|
4471
4521
|
|
|
4472
4522
|
@staticmethod
|
|
4473
|
-
def _virtual_chain_angles_to_base_pose(joint_angles, use_base
|
|
4523
|
+
def _virtual_chain_angles_to_base_pose(joint_angles, use_base,
|
|
4524
|
+
base_frame=None):
|
|
4474
4525
|
"""Convert virtual-chain joint angles to a world-frame base pose.
|
|
4475
4526
|
|
|
4476
4527
|
The decomposition in :meth:`_attach_batch_virtual_base_chain` means
|
|
4477
4528
|
the per-DoF angles compose exactly like the corresponding
|
|
4478
4529
|
:class:`PlanarJoint` / :class:`FloatingJoint` applied to
|
|
4479
4530
|
``default_coords = identity``.
|
|
4531
|
+
|
|
4532
|
+
The angles move root_link from where it stood when the solve
|
|
4533
|
+
started, in its own frame. With ``base_frame`` (root_link's world
|
|
4534
|
+
pose at the start, and root_link in the robot's frame) the result
|
|
4535
|
+
is the robot's world pose, ready for ``robot.newcoords``; without
|
|
4536
|
+
it, the bare move.
|
|
4480
4537
|
"""
|
|
4538
|
+
move = RobotModel._virtual_chain_move(joint_angles, use_base)
|
|
4539
|
+
if base_frame is None:
|
|
4540
|
+
return move
|
|
4541
|
+
root0, root_in_robot = base_frame
|
|
4542
|
+
return root0.copy_worldcoords().transform(move).transform(
|
|
4543
|
+
root_in_robot.inverse_transformation())
|
|
4544
|
+
|
|
4545
|
+
@staticmethod
|
|
4546
|
+
def _virtual_chain_move(joint_angles, use_base):
|
|
4481
4547
|
if use_base == 'planar':
|
|
4482
4548
|
x, y, yaw = float(joint_angles[0]), float(joint_angles[1]), float(
|
|
4483
4549
|
joint_angles[2])
|
|
@@ -4776,7 +4842,7 @@ class RobotModel(CascadedLink):
|
|
|
4776
4842
|
virtual_angles = solutions_np[:, virtual_idx_arr]
|
|
4777
4843
|
base_poses = [
|
|
4778
4844
|
self._virtual_chain_angles_to_base_pose(
|
|
4779
|
-
virtual_angles[i], use_base)
|
|
4845
|
+
virtual_angles[i], use_base, _base_state['base_frame'])
|
|
4780
4846
|
for i in range(n_poses)
|
|
4781
4847
|
]
|
|
4782
4848
|
|
|
@@ -4788,7 +4854,9 @@ class RobotModel(CascadedLink):
|
|
|
4788
4854
|
robot_idx_arr.tolist(),
|
|
4789
4855
|
union_idx_arr.tolist(),
|
|
4790
4856
|
use_base=use_base,
|
|
4791
|
-
base_solution_indices=virtual_idx_arr
|
|
4857
|
+
base_solution_indices=virtual_idx_arr,
|
|
4858
|
+
base_frame=(None if _base_state is None
|
|
4859
|
+
else _base_state['base_frame']))
|
|
4792
4860
|
|
|
4793
4861
|
return BatchIKResult(full_solutions, success_flags, attempt_counts,
|
|
4794
4862
|
base_poses=base_poses, attempts=attempts)
|
|
@@ -71,6 +71,19 @@ except (ImportError, RuntimeError) as error_log:
|
|
|
71
71
|
class PyrenderViewer(DummyViewer):
|
|
72
72
|
_import_error = error_log
|
|
73
73
|
|
|
74
|
+
try:
|
|
75
|
+
from ._offscreen import OffscreenRenderer
|
|
76
|
+
from ._offscreen import look_at_pose
|
|
77
|
+
from ._offscreen import merge_by_material
|
|
78
|
+
from ._offscreen import render_parallel
|
|
79
|
+
except ImportError as error_log:
|
|
80
|
+
_offscreen_import_error = error_log
|
|
81
|
+
|
|
82
|
+
class OffscreenRenderer(object):
|
|
83
|
+
def __init__(self, *args, **kwargs):
|
|
84
|
+
raise ImportError('OffscreenRenderer needs pyrender: {}'.format(
|
|
85
|
+
_offscreen_import_error))
|
|
86
|
+
|
|
74
87
|
try:
|
|
75
88
|
from ._notebook import JupyterNotebookViewer
|
|
76
89
|
except ImportError:
|
|
@@ -114,13 +127,15 @@ _VIEWER_CLASSES = {
|
|
|
114
127
|
'viser': ViserViewer,
|
|
115
128
|
'notebook': JupyterNotebookViewer,
|
|
116
129
|
'mitsuba': MitsubaViewer,
|
|
130
|
+
# headless: same calls, nothing on screen (save_image renders the camera's view)
|
|
131
|
+
'offscreen': OffscreenRenderer,
|
|
117
132
|
}
|
|
118
133
|
|
|
119
134
|
# Viewer names suitable for a command-line ``--viewer`` choice (every backend
|
|
120
135
|
# except the notebook-only one). Examples import this so a newly added viewer
|
|
121
136
|
# automatically becomes selectable everywhere.
|
|
122
137
|
VIEWER_TYPES = tuple(
|
|
123
|
-
name for name in _VIEWER_CLASSES if name
|
|
138
|
+
name for name in _VIEWER_CLASSES if name not in ('notebook', 'offscreen'))
|
|
124
139
|
|
|
125
140
|
# Shared ``help=`` text for a ``--viewer`` argparse argument, kept next to
|
|
126
141
|
# VIEWER_TYPES so the wording (and the listed backends) stay in sync.
|