Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rasb:lab:03 [2026/06/26 13:39]
rares.sarmasag
rasb:lab:03 [2026/06/30 14:48] (current)
rares.sarmasag [Lab 3: NXP Cup Autonomous Car]
Line 1: Line 1:
 ====== Lab 3: NXP Cup Autonomous Car ====== ====== Lab 3: NXP Cup Autonomous Car ======
 +{{:​rasb:​lab:​nxpcar-lab.zip|Lab 3 skel}}
 ===== Duration ===== ===== Duration =====
  
Line 75: Line 75:
 ===== Project Layout ===== ===== Project Layout =====
  
-The laboratory package contains the following files: +The workspace is organized into three functional directories:
-  * ''​pid_tuning/​pid_config.txt''​ - configuration file containing runtime PID parameters (Kp, Ki, Kd, speed); +
-  * ''​pid_tuning/​flash_car.sh''​ - script for uploading the parameters to the vehicle; +
-  * ''​exercise2_pixy_vector/​pixy_vector.c''​ - source file for the PixyCam2 coordinate error estimator (student TODO); +
-  * ''​exercise2_pixy_vector/​pixy_vector.h''​ - header file defining the PixyVector structure and function signature;​ +
-  * ''​exercise2_pixy_vector/​test_pixy_vector.c''​ - testbench for validating the error estimation;​ +
-  * ''​exercise3_steering/​steering.c''​ - source file for the servo command converter (student TODO); +
-  * ''​exercise3_steering/​steering.h''​ - header file defining the servo mapping function signature;​ +
-  * ''​exercise3_steering/​test_steering.c''​ - testbench for validating the servo conversion;​ +
-  * ''​Makefile''​ - build system to compile and execute the test suites.+
  
-Students do not need to modify the full vehicle firmware. You will implement and validate the core modules locally, ​and then tune the PID parameters on the physical car.+  * **''​pid_tuning/''​** — PlatformIO project for configuring and flashing the physical vehicle. 
 +    * ''​platformio.ini'':​ PlatformIO configuration file. 
 +    * ''​src/​configpid.cpp'':​ Source file where you edit your vehicle'​s PID gains ($K_p$, $K_i$, $K_d$). 
 +    * ''​lib/​libnxpcar.a'':​ Precompiled static library containing the vehicle'​s core autonomous driving logic. 
 +  * **''​exercise2_pixy_vector/''​** — Coordinate mapping and error estimation. 
 +    * ''​pixy_vector.c''​ / ''​.h'':​ Student implementation file and interface. 
 +    * ''​test_pixy_vector.o'':​ Precompiled local unit test suite object. 
 +  * **''​exercise3_steering/''​** — Steering actuator command conversion. 
 +    * ''​steering.c''​ / ''​.h'':​ Student implementation file and interface. 
 +    * ''​test_steering.o'':​ Precompiled local unit test suite object. 
 +  * **''​test_runner''​** — Precompiled interactive test runner TUI dashboard executable. 
 +  * **''​Makefile''​** — Compiles and links student implementations with precompiled test objects (via ''​make test''​). 
 + 
 +Students do not need to modify the full vehicle firmware. You will implement and validate the core modules locally, ​write your PID gains in the configuration file, and flash the precompiled vehicle firmware.
  
 --- ---
  
-===== Exercise 1: Experimental ​PID Tuning =====+===== Exercise 1: Steering ​PID Controller Flashing & Tuning =====
  
 ==== Objective ==== ==== Objective ====
-Tune the ''​kp''​''​ki''​and ''​kd''​ gains of the vehicle ​controller to achieve stable ​and fast line-following behavior on the physical track.+Tune the steering PID gains ($K_p$$K_i$$K_d$) ​of the physical ​vehicle ​by editing the configuration file, compiling, ​and flashing ​the firmware onto the Teensy 4.1 using PlatformIO.
  
 ==== Materials ==== ==== Materials ====
