Course lab repository for EECE5554 at Northeastern University. Each lab builds toward a complete sensor fusion stack using ROS 2 Humble.
Author: Adrian Ramirez (ramirez.adr@northeastern.edu)
Magnetic Interference and Calibration: A Comparative Analysis of Magnetometers Malia Howe, Shayda Moezzi, Adrian Ramirez — EECE5554, April 2026
Capstone report for the course. Benchmarked four magnetometer calibration algorithms (MinMax, Magcal, Scalar EKF, and Levenberg-Marquardt) across an industrial-grade VN-100 and a consumer-grade iPhone 11 under controlled hard iron, soft iron, and combined distortion conditions at 7 cm and 30 cm separation distances.
Key findings:
- The iPhone 11 outperformed the VN-100 (13–19% vs 22–34% mean magnitude error), attributed to the VN-100's Vector Processing Engine violating algorithm independence assumptions
- Magcal and Levenberg-Marquardt produced the most consistent calibration output (~0.92 µT and ~0.94 µT std dev)
- MinMax was fastest but most sensitive to distortion intensity
- Scalar EKF achieved competitive accuracy but had the highest standard deviation and slowest runtime
Full report: EECE5554_Final_Report.pdf
| Directory | Topic |
|---|---|
| LAB0 | ROS 2 Publisher / Subscriber basics |
| LAB1 | GPS Driver (SparkFun NEO-M9N) |
| gnss (LAB2) | RTK GNSS Driver & Accuracy Analysis |
| LAB3 | IMU Driver (VectorNav VN-100) |
| LAB4 | GPS + IMU Driver Integration |
| LAB5 | Camera Calibration & Image Mosaicking |
| Magnetometer_Comparison_Project | Magnetometer Calibration Algorithm Benchmarking |
- ROS 2 Humble
- Python 3
colconbuild tool- Jupyter (for analysis notebooks)
source /opt/ros/humble/setup.bashSimple ROS 2 pub/sub demo.
A minimal talker/listener pair using std_msgs/String. Entry point for verifying the ROS 2 environment.
cd LAB0
colcon build
source install/setup.bash
ros2 run simple_chatter talker
ros2 run simple_chatter listenerGPS Driver for the SparkFun NEO-M9N.
Parses NMEA GPGGA sentences over serial, converts to decimal degrees and UTM, and publishes a custom GpsMsg.
Custom message: gps_driver_msgs/GpsMsg
latitude,longitude,altitude,hdoputm_easting,utm_northing,utm_zone,utm_letterutc_time
cd LAB1
colcon build
source install/setup.bash
ros2 launch gps_driver launch.py port:=/dev/ttyACM0Launch argument: port (default /dev/ttyACM0)
Analysis notebook: LAB1/src/analysis.ipynb
IMU Driver for the VectorNav VN-100.
Communicates over serial at 40 Hz. Publishes accelerometer, gyroscope, and magnetometer data as a combined custom message. Includes Allan deviation analysis for noise characterization.
Custom message: imu_msg/IMUmsg
sensor_msgs/Imu(accel + gyro)sensor_msgs/MagneticField- Raw device string
cd LAB3
colcon build
source install/setup.bash
ros2 launch imu_driver imu_launch.py port:=/dev/ttyUSB0Record data:
bash LAB3/src/record_bag.shAnalysis notebook: LAB3/src/analysis/analysis.ipynb
GPS + IMU Driver Integration.
Brings up both drivers simultaneously via a single launch file. Collects synchronized GPS and IMU data for analysis, including trajectory comparison, position error, yaw from a complementary filter, and magnetometer data.
cd LAB4
colcon build
source install/setup.bash
ros2 launch lab4_bringup lab4.launch.py gps_port:=/dev/ttyACM0 imu_port:=/dev/ttyUSB0Record data:
bash LAB4/src/record_bag.shAnalysis notebook: LAB4/src/analysis/analysis.ipynb
Key outputs: trajectory comparison, position error, yaw from complementary filter vs. IMU.
Camera Calibration & Panoramic Image Stitching.
Uses a checkerboard pattern to compute the intrinsic matrix K and lens distortion coefficients. Applies rectification, Harris corner detection, and homography-based mosaicking to construct panoramic images.
Tools: MATLAB (harris.m, mosaic.m)
Calibration data and results: LAB5/images/chessboards/
Mural stitching results: LAB5/images/Murals/
RTK GNSS Driver for centimeter-level positioning.
Parses GNGGA sentences from an RTK-capable receiver. Publishes fix quality, HDOP, and full UTM coordinates. Datasets include open-sky, occluded, walking, and vehicle scenarios for accuracy comparison.
Custom message: rtk_driver_msgs/CustomRTK
latitude,longitude,altitude,hdop,fix_qualityutm_easting,utm_northing,utm_zone,utm_letterutc_time, rawGNGGAsentence
cd gnss
colcon build
source install/setup.bash
ros2 launch rtk_driver rtk_driver_launch.pyAnalysis notebook: gnss/analysis.ipynb
Magnetometer Calibration Algorithm Benchmarking (Course Final Project).
Benchmarks four calibration algorithms — MinMax, Magcal, Scalar EKF, and Levenberg-Marquardt — across two sensors: an industrial-grade VectorNav VN-100 and a consumer-grade iPhone 11 (via Sensor Logger). Data was collected under hard iron, soft iron, and combined distortion conditions at 7 cm and 30 cm separation distances.
Tools: MATLAB (masterAnalysis.m, functions/) and Python (magnetometer_analysis.ipynb)
Calibration algorithms:
functions/runMinMax.m— MinMax (fastest, most sensitive to distortion intensity)functions/runMagcal.m— MATLAB Magcal (most consistent output)functions/runKalmanFilter.m— Scalar EKF (competitive accuracy, highest std dev and slowest runtime)- Levenberg-Marquardt (implemented in
masterAnalysis.m)
Data: Magnetometer_Comparison_Project/data/ — CSV files for VN-100 (vn*) and iPhone (SLA*) across all distortion conditions.
Full report: EECE5554_Final_Report.pdf
All rosbag2 data uses the .db3 format with metadata.yaml. Topics recorded:
| Topic | Type |
|---|---|
/gps |
gps_driver_msgs/GpsMsg |
/imu |
imu_msg/IMUmsg |
/rtk |
rtk_driver_msgs/CustomRTK |