Skip to content
On this page

olive® Servo

Overview

The olive® Servo the easiest way to get your own robotic system moving! This high-performance robotics component is designed for use in a wide range of applications. It is re-programmable and easy to integrate, making it simple for users to build their own custom robots and automated systems. The actuator has a plug and play design, making it quick and easy to install and set up, and it is compatible with multiple robotic operating systems, giving users flexibility in terms of the software tools they can use.

Olive-Servo!

Key Features

  • ROS and ROS2 out of the box. No setup required.

  • High-torque motor: The olive® Servo module features a high-torque motor that provides the power and torque needed to move heavy loads or to perform high-precision tasks.

  • Easy integration: The olive® Servo is designed to be easy to integrate into a variety of different robotic systems. It just works through plug and play.

  • Daisy-chainable: Extend your system's funcionality by plugging additional hardware into the olive® Servo's input port: be it any other olive® hardware component or another USB-C peripheral.

  • Various control modes: olive® Servo offers five different modes of control: raw control (pwm), position control, velocity control, trajectory control and wheel mode control.

  • Software-defined: The olive® Servo is software-defined, allowing users to customize its communication layer, behaviour, and functionality through software rather than hardware.

  • Auto-voltage: the olive® Servo can run in different voltage modes: 5 / 9 / 12V. The specific voltage is automatically adjusted to the power intake to ensure maximum performance in all conditions.

Demo

olive_sevo!

olive® Servo Models

The olive series of servos includes four different models that are distinguished by their rotations per minute (RPM). Each servo comes with with an on-board 9D high-performance IMU. These are the available options:

NameTypeSensorsMax Data RateRPMInformation
OLV-SRV01-S16Servo + IMURotary Position Sensor & IMU Sensor (9D)40000Hz / 100 Hz16High Torque Servo Motor & IMU
OLV-SRV01-S32Servo + IMURotary Position Sensor & IMU Sensor (9D)40000Hz / 100 Hz32Mid Torque Servo Motor & IMU
OLV-SRV01-S48Servo + IMURotary Position Sensor & IMU Sensor (9D)40000Hz / 100 Hz48Mid RPM Servo Motor & IMU
OLV-SRV01-S64Servo + IMURotary Position Sensor & IMU Sensor (9D)40000Hz / 100 Hz64High RPM Servo Motor & IMU

Olive® Operational Modes

To change the servo mode you can open the debug gui and select the servo's mode:

servo1!

1. PWM Control

Description: Pulse Width Modulation (PWM) control is a technique used to regulate the power supplied to electrical devices, such as actuators. It adjusts the duty cycle of the input signal, controlling the amount of power provided to the actuator.

  • Input: Duty cycle (-1 to 1)
  • Output: Power supplied to the actuator
  • Subscriber topic: /olive/servo/name_space/pwm

pwm-control!

2. Position Control

Description: Position control is used to maintain or adjust the position of an actuator. The controller computes the difference between the desired and actual positions and adjusts the actuator accordingly.

  • Input: Desired position
  • Output: Actual position of the actuator
  • Subscriber topic: /olive/servo/name_space/goal/position
  • PID: A PID controller is used to minimize the position error, adjusting the control signal to change the actuator's position.

position-control!

3. Velocity Control

Description: Velocity control is used to maintain or adjust the velocity of an actuator. The controller computes the difference between the desired and actual velocities and adjusts the actuator accordingly.

  • Input: Desired velocity
  • Output: Actual velocity of the actuator
  • Subscriber topic: /olive/servo/name_space/goal/velocity
  • PID: A PID controller is used to minimize the velocity error, adjusting the control signal to change the actuator's velocity.

velocity-control!

4. Trajectory Control

Description: This mode controls the position of the actuator, like position control does. But it does something extra: it uses a jitter buffer to give the PID controller a steady stream of data at regular intervals. This is especially useful when you're sending position targets over a network where timing isn't guaranteed. It's also great for situations where following the trajectory smoothly matters more than how fast it's executed.

  • Input: Desired position
  • Output: Actual position of the actuator
  • Subscriber topic: /olive/servo/name_space/goal/position
  • PID: A PID controller is used to minimize the position error, adjusting the control signal to change the actuator's position.

trajectory-control!

5. Wheel Control

