├── Dockerfile ├── LICENSE ├── README.md ├── debs ├── ros-humble-robotnik-common-msgs_1.1.0-20250825.162558-e5e07b8_amd64.deb ├── ros-humble-robotnik-controllers-msgs_1.1.0-20250825.162609-e5e07b8_amd64.deb ├── ros-humble-robotnik-controllers_1.3.0-20250825.162620-3e8626a_amd64.deb ├── ros-jazzy-robotnik-common-msgs_1.1.0-20251028.200218-e5e07b8_amd64.deb ├── ros-jazzy-robotnik-controllers-msgs_1.1.0-20251028.200144-e5e07b8_amd64.deb └── ros-jazzy-robotnik-controllers_1.3.0-20251028.200016-7e7bf8a_amd64.deb ├── dependencies ├── repos │ └── common.repo.yml └── requirements │ ├── base │ └── packages.txt │ └── builder │ └── packages.txt ├── docker-compose.yaml ├── docs ├── assets │ ├── img │ │ ├── LOGO BLANCO-ROJO.png │ │ ├── RBVogui_Docking.gif │ │ ├── gazebo-logo.png │ │ ├── ignition_simulation_view.png │ │ ├── rb-watcher_gazebo.png │ │ ├── robotnik-logo.png │ │ ├── robotnik_simulation_structure.png │ │ └── simulation_view.png │ ├── robots │ │ ├── rb-1.png │ │ ├── rb-fiqus.png │ │ ├── rb-kairos-plus.png │ │ ├── rb-kairos.png │ │ ├── rb-robout-plus.png │ │ ├── rb-robout.png │ │ ├── rb-summit-xl.png │ │ ├── rb-theron.png │ │ ├── rb-vogui-plus.png │ │ ├── rb-vogui-xl.png │ │ ├── rb-vogui.png │ │ └── rb-watcher.png │ └── world │ │ ├── demo.png │ │ ├── empty.png │ │ ├── ionic.png │ │ └── lightweight_scene.png └── gazebo-harmonic-humble.md ├── entrypoint.sh ├── env └── robot.env ├── robotnik_gazebo_ignition ├── CMakeLists.txt ├── LICENSE ├── README.md ├── config │ ├── profile │ │ ├── rb1 │ │ │ └── ros2_control.yaml │ │ ├── rbfiqus │ │ │ └── ros2_control.yaml │ │ ├── rbkairos │ │ │ └── ros2_control.yaml │ │ ├── rbrobout │ │ │ └── ros2_control.yaml │ │ ├── rbsummit │ │ │ └── ros2_control.yaml │ │ ├── rbsummit_steel │ │ │ └── ros2_control.yaml │ │ ├── rbtheron │ │ │ └── ros2_control.yaml │ │ ├── rbvogui │ │ │ └── ros2_control.yaml │ │ ├── rbvogui_xl │ │ │ └── ros2_control.yaml │ │ └── rbwatcher │ │ │ └── ros2_control.yaml │ └── rviz_config.rviz ├── hooks │ └── robotnik_gazebo_ignition.sh.in ├── launch │ ├── spawn_robot.launch.py │ └── spawn_world.launch.py ├── models │ ├── gz_warehouse │ │ ├── NOTES │ │ ├── meshes │ │ │ ├── Asphalt010_1K_Color.jpg │ │ │ ├── Rough_Square_Concrete_Block.jpg │ │ │ ├── Tape001_1K_Color.png │ │ │ ├── Terrazzo005_1K_Color.jpg │ │ │ ├── ground.png │ │ │ ├── warehouse.dae │ │ │ └── warehouse_colision.stl │ │ ├── model.config │ │ ├── model.sdf │ │ └── thumbnails │ │ │ └── 1.png │ ├── robotnik_charging_station │ │ ├── material │ │ │ ├── scripts │ │ │ │ └── marker1_border_12cm.material │ │ │ └── textures │ │ │ │ └── marker1_border_12cm.png │ │ ├── meshes │ │ │ └── summit_docking_station.stl │ │ ├── model.config │ │ └── model.sdf │ └── warehouse_simple │ │ ├── meshes │ │ └── warehouse.stl │ │ ├── model.config │ │ ├── model.sdf │ │ └── thumbnails │ │ └── thumbnail.png ├── package.xml ├── scripts │ └── multiple.sh └── worlds │ ├── demo.world │ ├── empty.world │ ├── ionic.world │ └── lightweight_scene.world ├── robotnik_simulation.humble.repos └── robotnik_simulation.jazzy.repos /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG base_image="robotnik/ros" 2 | ARG ros_distro="jazzy" 3 | ARG image_base_version="0.6.2" 4 | ARG ros_mirror="ros.mirror.robotnik.ws" 5 | 6 | FROM ${base_image}:${ros_distro}-builder-${image_base_version} AS builder 7 | 8 | ENV DEBIAN_FRONTEND=noninteractive 9 | 10 | USER root 11 | 12 | # Install compiled packages 13 | RUN --mount=type=bind,\ 14 | target=/tmp/requirements.txt,\ 15 | source=dependencies/requirements/builder/packages.txt \ 16 | true \ 17 | && if \ 18 | timeout 2 curl -IsS http://${ros_mirror} &>/dev/null; \ 19 | then \ 20 | sed -i \ 21 | "s#packages.ros.org#${ros_mirror}#" \ 22 | /etc/apt/sources.list.d/ros-latest.list ;\ 23 | fi \ 24 | && apt-fast update \ 25 | && apt-fast install -q -y \ 26 | --no-install-recommends \ 27 | $(eval "echo $(cat /tmp/requirements.txt | xargs)") \ 28 | && apt-get clean -q -y \ 29 | && apt-get autoremove -q -y \ 30 | && rm -rf /var/lib/apt/lists/* \ 31 | && true 32 | 33 | USER ${USER_NAME} 34 | 35 | RUN --mount=type=bind,\ 36 | source=./dependencies/repos/common.repo.yml,\ 37 | target=/tmp/common.repo.yml,ro \ 38 | vcs import \ 39 | --input /tmp/common.repo.yml \ 40 | --shallow 41 | 42 | 43 | # Generate deb packages 44 | RUN generate_debs.sh 45 | 46 | RUN cp /home/robot/robot_ws/src/robotnik_simulation/debs/ros-${ROS_DISTRO}-*.deb /home/robot/robot_ws/debs 47 | WORKDIR /home/robot/robot_ws/debs 48 | # Generate Packages.gz 49 | RUN dpkg-scanpackages . | gzip -9c > Packages.gz 50 | 51 | 52 | # BASE 53 | FROM ${base_image}:${ros_distro}-base-${image_base_version} AS base 54 | 55 | # Add Gazebo GPG key 56 | RUN sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'\ 57 | && wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - 58 | 59 | USER root 60 | # Install compiled packages and dependencies 61 | RUN \ 62 | --mount=\ 63 | type=bind,\ 64 | from=builder,\ 65 | source=/home/robot/robot_ws/debs,\ 66 | target=/tmp/debs \ 67 | --mount=\ 68 | type=bind,\ 69 | target=/tmp/requirements.txt,\ 70 | source=dependencies/requirements/base/packages.txt \ 71 | true \ 72 | && if \ 73 | timeout 2 curl -IsS http://${ros_mirror} &>/dev/null; \ 74 | then \ 75 | sed -i \ 76 | "s#packages.ros.org#${ros_mirror}#" \ 77 | /etc/apt/sources.list.d/ros-latest.list ;\ 78 | fi \ 79 | && echo "deb [trusted=yes] file:///tmp/debs/ ./" | tee /etc/apt/sources.list.d/debs.list \ 80 | #&& cp /etc/apt/sources.list.d/debs.list /home/robot/robot_ws/ && cp -r /tmp/debs /home/robot/robot_ws/ \ 81 | && apt-get update \ 82 | && apt-fast install -q -y \ 83 | --no-install-recommends \ 84 | $(eval "echo $(cat /tmp/requirements.txt | xargs)") \ 85 | #&& sed -i "s#${ros_mirror}#packages.ros.org#" /etc/apt/sources.list.d/ros-latest.list \ 86 | && dpkg -i $(find /tmp/debs -name "*.deb" | xargs) \ 87 | #&& cp -r /tmp/debs /home/robot/robot_ws/ \ 88 | && apt-get clean -q -y \ 89 | && apt-get autoremove -q -y \ 90 | && rm -rf /var/lib/apt/lists/* \ 91 | && rm /etc/apt/sources.list.d/debs.list \ 92 | && true 93 | 94 | USER ${USER_NAME} 95 | 96 | # The image is built to run gazebo ignition by default if no other setup is provided. 97 | ENV STARTUP_TYPE="launch" 98 | ENV ROS_BU_PKG="robotnik_gazebo_ignition" 99 | ENV ROS_BU_LAUNCH="spawn_world.launch.py" 100 | 101 | ENV QT_X11_NO_MITSHM=1 102 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2025, Robotnik Automation S.L. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of the copyright holder nor the names of its contributors 15 | may be used to endorse or promote products derived from this software without 16 | specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Contributors][contributors-shield]][contributors-url] 2 | [![Forks][forks-shield]][forks-url] 3 | [![Stargazers][stars-shield]][stars-url] 4 | [![Issues][issues-shield]][issues-url] 5 | [![License][license-shield]][license-url] 6 | [![LinkedIn][linkedin-shield]][linkedin-url] 7 | 8 |

9 | Robotnik logo 10 |

11 | 12 |

13 | 14 | ## Overview 15 | Simulation-based environments and launch assets for Robotnik platforms on ROS 2. 16 | 17 |

18 | RBVogui Docking Simulation 19 |

