Deploying EasyNav on a Real iCreate3 Robot

Hardware Setup

Robot

Note

The overall workflow mirrors the one in the Simple Stack tutorials, but here you will run on real hardware. The representation used by the navigation stack is a graded Costmap2D.

Robot
  • On‑board computer: Raspberry Pi 4 Model B powered from the base over USB‑C. Ethernet‑over‑USB‑C was not available in our setup, so the Raspberry communicates with the base over Wi‑Fi. The LIDAR is connected directly to the Raspberry Pi via USB. The Raspberry Pi is flashed with Ubuntu 24.04 Desktop following https://ubuntu.com/download/raspberry-pi and uses the Kilted ROS 2 distribution.

  • Operator laptop: runs rviz2 and is used to SSH into the Raspberry Pi to launch processes.

ROS 2 Setup on the Raspberry Pi

Follow the official steps at https://docs.ros.org/en/kilted/Installation/Ubuntu-Install-Debs.html. In short:

  1. Enable the Ubuntu universe repository

ir@raspberrypi:~$ sudo apt install -y software-properties-common
ir@raspberrypi:~$ sudo add-apt-repository -y universe
  1. Configure ROS 2 repositories

ir@raspberrypi:~$ sudo apt update && sudo apt install -y curl
ir@raspberrypi:~$ export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
ir@raspberrypi:~$ curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $VERSION_CODENAME)_all.deb"
ir@raspberrypi:~$ sudo dpkg -i /tmp/ros2-apt-source.deb
  1. Install development tools and ROS 2

ir@raspberrypi:~$ sudo apt update && sudo apt install -y ros-dev-tools
ir@raspberrypi:~$ sudo apt update && sudo apt -y upgrade
ir@raspberrypi:~$ sudo apt install -y ros-kilted-desktop
  1. Install additional packages

ir@raspberrypi:~$ sudo apt install -y openssh-server \
    ros-kilted-rplidar-ros \
    ros-kilted-depthai ros-kilted-depthai-ros ros-kilted-depthai-ros-driver ros-kilted-depthai-bridge \
    ros-kilted-slam-toolbox \
    ros-kilted-rmw-zenoh-cpp ros-kilted-zenoh-cpp-vendor \
    ros-kilted-tf2-ros ros-kilted-tf2-py ros-kilted-tf2-tools \
    ros-kilted-irobot-create-msgs

EasyNav Setup on the Raspberry Pi

  1. Create the workspace

ir@raspberrypi:~$ mkdir -p ~/easynav_ws/src
ir@raspberrypi:~$ cd ~/easynav_ws/src
  1. Clone the required repositories

ir@raspberrypi:~/easynav_ws/src$ git clone https://github.com/EasyNavigation/easynav_plugins.git
ir@raspberrypi:~/easynav_ws/src$ git clone https://github.com/EasyNavigation/easynav_costmap_stack.git
ir@raspberrypi:~/easynav_ws/src$ git clone https://github.com/EasyNavigation/easynav_indoor_testcase.git
ir@raspberrypi:~/easynav_ws/src$ git clone --recursive https://github.com/EasyNavigation/EasyNavigation.git
ir@raspberrypi:~/easynav_ws/src$ git clone https://github.com/Slamtec/sllidar_ros2.git
  1. Install dependencies

ir@raspberrypi:~/easynav_ws/src$ cd ..
ir@raspberrypi:~/easynav_ws$ rosdep install --from-paths src --ignore-src -r -y
  1. Build the workspace

ir@raspberrypi:~/easynav_ws$ colcon build --symlink-install
  1. Source in ~/.bashrc

ir@raspberrypi:~$ echo 'source /opt/ros/kilted/setup.bash' >> ~/.bashrc
ir@raspberrypi:~$ echo 'source ~/easynav_ws/install/setup.bash' >> ~/.bashrc
ir@raspberrypi:~$ source ~/.bashrc

Mapping

  1. Verify that both the laptop (argo) and the Raspberry Pi can see the base topics

fmrico@argo:~$ ros2 topic list
ir@raspberrypi:~$ ros2 topic list

You should see topics such as /odom, /tf, /tf_static, /battery_state, and others exposed by the iCreate3.

  1. Publish the static transform from the base to the laser

ir@raspberrypi:~$ ros2 run tf2_ros static_transform_publisher \
  --x 0.02 --z 0.22 --yaw 3.14 \
  --frame-id base_link --child-frame-id laser

Keep this process running during mapping and navigation.

  1. Start the laser driver

ir@raspberrypi:~$ ros2 launch sllidar_ros2 sllidar_s2_launch.py

Keep this process running during mapping and navigation.

  1. Place the robot at the position that you want to be (0, 0) in the map (remember it), and start SLAM Toolbox on the Raspberry Pi

ir@raspberrypi:~$ ros2 launch slam_toolbox online_async_launch.py
  1. On the laptop, open RViz2

fmrico@argo:~$ rviz2
  1. Open a teleop to move the robot while mapping

fmrico@argo:~$ ros2 run teleop_twist_keyboard teleop_twist_keyboard
  1. Drive the robot until the map is complete, then save the map

ir@raspberrypi:~/easynav_ws$ ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap
  1. Store the generated .yaml and image file (.pgm/.png) under /home/ir/easynav_ws/src/easynav_indoor_testcase/maps. You may rename the map file, but ensure the image filename inside the YAML is updated accordingly.

Tip

If you need to reset the odom base_footprint transform on iCreate3, call:

ir@raspberrypi:~$ ros2 service call /reset_pose irobot_create_msgs/srv/ResetPose

Notes

  • Filter plugin names in the maps manager must match the class types: use easynav_costmap_maps_manager/ObstacleFilter and easynav_costmap_maps_manager/InflationFilter.

  • The Costmap Planner parameters include cost_factor (and others such as cost_axial, cost_diagonal, inflation_penalty, and continuous_replan). Adjust them to your environment if necessary.