-  ​* Pre-compiled vehicle binary running on the platform; +  * The student skeleton PlatformIO project inside ​''​pid_tuning/'';​ 
-  ​* The editable ​''​pid_tuning/​pid_config.txt'' ​parameter file+  * A Teensy 4.1 microcontroller on the NXP Cup Car; 
-  * The flashing script ''​pid_tuning/​flash_car.sh''​+  * A USB-micro cable to connect the Teensy to your laptop.
- +
-Example configuration file: +
-<code text> +
-kp=0.35 +
-ki=0.00 +
-kd=0.08 +
-speed=0.40 +
-</​code>​+
  
 ==== Procedure ==== ==== Procedure ====
-  - Start with the integral term disabled (''​ki = 0.00''​). +  ​1. Open the ''​pid_tuning/''​ directory in VS Code (make sure the **PlatformIO IDE** extension is installed). 
-  ​Increase the proportional gain ''​kp''​ progressively until the car follows the line, but starts to oscillate left-and-right around the center. +  2. Open ''​src/​configpid.cpp''​ and set your desired PID gains (do not modify the `extern` keyword as it is required to link with the precompiled library): 
-  ​Increase the derivative gain ''​kd''​ to dampen the oscillations and smooth the vehicle'​s trajectory. +     <​code c> 
-  ​- Introduce a tiny integral gain ''​ki''​ only if the vehicle exhibits a persistent offset to one side (due to mechanical misalignment). +     ​extern const float STEER_KP = 1.8f; 
-  - Reduce the ''​speed''​ parameter if the vehicle spins out or loses the line in sharp curves. +     ​extern const float STEER_KI = 0.00f; 
-  - Record your experimental runs in the table below.+     ​extern const float STEER_KD = 0.20f; 
 +     </​code>​ 
 +  3. Connect the Teensy 4.1 on your vehicle to your computer via USB. 
 +  4. Build and flash the project: 
 +     In VS Code, click the **PlatformIO:​ Upload** button (arrow icon at the bottom status bar), or 
 +     - Open a terminal inside the ''​pid_tuning/''​ folder and run: 
 +       <​code bash> 
 +       pio run -t upload 
 +       </​code>​ 
 +     - PlatformIO will automatically compile your ''​configpid.cpp'',​ link it against the precompiled static library ''​lib/​libnxpcar.a'',​ and upload the complete firmware to the vehicle! 
 +  5. Disconnect the USB cable, place the vehicle on the track, and turn on the power switch to observe its behavior. 
 +  6. To adjust the gains, turn off the vehicle, reconnect the Teensy to your laptop via USB, edit the values in ''​src/​configpid.cpp'',​ and re-flash. 
 +  7. Start with the integral term disabled (''​ki = 0.00''​). 
 +  ​8. Increase the proportional gain ''​kp''​ progressively ​(e.g., in steps of 0.2) until the car follows the line, but starts to oscillate left-and-right around the center. 
 +  ​9. Increase the derivative gain ''​kd''​ to dampen the oscillations and smooth the vehicle'​s trajectory. 
 +  ​10. Record your experimental runs in the table below.
  
 ==== Tuning Recommendations ==== ==== Tuning Recommendations ====
   * **One Parameter at a Time**: Alter only a single PID gain parameter between experimental runs to isolate the physical effect of each gain.   * **One Parameter at a Time**: Alter only a single PID gain parameter between experimental runs to isolate the physical effect of each gain.
-  * **Safety First**: Start testing at low speeds ​(e.g., ''​speed=0.40''​) ​before attempting high-speed runs to prevent physical damage to the vehicle.+  * **Safety First**: Start testing ​with the vehicle on a stand or at low speeds before attempting high-speed runs to prevent physical damage to the vehicle.
   * **Handling Oscillations**:​ If the vehicle exhibits high-frequency oscillations (wiggling), decrease ''​kp''​ or slightly increase ''​kd''​.   * **Handling Oscillations**:​ If the vehicle exhibits high-frequency oscillations (wiggling), decrease ''​kp''​ or slightly increase ''​kd''​.
   * **Handling Sluggishness**:​ If the vehicle reacts too slowly to curves and drifts wide, increase ''​kp''​.   * **Handling Sluggishness**:​ If the vehicle reacts too slowly to curves and drifts wide, increase ''​kp''​.
