# DM Robotics: Controllers Library (Python)
Contents:
- [Cartesian 6D to Joint Velocity Mapper](#Cartesian-6D-to-Joint-Velocity-Mapper)
## Cartesian 6D to Joint Velocity Mapper
Python bindings for
`dm_robotics/controllers/lsqp/cartesian_6d_to_joint_velocity_mapper`.
This module consists of two classes:
* `cartesian_6d_to_joint_velocity_mapper.Parameters`
* `cartesian_6d_to_joint_velocity_mapper.Mapper`
The mapper solves a constrained linear least-squares optimization problem at
every iteration to compute the joint velocities that best achieve the desired
Cartesian 6D velocity of an object.
In its most basic configuration, it computes the joint velocities that achieve
the desired Cartesian 6d velocity with singularity robustness. In addition, this
mapper also supports the following functionality:
* Nullspace control can be enabled to bias the joint velocities to a desired
value without affecting the accuracy of the resultant Cartesian velocity;
* Collision avoidance can be enabled between any two MuJoCo geoms;
* Limits on the joint positions, velocities, and accelerations can be defined
to ensure that the computed joint velocities do not result in limit
violations.
Please refer to
`dm_robotics/controllers/lsqp/cartesian_6d_to_joint_velocity_mapper.h` or the
class docstrings for more information.
Dependencies:
- dm_robotics/least_squares_qp
- dm_robotics/controllers
- [dm_control](https://github.com/deepmind/dm_control)
### Usage
```python
from dm_control import mujoco
from dm_control.mujoco.wrapper.mjbindings import enums
from dm_robotics.controllers import cartesian_6d_to_joint_velocity_mapper
# Initialize simulation. Assumes velocity controlled robot.
# physics.data.ctrl[:] is an array of size 7 that corresponds to the commanded
# velocities of the joints with IDs 7, 8, 9, 10, 12, 13, 14.
physics = mujoco.Physics(...) # Create MuJoCo physics.
# Create mapper parameters.
params = cartesian_6d_to_joint_velocity_mapper.Parameters()
#
# Set model parameters.
params.model = physics.model
params.joint_ids = [7, 8, 9, 10, 12, 13, 14] # MuJoCo joint IDs being controlled.
params.object_type = enums.mjtObj.mjOBJ_SITE # MuJoCo object being controlled.
params.object_name = "end_effector" # name of MuJoCo object being controlled.
params.integration_timestep = 0.005 # Amount of time the joint velocities will be executed for.
#
# Enable joint position limit constraint. Limits are read automatically from the
# model.
params.enable_joint_position_limits = True
params.joint_position_limit_velocity_scale = 0.95
params.minimum_distance_from_joint_position_limit = 0.01 # ~0.5deg.
#
# Enable joint velocity limits.
params.enable_joint_velocity_limits = True
params.joint_velocity_magnitude_limits = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
#
# Enable joint acceleration limits.
params.enable_joint_acceleration_limits = True
params.remove_joint_acceleration_limits_if_in_conflict = True
params.joint_acceleration_magnitude_limits = [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0]
#
# Enable collision avoidance between the following geoms:
# * "gripper" and "base_link"
# * "base_link" and "floor"
# * "link1" and "floor"
# * "gripper" and "floor"
# * "link1" and "link4"
# * "link1" and "link5"
# * "link1" and "link6"
# * "link2" and "link4"
# * "link2" and "link5"
# * "link2" and "link6"
# Note that collision avoidance will not be enabled for a pair of geoms if they
# are attached to the same body or are attached to bodies that have a
# parent-child relationship.
params.enable_collision_avoidance = True
params.collision_avoidance_normal_velocity_scale = 0.5
params.minimum_distance_from_collisions = 0.01
params.collision_detection_distance = 0.3
params.collision_pairs = [(["gripper"], ["base_link"]),
(["base_link", "link1", "gripper"], ["floor"]),
(["link1", "link2"], ["link4", "link5", "link6"])]
#
# Numerical stability parameters.
params.check_solution_validity = True
params.solution_tolerance = 1e-3
params.regularization_weight = 1e-2
params.enable_nullspace_control = True
params.return_error_on_nullspace_failure = False
params.nullspace_projection_slack = 1e-7
# Create mapper.
mapper = cartesian_6d_to_joint_velocity_mapper.Mapper(params)
# Compute joint velocities and apply them to the joint velocity actuator
# commands at every step.
while True:
# The nullspace bias is often chosen to be a velocity towards the mid-range of
# the joints, but can be chosen to be any 7D joint velocity vector.
nullspace_joint_velocity_bias = get_nullspace_bias()
target_cartesian_velocity = get_end_effector_target_velocity()
solution = mapper.compute_joint_velocities(physics.data, target_velocity,
nullspace_bias)
physics.data.ctrl[:] = solution
physics.step()
```
Raw data
{
"_id": null,
"home_page": "https://github.com/deepmind/dm_robotics/tree/main/cpp/controllers_py",
"name": "dm-robotics-controllers",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.13,>=3.7",
"maintainer_email": null,
"keywords": null,
"author": "DeepMind",
"author_email": null,
"download_url": null,
"platform": null,
"description": "# DM Robotics: Controllers Library (Python)\n\nContents:\n\n- [Cartesian 6D to Joint Velocity Mapper](#Cartesian-6D-to-Joint-Velocity-Mapper)\n\n## Cartesian 6D to Joint Velocity Mapper\n\nPython bindings for\n`dm_robotics/controllers/lsqp/cartesian_6d_to_joint_velocity_mapper`.\n\nThis module consists of two classes:\n\n* `cartesian_6d_to_joint_velocity_mapper.Parameters`\n* `cartesian_6d_to_joint_velocity_mapper.Mapper`\n\nThe mapper solves a constrained linear least-squares optimization problem at\nevery iteration to compute the joint velocities that best achieve the desired\nCartesian 6D velocity of an object.\n\nIn its most basic configuration, it computes the joint velocities that achieve\nthe desired Cartesian 6d velocity with singularity robustness. In addition, this\nmapper also supports the following functionality:\n\n* Nullspace control can be enabled to bias the joint velocities to a desired\n value without affecting the accuracy of the resultant Cartesian velocity;\n* Collision avoidance can be enabled between any two MuJoCo geoms;\n* Limits on the joint positions, velocities, and accelerations can be defined\n to ensure that the computed joint velocities do not result in limit\n violations.\n\nPlease refer to\n`dm_robotics/controllers/lsqp/cartesian_6d_to_joint_velocity_mapper.h` or the\nclass docstrings for more information.\n\nDependencies:\n\n- dm_robotics/least_squares_qp\n- dm_robotics/controllers\n- [dm_control](https://github.com/deepmind/dm_control)\n\n### Usage\n\n```python\nfrom dm_control import mujoco\nfrom dm_control.mujoco.wrapper.mjbindings import enums\nfrom dm_robotics.controllers import cartesian_6d_to_joint_velocity_mapper\n\n# Initialize simulation. Assumes velocity controlled robot.\n# physics.data.ctrl[:] is an array of size 7 that corresponds to the commanded\n# velocities of the joints with IDs 7, 8, 9, 10, 12, 13, 14.\nphysics = mujoco.Physics(...) # Create MuJoCo physics.\n\n# Create mapper parameters.\nparams = cartesian_6d_to_joint_velocity_mapper.Parameters()\n#\n# Set model parameters.\nparams.model = physics.model\nparams.joint_ids = [7, 8, 9, 10, 12, 13, 14] # MuJoCo joint IDs being controlled.\nparams.object_type = enums.mjtObj.mjOBJ_SITE # MuJoCo object being controlled.\nparams.object_name = \"end_effector\" # name of MuJoCo object being controlled.\nparams.integration_timestep = 0.005 # Amount of time the joint velocities will be executed for.\n#\n# Enable joint position limit constraint. Limits are read automatically from the\n# model.\nparams.enable_joint_position_limits = True\nparams.joint_position_limit_velocity_scale = 0.95\nparams.minimum_distance_from_joint_position_limit = 0.01 # ~0.5deg.\n#\n# Enable joint velocity limits.\nparams.enable_joint_velocity_limits = True\nparams.joint_velocity_magnitude_limits = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n#\n# Enable joint acceleration limits.\nparams.enable_joint_acceleration_limits = True\nparams.remove_joint_acceleration_limits_if_in_conflict = True\nparams.joint_acceleration_magnitude_limits = [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0]\n#\n# Enable collision avoidance between the following geoms:\n# * \"gripper\" and \"base_link\"\n# * \"base_link\" and \"floor\"\n# * \"link1\" and \"floor\"\n# * \"gripper\" and \"floor\"\n# * \"link1\" and \"link4\"\n# * \"link1\" and \"link5\"\n# * \"link1\" and \"link6\"\n# * \"link2\" and \"link4\"\n# * \"link2\" and \"link5\"\n# * \"link2\" and \"link6\"\n# Note that collision avoidance will not be enabled for a pair of geoms if they\n# are attached to the same body or are attached to bodies that have a\n# parent-child relationship.\nparams.enable_collision_avoidance = True\nparams.collision_avoidance_normal_velocity_scale = 0.5\nparams.minimum_distance_from_collisions = 0.01\nparams.collision_detection_distance = 0.3\nparams.collision_pairs = [([\"gripper\"], [\"base_link\"]),\n ([\"base_link\", \"link1\", \"gripper\"], [\"floor\"]),\n ([\"link1\", \"link2\"], [\"link4\", \"link5\", \"link6\"])]\n#\n# Numerical stability parameters.\nparams.check_solution_validity = True\nparams.solution_tolerance = 1e-3\nparams.regularization_weight = 1e-2\nparams.enable_nullspace_control = True\nparams.return_error_on_nullspace_failure = False\nparams.nullspace_projection_slack = 1e-7\n\n# Create mapper.\nmapper = cartesian_6d_to_joint_velocity_mapper.Mapper(params)\n\n# Compute joint velocities and apply them to the joint velocity actuator\n# commands at every step.\nwhile True:\n # The nullspace bias is often chosen to be a velocity towards the mid-range of\n # the joints, but can be chosen to be any 7D joint velocity vector.\n nullspace_joint_velocity_bias = get_nullspace_bias()\n target_cartesian_velocity = get_end_effector_target_velocity()\n solution = mapper.compute_joint_velocities(physics.data, target_velocity,\n nullspace_bias)\n physics.data.ctrl[:] = solution\n physics.step()\n```\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "Python bindings for dm_robotics/cpp/controllers",
"version": "0.8.1",
"project_urls": {
"Homepage": "https://github.com/deepmind/dm_robotics/tree/main/cpp/controllers_py"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "50b2a62a5512440b9514056a3836bde3cad1d102e9b8d0492455c71916e31990",
"md5": "c1c28ef56025dc5ad96f736c9a4a204f",
"sha256": "f3d0466a3a5c444ee690006d4f56134dbc13bebe06b978f9813206ed93d35440"
},
"downloads": -1,
"filename": "dm_robotics_controllers-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c1c28ef56025dc5ad96f736c9a4a204f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.13,>=3.7",
"size": 2828692,
"upload_time": "2024-06-20T10:33:27",
"upload_time_iso_8601": "2024-06-20T10:33:27.499907Z",
"url": "https://files.pythonhosted.org/packages/50/b2/a62a5512440b9514056a3836bde3cad1d102e9b8d0492455c71916e31990/dm_robotics_controllers-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3dca2fdc39a342ac6ad85b9cbf777bef47475cf355566438aed993988fa85e88",
"md5": "dd1bd57aa7d9503adfaf236652824e61",
"sha256": "6a2089b774d77d93eefded29e108ee73615065abda09faa8a7a28a3496eb5351"
},
"downloads": -1,
"filename": "dm_robotics_controllers-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "dd1bd57aa7d9503adfaf236652824e61",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.13,>=3.7",
"size": 2828660,
"upload_time": "2024-06-20T10:33:38",
"upload_time_iso_8601": "2024-06-20T10:33:38.093892Z",
"url": "https://files.pythonhosted.org/packages/3d/ca/2fdc39a342ac6ad85b9cbf777bef47475cf355566438aed993988fa85e88/dm_robotics_controllers-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6ee9095bd895d1a9f958ceff7d2a41479ec96ffd1653b701f8767376475b0082",
"md5": "8ad7674e5fa36d0d2e0ccaad8d7000e9",
"sha256": "41bc96e310c01e9e9c17dec44e8cd5974e9f5a0077aa859839e0caa68d0aeaaf"
},
"downloads": -1,
"filename": "dm_robotics_controllers-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8ad7674e5fa36d0d2e0ccaad8d7000e9",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.13,>=3.7",
"size": 2828383,
"upload_time": "2024-06-20T10:33:45",
"upload_time_iso_8601": "2024-06-20T10:33:45.965466Z",
"url": "https://files.pythonhosted.org/packages/6e/e9/095bd895d1a9f958ceff7d2a41479ec96ffd1653b701f8767376475b0082/dm_robotics_controllers-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9cb849faf5f63435a25cd3e206d2cb7c064bf7fceacb54724d1e0f343746145c",
"md5": "28d7adaf93db605ca0d63c949b2cc69a",
"sha256": "8069859dff572d17d8084c35d25b506880f1f32ef264cc71399c0770ee8b841a"
},
"downloads": -1,
"filename": "dm_robotics_controllers-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "28d7adaf93db605ca0d63c949b2cc69a",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": "<3.13,>=3.7",
"size": 2828707,
"upload_time": "2024-06-20T10:33:54",
"upload_time_iso_8601": "2024-06-20T10:33:54.346689Z",
"url": "https://files.pythonhosted.org/packages/9c/b8/49faf5f63435a25cd3e206d2cb7c064bf7fceacb54724d1e0f343746145c/dm_robotics_controllers-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0406616c7156b4936dcbf7aec38af2ac45102b7bcd5269409bc1bf0da6fdc2c9",
"md5": "171750874ad7aff02a9c6b959799f3cd",
"sha256": "aadf46567846016933718f36d35ab85c1e0c6cc0d61572c31a2f5bbc885f52b5"
},
"downloads": -1,
"filename": "dm_robotics_controllers-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "171750874ad7aff02a9c6b959799f3cd",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.13,>=3.7",
"size": 2828796,
"upload_time": "2024-06-20T10:33:59",
"upload_time_iso_8601": "2024-06-20T10:33:59.349174Z",
"url": "https://files.pythonhosted.org/packages/04/06/616c7156b4936dcbf7aec38af2ac45102b7bcd5269409bc1bf0da6fdc2c9/dm_robotics_controllers-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-20 10:33:27",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "deepmind",
"github_project": "dm_robotics",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "dm-robotics-controllers"
}