- Chenwan HALLEY Zhong
- Winter 2026
This repository consists of several ROS packages:
- turtlelib - A standalone C++ library for 2D rigid body transformations (SE(2)), differential drive kinematics, geometric primitives, SVG visualization, and Extended Kalman Filter math.
- nuslam - A Feature-Based EKF SLAM package with unknown data association using Euclidean distance gating. Achieves < 3.5 cm landmark estimation error and < 3 mm robot pose error after one closed loop in simulation.
- nusim - A simulation package providing a ground-truth environment with arena walls, cylindrical obstacles, physical noise modeling (slip and input noise), and a kinematic robot simulator.
- nuturtle_control - The core control package implementing odometry, motor command translation, and circular trajectory nodes.
- nuturtle_description - URDF files, meshes, and launch files for visualizing the Nuturtle Burger robot in red, blue, and green configurations.
colcon build
source install/setup.bashThis video (×4.0) shows the TurtleBot navigating among cylindrical obstacles in the lab while the EKF SLAM algorithm estimates the robot pose and landmark positions in real time. The green robot and path represent the SLAM estimate; the blue robot and path show raw odometry drift.
Demo4-2.New.mp4
This screencast (x5.0) shows the full EKF SLAM pipeline running in simulation. The green robot (SLAM estimate) closely tracks the red robot (ground truth) while the blue robot (odometry) drifts over time. Green cylinders converge to the true obstacle positions after a few laps.
Demo4-1.mp4
This video shows the TurtleBot performing circular maneuvers in the lab. The robot is driven in a circle and returns to its initial configuration to measure odometry drift.
Demo2.mp4
This video shows the simulated ground-truth robot (red) and the odometry-estimated robot (blue) under ideal simulation conditions. The two robots remain synchronized when no slip or input noise is applied.
Demo1.mp4
Simulation with teleop:
ros2 launch nuturtle_control start_robot.launch.xml robot:=nusim cmd_src:=teleopEKF SLAM in simulation:
ros2 launch nuslam unknown_data_assoc.launch.xml cmd_src:=circleEKF SLAM on the physical TurtleBot — on the robot:
ros2 launch nuslam turtlebot_bringup.launch.xmlOn your computer:
ros2 launch nuslam pc_bringup.launch.xml cmd_src:=teleopPhysical robot (odometry only):
ros2 launch nuturtle_control start_robot.launch.xml robot:=localhost cmd_src:=circleFollowing the odometry drift experiment, the robot was driven in a full circle and returned to the starting marker. The final odometry position was:
| Coordinate | Final Value |
|---|---|
| x | −0.07397 m |
| y | 0.09907 m |
| θ | 0.78177 rad |
Total Euclidean Error: 0.1236 m
The robot was driven among five cylindrical obstacles. Final pose after returning near the starting position:
| Estimate | x [m] | y [m] | θ [rad] | Total error [m] |
|---|---|---|---|---|
| Odometry vs Ground Truth | 0.000 | 0.000 | 0.000 | 0.000 |
| SLAM vs Ground Truth | 0.071 | −0.093 | 3.030 | 0.117 |
The odometry error is near zero because the robot was driven a short distance, insufficient to accumulate measurable encoder drift. Over longer paths the SLAM correction becomes essential. Real-world performance is limited by the ~2.5 Hz LiDAR update rate and higher physical sensor noise compared with the simulation model.
Package-level documentation, parameter descriptions, and topic listings can be found in the README.md files within each individual package directory.