20 | 21 | ## Supported Robots 22 | 23 | | Robot | Robot Model | Kinematics | Photos | 24 | |-------|-------------|------------|-------| 25 | | [RB-WATCHER](https://robotnik.eu/robotnik-robots/RB-WATCHER/) | rbwatcher | `skid-steering` | RB-WATCHER | 26 | | [RB-SUMMIT](https://robotnik.eu/products/mobile-robots/rb-summit/) | rbsummit | `skid-steering` | RB-SUMMIT | 27 | | [RB-VOGUI](https://robotnik.eu/robotnik-robots/rb-vogui/) | rbvogui, rbvogui_plus | `omni-directional`, `ackermann` | RB-VOGUI | 28 | | [RB-VOGUI-XL](https://robotnik.eu/robotnik-robots/rb-vogui-xl/) | rbvogui_xl | `omni-directional`, `ackermann` | RB-VOGUI-XL | 29 | | [RB-FIQUS](https://robotnik.eu/robotnik-robots/rb-fiqus/) | rbfiqus | `omni-directional`, `ackermann` | RB-FIQUS | 30 | | [RB-KAIROS](https://robotnik.eu/robotnik-robots/rb-kairos/) | rbkairos, rbkairos_plus | `omni-directional` | RB-KAIROS | 31 | | [RB-ROBOUT](https://robotnik.eu/robotnik-robots/rb-robout/) | rbrobout, rbrobout_plus | `omni-directional` | RB-ROBOUT | 32 | | [RB-1*](https://robotnik.eu/robotnik-robots/rb-1/) | rb1 | `differential` | RB-1 (discontinued) | 33 | | [RB-THERON](https://robotnik.eu/robotnik-robots/rb-theron/) | rbtheron, rbtheron_plus | `differential` | RB-THERON | 34 | 35 | *Note: The RB-1 robot is discontinued and may not be supported in future releases.* 36 | 37 | ## Available Simulators 38 | 39 | | Simulator | Package | Instructions | 40 | |-----------|---------|--------------| 41 | | Gazebo Logo | `robotnik_gazebo_ignition` | [README](robotnik_gazebo_ignition/README.md) | 42 | 43 | ## Related projects 44 | 45 | Projects built upon this repository: 46 | 47 | - 🕹️ [`robotnik_o3de`](https://github.com/RobotnikAutomation/robotnik_o3de): [O3DE](https://o3de.org/)-based simulation. 48 | - 🐞 [`robotnik_webots`](https://github.com/RobotnikAutomation/robotnik_webots): [Webots](https://cyberbotics.com/) based simulation. 49 | - 🟢 [`robotnik_isaac`](https://github.com/RobotnikAutomation/robotnik_isaac): [Isaac Sim](https://developer.nvidia.com/isaac-sim) based simulation. 50 | - 🎮 [`robotnik_unity`](https://github.com/RobotnikAutomation/robotnik_unity): [Unity](https://unity.com/) based simulation. 51 | 52 | ## Contributing 53 | 54 | Contributions are welcome. 55 | 56 | 1. Fork the repository 57 | 2. Create a feature branch: `git checkout -b feature/jazzy/AmazingFeature` 58 | 3. Commit: `git commit -m "Add AmazingFeature"` 59 | 4. Push: `git push origin feature/AmazingFeature` 60 | 5. Open a PR and describe your changes 61 | 62 | 63 | Special thanks to all contributors! 64 | 65 | 66 | Contributors graph 67 | 68 | 69 | ## License 70 | 71 | Distributed under **BSD-3**. See [`LICENSE`][license-url]. 72 | 73 | 74 | 75 | [contributors-shield]: https://img.shields.io/github/contributors/RobotnikAutomation/robotnik_simulation.svg?style=for-the-badge 76 | [contributors-url]: https://github.com/RobotnikAutomation/robotnik_simulation/graphs/contributors 77 | [forks-shield]: https://img.shields.io/github/forks/RobotnikAutomation/robotnik_simulation.svg?style=for-the-badge 78 | [forks-url]: https://github.com/RobotnikAutomation/robotnik_simulation/network/members 79 | [stars-shield]: https://img.shields.io/github/stars/RobotnikAutomation/robotnik_simulation.svg?style=for-the-badge 80 | [stars-url]: https://github.com/RobotnikAutomation/robotnik_simulation/stargazers 81 | [issues-shield]: https://img.shields.io/github/issues/RobotnikAutomation/robotnik_simulation.svg?style=for-the-badge 82 | [issues-url]: https://github.com/RobotnikAutomation/robotnik_simulation/issues 83 | [license-shield]: https://img.shields.io/github/license/RobotnikAutomation/robotnik_simulation.svg?style=for-the-badge 84 | [license-url]: LICENSE 85 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 86 | [linkedin-url]: https://www.linkedin.com/company/robotnik-automation/ 87 | [product-screenshot]: docs/assets/img/ignition_simulation_view.png 88 | -------------------------------------------------------------------------------- /debs/ros-humble-robotnik-common-msgs_1.1.0-20250825.162558-e5e07b8_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-humble-robotnik-common-msgs_1.1.0-20250825.162558-e5e07b8_amd64.deb -------------------------------------------------------------------------------- /debs/ros-humble-robotnik-controllers-msgs_1.1.0-20250825.162609-e5e07b8_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-humble-robotnik-controllers-msgs_1.1.0-20250825.162609-e5e07b8_amd64.deb -------------------------------------------------------------------------------- /debs/ros-humble-robotnik-controllers_1.3.0-20250825.162620-3e8626a_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-humble-robotnik-controllers_1.3.0-20250825.162620-3e8626a_amd64.deb -------------------------------------------------------------------------------- /debs/ros-jazzy-robotnik-common-msgs_1.1.0-20251028.200218-e5e07b8_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-jazzy-robotnik-common-msgs_1.1.0-20251028.200218-e5e07b8_amd64.deb -------------------------------------------------------------------------------- /debs/ros-jazzy-robotnik-controllers-msgs_1.1.0-20251028.200144-e5e07b8_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-jazzy-robotnik-controllers-msgs_1.1.0-20251028.200144-e5e07b8_amd64.deb -------------------------------------------------------------------------------- /debs/ros-jazzy-robotnik-controllers_1.3.0-20251028.200016-7e7bf8a_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/debs/ros-jazzy-robotnik-controllers_1.3.0-20251028.200016-7e7bf8a_amd64.deb -------------------------------------------------------------------------------- /dependencies/repos/common.repo.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2023, Robotnik Automation S.L. 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # * Redistributions of source code must retain the above copyright 7 | # notice, this list of conditions and the following disclaimer. 8 | # * Redistributions in binary form must reproduce the above copyright 9 | # notice, this list of conditions and the following disclaimer in the 10 | # documentation and/or other materials provided with the distribution. 11 | # * Neither the name of the Robotnik Automation S.L.L. nor the 12 | # names of its contributors may be used to endorse or promote products 13 | # derived from this software without specific prior written permission. 14 | # 15 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 17 | # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Robotnik Automation S.L.L. 19 | # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 20 | # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 | # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 | # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 | # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 | # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 25 | # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | --- 27 | repositories: 28 | src/robotnik_simulation: 29 | type: git 30 | url: https://github.com/RobotnikAutomation/robotnik_simulation.git 31 | version: jazzy-devel 32 | src/robotnik_description: 33 | type: git 34 | url: https://github.com/RobotnikAutomation/robotnik_description.git 35 | version: jazzy-devel 36 | src/robotnik_sensors: 37 | type: git 38 | url: https://github.com/RobotnikAutomation/robotnik_sensors.git 39 | version: jazzy-devel 40 | src/robotnik_common: 41 | type: git 42 | url: https://github.com/RobotnikAutomation/robotnik_common.git 43 | version: jazzy-devel 44 | src/robotnik_interfaces: 45 | type: git 46 | url: https://github.com/RobotnikAutomation/robotnik_interfaces.git 47 | version: jazzy-devel 48 | src/Universal_Robots_ROS2_Description: 49 | type: git 50 | url: https://github.com/RobotnikAutomation/Universal_Robots_ROS2_Description.git 51 | version: fix/gazebo-control-jazzy 52 | -------------------------------------------------------------------------------- /dependencies/requirements/base/packages.txt: -------------------------------------------------------------------------------- 1 | libgz-sim8-dev 2 | ros-jazzy-ros-gz-sim 3 | ros-jazzy-ros-gz 4 | ros-jazzy-controller-manager 5 | ros-jazzy-gz-ros2-control 6 | ros-jazzy-joint-state-broadcaster 7 | ros-jazzy-teleop-twist-keyboard 8 | ros-jazzy-joint-trajectory-controller 9 | ros-jazzy-rqt-joint-trajectory-controller 10 | ros-jazzy-joint-state-publisher 11 | ros-jazzy-joint-state-publisher-gui 12 | ros-jazzy-plotjuggler-ros 13 | -------------------------------------------------------------------------------- /dependencies/requirements/builder/packages.txt: -------------------------------------------------------------------------------- 1 | build-essential 2 | git 3 | python3-vcstool 4 | python3-colcon-common-extensions 5 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | robotnik_simulator: 3 | container_name: robotnik_simulator 4 | image: robotnik_simulation-robotnik_simulation:latest 5 | build: 6 | context: . 7 | dockerfile: ./Dockerfile 8 | args: 9 | base_image: robotnik/ros 10 | ros_distro: jazzy 11 | image_base_version: 0.6.2 12 | ros_mirror: ros.mirror.robotnik.ws 13 | network_mode: host 14 | privileged: true 15 | runtime: nvidia 16 | environment: 17 | ROS_DOMAIN_ID: 0 18 | DISPLAY: ${DISPLAY} # Forward X11 display 19 | NVIDIA_DRIVER_CAPABILITIES: compute,utility,graphics # Allow GPU access 20 | NVIDIA_VISIBLE_DEVICES: all # Expose all GPUs 21 | devices: 22 | - "/dev/dri:/dev/dri" # Allow OpenGL rendering 23 | - /tmp/.X11-unix:/tmp/.X11-unix 24 | robotnik_robot_spawner: 25 | container_name: robotnik_robot_spawner 26 | image: robotnik_simulation-robotnik_simulation:latest 27 | network_mode: host 28 | privileged: true 29 | runtime: nvidia 30 | env_file: 31 | - env/robot.env 32 | environment: 33 | ROS_DOMAIN_ID: 0 34 | DISPLAY: ${DISPLAY} # Forward X11 display 35 | NVIDIA_DRIVER_CAPABILITIES: compute,utility,graphics # Allow GPU access 36 | NVIDIA_VISIBLE_DEVICES: all # Expose all GPUs 37 | ROS_BU_LAUNCH: spawn_robot.launch.py robot:=$${ROBOT} robot_model:=$${ROBOT_MODEL} has_arm:=$${HAS_ARM} 38 | devices: 39 | - "/dev/dri:/dev/dri" # Allow OpenGL rendering 40 | - /tmp/.X11-unix:/tmp/.X11-unix 41 | depends_on: 42 | robotnik_simulator: 43 | condition: service_healthy 44 | 45 | volumes: 46 | - ./entrypoint.sh:/usr/local/bin/ros_entrypoint.sh 47 | 48 | 49 | -------------------------------------------------------------------------------- /docs/assets/img/LOGO BLANCO-ROJO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/LOGO BLANCO-ROJO.png -------------------------------------------------------------------------------- /docs/assets/img/RBVogui_Docking.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/RBVogui_Docking.gif -------------------------------------------------------------------------------- /docs/assets/img/gazebo-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/gazebo-logo.png -------------------------------------------------------------------------------- /docs/assets/img/ignition_simulation_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/ignition_simulation_view.png -------------------------------------------------------------------------------- /docs/assets/img/rb-watcher_gazebo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/rb-watcher_gazebo.png -------------------------------------------------------------------------------- /docs/assets/img/robotnik-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/robotnik-logo.png -------------------------------------------------------------------------------- /docs/assets/img/robotnik_simulation_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/robotnik_simulation_structure.png -------------------------------------------------------------------------------- /docs/assets/img/simulation_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/img/simulation_view.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-1.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-fiqus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-fiqus.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-kairos-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-kairos-plus.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-kairos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-kairos.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-robout-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-robout-plus.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-robout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-robout.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-summit-xl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-summit-xl.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-theron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-theron.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-vogui-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-vogui-plus.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-vogui-xl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-vogui-xl.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-vogui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-vogui.png -------------------------------------------------------------------------------- /docs/assets/robots/rb-watcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/robots/rb-watcher.png -------------------------------------------------------------------------------- /docs/assets/world/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/world/demo.png -------------------------------------------------------------------------------- /docs/assets/world/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/world/empty.png -------------------------------------------------------------------------------- /docs/assets/world/ionic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/world/ionic.png -------------------------------------------------------------------------------- /docs/assets/world/lightweight_scene.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/docs/assets/world/lightweight_scene.png -------------------------------------------------------------------------------- /docs/gazebo-harmonic-humble.md: -------------------------------------------------------------------------------- 1 | # Gazebo Harmonic - ROS2 Humble 2 | 3 | This document provides a guide to using Robotnik Simulation with: 4 | - Gazebo Harmonic 5 | - ROS2 Humble. 6 | 7 | This combination is tested and working follow the instructions below to set up your environment. 8 | 9 | 1. Install the required packages: 10 | 11 | ```bash 12 | sudo apt-get update 13 | sudo apt-get install curl lsb-release gnupg 14 | ``` 15 | 16 | 2. Install Gazebo Harmonic 17 | 18 | ```bash 19 | sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg 20 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null 21 | sudo apt-get update 22 | sudo apt-get install gz-harmonic 23 | ``` 24 | 25 | 3. Install Connect with ROS2 26 | 27 | > **WARNING**: The package `ros-humble-ros-gzharmonic` conflicts with `ros-humble-ros-gz*`. Remove those packages before installing. 28 | 29 | ```bash 30 | sudo apt-get remove ros-humble-ros-gz* 31 | sudo apt-get install ros-humble-ros-gzharmonic 32 | ``` 33 | 34 | 4. Clone source 35 | 36 | ```yaml 37 | # dependencies.repos 38 | gz_ros2_control: 39 | type: git 40 | url: https://github.com/ros-controls/gz_ros2_control.git 41 | version: 0.7.16 42 | visualization_tutorials: 43 | type: git 44 | url: https://github.com/ros-visualization/visualization_tutorials.git 45 | version: b43b3f6a867b1d799af3edba673c56d37178e847 # ros2 46 | robotnik_common: 47 | type: git 48 | url: https://github.com/RobotnikAutomation/robotnik_common.git 49 | version: 1.2.0 50 | robotnik_description: 51 | type: git 52 | url: https://github.com/RobotnikAutomation/robotnik_description.git 53 | version: bacd4a4d3b2f021cdc5c4ac4f56585d15c54eaff # Waiting for upstream release 54 | robotnik_interfaces: 55 | type: git 56 | url: https://github.com/RobotnikAutomation/robotnik_interfaces.git 57 | version: 1.1.0 58 | robotnik_sensors: 59 | type: git 60 | url: https://github.com/RobotnikAutomation/robotnik_sensors.git 61 | version: faaab6e1db429a6708c65d7311b148bba592fd1a # humble-devel 62 | robotnik_simulation: 63 | type: git 64 | url: https://github.com/RobotnikAutomation/robotnik_simulation.git 65 | version: jazzy-devel # Latest version 66 | ``` 67 | 68 | ```bash 69 | vcs import --input-file dependencies.repos src 70 | ``` 71 | 72 | 5. Install dependencies 73 | 74 | ```bash 75 | sudo apt-get update 76 | cd robotnik_simulation 77 | sudo apt-get install -y ./debs/ros-${ROS_DISTRO}-*.deb 78 | rosdep install --from-paths src --ignore-src -r -y 79 | ``` 80 | 81 | 6. Compile workspace 82 | 83 | ```bash 84 | export GZ_VERSION=harmonic 85 | colcon build --symlink-install 86 | ``` 87 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2024, Robotnik Automation S.L. 4 | # All rights reserved. 5 | # 6 | # Redistribution and use in source and binary forms, with or without 7 | # modification, are permitted provided that the following conditions are met: 8 | # * Redistributions of source code must retain the above copyright 9 | # notice, this list of conditions and the following disclaimer. 10 | # * Redistributions in binary form must reproduce the above copyright 11 | # notice, this list of conditions and the following disclaimer in the 12 | # documentation and/or other materials provided with the distribution. 13 | # * Neither the name of the Robotnik Automation S.L. nor the 14 | # names of its contributors may be used to endorse or promote products 15 | # derived from this software without specific prior written permission. 16 | # 17 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18 | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | # DISCLAIMED. IN NO EVENT SHALL Robotnik Automation S.L. BE LIABLE FOR ANY 21 | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | 28 | # Entrypoint script, loads other scripts and executes the command 29 | 30 | set -e 31 | 32 | function entrypoint_log() { 33 | if [ -z "${ROS_ENTRYPOINT_QUIET_LOGS:-}" ]; then 34 | echo "$@" 35 | fi 36 | } 37 | 38 | function source_ros_entrypoint_dir() { 39 | if find /ros_entrypoint.d/ -mindepth 1 -maxdepth 1 -type f -print -quit 2>/dev/null | read v; then 40 | entrypoint_log "$0: /ros_entrypoint.d/ is not empty, will attempt to execute scripts" 41 | find "/ros_entrypoint.d/" -follow -type f -print | sort -V | while read -r f; do 42 | case "$f" in 43 | *.sh) 44 | if [ -x "$f" ]; then 45 | entrypoint_log "$0: running $f" 46 | "$f" 47 | else 48 | entrypoint_log "$0: ignoring $f, not executable" 49 | fi 50 | ;; 51 | *) entrypoint_log "$0: ignoring $f" ;; 52 | esac 53 | done 54 | entrypoint_log "$0: /ros_entrypoint.d/ has been processed successfully" 55 | else 56 | entrypoint_log "$0: No files found /ros_entrypoint.d/, skipping" 57 | fi 58 | } 59 | 60 | function use_generic() { 61 | exec_cmd="${*}" 62 | if [[ "${exec_cmd}" == "__default_cmd__" ]]; then 63 | exec_cmd="${GEN_COMMAND}" 64 | fi 65 | return 0 66 | } 67 | 68 | function use_rosmon() { 69 | if [[ ${ROS_VERSION} == "2" ]]; then 70 | entrypoint_log "$0: ros mon is not supported on ros2" 71 | return 1 72 | fi 73 | rosmon_name="${ROBOT_ID}_rosmon_${ROS_BU_DESC}" 74 | exec_cmd="rosrun rosmon_core rosmon" 75 | exec_cmd="${exec_cmd} --flush-stdout" 76 | exec_cmd="${exec_cmd} --disable-ui" 77 | exec_cmd="${exec_cmd} --name=${rosmon_name}" 78 | exec_cmd="${exec_cmd} ${ROS_BU_PKG}" 79 | exec_cmd="${exec_cmd} ${ROS_BU_LAUNCH}" 80 | return 0 81 | } 82 | 83 | function use_ros_run() { 84 | if [[ ${ROS_VERSION} == "1" ]]; then 85 | exec_cmd="rosrun" 86 | fi 87 | if [[ ${ROS_VERSION} == "2" ]]; then 88 | exec_cmd="ros2 run" 89 | fi 90 | exec_cmd="${exec_cmd} ${ROS_BU_PKG}" 91 | exec_cmd="${exec_cmd} ${ROS_BU_LAUNCH}" 92 | return 0 93 | } 94 | 95 | function use_ros_launch() { 96 | if [[ ${ROS_VERSION} == "1" ]]; then 97 | exec_cmd="roslaunch" 98 | fi 99 | if [[ ${ROS_VERSION} == "2" ]]; then 100 | exec_cmd="ros2 launch" 101 | fi 102 | exec_cmd="${exec_cmd} ${ROS_BU_PKG}" 103 | exec_cmd="${exec_cmd} ${ROS_BU_LAUNCH}" 104 | return 0 105 | } 106 | 107 | function fake_screen_startup() { 108 | if ! is_graphical; then 109 | return 1 110 | fi 111 | # if the graphical start is selected do nothing 112 | if ! [[ "${GRAPHICAL_START}" == true ]]; then 113 | return 0 114 | fi 115 | export GUI_COMMAND="${exec_cmd}" 116 | exec_cmd="/usr/local/bin/vnc_launcher.sh" 117 | } 118 | 119 | function is_graphical() { 120 | if ! [[ -r "/usr/local/bin/vnc_launcher.sh" ]]; then 121 | entrypoint_log "$0: VNC base graphical execution is not allowed on this version" 122 | return 1 123 | fi 124 | GRAPHICAL_START="true" 125 | return 0 126 | } 127 | 128 | function use_graphical() { 129 | if ! is_graphical; then 130 | return 1 131 | fi 132 | exec_cmd="/usr/local/bin/vnc_launcher.sh" 133 | return 0 134 | } 135 | 136 | function select_ros_launcher() { 137 | local startup_func="use_generic" 138 | if [[ "${*}" == "__default_cmd__" ]]; then 139 | case "${STARTUP_TYPE}" in 140 | generic) 141 | startup_func="use_generic" 142 | ;; 143 | rosmon) 144 | startup_func="use_rosmon" 145 | ;; 146 | launch) 147 | startup_func="use_ros_launch" 148 | ;; 149 | run) 150 | startup_func="use_ros_run" 151 | ;; 152 | graphical) 153 | startup_func="use_graphical" 154 | ;; 155 | *) 156 | entrypoint_log "$0: not valid" 157 | return 1 158 | ;; 159 | esac 160 | else 161 | entrypoint_log "$0: custom command detected, ignoring STARTUP_TYPE" 162 | fi 163 | if ! eval "${startup_func} ${@}"; then 164 | return 1 165 | fi 166 | if [[ ${FAKE_SCREEN} == "true" ]]; then 167 | fake_screen_startup 168 | return $? 169 | fi 170 | return 0 171 | } 172 | 173 | function check_nodes() { 174 | # Check if enabled and nodes are set 175 | if ! [[ ${CHECK_NODES} == "true" ]]; then 176 | return 0 177 | fi 178 | if [[ -z ${NODES_TO_CHECK} ]]; then 179 | return 0 180 | fi 181 | 182 | # Wait for nodes to be available 183 | entrypoint_log "$0: env variable CHECK_NODES is set to true, waiting for nodes to be available: \"${NODES_TO_CHECK}\"" 184 | entrypoint_log "$0: ---" 185 | i=0 186 | while true; do 187 | i=$((i + 1)) 188 | if eval "${HEALTHCHECK_EXEC} ${NODES_TO_CHECK} > /tmp/healthcheck.log"; then 189 | return 0 190 | fi 191 | if [[ $(( i%5 )) -eq 0 ]] 192 | then 193 | i=0 194 | cat /tmp/healthcheck.log 195 | entrypoint_log "$0: ---" 196 | fi 197 | sleep 0.25 198 | done 199 | entrypoint_log "$0: error: at least one of follwing nodes is not available: \"${NODES_TO_CHECK}\"" 200 | return 1 201 | } 202 | 203 | function _trap_handler() { 204 | entrypoint_log "$0: caught signal \"$1\" before starting main process, exiting" 205 | exit 0 206 | } 207 | 208 | function main() { 209 | # Trap SIGTERM and SIGINT to stop the container gracefully 210 | # it only works before the exec command 211 | trap '_trap_handler SIGTERM' SIGTERM 212 | trap '_trap_handler SIGINT' SIGINT 213 | 214 | # Source all scripts in /ros_entrypoint.d/ 215 | source_ros_entrypoint_dir 216 | 217 | # Set up ROS environment 218 | if ! source env_loader.sh 219 | then 220 | entrypoint_log "$0: error loading ROS environment, check logs" 221 | fi 222 | 223 | # Fill exec_cmd 224 | if ! select_ros_launcher "${@}" 225 | then 226 | return 1 227 | fi 228 | 229 | # substitute the environment variables 230 | exec_cmd=$(eval echo "${exec_cmd}") 231 | entrypoint_log "$0: executing ${exec_cmd}" 232 | if ! check_nodes 233 | then 234 | return 1 235 | fi 236 | entrypoint_log "$0: all nodes are available, executing ${exec_cmd}" 237 | exec /usr/bin/tini -- ${exec_cmd} 238 | } 239 | 240 | main "${@}" 241 | -------------------------------------------------------------------------------- /env/robot.env: -------------------------------------------------------------------------------- 1 | # This file aims to set the environment variables for the robot. 2 | # Uncomment the robot you are using to set the variables accordingly. 3 | # Make sure to comment the other variables to avoid overriding them. 4 | 5 | # Environment variables: 6 | # ROBOT: Base robot platform 7 | # Available options: 8 | # rbkairos, rbrobout, rbsummit, rbtheron, rbvogui, rbvogui_xl 9 | # 10 | # ROBOT_MODEL: detailed variant/configuration. Must match ROBOT 11 | # Available options: 12 | # rbkairos, rbkairos_plus, 13 | # rbrobout, rbrobout_plus, 14 | # rbsummit, 15 | # rbtheron, 16 | # rbvogui, 17 | # rbvogui_xl 18 | # 19 | # HAS_ARM: Indicates if the robot has a robotic arm. 20 | # This enables arm controllers and related functions. 21 | # Options: true, false 22 | 23 | ROBOT=rbkairos 24 | ROBOT_MODEL=rbkairos 25 | HAS_ARM=false 26 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.8) 2 | project(robotnik_gazebo_ignition) 3 | 4 | find_package(ament_cmake REQUIRED) 5 | 6 | ament_environment_hooks("${CMAKE_CURRENT_SOURCE_DIR}/hooks/${PROJECT_NAME}.sh.in") 7 | 8 | if(BUILD_TESTING) 9 | find_package(ament_lint_auto REQUIRED) 10 | set(ament_cmake_copyright_FOUND TRUE) 11 | set(ament_cmake_cpplint_FOUND TRUE) 12 | ament_lint_auto_find_test_dependencies() 13 | endif() 14 | 15 | # Install launch files 16 | install( 17 | DIRECTORY config launch models worlds scripts 18 | DESTINATION share/${PROJECT_NAME}/ 19 | ) 20 | 21 | ament_package() 22 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/README.md: -------------------------------------------------------------------------------- 1 | # Robotnik Gazebo Ignition 2 | 3 | Robotnik Gazebo Ignition Simulation View 4 | 5 | This package provides Gazebo Ignition plugins and resources for Robotnik robots. 6 | 7 | ## 📥 Installation 8 | 9 | 1. Setup sources and keys for Gazebo packages: 10 | ```sh 11 | sudo apt update 12 | sudo apt-get install curl lsb-release gnupg 13 | sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg 14 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null 15 | ``` 16 | 17 | 2. Install Gazebo Harmonic. 18 | ```sh 19 | sudo apt-get update 20 | sudo apt-get install gz-harmonic 21 | ``` 22 | 23 | 3. Install ROS 2 Jazzy and ROS-GZ bridge. 24 | ```sh 25 | sudo apt install ros-jazzy-ros-gz 26 | ``` 27 | 28 | 4. Set up workspace and install dependencies: 29 | 30 | ```sh 31 | # Workspace 32 | mkdir -p ~/ros2_ws/src 33 | cd ~/ros2_ws 34 | 35 | # Robotnik and related packages (ROS 2 Jazzy) 36 | vcs import --input https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/jazzy-devel/robotnik_simulation.jazzy.repos src/ 37 | 38 | # Install prebuilt simulation debs from this repo (run at repo root) 39 | cd ~/ros2_ws/src/robotnik/robotnik_simulation 40 | sudo apt-get install -y ./debs/ros-${ROS_DISTRO}-*.deb 41 | 42 | # Resolve dependencies 43 | source /opt/ros/jazzy/setup.bash 44 | cd ~/ros2_ws 45 | rosdep update 46 | rosdep install --from-paths src --ignore-src -r -y 47 | ``` 48 | 49 | 5. Build the workspace: 50 | 51 | ```sh 52 | cd ~/ros2_ws 53 | colcon build --symlink-install 54 | source install/setup.bash 55 | ``` 56 | 57 | ## 🚀 Usage 58 | 59 | To use the simulation, you need to spawn a world and then spawn at least one robot. Continue reading for instructions. 60 | 61 | ### 🗺️ Spawn World 62 | 63 | First step to use this simulation is launch world where the robot will be spawned. For example, to launch the `empty` world, use the following command: 64 | 65 | #### Basic 66 | ```bash 67 | # Basic 68 | ros2 launch robotnik_gazebo_ignition spawn_world.launch.py world:=empty 69 | 70 | # With GUI disabled 71 | ros2 launch robotnik_gazebo_ignition spawn_world.launch.py world:=empty gui:=false 72 | ``` 73 | 74 | #### Advanced 75 | ```bash 76 | # Generic pattern 77 | ros2 launch robotnik_gazebo_ignition spawn_world.launch.py world:= gui:= 78 | ``` 79 | 80 | #### Parameters 81 | | Name | Required | Purpose | Example | 82 | |---|---|---|---| 83 | | `world` | no | Name of the world file (without the `.world` extension) | `empty` | 84 | | `world_path` | no | Full path to a custom world file (overrides `world` parameter) | `/path/to/custom_world.sdf` | 85 | | `gui` | no | Enable or disable Gazebo GUI | `true` or `false` | 86 | 87 | #### Supported Worlds 88 | 89 | | Name | Description | Thumbnail | 90 | |------|-------------|-----------| 91 | | `empty` | An empty world with a flat ground plane | empty_world | 92 | | `demo` | A demo world with obstacles and ramps for testing robot navigation | demo_world | 93 | | `ionic` | Demo world from Gazebo to show ionic simulation features | ionic_world | 94 | | `lightweight_scene` | A lightweight scene for performance testing | lightweight_scene_world | 95 | 96 | 97 | ### 🤖 Spawn Robot 98 | 99 | Use the launch file to insert a robot into the Gazebo (Ignition) world. 100 | 101 | #### Basic 102 | ```bash 103 | # Basic RB-Watcher 104 | ros2 launch robotnik_gazebo_ignition spawn_robot.launch.py robot:=rbwatcher 105 | 106 | # Specific ID and pose 107 | ros2 launch robotnik_gazebo_ignition spawn_robot.launch.py robot_id:=robot_a robot:=rbwatcher robot_model:=rbwatcher x:=0.0 y:=0.0 z:=0.0 run_rviz:=true 108 | ``` 109 | 110 | #### Advanced 111 | ```bash 112 | # Generic pattern 113 | ros2 launch robotnik_gazebo_ignition spawn_robot.launch.py robot_id:= robot:= robot_model:= x:= y:= z:= 114 | ``` 115 | 116 | #### Parameters 117 | | Name | Required | Purpose | Example | 118 | |---|---|---|---| 119 | | `robot_id` | no | Instance name for the spawned robot | `robot_a` | 120 | | `robot` | no | Robot **type** to spawn, see `supported_robots`, default is `rbwatcher` | `rbwatcher` | 121 | | `robot_model` | no | Specific **model** within the type, see `supported_robots` | `rbwatcher` | 122 | | `x` `y` `z` | no | Spawn position in meters | `0.0 0.0 0.0` | 123 | | `run_rviz` | no | Launch RViz2 with a predefined configuration | `true` or `false` | 124 | | `rviz_config` | no | Full path to a custom RViz2 configuration file (overrides default config and fixed frame must be set in config) | `/path/to/custom_config.rviz` | 125 | 126 | #### Supported Robots 127 | 128 | | robot | robot_model options | Notes | 129 | | -------------- | ----------------------- | --- | 130 | | rbwatcher | rbwatcher | Supported | 131 | | rb1 | rb1 | Limited | 132 | | rbfiqus | rbfiqus | Limited | 133 | | rbkairos | rbkairos, rbkairos_plus | Limited | 134 | | rbrobout | rbrobout, rbrobout_plus | Limited | 135 | | rbsummit | rbsummit | Limited | 136 | | rbsummit_steel | rbsummit_steel | Limited | 137 | | rbtheron | rbtheron, rbtheron_plus | Limited | 138 | | rbvogui | rbvogui, rbvogui_plus | Limited | 139 | | rbvogui_xl | rbvogui_xl | Limited | 140 | 141 | Note: "not well tested" means that the robot has been integrated but may require further validation and adjustments to ensure optimal performance in the simulation environment. 142 | 143 | #### Types vs. models 144 | Description package is [robotnik_description](https://github.com/RobotnikAutomation/robotnik_description), which contains all robot types and models. The distinction is: 145 | - **Robot type**: Category such as `rbwatcher`, `summit_xl`. See the package `robots/` folder for available types. [List of supported robots](https://github.com/RobotnikAutomation/robotnik_description/tree/jazzy-devel/robots). 146 | - **Robot model**: Concrete variant inside a type. If omitted, the default model for that type is used. See the package `robots//models/` folder for available models. [Example models for rbwatcher](https://github.com/RobotnikAutomation/robotnik_description/tree/jazzy-devel/robots/rbwatcher). 147 | 148 | #### Notes 149 | - Use a unique `robot_id` when spawning multiple robots in the same world to avoid name conflicts in topics and frames. 150 | 151 | ## 🎮 Control the Robot 152 | 153 | After spawning the robot, you can control it using command velocity messages. The two main topics for controlling the robot are: 154 | - `//robotnik_base_control/cmd_vel`: This topic is used to send velocity commands to the robot. The messages should be of type `geometry_msgs/msg/TwistStamped`. 155 | - `//robotnik_base_control/cmd_vel_unstamped`: This topic is used to send velocity commands without a timestamp. The messages should be of type `geometry_msgs/msg/Twist`. 156 | 157 | 158 | To control the robot, you can use teleoperation packages such as `teleop_twist_keyboard` or `teleop_twist_joy`. For example, to control the robot using the keyboard, run: 159 | 160 | ```bash 161 | sudo apt install ros-jazzy-teleop-twist-keyboard 162 | 163 | ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r cmd_vel:=/robot/robotnik_base_control/cmd_vel -p stamped:=true 164 | ``` 165 | 166 | Make sure to replace `/robot/robotnik_base_control/cmd_vel` with the appropriate topic name based on the `robot_id` you used when spawning the robot. 167 | 168 | Also, you can use RViz plugin on the bottom right to control the robot by clicking on the arrows. 169 | 170 | ## 🎉 Enjoy 171 | 172 | Example of RBVogui executing docking procedure in Gazebo Ignition. Currently, only for demonstration purposes, no docking controller is provided. 173 | 174 | ![rbvogui_gif](../docs/assets/img/RBVogui_Docking.gif) 175 | 176 | ## Customization 177 | 178 | ### Edit robot model 179 | 180 | Specific robot models can be customized by creating your own URDF/XACRO files based on the existing ones in the `robotnik_description` package. 181 | 182 | 1. Copy the existing robot folder from `robotnik_description/robots//` to a new folder, e.g., `robotnik_description/robots/my_robot/`. 183 | 2. Modify the URDF/XACRO files in the new folder to add or change components as needed. 184 | 3. Update any necessary configuration files for sensors, arms, or other components. 185 | 4. Spawn the customized robot using the `robot_xacro_path` parameter: 186 | 187 | ```sh 188 | ros2 launch robotnik_gazebo_ignition spawn_robot.launch.py robot_xacro_path:= 189 | ``` 190 | 191 | ### Custom control configuration 192 | 193 | Inside the simulation package `robotnik_gazebo_ignition/config/profile`, you can find different control profiles for various Robotnik robots. You can adjust topics, frames, velocities, and controllers there. 194 | 195 | ## 🐳 Docker 196 | 🚧 Work in progress. 🚧 197 | 198 | Use the compose file in the repo root to run a preconfigured simulator container. 199 | 200 | ```sh 201 | docker compose up 202 | ``` 203 | 204 | > **Note**: The first time will take a while as it builds the image. Subsequent runs will be faster. 205 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rb1/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | robotnik_base_control: 4 | ros__parameters: 5 | publish_rate: 50 6 | 7 | # General Params 8 | profile: base 9 | debug: true 10 | open_loop: true 11 | 12 | # Timeouts 13 | joint_command_timeout: 0.1 14 | cmd_vel_timeout: 2.0 15 | 16 | # Odom 17 | odom_frame_id: $(var frame_prefix)odom 18 | base_frame_id: $(var frame_prefix)base_footprint 19 | set_odometry_service: ~/set_odometry 20 | 21 | # Kinematics Params 22 | wheel_radius: 0.0703 # radius: 0.0703 23 | track_width: 0.5032 24 | wheel_base: 0.0 25 | max_steering_position_error: 0.3 26 | 27 | # Topics 28 | cmd_vel_topic: ~/cmd_vel_unstamped 29 | odom_topic: ~/odom 30 | imu_topic: imu/data 31 | emergency_topic: robotnik_base_hw/emergency_stop 32 | joint_control_topic: ~/joint_control_command 33 | 34 | # RBTheron Controller Params 35 | 36 | #Cartesian and wheels limits 37 | base: 38 | linear: 39 | x: 40 | velocity: 41 | min: -1.2 42 | max: 1.2 43 | acceleration: 44 | min: -100.0 45 | max: 100.0 46 | angular: 47 | z: 48 | velocity: 49 | min: -1.5 50 | max: 1.5 51 | acceleration: 52 | min: -30.0 53 | max: 30.0 54 | 55 | right: 56 | traction: 57 | joint_name: $(var frame_prefix)right_wheel_joint 58 | limits: 59 | velocity: 60 | min: -27.7 61 | max: 27.7 62 | acceleration: 63 | min: -10.0 64 | max: 10.0 65 | 66 | left: 67 | traction: 68 | joint_name: $(var frame_prefix)left_wheel_joint 69 | limits: 70 | velocity: 71 | min: -270.7 72 | max: 270.7 73 | acceleration: 74 | min: -10.0 75 | max: 10.0 -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbfiqus/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | robotnik_base_control: 4 | ros__parameters: 5 | publish_rate: 50 6 | 7 | #General Params 8 | profile: base 9 | debug: true 10 | open_loop: true 11 | 12 | #Timeouts 13 | joint_command_timeout: 0.1 14 | cmd_vel_timeout: 2.0 15 | 16 | #Odom 17 | odom_frame_id: $(var frame_prefix)odom 18 | base_frame_id: $(var frame_prefix)base_footprint 19 | use_2D_odom: true 20 | 21 | #Kinematics Params 22 | wheel_radius: 0.1745 23 | wheel_base: 1.34 24 | track_width: 1.23 25 | min_turning_ratio: 1.0 26 | 27 | # Topics 28 | cmd_vel_topic: ~/cmd_vel_unstamped 29 | odom_topic: ~/odom 30 | imu_topic: imu/data 31 | emergency_topic: robotnik_base_hw/emergency_stop 32 | joint_control_topic: ~/joint_control_command 33 | 34 | # RBVogui XL Controller Params 35 | max_steering_position_error: 0.3 36 | 37 | #Cartesian and wheels limits 38 | base: 39 | linear: 40 | x: 41 | velocity: 42 | min: -0.8 43 | max: 0.8 44 | acceleration: 45 | min: -1.0 46 | max: 1.0 47 | y: 48 | velocity: 49 | min: -0.8 50 | max: 0.8 51 | acceleration: 52 | min: -1.0 53 | max: 1.0 54 | angular: 55 | z: 56 | velocity: 57 | min: -0.8 58 | max: 0.8 59 | acceleration: 60 | min: -1.2 61 | max: 1.2 62 | 63 | front_right: 64 | traction: 65 | joint_name: $(var frame_prefix)front_right_wheel_joint 66 | limits: 67 | velocity: 68 | min: -6.0 69 | max: 6.0 70 | acceleration: 71 | min: -10.0 72 | max: 10.0 73 | steering: 74 | joint_name: $(var frame_prefix)front_right_steering_joint 75 | limits: 76 | velocity: 77 | min: -1.0 78 | max: 1.0 79 | position: 80 | min: -2.8 81 | max: 2.8 82 | 83 | front_left: 84 | traction: 85 | joint_name: $(var frame_prefix)front_left_wheel_joint 86 | limits: 87 | velocity: 88 | min: -6.0 89 | max: 6.0 90 | acceleration: 91 | min: -10.0 92 | max: 10.0 93 | steering: 94 | joint_name: $(var frame_prefix)front_left_steering_joint 95 | limits: 96 | velocity: 97 | min: -1.0 98 | max: 1.0 99 | position: 100 | min: -2.8 101 | max: 2.8 102 | 103 | back_right: 104 | traction: 105 | joint_name: $(var frame_prefix)back_right_wheel_joint 106 | limits: 107 | velocity: 108 | min: -6.0 109 | max: 6.0 110 | acceleration: 111 | min: -10.0 112 | max: 10.0 113 | steering: 114 | joint_name: $(var frame_prefix)back_right_steering_joint 115 | limits: 116 | velocity: 117 | min: -1.0 118 | max: 1.0 119 | position: 120 | min: -2.8 121 | max: 2.8 122 | 123 | back_left: 124 | traction: 125 | joint_name: $(var frame_prefix)back_left_wheel_joint 126 | limits: 127 | velocity: 128 | min: -6.0 129 | max: 6.0 130 | acceleration: 131 | min: -10.0 132 | max: 10.0 133 | steering: 134 | joint_name: $(var frame_prefix)back_left_steering_joint 135 | limits: 136 | velocity: 137 | min: -1.0 138 | max: 1.0 139 | position: 140 | min: -2.8 141 | max: 2.8 142 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbkairos/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | 4 | robotnik_base_control: 5 | ros__parameters: 6 | publish_rate: 50 7 | 8 | # General Params 9 | profile: base 10 | debug: true 11 | open_loop: true 12 | 13 | # Timeouts 14 | joint_command_timeout: 0.1 15 | cmd_vel_timeout: 2.0 16 | 17 | #Odom 18 | odom_frame_id: $(var frame_prefix)odom 19 | base_frame_id: $(var frame_prefix)base_footprint 20 | use_2D_odom: true 21 | 22 | # Kinematics Params 23 | wheel_radius: 0.11 # radius: 0.11 24 | track_width: 0.47 25 | wheel_base: 0.458 26 | max_steering_position_error: 0.3 27 | 28 | #Topics 29 | cmd_vel_topic: ~/cmd_vel_unstamped 30 | odom_topic: ~/odom 31 | imu_topic: imu/data 32 | emergency_topic: robotnik_base_hw/emergency_stop 33 | joint_control_topic: ~/joint_control_command 34 | 35 | # RBKairos Controller Params 36 | 37 | # Cartesian and wheels limits 38 | base: 39 | linear: 40 | x: 41 | velocity: 42 | min: -1.0 43 | max: 1.0 44 | acceleration: 45 | min: -3.0 46 | max: 1.5 47 | y: 48 | velocity: 49 | min: -1.0 50 | max: 1.0 51 | acceleration: 52 | min: -3.0 53 | max: 1.5 54 | angular: 55 | z: 56 | velocity: 57 | min: -1.5 58 | max: 1.5 59 | acceleration: 60 | min: -7.5 61 | max: 7.5 62 | 63 | front_right: 64 | traction: 65 | joint_name: $(var frame_prefix)front_right_wheel_joint 66 | limits: 67 | velocity: 68 | min: -27.7 69 | max: 27.7 70 | acceleration: 71 | min: -10.0 72 | max: 10.0 73 | 74 | front_left: 75 | traction: 76 | joint_name: $(var frame_prefix)front_left_wheel_joint 77 | limits: 78 | velocity: 79 | min: -27.7 80 | max: 27.7 81 | acceleration: 82 | min: -10.0 83 | max: 10.0 84 | 85 | back_right: 86 | traction: 87 | joint_name: $(var frame_prefix)back_right_wheel_joint 88 | limits: 89 | velocity: 90 | min: -27.7 91 | max: 27.7 92 | acceleration: 93 | min: -10.0 94 | max: 10.0 95 | 96 | back_left: 97 | traction: 98 | joint_name: $(var frame_prefix)back_left_wheel_joint 99 | limits: 100 | velocity: 101 | min: -27.7 102 | max: 27.7 103 | acceleration: 104 | min: -10.0 105 | max: 10.0 106 | 107 | # HAS ARM 108 | joint_trajectory_controller: 109 | ros__parameters: 110 | publish_rate: 50 111 | joints: 112 | - $(var frame_prefix)arm_shoulder_pan_joint 113 | - $(var frame_prefix)arm_shoulder_lift_joint 114 | - $(var frame_prefix)arm_elbow_joint 115 | - $(var frame_prefix)arm_wrist_1_joint 116 | - $(var frame_prefix)arm_wrist_2_joint 117 | - $(var frame_prefix)arm_wrist_3_joint 118 | 119 | command_interfaces: 120 | - position 121 | 122 | state_interfaces: 123 | - position 124 | - velocity 125 | 126 | state_publish_rate: 50.0 127 | action_monitor_rate: 20.0 128 | 129 | allow_partial_joints_goal: false 130 | open_loop_control: true 131 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbrobout/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | robotnik_base_control: 4 | ros__parameters: 5 | # General Params 6 | profile: base 7 | debug: true 8 | open_loop: true 9 | 10 | # Timeouts 11 | joint_command_timeout: 0.1 12 | cmd_vel_timeout: 2.0 13 | 14 | # Odom 15 | odom_frame_id: $(var frame_prefix)odom 16 | base_frame_id: $(var frame_prefix)base_footprint 17 | use_2D_odom: true 18 | 19 | # Kinematics Params 20 | wheel_radius: 0.127 21 | wheel_base: 1.116 22 | track_width: 0.573 23 | 24 | #Cartesian and wheels limits 25 | base: 26 | linear: 27 | x: 28 | velocity: 29 | min: -0.5 30 | max: 0.5 31 | acceleration: 32 | min: -1.0 33 | max: 1.0 34 | y: 35 | velocity: 36 | min: -0.5 37 | max: 0.5 38 | acceleration: 39 | min: -1.0 40 | max: 1.0 41 | angular: 42 | z: 43 | velocity: 44 | min: -0.25 45 | max: 0.25 46 | acceleration: 47 | min: -1.0 48 | max: 1.0 49 | 50 | front_right: 51 | traction: 52 | joint_name: $(var frame_prefix)front_right_wheel_joint 53 | limits: 54 | velocity: 55 | min: -27.7 56 | max: 27.7 57 | acceleration: 58 | min: -10.0 59 | max: 10.0 60 | 61 | front_left: 62 | traction: 63 | joint_name: $(var frame_prefix)front_left_wheel_joint 64 | limits: 65 | velocity: 66 | min: -27.7 67 | max: 27.7 68 | acceleration: 69 | min: -10.0 70 | max: 10.0 71 | 72 | back_right: 73 | traction: 74 | joint_name: $(var frame_prefix)back_right_wheel_joint 75 | limits: 76 | velocity: 77 | min: -27.7 78 | max: 27.7 79 | acceleration: 80 | min: -10.0 81 | max: 10.0 82 | 83 | back_left: 84 | traction: 85 | joint_name: $(var frame_prefix)back_left_wheel_joint 86 | limits: 87 | velocity: 88 | min: -27.7 89 | max: 27.7 90 | acceleration: 91 | min: -10.0 92 | max: 10.0 93 | 94 | # HAS ARM 95 | joint_trajectory_controller: 96 | ros__parameters: 97 | publish_rate: 50 98 | joints: 99 | - $(var frame_prefix)lift_ewellix_lift_top_joint 100 | - $(var frame_prefix)arm_shoulder_pan_joint 101 | - $(var frame_prefix)arm_shoulder_lift_joint 102 | - $(var frame_prefix)arm_elbow_joint 103 | - $(var frame_prefix)arm_wrist_1_joint 104 | - $(var frame_prefix)arm_wrist_2_joint 105 | - $(var frame_prefix)arm_wrist_3_joint 106 | 107 | command_interfaces: 108 | - position 109 | 110 | state_interfaces: 111 | - position 112 | - velocity 113 | 114 | state_publish_rate: 50.0 115 | action_monitor_rate: 20.0 116 | 117 | allow_partial_joints_goal: false 118 | open_loop_control: true 119 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbsummit/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | 4 | robotnik_base_control: 5 | ros__parameters: 6 | publish_rate: 50 7 | 8 | # General Params 9 | profile: base 10 | debug: true 11 | open_loop: true 12 | 13 | # Timeouts 14 | joint_command_timeout: 0.1 15 | cmd_vel_timeout: 2.0 16 | 17 | # Odom 18 | odom_frame_id: $(var frame_prefix)odom 19 | base_frame_id: $(var frame_prefix)base_footprint 20 | set_odometry_service: ~/set_odometry 21 | 22 | # Kinematics Params 23 | wheel_radius: 0.11 24 | # TODO: simulation same but divided by 2 25 | track_width: 0.245 26 | wheel_base: 0.225 27 | max_steering_position_error: 0.3 28 | 29 | #Topics 30 | cmd_vel_topic: ~/cmd_vel_unstamped 31 | odom_topic: ~/odom 32 | imu_topic: imu/data 33 | emergency_topic: robotnik_base_hw/emergency_stop 34 | joint_control_topic: ~/joint_control_command 35 | 36 | # RBSummit Controller Params 37 | 38 | #Cartesian and wheels limits 39 | base: 40 | linear: 41 | x: 42 | velocity: 43 | min: -1.0 44 | max: 1.0 45 | acceleration: 46 | min: -1.0 47 | max: 1.0 48 | y: 49 | velocity: 50 | min: -1.0 51 | max: 1.0 52 | acceleration: 53 | min: -1.0 54 | max: 1.0 55 | angular: 56 | z: 57 | velocity: 58 | min: -1.0 59 | max: 1.0 60 | acceleration: 61 | min: -2.0 62 | max: 2.0 63 | 64 | front_right: 65 | traction: 66 | joint_name: $(var frame_prefix)front_right_wheel_joint 67 | limits: 68 | velocity: 69 | min: -27.7 70 | max: 27.7 71 | acceleration: 72 | min: -10.0 73 | max: 10.0 74 | 75 | front_left: 76 | traction: 77 | joint_name: $(var frame_prefix)front_left_wheel_joint 78 | limits: 79 | velocity: 80 | min: -27.7 81 | max: 27.7 82 | acceleration: 83 | min: -10.0 84 | max: 10.0 85 | 86 | back_right: 87 | traction: 88 | joint_name: $(var frame_prefix)back_right_wheel_joint 89 | limits: 90 | velocity: 91 | min: -27.7 92 | max: 27.7 93 | acceleration: 94 | min: -10.0 95 | max: 10.0 96 | 97 | back_left: 98 | traction: 99 | joint_name: $(var frame_prefix)back_left_wheel_joint 100 | limits: 101 | velocity: 102 | min: -27.7 103 | max: 27.7 104 | acceleration: 105 | min: -10.0 106 | max: 10.0 107 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbsummit_steel/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | 4 | robotnik_base_control: 5 | ros__parameters: 6 | publish_rate: 50 7 | 8 | # General Params 9 | profile: base 10 | debug: true 11 | open_loop: true 12 | 13 | # Timeouts 14 | joint_command_timeout: 0.1 15 | cmd_vel_timeout: 2.0 16 | 17 | #Odom 18 | odom_frame_id: $(var frame_prefix)odom 19 | base_frame_id: $(var frame_prefix)base_footprint 20 | use_2D_odom: true 21 | 22 | # Kinematics Params 23 | wheel_radius: 0.11 # radius: 0.11 24 | track_width: 0.47 25 | wheel_base: 0.458 26 | max_steering_position_error: 0.3 27 | 28 | #Topics 29 | cmd_vel_topic: ~/cmd_vel_unstamped 30 | odom_topic: ~/odom 31 | imu_topic: imu/data 32 | emergency_topic: robotnik_base_hw/emergency_stop 33 | joint_control_topic: ~/joint_control_command 34 | 35 | # RBKairos Controller Params 36 | 37 | # Cartesian and wheels limits 38 | base: 39 | linear: 40 | x: 41 | velocity: 42 | min: -1.0 43 | max: 1.0 44 | acceleration: 45 | min: -3.0 46 | max: 1.5 47 | y: 48 | velocity: 49 | min: -1.0 50 | max: 1.0 51 | acceleration: 52 | min: -3.0 53 | max: 1.5 54 | angular: 55 | z: 56 | velocity: 57 | min: -1.5 58 | max: 1.5 59 | acceleration: 60 | min: -7.5 61 | max: 7.5 62 | 63 | front_right: 64 | traction: 65 | joint_name: $(var frame_prefix)front_right_wheel_joint 66 | limits: 67 | velocity: 68 | min: -27.7 69 | max: 27.7 70 | acceleration: 71 | min: -10.0 72 | max: 10.0 73 | 74 | front_left: 75 | traction: 76 | joint_name: $(var frame_prefix)front_left_wheel_joint 77 | limits: 78 | velocity: 79 | min: -27.7 80 | max: 27.7 81 | acceleration: 82 | min: -10.0 83 | max: 10.0 84 | 85 | back_right: 86 | traction: 87 | joint_name: $(var frame_prefix)back_right_wheel_joint 88 | limits: 89 | velocity: 90 | min: -27.7 91 | max: 27.7 92 | acceleration: 93 | min: -10.0 94 | max: 10.0 95 | 96 | back_left: 97 | traction: 98 | joint_name: $(var frame_prefix)back_left_wheel_joint 99 | limits: 100 | velocity: 101 | min: -27.7 102 | max: 27.7 103 | acceleration: 104 | min: -10.0 105 | max: 10.0 106 | 107 | # HAS ARM 108 | joint_trajectory_controller: 109 | ros__parameters: 110 | publish_rate: 50 111 | joints: 112 | - $(var frame_prefix)arm_shoulder_pan_joint 113 | - $(var frame_prefix)arm_shoulder_lift_joint 114 | - $(var frame_prefix)arm_elbow_joint 115 | - $(var frame_prefix)arm_wrist_1_joint 116 | - $(var frame_prefix)arm_wrist_2_joint 117 | - $(var frame_prefix)arm_wrist_3_joint 118 | 119 | command_interfaces: 120 | - position 121 | 122 | state_interfaces: 123 | - position 124 | - velocity 125 | 126 | state_publish_rate: 50.0 127 | action_monitor_rate: 20.0 128 | 129 | allow_partial_joints_goal: false 130 | open_loop_control: true 131 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbtheron/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | joint_state_broadcaster: 4 | ros__parameters: 5 | # Need to publish zeros for the fake joints 6 | extra_joints: 7 | - $(var frame_prefix)front_left_joint_support 8 | - $(var frame_prefix)front_left_joint_wheel 9 | - $(var frame_prefix)front_right_joint_support 10 | - $(var frame_prefix)front_right_joint_wheel 11 | - $(var frame_prefix)rear_left_joint_support 12 | - $(var frame_prefix)rear_left_joint_wheel 13 | - $(var frame_prefix)rear_right_joint_support 14 | - $(var frame_prefix)rear_right_joint_wheel 15 | 16 | robotnik_base_control: 17 | ros__parameters: 18 | publish_rate: 50 19 | 20 | # General Params 21 | profile: base 22 | debug: true 23 | open_loop: true 24 | 25 | # Timeouts 26 | joint_command_timeout: 0.1 27 | cmd_vel_timeout: 2.0 28 | 29 | # Odom 30 | odom_frame_id: $(var frame_prefix)odom 31 | base_frame_id: $(var frame_prefix)base_footprint 32 | set_odometry_service: ~/set_odometry 33 | 34 | # Kinematics Params 35 | wheel_radius: 0.0703 36 | track_width: 0.5032 37 | wheel_base: 0.0 38 | max_steering_position_error: 0.3 39 | 40 | # Topics 41 | cmd_vel_topic: ~/cmd_vel_unstamped 42 | odom_topic: ~/odom 43 | imu_topic: imu/data 44 | emergency_topic: robotnik_base_hw/emergency_stop 45 | joint_control_topic: ~/joint_control_command 46 | 47 | # RBTheron Controller Params 48 | 49 | #Cartesian and wheels limits 50 | base: 51 | linear: 52 | x: 53 | velocity: 54 | min: -1.2 55 | max: 1.2 56 | acceleration: 57 | min: -100.0 58 | max: 100.0 59 | angular: 60 | z: 61 | velocity: 62 | min: -1.5 63 | max: 1.5 64 | acceleration: 65 | min: -30.0 66 | max: 30.0 67 | 68 | right: 69 | traction: 70 | joint_name: $(var frame_prefix)right_wheel_joint 71 | limits: 72 | velocity: 73 | min: -27.7 74 | max: 27.7 75 | acceleration: 76 | min: -100.0 77 | max: 100.0 78 | 79 | left: 80 | traction: 81 | joint_name: $(var frame_prefix)left_wheel_joint 82 | limits: 83 | velocity: 84 | min: -27.7 85 | max: 27.7 86 | acceleration: 87 | min: -100.0 88 | max: 100.0 89 | 90 | joint_trajectory_controller: 91 | ros__parameters: 92 | publish_rate: 50 93 | joints: 94 | - $(var frame_prefix)arm_shoulder_pan_joint 95 | - $(var frame_prefix)arm_shoulder_lift_joint 96 | - $(var frame_prefix)arm_elbow_joint 97 | - $(var frame_prefix)arm_wrist_1_joint 98 | - $(var frame_prefix)arm_wrist_2_joint 99 | - $(var frame_prefix)arm_wrist_3_joint 100 | 101 | command_interfaces: 102 | - position 103 | 104 | state_interfaces: 105 | - position 106 | - velocity 107 | 108 | state_publish_rate: 50.0 109 | action_monitor_rate: 20.0 110 | 111 | allow_partial_joints_goal: false 112 | open_loop_control: true 113 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbvogui/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | robotnik_base_control: 4 | ros__parameters: 5 | publish_rate: 50 6 | 7 | #General Params 8 | profile: base 9 | debug: true 10 | open_loop: true 11 | 12 | #Timeouts 13 | joint_command_timeout: 0.1 14 | cmd_vel_timeout: 2.0 15 | 16 | #Odom 17 | odom_frame_id: $(var frame_prefix)odom 18 | base_frame_id: $(var frame_prefix)base_footprint 19 | use_2D_odom: true 20 | 21 | #Kinematics Params 22 | wheel_radius: 0.1125 # radious: 0.1125, diameter: 0.2552 23 | wheel_base: 0.76 24 | track_width: 0.4745 25 | min_turning_ratio: 1.0 26 | 27 | # Topics 28 | cmd_vel_topic: ~/cmd_vel_unstamped 29 | odom_topic: ~/odom 30 | imu_topic: imu/data 31 | emergency_topic: robotnik_base_hw/emergency_stop 32 | joint_control_topic: ~/joint_control_command 33 | 34 | # RBVogui XL Controller Params 35 | max_steering_position_error: 0.3 36 | 37 | #Cartesian and wheels limits 38 | base: 39 | linear: 40 | x: 41 | velocity: 42 | min: -0.8 43 | max: 0.8 44 | acceleration: 45 | min: -1.0 46 | max: 1.0 47 | y: 48 | velocity: 49 | min: -0.8 50 | max: 0.8 51 | acceleration: 52 | min: -1.0 53 | max: 1.0 54 | angular: 55 | z: 56 | velocity: 57 | min: -0.8 58 | max: 0.8 59 | acceleration: 60 | min: -1.2 61 | max: 1.2 62 | 63 | front_right: 64 | traction: 65 | joint_name: $(var frame_prefix)front_right_wheel_joint 66 | limits: 67 | velocity: 68 | min: -6.0 69 | max: 6.0 70 | acceleration: 71 | min: -10.0 72 | max: 10.0 73 | steering: 74 | joint_name: $(var frame_prefix)front_right_steering_joint 75 | limits: 76 | velocity: 77 | min: -1.0 78 | max: 1.0 79 | position: 80 | min: -2.8 81 | max: 2.8 82 | 83 | front_left: 84 | traction: 85 | joint_name: $(var frame_prefix)front_left_wheel_joint 86 | limits: 87 | velocity: 88 | min: -6.0 89 | max: 6.0 90 | acceleration: 91 | min: -10.0 92 | max: 10.0 93 | steering: 94 | joint_name: $(var frame_prefix)front_left_steering_joint 95 | limits: 96 | velocity: 97 | min: -1.0 98 | max: 1.0 99 | position: 100 | min: -2.8 101 | max: 2.8 102 | 103 | back_right: 104 | traction: 105 | joint_name: $(var frame_prefix)back_right_wheel_joint 106 | limits: 107 | velocity: 108 | min: -6.0 109 | max: 6.0 110 | acceleration: 111 | min: -10.0 112 | max: 10.0 113 | steering: 114 | joint_name: $(var frame_prefix)back_right_steering_joint 115 | limits: 116 | velocity: 117 | min: -1.0 118 | max: 1.0 119 | position: 120 | min: -2.8 121 | max: 2.8 122 | 123 | back_left: 124 | traction: 125 | joint_name: $(var frame_prefix)back_left_wheel_joint 126 | limits: 127 | velocity: 128 | min: -6.0 129 | max: 6.0 130 | acceleration: 131 | min: -10.0 132 | max: 10.0 133 | steering: 134 | joint_name: $(var frame_prefix)back_left_steering_joint 135 | limits: 136 | velocity: 137 | min: -1.0 138 | max: 1.0 139 | position: 140 | min: -2.8 141 | max: 2.8 142 | 143 | joint_trajectory_controller: 144 | ros__parameters: 145 | publish_rate: 50 146 | joints: 147 | - $(var frame_prefix)arm_shoulder_pan_joint 148 | - $(var frame_prefix)arm_shoulder_lift_joint 149 | - $(var frame_prefix)arm_elbow_joint 150 | - $(var frame_prefix)arm_wrist_1_joint 151 | - $(var frame_prefix)arm_wrist_2_joint 152 | - $(var frame_prefix)arm_wrist_3_joint 153 | 154 | command_interfaces: 155 | - position 156 | 157 | state_interfaces: 158 | - position 159 | - velocity 160 | 161 | state_publish_rate: 50.0 162 | action_monitor_rate: 20.0 163 | 164 | allow_partial_joints_goal: false 165 | open_loop_control: true 166 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbvogui_xl/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | robotnik_base_control: 4 | ros__parameters: 5 | publish_rate: 50 6 | 7 | #General Params 8 | profile: base 9 | debug: true 10 | open_loop: true 11 | 12 | #Timeouts 13 | joint_command_timeout: 0.1 14 | cmd_vel_timeout: 2.0 15 | 16 | #Odom 17 | odom_frame_id: $(var frame_prefix)odom 18 | base_frame_id: $(var frame_prefix)base_footprint 19 | use_2D_odom: true 20 | 21 | #Kinematics Params 22 | wheel_radius: 0.1745 23 | wheel_base: 0.959 24 | track_width: 0.585 25 | min_turning_ratio: 1.0 26 | 27 | # Topics 28 | cmd_vel_topic: ~/cmd_vel_unstamped 29 | odom_topic: ~/odom 30 | imu_topic: imu/data 31 | emergency_topic: robotnik_base_hw/emergency_stop 32 | joint_control_topic: ~/joint_control_command 33 | 34 | # RBVogui XL Controller Params 35 | max_steering_position_error: 0.3 36 | 37 | #Cartesian and wheels limits 38 | base: 39 | linear: 40 | x: 41 | velocity: 42 | min: -0.8 43 | max: 0.8 44 | acceleration: 45 | min: -1.0 46 | max: 1.0 47 | y: 48 | velocity: 49 | min: -0.8 50 | max: 0.8 51 | acceleration: 52 | min: -1.0 53 | max: 1.0 54 | angular: 55 | z: 56 | velocity: 57 | min: -0.8 58 | max: 0.8 59 | acceleration: 60 | min: -1.2 61 | max: 1.2 62 | 63 | front_right: 64 | traction: 65 | joint_name: $(var frame_prefix)front_right_wheel_joint 66 | limits: 67 | velocity: 68 | min: -6.0 69 | max: 6.0 70 | acceleration: 71 | min: -10.0 72 | max: 10.0 73 | steering: 74 | joint_name: $(var frame_prefix)front_right_steering_joint 75 | limits: 76 | velocity: 77 | min: -1.0 78 | max: 1.0 79 | position: 80 | min: -2.8 81 | max: 2.8 82 | 83 | front_left: 84 | traction: 85 | joint_name: $(var frame_prefix)front_left_wheel_joint 86 | limits: 87 | velocity: 88 | min: -6.0 89 | max: 6.0 90 | acceleration: 91 | min: -10.0 92 | max: 10.0 93 | steering: 94 | joint_name: $(var frame_prefix)front_left_steering_joint 95 | limits: 96 | velocity: 97 | min: -1.0 98 | max: 1.0 99 | position: 100 | min: -2.8 101 | max: 2.8 102 | 103 | back_right: 104 | traction: 105 | joint_name: $(var frame_prefix)back_right_wheel_joint 106 | limits: 107 | velocity: 108 | min: -6.0 109 | max: 6.0 110 | acceleration: 111 | min: -10.0 112 | max: 10.0 113 | steering: 114 | joint_name: $(var frame_prefix)back_right_steering_joint 115 | limits: 116 | velocity: 117 | min: -1.0 118 | max: 1.0 119 | position: 120 | min: -2.8 121 | max: 2.8 122 | 123 | back_left: 124 | traction: 125 | joint_name: $(var frame_prefix)back_left_wheel_joint 126 | limits: 127 | velocity: 128 | min: -6.0 129 | max: 6.0 130 | acceleration: 131 | min: -10.0 132 | max: 10.0 133 | steering: 134 | joint_name: $(var frame_prefix)back_left_steering_joint 135 | limits: 136 | velocity: 137 | min: -1.0 138 | max: 1.0 139 | position: 140 | min: -2.8 141 | max: 2.8 142 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/profile/rbwatcher/ros2_control.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | /**: 3 | 4 | robotnik_base_control: 5 | ros__parameters: 6 | publish_rate: 50 7 | 8 | # General Params 9 | profile: base 10 | debug: true 11 | open_loop: true 12 | 13 | # Timeouts 14 | joint_command_timeout: 0.1 15 | cmd_vel_timeout: 2.0 16 | 17 | # Odom 18 | odom_frame_id: $(var frame_prefix)odom 19 | base_frame_id: $(var frame_prefix)base_footprint 20 | set_odometry_service: ~/set_odometry 21 | 22 | # Kinematics Params 23 | wheel_radius: 0.11 24 | # TODO: simulation same but divided by 2 25 | track_width: 0.245 26 | wheel_base: 0.225 27 | max_steering_position_error: 0.3 28 | 29 | #Topics 30 | cmd_vel_topic: ~/cmd_vel_unstamped 31 | odom_topic: ~/odom 32 | imu_topic: imu/data 33 | emergency_topic: robotnik_base_hw/emergency_stop 34 | joint_control_topic: ~/joint_control_command 35 | 36 | # RBSummit Controller Params 37 | 38 | #Cartesian and wheels limits 39 | base: 40 | linear: 41 | x: 42 | velocity: 43 | min: -1.0 44 | max: 1.0 45 | acceleration: 46 | min: -1.0 47 | max: 1.0 48 | y: 49 | velocity: 50 | min: -1.0 51 | max: 1.0 52 | acceleration: 53 | min: -1.0 54 | max: 1.0 55 | angular: 56 | z: 57 | velocity: 58 | min: -1.0 59 | max: 1.0 60 | acceleration: 61 | min: -2.0 62 | max: 2.0 63 | 64 | front_right: 65 | traction: 66 | joint_name: $(var frame_prefix)front_right_wheel_joint 67 | limits: 68 | velocity: 69 | min: -27.7 70 | max: 27.7 71 | acceleration: 72 | min: -10.0 73 | max: 10.0 74 | 75 | front_left: 76 | traction: 77 | joint_name: $(var frame_prefix)front_left_wheel_joint 78 | limits: 79 | velocity: 80 | min: -27.7 81 | max: 27.7 82 | acceleration: 83 | min: -10.0 84 | max: 10.0 85 | 86 | back_right: 87 | traction: 88 | joint_name: $(var frame_prefix)back_right_wheel_joint 89 | limits: 90 | velocity: 91 | min: -27.7 92 | max: 27.7 93 | acceleration: 94 | min: -10.0 95 | max: 10.0 96 | 97 | back_left: 98 | traction: 99 | joint_name: $(var frame_prefix)back_left_wheel_joint 100 | limits: 101 | velocity: 102 | min: -27.7 103 | max: 27.7 104 | acceleration: 105 | min: -10.0 106 | max: 10.0 107 | 108 | # HAS PTZ 109 | joint_trajectory_controller: 110 | ros__parameters: 111 | publish_rate: 50 112 | joints: 113 | - $(var frame_prefix)top_ptz_camera_pan_joint 114 | - $(var frame_prefix)top_ptz_camera_tilt_joint 115 | - $(var frame_prefix)top_ptz_camera_zoom_color_joint 116 | 117 | command_interfaces: 118 | - position 119 | 120 | state_interfaces: 121 | - position 122 | - velocity 123 | 124 | state_publish_rate: 50.0 125 | action_monitor_rate: 20.0 126 | 127 | allow_partial_joints_goal: false 128 | open_loop_control: true 129 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/config/rviz_config.rviz: -------------------------------------------------------------------------------- 1 | Panels: 2 | - Class: rviz_common/Displays 3 | Help Height: 78 4 | Name: Displays 5 | Property Tree Widget: 6 | Expanded: ~ 7 | Splitter Ratio: 0.5 8 | Tree Height: 448 9 | - Class: rviz_common/Selection 10 | Name: Selection 11 | - Class: rviz_common/Tool Properties 12 | Expanded: 13 | - /2D Goal Pose1 14 | - /Publish Point1 15 | Name: Tool Properties 16 | Splitter Ratio: 0.5886790156364441 17 | - Class: rviz_common/Views 18 | Expanded: 19 | - /Current View1 20 | Name: Views 21 | Splitter Ratio: 0.5 22 | - Class: rviz_common/Time 23 | Experimental: false 24 | Name: Time 25 | SyncMode: 0 26 | SyncSource: FrontLaserScan 27 | - Class: rviz_plugin_tutorials/Teleop 28 | Name: Teleop 29 | Topic: robotnik_base_control/cmd_vel_unstamped 30 | Visualization Manager: 31 | Class: "" 32 | Displays: 33 | - Alpha: 0.5 34 | Cell Size: 1 35 | Class: rviz_default_plugins/Grid 36 | Color: 160; 160; 164 37 | Enabled: true 38 | Line Style: 39 | Line Width: 0.029999999329447746 40 | Value: Lines 41 | Name: Grid 42 | Normal Cell Count: 0 43 | Offset: 44 | X: 0 45 | Y: 0 46 | Z: 0 47 | Plane: XY 48 | Plane Cell Count: 10 49 | Reference Frame: 50 | Value: true 51 | - Alpha: 1 52 | Class: rviz_default_plugins/RobotModel 53 | Collision Enabled: false 54 | Description File: "" 55 | Description Source: Topic 56 | Description Topic: 57 | Depth: 5 58 | Durability Policy: Volatile 59 | History Policy: Keep Last 60 | Reliability Policy: Reliable 61 | Value: robot_description 62 | Enabled: true 63 | Links: 64 | All Links Enabled: true 65 | Expand Joint Details: false 66 | Expand Link Details: false 67 | Expand Tree: false 68 | Link Tree Style: Links in Alphabetic Order 69 | Mass Properties: 70 | Inertia: false 71 | Mass: false 72 | Name: RobotModel 73 | TF Prefix: "" 74 | Update Interval: 0 75 | Value: true 76 | Visual Enabled: true 77 | - Class: rviz_default_plugins/TF 78 | Enabled: true 79 | Frame Timeout: 15 80 | Frames: 81 | All Enabled: true 82 | Marker Scale: 1 83 | Name: TF 84 | Show Arrows: true 85 | Show Axes: true 86 | Show Names: false 87 | Update Interval: 0 88 | Value: true 89 | - Alpha: 1 90 | Autocompute Intensity Bounds: true 91 | Autocompute Value Bounds: 92 | Max Value: 10 93 | Min Value: -10 94 | Value: true 95 | Axis: Z 96 | Channel Name: intensity 97 | Class: rviz_default_plugins/LaserScan 98 | Color: 255; 255; 255 99 | Color Transformer: Intensity 100 | Decay Time: 0 101 | Enabled: true 102 | Invert Rainbow: false 103 | Max Color: 255; 255; 255 104 | Max Intensity: 0 105 | Min Color: 0; 0; 0 106 | Min Intensity: 0 107 | Name: FrontLaserScan 108 | Position Transformer: XYZ 109 | Selectable: true 110 | Size (Pixels): 3 111 | Size (m): 0.05000000074505806 112 | Style: Flat Squares 113 | Topic: 114 | Depth: 5 115 | Durability Policy: Volatile 116 | Filter size: 10 117 | History Policy: Keep Last 118 | Reliability Policy: Reliable 119 | Value: front_laser/scan 120 | Use Fixed Frame: true 121 | Use rainbow: true 122 | Value: true 123 | - Class: rviz_default_plugins/Image 124 | Enabled: true 125 | Max Value: 1 126 | Median window: 5 127 | Min Value: 0 128 | Name: FrontCameraImage 129 | Normalize Range: true 130 | Topic: 131 | Depth: 5 132 | Durability Policy: Volatile 133 | History Policy: Keep Last 134 | Reliability Policy: Reliable 135 | Value: front_rgbd_camera/color/image_raw 136 | Value: true 137 | - Alpha: 1 138 | Autocompute Intensity Bounds: true 139 | Autocompute Value Bounds: 140 | Max Value: 10 141 | Min Value: -10 142 | Value: true 143 | Axis: Z 144 | Channel Name: intensity 145 | Class: rviz_default_plugins/LaserScan 146 | Color: 255; 255; 255 147 | Color Transformer: Intensity 148 | Decay Time: 0 149 | Enabled: true 150 | Invert Rainbow: false 151 | Max Color: 255; 255; 255 152 | Max Intensity: 0 153 | Min Color: 0; 0; 0 154 | Min Intensity: 0 155 | Name: RearLaserScan 156 | Position Transformer: XYZ 157 | Selectable: true 158 | Size (Pixels): 3 159 | Size (m): 0.05000000074505806 160 | Style: Flat Squares 161 | Topic: 162 | Depth: 5 163 | Durability Policy: Volatile 164 | Filter size: 10 165 | History Policy: Keep Last 166 | Reliability Policy: Reliable 167 | Value: rear_laser/scan 168 | Use Fixed Frame: true 169 | Use rainbow: true 170 | Value: true 171 | - Alpha: 1 172 | Autocompute Intensity Bounds: true 173 | Autocompute Value Bounds: 174 | Max Value: 10 175 | Min Value: -10 176 | Value: true 177 | Axis: Z 178 | Channel Name: intensity 179 | Class: rviz_default_plugins/PointCloud2 180 | Color: 255; 255; 255 181 | Color Transformer: Intensity 182 | Decay Time: 0 183 | Enabled: true 184 | Invert Rainbow: false 185 | Max Color: 255; 255; 255 186 | Max Intensity: 0 187 | Min Color: 0; 0; 0 188 | Min Intensity: 0 189 | Name: PointCloud2 190 | Position Transformer: XYZ 191 | Selectable: true 192 | Size (Pixels): 3 193 | Size (m): 0.05000000074505806 194 | Style: Flat Squares 195 | Topic: 196 | Depth: 5 197 | Durability Policy: Volatile 198 | Filter size: 10 199 | History Policy: Keep Last 200 | Reliability Policy: Reliable 201 | Value: top_laser/points 202 | Use Fixed Frame: true 203 | Use rainbow: true 204 | Value: true 205 | Enabled: true 206 | Global Options: 207 | Background Color: 48; 48; 48 208 | Fixed Frame: robot_odom 209 | Frame Rate: 30 210 | Name: root 211 | Tools: 212 | - Class: rviz_default_plugins/Interact 213 | Hide Inactive Objects: true 214 | - Class: rviz_default_plugins/MoveCamera 215 | - Class: rviz_default_plugins/Select 216 | - Class: rviz_default_plugins/FocusCamera 217 | - Class: rviz_default_plugins/Measure 218 | Line color: 128; 128; 0 219 | - Class: rviz_default_plugins/SetInitialPose 220 | Covariance x: 0.25 221 | Covariance y: 0.25 222 | Covariance yaw: 0.06853891909122467 223 | Topic: 224 | Depth: 5 225 | Durability Policy: Volatile 226 | History Policy: Keep Last 227 | Reliability Policy: Reliable 228 | Value: /initialpose 229 | - Class: rviz_default_plugins/SetGoal 230 | Topic: 231 | Depth: 5 232 | Durability Policy: Volatile 233 | History Policy: Keep Last 234 | Reliability Policy: Reliable 235 | Value: /goal_pose 236 | - Class: rviz_default_plugins/PublishPoint 237 | Single click: true 238 | Topic: 239 | Depth: 5 240 | Durability Policy: Volatile 241 | History Policy: Keep Last 242 | Reliability Policy: Reliable 243 | Value: /clicked_point 244 | Transformation: 245 | Current: 246 | Class: rviz_default_plugins/TF 247 | Value: true 248 | Views: 249 | Current: 250 | Class: rviz_default_plugins/Orbit 251 | Distance: 3.8563950061798096 252 | Enable Stereo Rendering: 253 | Stereo Eye Separation: 0.05999999865889549 254 | Stereo Focal Distance: 1 255 | Swap Stereo Eyes: false 256 | Value: false 257 | Focal Point: 258 | X: 0 259 | Y: 0 260 | Z: 0 261 | Focal Shape Fixed Size: false 262 | Focal Shape Size: 0.05000000074505806 263 | Invert Z Axis: false 264 | Name: Current View 265 | Near Clip Distance: 0.009999999776482582 266 | Pitch: 0.7853981852531433 267 | Target Frame: 268 | Value: Orbit (rviz) 269 | Yaw: 0.7853981852531433 270 | Saved: ~ 271 | Window Geometry: 272 | Displays: 273 | collapsed: false 274 | FrontCameraImage: 275 | collapsed: false 276 | Height: 1016 277 | Hide Left Dock: false 278 | Hide Right Dock: false 279 | QMainWindow State: 000000ff00000000fd0000000400000000000001ad0000035efc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003b00000249000000c700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000002000460072006f006e007400430061006d0065007200610049006d006100670065010000028a0000010f0000002800ffffff000000010000010f0000035efc0200000004fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003b00000215000000a000fffffffb0000000c00540065006c0065006f00700100000256000001430000004500fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073a0000003efc0100000002fb0000000800540069006d006501000000000000073a0000025300fffffffb0000000800540069006d00650100000000000004500000000000000000000004720000035e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 280 | Selection: 281 | collapsed: false 282 | Teleop: 283 | collapsed: false 284 | Time: 285 | collapsed: false 286 | Tool Properties: 287 | collapsed: false 288 | Views: 289 | collapsed: false 290 | Width: 1850 291 | X: 70 292 | Y: 27 293 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/hooks/robotnik_gazebo_ignition.sh.in: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # This hook adds robotnik gazebo resources to the appropriate environment variables 4 | _GZ_PKGS=${GZ_RESOURCE_PKGS:-"robotnik_gazebo_ignition robotnik_description robotnik_sensors ur_description"} 5 | 6 | 7 | _prepend_unique_value() { 8 | eval _cur="\${$1}" 9 | case ":$_cur:" in *":$2:"*) return 0;; esac 10 | if [ -n "$_cur" ]; then eval export "$1=\"$2:$_cur\""; else eval export "$1=\"$2\""; fi 11 | } 12 | 13 | _get_parent_abs_path() { 14 | echo "$(CDPATH= cd -- "$(dirname "$1")" 2>/dev/null && pwd)" 15 | } 16 | 17 | if [ -n "$AMENT_CURRENT_PREFIX" ]; then 18 | _self_prefix="$AMENT_CURRENT_PREFIX" 19 | else 20 | _hook_dir="$(CDPATH= cd -- "$(dirname "$0")" 2>/dev/null && pwd)" 21 | _self_prefix="$(CDPATH= cd -- "$_hook_dir/../../.." 2>/dev/null && pwd)" 22 | fi 23 | 24 | _prefixes="$AMENT_PREFIX_PATH" 25 | case ":$_prefixes:" in *":$_self_prefix:"*) : ;; *) _prefixes="$_self_prefix${_prefixes:+:$_prefixes}";; esac 26 | 27 | for _prefix in $(printf %s "$_prefixes" | tr ':' ' '); do 28 | for _pkg in $_GZ_PKGS; do 29 | _p="$_prefix/share/$_pkg" 30 | if [ -d "$_p" ]; then 31 | _parent_path="$(_get_parent_abs_path "$_p")" 32 | _model_path="${_parent_path}/$_pkg/models" 33 | 34 | # Always add the parent path 35 | _prepend_unique_value GZ_SIM_RESOURCE_PATH "$_parent_path" 36 | _prepend_unique_value IGN_GAZEBO_RESOURCE_PATH "$_parent_path" 37 | _prepend_unique_value GAZEBO_RESOURCE_PATH "$_parent_path" 38 | 39 | # If 'models' subfolder exists, add that too 40 | if [ -d "$_model_path" ]; then 41 | _prepend_unique_value GZ_SIM_RESOURCE_PATH "$_model_path" 42 | _prepend_unique_value IGN_GAZEBO_RESOURCE_PATH "$_model_path" 43 | _prepend_unique_value GAZEBO_RESOURCE_PATH "$_model_path" 44 | fi 45 | fi 46 | done 47 | done 48 | 49 | unset _prefix _pkg _p _prefixes _self_prefix _hook_dir _GZ_PKGS _parent_path _model_path 50 | unset -f _prepend_unique_value _get_parent_abs_path 51 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/launch/spawn_robot.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025, Robotnik Automation S.L.L. 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # * Redistributions of source code must retain the above copyright 7 | # notice, this list of conditions and the following disclaimer. 8 | # * Redistributions in binary form must reproduce the above copyright 9 | # notice, this list of conditions and the following disclaimer in the 10 | # documentation and/or other materials provided with the distribution. 11 | # * Neither the name of the Robotnik Automation S.L.L. nor the 12 | # names of its contributors may be used to endorse or promote products 13 | # derived from this software without specific prior written permission. 14 | # 15 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | # DISCLAIMED. IN NO EVENT SHALL Robotnik Automation S.L.L. BE LIABLE FOR ANY 19 | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | import tempfile 26 | import yaml 27 | 28 | 29 | from launch import LaunchDescription 30 | from launch.actions import IncludeLaunchDescription, OpaqueFunction 31 | from launch.launch_description_sources import PythonLaunchDescriptionSource 32 | from launch_ros.parameter_descriptions import ParameterFile 33 | from launch.substitutions import LaunchConfiguration 34 | 35 | from launch_ros.actions import Node 36 | from launch_ros.substitutions import FindPackageShare 37 | 38 | from robotnik_common.launch import AddArgumentParser, ExtendedArgument 39 | 40 | 41 | from pathlib import Path 42 | from tempfile import NamedTemporaryFile 43 | from typing import Union, Optional 44 | 45 | from launch import SomeSubstitutionsType, SomeSubstitutionsType_types_tuple 46 | from launch.substitutions import SubstitutionFailure 47 | from launch.frontend.parse_substitution import parse_substitution 48 | from launch.utilities import normalize_to_list_of_substitutions, perform_substitutions 49 | from launch.utilities.typing_file_path import FilePath 50 | from launch.substitution import Substitution 51 | from launch import LaunchContext 52 | from launch.conditions import IfCondition 53 | 54 | 55 | # TODO: move this utility class into robotnik_common 56 | class ConfigFile(Substitution): 57 | """Substitution to get the path of the configuration file.""" 58 | 59 | def __init__( 60 | self, 61 | param_file: Union[FilePath, SomeSubstitutionsType], 62 | ) -> None: 63 | """ 64 | Construct a parameter file description. 65 | 66 | :param param_file: The path to the parameter file or a substitution that resolves to it. 67 | """ 68 | self.__evaluated_param_file: Optional[Path] = None 69 | self.__created_tmp_file = False 70 | 71 | self.__param_file = param_file 72 | if isinstance(param_file, SomeSubstitutionsType_types_tuple): 73 | self.__param_file = normalize_to_list_of_substitutions(param_file) # type: ignore 74 | 75 | def perform(self, context: LaunchContext) -> str: 76 | """Substitute the parameter file path.""" 77 | param_file = self.__param_file 78 | if isinstance(param_file, list): 79 | # list of substitutions 80 | param_file = perform_substitutions(context, self.__param_file) # type: ignore 81 | 82 | param_file_path: Path = Path(param_file) # type: ignore 83 | with open(param_file_path, 'r') as f, NamedTemporaryFile( 84 | mode='w', prefix='launch_params_', delete=False 85 | ) as h: 86 | parsed = perform_substitutions(context, parse_substitution(f.read())) # type: ignore 87 | try: 88 | yaml.safe_load(parsed) 89 | except Exception: 90 | raise SubstitutionFailure( 91 | 'The substituted parameter file is not a valid yaml file') 92 | h.write(parsed) 93 | param_file_path = Path(h.name) 94 | self.__created_tmp_file = True 95 | self.__evaluated_param_file = param_file_path 96 | return str(param_file_path) 97 | 98 | def cleanup(self) -> None: 99 | """Remove the temporary file if it was created.""" 100 | if self.__created_tmp_file and self.__evaluated_param_file is not None: 101 | try: 102 | self.__evaluated_param_file.unlink() 103 | except FileNotFoundError: 104 | # The file may have been deleted already, ignore this error 105 | pass 106 | self.__evaluated_param_file = None 107 | 108 | def __del__(self): 109 | """Clean up the temporary file when the object is deleted.""" 110 | self.cleanup() 111 | 112 | 113 | def substitute_param_context(param, context): 114 | """Resolve a parameter if it is a LaunchConfiguration.""" 115 | if isinstance(param, LaunchConfiguration): 116 | return param.perform(context) 117 | return param 118 | 119 | def launch_setup(context, params): 120 | ret = [] 121 | 122 | # Robot Description 123 | ret.append(IncludeLaunchDescription( 124 | PythonLaunchDescriptionSource([ 125 | FindPackageShare('robotnik_description'), '/launch/robot_description.launch.py' 126 | ]), 127 | launch_arguments={ 128 | 'verbose': 'false', 129 | 'robot_xacro_file': params['robot_xacro'], 130 | 'frame_prefix': [params['robot_id'], '_'], 131 | 'namespace': params['robot_id'], 132 | 'gazebo_ignition': 'true', 133 | }.items(), 134 | )) 135 | 136 | # Spawner 137 | ret.append(Node( 138 | package='ros_gz_sim', 139 | executable='create', 140 | namespace=params['robot_id'], 141 | arguments=[ 142 | '-name', params['robot_id'], 143 | '-topic', "robot_description", 144 | '-robot_namespace', params['robot_id'], 145 | '-x', params['x'], 146 | '-y', params['y'], 147 | '-z', params['z'], 148 | ], 149 | output='screen', 150 | )) 151 | 152 | # Gazebo bridge 153 | def generate_bridge_yaml(params) -> str: 154 | robot_id = substitute_param_context(params['robot_id'], context) 155 | bridge_raw = [ 156 | (f"/{robot_id}/imu/data", f"/{robot_id}/imu/data", "sensor_msgs/msg/Imu", "ignition.msgs.IMU", "GZ_TO_ROS"), 157 | (f"/{robot_id}/gps/data", f"/{robot_id}/gps/fix", "sensor_msgs/msg/NavSatFix", "ignition.msgs.NavSat", "GZ_TO_ROS"), 158 | ] 159 | def add_camera(camera_name): 160 | bridge_raw.extend([ 161 | (f"/{robot_id}/{camera_name}_camera_color/color/camera_info", f"/{robot_id}/{camera_name}_rgbd_camera/color/camera_info", "sensor_msgs/msg/CameraInfo", "gz.msgs.CameraInfo", "GZ_TO_ROS"), 162 | (f"/{robot_id}/{camera_name}_camera_color/color/image_raw", f"/{robot_id}/{camera_name}_rgbd_camera/color/image_raw", "sensor_msgs/msg/Image", "gz.msgs.Image", "GZ_TO_ROS"), 163 | ]) 164 | def add_laser(laser_name): 165 | bridge_raw.extend([ 166 | (f"/{robot_id}/{laser_name}_laser/scan", f"/{robot_id}/{laser_name}_laser/scan", "sensor_msgs/msg/LaserScan", "gz.msgs.LaserScan", "GZ_TO_ROS"), 167 | ]) 168 | def add_pointcloud(points_name): 169 | bridge_raw.extend([ 170 | ( f"/{robot_id}/{points_name}_lidar/scan/points", f"/{robot_id}/{points_name}_laser/points", "sensor_msgs/msg/PointCloud2", "gz.msgs.PointCloudPacked", "GZ_TO_ROS"), 171 | ]) 172 | 173 | def add_depth_camera(camera_name): 174 | bridge_raw.extend([ 175 | (f"/{robot_id}/{camera_name}_camera_depth/depth/camera_info", f"/{robot_id}/{camera_name}_rgbd_camera/depth/camera_info", "sensor_msgs/msg/CameraInfo", "gz.msgs.CameraInfo", "GZ_TO_ROS"), 176 | (f"/{robot_id}/{camera_name}_camera_depth/depth/image_raw", f"/{robot_id}/{camera_name}_rgbd_camera/depth/image_raw", "sensor_msgs/msg/Image", "gz.msgs.Image", "GZ_TO_ROS"), 177 | ]) 178 | 179 | add_camera("front") 180 | add_camera("rear") 181 | add_camera("top_ptz") 182 | #add_depth_camera("front") 183 | add_laser("front") 184 | add_laser("rear") 185 | add_pointcloud("top") 186 | 187 | bridge_config = [{"ros_topic_name": ros, "gz_topic_name": gz, "ros_type_name": ros_type, "gz_type_name": gz_type, "direction": direction} for gz, ros, ros_type, gz_type, direction in bridge_raw] 188 | with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp: 189 | yaml.dump(bridge_config, tmp) 190 | return tmp.name 191 | 192 | bridge_yaml = generate_bridge_yaml(params) 193 | ret.append(Node( 194 | package="ros_gz_bridge", 195 | executable="parameter_bridge", 196 | parameters=[ 197 | {'config_file': bridge_yaml}, 198 | ], 199 | namespace=params['robot_id'], 200 | )) 201 | 202 | 203 | def extract_controllers_from_yaml(yaml_path): 204 | 205 | data = {} 206 | existing_controllers = [] 207 | # Load the YAML file 208 | with open(yaml_path, 'r') as f: 209 | 210 | # Read the file content 211 | content = f.read() 212 | # Remove the string "---\n/**:" if it exists at the beginning 213 | if content.startswith('---\n/**:'): 214 | content = content[len('---\n/**:'):] 215 | # Move file pointer back to start for yaml.safe_load 216 | f.seek(0) 217 | f = tempfile.SpooledTemporaryFile(mode='w+') 218 | f.write(content) 219 | f.seek(0) 220 | 221 | try: 222 | data = yaml.safe_load(f) 223 | except Exception as e: 224 | raise RuntimeError(f"Failed to parse YAML file '{yaml_path}': {e}") 225 | 226 | for controller in data: 227 | existing_controllers.append(controller) 228 | return existing_controllers 229 | 230 | def get_ros2_control_yaml_path(params): 231 | return str( 232 | Path( 233 | FindPackageShare('robotnik_gazebo_ignition').perform(context) 234 | ) 235 | / 'config' 236 | / 'profile' 237 | / substitute_param_context(params['robot'], context) 238 | / 'ros2_control.yaml' 239 | ) 240 | 241 | path = get_ros2_control_yaml_path(params) 242 | new_controllers = extract_controllers_from_yaml(path) 243 | 244 | # ROS2 control 245 | controllers = ['joint_state_broadcaster'] 246 | controllers.extend(new_controllers) 247 | print("Controllers to be spawned:", controllers) 248 | 249 | robot_controller_config = ConfigFile( 250 | [ 251 | FindPackageShare('robotnik_gazebo_ignition'), '/config/profile/', LaunchConfiguration('robot'), '/ros2_control.yaml', 252 | ], 253 | ) 254 | 255 | controllers.append('--param-file') 256 | controllers.append( 257 | robot_controller_config, # type: ignore 258 | ) 259 | 260 | ret.append(Node( 261 | package='controller_manager', 262 | executable='spawner', 263 | namespace=params['robot_id'], 264 | arguments=controllers, 265 | output='screen', 266 | )) 267 | 268 | # Check if rviz config path is modified, if not use default fixed frame 269 | rviz_config_default = str( 270 | Path( 271 | FindPackageShare('robotnik_gazebo_ignition').perform(context) 272 | ) 273 | / 'config' 274 | / 'rviz_config.rviz' 275 | ) 276 | use_fixed_frame = False 277 | # Determine if fixed frame should be used 278 | if isinstance(params['rviz_config'], LaunchConfiguration): 279 | rviz_config_value = params['rviz_config'].perform(context) 280 | use_fixed_frame = (rviz_config_value == "") 281 | else: 282 | use_fixed_frame = (params['rviz_config'] == "") 283 | 284 | if use_fixed_frame: 285 | params['rviz_config'] = rviz_config_default 286 | 287 | # RViz 288 | ret.append(Node( 289 | package="rviz2", 290 | executable="rviz2", 291 | namespace=params['robot_id'], 292 | arguments=[ 293 | # Fixed frame 294 | ['-f', params['robot_id'], '_odom'] if use_fixed_frame else [], 295 | # Config file 296 | '-d', [params['rviz_config']], 297 | # Window name 298 | '-t', [params['robot_id'], ' - ', params['robot_model'], ' - RViz'], 299 | ], 300 | parameters=[{'use_sim_time': True}], 301 | condition=IfCondition(params['run_rviz']) 302 | )) 303 | return ret 304 | 305 | 306 | def generate_launch_description(): 307 | raw_args = [ 308 | ("robot_id", "Unique Robot Identifier", "robot", "ROBOT_ID"), 309 | ("robot", "Robot Model Name", "rbwatcher", "ROBOT"), 310 | ("robot_model", "Robot Variant or Type", LaunchConfiguration('robot'), "ROBOT_MODEL"), 311 | ("robot_xacro", "Path to Robot Xacro File", [FindPackageShare('robotnik_description'), '/robots/', LaunchConfiguration('robot'), '/', LaunchConfiguration('robot_model'), '.urdf.xacro'], "ROBOT_XACRO"), 312 | ("x", "Initial X Coordinate", "0.0", "X"), 313 | ("y", "Initial Y Coordinate", "0.0", "Y"), 314 | ("z", "Initial Z Coordinate", "0.0", "Z"), 315 | ("has_arm", "Enable Arm Controller", "False", "HAS_ARM"), 316 | ("run_rviz", "Run RViz", "True", "RUN_RVIZ"), 317 | ("rviz_config", "RViz configuration file", "", "CONFIG_RVIZ"), 318 | ("use_sim_time", "Use simulation time", "True", "USE_SIM_TIME"), 319 | 320 | ] 321 | 322 | ld = LaunchDescription() 323 | add_to_launcher = AddArgumentParser(ld) 324 | for arg in raw_args: 325 | extended_arg = ExtendedArgument( 326 | name=arg[0], 327 | description=arg[1], 328 | default_value=arg[2], 329 | use_env=True, 330 | environment=arg[3], 331 | ) 332 | add_to_launcher.add_arg(extended_arg) 333 | params = add_to_launcher.process_arg() 334 | ld.add_action(OpaqueFunction(function=launch_setup, args=[params])) 335 | return ld 336 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/launch/spawn_world.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, Robotnik Automation S.L.L. 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # * Redistributions of source code must retain the above copyright 7 | # notice, this list of conditions and the following disclaimer. 8 | # * Redistributions in binary form must reproduce the above copyright 9 | # notice, this list of conditions and the following disclaimer in the 10 | # documentation and/or other materials provided with the distribution. 11 | # * Neither the name of the Robotnik Automation S.L.L. nor the 12 | # names of its contributors may be used to endorse or promote products 13 | # derived from this software without specific prior written permission. 14 | # 15 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | # DISCLAIMED. IN NO EVENT SHALL Robotnik Automation S.L.L. BE LIABLE FOR ANY 19 | # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | import os 26 | from launch import LaunchDescription 27 | from launch.actions import GroupAction, IncludeLaunchDescription 28 | from launch.substitutions import LaunchConfiguration 29 | from launch_ros.actions import Node 30 | from launch_ros.substitutions import FindPackageShare 31 | from launch.conditions import IfCondition 32 | from launch.substitutions import PythonExpression 33 | from robotnik_common.launch import ExtendedArgument, AddArgumentParser 34 | from launch.launch_description_sources import PythonLaunchDescriptionSource 35 | 36 | from ament_index_python.packages import get_package_share_directory 37 | 38 | 39 | def generate_launch_description(): 40 | 41 | ld = LaunchDescription() 42 | add_to_launcher = AddArgumentParser(ld) 43 | world = LaunchConfiguration('world') 44 | 45 | arg = ExtendedArgument( 46 | name='world', 47 | description='world in gazebo classic', 48 | default_value='demo', 49 | ) 50 | add_to_launcher.add_arg(arg) 51 | 52 | arg = ExtendedArgument( 53 | name='world_path', 54 | description='world path in gazebo classic', 55 | default_value=[FindPackageShare('robotnik_gazebo_ignition'), '/worlds/', world, '.world'], # type: ignore 56 | ) 57 | add_to_launcher.add_arg(arg) 58 | 59 | arg = ExtendedArgument( 60 | name='gui', 61 | description='Set to true to enable gazebo gui, headless mode (default: true)', 62 | default_value='true', 63 | ) 64 | add_to_launcher.add_arg(arg) 65 | 66 | params = add_to_launcher.process_arg() 67 | 68 | gazebo_ignition_launch_group = GroupAction( 69 | actions=[ 70 | IncludeLaunchDescription( 71 | PythonLaunchDescriptionSource( 72 | os.path.join( 73 | os.path.join( 74 | get_package_share_directory( 75 | 'ros_gz_sim' 76 | ), 77 | 'launch' 78 | ), 79 | 'gz_sim.launch.py') 80 | ), 81 | launch_arguments={ 82 | 'gz_args':[ 83 | '-r ', 84 | '-s ', 85 | params['world_path'] 86 | ], 87 | 'on_exit_shutdown':'true' 88 | }.items(), 89 | ), 90 | IncludeLaunchDescription( 91 | PythonLaunchDescriptionSource( 92 | os.path.join( 93 | os.path.join( 94 | get_package_share_directory( 95 | 'ros_gz_sim' 96 | ), 97 | 'launch' 98 | ), 99 | 'gz_sim.launch.py') 100 | ), 101 | launch_arguments={ 102 | 'gz_args':[ 103 | '-g ' 104 | ], 105 | 'on_exit_shutdown':'true' 106 | }.items(), 107 | # gui is in (true, 1, yes, on) (case insensitive) 108 | condition = IfCondition(PythonExpression(["'", params['gui'], "'.strip().lower() in ('true','1','yes','on')"])), 109 | ), 110 | Node( 111 | package="ros_gz_bridge", 112 | executable="parameter_bridge", 113 | name="gz_clock_bridge", 114 | output="screen", 115 | arguments=["/clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock"], 116 | ) 117 | ] 118 | ) 119 | 120 | ld.add_action(gazebo_ignition_launch_group) 121 | 122 | return ld 123 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/NOTES: -------------------------------------------------------------------------------- 1 | This model was downloaded from https://app.ignitionrobotics.org/OpenRobotics/fuel/models/Warehouse. 2 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/Asphalt010_1K_Color.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/Asphalt010_1K_Color.jpg -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/Rough_Square_Concrete_Block.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/Rough_Square_Concrete_Block.jpg -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/Tape001_1K_Color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/Tape001_1K_Color.png -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/Terrazzo005_1K_Color.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/Terrazzo005_1K_Color.jpg -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/ground.png -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/meshes/warehouse_colision.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/meshes/warehouse_colision.stl -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | warehouse 4 | 1.0 5 | model.sdf 6 | 7 | Filipe Almeida 8 | filipe.almeida@mov.ai 9 | 10 | A simple warehouse walls to use in warehouse simulations 11 | 12 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0 0 0 0 0 0 5 | false 6 | 7 | 8 | 0 0 0 0 0 0 9 | 10 | 0 0 0 0 0 0 11 | 12 | 13 | 1 1 1 14 | meshes/warehouse_colision.stl 15 | 16 | 17 | 18 | 19 | 0 0 0 0 0 0 20 | 21 | 22 | 1 1 1 23 | meshes/warehouse.dae 24 | 25 | 26 | 27 | 28 | 0 0 0.101 0 0 0 29 | 30 | 31 | 32 | 1 1 1 33 | meshes/warehouse.dae 34 | 35 | drop1 36 |
true
37 |
38 |
39 |
40 |
41 | 42 | 1 43 |
44 |
45 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/gz_warehouse/thumbnails/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/gz_warehouse/thumbnails/1.png -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/robotnik_charging_station/material/scripts/marker1_border_12cm.material: -------------------------------------------------------------------------------- 1 | material ARtrack/marker1_border_12cm 2 | { 3 | technique 4 | { 5 | pass 6 | { 7 | lighting off 8 | scene_blend alpha_blend 9 | depth_write on 10 | texture_unit 11 | { 12 | texture marker1_border_12cm.png 13 | filtering anisotropic 14 | max_anisotropy 4 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/robotnik_charging_station/material/textures/marker1_border_12cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/robotnik_charging_station/material/textures/marker1_border_12cm.png -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/robotnik_charging_station/meshes/summit_docking_station.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/robotnik_charging_station/meshes/summit_docking_station.stl -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/robotnik_charging_station/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | summit_docking_station 4 | 1.0 5 | model.sdf 6 | 7 | Robert Vasquez Zavaleta 8 | rvasquez@robotnik.es 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/robotnik_charging_station/model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | true 5 | charging_station_link 6 | true 7 | 8 | 9 | 10 | -0.071684 0.000885 0.135 0 0 0 11 | false 12 | false 13 | 14 | 15 | 0 0 0 0 0 0 16 | 17 | 18 | meshes/summit_docking_station.stl 19 | 1 1 1 20 | 21 | 22 | 23 | true 24 | 28 | 0.2 0.2 0.2 1 29 | 0.7 0.7 0.7 1 30 | 0.1 0.1 0.1 1 31 | 32 | 0.0 33 | true 34 | 35 | 36 | 37 | 0 0 0 0 0 0 38 | 39 | 40 | meshes/summit_docking_station.stl 41 | 1 1 1 42 | 43 | 44 | 45 | 46 | 47 | 1.0 48 | 1.0 49 | 0 50 | 0 51 | 52 | 53 | 54 | 55 | 0 56 | 0.2 57 | 0.05 58 | 0.001 59 | 60 | 61 | 62 | 0 63 | 1e6 64 | 65 | 66 | 10 67 | 68 | 69 | 70 | 71 | 72 | 0.07 -0.18 0.36 0 0 0 73 | false 74 | false 75 | 76 | 77 | 0 0 0 0 0 0 78 | 79 | 80 | 0.001 0.071 0.12 81 | 82 | 83 | 84 | true 85 | 89 | 90 | 0.0 91 | true 92 | 93 | 94 | 95 | 0 0 0 0 0 0 96 | 97 | 98 | 0.001 0.071 0.12 99 | 100 | 101 | 200 102 | 103 | 0.80.8 104 | 0.20 105 | 106 | 10 107 | 108 | 109 | 110 | 111 | 112 | 0.07 0.18 0.36 0 0 0 113 | false 114 | false 115 | 116 | 117 | 0 0 0 0 0 0 118 | 119 | 120 | 0.001 0.071 0.12 121 | 122 | 123 | 124 | true 125 | 129 | 130 | 0.0 131 | true 132 | 133 | 134 | 135 | 0 0 0 0 0 0 136 | 137 | 138 | 0.001 0.071 0.12 139 | 140 | 141 | 200 142 | 143 | 0.80.8 144 | 0.20 145 | 146 | 10 147 | 148 | 149 | 150 | 151 | 152 | true 153 | 0.071684 -0.000885 0.355 0 0 0 154 | 155 | 156 | 157 | 158 | 0.001 0.14 0.14 159 | 160 | 161 | 162 | 166 | 167 | 168 | 169 | 170 | 171 | 0.001 0.14 0.14 172 | 173 | 174 | 175 | 0.60.6 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/warehouse_simple/meshes/warehouse.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/warehouse_simple/meshes/warehouse.stl -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/warehouse_simple/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | warehouse_simple 4 | 1.0 5 | model.sdf 6 | 7 | Robert Vasquez Zavaleta 8 | rvasquez@robotnik.es 9 | 10 | Simple warehouse model 11 | 12 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/warehouse_simple/model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0 0 0 0 -0 0 6 | 7 | 1 8 | 9 | 0.166667 10 | 0 11 | 0 12 | 0.166667 13 | 0 14 | 0.166667 15 | 16 | 0 0 0 0 -0 0 17 | 18 | 0 19 | 0 20 | 1 21 | 22 | 0 0 0 0 -0 0 23 | 24 | 25 | meshes/warehouse.stl 26 | 1 1 1 27 | 28 | 29 | 30 | 1 31 | 35 | 0.95 0.95 0.95 1 36 | 0.95 0.95 0.95 1 37 | 0.01 0.01 0.01 1 38 | 0 0 0 1 39 | 40 | __default__ 41 | 42 | 43 | 1 44 | 0 45 | 46 | 47 | 0 48 | 10 49 | 0 0 0 0 -0 0 50 | 51 | 52 | meshes/warehouse.stl 53 | 54 | 55 | 56 | 57 | 1 58 | 1 59 | 60 | 61 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/models/warehouse_simple/thumbnails/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobotnikAutomation/robotnik_simulation/HEAD/robotnik_gazebo_ignition/models/warehouse_simple/thumbnails/thumbnail.png -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | robotnik_gazebo_ignition 7 | 1.0.0 8 | Package to simulate robots in Gazebo 9 | Robotnik Developers 10 | Apache-2.0 11 | 12 | ament_cmake 13 | 14 | ros_gz 15 | gz_ros2_control 16 | controller_manager 17 | control_msgs 18 | control_toolbox 19 | controller_interface 20 | joint_state_broadcaster 21 | joint_trajectory_controller 22 | teleop_twist_keyboard 23 | rqt_joint_trajectory_controller 24 | 25 | robotnik_description 26 | robotnik_sensors 27 | 28 | ament_lint_auto 29 | ament_lint_common 30 | 31 | 32 | ament_cmake 33 | 34 | 35 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/scripts/multiple.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # spawn_multiple.sh 3 | set -Eeuo pipefail 4 | 5 | usage() { 6 | cat <<'EOF' 7 | Usage: 8 | ./spawn_multiple.sh [n] [base_name] [dx] [dy] [x0] [y0] [z] [yaw] [-- extra ros2 args] 9 | 10 | Defaults: 11 | n=3 base_name=rbwatcher dx=2.0 dy=0.0 x0=0.0 y0=0.0 z=0.05 yaw=0.0 12 | Examples: 13 | ./spawn_multiple.sh 5 rbwatcher 3.0 0 0 0 0.05 0 14 | ./spawn_multiple.sh 4 rbwatcher 0 2.0 -- robot_model:=rbwatcher_slim run_rviz:=true 15 | EOF 16 | } 17 | 18 | [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]] && { usage; exit 0; } 19 | 20 | n="${1:-3}" 21 | base="${2:-rbwatcher}" 22 | dx="${3:-2.0}" 23 | dy="${4:-0.0}" 24 | x0="${5:-0.0}" 25 | y0="${6:-0.0}" 26 | run_rviz="${9:-false}" 27 | z="${7:-0.05}" 28 | yaw="${8:-0.0}" 29 | 30 | shift $(( $#>0 ? ($#>=8?8:$#) : 0 )) || true 31 | if [[ "${1:-}" == "--" ]]; then shift; fi 32 | extra_args=( "$@" ) 33 | 34 | pkg="robotnik_gazebo_ignition" 35 | file="spawn_robot.launch.py" 36 | 37 | pids=() 38 | cleanup() { 39 | echo "Stopping ${#pids[@]} launches..." 40 | for pid in "${pids[@]}"; do kill -INT "$pid" 2>/dev/null || true; done 41 | sleep 2 42 | for pid in "${pids[@]}"; do kill -TERM "$pid" 2>/dev/null || true; done 43 | sleep 2 44 | for pid in "${pids[@]}"; do kill -KILL "$pid" 2>/dev/null || true; done 45 | } 46 | trap cleanup INT TERM 47 | 48 | # spawn 49 | for ((i=0;i 2 | 3 | 4 | 5 | 0.02 6 | 1.0 7 | 8 | 9 | 10 | 11 | 12 | ogre2 13 | 14 | 15 | 16 | 17 | 18 | 1 1 1 19 | false 20 | 21 | 22 | 23 | 24 | true 25 | 0 0 20 -1.3 0 0.5 26 | 0.8 0.8 0.8 1 27 | 0.01 0.01 0.01 1 28 | 2 29 | false 30 | 31 | 32 | 33 | 34 | true 35 | 36 | 37 | 38 | 39 | 0 0 1 40 | 41 | 42 | 43 | 44 | 45 | 46 | 0 0 1 47 | 100 100 48 | 49 | 50 | 51 | 0.8 0.8 0.8 1 52 | 0.8 0.8 0.8 1 53 | 0.8 0.8 0.8 1 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/worlds/ionic.world: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0.02 7 | 1 8 | 9 | 10 | 11 | 12 | 3D View 13 | false 14 | docked 15 | 16 | 17 | ogre2 18 | scene 19 | 20 | 21 | 0.01 22 | 500 23 | 24 | -5.4 -1.15 1.75 0.0 0.11 0.73 25 | 26 | 27 | 28 | 29 | 30 | docked_collapsed 31 | 32 | true 33 | true 34 | 64 32 16 35 | 1 1 1 36 | true 37 | 1.0 38 | true 39 | 9 40 | 41 | 42 | 43 | floating 44 | 5 45 | 5 46 | false 47 | 48 | 49 | 50 | 51 | false 52 | 5 53 | 5 54 | floating 55 | false 56 | 57 | 58 | 59 | 60 | false 61 | 5 62 | 5 63 | floating 64 | false 65 | 66 | 67 | 68 | 69 | false 70 | 5 71 | 5 72 | floating 73 | false 74 | 75 | 76 | 77 | 78 | false 79 | 5 80 | 5 81 | floating 82 | false 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | false 92 | 5 93 | 5 94 | floating 95 | false 96 | 97 | 98 | 99 | 100 | false 101 | 5 102 | 5 103 | floating 104 | false 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | false 115 | 5 116 | 5 117 | floating 118 | false 119 | 120 | 121 | 122 | 123 | 124 | 125 | World control 126 | false 127 | false 128 | 72 129 | 1 130 | 131 | floating 132 | 133 | 134 | 135 | 136 | 137 | 138 | true 139 | true 140 | true 141 | true 142 | 143 | 144 | 145 | 146 | 147 | 148 | World stats 149 | false 150 | false 151 | 110 152 | 290 153 | 1 154 | 155 | floating 156 | 157 | 158 | 159 | 160 | 161 | 162 | true 163 | true 164 | true 165 | true 166 | 167 | 168 | 169 | 170 | 171 | false 172 | 0 173 | 0 174 | 250 175 | 50 176 | floating 177 | false 178 | #666666 179 | 180 | 181 | 182 | 183 | 184 | 185 | false 186 | 250 187 | 0 188 | 150 189 | 50 190 | floating 191 | false 192 | #666666 193 | 194 | 195 | 196 | 197 | 198 | 199 | false 200 | 0 201 | 50 202 | 250 203 | 50 204 | floating 205 | false 206 | #777777 207 | 208 | 209 | 210 | 211 | 212 | 213 | false 214 | 250 215 | 50 216 | 50 217 | 50 218 | floating 219 | false 220 | #777777 221 | 222 | 223 | 224 | 225 | 226 | 227 | false 228 | 300 229 | 50 230 | 50 231 | 50 232 | floating 233 | false 234 | #777777 235 | 236 | 237 | 238 | true 239 | false 240 | 4000000 241 | 242 | 243 | 244 | 245 | 246 | 247 | docked_collapsed 248 | 249 | 250 | 251 | 252 | 253 | 254 | docked_collapsed 255 | 256 | 257 | 258 | 259 | 260 | 261 | docked_collapsed 262 | 263 | 264 | 265 | 266 | 269 | 270 | 273 | ogre2 274 | 275 | 278 | 279 | 282 | 283 | 286 | 287 | 290 | 291 | 292 | 293 | 0 0 0 294 | false 295 | 296 | 297 | 298 | 299 | -3 0.5 2.7 0 0 0 300 | 1 1 1 1 301 | 1 1 1 1 302 | 1 303 | 304 | 12 305 | 0.3 306 | 0.2 307 | 0.0 308 | 309 | 0 0 -1 310 | 311 | 0 312 | 2.5 313 | 1 314 | 315 | true 316 | false 317 | 318 | 319 | 320 | 4 1.8 2.5 0 0 0 321 | 1 1 1 1 322 | 1 1 1 1 323 | 1 324 | 325 | 12 326 | 0.3 327 | 0.2 328 | 0.0 329 | 330 | 0 0 -1 331 | 332 | 0 333 | 2.5 334 | 1 335 | 336 | true 337 | false 338 | 339 | 340 | 341 | 9 1 2.75 0 0 0 342 | 1 1 1 1 343 | 1 1 1 1 344 | 1 345 | 346 | 12 347 | 0.3 348 | 0.2 349 | 0.0 350 | 351 | 0 0 -1 352 | 353 | 0 354 | 2.5 355 | 1 356 | 357 | true 358 | false 359 | 360 | 361 | 362 | 0 1.75 1.75 0 0 0 363 | 1 1 1 1 364 | 1 1 1 1 365 | 1 366 | 367 | 20 368 | 0.2 369 | 0.8 370 | 0.5 371 | 372 | false 373 | false 374 | 375 | 376 | 377 | 7.4 3.4 1.71 0 0 0 378 | 1 1 1 1 379 | 1 1 1 1 380 | 1 381 | 382 | 20 383 | 0.2 384 | 0.8 385 | 0.5 386 | 387 | false 388 | false 389 | 390 | 391 | 392 | Interior 393 | 0 0 0 0 0 0 394 | https://fuel.gazebosim.org/1.0/openrobotics/models/Ionic interior 395 | 396 | 397 | 398 | Ionic Mascot 399 | 3.67 0.35 1.18 0 0 3.14 400 | https://fuel.gazebosim.org/1.0/openrobotics/models/Ionic Mascot 401 | 402 | 403 | 404 | -------------------------------------------------------------------------------- /robotnik_gazebo_ignition/worlds/lightweight_scene.world: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.02 6 | 1.0 7 | 8 | 9 | 10 | 11 | 12 | ogre2 13 | 14 | 15 | 16 | 17 | 18 | 1 1 1 19 | false 20 | 21 | 22 | 23 | 24 | true 25 | 0 0 20 -1.3 0 0.5 26 | 0.8 0.8 0.8 1 27 | 0.01 0.01 0.01 1 28 | 2 29 | false 30 | 31 | 32 | 33 | 34 | true 35 | 36 | 37 | 38 | 39 | 0 0 1 40 | 41 | 42 | 43 | 44 | 45 | 46 | 0 0 1 47 | 100 100 48 | 49 | 50 | 51 | 0.8 0.8 0.8 1 52 | 0.8 0.8 0.8 1 53 | 0.8 0.8 0.8 1 54 | 55 | 56 | 57 | 58 | 59 | 60 | model://robotnik_gazebo_ignition/models/warehouse_simple 61 | warehouse 62 | -2 0 0 0 0 1.57 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /robotnik_simulation.humble.repos: -------------------------------------------------------------------------------- 1 | repositories: 2 | # Dependencies 3 | ros-control/gz_ros2_control: 4 | type: git 5 | url: https://github.com/ros-controls/gz_ros2_control.git 6 | version: 0.7.16 7 | ros-visualization/visualization_tutorials: 8 | type: git 9 | url: https://github.com/ros-visualization/visualization_tutorials.git 10 | version: b43b3f6a867b1d799af3edba673c56d37178e847 # ros2 11 | 12 | # Robotnik 13 | robotnik/robotnik_common: 14 | type: git 15 | url: https://github.com/RobotnikAutomation/robotnik_common.git 16 | version: 1.2.0 17 | robotnik/robotnik_description: 18 | type: git 19 | url: https://github.com/RobotnikAutomation/robotnik_description.git 20 | version: 2.1.0 21 | robotnik/robotnik_interfaces: 22 | type: git 23 | url: https://github.com/RobotnikAutomation/robotnik_interfaces.git 24 | version: 1.1.0 25 | robotnik/robotnik_sensors: 26 | type: git 27 | url: https://github.com/RobotnikAutomation/robotnik_sensors.git 28 | version: 2.1.0 29 | robotnik/robotnik_simulation: 30 | type: git 31 | url: https://github.com/RobotnikAutomation/robotnik_simulation.git 32 | version: humble-devel 33 | -------------------------------------------------------------------------------- /robotnik_simulation.jazzy.repos: -------------------------------------------------------------------------------- 1 | repositories: 2 | # Dependencies 3 | ros-control/gz_ros2_control: 4 | type: git 5 | url: https://github.com/ros-controls/gz_ros2_control.git 6 | version: 1.2.15 7 | ros-visualization/visualization_tutorials: 8 | type: git 9 | url: https://github.com/ros-visualization/visualization_tutorials.git 10 | version: b43b3f6a867b1d799af3edba673c56d37178e847 # ros2 11 | 12 | # Robotnik 13 | robotnik/robotnik_common: 14 | type: git 15 | url: https://github.com/RobotnikAutomation/robotnik_common.git 16 | version: 1.2.0 17 | robotnik/robotnik_description: 18 | type: git 19 | url: https://github.com/RobotnikAutomation/robotnik_description.git 20 | version: 2.1.0 21 | robotnik/robotnik_interfaces: 22 | type: git 23 | url: https://github.com/RobotnikAutomation/robotnik_interfaces.git 24 | version: 1.1.0 25 | robotnik/robotnik_sensors: 26 | type: git 27 | url: https://github.com/RobotnikAutomation/robotnik_sensors.git 28 | version: 2.1.0 29 | robotnik/robotnik_simulation: 30 | type: git 31 | url: https://github.com/RobotnikAutomation/robotnik_simulation.git 32 | version: jazzy-devel 33 | --------------------------------------------------------------------------------