Submissions are evaluated on correctness, clarity, and engineering process. Complete solutions are appreciated, but thoughtful partial progress with clear debugging and learning notes is also valued and can also be submitted.
Read and process data from onboard sensors (GPS, IMU, Encoder) on a Teensy 4.1 microcontroller, and optionally publish the data as ROS 2 topics using MicroROS.
Submit your platformio.ini file along with all relevant Teensy source code for
sensor integration and MicroROS implementation.
If anyone wishes to they also come and test their codes on actual hardware and see if it will work any attempts even failed or succesfull will be rewarded extra credits for this depending on the outcome.
- Teensy 4.1 — ARM Cortex-M7 microcontroller
- 7Semi L86-M33 GPS/GNSS Breakout Board
- Datasheet: 7Semi L86-M33 GPS GNSS Breakout Board
Choose one of the following options:
- BNO055: 9-DOF Absolute Orientation Sensor (3-axis accelerometer, 3-axis gyroscope, 3-axis magnetometer)
- OE-775 DC Motor Magnetic Encoder — 7 PPR (Pulses Per Revolution)
Make sure to only do task based on the numebr assigned to u in the excel sheet
Objective: Read GPS data from the 7Semi L86-M33 module and parse NMEA sentences.
What You Will Implement:
- Configure the appropriate baud rate
- Parse incoming NMEA sentences
- Extract: Latitude, Longitude, Altitude, Timestamp
- Print formatted GPS data to the serial monitor
Expected Output:
Lat: 13.195987
Lon: 80.224016
Altitude: 15.34 m
Objective: Read IMU data and output orientation (roll, pitch, yaw).
BNO055
- Initialize I2C communication on Teensy
- Configure BNO055 to output the appropriate orientation
- Read Euler angles (roll, pitch, yaw) directly
- Print sensor data
Expected Output:
Roll: 2.34°
Pitch: -1.56°
Yaw: 45.67°
Objective: Calculate RPM and distance traveled using OE-775 encoder pulses with interrupt handling.
About Hardware Setup:
- Encoder provides quadrature output (2 channels for direction detection)
- Encoder resolution: 7 PPR (Pulses Per Revolution)
- More about the encoder is given the requiement doc
Expected Output:
RPM: 45.6
Distance: 2.35 meters
Pulses: 47
Direction: Forward
Objective: Publish your assigned sensor's readings (GPS, IMU, or Encoder) as ROS 2 topics from the Teensy.
What You Will Implement:
- Initialize micro_ros_arduino on Teensy
- Create a ROS 2 node on Teensy
- Publish the following topics (based on your assigned sensor):
/gps/fix— GPS data/imu/data— IMU data/motor/rpm— RPM data- Make sure to choose the appropriate data foramt tht will be used to send the these messages list down wt u chose and Why.
| Task | Criteria |
|---|---|
| Task 1 — GPS | Accurate NMEA parsing, correct latitude/longitude extraction, works with real satellites or a simulator |
| Task 2 — IMU | Correct orientation angles, proper calibration, smooth sensor readings |
| Task 3 — Encoder | Accurate RPM calculation, correct distance estimation, proper interrupt handling without missed pulses |
| Advanced — MicroROS | Successfully publishes the topic from the assigned sensor |
Set up and run a basic rover simulation workflow using ROS 2 and Gazebo.
- Rover URDF file
- Mesh package containing STL files referenced by the URDF
- Spawn the provided rover model in Gazebo and verify that the robot appears correctly.
- Configure and run a differential drive controller using
ros2_control. - Publish odometry and TF transforms correctly so rover motion is reflected consistently in the frame tree.
Make sure to refer the src folder which has the mini_model_description package containing the meshes and urdf folder with their respective files , you can put all your launch scripts in this mini_model_description folder
Task 1 : - Build a ROS 2 keyboard teleoperation node for driving the rover in simulation.
Task 2 : Create a single launch file that starts the full simulation stack in one command.
Task 3 : Visualize the rover in RViz2 with a correct TF tree.
- Your modified URDF, configuration, and launch files, along with any other relevant output files (e.g., a screenshot of the TF tree or a recording of the moving rover).
- A short README describing what you implemented and how did yuou implement it.
Category 3: Automation & Dashboard (Here All the task are common for everyone and the task number rule is can be ignored here)
Theme: Build a component or prototype for the rover's operator dashboard / ground control UI.
Note: This category has a single task that can be attempted by everyone. 100% completion is not required — we strongly encourage you to submit your progress and outcomes regardless of how far you get.
Scenario (Fictional): You are given a rover ground control system that requires two services to start simultaneously at the correct trigger:
- A ROS 2 bridge service
- A telemetry logging service
Task: Configure these services to run on system startup, subject to the conditions outlined in Section 3.1.1.
Avoid using utilities involving timers, initializers, and wrappers or abstractions around native tools (e.g.,
cron). Research and find the appropriate native tool for this.
- Both services require a network connection and must only begin once the network is available.
- The services can start as standalone programs, but extra credits will be awarded for configuring them to autostart together.
- Dependency ordering must be ensured — services should start only when their dependencies are satisfied.
Task: Intentionally break the automation service you established as if you are an external agent the team (say Tung tung sahur) — cause it to misbehave or fail. A full crash is highly recommended.
Document in detail the exact steps taken. Credits are awarded as follows:
| Outcome |
|---|
| Error in ROS 2 service |
| Error in telemetry logging service |
| Error in service configuration |
| Crash the automation due to errors |
| Provide a detailed write-up of the method used to cause the crash. |