The simulation stack

flowchart LR
  %% My image with a constrained aspect ratio
  cm@{ img: "https://www.ipg-automotive.com/favicon.svg", label: "CarMaker", pos: "b", h: 60, constraint: "on" }
  camera@{ img: "https://www.svgrepo.com/show/179335/photo-camera-technology.svg", label: "Virtual Camera", pos: "b", h: 60, constraint: "on" }
  pcan@{ img: "https://www.peak-system.com/favicon.svg", label: "PCAN", pos: "b", h: 60, constraint: "on" }
  subgraph stack["NRAI Stack"]
    direction TB

    nims["NIMS"]
    controller
    perception
    planner

    nims <-- FIFO --> controller
  end
  stack["NRAI Stack"]

  cm <-- Virtual CAN --> pcan <--CAN--> nims
  cm -- Simulation --> camera -- Socket --> perception --> planner --> controller

classDef ic fill:none,stroke:none;
class cm,pcan,camera ic;

The simulation stack

sequenceDiagram
    participant CarMaker@{ "type" : "boundary" } as CarMaker
    participant Camera as Virtual Camera
    participant Perception as Perception
    participant Planner as Planner
    participant Controller as Controller
    participant NIMS as NIMS

    par
      CarMaker->>NIMS: State of the vehicle
      CarMaker->>Camera: Virtual camera data
    end
    Camera->>Perception: Virtual camera data
    Perception->>Planner: Cone detection (more?)
    Planner->>Controller: Waypoints
    par
      Controller->>NIMS: High-level control inputs
      NIMS->>Controller: State of the vehicle
    end
    NIMS->>CarMaker: Low-level control inputs

The real stack

flowchart LR
  %% My image with a constrained aspect ratio
  car@{ img: "https://www.iconpacks.net/icons/2/free-car-icon-2901-thumb.png", label: "Car", pos: "b", h: 60, constraint: "on" }
  camera@{ img: "https://www.svgrepo.com/show/179335/photo-camera-technology.svg", label: "Zed Camera", pos: "b", h: 60, constraint: "on" }
  subgraph stack["NRAI Stack"]
    direction TB

    nims["NIMS"]
    controller
    perception
    planner

    nims <-- Socket --> controller
  end
  stack["NRAI Stack"]

  car <-- CAN --> nims
  camera -- ZED SDK --> perception --> planner --> controller

classDef ic fill:none,stroke:none;
class car,camera ic;

The simulation stack

sequenceDiagram
    participant Car@{ "type" : "boundary" } as Car
    participant Camera@{ "type" : "boundary" } as Zed Camera
    participant Perception as Perception
    participant Planner as Planner
    participant Controller as Controller
    participant NIMS as NIMS

    par
      Car->>NIMS: State of the car
      Camera->>Perception: Camera data
    end
    Perception->>Planner: Cone detection (more?)
    Planner->>Controller: Waypoints
    par
      Controller->>NIMS: High-level control inputs
      NIMS->>Controller: State of the car
    end
    NIMS->>Car: Low-level control inputs

CarMaker

CarMaker

CarMaker dashboard

  1. Disengage the emergency brake
  2. Select and set the mission
  3. Turn the 3 knobs: AS, TS, LV
  4. Wait 5 seconds
  5. Send the GO signal
  6. ???
  7. Profit

CarMaker

FS-AI CAN API

Highlight of the CAN API messages.

From AI to car

  • Status
  • Drive_F
  • Drive_R
  • Steer
  • Brake

From car to AI

  • Status
  • Drive_F
  • Drive_R
  • Steer
  • Brake
  • Speeds
  • Wheel_counts

Car state machine

Highlight of the car state machine. The goal is to reach the FINISHED state without triggering the EMERGENCY BRAKE state.

---
config:
  theme: dark
---
stateDiagram-v2
    state "OFF" as off
    state "READY" as ready
    state "DRIVING" as driving
    state "FINISHED" as finished
    state "EMERGENCY BRAKE" as brake
    [*] --> off
    ready --> off : AS = OFF
    off --> ready : AS = ON & TS = ON & EBS = ARMED & MISSION = SET
    ready --> driving : 5 seconds & DIRECTION = NEUTRAL & TORQUE = 0 & STEERING = 0 & GO = OFF -> ON
    driving --> finished : MISSION = FINISHED & SPEED < 10rpm
    driving --> brake : Emergency brake
    driving --> off : AS = OFF | GO = OFF | ERROR = TRUE
    brake --> off : AS = OFF
    finished --> off : AS = OFF

    classDef success stroke:#0f0
    classDef failure stroke:#f00
    class finished success
    class brake failure