Description: It operates similarly to velocity control but incorporates a watchdog mechanism designed to swiftly halt the motor if velocity commands fail to arrive within an assured interval. This feature is particularly valuable in wheel mode control scenarios, where preventing the robot from unintended movement due to high-level logic crashes or network issues is essential.

  • Input: Desired velocity
  • Output: Actual velocity of the actuator
  • Subscriber topic: /olive/servo/name_space/goal/velocity
  • PID: A PID controller is used to minimize the velocity error, adjusting the control signal to change the actuator's velocity.

wheel-control!

Technical Specifications

Part NumberOLV-SRV01-S*
Connection InterfaceUSB Type-C
CommunicationUSB Type C - Ethernet Over USB
Communication ProtocolROS 1&2 (Virtual Ethernet / IPV4)
Rotations per Minute16 / 32 / 48 / 64
Motor Control Pulse Duration1000kHz
Rotaray Position Resolution16384
IMU Sample rate100 Hz
Gyroscope range+/- 2000 deg/sec
Accelerometer range+/- 16 g
Magnetometer range+/- 4 gauss
Gyroscope accuracy+/- 0.05 deg/sec
Accelerometer accuracy+/- 0.1 g
Magnetometer accuracy+/- 0.2 gauss
Performance MetricsCovariance Matrix
Operating Voltage5.0V / 9.0V / 12.0V (auto adjusted)
Voltage Read Resolution65536
Weight180 grams
Dimensions WxHxD60x60x46 mm
Native ROS Messagessensor_msgs/JointState, sensor_msgs/Imu*, sensor_msgs/Temperature
Operating Temperature0 ~ 55 °C

Quick Setup

  1. Follow the Quick Start Guide for Olive Robotics robot modules to connect the device and start using it.

  2. When the servo is correctly connected to your system, you can check that the expected ros topics are present. On your host PC run:

    ros2 topic list
    ros2 topic list

    The following ROS topics showed be shown:

    /olive/servo/id01/pwm
    /olive/servo/id01/magnet/angle
    /olive/servo/id01/magnet/moving_average
    /olive/servo/id01/magnet/auto_gain
    /olive/servo/id01/magnet/magnitude
    /olive/servo/id01/magnet/diagnostic
    /olive/servo/id01/joint
    /olive/servo/id01/joint/voltage
    /parameter_events
    /rosout
    /olive/servo/id01/pwm
    /olive/servo/id01/magnet/angle
    /olive/servo/id01/magnet/moving_average
    /olive/servo/id01/magnet/auto_gain
    /olive/servo/id01/magnet/magnitude
    /olive/servo/id01/magnet/diagnostic
    /olive/servo/id01/joint
    /olive/servo/id01/joint/voltage
    /parameter_events
    /rosout

INFO

The number id01 is your device's default namespace.

  1. Control the servo and visualize the data using one of the available options.

  2. Change the parameters like IP, ROS topic name, etc. using the embedded web interface. You just need to open your browser on your host computer and enter the IP address of the device. If you didn't change the default IP address, then it must be 10.42.0.7.

Voltage Splitter for PD motors

If your motor is PD-enabled, it offers compatibility with both 12V batteries and external power sources. Activating the PD mode requires using the splitter and connecting the data and power cables as illustrated in the accompanying image:

pd!

ROS Topics and Services

PWM Control Mode (Base topics)

Topic NameMessage TypeTypeDescription
.../pwmstd_msgs/Float32SubscriberControl the raw pwm control value. -1.0 to 1.0
.../magnet/anglestd_msgs/Float64PublisherCurrent angular position of the servo. [radian]
.../magnet/moving_averagestd_msgs/Float64PublisherMoving average of .../magnet/angle [radian]
.../magnet/auto_gainstd_msgs/BytePublisherThe rotary sensor's auto gain register.
.../magnet/magnitudestd_msgs/Float64PublisherThe rotary sensor's magnitude register.
.../magnet/diagnosticstd_msgs/StringPublisherThe rotary sensor's diagnostic status.
.../jointsensor_msgs/JointStatePublisherThe servo current joint state.
.../joint/voltagestd_msgs/Float64MultiArrayPublisherThe servo current joint state.

Position Control Mode (Additional topics)

Topic NameMessage TypeTypeDescription
.../goal/positionstd_msgs/Float32SubscriberDesired position

Velocity Control Mode (Additional topics)

Topic NameMessage TypeTypeDescription
.../goal/velocitystd_msgs/Float32SubscriberDesired velocity

