Appearance
OLVX™-CAM-U01X3M-S-TP
(software patch > 1215)
Versions
Product Name | Type | Generation | Product Number |
---|---|---|---|
Camera | USB-C Single IMU 3MP | 01 | CAM-U01X3M-S |
Camera | USB-C Single IMU 3MP TPU | 01 | CAM-U01X3M-S-TP |
Camera | USB-C Single IMU 3MP Global Shutter | 01 | CAM-U01X3M-S-G |
Technical Specifications
Feature Category | Feature Subcategory | Specification |
---|---|---|
Form Factor | Dimensions (W x H x D) | 40mm x 40mm x 30mm |
Weight | 89 grams | |
Processor Unit | Application Processor | Dual Cortex-A7 up to 800 MHz |
Real-Time Processor | Cortex-M4 MPU up to 200 MHz | |
TPU AI Accelerator | 4 Trillion Operations Per Second | |
Memory | On Chip (SoC) | 512 MB RAM |
On Chip EEPROM (SoC) | 512 Bytes x 8 | |
On SOM | 64 GByte SD Flash | |
Sensors | Image Sensor | 1/2.7" OmniVision OV2710 |
Max Resolution | 1920(H)x1080(V) pixels | |
Lens | 2.1mm (L210) / 1.8mm (L180) | |
Frame Rate | 640x480 VGA @120fps, 1280x720 HD @60fps, 1920x1080 FHD @30fps | |
IMU Sensor | 6-Axis Automotive-Proven IMU | |
IMU Range & Sensitivity | Accelerometer: 0.06 mg/LSB, Gyroscope: 0.004 dps/LSB | |
Connectivity | High-Speed Connectivity | 1x Virtual Ethernet USB Type C @ 60 MBps |
Other I/O | 1x User Switch, 3x User LEDs | |
Software | Yocto BSP | Available for batch purchases |
Linux Kernel | Linux 5.10 | |
Operating System | Debian 11 | |
Communication middleware | Apache Cyclone DDS | |
Robotic Operating Systems | ROS Noetic Ninjemys, ROS 2 Humble Hawksbill | |
Power and Thermal | Power Consumption | USB Type C PD (15 W max) |
Voltage | PD 5.0v | |
Max Current | 3000mA | |
Temperature Range | Commercial: 0°C to 85°C, Industrial: -40°C to +85°C |
TPU
A TPU, or Tensor Processing Unit, is a type of AI accelerator specifically designed by Google to accelerate machine learning tasks. TPUs are application-specific integrated circuits (ASICs) that have been optimized for the efficient execution of tensor operations, which are fundamental to deep learning and other machine learning algorithms.
The primary goal of a TPU is to enhance the performance and energy efficiency of machine learning workloads, allowing AI models to be trained and executed more quickly and with lower power consumption than traditional CPU or GPU-based hardware. This is achieved through a combination of specialized hardware components and optimizations tailored to the unique requirements of machine learning tasks.
Enable / Disable TPU acceleration
In order to enable the tpu chip do
./opt/olive/script/enable_tpu.sh
./opt/olive/script/enable_tpu.sh
and to disable the tpu do
./opt/olive/script/disable_tpu.sh
./opt/olive/script/disable_tpu.sh
to verify the TPU is enabled you can do
lsusb
lsusb
The result will be:
Bus 001 Device 004: ID 1a6e:089a Global Unichip Corp.
Bus 001 Device 003: ID 32e4:9230 HD USB Camera HD USB Camera
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 1a6e:089a Global Unichip Corp.
Bus 001 Device 003: ID 32e4:9230 HD USB Camera HD USB Camera
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Which the "Global Unichip Corp" is the TPU chip.
TPU Apps
All the python3 based TPU examples are located in /home/olive/apps. To run an object detection example using TPU after enabling the tpu in the previus step run
python3 /home/olive/apps/packages/src/app_tpu_python/tpu_python/app_node.py
python3 /home/olive/apps/packages/src/app_tpu_python/tpu_python/app_node.py
INFO
Note that you have to change the topic name of the app subscriber to your current device topic name in oder to subscribe to the image. In order to to this you have to edit the app_node.py
After running this example the camera will detect objects based on Coral object detection example.
General pipeline diagram
For more information about Google® coral please visit:
For other python example source projects please visit:
https://github.com/olive-robotics/olv_camera_tpu_playground_py
General Setup
Follow the Quick Start Guide for Olive Robotics robot modules to connect the device and start using it.
Quick Setup
Quick start guide for the olive® Camera module:
Check if the data is alreaddy published to your system using:
ros2 topic list
ros2 topic list
you should be able to see all the topics published from the module. For exampe for IMU module you will see:
/olive/imu/id01/image/camera_info /olive/imu/id01/image/compressed /olive/imu/id01/imu /olive/imu/id01/magnetometer /olive/imu/id01/status /olive/imu/id01/switch /olive/imu/id01/led /parameter_events /rosout
/olive/imu/id01/image/camera_info /olive/imu/id01/image/compressed /olive/imu/id01/imu /olive/imu/id01/magnetometer /olive/imu/id01/status /olive/imu/id01/switch /olive/imu/id01/led /parameter_events /rosout
INFO
The number id01 is your device's default namespace.
Visualize the data using:
Embedded Web Interface (https://docs.olive-robotics.com/software/gui/gui.html)
Visualize the topics:
Plot the data from the IMU messages:
Visualize the Image:
Change the parameters of the DCM:
rviz2 (https://github.com/ros2/rviz).
- Visualize the IMU data in Rviz2
Visualize the data and change the parameters like IP, Topic Name, etc using the embedded web interface.
ROS Topics and Services
Topic Name | Message Type | Type | Description |
---|---|---|---|
.../image/camera_info | sensor_msgs/CameraInfo | Publisher | Camera image information |
.../image/compressed | sensor_msgs/CompressedImage | Publisher | Camera image |
.../imu | sensor_msgs/Imu | Publisher | Messured acc/gyro/quaternion |
.../magnetometer | sensor_msgs/MagneticField | Publisher | Messured Magnetic field. |
.../status | diagnostic_msgs/DiagnosticStatus | Publisher | Device status. |
.../switch | std_msgs/Bool | Publisher | Device micro-switch status. |
.../led | std_msgs/Bool | Subscriber | User defined LED. |
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_camera <parameter> <new_value>
Camera
Parameter | Type | Range Min | Range Max | Default | Description |
---|---|---|---|---|---|
frequency | int | 0 | 120 | 30 | Camera publish rate |
brightness | double | 0.0 | 1.0 | 0.5 | Camera brightness parameter |
contrast | double | 0.0 | 1.0 | 0.5 | Camera contrast parameter |
saturation | double | 0.0 | 1.0 | 0.5 | Camera saturation parameter |
gamma | double | 0.0 | 1.0 | 0.5 | Camera gamma parameter |
whitebalance | double | 0.0 | 1.0 | 0.5 | Camera whitebalance parameter |
resolution | string | "320x240" | "1920x1080" | "640x480" | Camera image resolution |
IMU
Parameter | Type | Range Min | Range Max | Default | Description |
---|---|---|---|---|---|
filter_frequency | int | 0 | 1200 | 100 | IMU filter frequency |
filter_gain | int | 0 | 1 | 0.2 | IMU filter gain |
frequency_imu | int | 0 | 1200 | 100 | IMU publish rate |
frequency_mag | int | 0 | 100 | 100 | Magnetometer publish rate |
System
Parameter | Type | Range Min | Range Max | Default | Description |
---|---|---|---|---|---|
frequency | int | 0 | 10 | 10 | System 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.
- Install from apt
sudo apt install ros-humble-rig-reconfigure
sudo apt install ros-humble-rig-reconfigure
- Run the rig
ros2 run rig_reconfigure rig_reconfigure
ros2 run rig_reconfigure rig_reconfigure
- It will show your ros2 parameters and you can edit them simply
Advanced setup
Camera Calibration
- Install Camera Calibration Parser, Camera Info Manager and Launch Testing Ament Cmake
sudo apt install ros-humble-camera-calibration-parsers
sudo apt install ros-humble-camera-info-manager
sudo apt install ros-humble-launch-testing-ament-cmake
sudo apt install ros-humble-camera-calibration-parsers
sudo apt install ros-humble-camera-info-manager
sudo apt install ros-humble-launch-testing-ament-cmake
- The image_pipeline need to be built from source in your workspace with:
git clone – b humble git@github.com:ros-perception/image_pipeline.git
git clone – b humble git@github.com:ros-perception/image_pipeline.git
- A large checkerboard with known dimensions. This tutorial uses a 7x9 checkerboard with 20mm squares. Calibration uses the interior vertex points of the checkerboard, so an “8x10” board uses the interior vertex parameter “7x9” as in the example below. The checkerboard with set dimensions can be downloaded from here.
https://calib.io/pages/camera-calibration-pattern-generator
- A well-lit area clear of obstructions and other check board patterns
- A monocular camera publishing images over ROS
ros2 run camera_calibration cameracalibrator --size 7x9 --square 0.02 --ros-args -r image:=/my_camera/image_raw -p camera:=/my_camera
ros2 run camera_calibration cameracalibrator --size 7x9 --square 0.02 --ros-args -r image:=/my_camera/image_raw -p camera:=/my_camera
Explanation of the required parameters:
Camera Name:
-c, --camera_name
name of the camera to appear in the calibration file
Chessboard Options:
You must specify one or more chessboards as pairs of --size and--square options.
-p PATTERN, --pattern=PATTERN
calibration pattern to detect - 'chessboard','circles', 'acircles','charuco'
-s SIZE, --size=SIZE
chessboard size as NxM, counting interior corners (e.g. a standard chessboard is 7x7)
-q SQUARE, --square=SQUARE
chessboard square size in meters
ROS Communication Options:
--approximate=APPROXIMATE
allow specified slop (in seconds) when pairing images from unsynchronized stereo cameras
--no-service-check
disable check for set_camera_info services at startup
Calibration Optimizer Options:
--fix-principal-point
fix the principal point at the image center
--fix-aspect-ratio
enforce focal lengths (fx, fy) are equal
--zero-tangent-dist
set tangential distortion coefficients (p1, p2) to
zero
-k NUM_COEFFS, --k-coefficients=NUM_COEFFS
number of radial distortion coefficients to use (up to
6, default 2)
--disable_calib_cb_fast_check
uses the CALIB_CB_FAST_CHECK flag for findChessboardCorners
Camera Name:
-c, --camera_name
name of the camera to appear in the calibration file
Chessboard Options:
You must specify one or more chessboards as pairs of --size and--square options.
-p PATTERN, --pattern=PATTERN
calibration pattern to detect - 'chessboard','circles', 'acircles','charuco'
-s SIZE, --size=SIZE
chessboard size as NxM, counting interior corners (e.g. a standard chessboard is 7x7)
-q SQUARE, --square=SQUARE
chessboard square size in meters
ROS Communication Options:
--approximate=APPROXIMATE
allow specified slop (in seconds) when pairing images from unsynchronized stereo cameras
--no-service-check
disable check for set_camera_info services at startup
Calibration Optimizer Options:
--fix-principal-point
fix the principal point at the image center
--fix-aspect-ratio
enforce focal lengths (fx, fy) are equal
--zero-tangent-dist
set tangential distortion coefficients (p1, p2) to
zero
-k NUM_COEFFS, --k-coefficients=NUM_COEFFS
number of radial distortion coefficients to use (up to
6, default 2)
--disable_calib_cb_fast_check
uses the CALIB_CB_FAST_CHECK flag for findChessboardCorners
This will open a calibration window which highlight the checkerboard.
As the checkerboard is moved around the 4 bars on the calibration sidebar increases in length. When all then the 4 bars are green and enough data is available for calibration the CALIBRATE button will light up. Click it to see the results. It takes around the minute for calibration to take place.
After the calibration is completed the save and commit buttons light up. And you can also see the result in terminal.
Press the save button to see the result. Data is saved to “/tmp/calibrationdata.tar.gz”
default factory calibrated parameters for 320x240 are as follows:
image_width: 320
image_height: 240
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [353.88557, 0. , 160.14916,
0. , 353.7126 , 117.27734,
0. , 0. , 1. ]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.428635, 0.167437, 0.001243, 0.004107, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [319.03568, 0. , 161.28226, 0. ,
0. , 334.55365, 116.9051 , 0. ,
0. , 0. , 1. , 0. ]
image_width: 320
image_height: 240
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [353.88557, 0. , 160.14916,
0. , 353.7126 , 117.27734,
0. , 0. , 1. ]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.428635, 0.167437, 0.001243, 0.004107, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [319.03568, 0. , 161.28226, 0. ,
0. , 334.55365, 116.9051 , 0. ,
0. , 0. , 1. , 0. ]
place the ost.yaml in the current folder of the camera:
/opt/olive/config/current/camera
/opt/olive/config/current/camera
Now restart the camera and it should use your new calibration parameters for camera_info topic.
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.
Config Files
Olive config files are located at
/opt/olive/config/current
/opt/olive/config/current
Here, for each component type, you will see a separate folder containing two types of YAML files. The first type is the config files, which are related to startup configurations, and the second type is the param files, which are related to real-time ROS parameter interactions.
Autorun your custom application
If you would like to enable autorun behavior for your custom application within the Olive components, you can add the executable command at the end of the app loader script. You can extend the script and add your logic to it.
/usr/bin/olive-app-loader.sh
/usr/bin/olive-app-loader.sh
Restarting Services
After ssh in your component, you can start, stop or restart olive dcm services by using this commands.
for eio:
sudo systemctl restart olive-dcm-eio.service
sudo systemctl restart olive-dcm-eio.service
for camera:
sudo systemctl restart olive-dcm-camera.service
sudo systemctl restart olive-dcm-camera.service
for imu:
sudo systemctl restart olive-dcm-imu.service
sudo systemctl restart olive-dcm-imu.service
for servo:
sudo systemctl restart olive-dcm-servo.service
sudo systemctl restart olive-dcm-servo.service
for system:
sudo systemctl restart olive-dcm-system.service
sudo systemctl restart olive-dcm-system.service
for manager:
sudo systemctl restart olive-sys-manager.service
sudo systemctl restart olive-sys-manager.service
for app loader:
sudo systemctl restart olive-app-loader.service
sudo systemctl restart olive-app-loader.service
Firmware Releases
Format | Version | Link |
---|---|---|
Compressed IMG | 1.3.2 | download |
Compressed IMG | 2.2.0 | download |
Compressed IMG | 2.2.1 | download |
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
Format | Version | Min Firmware | Link | Note |
---|---|---|---|---|
SWU | 809 | 1.3.2 | download | - |
SWU | 847 | 2.2.0 | download | - |
SWU | 848 | 2.2.0 | download | - |
SWU | 1004 | 2.2.0 | download | IMU v2.0 |
SWU | 1025 | 2.2.0 | download | IMU v2.1 |
SWU | 1026 | 2.2.0 | download | IMU v2.1 (No Magnetometer / Relative AHRS) |
SWU | 1178 | 2.2.0 | download | IMU / CAM / Servo v2.3 |
SWU | 1215 | 2.2.0 | download | IMU / CAM / Servo v2.4 |
SWU | 1254 | 2.2.0 | download | IMU / CAM / Servo v2.5 |
SWU | 1297 | 2.2.0 | download | IMU / CAM / Servo / EIO (Preview, not official) v2.5 |
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.
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:
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.
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:
[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)
- Install the bridge-utils package:
sudo apt install bridge-utils
- 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.
- Open the Network Manager connection editor GUI:
nm-connection-editor
click on (+) and select "Bridge" from the list
- In the Bridge connection Editor add your Olive network interfaces. Each time select "Add" then select "Ethernet"
from the device list select the Olive devices by the interface name or the MAC address. Here (enxa80000000001) and (enxa82c8d3c047b).
Once you done this step you will two interfaces in the list
- Change the Bridge ip to manual mode and define a static ip like:
It is better to select "10.42.0.x" or better "10.42.0.1" as shown in the picture.
- Remove extra (old) netwrok connections.
- Check the bridge connection:
sudo brctl show
This should display the bridge connection status between the Olive components.
- 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".
Internet Sharing
Windows
- 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).
- 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").
- 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.
- 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:
- 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)
- 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
- Use the following command to list your network interfaces:
ifconfig
ifconfig
- 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
- 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)
- 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
- Use the following command to list your network interfaces:
ifconfig
ifconfig
- 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.
- 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.
- Restart Network Manager: After making the changes, restart the Network Manager to apply them:
sudo service network-manager restart
sudo service network-manager restart
- 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
Network Time Protocol (PTP)
Due to limitations in the USB protocol, achieving PTP synchronization is not feasible with our current USB version of the products. However, we are planning to support PTP with our upcoming Ethernet version, expected to launch next year.
Network Time Protocol (NTP)
Setting Up NTP Synchronization on Olive Components
Adding NTP Server IP:
- Access the GUI: Log into your Olive component's GUI.
- Configure NTP Settings: Find the network or time settings and enter the IP of your NTP server.
- Save and Reboot: Apply changes and reboot the component.
- Verify Time: Open a terminal,ssh to Olive, type
date
, and check the time sync. - Deep Verify:
ntpq -p
olive@robotics:~$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
1.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
2.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
3.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
*192.168.7.100 79.133.44.138 2 u 172 256 377 0.294 -5.920 1.859
olive@robotics:~$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
1.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
2.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
3.debian.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.002
*192.168.7.100 79.133.44.138 2 u 172 256 377 0.294 -5.920 1.859
Installing an NTP Server on Your Host Computer
For Linux:
- Install NTP: Run
sudo apt-get update && sudo apt-get install ntp
. - Edit Config: Modify
/etc/ntp.conf
to add public NTP server entries. - Restart NTP: Execute
sudo systemctl restart ntp
.
For Windows:
- Enable NTP Server: Go to
Internet Time
settings in the Control Panel, set up synchronization with a server from pool.ntp.org, and clickUpdate now
.
Note: Ensure UDP port 123 is open in your firewall for NTP traffic.
That's it! Your Olive system should now be synchronizing its time with the predefined NTP server.
Reset Factory
To perform a factory reset on your Olive device, press and hold the reset button for more than 10 seconds. During this time, the LEDs will start blinking between 6 to 10 seconds as a warning. If you continue holding the button, the LEDs will turn solid, indicating the initiation of the factory reset process. This will restore the device to its default settings, create a reset trigger, roll back to a stable software update, and then reboot the device.
DANGER
Please note that the factory reset will take up to 2 minutes, and the device will reboot several times. During this period, please do not remove the connection cable.
For a safe shutdown without a factory reset, hold the button for 2 to 6 seconds.
Olive Component Reset Instructions Summary
Duration | Action | LED Indicator | Expected Outcome |
---|---|---|---|
Less than 2 sec | No Action | On (Off on release) | No action taken |
2 to 6 sec | System Shutdown | On (Off on release) | System shuts down safely |
6 to 10 sec | Warning for Reset | Blinking | LED blinks as a warning before factory reset |
More than 10 sec | Factory Reset Initiated | Solid On then Off | Factory reset starts: reset trigger created, rollback to stable update, and twice reboot |
Reset Factory Procedure Demonstrations
General Example (IMU-U01X09D)
General Example (IMU-U02X09D)
Data Distribution Service (DDS) Middlewares
Supported DDS implimentations
Product name | License | RMW implementation | Status |
---|---|---|---|
eProsima Fast DDS | Apache 2 | rmw_fastrtps_cpp | Full support |
Eclipse Cyclone DDS | Eclipse Public License v2.0 | rmw_cyclonedds_cpp | Full support |
RTI Connext | commercial, research | rmw_connext_cpp | - |
Zetascale Zenoh | commercial, research | rmw_zenoh | - |
1. Fast DDS (formerly Fast RTPS)
The default DDS implementation for most ROS2 distributions.
- Repository: https://github.com/eProsima/Fast-DDS
- RMW package:
rmw_fastrtps_cpp
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>192.168.7.1</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>192.168.7.1</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.
- Repository: https://github.com/eclipse-cyclonedds/cyclonedds
- RMW package:
rmw_cyclonedds_cpp
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:
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
On your host computer 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 host IP is 10.42.0.1. (or 192.168.7.100 for newer versinos)
Then you need to add a variable in your .bashrc to define the location of your cyclone dds config. You need to tell where your cyclonedds.xml is located.
export CYCLONEDDS_URI="/home/[username]/cyclonedds.xml"
export CYCLONEDDS_URI="/home/[username]/cyclonedds.xml"
then you need to stop and start the ros2 daemon.
ros2 daemon stop
ros2 daemon start
ros2 daemon stop
ros2 daemon start
Put this configuration in your host computers cyclonedds.xml.
<?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
Type | Format | Version | Link |
---|---|---|---|
3D Models | |||
OBJ | 1.0 | Download | |
DAE | 1.0 | Download |
Supported Camera Lenses
Lens | Focal Length (mm) | Max Aperture | Sensor Size | Features | Predicted FOV (°) |
---|---|---|---|---|---|
2.8-12mm 1:1.4 IR | 2.8-12 | f/1.4 | 1/2.7" | Manual focus, zoom | ~28° - ~90° |
Far-view | 2.6 | f/2.6 | 1/4" | N/A | ~55° |
Low-distortion Lens | 3.6 | N/A | 1/2.7" | N/A | ~60° |
Fisheye Lens | 10 (estimated) | f/2.8 (estimated) | 1/2.3" (estimated) | N/A | 187° |