More info: Low latency kernel
On the desktop used to control the real robot, it is adviced (but not mandatory) to use a low latency kernel.
How to evaluate the latency of the kernel
Clone pam_demos:
git clone https://github.com/intelligent-soft-robots/pam_demos.git
In a first terminal, start a dummy robot, using the default configuration:
o80_dummy
start the frequency check demos:
cd /path/to/pam_demos/frequency_check
python ./frequency.py
This will display some stats regarding the frequency at which the backend is running. Here an example of results obtained using a regular kernel (results may grandly vary depending on the hardware and kernel version):
Frequency monitoring, over 10001 iterations
expected frequency: 500.0
spikes over 525.0: 45 (0.44995500449955006%)
spikes over 550.0: 20 (0.1999800019998%)
spikes below 475.0: 40 (0.3999600039996%)
spikes below 450.0: 19 (0.18998100189981001%)
max frequency observed: 35625.22265764161
min frequency observed: 209.46764426612697
average frequency (spikes excluded): 500.1007930571098
standard deviation (spikes excluded): 7.307281438308859
You can also visually observe the variations in frequency by using o80_plotting
(simply call o80_plotting
in a terminal).
How to install the low latency kernel
install the kernel
In a terminal:
sudo apt install linux-lowlatency
update grub
Install grub-customizer:
sudo apt install grub-customizer
Use grub-customizer to select the low latency kernel to be selected at startup (simply type “grub-customizer” in a terminal to start it).
Then reboot.
Make sure the low latency kernel is used:
In a terminal:
uname -a
The output should display a string containing “lowlatency”. Here an output example:
Linux severus 5.4.0-113-lowlatency #127-Ubuntu SMP PREEMPT Wed May 18 15:12:18 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
note: the command ‘uname -a’ is used during compilation of the software to check wether or not the kernel has low latency. If this command does not output something containing ‘lowlatency’, the software will not make use of the low latency.
Further setup
Create a group called “realtime”:
sudo groupadd realtime
Add yourself and other users of the robot to this group (replace “username”):
sudo usermod -aG realtime username
Open the access to /dev/cpu_dma_latency, by adding to /etc/rc.local:
#!/bin/bash
sudo chmod 0666 /dev/cpu_dma_latency
Create a file /etc/security/limits.d/99-realtime.conf and add to it:
@realtime - rtprio 99
@realtime - memlock unlimited
Reboot the desktop.
Reinstalling pam software
After setting up the low latency kernel, the software must be recompiled. It is advised to recompile it from scratch.
To double check the software has been compiled using low latency capabilities, in a terminal:
o80_dummy
An output similar to this one is expected:
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] read configuration
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] starting robot: dummy
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] cleaning shared memory
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,012] starting standalone
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:19,572] setting pressures to minimal values
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:21,156] init exit signal handler
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:21,167] running ...
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:26,173] running ...
Here is an ouput when the software has not been compiled for low latency (notice the warning):
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] read configuration
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] starting robot: dummy
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,011] cleaning shared memory
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:14,012] starting standalone
warning this thread is not going to be realtime
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:19,572] setting pressures to minimal values
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:21,156] init exit signal handler
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:21,167] running ...
[o80 PAM segment_id: real_robot | INFO 2022-06-08 10:49:26,173] running ...
You may once more check the frequencies using the frequency_check
demo. Here an output obtained
when using a low latency kernel:
Frequency monitoring, over 10001 iterations
expected frequency: 500.0
spikes over 525.0: 0 (0.0%)
spikes over 550.0: 0 (0.0%)
spikes below 475.0: 0 (0.0%)
spikes below 450.0: 0 (0.0%)
max frequency observed: 507.0101762012465
min frequency observed: 491.56402400208816
average frequency (spikes excluded): 500.0132872386277
standard deviation (spikes excluded): 2.5699205319389224