Services

Service NameTypeDescription
.../setZerostd_srvs/TriggerRedefine the servo's current position to be zero.
.../setTorqueEnablestd_srvs/TriggerEnables the servo torque.
.../setTorqueDisablestd_srvs/TriggerDisables the servo torque.

Advanced Settings

The device allows certain parameters to be changed at runtime. To get an overview of all changeable parameters use ros2 param list. To change a parameter use ros2 param set /dcm_actuator <parameter> <new_value>

Servo

PWM Control Mode (Base params)

ParameterTypeRange MinRange MaxDefaultDescription
frequencyint01000100Actuator status publish rate
lpf_velocity_gaindouble0.01.00.9Low pass filter gain for velocity

Position Control Mode (Additional params)

ParameterTypeRange MinRange MaxDefaultDescription
Kddouble0.01000.0xPID's derivative parameter
Kidouble0.01000.0xPID's integral parameter
Kpdouble0.01000.0xPID's proportional parameter
control_frequencydouble0.010000.0xPID's control loop rate
error_thresholddouble0.010.0xPID's error threshold
limit_maxdouble-pipipi/2Higher limit of joint workspace
limit_mindouble-pipi-pi/2Lower limit of joint workspace
pwm_maxdouble011Maximum internal PWM power threshold

Velocity Control Mode (Additional params)

ParameterTypeRange MinRange MaxDefaultDescription
Kddouble0.01000.0xPID's derivative parameter
Kidouble0.01000.0xPID's integral parameter
Kpdouble0.01000.0xPID's proportional parameter
control_frequencydouble0.010000.0xPID's control loop rate
error_thresholddouble0.010.0xPID's error threshold
limit_maxdouble01010Higher limit of joint velocity
limit_mindouble0100Lower limit of joint velocity
pwm_maxdouble011Maximum internal PWM power threshold

System

ParameterTypeRange MinRange MaxDefaultDescription
frequencyint01010System status publish rate

Parameter GUI

RIG Reconfigure

The GitHub repository "rig_reconfigure" by teamspatzenhirn is a GUI tool designed for editing ROS 2 parameters at runtime. This tool seems to be specifically aimed at managing and modifying the parameters within ROS 2, a popular robotics middleware framework, providing a graphical interface for ease of use. The repository is public and licensed under the MIT license, indicating open-source availability. The primary programming languages used in the project are C++ and CMake. For more details, you can visit the repository here.

  1. Install from apt
sudo apt install ros-humble-rig-reconfigure
sudo apt install ros-humble-rig-reconfigure
  1. Run the rig
ros2 run rig_reconfigure rig_reconfigure
ros2 run rig_reconfigure rig_reconfigure
  1. It will show your ros2 parameters and you can edit them simply

olive_rig!

Advanced setup

Olix-OS Real-Time Linux for Robotics

Olix-OS Linux is a version of the Linux operating system that is optimized for use on embedded systems, which are small, resource-constrained devices that are used in a wide range of applications such as industrial automation, consumer electronics, and the Internet of Things (IoT).

Olix-OS Linux is typically built using a small subset of the Linux kernel and a minimal set of user-space utilities and libraries. This allows it to run on devices with limited memory and processing power, and it also reduces the size of the operating system, making it more suitable for embedded systems.

Olix-OS Linux can be built using various build systems such as Yocto Project, Buildroot, and OpenEmbedded. These build systems provide pre-configured Linux distributions, which can be customized to suit the specific requirements of the embedded system. They also provide a set of tools for building and managing the Linux system, including the kernel, bootloader, and user-space utilities and libraries.

Olix-OS Linux is also highly configurable, which allows developers to fine-tune the operating system to meet the specific requirements of the embedded system. This includes configuring the kernel and user-space libraries, optimizing the system for performance, and selecting the appropriate drivers and software components.

One of the advantages of using Olix-OS Linux is that it is open-source, which means that developers have access to the source code of the operating system and can modify it to suit their needs. Additionally, embedded Linux has a large and active community of developers, which means that there is a wealth of documentation, support, and development tools available.

Overall, embedded Linux is a versatile and powerful operating system that is well-suited for use on embedded systems. It provides a small footprint and configurability, as well as a large library of pre-built software, making it a popular choice for developers and manufacturers alike.

Bridge Image

Firmware Releases

