---
# System prepended metadata

title: Latency Test
tags: [NTURT, electrical_system]

---

# Latency Test
###### tags: `electrical_system` `NTURT`

## Introduction

One of the most important thing in control is to minize the latency, hance the inherent latency of a structure has to be measured. In order to validfy our design choice of using a specific control structure, the measured latency is documented here.

All test sources and results are avalible here: [NTURacingTeam/nturt_latency_test](https://github.com/NTURacingTeam/nturt_latency_test).

## Overall Latency

The overall latency of our control system is roughtly **60 ms** for ep4, which to say is **horrible**. The source code and the testing instruction can be found in [github](https://github.com/NTURacingTeam/nturt_latency_test/tree/master/nturt_control_latency_test).

## ROS2 Latency

### Resources

- An avaliable package specifically for benchmarking ros2 can be found here: [irobot-ros/ros2-performance](https://github.com/irobot-ros/ros2-performance).
- A comprehensive paper about the same topic can be found here: [Latency Analysis of ROS2 Multi-Node System](https://arxiv.org/pdf/2101.02074.pdf), yet it **does NOT** use a real-time kernel.

### Tests

The RTT(round trip test) of ros2 message is around 0.25ms in real-time kernel.

Please checkout: [github](https://github.com/NTURacingTeam/nturt_latency_test/tree/master/nturt_rpi_can_latency_test#ros2-message-round-trip-test).

## Micro ROS Latency

### Resources

There is a benchmarking tutorial avaliable in the [official website](https://micro.ros.org/docs/concepts/benchmarking/benchmarking/), but I barely understand what they're doing, and only result avaliable is from 2020: [Micro-ROS benchmarks](http://www.ofera.eu/storage/deliverables/M32/OFERA_55_D54_Micro-ROS_benchmarks_-_Final.pdf). It;s shown that the latency is in the range of **10 microseconds**, but I was told that it might be **200 milliseconds** instead from a believable source. Hence extensive tests are need.

### Tests

The rtt of micro ros is aroud 2ms, but consumes 99% cpu in freertos architecture.

Please checkout: [github](https://github.com/NTURacingTeam/nturt_latency_test/tree/master/nturt_micro_ros_latency_test).

## RPI CAN Latency

### Resources

- A comprehensive paper about the latency of `socketCAN` using real-time kernel: [Timing Analysis of Linux CAN Drivers](https://lwn.net/lwn/images/conf/rtlws11/papers/proc/p30.pdf), the test reslut shows that the latency is at **1ms** range at 2010.

### Tests

The rtt of can in ros2 architecture is around 3ms.

Please checkout: [github](https://github.com/NTURacingTeam/nturt_latency_test/tree/master/nturt_rpi_can_latency_test#can-latency-round-trip-test).

## STM32 CAN Latency

### Tests
#### Bare Metal - H743 to G431
0.298ms round back
operation brief:
1. H743 start timer: ```HAL_GetTick()``` & ```SysTick->VAL```
2. H743 call to HAL Tx FIFO API: ``HAL_FDCAN_AddMessageToTxFifoQ()``
5. (message transmitted over HAL->CAN controller->physical CAN bus)
6. G431 ``HAL_FDCAN_RxFifo0Callback()`` gets called
7. G431 calls ``HAL_FDCAN_GetRxMessage`` in ISR
8. G431 notify main to send message in ISR
9. G431 call ``HAL_FDCAN_AddMessageToTxFifoQ()`` in main
10. (message transmitted over HAL->CAN controller->physical CAN bus)
11. H743 ``HAL_FDCAN_RxFifo0Callback()`` gets called
12. H743 calls ``HAL_FDCAN_GetRxMessage()`` in ISR
13. H743 stops timer: ``HAL_GetTick()`` & ``SysTick->VAL`` in ISR