-  * **Handling Curve Instability**:​ If the vehicle flies off the track in sharp turns, ​reduce ''​speed''​ or increase ​the steering controller ​gain.+  * **Handling Curve Instability**:​ If the vehicle flies off the track in sharp turns, ​check if the steering controller ​gains need further tuning or if the track requires lower speed limits.
  
-==== Uploading to the Vehicle ​==== +==== Telemetry & Diagnostics over USB Serial ​==== 
-Deploy ​the modified configuration using the flashing script+The Teensy car code automatically streams real-time CSV telemetry data over the USB Serial interface (at 115200 baud). If you plug the USB cable while the car is on a stand and open the PlatformIO Serial Monitor, you can observe ​the real-time CSV output
-<​code ​bash+<​code ​text
-./​flash_car.sh pid_config.txt+CSV format: time,​state,​vecs,​side,​lat,​heading,​curv,​conf,​steer,​motor,​dt
 </​code>​ </​code>​
 +This is useful for verifying that the camera sees the track and the steering controller reacts correctly.
  
 Test the vehicle on the track and document your findings: Test the vehicle on the track and document your findings:
  
-^ Run ^ kp ki kd ^ speed ^ Observations ^ +^ Run ^ Kp Ki Kd ^ Observations ^ 
-| 1 | | | | | +| 1 | | | | | 
-| 2 | | | | | +| 2 | | | | | 
-| 3 | | | | | +| 3 | | | | | 
-| 4 | | | | |+| 4 | | | | |
  
 ==== Questions & Observations ==== ==== Questions & Observations ====
Line 165: Line 177:
 Clamp the selected $x$ coordinate to the valid image boundaries $[0, \text{frame\_width} - 1]$ before normalization. Clamp the selected $x$ coordinate to the valid image boundaries $[0, \text{frame\_width} - 1]$ before normalization.
  
-Recommended normalization ​formula+Students should derive a linear scaling ​formula ​to map the clamped $x$ coordinate from the pixel space $[0, \text{frame\_width} - 1]$ to the normalized target space $[-1.0, 1.0]$. 
-<​code ​text+
-center = (frame_width ​- 1) / 2.0 +
-error = (x - center) / center +
-</​code>​+
  
 ==== Examples for frame_width = 79 ==== ==== Examples for frame_width = 79 ====
Line 212: Line 221:
   2. Map this clamped value linearly to a standard servo PWM pulse width in the range ''​[1000,​ 2000]''​ microseconds,​ where ''​1500''​ microseconds represents the center position (wheels straight).   2. Map this clamped value linearly to a standard servo PWM pulse width in the range ''​[1000,​ 2000]''​ microseconds,​ where ''​1500''​ microseconds represents the center position (wheels straight).
  
-Recommended ​conversion formula: +Students should derive a linear ​conversion formula ​that maps the clamped PID steering command from $[-1.0, 1.0]$ to the physical servo PWM pulse width range $[1000, 2000]$ microseconds. 
-<code text> +
-servo_us = 1500 + pid_output * 500 +
-</​code>​+
  
 ==== Examples ==== ==== Examples ====
Line 246: Line 253:
  
 Upon completion of the laboratory, submit the following: Upon completion of the laboratory, submit the following:
-  * The tuned ''​pid_config.txt''​ configuration file;+  * Your final tuned PID parameters (Kp, Ki, Kd) documented in your report;
   * Written answers to the theoretical questions in Exercise 1;   * Written answers to the theoretical questions in Exercise 1;
   * Your C implementations for ''​exercise2_pixy_vector/​pixy_vector.c''​ and ''​exercise3_steering/​steering.c'';​   * Your C implementations for ''​exercise2_pixy_vector/​pixy_vector.c''​ and ''​exercise3_steering/​steering.c'';​
-  * Terminal output logs or screenshots showing that both local test suites pass successfully. 
  
 ===== Grading Criteria ===== ===== Grading Criteria =====
rasb/lab/03.1782470342.txt.gz · Last modified: 2026/06/26 13:39 by rares.sarmasag
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0