Autonomous Robot Lab
Objective: Develop a fully autonomous mobile robot through a four-stage lab series:
- Establish ROS2 connectivity and real-time sensor data handling to undock, drive, and dock the robot.
- Implement and tune a closed-loop PID controller to follow predefined points and trajectories, logging and comparing P vs PID performance.
- Integrate a particle-filter localization module to fuse odometry and sensor data for robust pose estimation.
- Build a cost map and employ an A* planner to generate and execute collision-free paths to specified goals.
Lab 1
Process:
- Lab 1 implemented motions.py and utilities.py to read IMU, LiDAR, and odometry topics and to publish velocity commands for undock and teleop control.
Lab 2
Process:
- Wrote a PID class in pid.py, added saturation limits in controller.py, and proved point-to-point tracking over two trajectories, logging error data via plot_errors.py to refine gains.
Lab 3
Process:
- Lab 3 focused on state estimation: I completed the motion and sensor models in particle.py and mapUtilities.py, implemented resampling in particleFilter.py, and visualized filter convergence in Rviz.
Lab 4
Process:
- Lab 4 I generated a grid-based cost map, adapted a provided a_star.py routine to our room map, and scripted planner.py and decisions.py to drive the robot along the planned path.

Results, Testing & Validation
- Reliable baseline control: Successfully undocked, tele-operated, and re-docked the robot using ROS2 action servers and twist messages.
- Improved tracking accuracy: PID control eliminated steady-state error and reduced overshoot on both point and trajectory following tasks.
- Robust localization: The particle filter maintained pose estimates within the map boundaries despite wheel-slip disturbances.
- Effective path planning: The A* planner produced collision-free paths that the robot executed in both simulation and on the physical platform, demonstrating end-to-end autonomous navigation