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 follows the workflow of Mapping with the Costmap Stack and Navigating with the Costmap Stack, adapted for real hardware, with a graded Costmap2D environment representation.

Note

This guide was written for ROS 2 Kilted on Ubuntu 24.04 (the Raspberry Pi’s OS), with EasyNav built from source (see Install from source).

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, NavMap and yaets (see Install from source)

    • sllidar_ros2 (LIDAR driver)

    • a package of your own for the robot’s maps and parameter file (my_robot_easynav below)

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

—

Hardware Setup

iCreate3 base

Note

The overall workflow mirrors Mapping with the Costmap Stack and Navigating with the Costmap Stack, 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-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. Build EasyNav from source in ~/easynav_ws, as described in Install from source.

  2. Clone the LIDAR driver and build it:

    cd ~/easynav_ws/src
    git clone https://github.com/Slamtec/sllidar_ros2.git
    cd ~/easynav_ws
    rosdep install --from-paths src --ignore-src -r -y
    colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
    
  3. Create a package for the robot’s maps and parameters. Any ROS 2 package that installs a maps/ and a params/ directory works:

    cd ~/easynav_ws/src
    ros2 pkg create --build-type ament_cmake my_robot_easynav
    mkdir -p my_robot_easynav/maps my_robot_easynav/params
    

    and add to its CMakeLists.txt, before ament_package():

    install(DIRECTORY maps params DESTINATION share/${PROJECT_NAME})
    
  4. Start from the Kobuki PlayGround’s parameter file, the reference for robots with a 2D lidar (see Navigating with the Costmap Stack):

    curl -L -o ~/easynav_ws/src/my_robot_easynav/params/icreate.params.yaml \
      https://raw.githubusercontent.com/EasyNavigation/easynav_playgrounds/rolling/playground_kobuki/easynav_playground_kobuki/params/costmap.rpp.params.yaml
    

    and adapt it to the iCreate3 and the real world:

    • use_sim_time: false in every node;

    • sensors_node.laser1.topic: scan (the RPLidar driver’s topic);

    • system_node.robot_geometry: the radius and height of your robot, with the LIDAR mount;

    • maps_manager_node.costmap: package: my_robot_easynav and the map you build below in map_path_file.

  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/my_robot_easynav/maps, and build the workspace again. 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/CostmapMapsManager/ObstaclesFilter and easynav_costmap_maps_manager/CostmapMapsManager/InflationFilter.

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