This project demonstrates an example application of O3DE working with ROS 2. The integration is realized through ROS 2 Gem.
The main scene of the demo is set in an apple orchard surrounded by countryside. The orchard is managed by the Apple Kraken.
The main level is rather performance-intensive.
The Apple Kraken is a four-wheeled robot assigned the task of navigating around the orchard, collecting apples and storing them in its basket.
The playground scene is much lighter and can be used to quickly prototype with Kraken. There are only a couple of apple trees and the robot itself.
The project runs on Ubuntu 22.04 with ROS 2 Humble or ROS 2 Iron. If you wish to run this demo in Docker environment, please use the instructions in the Docker
folder.
💡 Note: This demo is not supported on Windows!
Refer to the O3DE System Requirements documentation to make sure that the system/hardware requirements are met.
The following commands should prepare O3DE (assuming ${WORKDIR}
is your working directory):
cd ${WORKDIR}
git clone --branch main --single-branch https://github.com/o3de/o3de.git
cd o3de
git lfs install
git lfs pull
python/get_python.sh
scripts/o3de.sh register --this-engine
In case of any problems, please refer to the instructions to set up O3DE from GitHub.
This project uses the ROS 2 Gem, which is included in the O3DE extras bundle. Please install ROS 2 first.
The following commands should prepare o3de-extras
into your ${WORKDIR}
:
cd ${WORKDIR}
git clone --branch main --single-branch https://github.com/o3de/o3de-extras
cd o3de-extras
git lfs install
git lfs pull
And register required Gem:
cd ${WORKDIR}
./o3de/scripts/o3de.sh register --gem-path o3de-extras/Gems/ROS2
Please make sure to use the same version of o3de
and o3de-extras
. This demo was successfully tested with the 2310.1
release.
More information about installing ROS 2 Gem can be found in the installation guide in ROS 2 Project Configuration. Note that the Gem instructions include the installation of ROS 2 with some additional packages.
To learn more about how the Gem works check out the Robotics in O3DE. The Gem is open to your contributions!
The additional packages need to be installed. Use the following command:
sudo apt install ros-${ROS_DISTRO}-vision-msgs ros-${ROS_DISTRO}-nav-msgs ros-${ROS_DISTRO}-rmw-cyclonedds-cpp ros-${ROS_DISTRO}-cyclonedds
💡 Note: This is a dependency besides all the packages already required by the ROS 2 Gem.
Some commands and environmental variables are necessary for ROS 2 systems, including this demo, to function properly. It is best to add these commands and settings to either ~/.bashrc
or equivalent file.
ROS 2 distribution should always be sourced when building and running the demo and its command line interfaces. For a typical ROS 2 Iron installation, this would mean running the following for each console:
source /opt/ros/iron/setup.bash
💡 Note: ROS 2 Humble is also supported. In that case, the provided command would be source /opt/ros/humble/setup.bash
Currently, we are observing issues when running navigation with FastDDS (the default middleware for ROS 2 Humble and ROS 2 Iron). While the exact cause is yet to be investigated, there are no such issues when running with CycloneDDS. Thus, please set the following:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
cd ${WORKDIR}
git clone https://github.com/o3de/ROSConDemo.git
Register this project in the O3DE engine. In O3DE directory:
cd ${WORKDIR}/o3de
scripts/o3de.sh register -pp ${WORKDIR}/ROSConDemo/Project
Ensure your ROS 2 is sourced:
echo $ROS_DISTRO
> iron
💡 Note: In the case ROS 2 Humble is sourced, the output is humble
.
cd ${WORKDIR}/ROSConDemo/Project
cmake -B build/linux -G"Ninja Multi-Config" -DLY_DISABLE_TEST_MODULES=ON -DLY_STRIP_DEBUG_SYMBOLS=ON
cd ${WORKDIR}/ROSConDemo/Project
cmake --build build/linux --config profile --target ROSConDemo Editor AssetProcessor ROSConDemo.Assets
To build the ROS 2 navigation stack configured for this Project, please follow this detailed document. Do not run it yet if you wish to follow the demo scenario.
Launch the O3DE Editor:
cd ${WORKDIR}/ROSConDemo/Project
build/linux/bin/profile/Editor
You can try out the demo scenario as presented during ROSCon 2022. Take the following steps:
Ctrl-G
or by pressing the Play button in the Editor. ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken_rusty', xml: 'line1'}'
.
ros2 launch o3de_kraken_nav navigation_multi.launch.py namespace:=apple_kraken_rusty_1 rviz:=True
. _1
has been added to the namespace when it was automatically generated by the Spawner.2D Goal Pose
). You need to click and drag to indicate the direction the robot will be facing. Make sure to set the goal next to an apple tree, to have the tree on the right side. Not too close, not too far. You can set subsequent goals for the robot to move around.
2D Goal Pose
buttons which are hard-set to work with specific robot namespaces./apple_kraken_rusty_1/cancel_apple_gathering
service.ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken_shiny', xml: 'line2'}' && ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken_rusty', xml: 'line3'}' && ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken_shiny', xml: 'line4'}'
2D Goal Pose
buttons and trigger gathering events. Follow the instructions in this section to launch the navigation stack for each Kraken.💡 Note: If you would like to start the scenario over, remember to close all navigation stacks. You can do this by pressing Ctrl-C in each console you started the ros2 launch o3de_kraken_nav (..)
command.
Please refer to Kraken navigation for instructions.
Check available services in a terminal using this command:
ros2 service list
If your simulation is running, you should be able to see the apple gathering service(s) listed there.
/apple_kraken_rusty_1/trigger_apple_gathering
. It might have another namespace.If Apple Kraken is in position, next to a tree, you can trigger apple gathering with this command:
ros2 service call /apple_kraken_rusty_1/trigger_apple_gathering std_srvs/srv/Trigger
You can also cancel a gathering operation in progress by calling another service:
ros2 service call /apple_kraken_rusty_1/cancel_apple_gathering std_srvs/srv/Trigger
Please read the following section on Robot Spawner.
To spawn a new Apple Kraken, you can use named points (provided by a Spawner Component) or custom poses.
You can use the spawn service with the following robot names:
There are several named poses (line1
through line4
) conveniently placed at entrances to apple orchard rows.
Named point:
ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken', xml: 'line1'}'
Free pose:
ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'apple_kraken', initial_pose: {position:{ x: 4, y: 4, z: 0.2}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}}'
ros2 topic pub
etc.)ROS_DISTRO
, AMENT_PREFIX_PATH
)
cmake
is run. Re-run configuration and build when in doubt. RMW_IMPLEMENTATION
, ROS_DOMAIN_ID
etc.user/log/Editor.log
.ros2 node list
should include /o3de_ros2_node
ros2 topic list
should include /clock
, /tf
and /tf_static
regardless of robot presence./pc
, /ackermann_vel
and /ground_truth_3D_detection
if there is a robot in the scene and the simulation is running.
ros2 service list
should also show several simulation and robot services such as spawning and apple gathering.For terms please see the LICENSE*.TXT files at the root of this repository.