# urdf2webots

[](https://badge.fury.io/py/urdf2webots)
This tool converts URDF files into Webots PROTO files or into Webots Robot node strings.
Python 3.5 or higher is required.
## Install
### From pip
```
pip install urdf2webots
```
On macOS, export the pip binary path to the PATH: `export PATH="/Users/$USER/Library/Python/3.7/bin:$PATH"`
### From Sources
```
git clone --recurse-submodules https://github.com/cyberbotics/urdf2webots.git
pip install --upgrade --editable urdf2webots
```
## Usage
### From pip
```
python -m urdf2webots.importer --input=someRobot.urdf [--output=outputFile] [--normal] [--box-collision] [--tool-slot=linkName] [--help]
```
### Arguments
The script accepts the following arguments:
- **-h, --help**: Show the help message and exit.
- **--input=INPUT**: Specifies the URDF file to convert.
- **--output=OUTPUT**: If set, specifies the path and, if ending in ".proto", name of the resulting PROTO file. The filename minus the .proto extension will be the robot name (for PROTO conversion only).
- **--robot-name**: Specify the name of the robot and generate a Robot node string instead of a PROTO file (has to be unique).
- **--normal**: If set, the normals are exported if present in the URDF definition.
- **--box-collision**: If set, the bounding objects are approximated using boxes.
- **--tool-slot=LinkName**: Specify the link that you want to add a tool slot to (exact link name from URDF, for PROTO conversion only).
- **--translation="0 0 0"**: Set the translation field of the PROTO file or Webots Robot node string.
- **--rotation="0 0 1 0"**: Set the rotation field of the PROTO file or Webots Robot node string.
- **--init-pos=JointPositions**: Set the initial positions of your robot joints. Example: `--init-pos="[1.2, 0.5, -1.5]"` would set the first 3 joints of your robot to the specified values, and leave the rest with their default value.
- **--link-to-def**: Creates a DEF with the link name for each solid to be able to access it using getFromProtoDef(defName) (for PROTO conversion only).
- **--joint-to-def**: Creates a DEF with the joint name for each joint to be able to access it using getFromProtoDef(defName) (for PROTO conversion only).
- **--relative-path-prefix**: If **--input** is not set, the relative paths in your URDF file sent through stdin will use this prefix. For example: `filename="head.obj"` with `--relative-path-prefix="/home/user/myRobot/"` will become `filename="/home/user/myRobot/head.obj"`.
In case the **--input** option is missing, the script will read the URDF content from `stdin`.
In that case, you can pipe the content of your URDF file into the script: `cat my_robot.urdf | urdf2proto.py`.
Relative paths present in your URDF file will be treated relatively to the current directory from which the script is called unless **--relative-path-prefix** is set.
> Previously the **--static-base** argument was supported in order to set the base link to be static (disabled physics). It has been removed as there is a better way to do it by adding the following to your URDF file (assuming **base_link** is the root link of your robot):
>
>```
> <link name="world" />
><joint name="world_joint" type="fixed">
> <parent link="world" />
> <child link="base_link" />
></joint>
>```
### In your Python Code
#### Arguments
The command line arguments available from the terminal are also available from the Python interface, but some have different names:
| Terminal | Python |
|----------|-------------|
| --input | input |
| --output | output |
| --robot-name | robotName |
| --normal | normal |
| --box-collision | boxCollision |
| --tool-slot | toolSlot |
| --translation | initTranslation |
| --rotation | initRotation |
| --init-pos | initPos |
| --link-to-def | linkToDef |
| --joint-to-def | jointToDef |
| --relative-path-prefix | relativePathPrefix |
In Python, you can convert a URDF file by passing its path as an argument to the `convertUrdfFile()` function or directly by passing its content as an argument to the `convertUrdfContent()` function.
#### Convert into Webots PROTO files
```
from urdf2webots.importer import convertUrdfFile
convertUrdfFile(input = 'MY_PATH/MY_URDF.urdf')
```
or
```
import pathlib
from urdf2webots.importer import convertUrdfContent
robot_description = pathlib.Path('MY_PATH/MY_URDF.urdf').read_text()
convertUrdfContent(input = robot_description)
```
#### Convert into Webots Robot node strings
```
from urdf2webots.importer import convertUrdfFile
convertUrdfFile(input = 'MY_PATH/MY_URDF.urdf', robotName="myRobot")
```
or
```
import pathlib
from urdf2webots.importer import convertUrdfContent
robot_description = pathlib.Path('MY_PATH/MY_URDF.urdf').read_text()
convertUrdfContent(input = robot_description, robotName="myRobot")
```
### In-Depth Tutorial
Check out [this tutorial](./docs/tutorial.md) for a more in-depth, step by step instruction, on how to:
- Generate a URDF file from a ROS repository.
- Convert your URDF file to a Webots PROTO file.
- Load your converted model into Webots and make final adjustments.
- Convert your URDF file to a Webots Robot string and import it.
## Notes
This tool was tested using Webots R2022b on Ubuntu22.04.
You can find the sources of these URDF files here:
- Universal Robot: https://github.com/ros-industrial/universal_robot/tree/kinetic-devel/ur_description
- PR2 robot: https://github.com/PR2/pr2_common/tree/kinetic-devel/pr2_description
- Motoman robot: https://github.com/ros-industrial/motoman/tree/kinetic-devel/motoman_sia20d_support
- Kinova robot: https://github.com/Kinovarobotics/kinova-ros/tree/kinetic/kinova_description
- gait2392 human skeleton: https://github.com/cyberbotics/urdf2webots/tree/master/tests/sources/gait2392_simbody
## Acknowledgements
<a href="http://rosin-project.eu">
<img src="http://rosin-project.eu/wp-content/uploads/rosin_ack_logo_wide.png"
alt="rosin_logo" height="60" >
</a></br>
Supported by ROSIN - ROS-Industrial Quality-Assured Robot Software Components.
More information: <a href="http://rosin-project.eu">rosin-project.eu</a>
<img src="http://rosin-project.eu/wp-content/uploads/rosin_eu_flag.jpg"
alt="eu_flag" height="45" align="left" >
This project has received funding from the European Union’s Horizon 2020
research and innovation programme under grant agreement no. 732287.
<br>
<a href="https://opendr.eu/">
<img src="https://opendr.eu/wp-content/uploads/2020/01/logo-300x125.png"
alt="opendr_logo" height="60" >
</a></br>
Supported by OpenDR - Open Deep Learning Toolkit for Robotics.
More information: <a href="https://opendr.eu/">opendr.eu</a>
<img src="https://opendr.csd.auth.gr/wp-content/uploads/2019/12/Flag_of_Europe-300x200.png"
alt="eu_flag" height="45" align="left" >
This project has received funding from the European Union’s Horizon 2020
research and innovation programme under grant agreement no. 871449.
Raw data
{
"_id": null,
"home_page": "https://github.com/cyberbotics/urdf2webots",
"name": "urdf2webots",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "Cyberbotics",
"author_email": "support@cyberbotics.com",
"download_url": "https://files.pythonhosted.org/packages/61/1e/3531c65ea51c1f1e19d9052f5f8e8336b3b574dc23c585adcf8d4415edcb/urdf2webots-2023.1.0.tar.gz",
"platform": null,
"description": "# urdf2webots\n\n\n[](https://badge.fury.io/py/urdf2webots)\n\nThis tool converts URDF files into Webots PROTO files or into Webots Robot node strings.\nPython 3.5 or higher is required.\n\n## Install\n\n### From pip\n\n```\npip install urdf2webots\n```\n\nOn macOS, export the pip binary path to the PATH: `export PATH=\"/Users/$USER/Library/Python/3.7/bin:$PATH\"`\n\n### From Sources\n\n```\ngit clone --recurse-submodules https://github.com/cyberbotics/urdf2webots.git\npip install --upgrade --editable urdf2webots\n```\n\n## Usage\n\n### From pip\n\n```\npython -m urdf2webots.importer --input=someRobot.urdf [--output=outputFile] [--normal] [--box-collision] [--tool-slot=linkName] [--help]\n```\n\n### Arguments\n\nThe script accepts the following arguments:\n - **-h, --help**: Show the help message and exit.\n - **--input=INPUT**: Specifies the URDF file to convert.\n - **--output=OUTPUT**: If set, specifies the path and, if ending in \".proto\", name of the resulting PROTO file. The filename minus the .proto extension will be the robot name (for PROTO conversion only).\n - **--robot-name**: Specify the name of the robot and generate a Robot node string instead of a PROTO file (has to be unique).\n - **--normal**: If set, the normals are exported if present in the URDF definition.\n - **--box-collision**: If set, the bounding objects are approximated using boxes.\n - **--tool-slot=LinkName**: Specify the link that you want to add a tool slot to (exact link name from URDF, for PROTO conversion only).\n - **--translation=\"0 0 0\"**: Set the translation field of the PROTO file or Webots Robot node string.\n - **--rotation=\"0 0 1 0\"**: Set the rotation field of the PROTO file or Webots Robot node string.\n - **--init-pos=JointPositions**: Set the initial positions of your robot joints. Example: `--init-pos=\"[1.2, 0.5, -1.5]\"` would set the first 3 joints of your robot to the specified values, and leave the rest with their default value.\n - **--link-to-def**: Creates a DEF with the link name for each solid to be able to access it using getFromProtoDef(defName) (for PROTO conversion only).\n - **--joint-to-def**: Creates a DEF with the joint name for each joint to be able to access it using getFromProtoDef(defName) (for PROTO conversion only).\n - **--relative-path-prefix**: If **--input** is not set, the relative paths in your URDF file sent through stdin will use this prefix. For example: `filename=\"head.obj\"` with `--relative-path-prefix=\"/home/user/myRobot/\"` will become `filename=\"/home/user/myRobot/head.obj\"`.\n\nIn case the **--input** option is missing, the script will read the URDF content from `stdin`.\nIn that case, you can pipe the content of your URDF file into the script: `cat my_robot.urdf | urdf2proto.py`.\nRelative paths present in your URDF file will be treated relatively to the current directory from which the script is called unless **--relative-path-prefix** is set.\n\n> Previously the **--static-base** argument was supported in order to set the base link to be static (disabled physics). It has been removed as there is a better way to do it by adding the following to your URDF file (assuming **base_link** is the root link of your robot):\n>\n>```\n> <link name=\"world\" />\n><joint name=\"world_joint\" type=\"fixed\">\n> <parent link=\"world\" />\n> <child link=\"base_link\" />\n></joint>\n>```\n\n### In your Python Code\n\n#### Arguments\n\nThe command line arguments available from the terminal are also available from the Python interface, but some have different names:\n\n| Terminal | Python |\n|----------|-------------|\n| --input | input |\n| --output | output |\n| --robot-name | robotName |\n| --normal | normal |\n| --box-collision | boxCollision |\n| --tool-slot | toolSlot |\n| --translation | initTranslation |\n| --rotation | initRotation |\n| --init-pos | initPos |\n| --link-to-def | linkToDef |\n| --joint-to-def | jointToDef |\n| --relative-path-prefix | relativePathPrefix |\n\nIn Python, you can convert a URDF file by passing its path as an argument to the `convertUrdfFile()` function or directly by passing its content as an argument to the `convertUrdfContent()` function.\n\n#### Convert into Webots PROTO files\n\n```\nfrom urdf2webots.importer import convertUrdfFile\nconvertUrdfFile(input = 'MY_PATH/MY_URDF.urdf')\n```\n\nor\n\n```\nimport pathlib\nfrom urdf2webots.importer import convertUrdfContent\nrobot_description = pathlib.Path('MY_PATH/MY_URDF.urdf').read_text()\nconvertUrdfContent(input = robot_description)\n```\n\n#### Convert into Webots Robot node strings\n\n```\nfrom urdf2webots.importer import convertUrdfFile\nconvertUrdfFile(input = 'MY_PATH/MY_URDF.urdf', robotName=\"myRobot\")\n```\n\nor\n\n```\nimport pathlib\nfrom urdf2webots.importer import convertUrdfContent\nrobot_description = pathlib.Path('MY_PATH/MY_URDF.urdf').read_text()\nconvertUrdfContent(input = robot_description, robotName=\"myRobot\")\n```\n\n### In-Depth Tutorial\nCheck out [this tutorial](./docs/tutorial.md) for a more in-depth, step by step instruction, on how to:\n- Generate a URDF file from a ROS repository.\n- Convert your URDF file to a Webots PROTO file.\n- Load your converted model into Webots and make final adjustments.\n- Convert your URDF file to a Webots Robot string and import it.\n\n\n## Notes\nThis tool was tested using Webots R2022b on Ubuntu22.04.\nYou can find the sources of these URDF files here:\n - Universal Robot: https://github.com/ros-industrial/universal_robot/tree/kinetic-devel/ur_description\n - PR2 robot: https://github.com/PR2/pr2_common/tree/kinetic-devel/pr2_description\n - Motoman robot: https://github.com/ros-industrial/motoman/tree/kinetic-devel/motoman_sia20d_support\n - Kinova robot: https://github.com/Kinovarobotics/kinova-ros/tree/kinetic/kinova_description\n - gait2392 human skeleton: https://github.com/cyberbotics/urdf2webots/tree/master/tests/sources/gait2392_simbody\n\n## Acknowledgements\n\n<a href=\"http://rosin-project.eu\">\n <img src=\"http://rosin-project.eu/wp-content/uploads/rosin_ack_logo_wide.png\"\n alt=\"rosin_logo\" height=\"60\" >\n</a></br>\n\nSupported by ROSIN - ROS-Industrial Quality-Assured Robot Software Components.\nMore information: <a href=\"http://rosin-project.eu\">rosin-project.eu</a>\n\n<img src=\"http://rosin-project.eu/wp-content/uploads/rosin_eu_flag.jpg\"\n alt=\"eu_flag\" height=\"45\" align=\"left\" >\n\nThis project has received funding from the European Union\u2019s Horizon 2020\nresearch and innovation programme under grant agreement no. 732287.\n\n<br>\n\n<a href=\"https://opendr.eu/\">\n <img src=\"https://opendr.eu/wp-content/uploads/2020/01/logo-300x125.png\"\n alt=\"opendr_logo\" height=\"60\" >\n</a></br>\n\nSupported by OpenDR - Open Deep Learning Toolkit for Robotics.\nMore information: <a href=\"https://opendr.eu/\">opendr.eu</a>\n\n<img src=\"https://opendr.csd.auth.gr/wp-content/uploads/2019/12/Flag_of_Europe-300x200.png\"\n alt=\"eu_flag\" height=\"45\" align=\"left\" >\n\nThis project has received funding from the European Union\u2019s Horizon 2020\nresearch and innovation programme under grant agreement no. 871449.\n\n\n",
"bugtrack_url": null,
"license": "Apache License, Version 2.0",
"summary": "A converter between URDF and PROTO files.",
"version": "2023.1.0",
"project_urls": {
"Homepage": "https://github.com/cyberbotics/urdf2webots"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1e20e31e9ecc4b9ab40bc97a66a6307a1e72d520de3f84fc829dff435635b836",
"md5": "1a2b0dccd2d6addc09d7550c92346cff",
"sha256": "63cdd3343bdeb19da63e7d3df3d63586f64880103ee4f6762d0dbf2721d05938"
},
"downloads": -1,
"filename": "urdf2webots-2023.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1a2b0dccd2d6addc09d7550c92346cff",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 28419,
"upload_time": "2023-06-29T06:57:13",
"upload_time_iso_8601": "2023-06-29T06:57:13.818147Z",
"url": "https://files.pythonhosted.org/packages/1e/20/e31e9ecc4b9ab40bc97a66a6307a1e72d520de3f84fc829dff435635b836/urdf2webots-2023.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "611e3531c65ea51c1f1e19d9052f5f8e8336b3b574dc23c585adcf8d4415edcb",
"md5": "8c7645100df2ad0926a5192c39c97b89",
"sha256": "f5ddc9a11733f7072c5509881b1b9909882108b3e78f94def512440bd80b47bb"
},
"downloads": -1,
"filename": "urdf2webots-2023.1.0.tar.gz",
"has_sig": false,
"md5_digest": "8c7645100df2ad0926a5192c39c97b89",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29979,
"upload_time": "2023-06-29T06:57:15",
"upload_time_iso_8601": "2023-06-29T06:57:15.640688Z",
"url": "https://files.pythonhosted.org/packages/61/1e/3531c65ea51c1f1e19d9052f5f8e8336b3b574dc23c585adcf8d4415edcb/urdf2webots-2023.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-06-29 06:57:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "cyberbotics",
"github_project": "urdf2webots",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "urdf2webots"
}