FormatVersionLink
Compressed IMG1.3.2download
Compressed IMG2.2.0download

How can i see what is my current Software Patch?

In the Olive GUI dashboard in the device status group box you can see your current firmware version.

Flashing a New Image with Etcher Software

Introduction

Etcher is a free and open-source utility used to write image files such as .iso and .img files, as well as zipped folders onto storage media to create live SD cards and USB flash drives. It's widely used to flash OS images for Raspberry Pi, Arduino, and many other applications. Etcher is developed by balena, and it's available for Windows, macOS, and Linux.

Prerequisites

  • An image file you want to flash, typically with a .iso or .img extension. (unzip the firmware file if it is compressed)
  • A USB drive or SD card with enough storage to accommodate the image file. (32 Gb or more)
  • A computer with Etcher installed.

Step-by-Step Guide to Flashing an Image with Etcher

Step 1: Download and Install Etcher

  • Navigate to Etcher's official download page.
  • Choose the version of Etcher that corresponds to your operating system (Windows/macOS/Linux).
  • Download the installer and run it. Follow the on-screen instructions to install Etcher on your system.

Step 2: Prepare Your USB Drive or SD Card

  • Insert the USB drive or SD card into your computer.
  • Ensure that there is no important data on the drive, as the flashing process will erase everything on it.

Step 3: Open Etcher and Select Image

  • Open Etcher on your computer.
  • Click on the “Flash from file” button.
  • Navigate to the location where your image file is stored, select it, and click “Open” (or an equivalent, depending on your OS).

Step 4: Select Target

  • Click on the “Select target” button.
  • Choose your USB drive or SD card from the list. Be very careful to select the correct drive, as all data on the drive will be erased.
  • Click “Connect” (or equivalent).

Step 5: Flash the Image

  • Click on the “Flash!” button.
  • Etcher will format the drive and write the image file to the USB drive or SD card. This process may take some time, depending on the size of the image file and the speed of the drive.
  • Once the flashing process is complete, Etcher will validate the write to ensure it was successful.

Step 6: Eject Safely

  • Once the flashing process is complete and validated, you can close Etcher.
  • Eject the USB drive or SD card safely from your computer.

Step 7: Use the Flashed Drive

  • You can now use the USB drive or SD card to boot a computer or power a device (such as a Raspberry Pi) depending on the image you flashed.

Troubleshooting Tips

  • If Etcher fails to flash the image, try using a different USB port or card reader.
  • Ensure that the image file is not corrupted. You might re-download the file or check its integrity if possible.
  • Make sure your USB drive or SD card has enough space for the image file.
  • If you experience persistent issues, consult the Etcher's GitHub repository or community forums for assistance.

Patch Update

Releases

FormatVersionCompatible FirmwareLinkNote
SWU8091.3.2download-
SWU8472.2.0download-
SWU8482.2.0download-
SWU10042.2.0downloadIMU v2.0
SWU10252.2.0downloadIMU v2.1
SWU10262.2.0downloadIMU v2.1 (No Magnetometer / Relative AHRS)

1) If you are updating a patch for the first on a fresh OlixOS

Fist open the update screen on your browser by going to <device_ip>:7070

then browse or drag and drop the (.swu) file olive_one_x.swu to the upload area. Then wait for a minute to software patch updater applies the software patch on your fresh OlixOS.

2) If you are updating a patch on a working OlixOS

Fist open the update screen by simply going to <device_ip> then select the Firmware Update from the left panel.

then browse or drag and drop the (.swu) file olive_one_x.swu to the upload area. Then wait for a minute to software patch updater applies the software patch on your current OlixOS.

Bridge Image

How can i see what is my current Software Patch?

In the Olive GUI dashboard in the device status group box you can see your current software patch version

Environment Variables

In Olive components the permanent Environment Variables are located in:

/opt/olive/script/env.sh

In order to add your custom Environment variable you should declare it in this script, for example:

declare -x ROS_DOMAIN_ID="0"

SSH

How to log in

Logging in to a Linux real-time Olix-OS system using SSH (Secure Shell) is a common method for remotely accessing and managing the system. SSH is a secure protocol that allows you to remotely access the command line of a Linux system over a network connection.

To log in to a Linux real-time Olix-OS system using SSH, you will need a computer or device with an SSH client installed, and the IP address or hostname of the Olix-OS system.

