├── 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 |
10 |
11 |
12 |
13 |
14 | ## Overview
15 | Simulation-based environments and launch assets for Robotnik platforms on ROS 2.
16 |
17 |
18 |
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` |
|
26 | | [RB-SUMMIT](https://robotnik.eu/products/mobile-robots/rb-summit/) | rbsummit | `skid-steering` |
|
27 | | [RB-VOGUI](https://robotnik.eu/robotnik-robots/rb-vogui/) | rbvogui, rbvogui_plus | `omni-directional`, `ackermann` |
|
28 | | [RB-VOGUI-XL](https://robotnik.eu/robotnik-robots/rb-vogui-xl/) | rbvogui_xl | `omni-directional`, `ackermann` |
|
29 | | [RB-FIQUS](https://robotnik.eu/robotnik-robots/rb-fiqus/) | rbfiqus | `omni-directional`, `ackermann` |
|
30 | | [RB-KAIROS](https://robotnik.eu/robotnik-robots/rb-kairos/) | rbkairos, rbkairos_plus | `omni-directional` |
|
31 | | [RB-ROBOUT](https://robotnik.eu/robotnik-robots/rb-robout/) | rbrobout, rbrobout_plus | `omni-directional` |
|
32 | | [RB-1*](https://robotnik.eu/robotnik-robots/rb-1/) | rb1 | `differential` |
|
33 | | [RB-THERON](https://robotnik.eu/robotnik-robots/rb-theron/) | rbtheron, rbtheron_plus | `differential` |
|
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 | |
| `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 |
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 |
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 |
|
92 | | `demo` | A demo world with obstacles and ramps for testing robot navigation |
|
93 | | `ionic` | Demo world from Gazebo to show ionic simulation features |
|
94 | | `lightweight_scene` | A lightweight scene for performance testing |
|
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 | 
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 |
--------------------------------------------------------------------------------