Deploying EasyNav on a Real iCreate3 Robot

This HowTo explains how to deploy the Costmap Stack of EasyNavigation (EasyNav) on a real iRobot iCreate3 robot, using a Raspberry Pi 4 as on-board computer and ROS 2 Kilted. It is based on the same workflow as the Simple Stack tutorials but adapted for real hardware with a graded Costmap2D environment representation.

Setup

Before starting, ensure that:

  1. You have completed the EasyNav installation steps in Build & Install.

  2. You have a workspace on the Raspberry Pi (for example ~/easynav_ws) and it is sourced correctly.

  3. The following repositories are cloned inside your src/ folder:

    • EasyNavigation

    • easynav_plugins

    • easynav_indoor_testcase (for maps and configuration examples)

    • easynav_costmap_stack (for the costmap-based stack)

    • sllidar_ros2 (LIDAR driver)

  4. Your robot and laptop can communicate over the same Wi-Fi network.

β€”

Hardware Setup

iCreate3 base

Note

The overall workflow mirrors the one in the Simple Stack tutorials, but here you will run on real hardware. The navigation stack represents the environment as a graded Costmap2D.

Raspberry Pi 4 on iCreate3
  • On-board computer: Raspberry Pi 4 Model B powered from the base via USB-C. Ethernet-over-USB-C was not available, so communication occurs over Wi-Fi. The LIDAR connects via USB. The Raspberry Pi runs Ubuntu 24.04 Desktop and ROS 2 Kilted.

  • Operator laptop: Runs rviz2 and connects to the Raspberry Pi via SSH to launch processes.

β€”

ROS 2 Setup on the Raspberry Pi

Follow the official ROS 2 Kilted installation steps: https://docs.ros.org/en/kilted/Installation/Ubuntu-Install-Debs.html

Quick summary:

  1. Enable the universe repository:

    sudo apt install -y software-properties-common
    sudo add-apt-repository -y universe
    
  2. Configure ROS 2 APT repositories:

    sudo apt update && sudo apt install -y curl
    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}')
    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"
    sudo dpkg -i /tmp/ros2-apt-source.deb
    
  3. Install development tools and ROS 2 Desktop:

    sudo apt update && sudo apt install -y ros-dev-tools
    sudo apt upgrade -y
    sudo apt install -y ros-kilted-desktop
    
  4. Install additional packages:

    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:

    mkdir -p ~/easynav_ws/src
    cd ~/easynav_ws/src
    
  2. Clone the required repositories:

    git clone https://github.com/EasyNavigation/easynav_plugins.git
    git clone https://github.com/EasyNavigation/easynav_costmap_stack.git
    git clone https://github.com/EasyNavigation/easynav_indoor_testcase.git
    git clone --recursive https://github.com/EasyNavigation/EasyNavigation.git
    git clone https://github.com/Slamtec/sllidar_ros2.git
    
  3. Install dependencies:

    cd ~/easynav_ws
    rosdep install --from-paths src --ignore-src -r -y
    
  4. Build the workspace:

    colcon build --symlink-install
    
  5. Source automatically in ``~/.bashrc``:

    echo 'source /opt/ros/kilted/setup.bash' >> ~/.bashrc
    echo 'source ~/easynav_ws/install/setup.bash' >> ~/.bashrc
    source ~/.bashrc
    

β€”

Mapping

  1. Verify that both the laptop and the Raspberry Pi can see the iCreate3 topics:

    ros2 topic list
    

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

  2. Publish a static transform from the base to the laser:

    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.

  3. Start the laser driver:

    ros2 launch sllidar_ros2 sllidar_s2_launch.py
    
  4. Place the robot at the desired origin (0, 0) and start SLAM Toolbox:

    ros2 launch slam_toolbox online_async_launch.py
    
  5. On the laptop, open RViz2:

    rviz2
    
  6. Start teleoperation to drive the robot while mapping:

    ros2 run teleop_twist_keyboard teleop_twist_keyboard
    
  7. When the map is complete, save it:

    ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap
    
  8. Store the generated .yaml and image file (.pgm/.png) under ~/easynav_ws/src/easynav_indoor_testcase/maps. If you rename the map, ensure the YAML’s image field matches.

Tip

To reset the odom β†’ base_footprint transform on iCreate3, call:

ros2 service call /reset_pose irobot_create_msgs/srv/ResetPose

β€”

Notes

  • In the maps manager, filter plugin types must match the full class names: easynav_costmap_maps_manager/ObstacleFilter and easynav_costmap_maps_manager/InflationFilter.

  • The Costmap Planner supports parameters such as cost_factor, cost_axial, cost_diagonal, inflation_penalty and continuous_replan. Adjust these values to fine-tune planning behavior for your environment.