The first step is to open the terminal or command prompt on your computer and type the command ssh olive@<IP_address> or ssh olive@<hostname> and press enter. This will initiate an SSH connection to the Olix-OS system.

Once the connection is established, you will be prompted for the password for the user account olive. You will need to enter the password one and press enter.

After providing the correct credentials, you will be logged in to the Olix-OS system and will have access to the command line interface. You can then issue commands to the Olix-OS system and perform various tasks such as configuring the system, managing files and processes, and monitoring system performance.

It's also important to note that SSH uses encryption to secure the communication between the client and the server, which means that your login credentials and data transmitted during the session will be protected against eavesdropping.

It's also important to mention that, depending on the real-time Olix-OS Linux distribution, the SSH daemon might not be enabled by default. It's recommended to check the system configuration and the usage of ssh service on the Olix-OS Linux before trying to connect to the system.

Network Configuration

1) Indipended device connection

You can set and update your device IP, netmask and gateway from the device dashboard GUI. More information Here:

Olive GUI Dashboard

olive_network!

2) Multi-Device Interoperability

Multi-Device / Servo Daisy Chain

When you connect multiple Olive components to your computer, they will appear as several Ethernet devices in your network adapter settings. In this configuration, it's necessary to either set up an internal network bridge or define static routes to ensure all devices are properly connected to your computer and can be pinged.

Daisy chain means you have an Olive servo in your setup and therefore you will need the Olive power spliter too. You can see the example network diagram below. Please note that the Olive camera in the daisy chain will work without automatically but for the IMU you will need to setup the connection manually.

olive_network!

Alternatively, you can daisy-chain multiple servos, adding a camera or IMU at the end of the chain. In daisy chain mode, network bridging is handled automatically, requiring no additional configuration.

In summary, using the daisy chain method results in only one Ethernet device being visible in your network device list, but you can still access and ping all devices in the chain. Conversely, connecting multiple components without daisy-chaining will show multiple devices in your network list. This arrangement typically requires manual setup, involving the creation of a bridge network or the definition of static routes to integrate all Ethernet interfaces connected to Olive components. Follow the relevant procedures to establish this setup.

Solution 1 (Statics Routing)

if this is your example network setup:

olive_network!

[imu 1: 10.42.0.7] => [pc interface: 10.42.0.1]
[imu 2: 10.42.0.8] => [pc interface: 10.42.0.2]
[imu 1: 10.42.0.7] => [pc interface: 10.42.0.1]
[imu 2: 10.42.0.8] => [pc interface: 10.42.0.2]

then on your main pc try:

sudo ip route add 10.42.0.7 via 10.42.0.1
sudo ip route add 10.42.0.8 via 10.42.0.2
sudo ip route add 10.42.0.7 via 10.42.0.1
sudo ip route add 10.42.0.8 via 10.42.0.2

Solution 2 (Network Bridge)

  1. Install the bridge-utils package:

sudo apt install bridge-utils

  1. First use the command "ifconfig" to see your current network interfaces:
ifconfig
ifconfig

As you can see in our example we have two Olive devices (enxa80000000001) and (enxa82c8d3c047b). We want to create a single bridge to internally connect this two interfaces and represents them with one ip address.

bridge1!

  1. Open the Network Manager connection editor GUI:

nm-connection-editor

bridge2!

click on (+) and select "Bridge" from the list

bridge3!

  1. In the Bridge connection Editor add your Olive network interfaces. Each time select "Add" then select "Ethernet"

bridge4!

bridge5!

from the device list select the Olive devices by the interface name or the MAC address. Here (enxa80000000001) and (enxa82c8d3c047b).

bridge6!

Once you done this step you will two interfaces in the list

bridge7!

  1. Change the Bridge ip to manual mode and define a static ip like:

bridge8!

It is better to select "10.42.0.x" or better "10.42.0.1" as shown in the picture.

  1. Remove extra (old) netwrok connections.

bridge9!

bridge10!

  1. Check the bridge connection:

sudo brctl show

This should display the bridge connection status between the Olive components.

bridge11!

  1. Test the connection with the "ping" command to ensure eveything is correct. In our case the first component has the ip address "10.42.0.7" and the second one has "10.42.0.8".

bridge13!

Internet Sharing

Windows

  1. First, open the Network Manager and identify your Olive network interface (in this case, "network 39"). Also, identify the interface through which you wish to share the internet (in this context, the WiFi).

Bridge Image

  1. Next, access the settings of the WiFi network. Navigate to the appropriate tab and select the "Internet Sharing" feature. From the dropdown list, choose the Olive interface (in this instance, "network 39").

a3!

  1. Once again, open the network settings for the Olive interface. Proceed to the IPv4 configuration and modify the predefined IP to match the default gateway IP of the Olive interface. By default, the gateway value is set to 10.42.0.1.

a4!

a5!

a6!

  1. Now, SSH into the Olive component and attempt to ping 8.8.8.8 to verify your internet connection. If successful, you should observe a successful ping response as shown below:

a7!

  1. If you wish to change the default gateway on the device, follow these commands on the Olive component:
sudo ip route del default #delete the default route
sudo ip route add default via 10.42.0.1 #add the default route
sudo ip route del default #delete the default route
sudo ip route add default via 10.42.0.1 #add the default route

Linux Method 1 (Wi-Fi internet sharing)

  1. Install Necessary Packages: Before you begin, ensure you have the net-tools and dnsmasq packages installed. These tools will help manage and share the network.
sudo apt update
sudo apt install net-tools dnsmasq
sudo apt update
sudo apt install net-tools dnsmasq
  1. Use the following command to list your network interfaces:
ifconfig
ifconfig
  1. Use the commands bellow to share your wifi internet (here wlp3s0) with you olive interface (here enxa80000000001). Replace this two interface names according to your wifi and olive interface name.
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
sudo iptables -A FORWARD -i enxa80000000001 -o wlp3s0 -j ACCEPT
sudo apt-get install iptables-persistent
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
sudo iptables -A FORWARD -i enxa80000000001 -o wlp3s0 -j ACCEPT
sudo apt-get install iptables-persistent
  1. Verify Internet Sharing: SSH into the Olive component and try pinging an external server to check if the internet connection is shared:
sudo ping 8.8.8.8
sudo ping 8.8.8.8

Linux Method 2 (Lan internet sharing)

  1. Install Necessary Packages: Before you begin, ensure you have the net-tools and dnsmasq packages installed. These tools will help manage and share the network.
sudo apt update
sudo apt install net-tools dnsmasq
sudo apt update
sudo apt install net-tools dnsmasq
  1. Use the following command to list your network interfaces:
ifconfig
ifconfig
  1. Configure Network Manager:
  • Open the Network Manager GUI.
  • Identify your primary internet connection.
  • Also, identify the Olive network interface you wish to share the internet with.
  1. Set Up Internet Sharing:
  • Go to the settings of your primary internet connection.
  • Navigate to the "IPv4" tab.
  • Choose the "Shared to other computers" option from the "Method" dropdown menu.
  1. Restart Network Manager: After making the changes, restart the Network Manager to apply them:
sudo service network-manager restart
sudo service network-manager restart
  1. Verify Internet Sharing: SSH into the Olive component and try pinging an external server to check if the internet connection is shared:
sudo ping 8.8.8.8
sudo ping 8.8.8.8

Time Synchronization

Set the device time manually

In order to set the time manually, you can open the GUI on the Olive device and click on the "Set Time" button. This will synchronize the device time with your computer's time manually. This is useful when you wish to install a package on the device, as for online services and security protocols like HTTPS, synchronization with the current time is essential; otherwise, errors may occur during security handshaking. If you prefer a more automatic and permanent solution, consider running an NTP server on your host computer and defining the NTP server address for Olive. Subsequently, Olive will automatically synchronize the time with the server using the NTP Client.

a8!

Set the Time using Network Time Protocol (NTP)

  1. Install the NTP package: First, you'll need to install the ntp package. Open a terminal and run:
sudo apt update
sudo apt install ntp
sudo apt update
sudo apt install ntp
  1. Stop the systemd-timesyncd service: Debian11 uses systemd-timesyncd by default for time synchronization. Before using ntp, it's a good idea to stop and disable this service to avoid conflicts.
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd

Configure the NTP client: Edit the NTP configuration file using a text editor like nano:

sudo nano /etc/ntp.conf
sudo nano /etc/ntp.conf

Find the lines that start with pool or server. By default, Debian11 uses the NTP servers provided by the NTP Pool Project. If you want to use a predefined NTP server, replace these lines or add a new line:

server your.ntp.server.address iburst
server your.ntp.server.address iburst

Replace your.ntp.server.address with the address of your predefined NTP server. The iburst option sends a burst of packets if the server does not respond to the first query.

Save and exit the file (in nano, press CTRL + X, then Y, then Enter).

Start the NTP service:

sudo systemctl start ntp
sudo systemctl start ntp

Enable the NTP service to start on boot:

sudo systemctl enable ntp
sudo systemctl enable ntp

Verify the synchronization: After a few minutes, you can check the synchronization status with:

ntpq -p
ntpq -p

This will show a list of NTP servers your machine is syncing with. The asterisk (*) next to a server indicates that your system's time is being synchronized with that server.

Adjust the firewall (if necessary): If you have a firewall enabled, you might need to allow NTP traffic. For ufw (Uncomplicated Firewall), you can do this with:

sudo ufw allow 123/udp
sudo ufw allow 123/udp

That's it! Your Olive system should now be synchronizing its time with the predefined NTP server. Remember to periodically check the synchronization status and monitor the NTP service to ensure accurate timekeeping.

Data Distribution Service (DDS) Middlewares

Supported DDS implimentations

Product nameLicenseRMW implementationStatus
eProsima Fast DDSApache 2rmw_fastrtps_cppFull support
Eclipse Cyclone DDSEclipse Public License v2.0rmw_cyclonedds_cppFull support
RTI Connextcommercial, researchrmw_connext_cpp-
Zetascale Zenohcommercial, researchrmw_zenoh-

1. Fast DDS (formerly Fast RTPS)

The default DDS implementation for most ROS2 distributions.

Example Configuration for Fast DDS on Olive Device

This configuration is maintained automatically in the system, and you don't need to change it. However, it's useful to be familiar with it. If desired, you can extend this configuration to your host computer as well. This becomes handy when you wish to modify the buffer size or blacklist certain network interfaces that you don't want to use in ROS2.

The configuraiton is located in

/opt/olive/config/current/fastdds.xml
/opt/olive/config/current/fastdds.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dds>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">

    <transport_descriptors>
        <transport_descriptor>
            <transport_id>udp_config</transport_id>
            <type>UDPv4</type>
            <interfaceWhiteList>
                <address>10.42.0.7</address>
            </interfaceWhiteList>
            <sendBufferSize>4259840</sendBufferSize>
            <receiveBufferSize>4259840</receiveBufferSize>
        </transport_descriptor>
    </transport_descriptors>

    <participant profile_name="participant_xml_profile_qos_socketbuffers" is_default_profile="true">
        <rtps>
            <userTransports>
                <transport_id>udp_config</transport_id>
            </userTransports>
            <!-- Buffer sizes, has big effect on performance.
                 * Values
                   * Maximum set on boot: 2147483647 ~ 20MB,
                   * 4259840 ~ 4MB.
                   * 2129920 ~ 2MB - performance similar to 4MB
                   * 1048576 ~ 1MB - worse performance
                 * For some reason, setting the largest value decreases performance.
                 * Make sure to match the transport_descriptor values
             -->
            <!-- See comments in jetson.xml -->
            <sendSocketBufferSize>4259840</sendSocketBufferSize>
            <listenSocketBufferSize>4259840</listenSocketBufferSize><!-- Maximum set on boot: 2147483647, moderate is 2129920 -->
            <useBuiltinTransports>false</useBuiltinTransports>
        </rtps>
    </participant>

</profiles>
</dds>
<?xml version="1.0" encoding="UTF-8" ?>
<dds>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">

    <transport_descriptors>
        <transport_descriptor>
            <transport_id>udp_config</transport_id>
            <type>UDPv4</type>
            <interfaceWhiteList>
                <address>10.42.0.7</address>
            </interfaceWhiteList>
            <sendBufferSize>4259840</sendBufferSize>
            <receiveBufferSize>4259840</receiveBufferSize>
        </transport_descriptor>
    </transport_descriptors>

    <participant profile_name="participant_xml_profile_qos_socketbuffers" is_default_profile="true">
        <rtps>
            <userTransports>
                <transport_id>udp_config</transport_id>
            </userTransports>
            <!-- Buffer sizes, has big effect on performance.
                 * Values
                   * Maximum set on boot: 2147483647 ~ 20MB,
                   * 4259840 ~ 4MB.
                   * 2129920 ~ 2MB - performance similar to 4MB
                   * 1048576 ~ 1MB - worse performance
                 * For some reason, setting the largest value decreases performance.
                 * Make sure to match the transport_descriptor values
             -->
            <!-- See comments in jetson.xml -->
            <sendSocketBufferSize>4259840</sendSocketBufferSize>
            <listenSocketBufferSize>4259840</listenSocketBufferSize><!-- Maximum set on boot: 2147483647, moderate is 2129920 -->
            <useBuiltinTransports>false</useBuiltinTransports>
        </rtps>
    </participant>

</profiles>
</dds>

2. Cyclone DDS

A lightweight, high-performance DDS implementation by Eclipse Foundation.

These are the most common DDS implementations used in ROS2. To switch between them, follow the instructions from the previous answer to set the RMW_IMPLEMENTATION environment variable to the desired RMW package.

The following ROS2 DDS implementations are available and open-source for ROS2 which you can change it acording to your need:

How to change DDS middleware on the Olive device?

The default DDS implementation on Olive components are Fast DDS. However Cyclone DDS is also supported. You can change the middleware implementation using the GUI:

dds1!

dds2!

How to change ROS2 DDS implementation to Cyclone DDS for the host computer?

Follow these steps to change the ROS2 DDS implementation to Cyclone DDS:

1. Install Cyclone DDS

First, make sure that Cyclone DDS is installed on your system. You can install it using the following commands for different platforms:

  • Ubuntu:
sudo apt update
sudo apt install ros-humble-rmw-cyclonedds-cpp
sudo apt update
sudo apt install ros-humble-rmw-cyclonedds-cpp
  • macOS, Windows, or building from source:

Please refer to the official Cyclone DDS installation instructions at https://github.com/eclipse-cyclonedds/cyclonedds/blob/master/INSTALL.md

2. Set Cyclone DDS as the default DDS implementation

You can change the default DDS implementation by setting the RMW_IMPLEMENTATION environment variable. You can do this either temporarily or permanently.

  • Temporarily (for the current terminal session):

  • Bash (Linux and macOS):

    export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
    export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
  • PowerShell (Windows):

    $env:RMW_IMPLEMENTATION="rmw_cyclonedds_cpp"
    $env:RMW_IMPLEMENTATION="rmw_cyclonedds_cpp"

After setting the variable, you can run your ROS2 nodes in the same terminal, and they will use Cyclone DDS.

  • Permanently:

To make the change permanent, add the corresponding export or $env command to your shell configuration file. For Bash, this is typically .bashrc or .bash_profile (Linux) or .bash_profile (macOS). For PowerShell, this is typically the $PROFILE script.

How to Verify the change?

To ensure that your ROS2 nodes are using Cyclone DDS, you can run the following command:

ros2 doctor --report
ros2 doctor --report

Look for the "middleware" section in the report. It should show "rmw_cyclonedds_cpp" as the active middleware.

That's it! Now your ROS2 system is using Cyclone DDS as the default DDS implementation.

Example Configuration for Cyclone DDS on the host computer

INFO

You need to tell Cyclone which network interface you want to use in your system. This is especially important when you have multiple network interfaces. In this example Olive component's ip on the interface side is 10.42.0.1.

<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
    <Domain Id="any">
        <General>
            <Interfaces>
                <NetworkInterface address="10.42.0.1" priority="default" multicast="default" />
            </Interfaces>
            <AllowMulticast>default</AllowMulticast>
            <MaxMessageSize>65500B</MaxMessageSize>
        </General>
        <Tracing>
            <Verbosity>finest</Verbosity>
            <OutputFile>cyclonedds.log</OutputFile>
        </Tracing>
    </Domain>
</CycloneDDS>
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
    <Domain Id="any">
        <General>
            <Interfaces>
                <NetworkInterface address="10.42.0.1" priority="default" multicast="default" />
            </Interfaces>
            <AllowMulticast>default</AllowMulticast>
            <MaxMessageSize>65500B</MaxMessageSize>
        </General>
        <Tracing>
            <Verbosity>finest</Verbosity>
            <OutputFile>cyclonedds.log</OutputFile>
        </Tracing>
    </Domain>
</CycloneDDS>

Downloads

TypeFormatVersionLink
3D Models
OBJ1.0Download
DAE1.0Download

Mechanical Details

Olive-Servo_Body!

Olive-Servo_Horn!

Olive-Servo_Asm!