# ModalAI Technical Docs > ModalAI technical documentation for VOXL and VOXL 2 Companion Computers for PX4 and ArduPilot Obstacle Avoidance and GPS-denied navigation, assembled in the USA --- Source: https://docs.modalai.com/esd-safety/ # ESD Safety --- Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware. We recommend always using grounding wrist straps and ESD mats. ![m0054-esd-warning](/images/voxl-developer-bootcamp/m0054-esd-warning.png) ### ESD issues can and have caused unexpected behaviors for developers in the past. --- Source: https://docs.modalai.com/hardware-quickstart/ # Hardware Quickstart ## Overview This section contains hardware quickstarts intended for developer type users and provides the minimum steps needed to get a device powered up and ready to connect to a console. Once you have finished this section, you can move onto the [Setting Up ADB](/setting-up-adb/) section to get connected to your device. | Hardware | | Link | Compute | |---------------|---------------------------------------------------------------------|----------------------------------------------------------------------------|-------------| | VOXL 2 | ![VOXL 2](/images/voxl2/m0054-hero-f.png) | [Quickstart](/voxl-2-hardware-quickstart/){: .btn .btn-green } | VOXL 2 | | VOXL 2 Mini | ![VOXL 2 Mini](/images/voxl2-mini/m0104-hero-bottom.png) | [Quickstart](/voxl-2-mini-hardware-quickstart/){: .btn .btn-green } | VOXL 2 Mini | | Starling 2 | ![Starling 2](/images/d0014/D0014_front_1920x800.png) | [Quickstart](/starling-2-hardware-quickstart/){: .btn .btn-green } | VOXL 2 | | Starling 2 Max | ![Starling 2 Max](/images/d0012/D0012_front_1920x800.png) | [Quickstart](/starling-2-hardware-quickstart/){: .btn .btn-green } | VOXL 2 | | Starling (Legacy) | ![Starling (legacy)](/images/starling-v2/starling-v2-hero-1.png) | [Quickstart](/starling-hardware-quickstart/){: .btn .btn-green } | VOXL 2 | | Sentinel | ![Sentinel](/images/sentinel/sentinel-front-clear.png) | [Quickstart](/sentinel-hardware-quickstart/){: .btn .btn-green } | VOXL 2 | | VOXL Flight (Legacy) | ![VOXL Flight (legacy)](/images/voxl-flight/voxlflighttop.jpg) | [Quickstart](/voxl-flight-hardware-quickstart/){: .btn .btn-green } | VOXL Flight | | VOXL (Legacy) | ![voxl](/images/voxl/voxl-whiteb_90.jpg) | [Quickstart](/voxl-hardware-quickstart/){: .btn .btn-green } | VOXL | | M500 (Legacy) | ![M500 (legacy)](/images/m500/m500.png) | [Quickstart](/m500-hardware-quickstart/){: .btn .btn-green } | VOXL Flight | | Seeker (Legacy) | ![Seeker (legacy)](/images/seeker/Seeker-whitebackg.jpg) | [ Quickstart](/seeker-hardware-quickstart/){: .btn .btn-green } | VOXL | --- Source: https://docs.modalai.com/voxl-2-hardware-quickstart/ # VOXL 2 Hardware Quickstart This section contains a hardware quickstart and is intended for developer type users. It provides the minimum steps needed to get a device powered up and ready to connect to a console. > *Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware.* For technical details, see the [datasheet](/voxl2-datasheets/). ## How to Setup Hardware ### How to Power On and Prepare to Connect
> Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware. ![VOXL 2 power and USB connections for setup](/images/voxl2/M0054-developer-bootcamp-power-usb.png) - Connect power cable to VOXL 2 `J4` (5V input, but use [Power Module](/power-module-v3-datasheet/) or [ESC](/voxl-esc-datasheet/)) - Connect other side of power cable to Power Module - Connect USBC cable to VOXL 2 `J9` - Connect other side of USBC cable (recommended USB type A) to host computer - Connect Power Module to the wall wart power supply - Plug wall wart power supply into mains supply Three LEDs should illuminate GREEN ([LED details found here](/voxl2-leds)). ### How to Power Off Pulling the power is okay in normal operation. If you are logged into VOXL and have been modifying files on the file system then it's recommended to run `sync` to make sure your changes are flushed to flash memory before pulling power. Do not pull power while flashing software as this can brick the device.
[Next Step: Setting Up ADB](/setting-up-adb/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-2-mini-hardware-quickstart/ # VOXL 2 Mini Hardware Quickstart This section contains a hardware quickstart and is intended for developer type users. It provides the minimum steps needed to get a device powered up and ready to connect to a console. > *Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware.* For technical details, see the [datasheet](/voxl2-mini-datasheets/) ## How to Setup Hardware ### How to Power On and Prepare to Connect #### Using VOXL ESC Mini ![VOXL 2 Mini powered via VOXL ESC Mini with USB](/images/voxl2-mini/m0104-developer-bootcamp-power-esc-usb.png) - Connect power cable to VOXL 2 Mini `J1` (3.8V input, but use [Power Module](/power-module-v3-datasheet/) or [ESC](/voxl-esc-datasheet/)) - The other side of power cable should come soldered to the VOXL Mini ESC - Connect USBC cable to VOXL 2 Mini `J9` - Connect other side of USBC cable (recommended USB type A) to host computer - Connect the ESC XT60 connector to battery or wall wart power supply #### Using a VOXL Power Module ![VOXL 2 Mini powered via VOXL power module with USB](/images/voxl2-mini/m0104-developer-bootcamp-power-apm-usb.png) - Connect power cable to VOXL 2 Mini `J1` (3.8V input, but use [Power Module](/power-module-v3-datasheet/) or [ESC](/voxl-esc-datasheet/)) - Connect other side of power cable to Power Module - Connect USBC cable to VOXL 2 Mini `J9` - Connect other side of USBC cable (recommended USB type A) to host computer - Connect Power Module to the wall wart power supply - Plug wall wart power supply into mains supply ### How to Power Off Pulling the power is okay in normal operation. If you are logged into VOXL and have been modifying files on the file system then it's recommended to run `sync` to make sure your changes are flushed to flash memory before pulling power. Do not pull power while flashing software as this can brick the device. [Next Step: Set up ADB](/setting-up-adb/){: .btn .btn-green } --- Source: https://docs.modalai.com/starling-2-hardware-quickstart/ # Starling 2 & Starling 2 Max Hardware Quickstart The [Starling 2](/starling-2-hardware-overview/) and [Starling 2 Max](/starling-2-max-hardware-overview/) share the same VOXL 2-based compute stack and the same software experience — everything in the rest of this bootcamp applies identically to both. The differences are the airframe and the power system: | | Starling 2 | Starling 2 Max | |---|---|---| | Battery | one 2S 18650 pack (e.g. Sony VTC6 3000mAh) with XT30 connector | **two** 2S 18650 packs, connected in series for an effective 4S (16.8V max), XT30 connectors | | Airframe | 285g take-off weight, 220mm class | 500g take-off weight, 322mm carbon fiber airframe, 180mm folding props, 500g payload capacity | | Power module | — | integrated in the ModalAI 4-in-1 Mini ESC | | RC receiver | 915MHz ELRS or 2.4GHz Ghost Atto | 915MHz ELRS or 2.4GHz Ghost Atto | > Starling 2 Max requires **both** batteries installed — the two packs power the drone in series. Never mix a charged and a depleted pack. ## Power On 1. Inspect the airframe and propellers for damage from shipping. 2. Install the battery (Starling 2) or both batteries (Starling 2 Max) and connect the XT30 connector(s). 3. The drone boots automatically when battery power is applied. Startup takes roughly 30 seconds; the ESC will play its startup tone. 4. Power on the transmitter. If your kit includes the iFlight Commando 8 handset, power it on with a short press of the power button followed by a long press. A short press on its own does not turn the handset on. For full specifications, kit contents, and component part numbers, see the [Starling 2 datasheet](/starling-2-datasheet/) and [Starling 2 Max datasheet](/starling-2-max-datasheet/). ## Next Continue with [Setting Up ADB](/setting-up-adb/) to connect to the drone — from here on, the bootcamp steps are identical for both models. --- Source: https://docs.modalai.com/starling-hardware-quickstart/ # Starling Hardware Quickstart This section provides the minimum steps needed to get a device powered up and ready to connect to a console. More details can be found on the Starling [Hardware Overview](/starling-hardware-overview/) and [Datasheet](/starling-datasheet/) pages, but are not necessary to complete the bootcamp. > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* ## How to Power On and Prepare to Connect ### 1. Ensure propellor clips are installed ![MRB-D0005-prop-clips](/images/starling-v2/MRB-D0005-prop-clips.jpg) ### 2. Connect USB-C Cable - Connect USB-C cable to VOXL 2 - Connect other side of USB-C cable (recommended USB type A) to host computer for later use ![MRB-D0005-4-V2-C6-M22-callouts-rear](/images/starling-v2/MRB-D0005-4-V2-C6-M22-callouts-rear.jpg) ### 3. Power ON - Connect the battery or wall power supply to the XT30 connector (labeled `Power` above) - *NOTE: do not arm the vehicle while using wall power* The development drone will bootup and play a jingle via the ESC. ## How to Power Off Pulling the power is okay in normal operation. If you are logged into VOXL and have been modifying files on the file system then it's recommended to run `sync` to make sure your changes are flushed to flash memory before pulling power. Do not pull power while flashing software as this can brick the device. [Next Step: Set up ADB](/setting-up-adb/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-hardware-quickstart/ # VOXL Hardware Quickstart This section contains a hardware quickstart and is intended for developer type users. It provides the minimum steps needed to get a device powered up and ready to connect to a console. > *Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware.* For technical details, see the [datasheet](/voxl-datasheets/). ## How to Setup Hardware ### How to Power On and Prepare to Connect
> Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware. - Connect Micro B side of USB cable to VOXL - Connect other side of USB cable (recommmended USB type A) to host computer for later use ![VOXL HW Setup](/images/voxl/voxl-dk-hw-setup.png) - Connect the power cable to J1 as shown - Connect the other side of the power cable to the VOXL Power Module as shown - Connect one side of the USB cable to the host computer and connect the other side to J8 as shown. - **Note:** the Micro USB connector will consume only a portion of the USB 3.0 port. A USB 3.0 cable can be used as well. - Now plug in the power supply (**5V/6A DC output**) to the wall, and plug it in to the VOXL Power Module barrel jack as shown ## How to Power Off Pulling the power is okay in normal operation. If you are logged into VOXL and have been modifying files on the file system then it's recommended to run `sync` to make sure your changes are flushed to flash memory before pulling power. Do not pull power while flashing software as this can brick the device. [Next Step: Set up ADB](/setting-up-adb/){: .btn .btn-green } --- Source: https://docs.modalai.com/setting-up-adb/ # Setting Up ADB ## Table of Contents 1. TOC --- ## Overview The next step after powering on your VOXL is to set up a communication channel between your host computer and your device for things like file transfers and running programs. The following section will be focused on setting up the Android Debug Bridge (ADB) which is a command-line tool which allows you to accomplish this task. All remaining instructions assume the user is running Ubuntu 22.04 or newer. > From this section onwards work will be done in both the user's terminal and in the `adb` shell. When possible, code blocks will start with either `me@mylaptop:~$` or `voxl2:/$` respectively to denote this difference. ## Host Computer Setup The following section will help you configure ADB on your host machine. > Using USB C to USB type A cables has worked well, we've seen some computers where USB C to USB C cables are not working well. If you have having issues with connections, please try a USB C to USB type A cable. ### ADB Installation To start, install the Android Debug Bridge (ADB) and fastboot:
```bash me@mylaptop:~$ sudo apt update me@mylaptop:~$ sudo apt install -y android-tools-adb android-tools-fastboot ```
```bash me@mylaptop:~$ sudo apt update me@mylaptop:~$ sudo apt install -y adb fastboot ```
> By default, ADB may require `sudo` to connect to USB devices. To run ADB commands as a normal user without `sudo`, see [Running ADB Without `sudo` (udev Rules)](#running-adb-without-sudo-udev-rules) in the Appendix. ### Basic Interfacing To check for attached devices, you can use the `adb devices` command: ```bash me@mylaptop:~$ adb devices List of devices attached 73a05d48 device ``` To access the ADB Shell, you can use the `adb shell` command: ```bash me@mylaptop:~$ adb shell ``` To test your setup to this point, you can run a command like `voxl-version` as such: ``` voxl2:/$ voxl-version ──────────────────────────────────────────────────────────────────────────────── system-image: 1.8.2-M0054-14.1a-perf kernel: #1 SMP PREEMPT Mon Apr 13 22:19:33 UTC 2026 4.19.125 ──────────────────────────────────────────────────────────────────────────────── hw platform: M0054 mach.var: 1.2.0 SKU: MRB-D0014-4-V1-C27-T7 ──────────────────────────────────────────────────────────────────────────────── voxl-suite: 1.7.0 ──────────────────────────────────────────────────────────────────────────────── Packages: Repo: http://voxl-packages.modalai.com/ ./dists/qrb5165/sdk-1.7/binary-arm64/ Last Updated: 2026-06-02 12:58:29 ``` To exit the shell you can use the `exit` command: ```bash me@mylaptop:~$ adb shell voxl2:/$ echo "I am inside VOXL 2!" I am inside VOXL 2! voxl2:/$ exit exit me@mylaptop:~$ ``` > If you are using VOXL and not VOXL 2, the `adb shell` command will start an `sh` shell. Generally you want to use a `bash` shell instead, so we recommend starting bash right away. Running `adb shell` followed by starting `bash` will look like this: ```bash me@mylaptop:~$ adb shell voxl:/$ / # bash voxl:/$ ``` To confirm, you can also look at the `SHELL` variable: ```bash voxl2:/$ echo $SHELL /bin/bash ``` ### Aliases > For frequent VOXL usage it may be convenient to set up aliases in the `~/.bashrc` file on your host machine. We recommend adding the following aliases: ```bash alias voxl="adb wait-for-device && adb shell" export VOXL_IP= alias sshh='sshpass -p oelinux123 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@${VOXL_IP}' ``` The former alias allows the user to wait for a device to be ready for connection and then immediately connect when possible. The latter alias allows for a shortening of the `ssh` command to your device. You will learn how to get the IP address for your device in the next section. To use the `sshh` alias, made sure you have sshpass installed on your host machine: `sudo apt install sshpass` ## Appendix Listed here for convenience are some other common ADB commands and tips we recommend to the user. ### Run Something Once This can be done with `adb shell `. If you don't want to start an interactive shell, but just want to run one command on VOXL 2, you can pass the command directly to `adb shell`. ```bash me@mylaptop:~$ adb shell echo "I am inside VOXL 2" I am inside VOXL 2 me@mylaptop:~$ ``` ### Wait for Device A useful command for creating scripts for host-to-target communications is this one that sits and waits until a device is connected: ```bash me@mylaptop:~$ adb wait-for-device ``` ### Copying Files You can copy files to/from VOXL 2 (similar to `scp`) using the `adb push` and `adb pull` commands. For example, to copy `/temp/test.dat` to the VOXL 2 at `/`: ```bash me@mylaptop:~$ adb push /tmp/test.dat / /tmp/test.dat: 1 file pushed. ``` To copy it back from the VOXL 2 at `/test.dat` to `/temp` ```bash me@mylaptop:~$ adb pull /test.dat /tmp /test.dat: 1 file pulled ``` ### Reboot VOXL 2 You can reboot VOXL with a single adb command `adb reboot`. This is often followed by `adb wait-for-device` which returns when VOXL has finished rebooting. ```bash me@mylaptop:~$ adb reboot ``` ### Running ADB Without `sudo` (udev Rules) To run ADB as a normal user without `sudo` — or if you see a permission error when connecting to your device — configure the following `udev` rules: Add VOXL devices to the rules file (this creates `/etc/udev/rules.d/51-android.rules`, overwriting any previous contents): ```bash echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="901d", MODE="0660", GROUP="plugdev", SYMLINK+="voxl%n"' | sudo tee /etc/udev/rules.d/51-android.rules ``` ```bash echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="d00d", MODE="0660", GROUP="plugdev", SYMLINK+="voxl-fastboot%n"' | sudo tee -a /etc/udev/rules.d/51-android.rules ``` The rules grant access to the `plugdev` group, so make sure your user is a member of it, then log out and back in for the group change to take effect: ```bash sudo usermod -aG plugdev $USER ``` Lastly, reload the udev rules: ```bash sudo udevadm control --reload-rules && sudo udevadm trigger ``` --- Source: https://docs.modalai.com/wifi-setup/ # WiFi Setup While ADB is a great way to communicate with your device, having a wired USB connection may not always be ideal. All VOXL-based devices support WiFi as a way to wirelessly connect between a host machine and your device. The following pages will outline the process to implement a wireless connection. ## QRB5165 Platforms * If your device is based on the newer `qrb5165` processor ([VOXL 2](/voxl-2/), [VOXL 2 Mini](/voxl2-mini/), [Sentinel](/sentinel/), [Starling 2](/starling-2/), [Starling 2 Max](/starling-2-max/)), click here: [VOXL 2 WiFi Setup](/voxl-2-wifi-setup/){: .btn .btn-green } ## APQ8096 Platforms * If your device is based on the older `apq8096` processor ([VOXL](/voxl/), [VOXL Flight](/voxl-flight/), [M500](/m500/), Seeker), click here: [VOXL WiFi Setup](/voxl-wifi-setup/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-2-wifi-setup/ # VOXL 2 WiFi Setup ## Overview This page serves as a WiFi setup guide for all devices based the VOXL 2 and VOXL 2 mini autopilots including the [Starling 2](/starling-2/), [Starling 2 Max](/starling-2-max/), and [Sentinel](/sentinel/) development drones. These models keep the core size and weight low by minimizing component counts and taking techniques like moving modems and USB Ports to add-on cards. Below are options for getting them on a network. ### WiFi Adapters For desktop development, this is an ideal low-latency option. Since VOXL 2 does not have USB onboard, we'll need to find a way to add USB ports. There are some options: | Image | Description | Link | |------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------| | ![voxl2-m0090-wifi](/images/voxl-developer-bootcamp/voxl2-m0090-wifi.jpg) | M0090
VOXL 2 5g Modem Carrier

Shown with MCBL-00009 and AWUS036ACS | [Buy](https://www.modalai.com/products/mdk-m0090)
[Datasheet](/5G-Modem-datasheet/) | | ![voxl2-m0125-wifi](/images/voxl-developer-bootcamp/voxl2-m0125-wifi.jpg) | M0151
VOXL 2 USB3.0 / UART Expansion Adapter

Shown with MCBL-00022 and AWUS036ACS | [Buy](https://www.modalai.com/products/m0151)
[Datasheet](/m0151/) | | ![voxl2-m0141-wifi](/images/voxl-developer-bootcamp/voxl2-m0141-wifi.jpg) | M0141
VOXL 2 USB-A Breakout Board + UART/I2C/SPI

Shown here with AWUS036EACS | [Datasheet](/usb2-type-a-breakout-add-on/) | | ![voxl2-mini-wifi](/images/voxl-developer-bootcamp/voxl2-mini-wifi.jpg) | MCBL-00022

Shown here with AWUS036EACS | EOL
[Datasheet](/cable-datasheets/#mcbl-00022) | The purpose of the USB port is to plug in a USB WiFi adapter. For a well-tested, plug and play solution: [VOXL 2 WiFi Add-On Kit](https://www.modalai.com/products/m0141) Other Supported and Tested USB WiFi Dongles: | Dongle | Chipset | NDAA '20 Section 848 Compliant | Radio & FCC Report | Link | | |---------------------------------|--------------------|--------------------------------|--------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Alfa AWUS036EACS 802.11ac AC600 | Realtek RTL8812CU | Yes (COO Taiwan) | Frequency Range: 5150.0-5825.0, 2412.0-2472.0 | [Link](https://fccid.io/2AB878811) | [Product](https://www.alfa.com.tw/products/awus036eacs_1) | | Alfa AWUS036ACS 802.11ac AC600 | Realtek RTL8812AU | Yes (COO Taiwan) | Frequency Range: 5180.0-5240.0, 5745.0-5825.0, 2412.0-2462.0 | [Link](https://fccid.io/2AB878811) | [Product](https://www.alfa.com.tw/products/awus036acs_1) [Amazon](https://www.amazon.com/Network-AWUS036ACS-Wide-Coverage-Dual-Band-High-Sensitivity/dp/B0752CTSGD) | | Alfa AWUS036EAC 802.11ac AC1200 | Realtek RTL8812AU | Yes (COO Taiwan) | | [Product](https://www.alfa.com.tw/products/awus036eac_1) [Amazon](https://www.amazon.com/Alfa-Long-Range-AWUS036EAC-Wireless-Adapter/dp/B00WC4C3X4) | | | TP-link TL-WN725N N150 | Realtek RTL8818EUS | No (COO China) | | [Product](https://www.tp-link.com/us/home-networking/adapter/tl-wn725n/) [Link](https://www.amazon.com/wifi-adapter-usb-pc-network/dp/B008IFXQFU/) | | If you prefer to use ethernet instead of a wireless setup, any USB to ethernet adapter, like Apple's A1277, should work. ## Configuration and Connection All devices support two WiFi modes, Station and SoftAP. Station Mode refers to the device being configured into a typical 'WiFi client' on a wireless network like your phone or laptop. Software enabled Access Point Mode (SoftAP) configures the device to generate its own hotspot so that other WiFi devices can connect to it. This is useful if you are in the field away from your home or office WiFi network. On VOXL 2, switching between the two modes can be done at any time using the `voxl-wifi` wizard. ### Configure and Connect in Station Mode To configure the VOXL 2 device into Station Mode, run the following command from the host machine: ``` me@mylaptop:~$ adb shell voxl-wifi WiFi is currently set up as follows: Mode: softap Hardware: single-mode (wlan0) SoftAP on wlan0: VOXL-12345678 Station mode connects to an existing WiFi network. SoftAP mode creates a WiFi hotspot that other devices can connect to. Hardware: Single-mode STA or AP (exclusive modes) Please select WiFi operation: Options: 1) Configure Station 2) Configure SoftAP (2.4GHz) 3) Configure SoftAP (5GHz) 4) Disable WiFi (disables all active modes) 5) Factory Reset 6) Exit ``` The status header at the top matches the output of `voxl-wifi getmode`: the current mode (`station`, `softap`, `sta+ap`, or `disabled`), the WiFi hardware type, and the SSID active on each interface. > The exact menu adapts to your hardware: boards with concurrent STA+AP radios also get individual `Disable Station` / `Disable SoftAP` entries, and QCS6490-based boards add a USB interface option. Go by the option text rather than the number. Type `1` and press Enter to select `Configure Station`. From here, you will then be prompted for the SSID and Password of your network. To finish the setup, reboot the device: ```bash me@mylaptop:~$ adb reboot && adb wait-for-device ``` Once the device has rebooted, you can use the command `voxl-my-ip` to get the IP address of your device on the network like: ``` me@mylaptop:~$ adb shell voxl-my-ip 192.168.1.217 (wlan0) ``` The tool prints an `IP (interface)` pair for every network interface that currently has an address, so you may see more than one entry. In this case the IP address is `192.168.1.217`. Now you can connect via `ssh` as: ```bash me@mylaptop:~$ ssh root@192.168.1.217 ``` Where here the IP address following `root@` should correspond to the above output from the above command. The password to connect will be `oelinux123`. > The device gets its address via DHCP by default. If you need a static IP, the `voxl-static-ip` and `voxl-static-ip-watcher` utilities included in `voxl-utils` can assign one, or you can reserve an address for the device in your router's software. ### Configure and Connect in SoftAP Mode By default, the unit ships configured as a 5GHz SoftAP with an SSID of `VOXL-` (falling back to the MAC address on units where the serial number cannot be read) and password `1234567890`. To configure the VOXL into Access Point Mode with your desired SSID, use the `voxl-wifi` wizard: ```bash me@mylaptop:~$ adb shell voxl-wifi ``` In the wizard menu shown earlier, type `2` (2.4GHz) or `3` (5GHz) and press Enter to set up a SoftAP with a custom SSID and password. Alternatively, type `5` to select `Factory Reset`, which restores the default 5GHz SoftAP configuration described above. Now on your host machine you should connect to the SSID above using either the default password `1234567890` or the custom password you set. The VOXL will assign itself the IP `192.168.8.1` and so then from your host machine you can use `ssh` to connect as: ```bash me@mylaptop:~$ ssh root@192.168.8.1 ``` Your device will be assigned an IP with DHCP in the 192.168.8.X subnet, usually 192.168.8.60, but not always. ### Scripted Usage Everything the wizard does is also available non-interactively for scripted use: ```bash voxl-wifi getmode # print the current Wi-Fi mode voxl-wifi station [password] # connect to an existing network voxl-wifi softap [password] # 2.4GHz access point mode (ch6), default password '1234567890' voxl-wifi softap5 [password] # 5GHz access point mode (ch149), default password '1234567890' voxl-wifi disable-station # disable station mode (if currently active) voxl-wifi disable-softap # disable softap mode (if currently active) voxl-wifi disable-all # disable all active WiFi modes voxl-wifi factory # factory defaults: 5GHz SoftAP, SSID 'VOXL-', password '1234567890' ``` ## Troubleshooting ### Dongle Drops Off the USB Bus If `wlan0` disappears mid-session, or never appears after boot, check `dmesg` on VOXL 2 for USB enumeration errors: ``` usb 1-1.4: device descriptor read/64, error -71 usb 1-1.4: device not accepting address 6, error -71 usb 1-1-port4: Cannot enable. Maybe the USB cable is bad? ``` These errors occur before the WiFi driver loads, so they point to a fault in the physical USB path (dongle, cable, expansion board, or 5V supply) rather than a software or driver problem. Reinstalling or upgrading the SDK is unlikely to change this behavior. A dongle that enumerates cleanly on a PC can still be the failing part: the PC test does not exercise the same connector, cable, heat, or vibration, and dongles have failed in service after weeks of use on a vehicle. To isolate the failing part: 1. Try a known-good dongle from the supported list above in the same port. If the errors stop, replace the dongle. 2. If a second dongle fails the same way, try a different USB cable or, where the design allows, a different expansion board. If the failure stays with the port, the expansion board or the VOXL 2 USB host port is suspect. [Open an RMA](https://www.modalai.com/pages/rma) with the `dmesg` output and `voxl-version`. ## Appendix ### Configure Hostname for Soft AP Mode (Optional) It may be desired to have a dedicated hostname for your target instead of using an IP. This [thread](https://gitlab.com/voxl-public/support/documentation/issues/3) describes how to enable.
[Next: Inspect and Configure SKU ](/sku/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-wifi-setup/ # VOXL WiFi Setup ## Overview This page serves as a WiFi setup guide for all devices based on the original VOXL architecture including the VOXL and the VOXL Flight. Since the VOXL Flight is just a VOXL with an attached Flight Core, all instructions in this section are the same for both devices. ## Hardware Setup - Disconnect power from the device - Attach Wi-Fi antennas as shown below (note it takes a little force to connect the MHF4 U.FL connectors) - Power up the device ![VOXL Wi-Fi](/images/voxl/wifi-antennas.png) You can also see a demonstration of this attachment in the VOXL Flight Quickstart video at minute 1:36: ## Configuration and Connection All devices support two WiFi modes, Station and SoftAP. Station Mode refers to the device being configured into a typical 'WiFi client' on a wireless network like your phone or laptop. Software enabled Access Point Mode (SoftAP) configures the device to generate its own hotspot so that other WiFi devices can connect to it. This is useful if you are in the field away from your home or office WiFi network. Switching between the two modes can be done at any time using the `voxl-wifi` command inside an ADB shell. ### Configure and Connect in Station Mode To configure the VOXL device into Station Mode, run the following command from the host machine: ```bash me@mylaptop:~$ adb shell voxl-wifi station ``` To finish the setup, reboot the device: ```bash me@mylaptop:~$ adb reboot && adb wait-for-device ``` Once the device has rebooted, you can use the command `ifconfig` to get the IP address of your device on the network like: ```bash me@mylaptop:~$ adb shell ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2224 (2.1 KiB) TX bytes:2224 (2.1 KiB) wlan0 Link encap:Ethernet HWaddr 48:5F:99:9D:40:F7 inet addr:192.168.1.92 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::4a5f:99ff:fe9d:40f7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:690 errors:0 dropped:1 overruns:0 frame:0 TX packets:14 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:225347 (220.0 KiB) TX bytes:1358 (1.3 KiB) ``` The IP address can be found from the `inet addr` which in this case is `192.168.1.92`. Now you can connect via `ssh` as: ```bash me@mylaptop:~$ ssh root@192.168.1.92 ``` Where here the IP address following `root@` should correspond to the above output from `ifconfig`. The password to connect will be `oelinux123`. > The device gets its address via DHCP by default. If you need a static IP, newer `voxl-utils` releases include `voxl-static-ip` and `voxl-static-ip-watcher` to assign one; otherwise reserve an address for the device in your router's software. ### Configure and Connect in SoftAP Mode By default, the unit ships configured in SoftAP mode with an SSID of `VOXL-XX:XX:XX:XX:XX:XX` with password `1234567890` (where XX:XX:XX:XX:XX:XX is the unit's MAC address. To configure the VOXL into Access Point Mode with your desired SSID, use the `voxl-wifi` utility: ```bash me@mylaptop:~$ adb shell voxl-wifi softap ``` To finish the setup, reboot the device: ```bash me@mylaptop:~$ adb reboot && adb wait-for-device ``` Now on your host machine you can connect to the SSID specified above using the password `1234567890`. The VOXL will assign itself the IP `192.168.8.1` and so from your host machine you can use `ssh` to connect as: ```bash me@mylaptop:~$ ssh root@192.168.8.1 ``` Your device will be assigned an IP with DHCP in the 192.168.8.X subnet, usually 192.168.8.60, but not always.
[Next: Inspect and Configure SKU ](/sku/){: .btn .btn-green } --- Source: https://docs.modalai.com/sku/ # Inspect and Configure SKU Your VOXL or VOXL development kit ships with a SKU number written to a persistent data partition at `/data/modalai/sku.txt`. The SKU describes exactly what product the compute board is installed in — which vehicle, which compute board, which cameras, radios, and add-ons — and it is the single input that drives all automatic configuration: [voxl-configure-mpa](/voxl-configure-mpa/) reads it to decide which services to enable and how each should be configured. Because `/data` is a persistent partition, the SKU survives system image flashes: a reflashed VOXL still remembers what vehicle it is in. Generally speaking, you should not need to change the SKU unless you are transferring a VOXL to a different product or changing which cameras it is connected to. However, it is useful to know what it is and what it means. ## Table of Contents 1. TOC --- ## Decode a SKU Paste any ModalAI SKU to break it into its parts (decoded with the same tables `voxl-configurator` uses on the vehicle): ## Inspect SKU To inspect the SKU of your device, first access the device with `adb shell`. Then use the `voxl-inspect-sku` command to get a printout like this: ```bash voxl2:/$ voxl-inspect-sku family code: MRB-D0014 (starling-2) compute board: 4 (voxl2) hw version: 1 cam config: 27 modem config: 0 (none) tx config: 7 (elrs_beta_fpv) extras config: 0 (none) SKU: MRB-D0014-4-V1-C27-T7 ``` A few useful options: ```bash voxl-inspect-sku --json # same information as machine-readable JSON voxl-inspect-sku --quiet # validate only; exit code says if the SKU parses voxl-inspect-sku --sku MRB-D0006-4-V2-C6 # parse any SKU string without touching the device's own ``` The `--sku` form is handy for previewing what a SKU you are about to set actually means, and `--json` is the right interface for scripts and programs that need SKU fields. ## Anatomy of the SKU Number ModalAI SKU numbers follow this structure: ``` MRB-D0014 - 4 - V1 - C27 - T7 - M0 - X0 │ │ │ │ │ │ └── extras config │ │ │ │ │ └── modem config │ │ │ │ └── RC transmitter config │ │ │ └── camera config │ │ └── hardware version │ └── board code └── family code ``` The first two fields — family code and board code — are fixed and always present. Every field after them is a letter-prefixed tag, so their order does not matter and missing fields simply take their defaults: | Field | Prefix | Example | Meaning | Default if absent | |-------|--------|---------|---------|-------------------| | Family code | — | `MRB-D0014` | The product the board is installed in (see table below) | required | | Board code | — | `4` | Which VOXL compute board (see table below) | required | | Hardware version | `V` | `V1` | Hardware revision of the product | required | | Camera config | `C` | `C27` | Numbered camera configuration; run `print-camera-configs` on target for the list, or see [Configure Cameras](/configure-cameras/). `CC` selects a user-defined custom config from `/data/modalai/custom_camera_config.txt` | required | | RC transmitter | `T` | `T7` | RC receiver hardware (see table below) | `0` (none) | | Modem config | `M` | `M7` | Modem / datalink hardware (see table below) | `0` (none) | | Extras config | `X` | `X8` | Additional payload hardware (see table below) | `0` (none) | An `E`-prefixed experimental field also exists for internal development tweaks; production SKUs do not carry it. Two families are special cases with simpler SKUs: board-only families (`MCCA-…`) imply their board code and hardware version, and VRX receiver families (`MVX-R…`) only carry a hardware version and modem config since they have no cameras or RC input. ## Field Reference Tables These tables reflect voxl-configurator 1.1.39. The tables printed on-target are always authoritative — `voxl-print-family-table`, `voxl-print-board-table`, `print-camera-configs`, `print-modem-options`, and `print-extras-options` are available in any shell on VOXL. ### Family codes | Code | Product | |------|---------| | MRB-D0001 | M500 | | MCM-C0001 | VOXLCAM | | MRB-D0003 | Seeker (legacy) | | MRB-D0004 | RB5 Flight | | MRB-D0005 | Starling 1 (discontinued) | | MRB-D0006 | Sentinel | | MRB-D0008 | Seeker Vision 5" | | MRB-D0010 | Starling (custom) | | MRB-D0011 | PX4 Autonomy Dev Kit | | MRB-D0012 | Starling 2 Max | | MRB-D0013 | Stinger | | MRB-D0014 | Starling 2 | | MRB-D0015 | Fixed Wing | | MRB-D0016 | Sparrow | | MRB-D0017 | Shikra | | MRB-D0019 | Seeker Vision 7" | | MRB-D0020 | Seeker Vision 10" | | MDK-F0001 | Flight Deck | | MDK-F0002 | VOXL Deck | | MDK-F0006 | VOXL 2 Flight Deck | | MCCA-M0054 | VOXL 2 board only | | MCCA-M0104 | VOXL 2 Mini board only | | MVX-T0001 | VOXL 2 Mini VTX | | MVX-R0001 | VOXL 2 Mini VRX | | MVX-T0002 | VTX Gen2 | | MVX-R0002 | VRX Gen2 | | MVX-H0001 | VRX Hub | | MVX-S0001 | VRX Spire | | TF-M0054 / TF-M0104 / TF-M0197 | factory test fixtures | ### Board codes | Code | Compute board | |------|---------------| | 1 | VOXL (original) | | 2 | VOXL Flight | | 3 | RB5 | | 4 | VOXL 2 | | 5 | Flight Core V2 | | 6 | VOXL 2 Mini | | 7 | VOXL 2 Mini VRX | | 8 | Betaflight FC | | 9 | M0197 | ### RC transmitter configs | Code | Receiver | |------|----------| | 0 | none | | 1 | Spektrum | | 6 | TBS Crossfire | | 7 | ELRS (Beta FPV) | | 8 | ELRS (M0184) | | 9 | Ghost | | 10 | ELRS (M0193) | ### Modem configs Run `print-modem-options` on target for the authoritative list. Commonly used codes: | Code | Modem / datalink | |------|------------------| | 0 | none | | 3 | Microhard v2, no radio (M0048-3) | | 4 | LTE v2, 7610 NA (M0030) | | 7 | VOXL 2 5G Quectel (M0067/M0090-3-01) | | 9 | VOXL 2 5G Telit (M0090-1-03) | | 10 | Microhard v2, pMDDL2350 (M0048) | | 11 | Microhard v2, pMDDL2450 (M0048) | | 18 | Doodle RM-2450, 2.4 GHz | | 19 | Doodle RM-2025, hex band | | 20 | M0130 RC7611 (Americas) | | 21 | M0130 RC7620 (EMEA) | | 23 | Doodle Mini-OEM RM-1700-22M3 | | 25 | VTX (M0176 + M0175) | | 26 | VTX (M0185) | | 27 | Microhard, pMDDL1621 (M0059-1) | | 30 | VRX (M0206, Mini Pini) | | 31 | VRX (M0206, SparkLAN) | | 33 | Silvus | | 34 | Ethernet | | 35 | DTC | Four-digit codes combine an LTE modem with a VTX or VRX (for example `2026` = M0130 RC7611 + M0185 VTX). ### Extras configs | Code | Extra hardware | |------|----------------| | 0 | none | | 1 | CADDX Air Unit | | 2 | USB Boson | | 3 | CADDX Vista + USB Boson | | 4 | HD-Zero | | 5 | CADDX Vista | | 8 | Lepton | | 12 | HD-Zero + Lepton | | 14 | Walksnail + Lepton | | 15 | Walksnail GT | | 16 | Walksnail GT + Lepton | | S | Strike | | SL | Strike XL | ## Configure SKU The `voxl-configure-sku` tool is the only supported way to change the SKU. It validates every field, constructs a correctly formatted SKU string, and writes it to `/data/modalai/sku.txt`. > Running `voxl-configure-sku` does nothing except update the `sku.txt` file on disk. To actually reconfigure the services on VOXL to match, run [voxl-configure-mpa](/voxl-configure-mpa/) afterwards — it will read the new SKU and rebuild every service's configuration from it. ### Interactive: the wizard For humans, use the wizard. It walks through each field with menus, suggesting the current SKU (if valid) and per-family defaults along the way: ```bash voxl2:/$ voxl-configure-sku --wizard ``` The wizard asks, in order: product family, hardware version, camera config (ENTER accepts the family default; `C` selects a custom config), then — only for families where they apply — RC receiver, modem, and extra hardware. Before writing anything it previews the constructed SKU through `voxl-inspect-sku` so you can confirm every field parsed the way you intended. ### Scripted: command-line arguments For production lines and CI scripts, every field can be supplied as an argument. Only the family is required — the board code is derived from the family automatically, and other fields fall back to that family's defaults: ```bash voxl-configure-sku --family starling-2 -v 1 # Starling 2, defaults for the rest voxl-configure-sku -f sentinel -v 2 -m 10 # Sentinel V2 with Microhard pMDDL2350 voxl-configure-sku -f MRB-D0008 -c 6 -t 8 # family by code, explicit cam + ELRS voxl-configure-sku -f starling-2 -v 1 --dry-run # validate and print, write nothing ``` | Flag | Meaning | |------|---------| | `-f`, `--family` | product family, by name or code (required) | | `-b`, `--board` | board code or name (normally derived from the family) | | `-v`, `--version` | hardware version | | `-c`, `--cam` | camera config number | | `-t`, `--tx` | RC transmitter code | | `-m`, `--modem` | modem code | | `-d`, `--dry-run` | do everything except write to disk | | `-q`, `--quiet` | write to disk only, no printout | | `-w`, `--wizard` | run the interactive wizard | ## Using the SKU in Your Own Scripts All of the parsing and table logic used by these tools lives in one shell library, `/home/root/.profile.d/modalai_sku_definitions.sh`, which is sourced into every shell on VOXL. Your own scripts can use it directly: ```bash source /home/root/.profile.d/modalai_sku_definitions.sh voxl-parse-and-export-sku-variables $(cat /data/modalai/sku.txt) echo "$VOXL_FAMILY_NAME on $VOXL_BOARD_NAME, camera config $VOXL_CAM_NUM" ``` After parsing, the fields are exported as environment variables: `VOXL_FAMILY_CODE`/`VOXL_FAMILY_NAME`, `VOXL_BOARD_CODE`/`VOXL_BOARD_NAME`, `VOXL_HW_VERSION`, `VOXL_CAM_NUM`, `VOXL_MODEM_NUM`/`VOXL_MODEM_NAME`, `VOXL_TRANSMITTER_NUM`/`VOXL_TRANSMITTER_NAME`, and `VOXL_EXTRAS_CODE`/`VOXL_EXTRAS_NAME`. This is exactly how [voxl-configure-mpa](/voxl-configure-mpa/) consumes the SKU internally. For non-shell programs, parse the output of `voxl-inspect-sku --json` instead. ## Source Code The source code for all of the above — the tools and the definitions library — is in the [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) repository. --- Source: https://docs.modalai.com/mpa/ # Modal Pipe Architecture This is an introduction to VOXL's software architecture! ## Overview ModalAI has built an ecosystem of [systemd](https://digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units) services for VOXL that run in the background. Paired with a suite of inspect-tools and utilities, a user can easily use these services to achieve high level functionalities like autonomous flight. These services, tools, and utilities require inter-process communication to function. For example, [voxl-open-vins-server](/voxl-open-vins-server/) consumes camera data from [voxl-camera-server](/voxl-camera-server/) and IMU data from [voxl-imu-server](/voxl-imu-server/) to provide [Visual Inertial Odometry (VIO)](/flying-with-vio/). We use POSIX pipes as the underlying transport mechanism for this inter-process communication due to their robustness, efficiency, and portability. This combination of services, tools, and pipes that connect between them is what we call the Modal Pipe Architecture (MPA). [![MPA-1.0-diagram_revC_Full.png](/images/voxl-sdk/MPA-1.0-diagram_revC_Full.png)](/images/voxl-sdk/MPA-1.0-diagram_revC_Full.png) To provide standardization and ease of use, all [MPA services](/mpa-services/) use the C/C++ library [libmodal_pipe](/libmodal-pipe/) to create, publish, and subscribe to MPA data. A single process can also be both a server and a client to multiple pipes. You can see every data-type that is being passed through pipes here: [the pipe_interfaces headers](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/library/include/pipe_interfaces). > You can find a comprehensive list of all services on the Gitlab: https://gitlab.com/voxl-public/voxl-sdk/services?page=1 ## Using Services Services can be manually started and stopped with the following `systemd` commands: ``` voxl2:/$ systemctl start SERVICENAME ``` ``` voxl2:/$ systemctl stop SERVICENAME ``` These services can also be configured to activate (or deactivate) on boot, using the following commands: ``` voxl2:/$ systemctl enable SERVICENAME ``` ``` voxl2:/$ systemctl disable SERVICENAME ```
`voxl-inspect-services` is a simple tool to show which services are enabled (start on boot), running, and what their cpu usage is (if running). The CPU usage should be taken with a grain of salt, as it a momentary snapshot of CPU usage. We recommend using the command `top` for more accurate process-specific cpu utilization. To go deeper — reading service logs, restarting services, and debugging failures — see [Debugging Services](/debugging-services/). ### Typical Use ``` voxl2:/$ voxl-inspect-services Scanning services... Service Name | Enabled | Running | CPU Usage ────────────────────────────────────────────────────────────────── voxl-camera-server | Enabled | Running | 1.8% voxl-cpu-monitor | Enabled | Running | 0.0% voxl-imu-server | Enabled | Running | 14.5% voxl-logger | Disabled | Not Running | voxl-mavcam-manager | Enabled | Running | 0.0% voxl-mavlink-server | Enabled | Running | 1.8% voxl-open-vins-server | Enabled | Running | 8.2% voxl-portal | Enabled | Running | 1.8% voxl-px4 | Enabled | Running | 14.5% voxl-static-ip | Disabled | Not Running | voxl-streamer | Enabled | Running | 2.1% voxl-tag-detector | Disabled | Not Running | voxl-vision-hub | Enabled | Running | 3.4% ``` ### Optionally Show Version Numbers The version column is disabled by default since the version number lookup is slow compared with the default three columns. However, it can be enabled with the `-v` or `--version` flag ![voxl-inspect-services -v output](/images/voxl-developer-bootcamp/voxl-inspect-services-version.png) Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/scripts/voxl-inspect-services). MAVROS and MAVSDK are out of the scope of this Bootcamp, but you can read more about them in the SDK section of the docs. ## Tools and Utilities To learn about some basic MPA tools and utilities, see the next page. --- Source: https://docs.modalai.com/basic-functionalities/ # Basic Tools and Utilities --- This page demonstrates some basic utilities and tools that you will likely use to interact with VOXL's services. > For an extensive list of all tools, utilities, and commands available in the VOXL SDK, type `voxl-{TAB}{TAB}` to see all auto-complete options. --- Most of the tools below are part of the [**voxl-mpa-tools**](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) package: ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/badges/release.svg?key_text=Latest Release&key_width=100) ## [voxl-list-pipes](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/scripts/voxl-list-pipes) ```voxl-list-pipes``` is a simple tool to list all of the MPA (Modal Pipe Architecture) pipes currently available in the system. By default the pipes are sorted by type, allowing you to easily see which cameras/imus/etc are available in the system. Pass ```-t ``` to show only the pipes of one specific type. ### Example Output: ``` voxl2:/$ voxl-list-pipes camera_image_metadata_t hires qvio_overlay tof_conf tof_depth tof_ir tof_noise tracking cpu_stats_t cpu_monitor imu_data_t imu_apps mavlink_message_t mavlink_gps_raw_int mavlink_onboard mavlink_sys_status point_cloud_metadata_t tof_pc pose_vel_6dof_t vvhub_body_wrt_fixed vvhub_body_wrt_local qvio_data_t qvio_extended tof_data_t tof vio_data_t qvio voxl2:/$ ``` --- ## [voxl-inspect-imu](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-imu.c) `voxl-inspect-imu` is a tool to check the imu measurements of the imus on voxl. It requires that [voxl-imu-server](/voxl-imu-server/) is running in the background, which can be checked with [voxl-inspect-services](/voxl-inspect-services/). ### Arguments #### Required IMU: Which IMU to display data from. Available IMUs can be seen by typing `voxl-inspect-imu {TAB}{TAB}`. > For VOXL 2, the available IMU is `imu_apps`. For VOXL and VOXL Flight, you should see `imu0` and `imu1`. #### Optional | Parameter | Description | Example | |--- |--- |--- | |-a --all | Show all imu data, not scaled down for screen performance (this will print lines at ~1khz)| ```voxl-inspect-imu imu_apps -a``` | |-h --help | Print help message | ```voxl-inspect-imu --help``` | |-n --newline | Print each sample on a new line instead of updating the current output line | ```voxl-inspect-imu imu_apps -n``` | |-t --time | Wait time in seconds between printing samples (not to be confused with `-T`) | ```voxl-inspect-imu imu_apps -t 0.5``` | |-T --test | Test mode, grab a single sample then exit | ```voxl-inspect-imu imu_apps -T``` | |-j --json | Output results as JSON (`-k --json_human` for human-readable JSON) | ```voxl-inspect-imu imu_apps -j``` | ### Example Output ``` voxl2:/$ voxl-inspect-imu imu_apps Acc in m/s^2, gyro in rad/s, temp in C gravity| accl_x accl_y accl_z| gyro_x gyro_y gyro_z| Temp | 9.63 | 0.12 -9.57 1.08 | 0.01 0.02 0.00 | 35.03 | ``` --- ## [voxl-inspect-cam](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam.c) > Only applicable if you have cameras connected to your VOXL. The utility `voxl-inspect-cam` is a tool to check image metadata coming from MPA services that are publishing camera data. It requires that a service like [voxl-camera-server](/voxl-camera-server/) is running in the background publishing camera, image, or video data. It can also be used to check non-camera images, such as the overlays coming out of [VOXL TFLite Server](/voxl-tflite-server/) or [voxl-open-vins-server](/voxl-open-vins-server/). ### Arguments #### Required Cam: Which image to display data from. Available images can be seen by typing ```voxl-inspect-cam {TAB} {TAB}```. Options that will regularly be available are: `tracking`, `stereo`, `hires`, `tof_depth`, `tof_conf`, `tof_noise`, `tof_ir`, `dfs_disparity`, `qvio_overlay`, `tflite_overlay`. #### Optional | Parameter | Description | Example | |--- |--- |--- | |-h --help | Print help message | ```voxl-inspect-cam --help``` | |-n --newline | Print each sample on a new line instead of updating the current output line | ```voxl-inspect-cam tracking -n``` | |-t --test | Test mode, simple pass/fail test after two seconds of waiting for a frame | ```voxl-inspect-cam tracking -t``` | |-a --all | Show all available cameras (not usable with test mode) | ```voxl-inspect-cam -a``` | |-j --json | Output results as JSON (`-k --json_human` for human-readable JSON) | ```voxl-inspect-cam tracking -j``` | ### Example Output ``` voxl2:/$ voxl-inspect-cam tracking |size(bytes)| height | width |exposure(ms)| gain | frame id |latency(ms)|Framerate(hz)| format | 307200 | 480 | 640 | 3.8 | 100 | 71976 | 18.6 | 30.0 | RAW8 voxl2:/$ ``` --- ## [voxl-inspect-battery](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-battery.c) This tool subscribes to the `/run/mpa/mavlink_sys_status` pipe published by `voxl-mavlink-server` which provides a copy of all SYS_STATUS mavlink messages received from a PX4 flight controller. Among other things, this packet contains battery status information. Also note that [voxl-portal](/voxl-portal/) subscribes to the same pipe and also shows battery percentage in the top right corner of the webpage. ### Use ```bash voxl2:/$ voxl-inspect-battery Voltage | Charge | Current | Power | 12.22V | 89% | 0.49A | 5.99W | ``` ### Troubleshooting If no data is displayed, then either `voxl-px4` or `voxl-mavlink-server` is not running (run [voxl-inspect-services](/voxl-inspect-services/) to check) or PX4 is not connected or operating. --- ## [voxl-inspect-cpu](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor/-/blob/master/clients/voxl-inspect-cpu.c) `voxl-inspect-cpu` is a tool to check the CPU/GPU utilization and temperature of the various voxl components. It is part of the [VOXL CPU Monitor](/voxl-inspect-cpu/) package and subscribes to the `cpu_monitor` pipe. If you don't get data using this tool, make sure the voxl-cpu-monitor systemd service is running using [voxl-inspect-services](/voxl-inspect-services/). Additionally, to get a breakdown of CPU and memory utilization by process, use the linux command `top` instead. ### Use ``` voxl:/$ voxl-inspect-cpu ``` ``` voxl2:/$ voxl-inspect-cpu Name MHz Temp Util | cpu0 691 62.1 25.6 | cpu1 691 62.9 28.3 | cpu2 691 61.7 19.2 | cpu3 691 62.1 61.4 | cpu4 691 61.7 15.5 | cpu5 691 62.5 16.3 | cpu6 691 63.3 18.2 | cpu7 1056 62.5 26.0 | Total 62.4 26.5 | 10s avg 16.2 | -------------------------| GPU 812 60.5 6.8 | GPU 10s avg 6.8 | ``` The live view also shows uptime, memory use, and the active governor alongside the table; add `-f` for per-process top CPU and memory consumer tables. --- Source: https://docs.modalai.com/check-calibration/ # Check Calibration Run this command to check the calibration status of your VOXL: ``` voxl2:/$ voxl-check-calibration ``` The tool also accepts `-q`/`--quiet` and `-j`/`--json` flags for scripted use. Dev drones should come pre-calibrated, in which case you should expect an output like this (these particular examples are from a Starling drone): ``` voxl2:/$ voxl-check-calibration Calibration File Status: Present /data/modalai/voxl-imu-server.cal Present /data/modalai/opencv_tracking_intrinsics.yml Present /data/px4/param/parameters_gyro.cal Present /data/px4/param/parameters_acc.cal Present /data/px4/param/parameters_mag.cal Present /data/px4/param/parameters_level.cal All Required Calibration Files Present ``` The exact calibration files necessary varies with different hardware and is determined automatically based on the SKU contained in the `/data/modalai/sku.txt` file onboard the VOXL. If you lost your calibration files or are starting from a bare VOXL boards, you should expect an output like this: ``` voxl2:/$ voxl-check-calibration Calibration File Status: Missing /data/modalai/voxl-imu-server.cal Missing /data/px4/param/parameters_gyro.cal Missing /data/px4/param/parameters_acc.cal Missing /data/px4/param/parameters_level.cal Missing /data/px4/param/parameters_mag.cal Detected Missing Calibration Files please run the required cals https://docs.modalai.com/calibration/ ``` Follow the [calibration guide](/calibration/) to calibrate your drone if necessary. --- Source: https://docs.modalai.com/voxl-version/ # Finding VOXL's SDK Version --- `voxl-version` is a handy utility, especially if you ever open a case on the [ModalAI forum](https://forum.modalai.com/category/2/ask-your-questions-right-here) (always tell us your SDK version!). In VOXL's bash shell, run the command: ``` voxl2:/$ voxl-version ──────────────────────────────────────────────────────────────────────────────── system-image: 1.8.2-M0054-14.1a-perf kernel: #1 SMP PREEMPT Mon Apr 13 22:19:33 UTC 2026 4.19.125 ──────────────────────────────────────────────────────────────────────────────── hw platform: M0054 mach.var: 1.2.0 SKU: MRB-D0014-4-V1-C27-T7 ──────────────────────────────────────────────────────────────────────────────── voxl-suite: 1.7.0 ──────────────────────────────────────────────────────────────────────────────── Packages: Repo: http://voxl-packages.modalai.com/ ./dists/qrb5165/sdk-1.7/binary-arm64/ Last Updated: 2026-06-02 12:58:23 List: libmodal-cv 0.3.1 libmodal-exposure 0.0.8 libmodal-journal 0.2.2 libmodal-json 0.4.3 ... ``` Add `-q`/`--quiet` to skip the long package list, or `-j`/`--json` to print everything as JSON for scripted use. The `a.b.c` in "voxl-suite: a.b.c" is the SDK version, what you probably care about most. However, there are a few other version numbers printed. This is because VOXL's firmware consists of two separate parts--"voxl-suite" and the System Image. The `voxl-suite` version number matches the version for the whole SDK release. `voxl-suite` contains core ModalAI tools and services that run on VOXL. The system image contains the basic operating system, drivers, Linux kernel and various system partitions to make VOXL boot. On QCS6490-based platforms the system image is delivered as a package, so the system image version reported here comes from that system-image package. While it's possible to install these independently, we HIGHLY recommend running matched pairs of voxl-suite and system image as installed by a stable SDK installer. On the next page, you'll learn about flashing a new SDK, which flashes both `voxl-suite` and the System Image as a matched pair. --- Source: https://docs.modalai.com/flash-system-image/ # Upgrading VOXL SDK ## Do I Need to Upgrade? All ModalAI drones and boards ship pre-flashed with a recent SDK release and all core services enabled. Upgrading is optional — but if you have had your hardware for a while, there is likely a newer SDK available with fixes and features worth loading. To decide, compare the voxl-suite version you retrieved in the [previous step](/voxl-version/) against the recommended release for your hardware on the [VOXL SDK Release Notes page](/voxl-suite/). Each SDK release is tested as a whole — system image and voxl-suite together — so the supported way to move to a new release, **including patch releases**, is a complete flash with the SDK installer as described below. Upgrading individual packages in place with `apt` is not a supported configuration. ## Prerequisites The installer runs on Ubuntu and requires Android Platform Tools (ADB and fastboot): ```bash sudo apt-get update sudo apt-get install android-tools-adb android-tools-fastboot -y adb version # verify ADB is installed fastboot --version # verify fastboot is installed ``` If Ubuntu is not available, a highly experimental WSL2 option is documented [here](/wsl2-sdk-install/). ## Download the SDK for Your Hardware Each platform has its own SDK installer tarball — the voxl-suite software inside is the same, but the system image differs per platform. Downloads are hosted on the Protected Downloads Page: | Platform | SDK tarball | Download | |----------|-------------|----------| | VOXL 2 (M0054) | `voxl2_SDK_x.y.z.tar.gz` | VOXL 2 Platform Releases | | VOXL 2 Mini (M0104, M0204) | `voxl2-mini_SDK_x.y.z.tar.gz` | VOXL 2 Mini Platform Releases | | VRX (R0001) | `ubun2.0-multi_SDK_x.y.z.tar.gz` | VRX Platform Releases | | VOXL (M0006) / VOXL Flight (M0019) — EOL | `voxl_SDK_x.y.z.tar.gz` | VOXL 1 Platform Releases | VOXL Flight contains the same compute hardware as VOXL, so both flash the same SDK. Not sure which release to pick? See [Which SDK Should I Flash?](/voxl-suite/) ## Flash the SDK > Flashing preserves everything in VOXL's `/data/` directory (sku.txt, calibration files, image snapshots, video recordings), but everything else — all services and config files — is reset to factory defaults. ### 1. Power up VOXL and connect via USB > Some computers have trouble with USB C to USB C cables. If you are having connection issues, try a USB C to USB A cable. ### 2. Extract and run the installer > Do **NOT** open a shell on VOXL. The following commands are all run on the host computer. Extract the download (using VOXL 2 as the example, where `x.y.z` is the SDK version), enter the directory, and run the install script: ```bash tar -xzvf voxl2_SDK_x.y.z.tar.gz cd voxl2_SDK_x.y.z ./install.sh ``` > Once you confirm the system image flash, DO NOT STOP IT! Interrupting the flash will likely corrupt the file system. If that happens, follow the [unbricking guide](/voxl2-unbricking/). Depending on the SDK version, you may be prompted to preserve or wipe the `/data/` partition. When in doubt, **preserve** it — it contains calibration and factory configuration data that should carry over between SDK upgrades. ### 3. Verify the install If everything flashed successfully, the installer prints: ``` ===================================================== | Done installing voxl-suite for QRB5165 | | | | Please visit our online guides at | | https://docs.modalai.com/ | | | | To configure Modal Pipe Architecture (MPA) | | services, please run voxl-configure-mpa | | | | To see what MPA services are enabled and running, | | please run voxl-inspect-services | | | | To see a list of MPA utilities available, adb | | or ssh into VOXL and type voxl{TAB}{TAB} | ===================================================== ``` The installer also walks you through reconfiguring your drone's SKU and MPA services. If you saw these prompts during the flash, SKU and MPA are already configured and nothing further is needed: ![voxl-configure-sku prompt](/images/voxl-developer-bootcamp/voxl-configure-sku.png) ![voxl-configure-mpa prompt](/images/voxl-developer-bootcamp/voxl-configure-mpa.png) To re-run configuration later — for example to load new ESC or ELRS firmware shipped with the release — use [voxl-configure-mpa](/voxl-configure-mpa/). For how config files are handled across upgrades, see the [VOXL SDK Configuration Section](/mpa-configuration-conventions/). --- Source: https://docs.modalai.com/voxl-portal/ # VOXL Portal The voxl-portal package provides an embedded webserver on VOXL. It enables camera inspection and other debug tools all via web browser interface at your VOXL's IP address. *(Video recorded on an older VOXL Portal version — the current interface has additional tabs; see below.)* --- ## Accessing VOXL Portal Ensure `voxl-portal` is running using `voxl2:/$ voxl-inspect-services`. If it's not running, start it with `voxl2:/$ systemctl start voxl-portal`. You can also enable it to run on boot using `voxl2:/$ voxl-configure-portal`. voxl-portal listens on all network interfaces on port 80, so any IP connection to your VOXL works: [WiFi](/wifi-setup/), Ethernet, or even a USB cable using [ADB port-forwarding](/voxl-portal-via-adb/) — no network needed. It is supported on VOXL 2, RB5 Flight, and QCS6490-based platforms. Next, find your VOXL's IP address. On VOXL 2, you can use this command: `voxl2:/$ voxl-my-ip`. On VOXL or VOXL Flight, you must use `ifconfig`. If your VOXL is in station mode, you can access VOXL Portal by simply pointing your web browser to the IP address of VOXL: > http://\/ If your VOXL is in SoftAP mode, you MUST additionally ensure your host computer is connected to the network SSID that the VOXL is hosting. VOXL Portal will not be able to connect otherwise. You can see what WiFi mode you are in using this command: ``` voxl2:/$ voxl-wifi getmode ``` ## Tabs Overview The header bar at the top of every page provides the following tabs: - **Cameras** — dropdown listing every active camera/image pipe. Covered in detail below. - **Pointclouds** — dropdown listing every active pointcloud pipe, rendered in a WebGL viewer. Covered in detail below. - **Debug** — dropdown of calibration and diagnostic tools, including the CPU and IMU plotting tools. See [Debug Menu](#debug-menu) below. - **Benchmark** — browse and visualize VIO benchmark results stored on the vehicle. - **ELRS** — ExpressLRS receiver configuration, with configuration presets selected by the vehicle's SKU and a control for setting the binding phrase. - **VIO** — VIO workbench with a Live View mode for monitoring the running VIO server and a VINS Lab mode for replay and analysis. ![VOXL Portal VIO view showing a live open-vins trajectory and feature points](/images/voxl-sdk/voxl-portal/voxl-portal-vio-view.png) - **Follow** — live camera view for the follow feature; click a target in the feed to select it. - **Mapper** — 2D/3D map view for [voxl-mapper](/voxl-mapper/); only appears when voxl-mapper is installed. See [Interacting with VOXL Mapper](/interacting-with-voxl-mapper/). --- ## Viewing Cameras voxl-portal uses the MPA library to dynamically list and display any open camera/image pipes. When the "Cameras" dropdown is selected, any available image output will be displayed, regardless of supported type. ![voxl-portal-camera-list.png](/images/voxl-sdk/voxl-portal/voxl-portal-camera-list.png) Select the camera you wish to view, and the image will be displayed as long as the image format is supported. ![voxl-portal-camera-view.png](/images/voxl-sdk/voxl-portal/voxl-portal-camera-view.png) ### Supported image formats * RAW8 * RAW16 * STEREO_RAW8 * RGB * YUV420 * YUV422 * NV21 * NV12 * STEREO_NV12 * STEREO_NV21 * H264 * H265 ### Image Quality voxl-portal will attempt to adjust to your networks capabilities. When you have a poor network connection, framerate will drop until a consistent framerate can be reached. If you are expecting a higher resolution image than what you are receiving, the cause is likely a poor connection. A Multi-View option at the top of the dropdown collages all active streams at once. Viewing streams one at a time is recommended instead — streaming many cameras simultaneously stresses the network and reduces quality for all of them. --- ## Viewing Pointclouds voxl-portal uses the MPA library to dynamically list and display any open pointcloud pipes. Note that you need either stereo cameras or a ToF sensor to have any pointclouds. Select any pointcloud in the "Pointclouds" dropdown to view it. All MPA pointcloud types are supported, see [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/library/include/modal_pipe_interfaces.h#L418) for the full list. ![voxl-portal-pointcloud-list.png](/images/voxl-sdk/voxl-portal/voxl-portal-pointcloud-list.png) > The pointcloud viewer utilizes WebGl for GPU-accelerated rendering, so running on devices that do not support this may result in other issues. ![voxl-portal-dfs-pointcloud.png](/images/voxl-sdk/voxl-portal/voxl-portal-dfs-pointcloud.png) The bottom left hand corner of the page includes a button to overlay an image stream on top of the pointcloud grid. Clicking on this tv icon will populate a list above of all available image topics, similar to the camera dropdown. ![voxl-portal-overlay-stream.png](/images/voxl-sdk/voxl-portal/voxl-portal-overlay-stream.png) Selecting one will overlay it on the page, where it can be resized via the bottom left corner of the stream and closed using the red x at the bottom left. ![voxl-portal-overlay-stream-qvio.png](/images/voxl-sdk/voxl-portal/voxl-portal-overlay-stream-qvio.png) ### Tof voxl-portal has a special viewer for the "Tof" pointcloud topic if your VOXL setup includes a tof camera. This specific pointcloud can be colored by either confidence or reflected light intensity, since those values are included with the tof topic. (Note: Tof Pc only displays Point Cloud data, no confidence or intensity). ![Time of Flight Point Cloud](/images/voxl-developer-bootcamp/tof.png) --- ## CPU and IMU Plotting voxl-portal is able to produce detailed plots with CPU and IMU information. > Hovering above the graph will tell you the the exact x-axis and y-axis values. ### CPU This tool will plot ten second windows of data, with various CPU, GPU, and memory options. You may choose to plot as few or as many of the listed options as you wish. ![CPU Plots](/images/voxl-developer-bootcamp/portal_cpu.png) ### IMU This tool mimics the CPU plotting tool, but displays gyro and acceleration data. ![IMU Plots](/images/voxl-developer-bootcamp/portal-imu.png) ### FFT (Fast Fourier Transform) This tool helps to measure vibration levels detected by the IMU, and plots angular velocity and acceleration against frequency, computed using FFT. The FFT entry is not present on every platform or portal build — the [voxl-inspect-vibration](/voxl-inspect-vibration/) terminal tool provides the same vibration measurement everywhere, with color-coded accel and gyro noise thresholds. ![portal FFT plot (older portal version)](/images/voxl-developer-bootcamp/portal-fft.png) > The FFT tool only appears on QRB-based platforms. --- ## Debug Menu The Debug dropdown in the header collects calibration and diagnostic tools: - **Sensor Calibration** — accelerometer, gyroscope, magnetometer, and level-horizon calibration. As of voxl-portal 0.9.7, the level-horizon calibration requires the accelerometer calibration to be completed first. - **Barometer Calibration** — see [Calibrate Barometer](/calibrate-baro/) - **Thermal Calibration** — IMU thermal calibration - **RC Calibration** - **Flight Modes** — flight mode configuration - **Actuators** — per-motor actuator testing, similar to QGroundControl's motor test - **Health Check** — system health check - **Imus / Cpu** — the IMU and CPU plotting tools described above - **Version Info** — installed software versions - **Download Logs** — download service journals from the browser - **GPS** — per-satellite signal (SNR) plots - **Mobile View** — simplified view for phones; mobile browsers are automatically redirected to it --- ## Other Features - The dark-mode toggle in the header persists across pages and sessions (stored in your browser). - Single-camera views include a Snapshot button to capture a frame from the stream. - H.264-encoded camera streams (such as hires) are decoded in the browser, enabling low-latency high-resolution streaming. - An experimental REST API is served under `/api/v1`. It can be enabled with `voxl-portal -e` and is enabled automatically on supported platforms. --- ## Flight Info voxl-portal uses the MPA library and output from `voxl-mavlink-server` to display, in the upper right corner of the portal: - drone battery level - number of satellites being used to triangulate GPS position - flight mode - arm Status ![voxl-portal-flight-info.png](/images/voxl-sdk/voxl-portal/voxl-portal-flight-info.png) If these fields are "unknown", you should check that `voxl-mavlink-server` and `voxl-px4` are running. [VOXL Portal Source Code](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) --- Source: https://docs.modalai.com/installing-qgc/ # Installing QGC [QGroundControl](http://qgroundcontrol.com/) is a popular multi-platform ground control station software among PX4 autopilot developers. We will use it throughout the SDK documentation so it's good to install it at this point. Here, we will be installing QGC on an Ubuntu 22.04 or 24.04 machine. --- ### Install Dependencies ```bash me@mylaptop:~$ sudo usermod -a -G dialout $USER me@mylaptop:~$ sudo apt update me@mylaptop:~$ sudo apt remove -y modemmanager me@mylaptop:~$ sudo apt install -y gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl libfuse2 libxcb-xinerama0 libxkbcommon-x11-0 libxcb-cursor0 ``` ### Download the AppImage ```bash me@mylaptop:~$ cd ~/Desktop me@mylaptop:~/Desktop$ wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl-x86_64.AppImage me@mylaptop:~/Desktop$ chmod +x QGroundControl-x86_64.AppImage ``` ### Launch Launch QGC by right clicking on the QGroundControl-x86_64.AppImage icon on the desktop and selecting "Run as a program". ### Troubleshooting If QGC does not launch, try running it from a terminal. This will print any debug messages it prints. ```bash me@mylaptop:~$ cd ~/Desktop me@mylaptop:~/Desktop$ ./QGroundControl-x86_64.AppImage ``` --- Source: https://docs.modalai.com/qgc-wifi/ # How to Connect VOXL to QGroundControl over WiFi Mavlink routing on VOXL is handled by [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) which routes mavlink messages between the autopilot, MPA services, and ground control stations. --- ## Video *(Video recorded on QGC 4.x — menu locations differ slightly in newer QGC versions; see the steps below.)* ## Prerequisites ### Validate required services are running Run `voxl-inspect-services` to confirm that both voxl-px4 and voxl-mavlink-server are running. ``` voxl2:/$ voxl-inspect-services Scanning services... Service Name | Enabled | Running | CPU Usage ────────────────────────────────────────────────────────────────── voxl-camera-server | Enabled | Running | 1.8% voxl-cpu-monitor | Enabled | Running | 0.0% voxl-imu-server | Enabled | Running | 14.5% voxl-logger | Disabled | Not Running | voxl-mavcam-manager | Enabled | Running | 0.0% voxl-mavlink-server | Enabled | Running | 1.8% voxl-open-vins-server | Enabled | Running | 8.2% voxl-portal | Enabled | Running | 1.8% voxl-px4 | Enabled | Running | 14.5% voxl-static-ip | Disabled | Not Running | voxl-streamer | Enabled | Running | 2.1% voxl-tag-detector | Disabled | Not Running | voxl-vision-hub | Enabled | Running | 3.4% ``` ### VOXL and Host PC should be able to ping each other See the [VOXL Developer Bootcamp WiFi Guide](/wifi-setup/). ## Choosing which device should initiate the connection There are two ways to initiate a connection between VOXL and a ground control station. Either VOXL can be configured to remember the IP address of the ground control station or visa versa. Choose which method suites your preference and specific use case. ## Initiating Connection to VOXL from QGroundControl If you know the IP address of VOXL, you can point your GCS to VOXL's IP and initiate a connection with no configuration of VOXL whatsoever. First you can determine the IP address of VOXL by using [ADB shell](/setting-up-adb/) over a USB cable and using the `voxl-my-ip` tool or standard Linux tools like `ifconfig`. ```bash voxl2:/$ voxl-my-ip 192.168.1.225 (wlan0) ``` In QGroundControl add VOXL's IP Address as a UDP connection under Application Settings > Comm Links. Unless you expect to have multiple drones turned on on the same network at the same time, we suggest enabling the 'automatically connect on start' feature here. Note, after typing in the IP address, you MUST click the add server button in QGroundControl. ![qgc_add_ip.png](/images/voxl-sdk/qgc/qgc_add_ip.png) Once you've saved the connection information. Click the connect button. ![qgc_connect_to_ip.png](/images/voxl-sdk/qgc/qgc_connect_to_ip.png) Then you can navigate back to the QGroundControl main window and you should be connected! ![qgc_ready.png](/images/voxl-sdk/qgc/qgc_ready.png) ## Initializing Connection to QGroundControl from VOXL If you have a network architecture where the VOXL changes IP frequently but the GCS is at a static IP, then you can alternatively configure VOXL to initiate the connection to the GCS. To do this, add your GCS IP address to VOXL's `/etc/modalai/voxl-mavlink-server.conf` configuration file. ``` bash voxl2:/$ nano /etc/modalai/voxl-mavlink-server.conf "primary_static_gcs_ip": "192.168.8.10", "secondary_static_gcs_ip": "192.168.8.11", ``` Then restart the mavlink server to load in the new config file. ```bash voxl2:/$ systemctl restart voxl-mavlink-server ``` Note there are two fields allowing you to enter the IPs of up to two ground control stations. This is useful if you have both a desktop in the office and a laptop for field use. Note that the two default IPs in this config file are `192.168.8.10` `192.168.8.11`. These are the first two IPs that will be assigned by VOXL's DHCP server when devices connect to VOXL's SoftAP wireless network. This is what allows a GCS to auto-connect to VOXL when using SoftAP WiFi mode. We suggest leaving the primary ip as `192.168.8.10` so as to not disable the SoftAP auto connect functionality. Usually you will want to set your main GCS IP address to the secondary slot. There is no practical difference between the primary and secondary slots, they both function the same and are only differentiated by name. ## Related Pages See the [VOXL SDK Mavlink Routing](/mavlink/) page for more details. Also see the [VOXL SDK 4G/5G QGround Control Connection Guide](/sentinel-user-guide-connect-network/) once you are done with the bootcamp to try flying with one of our [Modems](/modems/). --- Source: https://docs.modalai.com/first-flight/ # First Flight Now it's finally time for your first flight! Each development drone is a little different so please select from the below list. **Starling 2 / Starling 2 Max** — a dedicated first-flight guide is in progress. The [Sentinel First Flight](/sentinel-user-guide-first-flight/) procedure covers the same general PX4 flow (props-off arming check, propeller install, position-hold first flight), but note your transmitter differs: Starling 2 ships with a 915MHz ELRS or 2.4GHz Ghost receiver — see [voxl-elrs](/voxl-elrs/) for binding, and verify your kill-switch mapping in QGC before arming. [Starling (Legacy) First Flight](/starling-first-flight/){: .btn .btn-green } [Sentinel First Flight](/sentinel-user-guide-first-flight/){: .btn .btn-green } ## Skip This Step If you are using a VOXL Development Kit instead of one of the above Development Drones, you can skip to the next step: [Next Step: voxl-cross](/voxl-docker-and-cross-installation/){: .btn .btn-green } --- Source: https://docs.modalai.com/starling-first-flight/ # Starling First Flight > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* [Next Step: voxl-cross](/voxl-docker-and-cross-installation/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-first-flight/ # Sentinel First Flight > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* 1. TOC ## Preflight Checks Disconnect the power supply now and move Sentinel to a safe location where you wish to fly and connect a battery for flight while the Sentinel is on the ground. Wait for the connection with QGroundControl to be established. ### Attitude Check Lift the vehicle and move it around, verify that the attitude reported in QGroundControl GUI looks and responds correctly. Try not to cover the tracking camera during this process. ![qgc_attitude_gui.png](/images/voxl-sdk/qgc/qgc_attitude_gui.png) ### Arming Vehicle Without Props With the propellers **off** arm the vehicle. - Set killswitch to off ("Aux2 Gov" switch down) - **Left** stick hold **down** and to the **right** Validate the motor rotation is as expected and the vehicle responds to throttling up momentarily. Disarm the vehicle: - **Left** stick hold **down** and to the **left** Correct rotation direction of motors: ![vehicle-overview-props-144-1024.jpg](/images/voxl-sdk/qgc/QuadRotorX-small.svg) ## Install Propellers If your motors are blue, follow the first two steps under v1.0. If you motors are black, skip down to v1.1. ![sentinel-motors](/images/sentinel/sentinel-motors.jpg) ### v1.0 If your Sentinel has blue motors, follow the directions below to install spacer adapters. 1. This version requires 1mm spacer adapters to be added to the propellors. 2. Grab the spacer and pop it into the propellors as shown. *Make sure the adapters have not fallen off your propellors, and check the motors for adapters that may have fallen from previous flights* ![sentinel-prop-spacer](/images/sentinel/sentinel-prop-spacer.jpg) ![sentinel-prop-spacer2](/images/sentinel/sentinel-prop-spacer2.png) ### v1.1 If your Sentinel has black motors, start here. 3. Unscrew the bell caps and remove the washers. Two of the propellors labeled 'R' are designed to turn clockwise and correspond to motors 3 and 4 in the diagram above. Check your props, and slide them onto the motors according to the diagram. ![sentinel-prop-spacer2](/images/sentinel/sentinel-right-prop.jpg) ![sentinel-prop-spacer](/images/sentinel/sentinel-prop-1.jpg) --- 4. Slide the washers back on as shown, then screw the bell caps on. ![sentinel-prop-spacer](/images/sentinel/sentinel-prop-2.jpg) ![sentinel-prop-spacer](/images/sentinel/sentinel-prop-3.jpg) --- 5. Tighten by sliding a tool through the holes. Make sure to hold the motors, and not the props while tightening. ![sentinel-prop-spacer](/images/sentinel/sentinel-prop-4.jpg) ### Safety Check Before flying, make sure to conduct a thorough safety check:
  • Make sure all connectors and cabling is secure and not loose
  • Make sure none of the wires are cut, frayed, or damaged
  • If you have any connectivity add-ons, make sure the antennas are secure and are not loose
  • Make sure the SD and SIM cards have not popped out
  • Make sure the receiver is properly plugged in
  • Make sure the cameras are free of any grease, dust, or debris
  • Make sure the battery you are using is fully charged
  • Make sure the props are on correctly and that they are securly attached
### First Flight (Position Mode) You should be comfortable flying before proceeding! We recommend your first flight be in position hold (vio) mode outside with a GPS lock. For more information on flying in position mode, see the [VIO feature guide](/flying-with-vio/). Once confortable with position mode, now safely fly in manual mode! No instructions here, this is an advanced mode and you should know what you are doing if you're flying! [Next Step: voxl-cross](/voxl-docker-and-cross-installation/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-docker-and-cross-installation/ # How to setup voxl-docker and voxl-cross --- ## Background VOXL 2 is an embedded AI autopilot that runs a Linux operating system on top of a QRB5165 chipset. To develop applications for VOXL 2, you need to cross-compile from your PC and deploy those applications to VOXL 2. VOXL Docker is a bash script that helps launch docker images with the right permissions and with the local directory mounted in the docker to easily build VOXL applications. `voxl-cross` is a ubuntu-based docker image containing arm cross-compilers for VOXL. It includes the package manager which allows voxl packages to be installed in the docker image for easy dependency satisfaction when compiling. It is not the only, but is the most commonly, used docker image for compiling VOXL applications. --- ## Installing VOXL Docker ### Prerequisite: Install Docker CE 1) Official instructions are here: https://docs.docker.com/engine/install/ubuntu/ However, they are summarized at time of writing as follows. we can't guarantee these commands are current whereas the above link should be current. ```bash # install instructions from https://docs.docker.com/engine/install/ubuntu/ me@mylaptop:~/$ sudo apt remove docker docker-engine docker.io containerd runc me@mylaptop:~/$ sudo apt update me@mylaptop:~/$ sudo apt install -y apt-transport-https ca-certificates curl me@mylaptop:~/$ curl -fsSL https://get.docker.com -o get-docker.sh me@mylaptop:~/$ sudo sh ./get-docker.sh me@mylaptop:~/$ sudo apt install docker-compose me@mylaptop:~/$ ``` 2) Add current user to docker group to allow usage of docker commands without root privileges. You will need to restart your OS after running this command for the group permissions to be applied. ```bash me@mylaptop:~/$ sudo usermod -a -G docker $USER me@mylaptop:~/$ sudo reboot ``` ### Install the voxl-docker Script To build any VOXL project using VOXL Docker, you will need the dockerfiles and scripts in the voxl-docker repository. Install as below: ```bash me@mylaptop:~/$ mkdir -p ~/git me@mylaptop:~/$ cd ~/git me@mylaptop:~/$ git clone https://gitlab.com/voxl-public/support/voxl-docker me@mylaptop:~/$ cd voxl-docker me@mylaptop:~/$ ./install-voxl-docker-script.sh ``` ### Testing your Installation To test your installation, try running the following commands. It may also help to read through the help menu to understand the the voxl-docker script's arguments. ```bash me@mylaptop:~/$ voxl-docker -h This is primarily used for running the voxl-emulator image for compiling ARM apps-proc code for VOXL and the voxl-hexagon docker image for cross-compiling hexagon SDSP programs. This can also launch any other installed docker image with the -i argument. By default this mounts the current working directory as the home directory inside the docker for easy compilation of whichever project you are currently working in. The directory that gets mounted inside the docker can be manually specified with the -d argument. The voxl-hexagon image starts with the username "user" with UID and GID 1000 which should match the first user on your desktop to avoid permissions issues. The voxl-emulator image starts, by default, with the same username, UID, and GID inside the docker as the user that launched it. Since the voxl-emulator image is designed to emulate the userspace environment that runs onboard the VOXL itself, you may wish to run as the root user inside the voxl-emulator docker image to test certain behaviors as the root user. This more closely mimics the on-target environment as the VOXL image runs as root by default. Enter this mode with the -p option. You can also specify the entrypoint for the docker image launch. By default this is set to /bin/bash but can be user-configured with the -e option. This is most likely used to pass the docker a command to execute before exiting automatically. For example, to build the librc_math project in one command: ~/git/librc_math$ voxl-docker -i voxl-emulator -e "/bin/bash build.sh" ARGUMENTS: -h: : Print this help message -d : The name of the directory to mount as ~/ inside the docker -i : Docker image to run, usually voxl-emulator or voxl-hexagon -p : for voxl-emulator image ONLY, runs as root user inside docker -l : list installed docker images -e : set the entrypoint for the docker image launch ``` To list available docker images (note: you should not see any images until you install them later): ```bash me@mylaptop:~/$ voxl-docker -l REPOSITORY TAG IMAGE ID CREATED SIZE voxl-hexagon latest 637d89d3a530 19 minutes ago 5.28GB voxl-emulator latest 0e15518b8f95 1 months ago 1.26GB ``` --- ## Installing voxl-cross ### Install Pre-built voxl-cross First, download the latest pre-built voxl-cross from the [Docker Images folder on downloads.modalai.com](https://modalai.filecloudonline.com/ui/core/index.html#expl-tabl./SHARED/downloads/Docker%20Images). For example: `voxl-cross_V4.4.tgz`. Then run the following commands to load, tag as latest, and run (using voxl-docker) the docker image. ``` me@mylaptop:~/$ docker load -i voxl-cross_V4.4.tar.gz me@mylaptop:~/$ docker tag voxl-cross:V4.4 voxl-cross:latest me@mylaptop:~/$ voxl-docker -i voxl-cross ``` ### Build voxl-cross If you would like to build the voxl-cross docker image yourself instead of using the pre-built version, you can find instructions for this at the project's [README](https://gitlab.com/voxl-public/support/voxl-docker). #### To learn to use voxl-cross to build and deploy applications, move onto the next page. --- Source: https://docs.modalai.com/voxl-cross-template/ # Using VOXL Docker and VOXL Cross to Build and Deploy Applications --- This page will walk you through how to use `voxl-docker` and the `voxl-cross` docker image to build and deploy an application onto VOXL. We will use [voxl-cross-template](https://gitlab.com/voxl-public/voxl-sdk/voxl-cross-template/) as an example. This example simply prints IMU data from VOXL's onboard sensors to a shell. Make sure you have [Installed VOXL Docker and VOXL Cross](/voxl-docker-and-cross-installation/) first. We encourage you to follow along!!! Once you have the template building and deploying, the [Example Code](/example-code/) page catalogs the other working examples in the SDK to build from. ## Background All ModalAI projects contain these 4 scripts in the root dir: **clean.sh:** cleans up build files and .deb packages. **build.sh:** builds project without cleaning first; may specify platform target with the following options where appropriate (`qrb5165`, `qrb5165-2`, `qcs6490`, `native`). **make_package.sh:** makes a .deb package after building; takes no argument, or an optional `timestamp` argument to append a date-time suffix to the package version. **deploy_to_voxl.sh:** push the just-generated deb to VOXL and install it with dpkg. The general workflow is clean, build, make, deploy. ## Build Instructions First, clone the voxl-cross-template repository and cd into it: ``` me@mylaptop:~/$ git clone https://gitlab.com/voxl-public/voxl-sdk/voxl-cross-template.git me@mylaptop:~/$ cd voxl-cross-template ``` 1) Launch the `voxl-cross` docker. After it launches, your terminal pre-cursor should change to `voxl-cross:~/$`: ```bash me@mylaptop:~/voxl-cross-template$ voxl-docker -i voxl-cross voxl-cross:~$ ``` 2) Install build dependencies inside the docker. You must specify both the hardware platform and binary repo section to pull from. The hardware platform should be `qrb5165` (the processor VOXL 2 uses) or `qcs6490`. The binary repo section can be `dev`, `staging`, or a release section such as `sdk-1.7`. See [here](/configure-pkg-manager/) for more information. ```bash voxl-cross:~$ ./install_build_deps.sh qrb5165 sdk-1.7 ``` > The `dev` section contains the newest unreleased packages and is unstable — it is intended for internal development. When building against a released SDK, use the matching `sdk-X.Y` section. 3) Build scripts should take the hardware platform as an argument: `qrb5165` for SDK 1.X targets, `qrb5165-2` for SDK 2.X targets, `qcs6490` for QCS6490-based targets, or `native` to build with the native compilers. Note that `build.sh` checks that it is running inside voxl-cross version 4.4 or newer and will refuse to build otherwise. ```bash voxl-cross:~$ ./build.sh qrb5165 OR voxl-cross:~$ ./build.sh qrb5165-2 ``` 4) Make a deb package while still inside the docker. ```bash voxl-cross:~$ ./make_package.sh ``` This will make a new package (.deb) file in your working directory. The name and version number came from the package control file. If you are updating the package version, edit it there. Optionally add the `timestamp` argument to append the current date and time to the package version number in the debian package. ## Deploy to VOXL You can now push the deb package to VOXL and install with dpkg however you like. To do this over ADB, you may use the included helper script: `deploy_to_voxl.sh`. Do this outside of docker as your docker image probably doesn't have usb permissions for ADB. The `deploy_to_voxl.sh` script will query VOXL over adb to check that dpkg is installed, then push and install the .deb package. If dpkg is not found on the device, the script will report an error. ```bash (outside of docker) me@mylaptop:~/voxl-cross-template$ ./deploy_to_voxl.sh ``` This deploy script can also push over a network given sshpass is installed and the VOXL uses the default root password. ```bash (outside of docker) me@mylaptop:~/voxl-cross-template$ ./deploy_to_voxl.sh ssh 192.168.1.123 ``` ## Running the Deployed Program To see your now built and deployed application running on the VOXL, ADB or ssh into your VOXL. In your VOXL's bash shell, run: ``` voxl2:/$ voxl-hello-cross ``` Try arguments `-h` (for a help menu), `-i` (to provide an IMU input), and `-n` (to add a newline after every IMU output). If you add a `-i` parameter followed by the name of an IMU (press tab after typing `-i` to see available IMU's), you should see IMU data being printed to the shell. You can see that the name of the command to run in the shell is defined in /src/CMakeLists.txt: ``` SET(TARGET voxl-hello-cross) ``` ## Next Steps This section of the bootcamp has been a short intro to building applications using `voxl-cross`. This process will suffice for 90% of applications; for the other build environments used instead of `voxl-cross` in unique circumstances, see the [Build Environments](/build-environments/) page. In addition, writing custom applications has been out of the scope of this Bootcamp. --- Source: https://docs.modalai.com/bootcamp-graduation/ # Congratulations! Assuming you did not skip any of the above pages, you have graduated from the VOXL Developer Bootcamp!!! 🥳 This has been a walk-through of the VOXL ecosystem. You now understand all the major functionalities of your VOXL, including interfacing with it, using basic services and tools, and building your own applications. But VOXL is definitely capable of so much more... to get into the weeds of any topic, use the search bar at the top of this page or just browse the [VOXL SDK Guide](/voxl-sdk/).
##### We hope this Bootcamp has been helpful. Leave any feedback for us on the [ModalAI forum](https://forum.modalai.com/category/2/ask-your-questions-right-here). --- Source: https://docs.modalai.com/voxl-developer-bootcamp/ # VOXL Developer Bootcamp --- Welcome to the VOXL Developer Bootcamp! We're glad you're joining the community. This section is designed to guide you through all the core features of your VOXL hardware and SDK that you will likely need when developing for your custom applications. ### We highly recommend completing the bootcamp before your first flight! It's quick, helpful, and later sections may refer back to the bootcamp. Estimated time to complete: 2 hours --- Source: https://docs.modalai.com/voxl-sdk/ # VOXL SDK VOXL SDK is the open-source software stack that ships on every VOXL platform — the same SDK runs on [VOXL 2](/voxl-2/), [VOXL 2 Mini](/voxl2-mini/), and all ModalAI development drones. It bundles the Modal Pipe Architecture (MPA) core services, SDK libraries, inspection tools, and [build environments](/build-environments/) you need to develop your own software on VOXL hardware. Source code and build instructions live at [gitlab.com/voxl-public](https://gitlab.com/voxl-public). ## Explore the SDK --- Source: https://docs.modalai.com/sdk-1.7-release-notes/ # SDK 1.7.X Release Notes > SDK 1.7.0 is **in development** and has not yet been released. The pre-release builds documented below are undergoing internal flight testing, are not recommended for production use, and **everything on this page is subject to change before release**. For released software, see the [SDK 1.6 Release Notes](/sdk-1.6-release-notes/). > SDK 1.7 is not expected to have a full release. Development is moving to SDK 1.8, which will be the next supported release. ## Overview SDK 1.7.0 is the next VOXL SDK release. The current pre-release cut is **1.7.0-beta5** (August 2026). Highlights planned for this release: - Full support for the QCS6490-based Seeker Vision 5" (D0008-9), currently in flight testing on 1.7.0 beta builds - voxl-open-vins-server 0.7.0: asynchronous multi-camera VIO support, faster ceres-free initialization, and auto-reset hardening - RC handling improvements: a new `rc_active` mux in voxl-mavlink-server with ELRS failsafe awareness - Artifacts for all current platforms: VOXL 2, VOXL 2 Mini, VRX, and QCS6490 Like every SDK release, 1.7.0 is being cut from tagged [voxl-suite](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite) meta-packages that pin the exact version of every package in each cut — see the [release tags](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags) for the full alpha/beta history. ## Pre-Release Build Status | Platform | Latest 1.7.0 pre-release | voxl-suite tag | |----------|--------------------------|----------------| | QCS6490 | 1.7.0-beta5 | [sdk-1.7.0-beta5](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.7.0-beta5) | | VOXL 2 | 1.7.0-alpha3 | [sdk-1.7.0-alpha3](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.7.0-alpha3) | | VOXL 2 Mini | 1.7.0-alpha3 | [sdk-1.7.0-alpha3](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.7.0-alpha3) | | VRX | 1.7.0-alpha3 | [sdk-1.7.0-alpha3](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.7.0-alpha3) | Pre-release system images: | Platform | System image | |----------|--------------| | VOXL 2 | 1.8.09 | | VOXL 2 Mini | 1.8.09 | | VRX (ubun2.0-multi) | 2.0.2-perf-20260325 (unchanged from SDK 1.6.x) | | QCS6490 | v0.2.3-20260807-212520 (newer modalai-adsp, USB2 flashing fix) | Pre-release history since beta3: - **1.7.0-beta4** (August 7, 2026), QCS6490: system image v0.2.3 with the newer modalai-adsp package and a USB2 flashing fix; modalai-adsp v1.0.10, voxl-portal v0.9.7, voxl-px4-params v0.9.21. - **1.7.0-beta5** (August 7, 2026), QCS6490: same package set as beta4 with corrected voxl-suite dependency handling for the modalai-adsp package alternatives. ## SDK 1.7.0-beta5 Package List > This is the pre-release package set as of the `sdk-1.7.0-beta5` meta-package, compared against SDK 1.6.6. Beta artifacts so far are QCS6490-only; VOXL 2 family and VRX pre-release artifacts are currently at 1.7.0-alpha3. MD5 hashes and the final package list will be published here when SDK 1.7.0 is released. | Package | Version | |---------|---------| | libmodal-flow | v1.0.5 --> v1.0.6 | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | v0.1.1 --> v0.1.3 | | modalai-adsp | v1.0.8 --> v1.0.10 | | modalai-slpi | v1.2.3 --> v1.2.4 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | v2.2.29 --> v2.2.32 | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | v1.1.35 --> v1.1.39 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | v1.6.3 --> v1.6.4 | | voxl-fpv-px4 | v1.14.0-8.145.4 --> v1.14.0-8.148.0 | | voxl-imu-server | v2.0.2 --> v2.0.3 | | voxl-io-server | v0.1.3 --> v0.1.4 | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | v0.6.3 --> v0.6.4 | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | v0.6.1 --> v0.6.2 | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | v1.4.16 --> v1.4.18 | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | v1.5.8 --> v1.5.9 | | [voxl-nano-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-nano-tracker) | v0.1.7 --> v0.1.8 | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | v0.6.2 --> v0.7.0 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | v0.4.12 --> v0.4.13 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | v0.9.4 --> v0.9.7 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | v1.14.0-2.0.142 --> v1.14.0-2.0.146 | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | v0.9.15 --> v0.9.21 | | [voxl-rc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-rc-server) | v0.0.5 --> v0.0.7 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | v0.0.9 --> v0.1.0 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | v2.0.5 --> v2.0.6 | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | v1.9.21 --> v1.10.0 | | voxl-vtx | v2.2.39 --> v2.2.42 | | voxl-aprilgrid-camera-calibration | v1.0.0 (new) | | voxl-wireguard | v0.0.67 (new) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | removed (was v0.1.5) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | removed (was v1.2.4) | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | removed (was v0.2.2) | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | removed (was v0.3.11) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | removed (was v0.1.1) | ## SDK 1.7.0-beta5 Full Changelog (from SDK 1.6.6) ``` libmodal-flow (v1.0.5 to v1.0.6) * Add ZNCC epipolar-band stereo matcher (match_stereo / StereoMatcherCL) libvoxl-codec (v0.1.1 to v0.1.3) * [OMX] Add support for ROI control mode * [OMX] Fix FPS Hack workaround and fix CBR mode * [ROI] Handle runtime fps and # of p frame changes to maintain bitrate modalai-adsp (v1.0.8 to v1.0.10) * Disable options that override UsbPhy driver * Increase flight controller UART RX buffer size from 512 to 2048 modalai-slpi (v1.2.3 to v1.2.4) * Added i2c bus uninitialization to slpi_link voxl-camera-server (v2.2.29 to v2.2.32) * version bump to ensure libvoxl-codec changes are pulled in * remove libmodal_exposure dependency from dpkg control file * version bump for libvoxl-codec ROI feature set framerate changes voxl-configurator (v1.1.35 to v1.1.39) * add V6 handling for D0008 * enable mavlink-server elrs rc mux on D0008 and D0020 * add handling for D0008-V6-XS * disable mavcam-manager on platforms with M26 family modems voxl-esc (v1.6.3 to v1.6.4) * update to 39.26 fw voxl-fpv-px4 (v1.14.0-8.145.4 to v1.14.0-8.148.0) * Fix Hexagon compiler NaN comparison issues in math library * Changed VOXL ESC GPIO control from AUX channels to RC channels set by new parameters * Changed parameter GPS_SAT_INFO default to 1 * Update mag driver for publishing consistency across axis and publish rate * Update ESC publishing for more frequent battery current data * Improved mag current compensation performance * Increase gravity innovation in ekf2 to prevent gravity-aid lockout during aggressive maneuvers voxl-imu-server (v2.0.2 to v2.0.3) * voxl-io-server (v0.1.3 to v0.1.4) * voxl-logger (v0.6.3 to v0.6.4) * add logging support with -O for offboard_log, logs the mpa offboard data from VFC. Also logs the px4_baro pipe in addition voxl-mavcam-manager (v0.6.1 to v0.6.2) * fix debug flag being set incorrectly voxl-mavlink-server (v1.4.16 to v1.4.18) * add rc_active pipe muxing rc_channels and manual_control * pipe_io: add libelrs failsafe awareness to rc_active mux * fix qcs6490 build by adding voxl-elrs as a dependency * simplify RC active mux selection logic * Controlled FTP/Download helpers for ATAK voxl-mpa-tools (v1.5.8 to v1.5.9) * add conf files for D0008-V6 * voxl-logger: update to allow raw images to be recorded as jpegs * add voxl-record-raw-image voxl-nano-tracker (v0.1.7 to v0.1.8) * fix include file location * cleanup compiler and cmake warnings voxl-open-vins-server (v0.6.2 to v0.7.0) * async unsynced multi-camera support: lock-free per-camera ingest rings, epoch-anchored cloning, ACI2 preintegration bridge, deferred epoch marginalization (async meets synced; synced path bit-identical) * per-camera cam-IMU time offset and rolling-shutter readout states with online calibration and degenerate-motion gating * per-camera acquisition declarations (camN_shutter / camN_readout_time_s / camN_fps) with boot validation and config-drift guards * ceres-free dynamic initialization (ov_init::zbft_sfm): lock-free LM solver, S2 gravity, ~17-20 ms init (legacy ceres path was ~65 ms); drop voxl-ceres-solver runtime dep * any-attitude init/reset: server gravity gate, heading re-origin, warm-start clone injection * divergence-aware soft reset (RESET_VIO_SOFT) with live bias priors; episode purge of used-features map and zupt flags * async-aware quality metric: windowed feature union + time-constant EMA (replaces exact-timestamp scoring that starved async rigs) * auto-reset hardening: estimator-health error mask (transport warnings no longer hard-reset), warning decay, re-init grace arming, reset-race guards, hard-reset null-deref fix * new fpvhires config (IMX664 rolling-shutter + AR0144 tracking, unsynced); fpv restored to synced duo AR0144; fpvhires and d8v6 wired into voxl-configure-open-vins * estimator verbosity driven by the YAML key (-v only raises to ALL; warnings can no longer be swallowed) * stale-code purge: CameraQueueFusion removed, dead config knobs/globals/branches removed (~1.3k lines); duplicate includes fixed * docs: ov_msckf/README_ASYNC.md design doc (epoch cloning, ACI2 bridge, RS model, resets, YAML reference); authorship/copyright pass across both repos voxl-osd (v0.4.12 to v0.4.13) * voxl-portal (v0.9.4 to v0.9.7) * rendezvous and capture: Add follower/APN inspect * add follow_simple page for tracker-agnostic bbox subscribers * vio page overhaul with improved live view and vins-lab * force level horizon cal to happen after accel cal voxl-px4 (v1.14.0-2.0.142 to v1.14.0-2.0.146) * Fix Hexagon compiler NaN comparison issues in math library * Remove attempt to find DPS baro on bus 1 from DSP * Added another fence points QGC upload fix * Fix fence points QGC upload voxl-px4-params (v0.9.15 to v0.9.21) * set COM_RC_IN_MODE to 2 (RC and Joystick) on D0008 * add param file for disabling turtle mode * add initial px4 1.18 params * add the Mag ID for D0008 V6, prevents mag params set during flash from being wiped during calibration * update D0008 param set to support gps position mode * update alt mode baro params * update D0008-V6-XS flight modes * cleanup D0008 V6 params and do some tuning * remove never-used D0008 V5 params, params stayed the same from V4 to V5 * fix motor spin direction on D0008 V6 * update old temp cal file to new format during platform param load (during sdk update) * slow down D0008 V6 GPS POS mode velocities * update D0008 V6 3x2 battery mag compensation * fix incorrect filename reference for D0008 V6 flat battery mag compensation params voxl-rc-server (v0.0.5 to v0.0.7) * add dtc config * Added stock radiomaster zorro loadout * skip UDP socket recreation when D2S IP is unchanged * fix arm/terminate rejected by PX4 due to broadcast target_system * Add unbind feature mirroring the existing bind chain * subscribe to voxl-vtx d2s_ip_conn pipe and update UDP destination voxl-remote-id (v0.0.9 to v0.1.0) * Updated to reflect a manufacturer serial number length of 10 instead of 12 * Updated for new voxl-cross docker and linter voxl-utils (v2.0.5 to v2.0.6) * update DTC default IP loadout voxl-vision-hub (v1.9.21 to v1.10.0) * ATR experiments from v1.9.22 - v1.9.23 reverted; functionally equivalent to v1.9.21 voxl-vtx (v2.2.39 to v2.2.42) * fix rc toggle issue for d0008-v4 * Fix race condition for checking kernel modules in enable vtx script * Add fast calibration option * Update default calibration file ``` --- Source: https://docs.modalai.com/sdk-1.6-release-notes/ # SDK 1.6.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) > SDK 1.6.4 is the current release on downloads.modalai.com for VOXL 2, VOXL 2 Mini and VRX. SDK 1.6.5, 1.6.6 and 1.6.8 were not released publicly for VOXL 2; their notes are kept here for reference. SDK 1.6.8 ships preinstalled on Seeker Vision 7" (D0019-4-V5, D0019-9) and Seeker Vision 10" (D0020-4-V5). SDK 1.6.6 ships preinstalled on Seeker Vision 5" (D0008-4-V5) and Seeker Vision 10" (D0020-4-V6). SDK 1.6.X Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1, M0204-1 | ![Yes](/icons/circle-check-big.svg) | | MVX-T0001 | M0204-1 | ![Yes](/icons/circle-check-big.svg) | | MVX-R0001 | M0205-1, M0206-1 | ![Yes](/icons/circle-check-big.svg) | System images per release (see [system image release notes](/voxl2-voxl2-mini-system-image/)): | SDK | Release date | VOXL 2 image | VOXL 2 Mini image | VRX (ubun2.0-multi) image | QCS6490 image | |--------|--------------|--------------|-------------------|---------------------------|---------------| | 1.6.8 | Aug 11, 2026 (QCS6490), Oct 1, 2026 (VOXL 2) | 1.8.08 | - | - | v0.2.3-20260807-212520 | | 1.6.7 | Jul 31, 2026 | - (QCS6490 only) | - (QCS6490 only) | - (QCS6490 only) | v0.2.2-20260729-200621 | | 1.6.6 | Jul 10, 2026 | 1.8.08 | 1.8.08 | 2.0.2-perf-20260325 | v0.2.1-20260517-040338 | | 1.6.5 | Jun 11, 2026 | 1.8.08 | 1.8.08 | 2.0.2-perf-20260325 | v0.2.1-20260517-040338 | | 1.6.4 | Jun 8, 2026 | 1.8.08 | 1.8.08 | 2.0.2-perf-20260325 | v0.2.1-20260517-040338 | | 1.6.3 | Feb 6, 2026 | 1.8.06 | 1.8.06 | 2.0 (20260125 nightly) | - | # Table of contents 1. TOC # SDK 1.6.8 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.8` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.8) — the exact package set pinned for this release. > SDK 1.6.8 was first released for QCS6490-based platforms on August 11, 2026. A VOXL 2 build followed on October 1, 2026 for Seeker Vision 7" (D0019-4-V5) and Seeker Vision 10" (D0020-4-V5). The QCS6490 build ships on Seeker Vision 7" (D0019-9) and Seeker Vision 10" (D0020-9). There are no VOXL 2 Mini or VRX artifacts for this release; those platforms should use SDK 1.6.6. ## SDK 1.6.8 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.8.tar.gz | 540db5ae5cce67198fe1535cab21be9b | | qcs6490_SDK_1.6.8.tar.gz | 68831fe5010fe875f11282fda97a75b6 | ## SDK 1.6.8 Package List Release date: August 11, 2026 (QCS6490), October 1, 2026 (VOXL 2) VOXL 2 changes from SDK-1.6.6 (system image unchanged at 1.8.08): | Package | Version | |---------|---------| | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) (FPV build) | 1.14.0-8.145.4 --> 1.14.0-8.148.0 | | voxl-vtx | 2.2.39 --> 2.2.42 | QCS6490 changes from SDK-1.6.7: | Package | Version | |---------|---------| | qcs6490 system image | v0.2.2-20260729-200621 --> v0.2.3-20260807-212520 | ## SDK 1.6.8 Full Changelog VOXL 2 (from SDK 1.6.6): the voxl-fpv-px4 and voxl-vtx changes are the ones listed under [SDK 1.6.7](#sdk-167-full-changelog-from-sdk-166), plus the voxl-suite change below. QCS6490 (from SDK 1.6.7): ``` qcs6490 system image (v0.2.2 to v0.2.3) * update integrated modalai-adsp package to v1.0.10 * fixes for USB2 flashing * reports as 0.2.3+nightly20260807212826 in voxl-version voxl-suite (1.6.7 to 1.6.8) * fix modalai-adsp dependency handling on qcs6490 so ADSP variants (e.g. modalai-adsp-vrx) preinstalled in the system image satisfy the SDK installer, fixing upgrade installs * derive dependency alternatives from package Provides fields ``` # SDK 1.6.7 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.7` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.7) — the exact package set pinned for this release. > SDK 1.6.7 was released for QCS6490-based platforms only — there are no VOXL 2, VOXL 2 Mini, or VRX artifacts for this release. Other platforms should use SDK 1.6.6. ## SDK 1.6.7 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | qcs6490_SDK_1.6.7.tar.gz | c87495c89561759b2fd83e781c045429 | ## SDK 1.6.7 Package List Release date: July 31, 2026 Changes from SDK-1.6.6: | Package | Version | |---------|---------| | qcs6490 system image | qcs6490-ubun24-system-image-v0.2.1-20260517-040338 --> v0.2.2-20260729-200621 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) (FPV build) | 1.14.0-8.145.4 --> 1.14.0-8.148.0 | | voxl-vtx | 2.2.39 --> 2.2.42 | ## SDK 1.6.7 Full Changelog (from SDK 1.6.6) ``` qcs6490 system image (v0.2.1 to v0.2.2) * fix qcs6490 crash/reboot issue voxl-fpv-px4 (1.14.0-8.145.4 to 1.14.0-8.148.0) * Update mag driver for publishing consistency across axis and publish rate * Update ESC publishing for more frequent battery current data * Improved Mag Current Comp performance * Increase gravity innovation in ekf2 to prevent gravity-aid lockout during aggressive maneuvers * Fix Hexagon compiler NaN comparison issues in math library * Changed VOXL ESC GPIO control from AUX channels to RC channels set by new parameters * Changed parameter GPS_SAT_INFO default to 1 voxl-vtx (2.2.39 to 2.2.42) * fix rc toggle issue for d0008-v4 * Fix race condition for checking kernel modules in enable vtx script * Add fast calibration option * Update default calibration file ``` # SDK 1.6.6 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.6` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.6) — the exact package set pinned for this release. ## SDK 1.6.6 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.6.tar.gz | 29e2a29134c3a3bfde20e12781990428 | | voxl2-mini_SDK_1.6.6.tar.gz | 5e412872759cca0c5252aa02c29b31ef | | ubun2.0-multi_SDK_1.6.6.tar.gz | 2a960bc5ab48ea56c0fb4e354e7a8f57 | | qcs6490_SDK_1.6.6.tar.gz | 379465c800c896b5d172ffd037d6a077 | ## SDK 1.6.6 Package List Release date: July 10, 2026 Package list and changes from SDK-1.6.4 to SDK-1.6.6. This range includes SDK 1.6.5 (June 11, 2026), a small targeted release — primarily D0020-4-V6 support — that does not have its own section: | Package | Version | |---------|---------| | libslpi-link | 1.0.1 --> 1.0.2 | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.5 --> 0.1.1 | | modalai-adsp | 1.0.6 --> 1.0.8 | | modalai-adsp-vrx | 1.0.0 (new) | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.25 --> 2.2.29 | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.1.23 --> 1.1.35 | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 1.1.6 --> 1.1.7 | | voxl-focus-camera | 0.6.1 --> 0.6.2 | | voxl-io-server | 0.1.1 --> 0.1.3 | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.4.0 --> 1.4.1 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.2.4 --> 1.2.5 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.4.7 --> 0.4.12 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) (FPV build) | 1.14.0-8.145.2 --> 1.14.0-8.145.4 | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.9.13 --> 0.9.15 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 2.0.4 --> 2.0.5 | | voxl-vtx | 2.2.27 --> 2.2.39 | ## SDK 1.6.6 Full Changelog (from SDK 1.6.4) ``` libslpi-link (1.0.1 to 1.0.2) * Initial support for M0197 libvoxl-codec (0.0.5 to 0.1.1) * [V4L2] Add ROI control mode * [ROI] Factor in base QP that FW reports into the rate controller + expose more params for QP bias behavior * change limits for ROI * Rename lowPower field in encoder config to en_max_quality * [V4L2] Fix decoder session ending in ERROR state by waiting for V4L2_EVENT_EOS before reconfiguring the CAPTURE port on SOURCE_CHANGE * [OMX] Establish parity from camera server implementation modalai-adsp (1.0.6 to 1.0.8) * Disable USB-C Power Delivery (PD) feature to make USB-C more reliable * Reenabled full ADSP reset instead of just PD reset * Gracefully remove the timer tick stream on kill * Gracefully remove the interrupt stream on kill to release the GPIO IRQ * Added i2c bus uninitialization to slpi_link as well * Added a graceful de-registration of all UARTs in use by the flight controller when a kill command comes in * Take mutex for each open serial port in reset to make sure no more config / writes can occur in flight controller * Bring slpi_link up to flight_controller functionality modalai-adsp-vrx (new, 1.0.0) * VRX-specific modalai-adsp package with PD enabled voxl-camera-server (2.2.25 to 2.2.29) * new cam configs 61-64 for D0008 V6 * add C61 camera config * adjust imx664 fpv default zoom * Add bps field to info json for encoded streams voxl-configurator (1.1.23 to 1.1.35) * add some more modem types * Require baro TC for D20, since we are falling back to onboard ICP for the QRB based version * require baro temp cal on D0020-4 (qrb5165) but not D0020-9 (qcs6490) * change the mag cal check to parse for an offset value so a completed cal is detected and device id preserves params * add XSL support * start D0008-V6 support * update required camera cals for V6 seekers * update S0001 default to T10 * update from tmobile to usmobile * add handling for modalai-adsp-vrx * fix voxl-rc-server / voxl-elrs clash * add voxl-io-server support for ip fallback * add lepton profile to vtx config when lepton is enabled * don't require lepton cal on XS drones * fix lepton_enable being added to vtx config on XS drones voxl-elrs (1.1.6 to 1.1.7) * add custom domain support * update micro bright LED config voxl-focus-camera (0.6.1 to 0.6.2) * remove bounding box rectangle * fixed bug that resulted in grabbing more of the image than is necessary before masking on low zoom * now using bounding boxes for cropping in case the user rotates the target the wrong way * variety of bug fixes in how we go back and forth from the image used for chessboard detection to the full resolution image voxl-io-server (0.1.1 to 0.1.3) * add qcs6490 support * add micro bright support voxl-lepton-server (1.4.0 to 1.4.1) * Force rebuild to use new libvoxl-codec voxl-modem (1.2.4 to 1.2.5) * lte bootup and connection hardening voxl-osd (0.4.7 to 0.4.12) * add more failsafe options * Add Failsafe menu to configure connection loss behavior via OSD menu * Fix math error in distance to home calculation * Support more channels via OSD menu * Introduced ALT HOLD (FAST/MED/SLOW) flight modes into flight mode menu * refactor menu system back-end voxl-fpv-px4 (1.14.0-8.145.2 to 1.14.0-8.145.4) * Revert mag fault flag auto recovery update from 1.14.0-8.142.1 * Add second i2c bus on apps proc for external DPS baro on M0226 board voxl-px4-params (0.9.13 to 0.9.15) * add new rc loadout man, alt, alt * write the device ID that gets set identically every time a mag cal is run, so that the mag cal does not wipe mag params * starting point for D0008 V6 * disable COM_FAIL_ACT_T for FPV drones voxl-utils (2.0.4 to 2.0.5) * static-ip-watcher doesn't touch routing in order to prevent conflict with voxl-modem voxl-vtx (2.2.27 to 2.2.39) * break out --enable_rc_deadman into its own arg * Fix 4-byte heap overflow when saving H.265 VPS RTP packet * Add MavFTP functionality and improved atak mavlink reliability * Make RC deadman behavior only work after being previously armed * Update default freq for tower * Add RF/IP video link fallback * Enable max power for d0008_v5s, d0020s * Include a default calibration to application for case when calibration files are missing * Bidirectional mavlink communication between ATAK and spire/hub setup * update enable script * refactor voxl-configure-vtx/vrx * add snr, noise floor, packet loss to inspect tool * add config option to include lepton vtx profile * add rc_switch_profiles config option to explicitly set the profiles cycled by the RC toggle switch voxl-suite (meta package) * fix modalai-adsp / modalai-adsp-vrx package conflict by blacklisting modalai-adsp-vrx on SDK install ``` # SDK 1.6.4 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.4` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.4) — the exact package set pinned for this release. ## SDK 1.6.4 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.4.tar.gz | e15106ee03eb7a67748520c740f8e5d7 | | voxl2-mini_SDK_1.6.4.tar.gz | 12c726bed8e72d68ec489533e15ba9ef | | ubun2.0-multi_SDK_1.6.4.tar.gz | e60711c0693dd6bc93ff2fc1732cdb02 | | qcs6490_SDK_1.6.4.tar.gz | be02fdcdab6f5a0b470d204819db77ce | ## SDK 1.6.4 Package List Release date: June 8, 2026 SDK 1.6.4 is the first release that also produces a QCS6490 platform artifact. System images updated to 1.8.08 (VOXL 2 family, kernel module fix for a 2.4 GHz power issue) and 2.0.2-perf-20260325 (VRX). Package list and changes from SDK-1.6.3 to SDK-1.6.4: | Package | Version | |---------|---------| | libfc-sensor | 1.0.9 --> 1.0.12 | | libmodal-cv | 0.6.0 --> 0.6.1 | | libmodal-exposure | removed (deprecated) | | libmodal-flow | 1.0.3 --> 1.0.5 | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.14.11 --> 2.14.12 | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.2 --> 0.0.5 | | modalai-adsp | 1.0.5 --> 1.0.6 | | modalai-slpi | 1.2.2 --> 1.2.3 | | voxl-bind-spektrum | removed (deprecated) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.6.1 --> 0.6.2 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.19 --> 2.2.25 | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.1.5 --> 1.1.23 | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 1.1.0 --> 1.1.6 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.7 --> 1.6.3 | | voxl-esptool | 0.2.0 --> 0.2.1 | | voxl-focus-camera | 0.6.1 (new) | | [voxl-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.2.3 --> 2.0.2 | | voxl-io-server | 0.0.8 --> 0.1.1 | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 --> 1.4.0 | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.6.1 --> 0.6.3 | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.6.0 --> 0.6.1 | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.14 --> 1.4.16 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.2.3 --> 1.2.4 | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.5.6 --> 1.5.8 | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.6.0 --> 0.6.2 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.3.8 --> 0.4.7 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.8.7 --> 0.9.4 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.133 --> 1.14.0-2.0.142 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) (FPV build) | 1.14.0-8.133.0 --> 1.14.0-8.145.2 | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.9.0 --> 0.9.13 | | voxl-rc-server | 0.0.5 (new) | | voxl-reset-slpi | 0.0.1 --> 0.0.4 | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.8.0 --> 0.8.1 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 2.0.2 --> 2.0.4 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 --> 0.1.8 | | voxl-vtx | 2.0.2 --> 2.2.27 | ## SDK 1.6.4 Full Changelog (from SDK 1.6.3) ``` libfc-sensor (1.0.9 to 1.0.12) * Added fc_sensor_reset_dsp() to kill the DSP and wait for recovery * Improved fc_sensor_reset_dsp() to make it more reliable libmodal-cv (0.6.0 to 0.6.1) * remove fastcv header * qcs6490 support libmodal-flow (1.0.3 to 1.0.5) * teardown fixed for qcs6490 * kcf-follow added KLT cross check, fix FAST scale on float img + pyramid event waits * Add CPU KCF tracker + live & offline runners * embed opencl kernels in .so, drop .cl from install libmodal-pipe (2.14.11 to 2.14.12) * add support for 32-bit ION clients on qrb5165 * add vqf_data_t interface libvoxl-codec (0.0.2 to 0.0.5) * [V4L2] Set encoder to power save mode to reduce latency * [V4L2] Fix decoder green bar artifact bug during DRC * [V4L2] Fix decoder QBUF failure for small resolutions by allocating V4L2 DMA buffers at DPB dimensions * [V4L2] fix decoded output stride/scanline mismatch with hardware alignment * [V4L2] Add encoder intra refresh period type controls * [V4L2] Enable encoder loop filter * [V4L2] Enable decoder low latency control * improve test-voxl-decoder to handle dynamic resolution and codec changes modalai-adsp (1.0.5 to 1.0.6) * added a ping server modalai-slpi (1.2.2 to 1.2.3) * added a ping server voxl-camera-calibration (0.6.1 to 0.6.2) * qcs6490 support voxl-camera-server (2.2.19 to 2.2.25) * include VUI info in SPS packet for FPS info * use a dedicated buffer for stride adjustment of raw images * clean up misp frame size lookup * re-enable loading camera intrinsics even if eis is disabled * fix misp look-at logic for eis * add ion buffer output option for misp yuv frame * fix dynamic fpv logic for misp channels * add option to lock white balance gains * enable normalized stream for imx412 and imx664 * exposure refactor * add C60 camera config for D0020-V6 * add new misp resolution 1456x1088 * lower gamma from 1.6 to 1.2 for imx412 and imx466 fpv cams * add qcs6490 support * update low latency misp resolution for qcs6490 * add more resolutions to misp * fix snapshot buffer handling * allow isp snapshot with misp voxl-configurator (1.1.5 to 1.1.23) * update mvx skus * update dtc handling * X3 support * support for D0012-V3 and D0012-V4 * disable lepton for C50 drones * start D0020 V6 setup * enable voxl-streamer for R0002 * add support for D0020 vtx config * add XS support * fix H0001 logic * update voxl-osd conf for T0002 * fix D0020-V6 / XS px4 param load logic * add handling for new voxl-osd configs * update voxl-vtx config to handle X2 * add tf-m0197 support * update required cal files for various platforms * add static ip to M0197 test fixture * remove case-sensitivity on -X selection * for mag cal check, check the file for a calibration ID voxl-elrs (1.1.0 to 1.1.6) * update ELRS to 3.5.3.23 which fixes teamrace bugs * add default.json config to clear team race on configure * split default teamrace preset into per-receiver-type files to fix T7 field_id mismatch * add failsafe detection API and CLI command * fix SLPI backend compile definition missing from voxl-elrs executable * fix pipe client to use next available channel * remove virtual root special case causing duplicate params and circular ref errors in save-json output * skip live/read-only and command params in save-json and load-json * add M0193_TX firmware update support via 921600 baud and TX reboot command * add ping/enumerate/get-param/set-param support for M0193 TX * add --boot-baud for cross-flashing RX firmware with TX bootloader * scope preset SKU patterns to MRB SKUs only; warn instead of fail for unrecognized SKUs * rename: default-*-rx.json -> reset-*-teamrace.json to clarify these presets reset teamrace settings * fix setting uid with string or bytes * fix bindphrase to uid for portal * update fw releases * add new micro bright LED config voxl-esc (1.5.7 to 1.6.3) * new params for custom 2204 1500kv D0012 motors * firmware 39.25 for all boards with new status led parameter * disable LEDs on starlings * qcs6490 support * fix param path for new D0012 motors * update voxl-reset-slpi calls to use -t voxl-esptool (0.2.0 to 0.2.1) * add qcs6490 support voxl-focus-camera (new, 0.6.1) * initial release * fix roi out of bounds errors; cleanup voxl-imu-server (1.2.3 to 2.0.2) * add TC calibration option for px4 imu and baro in the same temperature sweep voxl-io-server (0.0.8 to 0.1.1) * add m0216 support and test tool * enable serial intake without over-writing current M0184 config * add vtx_failsafe_gpio behavior to drive M0138 VTX reg pin low on ELRS failsafe * add X3 support voxl-lepton-server (1.3.3 to 1.4.0) * support for toggling clock signal on M0216 and M0226 voxl-logger (0.6.1 to 0.6.3) * add qcs6490 support * update -j args defaults voxl-mavcam-manager (0.6.0 to 0.6.1) * add qcs6490 support voxl-mavlink-server (1.4.14 to 1.4.16) * mavlink missions via cli * ability to use current 3d lock position as rally point * added initializers to mavlink items to prevent uninitialized variable compiler warnings * added a filter to prevent mavlink messages with non-autopilot component ids from going to the autopilot voxl-modem (1.2.3 to 1.2.4) * update dtc options voxl-mpa-tools (1.5.6 to 1.5.8) * update stinger extrinsics to include imu_apps to hires * add exit statuses * Update C++ standard from C++11 to C++17 voxl-open-vins-server (0.6.0 to 0.6.2) * add qcs6490 support * read and save imu model info * fix ang vel bug * fix feature point positions when using anchored MSCKF inverse depth * tighten init gravity max angle voxl-osd (0.3.8 to 0.4.7) * remove dependency on px4 running * add craft name osd element * add team race and pit mode via rc switch support for external fc * update external_fc to support stand-alone gen 2 vtx * flight mode menu: removed stabilized flight mode, removed 3D hold (gps) & auto_mission flight modes if no gps * add compass header * compass tweaks voxl-portal (0.8.7 to 0.9.4) * do not display sats with snr=0 in gps debug view * sort gps sat info by snr, per constellation, with dynamic plot resize * eis integration and cleanup * allow fine control on elrs page * elrs: add config save/load and improve apply confirmation modal * elrs: add preset details modal, SKU label, and Reset to SKU Defaults button * elrs: fetch presets based on sku, read SKU from sku.txt on backend * add dedicated thermal calibration page for imu and baro in one thermal sweep * add vibration warning, and param sanity check for thermal calibration * update thermal cal UI to use PX4 native TC params * move bind phrase to command bar and allow string input * add script to launch voxl-portal over adb on windows * fix param value handler, flight mode display, and mag cal voxl-px4 (1.14.0-2.0.133 to 1.14.0-2.0.142) * Added new RTL mode to safe point only. Home position will not be chosen. * Always start rc_update module for EXTERNAL RC with Mavlink MANUAL_CONTROL * Added option to start ina226 or ina228 power monitor drivers * Added ina226 and ina228 device drivers * Added i2c uninitialize on probe failure to free up port * Added i2cdetect system command to slpi build * Add proper support for SDLOG_MODE parameter * Added Teseo GPS driver support with BMM150-based auto-detection * Teseo LIV3 driver: Update GAL PRN and BDS ranges * Added the teseo GPS start logic to the M0197 platform * Add sensor_imu_raw_bridge for IMU temperature calibration * Add code to detect ModalAI ELRS reboots voxl-fpv-px4 (1.14.0-8.133.0 to 1.14.0-8.145.2) * all voxl-px4 changes above, plus: * Added SIH simulator and SIH to VIO bridge * Added DSP DPS368 barometer detection to start script * Added bmm150 magnetometer driver to build and start script * Disable baro thermal cal if the DPS baro is detected/used * Add mag full rate logging to debug topics * Fix fence points QGC upload * initial attempt at adding optional throttle accel slew limit to prevent killing motors suddenly on hard throttle-down * Added satellite_info logging to default topics voxl-px4-params (0.9.0 to 0.9.13) * v1.17 params * D0013-V3 params and alt mode speed update * D0020 V6 tune, acro tune, and mag current compensation params * add COM_POS_FS_EPH needed for RTL * split failsafe and flight mode params for XS drones * add parameters_imu_tc.cal to CAL_PARAM_FILES * add M0224 universal param set * zero out the GND effect DZ param for M0224 users * Turn off Barometer deadzone for FPV drones * add FGLT_ACC_LIM_UP FGLT_ACC_LIM_DN accel limits to D0020 altitude flight mode voxl-rc-server (new, 0.0.5) * initial release * add qcs6490 support voxl-reset-slpi (0.0.1 to 0.0.4) * add qcs6490 support * Added optional timeout to wait for DSP to complete the reset * Updated dependency to more reliable libfc-sensor voxl-streamer (0.8.0 to 0.8.1) * add qcs6490 support voxl-utils (2.0.2 to 2.0.4) * static-ip-watcher for dgcs pilot, tower, and dtc * remove factory_enable_fiber * fix static-ip-watcher config for tower voxl-uvc-server (0.1.7 to 0.1.8) * Add support for encoded output voxl-vtx (2.0.2 to 2.2.27) * Add support for ELRS team race * Add zoom via RC channel/switch functionality, enabled by default on ch 12 * Video streams now record to MP4 instead of h265 * Add MavFTP functionality (added in later revs, see 1.6.6) * Add USB Boson support to configuration tool * Add nadir crosshairs for lepton stream * Add SNR and noise floor to debug OSD * Add osd control (on/off) control pipe command * Improve OSD text and icon border rendering technique * Fix FPS drops on QCS6490 @ 60 FPS * Enable GPU perf mode on QCS6490 * Fix 2.4GHz packet injection errors * Apply and check for new RF front end configuration * Add control pipe to voxl-vrx * Scale bounding boxes based on rendered video resolution * Send MOUNT_ORIENTATION MAVLink message * Fix wayland fd leak when no display connected * Update DGCS Pilot VRX config to enable MPEG-TS stream * Send link info from tower to pilot vrx * update link stats message, average SNR * Improved display disconnect/reconnect logic * Add sharpen filter during yuv to rgb conversion * fix ATAK video routing config * Fix camera switch retain last hires camera edge case * make Pit mode icon location adjustable * update vtx enable/disable scripts to handle new default driver * fix platform detection on voxl2-mini * Optimize USM shader * always display zoom level on OSD, require zoom RC channel reset on power cycle * Fix MTU issue for IP use case * Update ai detection src camera dims fetch for object_tracker_meta use case * Add disable transmission control pipe command * Enable more frequencies ``` # SDK 1.6.3 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.3` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.3) — the exact package set pinned for this release. ## SDK 1.6.3 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.3.tar.gz | 47042164dc24b673ddb2e7f5d6d4e5ec | | voxl2-mini_SDK_1.6.3.tar.gz | 37c93636de4953203c30abaa35eb048b | | ubun2.0-multi_SDK_1.6.3.tar.gz | b3ea20ec39ad706825a48496d4866837 | ## SDK 1.6.3 Package List Release date: February 6, 2026 Package list and changes from SDK-1.6.2 to SDK-1.6.3 | Package | Version | |-----------------------------------------------------------------------------------------------------------|---------------------------------| | libfc-sensor | 1.0.8 --> 1.0.9 | | libmodal-cv | 0.6.0 (unchanged) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | libmodal-flow | 1.0.3 (unchanged) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.7 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.8 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.14.8 --> 2.14.11 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 --> 0.6.3 | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.6 (unchanged) | | libslpi-link | 1.0.1 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 --> 0.3.3 | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.1 --> 0.0.2 | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.6 (unchanged) | | modalai-slpi | 1.2.2 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | 0.2.2 (unchanged) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.6 (unchanged) | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.17.2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.6.1 (unchanged) | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.17 --> 2.2.19 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 --> 2:2.0.0-2 | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.9 --> 1.1.5 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.7.4 --> 0.7.7 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-eigen3](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-eigen3) | 3.4.0 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.9 --> 1.1.0 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.7 (unchanged) | | voxl-esptool | 0.2.0 (unchanged) | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | [voxl-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.2.3 --> 2.0.1 | | voxl-io-server | 0.0.6 --> 0.0.8 | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-joystick-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-joystick-server) | 0.0.12 --> 0.1.2 | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgeographic](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgeographic) | 1.0.0 (unchanged) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libnanotrack](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libnanotrack) | 0.1.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.6.0 --> 0.6.1 | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 --> 0.2.4 | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.6.0 (unchanged) | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.6 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.12 --> 1.4.14 | | [voxl-microdds-agent](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-microdds-agent) | 3.0.0-0 (unchanged) | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.2.2 --> 1.2.3 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 --> 7.19.0 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.5.5 --> 1.5.6 | | [voxl-nano-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-nano-tracker) | 0.1.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 --> 2.5.0-5 | | voxl-open-vins | 0.4.19 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.5.7 --> 0.6.0 | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.2.1 --> 0.3.8 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.8.4 --> 0.8.7 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.124 -->1.14.0-2.0.133| | voxl-fpv-px4 | 1.14.0-8.133.0 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.8.10 --> 0.9.0 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.2 --> 1.2.3 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 --> 0.0.6 | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.8.0 (unchanged) | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.5 --> 0.1.0 | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.5.0 --> 0.5.1 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.9 --> 2.0.2 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.9.9 --> 1.9.21 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.7.6 --> 2.0.2 | | voxl-wavemux | 0.0.3 (unchanged) | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.6.3 Full Changelog (from SDK 1.6.2) ``` libfc-sensor (1.0.8 to 1.0.9) 1.0.9 * add support for qcs6490 libmodal-pipe (2.14.8 to 2.14.11) 2.14.11 * Updated VFC flight mode names on OSD to be more informative to reader 2.14.10 * Add offboard_log_t 2.14.9 * new crsf_raw_data_t type 2.14.8 * add more robust ion buffer client tracking libvoxl-cci-direct (0.3.2 -> 0.3.3) 0.3.3 * add CI job for qrb5165-2 libqrb5165-io (0.5.0 to 0.6.3) 0.6.3 * fix ci 0.6.2 * Enable M0198 GPIOs 0.6.1 * Add PI4IO Driver for qcs6490 0.6.0 * Starting to build for qcs6490 * new voxl_spi_read_reg_bmi function libvoxl-codec (0.0.1 to 0.0.2) 0.0.2 * add rotation param for encoder metadata tracking * add setframerate method to encoders * cleanup warnings, versions, and file locations voxl-camera-server (2.2.17 to 2.2.19) 2.2.19 * add C50 and C51 configs 2.2.18 * fix compiler warnings * update fpv default gamma settings * fix boson buffer pre-alloc size voxl-ceres-solver (2:1.14.0-10 to 2:2.0.0-2) 2:2.0.0-2 * move to new cross 2:2.0.0-1 * upgrade to upstream 2.0.0, building without patches * enabled blas and lapack * building in cross-4.3 voxl-configurator (1.0.9 to 1.1.5) 1.1.5 * enable IO server by default on D0020 1.1.4 * fix package manager issue 1.1.3 * update D0011 modem support 1.1.2 * fix inadvertant voxl-elrs call for GHST configs * fix voxl-joysticker-server configuration 1.1.1 * add joystick configure for fiber drones * update joystick flags * cleanup configure sku wizard * update D0008-V4 vvhub config 1.1.0 * initial support for m0197 vtx vrx * cleaner prompts in configure sku wizard voxl-cpu-monitor (0.7.4 to 0.7.7) 0.7.7 * cleanup and robustness 0.7.6 * dynamically detect thermal zones on start based on known zone type 0.7.5 * migrate en_auto_pitmode json field in config to boolean * update thermal zones for m0197 voxl-elrs (0.4.9 to 1.1.0) 1.1.0 * betafpv config updates 1.0.9 * fix changelog again 1.0.8 * fix changelog formatting 1.0.7 * libelrs add write_channel_value * correct crsf_protocol address bytes 1.0.6 * use get-params-hash at the end of enumerate * add get-params-hash cmd and function 1.0.5 * elrs_mpa wait for pipe on bootup instead of giving nondescript error * elrs configure move invalid config error from voxl_json to voxl-crsf * voxl-elrs configure fail if config is wrong and reduce timeouts * firmware update only stop px4 if required * reduce verbose logging * config: fix lights order, OFF, IR, OVERT * fix configure function not working when update required 1.0.4 * config: stinger fix LED&IR PWM map values * config: seeker remove disconnected pin4 1.0.3 * 3.5.3.21 firmware * fix STR_MAP_MODES * fix TEXT_SELECTION 1.0.2 * Remove --force flag, use --target to bypass version checks * Standardize update/configure commands with explicit --target/--sku flags * Filter TX variants from firmware listings (RX-only) * Display available targets when device detection fails * Improve console output formatting 1.0.1 * Provide option to specify channel for MPA 1.0.0 * Libelrs initial version * Supports linux serial, slpi uart, and px4 uorb backends * Supports CRSF parameter interface * Supports firmware updates through xmodem bootloader or esptool * Supports presets based on regex for sku * Overhauled cli * Removed tui * Overhauled preset interface * 3.5.3.20 firmware voxl-imu-server (1.2.3 to 2.0.1) 2.0.1 * refactor thermal cal 2.0.0 * bmi270 working on M0197 * rename to voxl-imu-server voxl-io-server (0.0.6 to 0.0.8) 0.0.8 * fix joystick confliction with rf by stop using rc_state to send button_value * disarm and rearm elrs pwms on joystick loss/reconnect 0.0.7 voxl-joystick-server (0.0.12 to 0.1.2) 0.1.2 * clear state on re-connect 0.1.1 * add fiber support 0.1.0 * Remove deprecated functionality voxl-logger (0.6.0 to 0.6.1) 0.6.1 * add voxl-convert-cal voxl-mapper (0.2.2 to 0.2.4) 0.2.4 * disbale qrb5165-2 build for now until it can be tested * migrate to cross 4.4 0.2.3 * enable qrb5165-2 build voxl-mavlink-server (1.4.12 to 1.4.14) 1.4.14 * set default udp_mtu to 512 1.4.13 * fix compiler warnings * add qcs6490 support * add config items for primary and secondary gcs ports voxl-modem (1.2.2 to 1.2.3) 1.2.3 * add voxl-inspect-modem-5g voxl-mongoose (7.7.0-2 to 7.19.0) 7.19.0 * mongoose upgrade to version 7.19 voxl-mpa-tools (1.5.5 to 1.5.6) 1.5.6 * put voxl-inspect-cam-ascii back in for qcs6490 to test opencv linking voxl-nlopt (2.5.0-4 to 2.5.0-5) 2.5.0-5 * qrb5165-2 voxl-open-vins-server (0.5.7 to 0.6.0) 0.6.0 * changes for customizable quality gates - D0008-V4 voxl-osd (0.2.1 to 0.3.8) 0.3.8 * OSD will display true VFC flight mode instead of "OFFBOARD" 0.3.7 * Updated PX4 flight mode names on OSD to be more informative to reader 0.3.6 * Basic OSD functionality is operational over joystick server 0.3.5 * Update some OSD element default locations 0.3.4 * Lower throttle to arm (manual/acro) is functional over through wifi over joystick server 0.3.3 * Update control file depends for QCS6490 0.3.2 * Removed unused flight modes from osd menu 0.3.1 * Updated Betaflight support: Stream switching via RC switch, disable flight modes menu, populate RC channels menu 0.3.0 * Add QCS6490 support 0.2.4 0.2.3 * Flight mode instantly updates upon save and exit from OSD flight mode menu 0.2.2 * Use OSD to customize which toggles correspond with certain flight modes on the controllers flight mode switch voxl-portal (0.8.4 to 0.8.7) 0.8.7 * build for qcs6490 * stop spamming error messages if mavlink-server is not running 0.8.6 * new ELRS page 0.8.5 * voxl-nano-track commands with new camera viewpoint voxl-px4 (1.14.0-2.0.124 to 1.14.0-2.0.133) 1.14.0-2.0.133 * Added support for ST IIS2MDC Magnetometer 1.14.0-2.0.132 * Optimize commander worker thread to persist between tasks (prevent qcs6490 calibration failure) * Fix memory leaks and threading bugs in QURT tasks 1.14.0-2.0.131 * Added support for M0197 (qcs6490) 1.14.0-2.0.130 * vehicle_local_position bridge: Set all unused fields to NaN 1.14.0-2.0.129 * crsf_bridge: fix allowing multiple simultaneous control packets in one callback 1.14.0-2.0.128 * Added vehicle local position data export via uORB to MPA bridge 1.14.0-2.0.127 * Fixed flight core build error 1.14.0-2.0.126 * Added a power status message received count to the voxl_esc driver for extra debug 1.14.0-2.0.125 * CRSF raw processing improvements voxl-px4-params (0.8.10 to 0.9.0) 0.9.0 * update params for fiber use-case voxl-qvio-server (1.2.2 to 1.2.3) 1.2.3 * auto trim the _ion suffix from new viocam config file voxl-state-estimator (0.0.5 to 0.0.6) 0.0.6 * fix memleaks due to unfreed rc_vector and rc_matrix instances voxl-tag-detector (0.0.5 to 0.1.0) 0.1.0 * support remaining tag families * fully migrate to cross 4.4 * remove libvoxl-cutils as dependency * set config file to read tracking_front and tracking_down by default voxl-tflite-server (0.5.0 to 0.5.1) 0.5.1 * LOTS of bug fixes and stability improvements voxl-utils (1.4.9 to 2.0.2) 2.0.2 * multiple interface support for voxl-static-ip-watcher * update interface detection * fix fomatting bug in voxl-inspect-services 2.0.1 * new voxl-dma-latency service 2.0.0 * initial support for qcs6490 * replace now-deprecated qrb5165-system-tweaks * voxl-my-ip now lists all ipv4 addresses and their interfaces * support for wifi insterfaces with arbitrary names, not just wlan0 * new voxl-serial utility * support for concurrent station/softap on M0213 * woxl-wifi feature to turn on and off usb0 network interface voxl-vision-hub (1.9.9 to 1.9.21) 1.9.21 * separate D0008-V4 and V5 - qmin * ext_vfc_data_t add-on * remove offboard_log struct * add vfc conf files 1.9.20 * switch activation for (yaw) tracking. 1.9.19 * new vfc altitude controller * disable hover thrust estimate for now * now wait in vfc-alt mode while waiting for VIO to be ready to pos * braking zone for alt -> pos transition 1.9.18 * vfc fix thrust setpoint during position transition 1.9.17 * Changes to VIO PID/PD D0008/D0013 1.9.16 * decrease D XY term to reduce roll bouncing * D0013 increase Z authority, reduce roll ringing 1.9.15 * large vertical displacements causing backtrack discontinuity 1.9.14 * remove vfc position mode arming, takeoff assist and PX4 overrides 1.9.13 * reduce q_min for flow_back vio configs * add HITL support for VFC flow flight mode * clean up compiler warnings 1.9.12 * d0013 more aggressive tune * move state manager to new MPA HITL VIO server when in HITL mode 1.9.11 * fix typo in status message * fix backtrack restore after leaving backtrack mode when roll/pitch is idle voxl-vtx (1.7.6 to 2.0.2) 2.0.2 * Add rebroadcast encoded video in MPEG-TS format 2.0.1 * Add retransmission via IP (UDP) 2.0.0 * Add support for QCS6490 * Integration of libvoxl-codec * enable invert_toggle by default on boson profile 1.8.6 * Update weston config files 1.8.5 * Add blackout mode * Update some VRX OSD element locations * Add OSD disable via RC (non-Betaflight) 1.8.4 * Reopen socket for ATAK/UAS Tool on bad file descriptor 1.8.3 * Update Betaflight support: OSD Disable 1.8.2 * Update Betaflight support: stream switching via RC switch 1.8.1 * Add vtx and vrx configuration script helpers for fiber use case 1.8.0 * Add ulog logging on VRX * Update efuse script efuse set failure rather than error 1.7.8 * Add support for nanotracker, configurable ai detectiond data source per profile 1.7.7 * Add initial bi-directional communication * Add support for mission uploads via ATAK ``` # SDK 1.6.2 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.2` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.2) — the exact package set pinned for this release. ## SDK 1.6.2 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.2.tar.gz | d6fd51843b8a73ed610220acddf89076 | | voxl2-mini_SDK_1.6.2.tar.gz | a278f7b5937f2a0f0e71298507073f32 | | ubun2.0-multi_SDK_1.6.2.tar.gz | 28c5bb314f62eaff7fa9ea62d38f9b70 | ## SDK 1.6.2 Package List Release date: November 14, 2025 Package list and changes from SDK-1.6.1 to SDK-1.6.2 | Package | Version | |-----------------------------------------------------------------------------------------------------------|---------------------------------| | libfc-sensor | 1.0.8 (unchanged) | | libmodal-cv | 0.6.0 (unchanged) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | libmodal-flow | 1.0.3 (unchanged) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.7 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.8 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.14.8 (unchanged) | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 (unchanged) | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.6 (unchanged) | | libslpi-link | 1.0.1 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 (unchanged) | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.1 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.6 (unchanged) | | modalai-slpi | 1.2.2 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.2.3 (unchanged) | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | 0.2.2 (unchanged) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.6 (unchanged) | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.8 (unchanged) | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.17.2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.6.1 (unchanged) | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.17 (unchanged) | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.9 (unchanged) | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.7.4 (unchanged) | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.9 (unchanged) | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.7 (unchanged) | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.6 (unchanged) | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-joystick-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-joystick-server) | 0.0.12 (unchanged) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgeographic](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgeographic) | 1.0.0 (unchanged) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.6.0 (unchanged) | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.6.0 (unchanged) | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.6 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.12 (unchanged) | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.2.2 (unchanged) | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.5.4 --> 1.5.5 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | voxl-open-vins | 0.4.19 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.5.6 --> 0.5.7 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.2.1 (unchanged) | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.8.4 (unchanged) | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.124 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.8.10 (unchanged) | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.2 (unchanged) | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 (unchanged) | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.8.0 (unchanged) | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.5 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.5.0 (unchanged) | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.9 (unchanged) | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.9.9 (unchanged) | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.7.6 (unchanged) | | voxl-wavemux | 0.0.3 (unchanged) | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.6.2 Full Changelog (from SDK 1.6.1) ``` voxl-mpa-tools (1.5.4 to 1.5.5) 1.5.5 * make starling2 2-cam default voxl-open-vins-server (0.5.6 to 0.5.7) 0.5.7 * change for arming in px4 mpc pos * debug fix for jerk+qual compliance * qual only reports cep in init if zup occured ``` # SDK 1.6.1 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.1` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.1) — the exact package set pinned for this release. ## SDK 1.6.1 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.1.tar.gz | 7cce5a96877c95ac835ebe27a17382f7 | | voxl2-mini_SDK_1.6.1.tar.gz | f65a287db6d5c048ee9de6695c6a0b57 | | ubun2.0-multi_SDK_1.6.1.tar.gz | e285a60224e059e1e3ad02f1dfb224ca | ## SDK 1.6.1 Package List Release date: November 8, 2025 Package list and changes from SDK-1.6.0 to SDK-1.6.1 | Package | Version | |-----------------------------------------------------------------------------------------------------------|---------------------------------| | libfc-sensor | 1.0.8 (unchanged) | | libmodal-cv | 0.6.0 (unchanged) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | libmodal-flow | 1.0.3 (unchanged) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.7 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.8 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.14.8 (unchanged) | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 (unchanged) | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.6 (unchanged) | | libslpi-link | 1.0.1 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 (unchanged) | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.1 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.6 (unchanged) | | modalai-slpi | 1.2.2 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.2.3 (unchanged) | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | 0.2.2 (unchanged) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.6 (unchanged) | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.8 (unchanged) | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.17.2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.6.1 (unchanged) | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.16 --> 2.2.17 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.8 --> 1.0.9 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.7.4 (unchanged) | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.9 (unchanged) | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.7 (unchanged) | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.6 (unchanged) | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-joystick-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-joystick-server) | 0.0.12 (unchanged) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgeographic](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgeographic) | 1.0.0 (unchanged) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.6.0 (unchanged) | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.6.0 (unchanged) | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.6 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.12 (unchanged) | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.2.1 --> 1.2.2 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.5.3 --> 1.5.4 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | voxl-open-vins | 0.4.19 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.5.6 (unchanged) | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.2.0 --> 0.2.1 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.8.4 (unchanged) | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.121 -->1.14.0-2.0.124| | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.8.9 --> 0.8.10 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.2 (unchanged) | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 (unchanged) | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.8.0 (unchanged) | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.5 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.5.0 (unchanged) | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.9 (unchanged) | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.9.9 (unchanged) | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.7.1 --> 1.7.6 | | voxl-wavemux | 0.0.3 (unchanged) | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.6.1 Full Changelog (from SDK 1.6.0) ``` voxl-camera-server (2.2.16 to 2.2.17) 2.2.17 * Remove unused OSD code * add option to rotate AR0144 encoded video * add option to invert boson output via a command * add boson 14 bit support * eis tweaks voxl-configurator (1.0.8 to 1.0.9) 1.0.9 * add D0013-V2 handling voxl-modem (1.2.1 to 1.2.2) 1.2.2 * fix quectel-CM build voxl-mpa-tools (1.5.3 to 1.5.4) 1.5.4 * add D0013 Stinger V2 extrinsic file voxl-osd (0.2.0 to 0.2.1) 0.2.1 * OSD will send a signal to VTX/VRX to start/stop debug logs voxl-px4 (1.14.0-2.0.121 to 1.14.0-2.0.124) 1.14.0-2.0.124 * Fixed hover thrust estimate backup timeout so that it won't run in addition to the normal callback 1.14.0-2.0.123 * Added CRSF raw data transfer via MPA to uORB bridge 1.14.0-2.0.122 * Added external baro device id as an option for baro temp cal * Added baro temp cal abort if data is bad (all 0s/nan) ``` # SDK 1.6.0 Package List and Changelog Meta-package: [voxl-suite `sdk-1.6.0` tag on GitLab](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.0) — the exact package set pinned for this release. ## SDK 1.6.0 MD5 Hashes | SDK | Hash | |--------------------------------|----------------------------------| | voxl2_SDK_1.6.0.tar.gz | 01e569484214fa573454e513f349947d | | voxl2-mini_SDK_1.6.0.tar.gz | c015ef52cabac2613c70bce57760f9de | | ubun2.0-multi_SDK_1.6.0.tar.gz | 78c2a8aa4ffdd2b0b4701a92c3ad60d4 | ## SDK 1.6.0 Package List Release date: November 5, 2025 Package list and changes from SDK-1.5.0 to SDK-1.6.0 | Package | Version | |-----------------------------------------------------------------------------------------------------------|---------------------------------| | libfc-sensor | 1.0.7 --> 1.0.8 | | libmodal-cv | 0.5.18 --> 0.6.0 | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | libmodal-flow | 1.0.3 (new) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.6 --> 0.2.7 | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.7 --> 0.4.8 | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.13.2 --> 2.14.8 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 (unchanged) | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.5 --> 1.4.6 | | libslpi-link | 1.0.0 --> 1.0.1 | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 (unchanged) | | [libvoxl-codec](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-codec) | 0.0.1 (new) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.5 --> 0.1.6 | | modalai-slpi | 1.2.0 --> 1.2.2 | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.1.3 --> 1.2.3 | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | 0.2.2 (unchanged) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.5 --> 0.1.6 | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.6 --> 0.3.8 | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 --> 2.17.2 | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.6.0 --> 0.6.1 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.4 --> 2.2.9 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.2 --> 1.0.8 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.6.0 --> 0.7.4 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.7 --> 0.4.9 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.4 --> 1.5.7 | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.6 (new) | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-joystick-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-joystick-server) | 0.0.6 --> 0.0.12 | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgeographic](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgeographic) | 1.0.0 (new) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.5.3 --> 0.6.0 | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.8 --> 0.6.0 | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.5 --> 0.1.6 | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.9 --> 1.4.12 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.8 --> 1.2.1 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.4.0 --> 1.5.3 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | voxl-open-vins | 0.4.19 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.3.12 --> 0.5.6 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.1.8 --> 0.2.0 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.11 --> 0.8.4 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.105 -->1.14.0-2.0.121| | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.7.5 --> 0.8.9 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.0 --> 1.2.2 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 (unchanged) | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.5 --> 0.8.0 | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 --> 0.0.5 | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.4.1 --> 0.5.0 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.8 --> 1.4.9 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.23 --> 1.9.9 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.4.7 --> 1.7.1 | | voxl-wavemux | 0.0.3 (new) | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.6.0 Full Changelog (from SDK 1.5.0) ``` libfc-sensor (1.0.7 to 1.0.8) 1.0.8 * added a new function to directly access the SLPI MONOTONIC time libmodal-journal (0.2.6 to 0.2.7) 0.2.7 * add QCS6490 support libmodal-json (0.4.7 to 0.4.8) 0.4.8 * migrate to cross4.3 libmodal-pipe (2.13.2 to 2.14.8) 2.14.8 * add more robust ion buffer client tracking 2.14.7 * add better ion buffer release functionality 2.14.6 * new functions pipe_send_control_cmd and pipe_send_control_cmd_bytes * revert ion_buf_t size 2.14.5 * add new commands for cpu modes to cpu_stats2_t interface 2.14.4 * Add source field to ion buffer * Set format and consumerFlags fields of ion buffer * add RAW14 to list of supported formats * suppress unsupported format warning for RGBA and RAW16 2.14.3 * new functions pipe_send_control_cmd and pipe_send_control_cmd_bytes 2.14.2 * Fix for ion buffer shutdown 2.14.1 * new tool: voxl-inspect-pipe-info 2.14.0 * new timing and sleep functions * new cpu_stats2_t type 2.13.4 * Add new backtrack active field to vfc type * fix optional support of mavlink 2.13.3 * Seperate interface files, add barometer librc-math (1.4.5 to 1.4.6) 1.4.6 * add support for qcs6490 libslpi-link (1.0.0 -> 1.0.1) 1.0.1 * added ability to reset the connection libvoxl-cutils (0.1.5 to 0.1.6) 0.1.6 * add qcs6490 support modalai-slpi (1.2.0 to 1.2.2) 1.2.2 * added a new flight controller function to uninitialize an i2c port 1.2.1 * Added new flight controller UART function to check rx bytes * Added new flight controller UART function to flush rx * Increased flight controller UART rx buffer size to match slpi link qrb5165-imu-server (1.1.3 to 1.2.3) 1.2.3 * cpu thermal cal routine now disables cpu pitmode so it can get hot enough 1.2.2 * fix bug where occationally fifo would stop reading if async command from camera server stopped and started again * imu now starts reading right away instead of waiting for a client * improvements to support multiple imus 1.2.1 * add commands in for controlling calibrator through commands from portal * add new imu_apps_raw pipe so calibrators can always view raw data * "start_calibration" command is now not needed and ignored 1.2.0 * cleanup build * remove old ICM20948 driver * convert fft code to C * prepare for voxl-cross 4 build environment qrb5165-rangefinder-server (0.1.5 to 0.1.6) 0.1.6 * add m0195 config qrb5165-system-tweaks (0.3.6 to 0.3.8) 0.3.8 * voxl-static-ip-watcher cleanup 0.3.7 * add voxl-static-ip-watcher qrb5165-tflite (2.8.0-2 to 2.17.2) 2.17.2 * cleanup 2.17.1 * new op support voxl-camera-calibration (0.6.0 to 0.6.1) 0.6.1 * take cpu out of pitmode for calibration * throw a warning if user is trying to calibrate an ar0144 tracking cam without fisheye option * lock to larger cores for better performance voxl-camera-server (2.2.4 to 2.2.9) 2.2.9 * fix build issues (libmodal-pipe changes) 2.2.8 * fix h265 bitrate control 2.2.7 * remove voxl-cpu-monitor as build dependency * fix bug in camera-server-config-helper 2.2.6 * force cross 4.4 2.2.5 * add C48 * fix stereo cam pair going out of sync due to too high of an allowed discrepancy voxl-configurator (1.0.2 to 1.0.8) 1.0.8 * update D0020 elrs pwm configs 1.0.7 * fix elrs pwm settings on D0020 1.0.6 * D0020 and other vfc tunes 1.0.5 * add D0017 Shikra support * new openvins configs 1.0.4 * add D0020 basic framework 1.0.3 * update voxl-streamer config handling voxl-cpu-monitor (0.6.0 to 0.7.4) 0.7.4 * update voxl-inspect-cpu to add json one-shot logic 0.7.3 * add systemd watchdog timer function for safety * cleanup process hashmap periodically when it gets cluttered * new debug tool churn_pid.sh for stress testing 0.7.2 * new commands to set auto and perf cpu modes while enabling auto pitmode 0.7.1 * add more obvious pitmode_enable option to configurator * fix individual process cpu use being limited to 100.0 percent 0.7.0 * monitor processes with highest cpu and memory utilization * new default behavior is to have cpu in cool mode when disarmed * pipe type definitions moved out into libmodal_pipe * memory leak detection * two-stage overheat warning * cpu load is now absolute (not scaled by frequency) * new memory allocation rate monitoring * support for qcs6490 voxl-elrs (0.4.7 to 0.4.9) 0.4.9 * update firmware releases 0.4.8 * Aligned PWM configuration with fw 3.5.3.15 * Updated configurations for D0008 (and similar) voxl-esc (1.5.4 to 1.5.7) 1.5.7 * speed up D0013 stinger spinup to 200ms 1.5.6 * more D0020 Tuning * robustness improvement in M0138 firmware 1.5.5 * initial D0020 tune * lower cmd-rate in voxl-esc-calibrate.py to prevent buffer backup when running on VOXL voxl-joystick-server voxl-logger (0.5.3 to 0.6.0) 0.6.0 * update to cross 4.4 * remove old tof_data_t type support voxl-mavlink-server (1.4.9 to 1.4.12) 1.4.12 * fix for SYS_ID != 1 1.4.11 * make ci pipeline happy 1.4.10 * internal baro is published to mpa, external baro is published to px4 via mavlink voxl-mavlink (0.1.5 to 0.1.6) 0.1.6 * undo accidental mavlink submodule change * current mavlink commit hash is 5383d892c071095af3f9ad24ceb7b0fb6e18f81f voxl-modem (1.1.8 to 1.2.1) 1.2.1 * auto detect Doodle Lab modem interface from driver name 1.2.0 * add tailscale mods for startup * add lte specific voxl-configure-modem option 1.1.9 * Add support for Doodle VTX voxl-mpa-tools (1.4.0 to 1.5.3) 1.5.3 * fix voxl-inspect-imu printing 1.5.2 * re-enable vfc fallback to internal vfc-alt mode when VIO isn't ready * smooth out vfc z pid 1.5.1 * update defaults for vfc config to reflect new z controller * add -t (--test) options to various voxl-inspect tools 1.5.0 * enable secondary cam intrinsics cal file name detection 1.4.9 * name changes for D0008-V4 1.4.8 * speed up voxl-list-pipes -t * voxl-list-pipes sorts by type by default 1.4.7 * add OSD visualizer 1.4.6 * remove vfc arming 1.4.5 * decrease q_min to 2 as default * update vio_cam_configs * changes for inspecting ion stream 1.4.4 * new dependency on libmodal_pipe >1.14.0 * migrate to new modal pipe timing functions * add prints of n samples received to voxl-inspect-imu 1.4.3 * independent vfc config file 1.4.2 * builds in cross 4.1 without voxl-opencv dependency 1.4.1 * inspect-baro voxl-open-vins-server (0.3.12 to 0.5.6) 0.5.6 * bump vins version for flow API and stereo tracking * bug fix for entering zupt, when doing jerk detection * quality overhaul * modify onm dyn priors and gates 0.5.5 * change disparities and reset fix 0.5.4 * added jerk detection and atomic handling fix * fix bug in reset logic * increase feature timeout to 10s 0.5.3 * added grace timeout on vio init 0.5.2 * fix for min feature reset and first cam connect * toggle missing feature on reset * fixed reset stall and double reset from no features 0.5.1 * adjust verbosity for config script * changes for d0008-v4 double ion stream 0.0.1a * New server and OV lib with several architectural changes voxl-osd (0.1.8 to 0.2.0) 0.2.0 * Add option set OSD element color 0.1.31 * Add basic Ready/Not Ready to arm indicator * Remove status message 0.1.30 * Add turtle mode flight mode indicator 0.1.29 * Implemented ability to adjust joystick sensitivity values within OSD 0.1.28 * Removed time debounce from OSD, joystick input will now rely solely on physical debounce 0.1.27 * Update positions for some OSD elements 0.1.26 * Update default positions for some OSD elements 0.1.25 * Implemented debounce requiring joystick to return to center position before another input is registered 0.1.24 * Updates to OSD menu usability 0.1.23 * Add more cpu status stats 0.1.22 * Add MAVLink Telemetry Control via debug OSD menu 0.1.21 * Add throttle warning to OSD when trying to arm in manual mode and throttle is too high 0.1.20 * Fixed math errors in the bearing to home calculation * Fixed math error in the distance to home calculation * Fixed the method to check if the global position message is recent to prevent display issues * Don't show altitude and to home if no gps msg * Add MGRS precision configuration option 0.1.19 * Adjust OSD element locations * Update MGRS format 0.1.18 * Heading and distance / bearing to home cleanup * Move some OSD elements around 0.1.17 * Add voxl-libgeographic dependency 0.1.16 * Add MGRS cooridnates 0.1.15 * Add velocity 0.1.14 * Use Link Quality instead of RSSI for RC 0.1.13 * Updates for GPS dist to home and others 0.1.12 * Added GPS fusion to heading indicator if it isn't being done by PX4 0.1.11 * Version bump to kick off CI build on new docker image 0.1.10 * Update RC Channels menu * Save advanced menu updates to configuration file 0.1.9 * Update battery param used for cell voltage calculation voxl-portal (0.7.11 to 0.8.4) 0.8.4 * Updated to voxl-mongoose 7.19 library 0.8.3 * add status updates for voxl-mavlink-server and voxl-PX4 * display per-IMU update stages during calibration 0.8.2 * add imu status updates to calibration 0.8.1 * add apps-proc imu cal to accelerometer cal procedure 0.8.0 * huge cleanup. migrate to cross 4 voxl-px4-params (0.7.5 to 0.8.9) 0.8.9 * disable battery low and crit thresholds for FPV drones 0.8.8 * disable BAT_LOW_VOLT for FPV drones 0.8.7 * set EKF2_BARO_GATE to 100 to prevent baro from being disabled preventing arming 0.8.6 * pull in D0019 tuning updates from sdk 1.5.1 0.8.5 * update D0020 failsafes 0.8.4 * switch test loadout to RTL on CH 10 0.8.3 * enable RTL on D0019 and D0020 0.8.2 * update D0019 to clean param set, mostly duplicating D0020 0.8.1 * set COM_HOME_IN_AIR to 1 to allow RTL when GPS is bad 0.8.0 * added more stringent check for gps on D0020 * raise landing slowdown ALT2 to 10m 0.7.9 * undo typo, oops 0.7.8 * set up 2-stage RC Lost failsafe on D0020 * disable D0020 mag 0.7.7 * More D0020 cleanup. 0.7.6 * initial D0020 starting point * move CI to cross 4 voxl-px4 (1.14.0-2.0.105 to 1.14.0-2.0.121) 1.14.0-2.0.121 * Changed hard coded battery time low failsafe from RTL to Warn 1.14.0-2.0.120 * Decreased voxlpm battery_status logging interval from 100ms to 20ms 1.14.0-2.0.119 * Decreased voxl_esc battery_status logging interval from 100 ms to 20 ms * Changed printf to PX4_INFO in voxlpm status output 1.14.0-2.0.118 * Increased battery_status logging rate from 5 Hz to 50 Hz 1.14.0-2.0.117 * Added a new module called sensor_baro_bridge to send sensor_baro data to an MPA pipe 1.14.0-2.0.116 * Add start for vehicle_air_data_bridge into start scripts * Use DSP clock directly on Posix for CLOCK_MONOTONIC 1.14.0-2.0.115 * baro_temp_cal updated to stop pit mode while calibrating 1.14.0-2.0.114 * Fix FC compiler error 1.14.0-2.0.113 * Implemented basic keepalive mechanism between apps and DSP * Added parameters to control keepalive failure actions. Can be configured to force a blind land and to force disarm after some period. * Added MPA capability 1.14.0-2.0.112 * Added turtle mode reporting to the heartbeat mavlink message as a custom field * Removed support for RB5 (M0052) 1.14.0-2.0.111 * Fixed compilation failure for FCv2 1.14.0-2.0.110 * VOXL ESC: Added a parameter controlled option to send pwm commands instead of rpm commands 1.14.0-2.0.109 * Added support for dps368 external barometer on apps processor * Added support for external ICP10100 barometer on apps processor * Made logging with sequential file names the default 1.14.0-2.0.108 * Improved GPS failure simulation in HITL * VOXL ESC: Added M0129-6 as possible ESC type in print out * Added support for Mavlink reboot command * Added support for the reboot system command 1.14.0-2.0.107 * Added estimator_aid_src_baro_hgt as a default logging topic to help debug ekf2 instability * Reduced baro fusion timeout from 5 seconds to 500 ms * HITL: Moved heartbeat send into actuator send thread to avoid race conditions 1.14.0-2.0.106 * Fixed Mavlink battery status to properly fill in voltages_ext fields * Fixed CRSF telemetry voxl-qvio-server (1.2.0 to 1.2.2) 1.2.2 * update for new cpu_stats2 interface 1.2.1 * swap to 64-bit build for qrb5165-2 * cleanup and cross4.3 migration voxl-streamer (0.7.5 to 0.8.0) 0.8.0 * migrate to building in cross4 0.7.6 * Add support for fpv restream voxl-tflite-server (0.4.1 to 0.5.0) 0.5.0 * building in vross 4.3 with new tflite 2.17.1 0.4.2 * fixed yolov11, updated tflite voxl-utils (1.4.8 to 1.4.9) 1.4.9 * add tailscale to network prefs voxl-vision-hub (1.8.23 to 1.9.9) 1.9.9 * allow failsafe reentry into position mode with still sticks 1.9.9 * Thermal Flow set relative alt vs global alt based on pilot input 1.9.8 * D13 alt fix 1.9.7 * bump 1.9.6 * smoother transition for sprung loaded throttle R/C units 1.9.5 * PX4-ALT to VFC clean up mode switching logic--no arm if already blown up 1.9.4 * config version bump, D0020 support 1.9.3 * Fix smart takeoff to reset backtrack history 1.9.2 * moved VFC config into independent file 1.9.1 * VFC POS/ALT direct arming, soft takeoff mechanism 1.9.0 * migrate to cross 4.1, enable build for qrb5165-2 1.8.28 * VFC hover thrust quicker autotune and autosave to conf after 10secs of solid hold 1.8.27 * VFC hover thrust feature made active. Update thru voxl-config. 1.8.26 * VFC hover thrust template added. Reduce default PID settings for vfc's ALT and POS modes. 1.8.25 * VFC yaw tweaks. Add iterm to thrust control and tilt compensation for all VFC auto modes. Alpha-version VFC robust takeoff module. 1.8.24 * mission cancel into VFC position mode libmodal-flow (1.0.3) 1.0.3 * changed track function params to enable stereo * optimizations, detection on pyr lvl 1, qcom recordable queue 1.0.2 * build to fix sdk 1.6.0 dependencies (rollback to v1.0.0) 1.0.1 * changed track function params to enable stereo * optimizations, detection on pyr lvl 1, qcom recordable queue 1.0.0 * fixed ManagerCL teardown 0.0.1 * added initial files libvoxl-codec (0.0.1) 0.0.1 * add template for cross project voxl-io-server 0.0.6 * updates to build in cross 4.4 0.0.5 * add Mavlink tunnel option for modalal_io 0.0.4 * add zorro config 0.0.3 * add bash completion to voxl-send-neopixel-cmd 0.0.2 * fix id byte not being sent in the test program 0.0.1 * First commit voxl-libgeographic (1.0.0) 1.0.0 * initial release ``` # SDK 1.6.X Test Matrix The latest SDK 1.6.x release flight tested on each vehicle: | Vehicle | SKU | Latest SDK flight tested | Most recent flight testing | |---------|-----|--------------------------|----------------------------| | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | D0008-4-V5 | 1.6.6 | SDK 1.6.6 ships preinstalled on this vehicle and is the latest release flight tested on it | | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | D0008-4-V6 | 1.6.4 | SDK 1.6.4 is the latest release fully flight tested on this vehicle; SDK 1.6.6 is not supported on it | | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | D0008-9-V6 | [1.7.0 (beta)](/sdk-1.7-release-notes/) | July - August 2026: flight testing on SDK 1.7.0 beta builds; full support arrives with the SDK 1.7.0 release. No SDK 1.6.x release supports this variant | | [Starling 2 Max](/starling-2-max/) | D0012 | 1.6.4 | March 2026: validation flights during the 1.6.4 release cycle, all passed | | [Stinger Vision](/stinger-vision-fpv/) | D0013 | 1.6.4 | SDK 1.6.4 ships preinstalled on this vehicle and is the latest release fully flight tested on it | | [Starling 2](/starling-2/) | D0014 | 1.6.4 | March 2026: validation flights during the 1.6.4 release cycle, all passed | | [Seeker Vision 7"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | D0019-4-V5 | 1.6.8 | SDK 1.6.8 ships preinstalled on this vehicle and is the latest release flight tested on it | | [Seeker Vision 7"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | D0019-9 | 1.6.8 | SDK 1.6.8 ships preinstalled on this vehicle and is the latest release flight tested on it | | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | D0020-4-V5 | 1.6.8 | SDK 1.6.8 ships preinstalled on this vehicle and is the latest release flight tested on it | | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | D0020-4-V6 | 1.6.6 | SDK 1.6.6 ships preinstalled on this vehicle and is the latest release flight tested on it; SDK 1.6.5 was a targeted release for this vehicle | | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | D0020-9-V6 | 1.6.7 | August 2026: release sanity flights, all flight modes passed; multi-km long-range runs flown on 1.6.4 | For SDK 1.6.0 - 1.6.3 test coverage, see the SDK 1.6.1 test status below. | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.6.1 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0011 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![In progress](/icons/loader-circle.svg) | ![In progress](/icons/loader-circle.svg) | | D0012 | Starling 2 Max, see: [Starling 2 Max](/starling-2-max/) | ![In progress](/icons/loader-circle.svg) | ![In progress](/icons/loader-circle.svg) | | D0013 | Stinger Vision, see: [Stinger](/stinger-vision-fpv/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0014 | Starling 2, see: [Starling 2](/starling-2/) | ![In progress](/icons/loader-circle.svg) | ![In progress](/icons/loader-circle.svg) | --- Source: https://docs.modalai.com/sdk-1.5-release-notes/ # SDK 1.5.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) SDK 1.5.X Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1 | ![Yes](/icons/circle-check-big.svg) | | VOXL | M0006-2 | ![No](/icons/link-2-off.svg) | | VOXL Flight | M0019-2 | ![No](/icons/link-2-off.svg) | | Qualcomm Flight RB5 | M0052-2 | ![No](/icons/link-2-off.svg) | | Flight Core v2 | M0087-1 | ![No](/icons/link-2-off.svg) | | Flight Core v1 | M0018-1 | ![No](/icons/link-2-off.svg) | The SDK-1.5.0 release on the QRB5165 platform uses the 1.8.04 system image. See [here](/voxl2-voxl2-mini-system-image/) for system image release notes. # Table of contents 1. TOC # SDK 1.5.0 Package List and Changelog ## SDK 1.5.0 Package List Release date: June 25, 2025 Package list and changes from SDK-1.4.5 to SDK-1.5.0 | Package | Version | |---------|---------| | libfc-sensor | 1.0.7 (unchanged) | | libmodal-cv | 0.5.18 (unchanged) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.5 --> 0.2.6 | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.7 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.13.1 --> 2.13.2 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 (unchanged) | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.5 (unchanged) | | libslpi-link | 1.0.0 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.5 (unchanged) | | modalai-slpi | 1.1.20 --> 1.2.0 | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.1.3 (unchanged) | | [qrb5165-mini-tof-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mini-tof-server) | 0.2.2 (new) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.5 (unchanged) | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.5 --> 0.3.6 | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.9 --> 0.6.0 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.1 --> 2.2.4 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.1 --> 1.0.2 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.6.0 (unchanged) | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.7 (unchanged) | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.2 --> 1.5.4 | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.5 --> deprecated | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-joystick-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-joystick-server) | 0.0.6 (new) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.5.3 (unchanged) | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.8 --> 0.6.0 | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.7 --> 1.4.9 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.6 --> 1.1.8 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.4.0 (unchanged) | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | voxl-open-vins | 0.4.19 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.3.12 (unchanged) | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.1.7 --> 0.1.8 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.10 --> 0.7.11 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.104 -->1.14.0-2.0.105 | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 --> deprecated | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.7.3 --> 0.7.5 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.0 (unchanged) | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 (unchanged) | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.5 (unchanged) | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 --> 0.0.5 | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.4.1 (unchanged) | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.7 --> 1.4.8 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.21 --> 1.8.23 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.3.14 --> 1.4.7 | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.5.0 Full Changelog (from SDK 1.4.5) ``` libmodal-journal (0.2.5 to 0.2.6) 0.2.6 * Fixed incorrect debug level calculation libmodal-pipe (2.13.1 to 2.13.2) 2.13.2 * Reset accepting p frames flag for all clients on encoded streams when receiving a new stream header qrb5165-system-tweaks (0.3.5 to 0.3.6) 0.3.6 * fix voxl-platform for M0205 voxl-camera-calibration (0.5.9 to 0.6.0) 0.6.0 * update to voxl-cross:V4.0 voxl-camera-server (2.2.1 to 2.2.4) 2.2.4 * Enable MISP encoded stream on downward tracking * update OV9782 ae_desired_msv and gamma 2.2.3 * Add QRB5165-2 support * Enable Codec2 support on QRB5165-2 * add C22 for platform 1 2.2.2 * Fix FPV camera default softmin exposure voxl-configurator (1.0.1 to 1.0.2) 1.0.2 * D0019 updates * voxl-streamer config fixes voxl-esc (1.5.2 to 1.5.4) 1.5.4 * more D0013 spinup tweaks 1.5.3 * fix D0013 spinup voxl-io-server 0.0.5 * add Mavlink tunnel option for modalal_io 0.0.4 * add zorro config 0.0.3 * add bash completion to voxl-send-neopixel-cmd 0.0.2 * fix id byte not being sent in the test program 0.0.1 * First commit voxl-mavcam-manager (0.5.8 to 0.6.0) 0.6.0 * add check to see if video record pipe exists 0.5.9 * MAV_AUTOPILOT_GENERIC -> MAV_AUTOPILOT_INVALID in heartbeat voxl-mavlink-server (1.4.7 to 1.4.9) 1.4.9 * VFC missions support RTL & LAND waypoints voxl-modem (1.1.6 to 1.1.8) 1.1.8 * Publish stats for Doodle Labs radios 1.1.7 * update to python3 voxl-osd (0.1.7 to 0.1.8) 0.1.8 * Add VTX CPU and memory usage to OSD * Update advanced menu * Add Debug OSD menu and RC Channels menu voxl-portal (0.7.9 to 0.7.11) 0.7.11 * add imu and rangefinder to portal 0.7.10 * Added Benchmark tab to display ov log data * Barometer calibration updates voxl-px4-imu-server 0.1.2 * cleanup configure script 0.1.1 * New CI Stuff 0.1.0 * first release 0.0.1 * initial commit voxl-px4-params (0.7.3 to 0.7.5) 0.7.5 * update OSD params 0.7.4 * D0019 tuning updates voxl-px4 (1.14.0-2.0.98 to 1.14.0-2.0.105) 1.14.0-2.0.105 * Added MC autotune module to apps side build 1.14.0-2.0.104 * Went back to the baro_temp_cal script from 1.14.0-2.0.101 with some minor tweaks 1.14.0-2.0.103 * Reverted the baro_temp_cal script update from 1.14.0-2.0.101 * Artificially set TMIN to 0 and TMAX to TMAX + 10 in barometer temperature calibration script 1.14.0-2.0.102 * Updated the custom icm42688p IMU driver to use RTC input and to have optional temperature compensation 1.14.0-2.0.101 * Updated baro_temp_cal script to make sure that there is a wide enough temperature range and low enough starting temperature 1.14.0-2.0.100 * Zero RF yaw fix 1.14.0-2.0.99 * update to dds to expose battery status as ros2 endpoint from dds voxl-tag-detector (0.0.4 to 0.0.5) 0.0.5 * update to voxl-cross:v4.0 voxl-utils (1.4.7 to 1.4.8) 1.4.8 * add M0205 support voxl-vision-hub (1.8.21 to 1.8.23) 1.8.23 * VFC mission: PX4 rtl & land modes used if requested in mission. Fine tune takeoff. 1.8.22 * VFC mission mode turn to waypoint before translation, smoother traj, tuning qrb5165-mini-tof-server voxl-joystick-server voxl-jpeg-turbo 2.1.3-7 * update for new cmake 2.1.3-6 * bump version to fix qrb5165-2 build 2.1.3-5 * fix native build 2.1.3-4 * cleaned up postinst 2.1.3-3 * fresh CI release 2.1.3-2 * ci stages change 2.1.3-1 * added conflicts/replaces fields for libjpeg-turbo 2.1.3 * voxl build of libjpeg_turbo v2.1.3 voxl-mongoose 7.7.0-2 * new cross template updates 7.7.0-1 * patch to set sockets in blocking mode only 7.6.0 * testing master branch slightly ahead of v7.6, but has massive socket improvements * cleaned up postinst 7.3.0-2 * ci stage updates 7.3.0-1 * added conflicts/replaces for mongoose 7.3.0 * working voxl build, mongoose version 7.3 ``` # SDK 1.5.X Test Matrix | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.5.0 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0001 | [m500](/m500/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0003 | Seeker | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0004 | [Qualcomm Flight RB5 5G](/qualcommflightrb5/) Deprecated | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0005-4](/voxl2-d0005/) | [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0006-4](/voxl2-d0006/) | [Sentinel](/sentinel/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0011 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0012 | Starling 2 Max, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0014](/voxl2-d0014/) | Starling 2, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | --- Source: https://docs.modalai.com/sdk-1.4-release-notes/ # SDK 1.4.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) SDK 1.4.X Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1 | ![Yes](/icons/circle-check-big.svg) | | VOXL | M0006-2 | ![No](/icons/link-2-off.svg) | | VOXL Flight | M0019-2 | ![No](/icons/link-2-off.svg) | | Qualcomm Flight RB5 | M0052-2 | ![No](/icons/link-2-off.svg) | | Flight Core v2 | M0087-1 | ![No](/icons/link-2-off.svg) | | Flight Core v1 | M0018-1 | ![No](/icons/link-2-off.svg) | The SDK-1.4.5 release on the QRB5165 platform uses the 1.8.04 system image. See [here](/voxl2-voxl2-mini-system-image/) for system image release notes. # Table of contents 1. TOC # SDK 1.4.5 Package List and Changelog ## SDK 1.4.5 Package List Release date: May 16, 2025 Package list and changes from SDK-1.4.4 to SDK-1.4.5 | Package | Version | |---------|---------| | libfc-sensor | 1.0.7 (unchanged) | | libmodal-cv | 0.5.18 (unchanged) | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.4 (unchanged) | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.5 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.7 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.13.1 (unchanged) | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.5.0 (unchanged) | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.5 (unchanged) | | libslpi-link | 1.0.0 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.3.2 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.5 (unchanged) | | modalai-slpi | 1.1.20 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.1.3 (unchanged) | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.5 (unchanged) | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.5 (unchanged) | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.9 (unchanged) | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.2.0 --> 2.2.1 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 1.0.1 (unchanged) | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.6.0 (unchanged) | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.7 (unchanged) | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.2 (unchanged) | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 (unchanged) | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.5 (unchanged) | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-7 (unchanged) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 (unchanged) | | voxl-lepton-tracker | 0.0.4 (unchanged) | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.5.3 (unchanged) | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.2 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.8 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.7 (unchanged) | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.6 (unchanged) | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-2 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.4.0 (unchanged) | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.7 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-3 (unchanged) | | voxl-open-vins | 0.4.18 --> 0.4.19 | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.3.10 --> 0.3.12 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.1.7 (unchanged) | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.10 (unchanged) | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.104 (unchanged) | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.7.1 --> 0.7.3 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.2.0 (unchanged) | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.5 (unchanged) | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.5 (unchanged) | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.4.1 (unchanged) | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.7 (unchanged) | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.21 (unchanged) | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.3.14 (unchanged) | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.4.5 Full Changelog (from SDK 1.4.4) ``` voxl-camera-server (2.2.0 to 2.2.1) 2.2.1 * fix misp awb * some drone naming updates voxl-open-vins-server (0.3.10 to 0.3.12) 0.3.12 * revert small bug 0.3.11 * add 4G memory limit to process for safety * fix GPU memory leak voxl-px4-params (0.7.1 to 0.7.3) 0.7.3 * fix OSD params to match desired 0.7.2 * update OSD params ``` # SDK 1.4.4 Package List and Changelog ## SDK 1.4.4 Package List Release date: May 8, 2025 Package list and changes from SDK-1.4.1 to SDK-1.4.4 | Package | Version | |---------|---------| | libfc-sensor | 1.0.7 (unchanged) | | libmodal-cv | 0.5.16 --> 0.5.18 | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.3 --> 0.1.4 | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 --> 0.2.5 | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 --> 0.4.7 | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.6 --> 2.13.1 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.9 --> 0.5.0 | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.3 --> 1.4.5 | | libslpi-link | 1.0.0 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 --> 0.3.2 | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 --> 0.1.5 | | modalai-slpi | 1.1.19 --> 1.1.20 | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.1.2 --> 1.1.3 | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.4 --> 0.1.5 | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.4 --> 0.3.5 | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.9 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.1.1 --> 2.2.0 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.9.7 --> 1.0.1 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.5.3 --> 0.6.0 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.4.1 --> 0.4.7 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.5.1 --> 1.5.2 | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.4 --> 0.0.5 | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 --> 2.1.3-7 | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 | | voxl-lepton-tracker | 0.0.4 | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.9 --> 0.5.3 | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 --> 0.2.2 | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.7 --> 0.5.8 | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.4 --> 1.4.7 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.5 --> 1.1.6 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 --> 7.7.0-2 | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.3.7 --> 1.4.0 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 --> 0.0.7 | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 --> 4.5.5-3 | | voxl-open-vins | 0.4.16 --> 0.4.18 | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.3.0 --> 0.3.10 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.1.1 --> 0.1.7 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.5 --> 0.7.10 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.94 --> 1.14.0-2.0.104 | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.6.3 --> 0.7.1 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.1.1 --> 1.2.0 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.4 --> 0.0.5 | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.5 | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.9 --> 0.4.1 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.4 --> 1.4.7 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.17 --> 1.8.21 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.1.8 --> 1.3.14 | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.4.4 Full Changelog (from SDK 1.4.1) ``` libmodal-exposure (0.1.3 to 0.1.4) 0.1.4 * add new build and update to new template libmodal-journal (0.2.2 to 0.2.5) 0.2.5 * cross4 migration 0.2.4 * update to newer voxl-cross template 0.2.3 * add ability to override the debug level from the filesystem libmodal-json (0.4.3 to 0.4.7) 0.4.7 * migrate to cross4 0.4.6 * re-add missing libs 0.4.5 * update to newer version of cmake 0.4.4 * bump version to fix qrb5165-2 build libmodal-pipe (2.10.6 to 2.13.1) 2.13.1 * move to cross4 2.13.0 * Added ion buffer types to MPA 2.12.0 * Added a new vfc_data_t for VFC status data * Added autogeneration of pympa interface types 2.11.0 * Added a Python interface to use MPA libqrb5165-io (0.4.9 to 0.5.0) 0.5.0 * enable build for qrb5165-2 librc-math (1.4.3 to 1.4.5) 1.4.5 * cross4 migration 1.4.4 * new cross template and cmake libvoxl-cutils (0.1.1 to 0.1.5) 0.1.5 * move to cross4 0.1.4 * fix linter issues 0.1.3 * fix cmake regression 0.1.2 * Build for qrb5165 2.x system image * deprecate apq8096 0.1.0 * updated packaging formats and util scripting 0.0.2 * add extern "C" to header to support c++ users 0.0.1 * initial upload of various utils qrb5165-imu-server (1.1.2 to 1.1.3) 1.1.3 * check for clock signal function during 42688 self-test * attempt to run IMU without clock signal if it is missing on init qrb5165-rangefinder-server (0.1.4 to 0.1.5) 0.1.5 * add config options for voxl2 mini & m0188 * better detection of false readings * clip output at configurable max distance qrb5165-system-tweaks (0.3.4 to 0.3.5) 0.3.5 * fix legacy voxl-wifi changes voxl-camera-server (2.1.1 to 2.2.0) 2.2.0 * migrate to voxl-cross 4 2.1.2 * fix rotation color issues with ov9782 * add snapshot jpeg quality as param * add max exposure based on desired fps * Move C33, C34 to imx664-fpv sensor type * misp multi channel output * add gama to config file voxl-configurator (0.9.7 to 1.0.1) 1.0.1 * D0019 support * updates for D0013 and MVX 1.0.0 * add voxl-wavemux 0.9.9 * require thermal imu cal on all platforms * require barometer thermal cal on all platforms * expanded steam deck config handling * update vrx handling 0.9.8 * fix elrs pwm config voxl-cpu-monitor (0.5.3 to 0.6.0) 0.6.0 * voxl-cross 4 migration voxl-elrs (0.4.1 to 0.4.7) 0.4.7 * Added configuration for D0019 0.4.6 * Added firmware version 3.5.3.10 0.4.5 * Added firmware version 3.5.3.9 * Added support for PWM override command 0.4.4 * update D0013 loadout 0.4.3 * update D0013 loadout 0.4.2 * Added support for pwm configuration loading/exporting * Added support for pwm curves * Added firmware 3.5.3.6 support voxl-esc (1.5.1 to 1.5.2) 1.5.2 * D0019 Params voxl-logger (0.4.9 to 0.5.3) 0.5.3 * preroll data post processing added to help startup vio when using new logger service 0.5.2 * can now save hires snapshots at configurable rates * new voxl-logger service to start on boot * check for free disk space to prevent filling disk 0.5.1 * add two more sigfigs to imu temp logs * remove deprecated vft_feature type * add trackingL and trackingR to vio_benchtest preset 0.5.0 * add preset for benchtest vio voxl-mavcam-manager (0.5.7 to 0.5.8) 0.5.8 * Fixes to mavcam manager multiple RTSP streams in QGC 4.4.x with backwards compatibility for qgc 4.3.x and 4.2.x voxl-mavlink-server (1.4.4 to 1.4.7) 1.4.7 * support VFC missions with PHOTOS, cleanup * support ZeroRF using VFC missions 1.4.6 * add output pipe imu_mavlink that publishes autopilot imu data in MPA format 1.4.5 * Added feature to update system time if it is received over Mavlink (e.g. from GCS) voxl-mavlink (0.1.1 to 0.1.5) 0.1.5 * update to new template 0.1.4 * Updated Mavlink submodule to get updates for ModalAI tunnel payload types 0.1.3 * Updated Mavlink submodule to get updates for camera protocol 0.1.2 * bump version to fix qrb5165-2 build voxl-modem (1.1.5 to 1.1.6) 1.1.6 * small naming change voxl-mpa-tools (1.3.7 to 1.4.0) 1.4.0 * migrate to cross4 1.3.8 * fix CI break due to updated gcc * polish voxl-inspect-imu voxl-open-vins-server (0.3.0 to 0.3.10) 0.3.10 * D0008 imu-body rotation extrinsic fix 0.3.9 * set en_imu_frame_output to true and en_vio_always_on to false as default 0.3.8 * refine throttling of imu data all modes 0.3.7 * remove throttling of imu data when under GPU FT mode 0.3.6 * debug upside down voxl2 0.3.5 * clean up thermal vio 0.3.4 * Fix zero features on takeoff motors spinning w/excessive imu noise 0.3.3 * Support for old 1.4.1 thermal and new 1.4.1 w/quality logic 0.3.2 * New quality logic 0.3.1 * Fixes to enable PX4 MPC POS mode to work with VFC. * Bug fix & cleanup to thermal vio jitter-frame from shutter voxl-opencv (4.5.5-2 to 4.5.5-3) 4.5.5-3 * update cmake voxl-portal (0.7.5 to 0.7.9) 0.7.9 * Multiple enhancements to the actuators tab functionality to make it more like QGC 0.7.8 * Updated the run function for all motors test so it does sends sequentially 0.7.7 * Added actuator tab for testing each of the motors, matching the ESCs to the correct motors, and reversing the direction of the motors 0.7.6 * Updates to RC calibration to make it easier to use voxl-px4-params (0.6.3 to 0.7.1) 0.7.1 * put D0013 baro noise back to 3 now that temp cal is improved 0.7.0 * add voxl-enable-px4-logging script 0.6.9 * D0019 tuning params * zero rf param tweaks 0.6.8 * D0013 altitude updates 0.6.7 * D0013 loadout tweak 0.6.6 * update steam deck joystick params 0.6.5 * fix typo in steam deck helper param file 0.6.4 * different barometer noise per platform * enable vio and gps together on starling2 and 2 max * add joystick helper voxl-px4 (1.14.0-2.0.94 to 1.14.0-2.0.98) 1.14.0-2.0.98 * msp_dp_osd: Another string handling fix 1.14.0-2.0.97 * voxl_esc: Change uart passthru method to not require mavlink in driver * voxl2_io: Added uart passthru feature * Made general improvements to the QURT platform message logging so that module name is printed both in mini-dm and on apps side terminal * Removed VOXL2_IO identifier in all voxl2_io log messages since module name is automatically added now 1.14.0-2.0.96 * Updated the baro calibration script to write parameters to PX4 by default 1.14.0-2.0.95 * Moved from modal_io for ESC UART passthru to Mavlink tunnel voxl-qvio-server (1.1.1 to 1.2.0) 1.2.0 * migrate to building in voxl-cross 4.0 voxl-tflite-server (0.3.9 to 0.4.1) 0.4.1 * update input_pipe selection menu to read from valid pipe options 0.4.0 * seperated inference worker to run on seperate threads * created a queue to store the last inference and post processed image (default max size 1) voxl-utils (1.4.4 to 1.4.7) 1.4.7 * add security check * add SKU to voxl-version 1.4.6 * cleanup top output to improve voxl-inspect-services tolerance to small window size 1.4.5 * improve cpu usage accuracy in voxl-inspect-services voxl-vision-hub (1.8.17 to 1.8.21) 1.8.21 * add low pass filter to vfc flow attitude output 1.8.20 * Prevent restarts on VFC mission when in mission mode * VFC mission mode only when both offboard is 'wps' and 'wps_vfc_mission' is true 1.8.19 * Added a simple voxl-inspect-vfc utility 1.8.18 * allow WPS mode to use VFC * add steam deck specific vfc config ``` --- # SDK 1.4.1 Package List and Changelog ## SDK 1.4.1 Package List Release date: February 19, 2025 Package list and changes from SDK-1.4.0 to SDK-1.4.1 | Package | Version | |---------|---------| | libfc-sensor | 1.0.7 (unchanged) | | libmodal-cv | 0.5.16 | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.3 | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.4 --> 2.10.6 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.7 --> 0.4.9 | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.3 | | libslpi-link | 1.0.0 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | | modalai-slpi | 1.1.19 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.1.0 --> 1.1.2 | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.4 | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.2 --> 0.3.4 | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.9 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.0.8 --> 2.1.1 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.9.4 --> 0.9.7 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.5.1 --> 0.5.3 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.3.4 --> 0.4.1 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.8 --> 1.5.1 | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.5.2 | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | 0.0.4 | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.3.3 | | voxl-lepton-tracker | 0.0.4 | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.9 | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.7 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.4 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.3 --> 1.1.5 | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.3.4 --> 1.3.7 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | | voxl-open-vins | 0.4.14 --> 0.4.16 | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.83 --> 0.3.0 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.0.2 --> 0.1.1 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.2 --> 0.7.5 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.85 --> 1.14.0-2.0.94 | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.5.8 --> 0.6.3 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.1.1 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.3 --> 0.0.4 | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.5 | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.7 --> 0.3.9 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.4 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.17 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.1.3 --> 1.1.8 | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.4.0 Full Changelog (from SDK 1.3.5) ``` libmodal-pipe (2.10.4 to 2.10.6) 2.10.6 * fix build system 2.10.5 * add function pipe_suggest_cam_pipe_size() libqrb5165-io (0.4.7 to 0.4.9) 0.4.9 * bump version to fix build system 0.4.8 * update spi test qrb5165-imu-server (1.1.0 to 1.1.2) 1.1.2 * bump version to fix build 1.1.1 * voxl-calibrate-imu-temp now heats the CPU up faster qrb5165-system-tweaks (0.3.2 to 0.3.4) 0.3.4 * bump version to fix build 0.3.3 * disable camx logging voxl-camera-server (2.0.8 to 2.1.1) 2.1.1 * add control command to change fps * enable misp zoom 2.1.0 * bump version to fix build 2.0.9 * add new FPV specific sensor types * add C34, C38, C51, C52, updates to other cam configs * add dynamic bitrate update to misp encoder voxl-configurator (0.9.4 to 0.9.7) 0.9.7 * disable voxl-feature-tracker, no longer used * start sparrow setup 0.9.6 * bump version to fix build 0.9.5 * remove cam config file hacking * add vrx handling * add --json option to voxl-inspect-sku * update -X defs voxl-cpu-monitor (0.5.1 to 0.5.3) 0.5.3 * bump version to fix build 0.5.2 * go back to auto scaler as default. Platforms that require performance will now set it manually voxl-elrs (0.3.4 to 0.4.1) 0.4.1 * bump version to fix build 0.4.0 * Overhauled wizard interface * Added firmware version 3.5.3.5 0.3.7 * Added firmware version 3.5.3.4 0.3.6 * Added support for betaflight passthrough for all operations * Added firmware for 3.5.3.3 0.3.5 * Fixed recovery function for betafpv 900RX units * Fixed firmware version for betafpv rx * Fixed error after firmware upload for esp-based units voxl-esc (1.4.8 to 1.5.1) 1.5.1 * slow down starling max spoolup 1.5.0 * bump version to fix build 1.4.9 * make starling max spoolup more robust voxl-modem (1.1.3 to 1.1.5) 1.1.5 * bump version to fix build 1.1.4 * add -s option to doodle-cli voxl-mpa-tools (1.3.4 to 1.3.7) 1.3.7 * enable 3rd tracking camera for VIO on starling 2 * disable ground occlusion on downward cameras 1.3.6 * bump version to fix build 1.3.5 * fix D0014 Starling 2 downward tracking extrinsics * add D0009 extrisnics voxl-open-vins-server (0.2.83 to 0.3.0) 0.3.0 * swap to GPU feature tracker by default * remove unnecessary memcopy when overlay is not running * return to original pixel noise for GPU tracker * fix voxl-inspect-vins errors * add voxl-reset-vins tool (not perfect yet) 0.2.85 * bump version to fix build 0.2.84 * options to enable gpu tracking voxl-portal (0.7.2 to 0.7.5) 0.7.5 * fix debug and cal over adb port forwarding * add camera controls for misp pipes 0.7.4 * bump version to fix build 0.7.3 * fix mavlink reconnection on page load breaking other pipes * add baro cal * add flight modes page voxl-px4-params (0.5.8 to 0.6.3) 0.6.3 * update stinger flight modes 0.6.2 * starling 2 max smooth takeoff ramp 0.6.1 * bump version to fix build 0.6.0 * update D0013 flight modes 0.5.9 * Added new calibration file parameters_baro_tc.cal voxl-px4 (1.14.0-2.0.85 to 1.14.0-2.0.94) 1.14.0-2.0.94 * FCv2: brought in ESC driver startup timing change from voxl-fpv-dev found in D0007 production setup 1.14.0-2.0.93 * Simplified the barometer calibration process 1.14.0-2.0.92 * Added fixes for temperature compensation module to make sure updates go out in a timely fashion * Moved start of temperature compensation module earlier in script to help prevent any uncorrected altitude data from going to EKF * Made sure temperature compensation is done for tighter range on all sensors 1.14.0-2.0.91 * Brought in icp201xx barometer fix from mainline * Changed temperature compensation module to update on 0.1 degree changes 1.14.0-2.0.90 * Added scripts and instructions for barometer temperature calibration 1.14.0-2.0.89 * Fixed an issue with string handling in msp_dp_osd driver 1.14.0-2.0.88 * Added ist8308 magnetometer start line into voxl-px4-start script 1.14.0-2.0.87 * Added capability to run the msp_dp_osd driver on DSP 1.14.0-2.0.86 * Add bmp280, bmp388, and ms5611 barometers to the build * Add temperature compensation module to the build voxl-tflite-server (0.3.7 to 0.3.9) 0.3.9 * bump version to fix build 0.3.8 * fix bug setting model path ``` # SDK 1.4.0 Package List and Changelog ## SDK 1.4.0 Package List Release date: January 6, 2025 Package list and changes from SDK-1.3.5 to SDK-1.4.0 | Package | Version | |---------|---------| | libfc-sensor | 1.0.7 (unchanged) | | libmodal-cv | 0.5.11 --> 0.5.16 | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.1 --> 0.1.3 | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.2 --> 2.10.4 | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.6 --> 0.4.7 | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 --> 1.4.3 | | libslpi-link | 1.0.0 (unchanged) | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | | modalai-slpi | 1.1.19 (unchanged) | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 --> 1.1.0 | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.3 --> 0.1.4 | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.0 --> 0.3.2 | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.7 --> 0.5.9 | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 2.0.1 --> 2.0.8 | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.8.5 --> 0.9.4 | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 --> 0.5.1 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.2.2 --> 0.3.4 | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.7 --> 1.4.8 | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.4.1 --> 0.5.2 | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | | voxl-io-server | none --> 0.0.4 | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.3 --> 1.3.3 | | voxl-lepton-tracker | 0.0.2 --> 0.0.4 | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.7 --> 0.4.9 | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.7 (unchanged) | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.2 --> 1.4.4 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.3 (unchanged) | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.2.3 --> 1.3.4 | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | | voxl-open-vins | 0.4.14 (unchanged) | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.75 --> 0.2.83 | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | 0.0.1 --> 0.0.2 | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.7.0 --> 0.7.2 | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.84 --> 1.14.0-2.0.85 | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.5.3 --> 0.5.8 | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.4 --> 1.1.1 | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | voxl-state-estimator | 0.0.2 --> 0.0.3 | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 --> 0.7.5 | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.4 --> 0.3.7 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.3 --> 1.4.4 | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.9 --> 1.8.17 | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | | voxl-vtx | 1.1.0 --> 1.1.3 | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | ## SDK 1.4.0 Known Issues voxl-portal can freeze while displaying video, please see [this forum post](https://forum.modalai.com/topic/4139/voxl-portal-wont-display-live-camera-feeds-after-sdk-1-4-0-upgrade) for a fix. ## SDK 1.4.0 Full Changelog (from SDK 1.3.5) ``` libmodal-exposure (0.1.1 to 0.1.3) 0.1.3 * new msv function allowing setting stride != width libmodal-pipe (2.10.2 to 2.10.4) 2.10.4 * add definitions for vio frames of reference 2.10.3 * add set of functions for controlling CPU affinity libqrb5165-io (0.4.6 to 0.4.7) 0.4.7 * for icm42688 imu FIFO reads, read in the extra imu samples that were taken while reading the majority of the fifo buffer * fix SPI speed not being set librc-math (1.4.2 to 1.4.3) 1.4.3 * fix rc_quaternion_slerp sometimes interpolating the long way around * add rc_test_quaternion_slerp function qrb5165-imu-server (1.0.1 to 1.1.0) 1.1.0 * allow asynchronous imu fifo reading via control pipe * turn off 42688 UI filter by default qrb5165-rangefinder-server (0.1.3 to 0.1.4) 0.1.4 * -t small fix qrb5165-system-tweaks (0.3.0 to 0.3.2) 0.3.2 * add M0204 support 0.3.1 * fix voxl-wifi factory mode on voxl2-mini * swap to using voxl serial number as factory softap ssid instead of mac voxl-camera-calibration (0.5.7 to 0.5.9) 0.5.9 * strip off tags from input_pipe before saving file 0.5.8 * add handling for 16-bit mono images * support higher resolution thermal cameras voxl-camera-server (2.0.1 to 2.0.8) 2.0.8 * add C33 config 2.0.7 * Add MSP parser and OSD for MISP streams 2.0.6 * add C50 config 2.0.5 * enable MISP for OV9782 2.0.4 * send command to imu-server to read IMU FIFO after fsync-driven camera frames 2.0.3 * fix typo in raw format type for imx412 misp pipeline * undo 12-bit testing code * allow running on cores 2&3 if A65 TOF is present 2.0.2 * move cam config 22 for D0013 to new platform_config_2 for m0188 * lock to 4 bigger cores to improve stability and latency voxl-configurator (0.8.5 to 0.9.4) 0.9.4 * health check updates 0.9.3 * add framework for MVX-T0001 and MVX-R0001 0.9.2 * fix configurator step for starling lepton option 0.9.1 * update lepton config for D0013 * update required cal files 0.9.0 * update D0013 required cal files 0.8.9 * experimental modes cleanup * D0013 support 0.8.8 * add M0184 option 0.8.7 * voxl-vtx updates * inital D0008-V5 updates * add checking for imu temp cal * configure sku wizard now handles default cam config for families and version 0.8.6 * E16 for starling voxl-cpu-monitor (0.4.8 to 0.5.1) 0.5.1 * add printing cpu load for big cores and small cores to voxl-inspect-cpu 0.5.0 * cpu temp is now averaged (smoother) * performance mode by default * new config options for cpu scalers voxl-elrs (0.2.2 to 0.3.4) 0.3.4 * Added ELRS v3.5.3 firmware for M0184/M0193 0.3.3 * remove voxl-px4 enable/disable logic * scan now only updates if fw is out of date 0.3.2 * fixed hanging in certtain cases 0.3.1 * Added support for ModalAI M0193 Receiver targets 0.3.0 * Rewrote voxl-elrs * Added support for setting receiver binding phrase through voxl-elrs * Added support for many more targets (All ESP32/ESP8266/ESP8285 based RX) * Added more configuration options * Added systemd service to auto update and configure receivers on startup * TODO: Append pinout file when uploading unified targets * TODO: Fix recovery function voxl-esc (1.4.7 to 1.4.8) 1.4.8 * D0013: silence bootup and tuning voxl-feature-tracker (0.4.1 to 0.5.2) 0.5.2 * decrease output pipe size 0.5.1 * changes for better distribution of selected features 0.5.0 * migrate to vio_cams.conf common config file voxl-lepton-server (1.2.3 to 1.3.3) 1.3.3 * add m0173_manual option 1.3.2 * add config option for M0188 1.3.1 * add support for M0188 (single instance off J10 only which is channel 0 of mux) 1.3.0 * add support for hard-resets with M0187 1.2.4 * add assign_cpu_num param and default to cpu 7 * add en_timing_msg param * add m0173_rotated_manual configure option voxl-logger (0.4.7 to 0.4.9) 0.4.9 * logged RAW8 images are uncompressed 0.4.8 * added batch publish for imu replay voxl-mavlink-server (1.4.2 to 1.4.4) 1.4.4 * default audio zerorf mode to be off (silent) 1.4.3 * support esc chimes and prop spin notifications for zerorf mode voxl-mpa-tools (1.2.3 to 1.3.4) 1.3.4 * add voxl-clear-logs command 1.3.3 * set tracking_left_right to use normalized image 1.3.2 * add lepton to D0013 extrinsics and hires to D0012/D0014 * update voxl-inspect-extrinsics 1.3.1 * add function vcc_find_extrinsic() * add lepton extrinsics to D0013 * add hires extrinsics to D0012 D0014 * voxl-inspect-extrinsics can now print individual relations 1.3.0 * new vio-cam config utilities and functions in voxl_common_config 1.2.4 * removed esc pwm and tone tools, they moved to voxl-io-server voxl-open-vins-server (0.2.75 to 0.2.83) 0.2.83 * fix memleak with ov_overlay 0.2.82 * use tracking pipe name for main pipe 0.2.81 * orientation changes 0.2.80 * fix flight twitch 0.2.79 * refactoring callbacks to make more modular 0.2.78 * re-add inverted voxl2 imu support, remove FLU reference 0.2.77 * fix voxl orientation when X axis is gravity, nullpoint * unwrap tranformation from ovin global frmae to imu frame for vvhub * fix quanternion issue voxl-portal (0.7.0 to 0.7.2) 0.7.2 * add accel, gyro, mag, level horizon cal 0.7.1 * flush camera pipes completely when backed up instead of just dropping one frame at a time voxl-px4-params (0.5.3 to 0.5.8) 0.5.8 * D0008: update default flight modes 0.5.7 * update pre-arm checks on D0013 0.5.6 * enable turtle mode on D0013 0.5.5 * stinger updates 0.5.4 * update OSD params * D0008: flight mode tweaks voxl-px4 (1.14.0-2.0.84 to 1.14.0-2.0.85) 1.14.0-2.0.85 * Increase heartbeat rate so VFC can get faster mode updates voxl-qvio-server (1.0.4 to 1.1.1) 1.1.1 * add ability to request more imu data from imu-server if camera exposure is shorter than the rise time of the IMU AAF * set defualt cam-imu timeshift back to 0 after retuning IMU pipeline 1.1.0 * migrate config to use the common vio_cams.conf file instead 1.0.5 * move tracking_front and tracking_down streams to the _misp_norm normalized pipes * allow running on all 4 gold cores on qrb5165 voxl-streamer (0.7.4 to 0.7.5) 0.7.5 * add option to use h265 encoder * switch h264 encoder to use main profile and enable CABAC coding voxl-tflite-server (0.3.4 to 0.3.7) 0.3.7 * small bug fixes 0.3.6 * bounding box fixes 0.3.5 * Fix config file default camera pipe name (hires_small_color) * yolov8 support voxl-utils (1.4.3 to 1.4.4) 1.4.4 * add M0204 support voxl-vision-hub (1.8.9 to 1.8.17) 1.8.17 * add acceleration limit in VFC Position controlled by vfc_xy_acc_limit_vio parameter * add feedforward factor in VFC Position controlled by vel_ff_factor_vio parameter * add low pass filter in VFC Position controlled by vfc_w_filt_xy_vio parameter 1.8.16 * enable px4 horizon cal in offboard mode * add hybrid flow mode * use pose_covariance field to indicate state validity 1.8.15 * change backtrack rc chan for vfc 1.8.14 * debug print fix 1.8.13 * increase vfc position gains * add helper to enable vfc position, flow, and backtrack 1.8.12 * Changes to support VFC Position and Backtrack on Starling 2 1.8.11 * Added better height control transitions based on commanded thrust in altitude modes * Added attitude command smoothing during submode transitions using vfc_att_transition_time parameter 1.8.10 * Added a backtrack restore function to keep unused backtrack points ``` # SDK 1.4.X Test Matrix | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.4.0 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0001 | [m500](/m500/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0003 | Seeker | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0004 | [Qualcomm Flight RB5 5G](/qualcommflightrb5/) Deprecated | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0005-4](/voxl2-d0005/) | [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0006-4](/voxl2-d0006/) | [Sentinel](/sentinel/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0011 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0012 | Starling 2 Max, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0014](/voxl2-d0014/) | Starling 2, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | --- Source: https://docs.modalai.com/sdk-1.3-release-notes/ # SDK 1.3.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) SDK 1.3.X Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1 | ![Yes](/icons/circle-check-big.svg) | | VOXL | M0006-2 | ![No](/icons/link-2-off.svg) | | VOXL Flight | M0019-2 | ![No](/icons/link-2-off.svg) | | Qualcomm Flight RB5 | M0052-2 | ![No](/icons/link-2-off.svg) | | Flight Core v2 | M0087-1 | ![No](/icons/link-2-off.svg) | | Flight Core v1 | M0018-1 | ![No](/icons/link-2-off.svg) | The SDK-1.3.5 release on the QRB5165 platform use the 1.7.10 system image. See [here](/voxl2-voxl2-mini-system-image/) for system image release notes. # Table of contents 1. TOC --- # SDK 1.3.5 Package List and Changelog ## SDK 1.3.5 Package List Release date: October 3, 2024 Package list and changes from SDK-1.3.3 to SDK-1.3.5 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.7 (unchanged) | | ✅ | | libmodal-cv | 0.5.8 --> 0.5.11 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 --> 0.1.1 | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.1 --> 2.10.2 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.6 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | libslpi-link | 1.0.0 (unchanged) | | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.19 (unchanged) | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.3 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.0 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.6 --> 0.5.7 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.9.8 --> 2.0.1 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.7.7 --> 0.8.5 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.2.1 --> 0.2.2 | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.4 --> 1.4.7 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.14 --> 0.4.1 | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.2 --> 1.2.3 | ✅ | ✅ | | voxl-lepton-tracker | 0.0.1 --> 0.0.2 | | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.3 --> 0.4.7 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.6 --> 0.5.7 | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.2 (unchanged) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.9 --> 1.2.3 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.12 --> 0.4.14 | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.59 --> 0.2.75 | | ✅ | | [voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd) | none --> 0.0.1 | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.9 --> 0.7.0 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.79 --> 1.14.0-2.0.84 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.4.7 --> 0.5.3 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.4 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | voxl-state-estimator | 0.0.2 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.2 --> 1.4.3 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.3 --> 1.8.9 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | | voxl-vtx | 1.0.3 --> 1.1.0 | | ✅ | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | | ✅ | ## SDK 1.3.5 Full Changelog (from SDK 1.3.3) ``` libmodal-exposure (0.1.0 to 0.1.1) 0.1.1 * fix gain update period bug, which resulted in old gain to be applied if gain update period was set to 1 libmodal-pipe (2.10.1 to 2.10.2) 2.10.2 * inconsequential fix in error print text voxl-camera-calibration (0.5.6 to 0.5.7) 0.5.7 * add handling for camera pipe not existing voxl-camera-server (1.9.8 to 2.0.1) 2.0.1 * add boson sensor type * add C37 config 2.0.0 * fix C36 config 1.9.9 * add C36 - M0173 w/ imx412 and dual ar0144 voxl-configurator (0.7.8 to 0.8.5) 0.8.5 * D0008: update default services 0.8.4 * add thermalflow experimental mode 0.8.3 * D0008 swap lepton to manual mode 0.8.2 * Json option for calibration check * add starling 2 max rev2 question to voxl-configure-sku 0.8.1 * D0008 logic tweaks 0.8.0 * add voxl-vtx support 0.7.9 * add D0008 V5 support (C36) voxl-elrs (0.2.1 to 0.2.2) 0.2.2 * Fixed OS detection and enabled Multiarch voxl-esc (1.4.5 to 1.4.7) 1.4.7 * fpv esc param tweak 1.4.6 * enable pwm outputs * enable gpio toggling * add check for valid baud rate in params upload script * esc firmware v39.20 voxl-feature-tracker (0.3.14 to 0.4.1) 0.4.1 * add voxl-test-feature-extraction tool * improve overlay and command line options * make output pipe name an extenstion of input pipe 0.4.0 * big cleanup, bugfixes voxl-lepton-server (1.2.2 to 1.2.3) 1.2.3 * transition to only doing bulk reads voxl-logger (0.4.3 to 0.4.7) 0.4.7 * auto-logging daemon mode 0.4.6 * support auto-logging service, log when vehicle is armed 0.4.5 * OV support updates * added VFT feature logging voxl-mavcam-manager (0.5.6 to 0.5.7) 0.5.7 * update mavlink_sys_id logic voxl-mpa-tools (1.1.9 to 1.2.3) 1.2.3 * starling 2 max hw rev 2 extrinsics * add name print to voxl-inspect-extrinsics 1.2.2 * fix d0008_v5 extrinsics 1.2.1 * add voxl-inspect-vio tool 1.2.0 * add d0008_v5 extrinsics voxl-portal (0.6.9 to 0.7.0) 0.7.0 * fix url port lookup voxl-px4-params (0.4.7 to 0.5.3) 0.5.3 * D0008: modify default flight modes 0.5.2 * d0008 in-field tuning updates 0.5.1 * update osd params 0.5.0 * add flow_offboard exp params 0.4.9 * VFC updates * add initial D0015 param set 0.4.8 * D0008: param updates voxl-px4 (1.14.0-2.0.79 to 1.14.0-2.0.84) 1.14.0-2.0.84 * fix gpio not toggling if turtle mode enabled 1.14.0-2.0.83 * Added a remote OSD capability 1.14.0-2.0.82 * Major update of HITL. Now includes way to send VIO data externally to voxl-vision-hub for VFC. 1.14.0-2.0.81 * Make i2c driver mutex one per bus instead of a single static one * Add support for D0015 fixed wing 1.14.0-2.0.80 * Make sure correct OSD driver is started based on platform and VTX model voxl-utils (1.4.2 to 1.4.3) 1.4.3 * add wwan0 to network prefs voxl-vision-hub (1.8.3 to 1.8.9) 1.8.9 * fix buffer overflow in imu manager * add factory_enable_vfc_starling_flow option 1.8.8 * fix OSD formatting 1.8.7 * Changed backtrack to only be active while button is pressed, not on toggle * add factory_enable_vfc_fpv_flow configuration option 1.8.6 * Added backtrack feature to VFC * HITL support in VFC * Added optional method to drop out of VFC if desired flight mode is not available 1.8.5 * Updated Voxl Flight Controller (VFC) parameters for FPV 1.8.4 * Integration of Voxl Flight Controller (VFC) into voxl-vision-hub voxl-osd (initial release) ``` # SDK 1.3.3 Package List and Changelog ## SDK 1.3.3 Package List Release date: August 5, 2024 Package list and changes from SDK-1.3.2 to SDK-1.3.3 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.7 (unchanged) | | ✅ | | libmodal-cv | 0.5.8 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.1 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.6 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | libslpi-link | 1.0.0 (unchanged) | | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.19 (unchanged) | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.3 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.3.0 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.6 (unchanged) | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.9.8 (unchanged) | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.7.7 --> 0.7.8 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.2.1 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.4 --> 1.4.5 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.14 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.2 (unchanged) | ✅ | ✅ | | voxl-lepton-tracker | 0.0.1 (unchanged) | | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.3 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.6 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.2 (unchanged) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.9 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.9 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.12 (unchanged) | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.59 (unchanged) | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.9 (unchanged) | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.79 (unchanged) | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.4.7 (unchanged) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.4 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | voxl-state-estimator | 0.0.2 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.2 (unchanged) | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.3 (unchanged) | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | | voxl-vtx | 1.0.3 (unchanged) | | ✅ | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | | ✅ | ## SDK 1.3.3 Full Changelog (from SDK 1.3.2) ``` voxl-configurator (0.7.7 to 0.7.8) 0.7.8 * update OSD handling * load OSD params * add more modem definitions voxl-esc (1.4.4 to 1.4.5) 1.4.5 * make querying more robust * update D0013 params * add multi-arch support ``` # SDK 1.3.2 Package List and Changelog ## SDK 1.3.2 Package List Release date: July 31, 2024 Package list and changes from SDK-1.3.1 to SDK-1.3.2 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.7 (unchanged) | | ✅ | | libmodal-cv | 0.5.8 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.0 --> 2.10.1 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.5 --> 0.4.6 | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | libslpi-link | none --> 1.0.0 | | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.17 --> 1.1.19 | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.3 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.6 --> 0.3.0 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.6 (unchanged) | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.9.6 --> 1.9.8 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.7.2 --> 0.7.7 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.2.1 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.3 --> 1.4.4 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.14 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.1 --> 1.2.2 | ✅ | ✅ | | voxl-lepton-tracker | 0.0.1 (unchanged) | | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.1 --> 0.4.3 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.6 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.1 --> 1.4.2 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.2 --> 1.1.3 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.8 --> 1.1.9 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.8 --> 0.3.9 | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.12 (unchanged) | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.59 (unchanged) | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.9 (unchanged) | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.77 --> 1.14.0-2.0.79 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.4.5 --> 0.4.7 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.4 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | 0.0.1 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | voxl-state-estimator | none --> 0.0.2 | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.2 (unchanged) | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.0 --> 1.8.3 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | | voxl-vtx | 1.0.3 (unchanged) | | ✅ | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | | ✅ | ## SDK 1.3.2 Full Changelog (from SDK 1.3.1) ``` libmodal-pipe (2.10.0 to 2.10.1) 2.10.1 * add raw10 + raw12 support libqrb5165-io (0.4.5 to 0.4.6) 0.4.6 * remove unused google test stuff in build (for now) qrb5165-system-tweaks (0.2.6 to 0.3.0) 0.3.0 * add option to swap softap wifi mode between 2.4 and 5ghz voxl-camera-server (1.9.6 to 1.9.8) 1.9.8 * update D0013: C31 - dual ar0144 1.9.7 * fix bug where snapshots had double exif blocks, thanks @hlyvko ! * add milliseconds to snapshot file name to support rapid snapshots * keep either small video or preview streams running when using only snapshots to keep AE alive * OMX buffer fix to remove automatic memcopy voxl-configurator (0.7.2 to 0.7.7) 0.7.7 * add OSD driver handling and -X option to sku builder for certain drones 0.7.6 * D0008: re-enable voxl-mavcam-manager * D0008: no VIO by default 0.7.5 * D0008: enable voxl-streamer 0.7.4 * lots of changes for D0008 and experimental workflows 0.7.3 * add modem config to wizard voxl-esc (1.4.3 to 1.4.4) 1.4.4 * add pyc binaries for python 3.11 and 3.12 * add test script for pwm output command voxl-lepton-server (1.2.1 to 1.2.2) 1.2.2 * config mode for M0173 with rotated image for Starling 2 and Max voxl-logger (0.4.1 to 0.4.3) 0.4.3 * fix bug logging vio_data_t and qvio_extended R_imu_to_cam extrinsics 0.4.2 * replace runtime dependency libpng-dev with libpng16-16 voxl-mavlink-server (1.4.1 to 1.4.2) 1.4.2 * allow different mavlink dialects between autopilot and gcs (don't discard crc-failures on that traffic) voxl-modem (1.1.2 to 1.1.3) 1.1.3 * add microhard config option voxl-mpa-to-ros (0.3.8 to 0.3.9) 0.3.9 * add camera_info and cal data voxl-mpa-tools (1.1.8 to 1.1.9) 1.1.9 * add voxl-send-esc-pwm-cmd tool voxl-px4-params (0.4.5 to 0.4.7) 0.4.7 * D0008: fix some EKF2 params not setting 0.4.6 * update D0008 params from source voxl-px4 (1.14.0-2.0.77 to 1.14.0-2.0.79) 1.14.0-2.0.79 * Add VTX GPIO to voxl-esc 1.14.0-2.0.78 * Add VIO quality to OSD voxl-vision-hub (1.8.0 to 1.8.3) 1.8.3 * update backtrack default rc channel -> 10 * added rc monitoring for backtrack mode handling 1.8.2 * more stringent check when detecting autopilot sysid like we do in mavlink server 1.8.1 * add factory_enable_backtrack option libslpi-link (initial release) voxl-state-estimator (initial release) ``` # SDK 1.3.1 Package List and Changelog ## SDK 1.3.1 Package List Release date: July 15, 2024 Package list and changes from SDK-1.3.0 to SDK-1.3.1 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.7 (unchanged) | | ✅ | | libmodal-cv | 0.5.6 --> 0.5.8 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.0 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.5 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.14 --> 1.1.17 | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.3 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.6 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.4 --> 0.5.6 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.9.4 --> 1.9.6 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.6.6 --> 0.7.2 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.2.0 --> 0.2.1 | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.3 (unchanged) | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.10 --> 0.3.14 | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.6 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.1 (unchanged) | ✅ | ✅ | | voxl-lepton-tracker | 0.0.1 (unchanged) | | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.1 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.6 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.1 (unchanged) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.1.2 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.6 --> 1.1.8 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.8 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.11 --> 0.4.12 | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.53 --> 0.2.59 | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.6 --> 0.6.9 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.73 --> 1.14.0-2.0.77 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.4.2 --> 0.4.5 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.4 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-reset-slpi](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-reset-slpi) | none --> 0.0.1 | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.4.1 --> 1.4.2 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.7 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.8.0 (unchanged) | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | | voxl-vtx | 1.0.2 --> 1.0.3 | | ✅ | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | 0.0.3 (unchanged) | | ✅ | ## SDK 1.3.1 Full Changelog (from SDK 1.3.0) ``` voxl-camera-calibration (0.5.5 to 0.5.6) 0.5.6 * print pass or fail to the image overlay when complete voxl-camera-server (1.9.4 to 1.9.6) 1.9.6 * update to C29 config * OMX encoder settings tweak 1.9.5 * add C32 camera config for D0008 voxl-configurator (0.6.6 to 0.7.2) 0.7.2 * Starling 2 rotate lepton image 0.7.1 * toward D0015 support * better support for extras "-X" bitmask in SKU * print out extras names and modem configs in inspect-sku 0.6.10 * vins custom cam config handling 0.6.8 * add ghost radio helper to setup * add c29 extrinsics fro D0012 Starling 2 Max * print transmitter name in voxl-inspect-sku * add C29 as suggested config for D0012 0.6.7 * D0008 add suggestion for C32 cam config voxl-elrs (0.2.0 to 0.2.1) 0.2.1 * Add support for flashing iFlight Commando8 version 2 transmitter (FW: v3.4.2) * Small QoL update to debug python script for ELRS firmware development voxl-feature-tracker (0.3.10 to 0.3.14) 0.3.14 * make search params, sorting, and pixel filters configurable voxl-mpa-tools (1.1.6 to 1.1.8) 1.1.8 * add D0015 extrinsics 1.1.7 * add option to print a single measurement and return in voxl-inspect-vibration * voxl-inspect vibration now defaults to imu_apps for ease of use * new extrinsics for D0012 Starling 2 Max with C29 config (with TOF) voxl-portal (0.6.6 to 0.6.9) 0.6.9 * health check page under debug shows inspect services, calibration files and live vibration values * system check page under debug which runs the voxl health check 0.6.8 * Debug tab now has inspect services and system check 0.6.7 * new page under debug for health check which runs a health check and displays the results in a table voxl-px4-params (0.4.2 to 0.4.5) 0.4.5 * split out MPC params from Starling 2 drones * add disarm when kill switch is hit * tuning improvements 0.4.4 * add ghost radio helper 0.4.3 * update commando switch params voxl-px4 (1.14.0-2.0.73 to 1.14.0-2.0.77) 1.14.0-2.0.77 * Set the minimum scheduling interval for voxl2_io module to 5ms in order to fix rc input lag when all pwm outputs are disabled 1.14.0-2.0.76 * Fixed a small memory leak in uORBManager.cpp 1.14.0-2.0.75 * Moved to a new larger heap exposed by newer SLPI image and added some diagnostics 1.14.0-2.0.74 * Added new artifact mode to the voxl2 startup scripts voxl-utils (1.4.1 to 1.4.2) 1.4.2 * fix bug causing dpkg-query errors voxl-reset-slpi (none to 0.0.1) * initial release ``` # SDK 1.3.0 Package List and Changelog ## SDK 1.3.0 Package List Release date: June 3, 2024 Package list and changes from SDK-1.2.0 to SDK-1.3.0 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.5 --> 1.0.7 | | ✅ | | libmodal-cv | 0.4.0 --> 0.5.6 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.10.0 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.5 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.12 --> 1.1.14 | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.1 --> 0.1.3 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.6 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.1 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.4 --> 0.5.4 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.9.1 --> 1.9.4 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.5.6 --> 0.6.6 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.8 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.1 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 --> 0.2.0 | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.0 --> 1.4.3 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 --> 0.3.10 | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 --> 0.3.6 | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 --> 1.2.1 | ✅ | ✅ | | voxl-lepton-tracker | none --> 0.0.1 | | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.4.0 --> 0.4.1 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 --> 0.5.6 | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.4.0 --> 1.4.1 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.9 --> 1.1.2 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.5 --> 1.1.6 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 --> 0.3.8 | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.4 --> 0.4.11 | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.18 --> 0.2.53 | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.5 --> 0.6.6 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.68 --> 1.14.0-2.0.73 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.3.8 --> 0.4.2 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.2 --> 1.0.4 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.2 --> 0.3.4 | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.9 --> 1.4.1 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 --> 0.1.7 | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.4 --> 1.8.0 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | | voxl-vtx | none --> 1.0.2 | | ✅ | | [voxl2-io](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl2-io) | none --> 0.0.3 | | ✅ | ## SDK 1.3.0 Full Changelog (from SDK 1.2.0) ``` qrb5165-rangefinder-server (0.1.1 to 0.1.3) 0.1.3 * add test option to voxl-inspect-rangefinders * mods for M0157 0.1.2 * add config option for rangefinders on M0173 voxl-camera-calibration (0.5.4 to 0.5.5) 0.5.5 * increase tolerance for extrinsic reprojection error voxl-camera-server (1.9.1 to 1.9.4) 1.9.4 * add C31 camera config * fix exif GPS data * add exposure max for liow2 TOF to conf 1.9.3 * add initial m0173 configs * enable rotating TOF debug images to portrait mode for starling * add max exposure control for TOF * enable more framerates for TOF * fix TOF setup bugs * set LIOW2 TOF to default 10hz * tune point cloud processing params for LIOW2 1.9.2 * fix -C22 for D0013 voxl-configurator (0.5.6 to 0.6.6) 0.6.6 *added a -j/--json option to voxl-check-calibration 0.6.5 * force no RF assistance in flight (px4) 0.6.4 * support hot swap between E1 and E2 0.6.3 * update E4 config 0.6.2 * D0012/D0014 fixes * update transmitter list and logic 0.6.1 * add -X option for lepton 0.6.0 * add voxl-streamer config customization based on camera config 0.5.9 * only scan ELRS when necessary 0.5.8 * start D0012 and D0014 0.5.7 * enable M0065 experimental mode * start D0015 implementation voxl-elrs (0.1.3 to 0.2.0) 0.2.0 * Add M0139 support * Update logic/cleanup voxl-elrs script * Update voxl-configure-elrs to support 4 PWMs for M0139 * Fix bug in voxl-configure-elrs default CLI arg usage * Add ability to check current PWM config from voxl-configure-elrs * Update M0139 firmware to ELRS 3.3.2 * Update PWM defaults voxl-esc (1.4.0 to 1.4.3) 1.4.3 * improve spinup reliability on Starling 2 Max 1.4.2 * add misc params for tmotor 2203_5 1500kv with 6042_3 gemfan prop 1.4.1 * add params for Starling 2 voxl-feature-tracker (0.3.2 to 0.3.10) 0.3.10 * Change default features to 30 and change default L/R cam pipes 0.3.9 * Fix bug with multicam duplicate packets 0.3.8 * Fix overlay bug 0.3.7 * Added syncing between camera groups 0.3.6 * Updates to support new libmodal-cv functionality 0.3.5 * Fixes for ar144 camera 0.3.4 * added option to track using the CVP feature tracker 0.3.3 * add support for using 16-bit images and method to convert to 8-bit based on current and previous images * add parameters fast_threshold, min_temp_delta, hgraphy_min_pts * relax some parameters related to cornerSubPix and findHomography * add updates to timing data voxl-flow-server (0.3.3 to 0.3.6) 0.3.6 * use fixed height of 3m for range in voxl-flow-service.service * bug fix - actually use dt for flow vs gyro diff check * add feature to use simple relative height difference from start for range 0.3.5 * Change tracker to voxl-lepton-tracker 0.3.4 * add support for 16-bit images voxl-lepton-server (1.2.0 to 1.2.1) 1.2.1 * new mode for Lepton on M0173 * add factory_enable_manual option to voxl-configure-lepton * cleanup i2c traffic voxl-logger (0.4.0 to 0.4.1) 0.4.1 * Fixed CP Error Message voxl-mavcam-manager (0.5.3 to 0.5.6) 0.5.6 * fix broken ip autodetect 0.5.5 * Changed camera names from cameraX to underlying pipe name for easier identification 0.5.4 * Refactored the code into C++ to more easily support multiple connections each configured via the configuration file voxl-mavlink-server (1.4.0 to 1.4.1) 1.4.1 * bugfix in mission delay feature voxl-modem (1.0.9 to 1.1.2) 1.1.2 * added doodle-cli.sh helper script 1.1.1 * doodle conf update 1.1.0 * perf testing scripts voxl-mpa-to-ros (0.3.7 to 0.3.8) 0.3.8 * fix encoded video voxl-mpa-tools (1.1.5 to 1.1.6) 1.1.6 * new extrinsics for d0012 and d0014 voxl-portal (0.6.5 to 0.6.6) 0.6.6 * Camera List refreshes every second * render tof point clouds other than just "tof" * fix tof confidence and intensity buttons voxl-px4-params (0.3.8 to 0.4.2) 0.4.2 * Improved all Starling drone tunes 0.4.1 * VOXL 2 IO experimental params * increase GPS SACC required for position mode * update vins params 0.4.0 * Add helpers for Starling 18650 batteries 0.3.10 * Changed order of setting EKF2_GPS_CTRL and EKF2_HGT_REF for cases where it will cause an inconsistency * Added a set of VOXL 2 default parameters * Changed some sleep durations for voxl-px4 restarts 0.3.9 * initial d0012 and d0014 prarams voxl-px4 (1.14.0-2.0.68 to 1.14.0-2.0.73) 1.14.0-2.0.73 * Brought in update GPS drivers submodule with tx packet consolidation 1.14.0-2.0.72 * Removed set default parameters logic. Will now be done externally * Updated dependencies on libfc-sensor and modalai-slpi 1.14.0-2.0.71 * Added SLPI reset on px4 shutdown 1.14.0-2.0.70 * Added option to skip Spektrum protocol byte validation * Add HDZero OSD driver * More voxl-esc cleanups and fixes * voxl2_io cleanup and fixes 1.14.0-2.0.69 * Clean up voxl-esc init code so that version checks are done there and not in main loop voxl-qvio-server (1.0.2 to 1.0.4) 1.0.4 * fix sample vio mask 1.0.3 * add config option for tracking_front and tracking_down voxl-tflite-server (0.3.2 to 0.3.4) 0.3.4 * Allow YUV422 formatted images to be piped into tflite 0.3.3 * Fix enabled timing printouts voxl-utils (1.3.9 to 1.4.1) 1.4.1 * added a -j option to inspect services script for json output 1.4.0 * add platform config to voxl-version voxl-uvc-server (0.1.6 to 0.1.7) 0.1.7 * add standalone option for multiple instances voxl-vision-hub (1.7.4 to 1.8.0) 1.8.0 * Added the lost link backtracking feature with configurable amount of backtracking time * add textfile waypoint following feature voxl-lepton-tracker (Initial Release) voxl-vtx (Initial Release) voxl2-io (Initial Release) ``` # SDK 1.3.X Test Matrix | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.3.0 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0001 | [m500](/m500/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0003 | Seeker | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | D0004 | [Qualcomm Flight RB5 5G](/qualcommflightrb5/) Deprecated | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0005-4](/voxl2-d0005/) | [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0006-4](/voxl2-d0006/) | [Sentinel](/sentinel/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0011 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0012 | Starling 2 Max, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0014](/voxl2-d0014/) | Starling 2, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | --- Source: https://docs.modalai.com/sdk-1.2-release-notes/ # SDK 1.2.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) SDK 1.2 Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1 | ![Failed](/icons/circle-alert.svg) | | VOXL | M0006-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL Flight | M0019-2 | ![Yes](/icons/circle-check-big.svg) | | Qualcomm Flight RB5 | M0052-2 | ![No](/icons/link-2-off.svg) | | Flight Core v2 | M0087-1 | ![Yes](/icons/circle-check-big.svg) | | Flight Core v1 | M0018-1 | ![Yes](/icons/circle-check-big.svg) | The SDK-1.2.0 release on the QRB5165 platform use the 1.7.6 system image. See [here](/voxl2-voxl2-mini-system-image/) for system image release notes. > Updated Flight Core firmware is bundled in the APQ8096 SDK package and also available in the voxl-packages package repo here: [http://voxl-packages.modalai.com/dists/](http://voxl-packages.modalai.com/dists/) Don't forget to flash your flight core through QGC ([instructions here](/flight-core-v2-firmware/)) with the new firmware. # Table of contents 1. TOC --- # New Features in SDK 1.2.X - New Camera Support + liow2 ToF support + Improved calibration for ov9782 tracking cameras - PX4 + Support for VIO waypoint missions without GPS - Other + voxl-gpio improvements, now allows gpio reads on output + M0154 support in voxl-bind-spektrum + VOXL2: Ghost RC support + Start and stop options for voxl-replay, support for RAW16 images + Mission start delay option + New page in voxl-portal to download systemd service journal logs + Allow second camera in stereo pair to be used by voxl-qvio-server # SDK 1.2.0 Package List and Changelog ## SDK 1.2.0 Package List Release date: April 15, 2024 Package list and changes from SDK-1.1.3 to SDK-1.2.0 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libfc-sensor | 1.0.5 (unchanged) | | ✅ | | libmodal-cv | 0.4.0 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.9.2 --> 2.10.0 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.2 --> 0.4.5 | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | modalai-slpi | 1.1.12 (unchanged) | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.1 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.5 --> 0.2.6 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 --> 0.1.1 | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.3 --> 0.5.4 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.8.9 --> 1.9.1 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.5.2 --> 0.5.6 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.7 --> 0.4.8 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.0 --> 1.3.1 | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.4.0 (unchanged) | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.5 --> 0.4.0 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.3.2 --> 1.4.0 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.8 --> 1.0.9 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.3 --> 1.1.5 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.4.4 (unchanged) | | ✅ | | [voxl-open-vins-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server) | 0.2.18 (unchanged) | | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.3 --> 0.6.5 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.63 --> 1.14.0-2.0.68 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.3.3 --> 0.3.8 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.0 --> 1.0.2 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 --> 0.3.2 | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.8 --> 1.3.9 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.3 --> 1.7.4 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## SDK 1.2.0 Full Changelog (from SDK 1.1.3) ``` libmodal-pipe (2.9.2 to 2.10.0) 2.10.0 * add new tof2_data_t type for new PMD LIOW2 TOF sensor libqrb5165-io (0.4.2 to 0.4.5) 0.4.5 * allow gpio reads on output * voxl-gpio improvements 0.4.4 * fix bug where reading set direction 0.4.3 * add missing dependency on libmodal-journal qrb5165-system-tweaks (0.2.5 to 0.2.6) 0.2.6 * fix missing M0052 handling voxl-bind-spektrum (0.1.0 to 0.1.1) 0.1.1 * add support for M0154 (GPIO 20) voxl-camera-calibration (0.5.3 to 0.5.4) 0.5.4 * better intrinsic guess for ov9782 tracking cams voxl-camera-server (1.8.9 to 1.9.1) 1.9.1 * liow2 tof * new royale support 1.9.0 * targeted for SDK 1.2.x * swap to tof2_data_t type for tof publication to MPA * support for new voxl-fsync kernel module for synced cameras * temperarily add ar0144_slave drivers * new build dependency on voxl-cross:V2.7 * (qrb5165) requires new system image with royale-5-8-spectre-6-10 1.8.10 * fix cpu monitor not starting libmodalpipe helper (tof decimator feature) voxl-configurator (0.4.8 to 0.5.6) 0.5.6 * apq bug fix 0.5.5 * updated D0008-V4 support 0.5.4 * extend transmitter handling * add ghost rc support 0.5.3 * extend error handling 0.5.2 * add experimental mode handling * add voxl-configure-open-vins framework * kill voxl-mavlink-server before setting px4 params 0.5.1 * add support for fpv revb v4 * remove px4 params file before seting up voxl-px4 to ensure no old params survive 0.5.0 * fix D0013 board type 0.4.9 * new cal file check for dual ar0144 cams voxl-cpu-monitor (0.4.7 to 0.4.8) 0.4.8 * add perf mode config option voxl-docker-support (1.3.0 to 1.3.1) 1.3.1 * fix apq missing system.slice error voxl-esc (1.3.7 to 1.4.0) 1.4.0 * fix fpv m0138 params 1.3.9 * add support for fpv v4 * add "setup_starling_silver_motors" and "black motors" options * set cpu performance mode during firmware flash 1.3.8 * put fpvrevB back to silent (no) startup chirp voxl-logger (0.3.5 to 0.4.0) 0.4.0 * voxl-replay start and stop time options * tof2_data_t type support 0.3.12 * fixed typo in info/json 0.3.11 * added support for tof2 data type with automatic detection * added support for mavlink messages 0.3.10 * fixed include/exclude bug 0.3.9 * replaced timeout with -s/--start -f/--finish times * .clang-format added 0.3.8 * added -t/--timeout functionality to voxl-replay 0.3.7 * added population of camera info based on .csv values 0.3.6 * added replay support for RAW16 images * added option to only replay certain pipes from log with -e option voxl-mavlink-server (1.3.2 to 1.4.0) 1.4.0 * add mission delay feature * make detecting of autopilot sysid more robust * fix bug where autopilot reporting unix time of 0 breaks linux system time voxl-modem (1.0.8 to 1.0.9) 1.0.9 * fix bug in microhard logic voxl-mpa-tools (1.1.3 to 1.1.5) 1.1.5 * update to use new tof2_data_t type * add more data to voxl-inspect-tof 1.1.4 * update FPV tracking extrinsics for new mount * add a downward tracking extrinsic for experimentation voxl-portal (0.6.3 to 0.6.5) 0.6.5 * new page to download systemd service journals * updates to health check 0.6.4 * migrate to new tof2_data_t type * auto restart service on crash voxl-px4-params (0.3.3 to 0.3.8) 0.3.8 * update D0013 params 0.3.7 * add D0008-V4 param file 0.3.6 * add experimental section 0.3.5 * D0008 to Lithium Ion battery 0.3.4 * test and validate param reset option * make param uploading more robust voxl-px4 (1.14.0-2.0.63 to 1.14.0-2.0.68) 1.14.0-2.0.68 * A couple of voxl2_io driver updates to improve initial protocol check and calibration 1.14.0-2.0.67 * Support for VIO waypoint missions without GPS. With or without magnetometer. * Miscellaneous HITL infrastructure improvements 1.14.0-2.0.66 * Improved the timeout mechanism on the muorb aggregator to avoid unneeded data sends * Added the ORB queue length to the meta data so that it can be properly set by the UORB COMMUNICATOR interface code * Fixed missing queue length adjustment from remote topics * Added param client / server status values * Fixed a uORB / muorb subscription issue that was causing duplication of topic publication data * Added some useful statistics and status reporting to the muorb modules * add params and set flags in case of ESC warn and over temperature events (#53) 1.14.0-2.0.65 * Updates to the voxl2_io version check to allow retries with eventual failure 1.14.0-2.0.64 * 60k RPM support in voxl-esc driver * HITL parameters to control sending of sensor_gps and sensor_mag * GPS UBX driver changes for baudrate ordering, BBR writes, and retries to help with M10 * Move time offset to apps side so that DSP is now the timing center. voxl-qvio-server (1.0.0 to 1.0.2) 1.0.2 * expose the image mask feature in the config file 1.0.1 * allow second camera of a stereo pair to be used * extend low-feature init timeout to 3s voxl-tflite-server (0.3.1 to 0.3.2) 0.3.2 * add dynamic reading for number of yolo classes voxl-utils (1.3.8 to 1.3.9) 1.3.9 * add libfc_sensor to voxl-version voxl-vision-hub (1.7.3 to 1.7.4) 1.7.4 * update to use the new tof2_data_t type for TOF VOA ``` # SDK 1.2.X Test Matrix | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.2.0 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0001 | [m500](/m500/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0003 | Seeker | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0004 | [Qualcomm Flight RB5 5G](/qualcommflightrb5/) Deprecated | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0005-4](/voxl2-d0005/) | [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | [D0006-4](/voxl2-d0006/) | [Sentinel](/sentinel/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0011-4 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0012-4 | Starling 2 Max, see: [Starling](/starling/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0014-4](/voxl2-d0014/) | Starling 2, see: [Starling](/starling/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0015-4](/voxl2-D0015/) | Fixed Wing (WIP) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | --- Source: https://docs.modalai.com/sdk-1.1-release-notes/ # SDK 1.1.X Release Notes Available now at [https://downloads.modalai.com](https://downloads.modalai.com) SDK 1.1 Support Matrix | Platform | PCB Targets | Support Status | |---------------------|------------------------------------|--------------------------------------------------------| | VOXL 2 | M0054-1, M0054-2, M0154-1, M0154-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL 2 Mini | M0104-1 | ![Yes](/icons/circle-check-big.svg) | | VOXL | M0006-2 | ![Yes](/icons/circle-check-big.svg) | | VOXL Flight | M0019-2 | ![Yes](/icons/circle-check-big.svg) | | Qualcomm Flight RB5 | M0052-2 | ![Yes](/icons/circle-check-big.svg) | | Flight Core v2 | M0087-1 | ![Yes](/icons/circle-check-big.svg) | | Flight Core v1 | M0018-1 | ![Yes](/icons/circle-check-big.svg) | The SDK-1.1.0 - SDK-1.1.2 releases on the QRB5165 platform use the 1.7.1 system image while SDK-1.1.3 uses the 1.7.4 system image. See [here](/voxl2-voxl2-mini-system-image/) for system image release notes. > Updated Flight Core firmware is bundled in the APQ8096 SDK package and also available in the voxl-packages package repo here: [http://voxl-packages.modalai.com/dists/](http://voxl-packages.modalai.com/dists/) Don't forget to flash your flight core through QGC ([instructions here](/flight-core-v2-firmware/)) with the new firmware. # Table of contents 1. TOC --- # New Features in SDK 1.1.X - APQ8096 and RB5 support - Now all VOXL and RB5 products run the same SDK across the board! - ROS2 Foxy Support - voxl-mpa-to-ros2 node - DDS integration with PX4 on SDSP - offboard figure 8 example - instructions [here](/ros2-installation-voxl2/) - PX4 1.14 on Flight Core - Our Flight Core V1 and V2 images are now build from the same codebase as the PX4 version running on VOXL 2 SDSP ensuring predictable PX4 behavior across the product line. - New Camera Support + VOXL 2 now supports native full resolutions for IMX412 + Lens shading correction for IMX214 + New AR0144 WXGA fisheye tracking camera support + New Custom camera configuration method + Raw Data Interface and accelerated debayering for OV9782 for improved VIO - New Tools + voxl-record-raw-image + voxl-image-stats + voxl-bayer-stats - Other + Improved thresholding in voxl-calibrate-camera that's less sensitive to lighting conditions + fix docker on qrb5165 + 16-bit raw lepton thermal camera data pipe + neopixel support through voxl-esc + Send VIO packets with quality=-1 to PX4 on VIO failure to utilize PX4's new quality metric functionality and make for more graceful fallback to altitude flight mode. + CVP-accelerated image rectification for depth from stereo pipeline. + Fix race condition when two clients of the same name connect at the same time. + QRB5165 platforms can now communicate with external autopilots through SDSP-attached UART ports allowing easy connectivity through the normal ESC port when not using PX4-on-SDSP + Add M0065 SBUS support with new dsp_sbus driver # SDK 1.1.3 Package List and Changelog ## SDK 1.1.3 Package List Release date: February 26, 2024 Package list and changes from SDK-1.1.2 to SDK-1.1.3 | Package | Version | APQ8096 | QRB5165 | |-:---------------------------------------------------------------------------------------------------------|-:-:-----------------------|-:-:-----|-:-:-----| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.4.0 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.9.2 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.2 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.1 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.1 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.3 --> 0.2.6 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.8.9 (unchanged) | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.4.8 --> 0.5.2 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.7 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.0 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.3.7 --> 1.4.0 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.5 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.3.2 (unchanged) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.8 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.3 (unchanged) | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.63 (unchanged) | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.3.3 (unchanged) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.0 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.3 --> 1.3.8 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.3 (unchanged) | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## SDK 1.1.3 Full Changelog (from SDK 1.1.2) ``` qrb5165-system-tweaks (0.2.3 to 0.2.6) 0.2.6 * fix missing M0052 handling 0.2.5 * voxl-platform uses the new kernel module instead of looking in rootfs * new tool voxl-variant 0.2.4 * speed up voxl-platform voxl-configurator (0.4.8 to 0.5.2) 0.5.2 * add experimental mode handling * add voxl-configure-open-vins framework * kill voxl-mavlink-server before setting px4 params 0.5.1 * add support for fpv revb v4 * remove px4 params file before setting up voxl-px4 to ensure no old params survive 0.5.0 * fix D0013 board type 0.4.9 * new cal file check for dual ar0144 cams voxl-esc (1.3.7 to 1.4.0) 1.4.0 * fix fpv m0138 params 1.3.9 * add support for fpv v4 * add "setup_starling_silver_motors" and "black motors" options * set cpu performance mode during firmware flash 1.3.8 * put fpvrevB back to silent (no) startup chirp voxl-utils (1.3.3 to 1.3.8) 1.3.8 * fix default machine and variant in voxl-version 1.3.7 * add neofetch 1.3.6 * voxl-version: use voxl-platform-mod output if available 1.3.5 * speed up voxl-version and welcome screen 1.3.4 * add "-j" (json) option to voxl-version ``` # SDK 1.1.2 Package List and Changelog ## SDK 1.1.2 Package List Expected release date: December 15, 2023 Package list and changes from SDK-1.1.1 to SDK-1.1.2 | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.1.0 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.4.0 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.9.2 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.2 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.0 --> 1.0.1 | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.1.0 --> 0.1.1 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.3 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.8.7 --> 1.8.9 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.4.5 --> 0.4.8 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.7 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.0 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.3.6 --> 1.3.7 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.5 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.3.2 (unchanged) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.8 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.2 (unchanged) | | ✅ | | voxl-neopixel-manager | 0.0.3 (new) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.2 --> 0.6.3 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.59 --> 1.14.0-2.0.63 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.3.2 --> 0.3.3 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 1.0.0 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.3 (unchanged) | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.2 --> 1.7.3 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## SDK 1.1.2 Full Changelog (from SDK 1.1.1) ``` qrb5165-imu-server (1.0.0 to 1.0.1) 1.0.1 * fix timestamp irregularities when CPU is heavily loaded qrb5165-rangefinder-server (0.1.0 to 0.1.1) 0.1.1 * update direction vector and location for downward sensor voxl-camera-server (1.8.7 to 1.8.9) 1.8.9 * allow duplicate cam id's in config file as long as they are disabled * parse independent exposure setting if stereo cam has secondary id=0 * start the gps client later, after all normal setup steps 1.8.8 * add feature to attempt skipping potentially unplugged cameras during startup * fix bug that might retrieve gain limits incorrectly where camId doesn't match the camera index in config file (rare) * now exit with an error if no cameras could be started instead of spinning forever. * add temporary fixed ar0144 driver * change cam config 20 for D0011 Starling PX4 edition * add cci-direct tweaks to set ov7251 blc to every frame. fixes flicker voxl-configurator (0.4.5 to 0.4.8) 0.4.8 * add ELRS scan and update to sentinel V2 config 0.4.7 * small polishes to voxl-configure-sku * add new V3 version to starling to reflect new black motors * D0010 and D0011 now use ESC params for black motors 0.4.6 * set px4 params for D0006 sentinel V2 voxl-esc (1.3.6 to 1.3.7) 1.3.7 * added params for new starling black motors * new V39 RC9 firmware with current limiting optional feature * new V39 RC9 firmware with bugfix for rare glitch voxl-portal (0.6.2 to 0.6.3) 0.6.3 * make gyro accel labels in fft visible again * trim dark/light mode header * add some more title text to version and services * stop trying to "cleanup" the names of camera pipes voxl-px4-params (0.3.2 to 0.3.3) 0.3.3 * add commando 8 params to sentinel V2 voxl-px4 (1.14.0-2.0.59 to 1.14.0-2.0.63) 1.14.0-2.0.63 * Add voxl-esc back into apps side build to fix missing actuators tab on QGC * Added default parameters for voxl2_io so that it shows up on QGC actuators tab 1.14.0-2.0.62 * Fixed the status LED logic to not blink PURPLE if the COM_CPU_MAX parameter is set to disabled * Added check to make sure that hrt_elapsed_time can never be negative and consequently become a huge positive value since the value is unsigned - This time in the right place! * Added second instance of cpu load so that both DSP and Apps can report and log it * Start apps instance of load_mon in HITL as well * Change CPU load to a system CPU load that captures all processes and a process CPU load that captures just the PX4 process 1.14.0-2.0.61 * Added apps_sbus driver to support M0065 SBUS on apps processor for M0052 * Fixed units on cpuload topic for Qurt platform * Added check to make sure that hrt_elapsed_time can never be negative and consequently become a huge positive value since the value is unsigned * Change default value of the GF_PREDICT parameter to zero since the geofence prediction doesn't work very well 1.14.0-2.0.60 * Change default value of the GF_PREDICT parameter to zero since the geofence prediction doesn't work very well * Added check to make sure that hrt_elapsed_time can never be negative and consequently become a huge positive value since the value is unsigned voxl-vision-hub (1.7.2 to 1.7.3) 1.7.3 * fix annoying but harmless print when rangefinder data is missing direction vector ``` # SDK 1.1.1 Package List and Changelog ## SDK 1.1.1 Package List Expected release date: December 1, 2023 Package list and changes from SDK-1.1.0 to SDK-1.1.1 | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.3 --> 1.1.0 | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.4.0 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.9.2 (unchanged) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.2 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.0 (unchanged) | | ✅ | | [qrb5165-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) | 0.0.4 --> 0.1.0 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.3 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.1 --> 0.5.3 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.8.7 (unchanged) | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.4.4 --> 0.4.5 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.7 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.0 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 (unchanged) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.3.4 --> 1.3.6 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 (unchanged) | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.5 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.3.1 --> 1.3.2 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.8 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.2 --> 1.1.3 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) | 0.0.1 --> 0.0.2 | | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.2 (unchanged) | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.55 --> 1.14.0-2.0.59 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.2.7 --> 0.3.2 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.9.4 --> 1.0.0 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 (unchanged) | | ✅ | | [voxl-ros2-foxy](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ros2-foxy) | 0.0.1 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.3 (unchanged) | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.1 --> 1.7.2 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## SDK 1.1.1 Full Changelog (from SDK 1.1.0) ``` qrb5165-rangefinder-server (0.0.4 to 0.1.0) 0.1.0 * add publishing downward rangefinder to mavlink voxl-camera-calibration (0.5.1 to 0.5.3) 0.5.3 * fix white border feature * improve bash completion 0.5.2 * for fisheye lenses use resolution to predict staring point for focal length * add additional fudge factor at far corners to help with fisheye lens shading * new targets for wide fisheye (M0149 AR0144 tracking) * enable chessboard detection even when exceeding borders slightly voxl-configurator (0.4.4 to 0.4.5) 0.4.5 * D0011 enable d0011 extrinsics * enable new downward mode for rangefinder on D0011 voxl-esc (1.3.4 to 1.3.6) 1.3.6 * fix kv for backemf compensation on Starling 1.3.5 * add sleep after stopping voxl-px4 to improve reliability * increase tune power on starling to work with M0129 voxl-mavlink-server (1.3.1 to 1.3.2) 1.3.2 * re-enable timsync on px4 slpi behind the en_timesync params * add note to config file header voxl-mpa-tools (1.1.2 to 1.1.3) 1.1.3 * fix erroneous "fail" print during configure extrinsics * fix y location not being printed in voxl-inspect-detections * add D0011 starling px4 edition extrinsics voxl-px4-params (0.2.7 to 0.3.2) 0.3.2 * set EKF2_EV_QMIN to 1 to prevent ekf2 switching during fast yaw 0.3.1 * add warning for incompatible parameters 0.3.0 * new tune for Starling and Starling PX4 edition * add helper for voxl2 io pwm out * migrate esc params to new "VOXL_ESC_*" name prefix to match new voxl-px4 package 0.2.8 * fix naming for a couple MPC_* params * start D0011 Starling PX4 edition tune voxl-px4 (1.14.0-2.0.55 to 1.14.0-2.0.59) 1.14.0-2.0.59 * Added version check on initialization for voxl2_io 1.14.0-2.0.58 * Renamed modal_io to voxl_esc, including all associated parameter names * Added support for voxl2_io * Added support for RC GHST protocol on FlightCore and VOXL2 1.14.0-2.0.57 * Changed GPS, magnetometer, and status LED configuration to auto-detection * Some updates to the gazebo HITL support 1.14.0-2.0.56 * Implemented a backwards compatible way to check for the DSP CPU load * Added docker build files and scripts for gazebo (with patches) voxl-qvio-server (0.9.4 to 1.0.0) 1.0.0 * soft lower limit on the quality metric so prevent falsely reporting error during fast yaw motion * fix bug when using the blanking feature of voxl-reset-qvio voxl-vision-hub (1.7.1 to 1.7.2) 1.7.2 * fix annoying but harmless print when rangefinders are present but report no distance. * send a new heartbeat from MAV_COMP_ID_OBSTACLE_AVOIDANCE to support new PX4 requirements voxl-mpa-to-ros2 0.0.2 * add voxl-ros2-foxy dependency to deb package to fix build chain ``` # SDK 1.1.0 Package List and Changelog ## SDK 1.1.0 Package List Released Nov 10, 2023 Package list and changes from SDK-1.0.0 to SDK-1.1.0 | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.3 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.2.3 --> 0.2.1 | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.4.0 --> 0.3.2 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.1.0 --> 0.0.7 | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.2 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.9.2 --> 2.8.4 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.4.2 --> 0.2.0 | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.4.2 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.2.1 --> 0.1.5 | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.2.0 --> 0.1.0 | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 1.0.0 --> 0.6.0 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.2.3 --> 0.2.2 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 (unchanged) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (unchanged) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.5.1 --> 0.4.0 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.8.7 --> 1.6.2 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 2:1.14.0-10 --> 1.14.0-9 | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.4.4 --> 0.2.7 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.4.7 --> 0.4.6 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.3.0 --> 1.2.5 | ✅ | ✅ | | [voxl-eigen3](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-eigen3) | 3.4.0 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.1.3 --> 0.0.7 | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.3.4 --> 1.2.0 | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.3.2 --> 0.2.3 | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (unchanged) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-5 --> 2.1.3-4 | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.2.0 --> 1.1.2 | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.5 --> 0.3.4 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.2.0 --> 0.1.7 | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.3 --> 0.5.1 | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.1 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 1.3.1 --> 1.2.0 | | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 1.0.8 --> 1.0.5 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 1.1.2 --> 1.0.4 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.7 --> 0.3.6 | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-2 --> 4.5.5-1 | ✅ | ✅ | | voxl-open-vins | 0.4.4 --> 0.3.0 | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.6.2 --> 0.5.8 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.14.0-2.0.55 --> 1.14.0-2.0.34 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.2.7 --> 0.1.8 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.9.4 --> 0.9.3 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.9 --> 0.0.8 | | ✅ | | [voxl-slpi-uart-bridge](https://gitlab.com/voxl-public/voxl-sdk/core-libs/voxl-slpi-uart-bridge) | 1.0.1 (new) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.7.4 --> 0.7.1 | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.3.3 --> 1.3.1 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.6 (unchanged) | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.7.1 --> 1.6.6 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.5 --> 1.1.3 | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## SDK 1.1.0 Full Changelog (from SDK 1.0.0) ``` libmodal-cv (0.3.2 to 0.4.0) 0.4.0 * minor version bump to reflect new cvp dewarp and dfs dependency * fix deprecated warning for mcv_en_debug_prints * go to consistent naming for dfs and undistort cvp configs (WARNING might break symbols) 0.3.3 * Added `lens.h` for working with stereo and mono lenses * Added `undistort_cvp.h` for computing undistortions with CVP hardware * Modified `dfs.h` to use sessions rather than static variables * Created `private_types.h`, defining undistortion and DFS sessions libmodal-exposure (0.0.8 to 0.1.0) 0.1.0 * prevent MSV returning NAN when whole image is saturated 0.0.9 * consider anything >=253 saturated libmodal-pipe (2.8.5 to 2.9.2) 2.9.2 * improve pipe_server cleanup step * automatically truncate long client names when constructing a new pipe path * increase random digits to 8 * make sure random digits are positive and have leading zeros 2.9.1 * fix regression on old platforms where glibc was <2.25 2.9.0 * remove limit of number of parallel clients with the same name * each client now gets a new unique pipe filename with each connection * remove useless detection of same-client reconnects * fix bug where multiple clients with the same name clash if connecting too fast libqrb5165-io (0.2.0 to 0.4.2) 0.4.2 * rename voxl_io_gtest to qrb5165-io-gtest * bugfixes in uart ringbuffer 0.4.1 * apply strict version "provide" for voxl-slpi-uart-bridge 0.4.0 * add support for SLPI uart * add voxl_uart_init_legacy_slpi for voxl-esc and voxl-elrs to use 0.3.3 * add functions for 16-bit register i2c read and writes 0.3.2 * Update SPI MAX_BUS from 16 to 20 to account for 20 QUPs 0.3.1 * fix GPIO 152-155 as ALL (not OUT) * remove chatty output on gpio setting 0.3.0 * add GPIO functions * refactor some example names * add support for SLPI uart qrb5165-dfs-server (0.1.0 to 0.2.0) 0.2.0 * refactor to use CVP dewarp * new config options for xga images * new dependency on libmodalcv 0.4.0 qrb5165-imu-server (0.6.0 to 1.0.0) 1.0.0 * add correct imu data rotation for M0104 VOXL2 mini 0.9.2 * fix build-time regression due to libqrb5165-io update 0.9.1 * resync deb version with tag voxl-camera-calibration (0.4.0 to 0.5.1) 0.5.1 * add extrapolation towards edges of thresholding to help with extreme lens shading 0.5.0 * new threshold algo and other improvements voxl-camera-server (1.6.2 to 1.8.7) 1.8.7 * fix bug where color images debayered to RGB still said NV12 in the pipe info json * add support for Rotating AR0144 image 1.8.6 * put old exposure settings back for now until we do testing * more ar0144 support * add exposure and gain upper and lower limits to config file 1.8.5 * add cam config 22 for D0013 * fix sentinel front stereo flip on old system image * fix jpeg snapshots being cut short by 1 byte 1.8.4 * voxl-configure-cameras better handling of new custom config file when fresh/missing * dynamically set libmodal_exposure gain limits based on hal3 reported numbers in prep for system image 1.7.x gain scaling change * set C18 config name * favor faster exposure times for vio cameras 1.8.3 * config file now has simple boolean for raw data preview true/false * remove old pre_format field from config file * fix regression in debayer processing * white balance for m0113 ov9782 without IR filter * add single mode option for combo sensors * allow both "snapshot-no-save" and "snapshot_no_save" commands 1.8.2 * split up buffergroup mutex per group now * voxl-camera-server -l stops the background service before running * pick imx214 and imx412 resolutions based on system image version * workaround bug in cam config helper * pick Sentinel Stereo flip based on system image 1.8.1 * new camera configs 18-21 * new config file option to rotate stereo cams independently * flip Sentinel front stereo back around now that the driver is unflipped 1.8.0 * add software debayering for OV9782 when running in raw preview mode * new tools voxl-bayer-stats and voxl-image-stats to help with image tuning * increase AE brightness for ov9782 * new rotate feature via cci-direct for ov7251 and ov9782 * add while balance for ov9782 when in RAW mode * add soft min exposure field to config file for MSV mode * migrate all camera configs to files * polish qrb5165-configure-cameras 1.7.2 * improve voxl-camera-server -l information list * fix raw10 -> raw8 conversion with GBM buffers * fix segfault on start if camera is disconnected but still enabled * fix bug where pipe commands for exposure could break slave camera when not enabled 1.7.1 * Small improvements to custom camera config * fix stride for ov7251 on qrb5165 * discard stride completely on apq8096 * fix some more uninitialized variables 1.7.0 * add C17 IMX412 + TOF + Tracking + stereo 9782 * swap qrb5165 buffer allocation to GBM * increase some default resolutions to full sensor res thanks to GBM * new experimental custom-camera-config file method for configuration voxl-configurator (0.2.7 to 0.4.4) 0.4.4 * D0010 moved to new D0010 px4 params 0.4.3 * add voxl2-mini support in qvio section of configure-mpa 0.4.2 * fix D0013 config 0.4.1 * treat sentinel and voxl2 flight deck the same 0.4.0 * add sku handling for -M, -T, and -X 0.3.9 * new config options for configuring px4 for d0006-v2, d0010, and d0013 * differentiate Sentinel D0006 V1 and V2 * voxl-configure-mpa adds a more helpful error message if a package is missing * better seeker support for both cam config options 0.3.8 * set up d0010 calibration list 0.3.7 * fix rb5 imu disable flag 0.3.6 * add retry feature to voxl-configure-mpa 0.3.5 * finish D0010 and D0011 integration * voxl-configure-sku polished cam config step allows to auto-choose default 0.3.4 * first pass at adding D0010 and D0011 0.3.3 * fix board-only custom camera sku parsing 0.3.2 * add support for custom camera config to construct sku wizard 0.3.1 * add support for -CC flag in SKU for custom camera config 0.3.0 * add cal files for starling with stereo * add lepton lens cal for fpv * fix fpv lens cal filename * remove redundant line in voxl-configure-mpa 0.2.9 * Added D0004 factory test * Added D0004 json * Add px4-imu test 0.2.8 * Fix voxl-camera-server pipe names in voxl-health-check * Fix small input_rc bug in voxl-health-check voxl-docker-support (1.2.5 to 1.3.0) 1.3.0 * cleanup qrb5165 install * remove our own daemon systemd service, just use the docker one voxl-elrs (0.0.7 to 0.1.3) 0.1.3 * Fix TX flashing bug 0.1.2 * new dependency on voxl_uart_init_legacy_slpi from libqrb5165-io (0.4.0) * Allow PWM outputs on Ch1-4 for supported STM32 based receivers (FrSky R9Mini for now) 0.1.1 * Updated flashing for BetaFPV Nano Rx receiver to guide user through the process of recovering receiver when flashing fails * When updating firmware, will now automatically retry flashing the device if device failed to sync or go into bootloader mode * Small updates to wizard menus (more options for flashing receiver) * Improved flashing reliability for receivers with esp8266 based chips (BetaFPV) by updating flashing script to better accommodate for delay in communication with SLPI * Add voxl-configure-elrs and PWM configuration for supported receivers (FrSky R9MM/Mini right now) * Add PWM-over-IP support for R9Mini using a steam deck * Fix TX flash bug * Add r9mini uart flash wrapper script 0.1.0 * Enable flash FrSky R9Mini via UART on voxl2 (J19) * Add recovery option for BetaFPV Nano RX that is bricked * Add voxl-esc dependency 0.0.9 * Finish implementation of unbind command * Add FrSky R9Mini application binary to esptool submodule * Add scan and firmware upgrade support for R9Mini 0.0.8 * Fix bug when flashing transmitter * add initial unbind command file * add crc calculation tool voxl-esc (1.2.2 to 1.3.4) 1.3.4 * V39 RC6 firmware with extended RPM packet support 1.3.3 * new dependency on voxl_uart_init_legacy_slpi from libqrb5165-io (0.4.0) 1.3.2 * fix param readback bug in v39 firmware 1.3.1 * add M0052 target support 1.3.0 * v39 RC4 firmware with neopixel led support 1.2.3 * put Seeker and RB5 params back to 250000 baud to work with old SDK * swap sentinel startup tune back to default * make fpv startup tune silent * sentinel slower and more robust startup voxl-feature-tracker (0.2.3 to 0.3.2) 0.3.2 * this version includes many changes for flir lepton optical flow * change overlay video to RGB and add more details * add flowback check * add parameter for subpixel refinement * add parameter for blur feature * add parameters for lk and homography features * add vft log mpa output controlled by en_logging parameter * merge in upstream changes from v0.2.3 0.2.4 * Remove voxl-eigen3 as a runtime dependency voxl-lepton-server (1.1.2 to 1.2.0) 1.2.0 * add a new pipe publishing original 16-bit raw data voxl-logger (0.3.4 to 0.3.5) 0.3.5 * added logging of RGB images * added logging of binary data to a data.raw file to log arbitrary packets and parse them later (-w option) * added logging of vft_feature_packet data to a csv with the -r option voxl-mavcam-manager (0.5.1 to 0.5.3) 0.5.3 * improve parsing of voxl-my-ip output * add prints to help the user debug which URI is being advertized 0.5.2 * allow user to set their own default URI * allow user to disable the auto uri update * handle the case where voxl-my-ip fails during auto update voxl-mavlink-server (1.2.0 to 1.3.1) 1.3.1 * remove libqrb5165-dependency for now to unlock APQ8096 builds 1.3.0 * migrate to libqrb5165-io for uart * new dependency on libqrb5165-io >=0.4.0 1.2.1 * fix bus error on APQ8096 voxl-modem (1.0.5 to 1.0.8) 1.0.8 * Update udp_mtu in voxl-mavlink-server for Doodle modems 1.0.7 * add DTC support 1.0.6 * add basic qrb5165 Sierra EM9191 support voxl-mpa-to-ros (0.3.6 to 0.3.7) 0.3.7 * fix publishing stereo images * fix publishing AI detections from voxl-tflite-server voxl-mpa-tools (1.0.4 to 1.1.2) 1.1.2 * add D0013 extrinsics file * update fpv revb extrinsics file for tracking cam mount revision * improve voxl-inspect-detections 1.1.1 * add helpful instructions to view rgb output in voxl-record-raw-image 1.1.0 * new tool voxl-record-raw-image 1.0.5 * csv format option in voxl-inspect-imu * cleanup unused fields in Sentinel and Starling extrinsics files voxl-portal (0.5.9 to 0.6.2) 0.6.2 * add support for RAW16 images 0.6.1 * new page for VIO debug * improve 3D viewports 0.6.0 * Changed dark mode button to be more easily identifiable * Mapper will only be accessible if voxl-mapper is installed * Implemented hires small h264 video stream using JMuxer * Implemented hires snapshot camera * Added new snapshot button to cameras that have the snapshot option enabled and this allows a snapshot command to be sent through that current camera pipe * New option under debug tab that allows you to see voxl-version info * New option under debug tab that allows you to inspect the services that are currently running * Included current voxl-suite number in header * Table stats are now on by default * Multiview cameras are off by default allowing users to select which ones they wish to see * Added hires small h264 camera to available options in multiview mode * Fixed issue that caused header drop downs to become unresponsive 0.5.11 * added D0004 support in portal api support cpp 0.5.10 * update arm/disarm logic in portal-parser * add params to be loaded for D0004 in portal-parser voxl-px4-params (0.1.8 to 0.2.7) 0.2.7 * put M500 back to old stable PIDs in 1.14 M500 tune * resync divergence of FCV1 and FCV2 1.14 M500 params 0.2.6 * update M500 FCv1/FCv2 to use dhsot in new CA_* paradigm 0.2.5 * increase EKF2_EV_QMIN to 10 0.2.4 * smoother takeoff for starling and others * first attempt at px4 1.14 params for Seeker and M500 * disable pos/vel switch using MPC_HOLD_MAX_XY param 0.2.3 * cleanup fpv tune * initial attempt to remove fpv MPC wobble 0.2.2 * starting point for D0013, mostly placeholder right now 0.2.1 * Automatically retry upload parameter on failure * Validate that parameters are successfully uploaded after uploading a file * Set EFK2_EV_QMIN to 1 in EKF2_helpers/indoor_vio.params and EKF2_helpers/vio_gps_baro.params 0.2.0 * Modify RC_MAP_KILL_SW for FPV platform 0.1.9 * Added COM_CPU_MAX for FPV platform * Redid COM_OF_LOSS_T setting for FPV platform voxl-px4 (0.1.8 to 0.2.7) 1.14.0-2.0.57 * Changed GPS, magnetometer, and status LED configuration to auto-detection * Some updates to the gazebo HITL support 1.14.0-2.0.56 * Implemented a backwards compatible way to check for the DSP CPU load * Added docker build files and scripts for gazebo (with patches) 1.14.0-2.0.55 * Updates to mc inject system id parameters * Restart system id when props not armed 1.14.0-2.0.54 * Added support for protocol version 0x01 in SpektrumRC driver 1.14.0-2.0.53 * new voxl-configure-px4 options for d0010, d0011, d0013, and generic voxl2-mini * new voxl-configure-px4 options for sentinel_v2 aka d0006_v2 * Add microdds_client for ROS2 support * Remove bad characters from postinst causing installation errors * Remove prepare-fc-image.sh, not needed anymore 1.14.0-2.0.52 * Add modal_io_bridge to postinst * Add daemon restart attempt to postinst * Compensate for queueing delays in GPS and RC input * Add modal_io_bridge to allow raw UART commands to be passed to modal_io endpoints * Reduce mavlink barometer updates from 20Hz to 10Hz * Add onboard mavlink stream to HITL start file for MAVSDK interface 1.14.0-2.0.51 * Add rc_input to postinst for M0052 target 1.14.0-2.0.50 * Removed 6 extra 1 second sleeps in the start sequence to make it faster * Changed some configuration items for startup for mRo GPS, and power manager * Increased vehicle command topic queue length to prevent lost commands during calibration 1.14.0-2.0.49 * Added new elrs_led driver to allow setting LED based on button presses coming from ground control station 1.14.0-2.0.48 * Updated the rate for onboard consumers of the SCALED_PRESSURE Mavlink message 1.14.0-2.0.47 * Added new configuration option for mRo GPS unit 1.14.0-2.0.46 * Added support for the Lightware SF000 distance laser sensor 1.14.0-2.0.45 * add MC_THR_CURVE_ACR to specify throttle curve behavior in Acro mode 1.14.0-2.0.44 * Add M0065 SBUS support with new dsp_sbus driver 1.14.0-2.0.43 * Add HITL * Add param to control publishing of battery_status from mini esc * Update logic to only process most recent update in manual_control module * Add ist8308 magnetometer driver to SLPI build 1.14.0-2.0.42 * Changes default commander mode to manual * Fixes SITL 1.14.0-2.0.41 * ESC status logging rate increased to 200Hz 1.14.0-2.0.40 * Added restart on fail to voxl-px4 service file 1.14.0-2.0.39 * Fixes to the GPS devices submodule to help with reliable M10 UBX startup 1.14.0-2.0.38 * Added parameters to control timeouts on external vision measurements 1.14.0-2.0.37 * Changed amps in voxlpm to signed int to account for reverse current 1.14.0-2.0.36 * Reverted: "Fixed offboard flight mode transition" because it didn't really work * Added install dependency on rb5-system-image OR voxl2-system-image 1.14.0-2.0.35 * Fixed offboard flight mode transition 1.14.0-2.0.34 * Fixed delayed flight mode transitions in outgoing mavlink heartbeat messages voxl-qvio-server (0.9.3 to 0.9.4) 0.9.4 * update fpv lens cal filename voxl-remote-id (0.0.8 to 0.0.9) 0.0.9 * Fix M0052 hostapd path voxl-streamer (0.7.1 to 0.7.4) 0.7.4 * fix typo in build.sh 0.7.3 * fix regression in APQ8096 0.7.2 * set intra-frame period for non h264/h265 sources * add postinst to update systemd on install voxl-utils (1.3.1 to 1.3.3) 1.3.3 * fix voxl-my-ip on apq8096 voxl-vision-hub (1.6.6 to 1.7.1) 1.7.1 * set send_odom_while_failed to true by default * bump reset counter on first new good odometry packet to PX4 instead of on failure 1.7.0 * new dependency on libmodalcv 0.4.0 1.6.9 * change secondary vio pipe default to ov * fix bug where secondary vio pipe name was not printed on connection 1.6.8 * don't restart PX4 on EKF2 error unless it's on apq8096 AND older than 1.13.0 qrb5165-system-tweaks 0.2.3 * disable the QC lunch-make-scripts service ``` # SDK 1.1.X Test Matrix | Symbol | Definition | |-----------------------------------------------------------|-------------------------| | ![Yes](/icons/circle-check-big.svg) | Passed | | ![In progress](/icons/loader-circle.svg) | In Progress | | ![Failed](/icons/circle-alert.svg) | Failed | | ![No](/icons/link-2-off.svg) | Not Supported | ## SDK 1.1.3 Test Status | Architecture | Description | Indoor Test Status | Outdoor Test Status | |--------------------------|----------------------------------------------------------|--------------------------------------------------------|-----------------------------------------------------------| | D0001 | [m500](/m500/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0003 | Seeker | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0004 | [Qualcomm Flight RB5 5G](/qualcommflightrb5/) Deprecated | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0005-4](/voxl2-d0005/) | [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | [D0006-4](/voxl2-d0006/) | [Sentinel](/sentinel/) | ![Yes](/icons/circle-check-big.svg) | ![Yes](/icons/circle-check-big.svg) | | D0011-4 | PX4 Autonomy Dev Kit, see: [Starling](/starling/) | ![Yes](/icons/circle-check-big.svg) | ![In progress](/icons/loader-circle.svg) | | D0012-4 | Starling 2 Max, see: [Starling](/starling/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0014-4](/voxl2-d0014/) | Starling 2, see: [Starling](/starling/) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | | [D0015-4](/voxl2-D0015/) | Fixed Wing (WIP) | ![No](/icons/link-2-off.svg) | ![No](/icons/link-2-off.svg) | --- Source: https://docs.modalai.com/sdk-1.0-release-notes/ # SDK 1.0 Release Notes SDK 1.0 Currently only supports QRB5165 platforms VOXL2 and VOXL2-Mini. APQ8096 (VOXL1) support is in progress for a future patch release. All SDK-1.0.x releases on QRB5165 use the same 1.6.2 system image. See [here](/voxl2-system-image/) for system image release notes. ## New Features in SDK 1.0 SDK 1.0 is our biggest release yet with 8 months of work, hundreds of commits, and countless improvements. A few of the highlights are as follows: ### Streamlined Configuration The primary focus has been to streamline MPA configuration process by including it in the SDK install script. A new package, [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) consolidates tools for managing the [SKU](/sku/), [calibration files](/check-calibration/), and [configuring MPA services](/voxl-configure-mpa/). All of these tools are called during the [SDK flashing script](/flash-system-image/#flash-the-sdk). Furthermore, [ELRS](/voxl-elrs/) and [VOXL ESC](/voxl-escs/) firmware and parameters are automatically flashed during SDK installation to keep everything updated and in sync automatically. ### PX4 1.14 Since ModalAI's initial fork of PX4 1.12 and port to the VOXL SDSP, we have been working closely with the PX4 community to merge our multi-processor architecture support back into PX4 mainline. See the [voxl-px4](/voxl-px4/) page for more information. ### Hardware-Accelerated Video compression in voxl-camera-server For hires color cameras, voxl-camera-server can now publish either H265 or H264 compressed video over libmodal-pipe. Furthermore, it can compress two video streams at different resolutions simultaneously. Out of the box on the Sentinel and Starling platforms, voxl-camera-server publishes both a 1024x768 H265 stream for RTSP video streaming and 4K video for recording to disk with the new voxl-record-video tool. Both at 30hz, accelerated in hardware! This enabled the next feature: ### Always-on RTSP video and Mavlink Camera Protocol Support Out of the box, in hardware configurations with a color hires cameras, voxl-streamer and voxl-mavcam-manager are enabled by default so that as soon as you connect to QGroundControl you get a live video feed with no additional configuration steps. Furthermore, the video snapshot and video record functions in QGgroundControl will automatically appear and allow you to take full resolution JPEG snapshots and 4K video recordings that get saved to disk onboard VOXL in flight. ### Mavlink Routing Overhaul When running on the VOXL SDSP, [voxl-px4](/voxl-px4/) now provides two simultaneous mavlink interfaces. One high datarate interface for local communication onboard voxl, and a second low datarate interface to communicate with a ground control station. Multiple bi-directional pipes expose these interfaces to allow onboard data such as VIO to be transmitted to PX4 and services like voxl-mavcam-manager to communicate with the grans control station. A new tool voxl-inspect-mavlink lets you inspect all of these pathways for real time debugging. ### ELRS Support VOXL now supports ELRS Receivers and starting with the Starling development drone this is ModalAI's new recommended RC control interface. Baked into SDK 1.0 is a new [voxl-elrs](/voxl-elrs/) tool that allows flashing ESP-based ELRS receiver firmware and putting the receivers into bind mode from the VOXL command line. ### VOXL-ESC Flashing and Tools [VOXL ESCs](/voxl-escs/) can still be flashed and tuned from a desktop PC like before, but these same tools now run onboard VOXL. This allows ESC firmware updates automatically during SDK flashing. ## V1.0.0 Released June 30, 2023 Package list and changes from SDK-0.9.5 | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.3 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.1.3 --> 0.2.1 | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.2.3 --> 0.3.2 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.7 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.1 --> 0.2.2 | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.8.2 --> 2.8.4 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.1.0 --> 0.2.0 | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.3.0 --> 1.4.2 | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.1.5 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.1.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 0.5.0 --> 0.6.0 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.1.5 --> 0.2.2 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind-spektrum](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.1.0 (new) | | ✅ | | [voxl-boost](https://gitlab.com/voxl-public/Deprecated/voxl-boost) | 1.65.0 (new) | ✅ | | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.2.3 --> 0.4.0 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.3.5 --> 1.6.2 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 1.14.0-9 (unchanged) | ✅ | ✅ | | [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) | 0.2.7 (new) | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.3.0 --> 0.4.6 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.2.4 --> 1.2.5 | ✅ | ✅ | | [voxl-eigen3](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-eigen3) | 3.4.0 (unchanged) | ✅ | ✅ | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | 0.0.7 (new) | | ✅ | | [voxl-esc](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) | 1.2.0 (new) | | ✅ | | [voxl-feature-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-feature-tracker) | 0.0.7 --> 0.2.3 | | ✅ | | [voxl-flow-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-flow-server) | 0.3.3 (new) | | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-4 (unchanged) | ✅ | ✅ | | [voxl-lepton-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 1.1.2 (new) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.1.5 --> 0.1.7 | ✅ | ✅ | | [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.5.1 (new) | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.0 --> 0.1.1 | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 0.3.0 --> 1.2.0 | | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.16.1 --> 1.0.5 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.7.6 --> 1.0.4 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.6 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-1 (unchanged) | ✅ | ✅ | | voxl-open-vins | 0.0.2 --> 0.3.0 | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.5.0 --> 0.5.8 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.12.31 --> 1.14.0-2.0.34 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) | 0.1.8 (new) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.8.2 --> 0.9.3 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.5 --> 0.0.8 | | ✅ | | [voxl-slpi-uart-bridge](https://gitlab.com/voxl-public/voxl-sdk/core-libs/voxl-slpi-uart-bridge) | 1.0.1 (new) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.4.1 --> 0.7.1 | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.2.2 --> 1.3.1 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.3 --> 0.1.6 | ✅ | ✅ | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.6.6 (new) | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | --- Source: https://docs.modalai.com/sdk-0.9-release-notes/ # SDK 0.9 Release Notes ## V0.9.5 This is a maintenance release for SDK-0.9 ``` - More robust writing to pipes - Allow mavlink 1 packets through libmodal_pipe and voxl-mavlink-server - voxl-mavlink-server can auto-select between 2 uart ports on APQ8096 - fix 3D map bug in voxl-portal ``` | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.1 (unchanged) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.3 (unchanged) | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.3 (unchanged) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.1.3 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.8.3-1 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.6.0 (unchanged) | ✅ | | | libmodal-cv | 0.2.3 (unchanged) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.7 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.1 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.3 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.6.0 --> 2.8.2 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.1.0 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.3.0 (unchanged) | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.1.5 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [mavlink-camera-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.1.0 (unchanged) | ✅ | | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.1.0 (unchanged) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 0.5.0 (unchanged) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.1.5 (unchanged) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.0.1 (unchanged) | | ✅ | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.2.3 (unchanged) | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.3.5 (unchanged) | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 1.14.0-9 (unchanged) | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.3.0 (unchanged) | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.2.4 (unchanged) | ✅ | ✅ | | [voxl-eigen3](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-eigen3) | 3.4.0 (unchanged) | ✅ | ✅ | | [voxl-flir-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 0.2.0 (unchanged) | ✅ | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-4 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.7 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.4 (unchanged) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.1.5 (unchanged) | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.0 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 0.2.0 --> 0.3.0 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.16.1 (unchanged) | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.7.0-1 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.7.6 (unchanged) | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.6 (unchanged) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-1 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.4.2 --> 0.5.0 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.12.31 (unchanged) | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.8.2 (unchanged) | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.5 (unchanged) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.4.1 (unchanged) | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.3.1 (unchanged) | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.2.2 (unchanged) | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.3 (unchanged) | ✅ | ✅ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.4.0 (unchanged) | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.1.3 (unchanged) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## V0.9.4 Requires VOXL (APQ8096) system image >= v4.0.0 and VOXL2/RB5F system image 1.4.1+ Major features: ``` IMU * Improve stability of ICM42688 driver * New Timestamp Filter module in librc_math * improved timestamps in qrb5165-imu-server * qrb5165-imu-server publishes live FFT of IMU data * enable AAF filter for ICM42688 accel on QRB5165 Portal * improve robustness un poor network conditions * Image framerate and quality reacts more quickly * new live FFT plot (qrb5165 only) * better CPU and IMU plots Camera * PMD TOF support on both APQ8096 and QRB5165 Other * VIO level calibration * voxl-flir-server for Lepton 3 on both platforms * VIO packet includes cam_id field for feature points * point cloud packet includes ID and source fields * QRB5165 more robust pipe disconnection detection * voxl-mapper overhaul * QRB5165 support external UART flight controller in voxl-mavlink-server * VOA fallback mode when no VIO or attitude data is present * QVIO quality metric based on distribution of features * Preliminary (Beta) RemoteID support on QRB5165 ``` | Package | Version | APQ8096 | QRB5165| |:---|:---:|:---:|:---:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.3.0 --> 0.3.1 | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.2 --> 1.0.3 | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (unchanged) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.2 --> 0.1.3 | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.1.2 --> 0.1.3 | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.2.3-4 --> 2.8.3-1 | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.8 --> 0.6.0 | ✅ | | | libmodal-cv | 0.1.0 --> 0.2.3 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.7 (unchanged) | ✅ | ✅ | | [libmodal-journal](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-journal) | 0.2.1 (new) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.2 --> 0.4.3 | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.4.0 --> 2.6.0 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.1.0 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.8 --> 1.3.0 | ✅ | ✅ | | [libvoxl-cci-direct](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cci-direct) | 0.1.5 (new) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [mavlink-camera-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.1.0 (unchanged) | ✅ | | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.0.5 --> 0.1.0 | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 0.2.4 --> 0.5.0 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.1.3 --> 0.1.5 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.0.1 (unchanged) | | ✅ | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.2.2 --> 0.2.3 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.1.0 --> 1.3.5 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 1.14.0-7 --> 1.14.0-9 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.2.6 --> 0.3.0 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.2.4 (unchanged) | ✅ | ✅ | | [voxl-eigen3](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-eigen3) | 3.4.0 (new) | ✅ | ✅ | | [voxl-flir-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server) | 0.0.4 --> 0.2.0 | ✅ | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | ✅ | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-4 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.6 --> 1.0.7 | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.3.2 --> 0.3.4 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.0.7 --> 0.1.5 | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.1.0 (unchanged) | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 0.1.3 --> 0.2.0 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.15.2 --> 0.16.1 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.6.0 --> 7.7.0-1 | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.7.2 --> 0.7.6 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.3 --> 0.3.6 | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-1 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.2.8 --> 0.4.2 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.4.16 --> 1.12.31 | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.2 (unchanged) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.7.1 --> 0.8.2 | ✅ | ✅ | | [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) | 0.0.5 (new) | | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.3.6 --> 0.4.1 | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.2.7 --> 0.3.1 | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.1.4 --> 1.2.2 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.1 --> 0.1.3 | ✅ | ✅ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.2.0 --> 1.4.0 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.0.4 --> 1.1.3 | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | --- Source: https://docs.modalai.com/old-release-notes/ # Old Release Notes ## V0.8 Requires VOXL system image 3.8+ or VOXL2/RB5F system image 1.3.1+ This VOXL Suite is BETA only for VOXL 1 since it includes camera server updates allowing improved support for most cameras but no PMD TOF functionality ``` * IMPROVEMENT: apq8096 stereo cameras no longer have a high-pass filter and look much cleaner * IMPROVEMENT: libmodal-cv beginning to support CVP functionality on QRB5 * IMPROVEMENT: libmodal-pipe support for setting process/thread priority * IMPROVEMENT: libmodal-pipe/qvio/vvpx4 updated vio struct to match latest mavlink * IMPROVEMENT: voxl-camera-calibration command line options for more modular use * IMPROVEMENT: voxl-camera-server support for ov9782 cameras * IMPROVEMENT: voxl-logger major efficiency rework * NEW PACKAGE: voxl-bind (qrb5165-only) * RENAME PACKAGE: qrb5165-camera-server > voxl-camera-server (now cross-platform) ``` | Package | Version | APQ8096 | QRB5165 | |:----------------------------------------------------------------------------------------------------------|:---------------------:|:-------:|:-------:| | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.2.6 --> 0.3.0 | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.1 --> 1.0.2 | ✅ | | | [apq8096-libpng](https://gitlab.com/voxl-public/Deprecated/apq8096-libpng) | 1.6.38-1 (new) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.0 --> 0.1.2 | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.1.2 (unchanged) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.2.3-4 (unchanged) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.8 (unchanged) | ✅ | | | libmodal-cv | 0.0.5 --> 0.1.0 | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.7 (unchanged) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.2 (unchanged) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.1.7 --> 2.4.0 | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.1.0 (unchanged) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.8 (unchanged) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (unchanged) | ✅ | ✅ | | [mavlink-camera-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.0.6 --> 0.1.0 | ✅ | | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.0.4 --> 0.0.5 | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 0.2.0 --> 0.2.4 | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.1.2 --> 0.1.3 | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (unchanged) | | ✅ | | [voxl-bind](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-bind-spektrum) | 0.0.1 (new) | | ✅ | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.1.5 --> 0.2.2 | ✅ | ✅ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 1.1.0 (new) | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 1.14.0-5 --> 1.14.0-7 | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.2.5 --> 0.2.6 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.2.4 (unchanged) | ✅ | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (unchanged) | ✅ | | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-4 (unchanged) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.6 (unchanged) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.1.2 --> 0.3.2 | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.0.6 --> 0.0.7 | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.0.7 --> 0.1.0 | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 0.1.1 --> 0.1.3 | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.15.1 --> 0.15.2 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.6.0 (unchanged) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.6.3 --> 0.7.2 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.2 --> 0.3.3 | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (unchanged) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-1 (unchanged) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.2.6 --> 0.2.8 | ✅ | ✅ | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) | 1.4.16 (new) | | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.1 --> 0.1.2 | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.4.6 --> 0.7.1 | ✅ | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.3.1 --> 0.3.6 | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.4 (unchanged) | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.2.3 --> 0.2.7 | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 1.1.1 --> 1.1.4 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.1 (unchanged) | ✅ | ✅ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 1.0.5 --> 1.2.0 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.0.3 --> 1.0.4 | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.6 (unchanged) | ✅ | | ## V0.7.0 Requires VOXL system image 3.8+ or VOXL2 system image 1.2.1+ This is the first SDK release with support for both VOXL (APQ8096) and VOXL2 (QRB5165). Every package has been updated with dual-platform support (where applicable) and the entire SDK is now built via CI. Starting with V0.7.0, the new SDK repository is hosted at [http://voxl-packages.modalai.com/dists/](http://voxl-packages.modalai.com/dists/). ``` * RENAME PACKAGE: voxl-camera-server > apq8096-camera-server (apq8096 only) * RENAME PACKAGE: voxl-imu-server > apq8096-imu-server (apq8096 only) * RENAME PACKAGE: libvoxl_io > libapq8096-io (apq8096 only) * NEW PACKAGE: qrb5165-camera-server (qrb5165-only) * NEW PACKAGE: qrb5165-imu-server (qrb5165-only) * NEW PACKAGE: qrb5165-dfs-server (qrb5165-only) * NEW PACKAGE: libmodal-cv * NEW PACKAGE: voxl-mavlink-server * NEW PACKAGE: voxl-px4-imu-server (qrb5165 only) * NEW PACKAGE: libqrb5165-io (qrb5165-only) * NEW PACKAGE: qrb5165-tflite (qrb5165-only) * NEW PACKAGE: voxl-px4 (qrb5165-only) * IMPROVEMENT: voxl-camera-calibration accuracy and usability * IMPROVEMENT: voxl-vision-px4 talks to PX4 through voxl-mavlink-server * IMPROVEMENT: voxl-portal: dynamic image quality, point cloud viewer * CLEANUP: Remove old wizard from voxl-configure-mpa * NEW TOOL: voxl-configure-pkg-manager ``` | Package | Version | APQ8096 | QRB5165 | | --- | --- | --- | --- | | [apq8096-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/apq8096-camera-server) | 0.9.0 (new) | ✅ | | | [apq8096-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.2.6 (new) | ✅ | | | [apq8096-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 1.0.1 (new) | ✅ | | | [apq8096-rangefinder-server](https://gitlab.com/voxl-public/Deprecated/apq8096-rangefinder-server) | 0.1.0 (new) | ✅ | | | [apq8096-system-tweaks](https://gitlab.com/voxl-public/Deprecated/apq8096-system-tweaks) | 0.1.2 (new) | ✅ | | | [apq8096-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.2.3-4 (new) | ✅ | | | [libapq8096-io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.8 (new) | ✅ | | | libmodal-cv | 0.0.5 (new) | ✅ | ✅ | | [libmodal-exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.7 (new) | ✅ | ✅ | | [libmodal-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.4.2 (new) | ✅ | ✅ | | [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.1.7 (new) | ✅ | ✅ | | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | 0.1.0 (new) | | ✅ | | [librc-math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.8 (new) | ✅ | ✅ | | [libvoxl-cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.1.1 (new) | ✅ | ✅ | | [mavlink-camera-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) | 0.0.2 --> 0.0.6 | ✅ | | | [qrb5165-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | 0.2.0 (new) | | ✅ | | [qrb5165-dfs-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) | 0.0.4 (new) | | ✅ | | [qrb5165-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | 0.2.0 (new) | | ✅ | | [qrb5165-system-tweaks](https://gitlab.com/voxl-public/voxl-sdk/utilities/qrb5165-system-tweaks) | 0.1.2 (new) | | ✅ | | [qrb5165-tflite](https://gitlab.com/voxl-public/voxl-sdk/third-party/qrb5165-tflite) | 2.8.0-2 (new) | | ✅ | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.1.1 --> 0.1.5 | ✅ | ✅ | | [voxl-ceres-solver](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ceres-solver) | 1.14.0-5 (new) | ✅ | ✅ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.2.0 --> 0.2.5 | ✅ | ✅ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.3 --> 1.2.4 | ✅ | ✅ | | [voxl-gphoto2-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.10 (new) | ✅ | | | [voxl-jpeg-turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 2.1.3-4 (new) | ✅ | ✅ | | [voxl-libgphoto2](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libgphoto2) | 0.0.4 (new) | ✅ | ✅ | | [voxl-libuvc](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-libuvc) | 1.0.6 (new) | ✅ | ✅ | | [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) | 0.1.2 (new) | ✅ | ✅ | | [voxl-mapper](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) | 0.0.6 (new) | ✅ | ✅ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.0.2 --> 0.0.7 | ✅ | ✅ | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | 0.1.1 (new) | ✅ | ✅ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.12.0 --> 0.15.1 | ✅ | ✅ | | [voxl-mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.6.0 (new) | ✅ | ✅ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.3.6 --> 0.6.3 | ✅ | ✅ | | [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.3.2 (new) | ✅ | ✅ | | [voxl-nlopt](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-nlopt) | 2.5.0-4 (new) | ✅ | ✅ | | [voxl-opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.5-1 (new) | ✅ | ✅ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.1.2 --> 0.2.6 | ✅ | ✅ | | [voxl-px4-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4-imu-server) | 0.1.1 (new) | | ✅ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.3.4 --> 0.4.6 | ✅ | ✅ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.2.6 --> 0.3.1 | ✅ | ✅ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.2 --> 0.0.4 | ✅ | ✅ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.1.5 --> 0.2.3 | ✅ | ✅ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.8.5 --> 1.1.1 | ✅ | ✅ | | [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) | 0.1.1 (new) | ✅ | ✅ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.9.5 --> 1.0.4 | ✅ | ✅ | | [voxl-voxblox](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-voxblox) | 1.0.3 (new) | ✅ | ✅ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.3 --> 0.0.6 | ✅ | | ## V0.5.0 Requires VOXL system image 3.3+ ``` * NEW TOOL: voxl-calibrate-cameras utility * NEW TOOL: imu thermal calibration * NEW TOOL: voxl-configure-opkg * NEW TOOL: voxl-calibrate-px4-horizon tool * NEW TOOL: voxl-portal web interface * NEW TOOL: voxl-wait-for-fs service * NEW TOOL: voxl-list-pipes * ADDITION: libmodal_pipe pause-resume function * ADDITION: voxl-configure extrinsics add support for Starling * ADDITION: voxl-mpa-to-ROS dynamic pipe detection (no more config!!) * IMPROVEMENT: file system syncs more frequently * IMPROVEMENT: voxl-qvio-reset is more complete * IMPROVEMENT: voxl-configure cameras wizard tweaks * IMPROVEMENT: voxl-configure-mpa support new part numbers * IMPROVEMENT: voxl-inspect-services speedup * IMPROVEMENT: too many little tweaks and fixes to list ``` | Package | Package Version | |--- |--- | | [libjpeg_turbo](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-jpeg-turbo) | 9.0.4+ | | [libmodal_exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.2+ | | [libmodal_json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.3.6+ | | [libmodal_pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.1.1+ | | [librc_math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.5+ | | [libvoxl_cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.0.2+ | | [libvoxl_io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.4+ | | mavlink-camera-manager | 0.0.2+ | | [mongoose](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mongoose) | 7.3.0+ | | [opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.2-2+ | | [openmp](https://gitlab.com/voxl-public/Deprecated/voxl-openmp) | 10.0.2+ | | [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) | 0.1.1+ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/apq8096-camera-server) | 0.7.1+ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.2.0+ | | [voxl-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.2.2+ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.3+ | | [voxl-gphoto2](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.5+ | | [voxl-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 0.9.1+ | | [voxl-mavlink](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink) | 0.12.0+ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.0.2+ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.3.6+ | | [voxl-nodes](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) | 0.2.0+ | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | 0.1.1+ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.3.4+ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.2.6+ | | [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) | 0.0.2+ | | [voxl-tflite](https://gitlab.com/voxl-public/Deprecated/apq8096-tflite) | 2.2.3+ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.1.5+ | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.8.4+ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.9.5+ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.3+ | ## V0.4.6 Requires System Image 3.3+ Contains the following packages: | Package | Package Version | |--- |--- | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.7.1+ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.2.6+ | | [libmodal_exposure](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) | 0.0.2+ | | [libmodal_json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.3.5+ | | [libmodal_pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 2.0.7+ | | [librc_math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.5+ | | [libvoxl_cutils](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libvoxl-cutils) | 0.0.2+ | | [libvoxl_io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.4+ | | mavlink-camera-manager | 0.0.2+ | | [opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.2-1+ | | [openmp](https://gitlab.com/voxl-public/Deprecated/voxl-openmp) | 10.0.2+ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/apq8096-camera-server) | 0.7.1+ | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | 0.1.7+ | | [voxl-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.2.0+ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.3+ | | [voxl-gphoto2](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.5+ | | [voxl-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 0.8.1+ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.12.0+ | | [voxl-nodes](https://gitlab.com/voxl-public/Deprecated/voxl-nodes) | 0.1.6+ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.3.1+ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.2.3+ | | voxl-tflite(no repo) | 0.0.1+ | | [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.1.0+ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.9.2+ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.3+ | ## V0.3.4 Requires System Image 3.2+ Contains the following packages: | Package | Package Version | |--- |--- | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.6.0+ | | [libmodal_json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json) | 0.3.4+ | | [libmodal_pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 1.7.8+ | | [librc_math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.4+ | | mavlink-camera-manager | 0.0.1+ | | [opencv](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv) | 4.5.1+ | | [openmp](https://gitlab.com/voxl-public/Deprecated/voxl-openmp) | 10.0.1+ | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/apq8096-camera-server) | 0.5.6+ | | [voxl-dfs-server](https://gitlab.com/voxl-public/Deprecated/apq8096-dfs-server) | 0.0.7+ | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.1+ | | [voxl-gphoto2](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-gphoto2-server) | 0.0.5+ | | [voxl-hal3-tof-cam-ros](https://gitlab.com/voxl-public/Deprecated/voxl-hal3-tof-cam-ros) | 0.0.5+ | | [voxl-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | 0.7.8+ | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.11.0+ | | [voxl-mpa-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) | 0.0.2+ | | [voxl-mpa-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools) | 0.1.6+ | | [voxl-nodes](https://gitlab.com/voxl-public/Deprecated/voxl-nodes) | 0.1.0+ | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | 0.2.1+ | | [voxl-rtsp](https://gitlab.com/voxl-public/Deprecated/voxl-rtsp) | 1.0.3+ | | [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) | 0.2.1+ | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.8.1+ | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.3+ | ## V0.2.0 Changes: - Updated `voxl-vision-px4`, PX4 disconnect detection, better handling of 'CRC errors', UART port and baud configurable, keep publishing data if VIO is off, wizard improvements - Updated `voxl-modem`, added LTE v2 support - Updated `voxl-utils`, added `voxl-backup` util for camera calibration backup - Added new `voxl-vpn` package - Added new `voxl-time-sync` package - Removed ffmpeg as it's normally used via Docker containers Contains the following packages: | Package | Package Version | |--- |--- | | docker | 1.9.0 | | imu_app | 0.0.6 | | libmodal_pipe | 1.2.2 | | librc_math | 1.1.2 | | modalai-vl | 0.1.3 | | [libvoxl_io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.5.2 | | [voxl-cam-manager](https://gitlab.com/voxl-public/Deprecated/voxl-cam-manager) | 0.2.2 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.1 | | [voxl-hal3-tof-cam-ros](https://gitlab.com/voxl-public/Deprecated/voxl-hal3-tof-cam-ros) | 0.0.2 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.10.0 | | [voxl-nodes](https://gitlab.com/voxl-public/Deprecated/voxl-nodes) | 0.0.8 | | [voxl-rtsp](https://gitlab.com/voxl-public/Deprecated/voxl-rtsp) | 1.0.2 | | [voxl-time-sync](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-time-sync) | 0.0.1 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.5.2 | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.6.8 | | [voxl-vpn](https://gitlab.com/voxl-public/Deprecated/voxl-vpn) | 0.0.2 | | voxl_imu | 0.0.4 | Tested against: - System Image 2.5.2-1.0.1 - System Image 2.3.0-1.0.1 ## V0.1.1 Contains the following packages: | Package | Package Version (min) | |--- |--- | | docker | 1.9.0 | | [ffmpeg](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ffmpeg) | 4.2.2 | | imu_app | 0.0.6 | | [librc_math](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math) | 1.1.2 | | [libvoxl_io](https://gitlab.com/voxl-public/Deprecated/libapq8096-io) | 0.4.1 | | [libvoxl_pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe) | 1.0.1 | | modalai-vl | 0.1.3 | | [voxl-cam-manager](https://gitlab.com/voxl-public/Deprecated/voxl-cam-manager) | 0.2.2 | | [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support) | 1.1.1 | | [voxl-hal3-tof-cam-ros](https://gitlab.com/voxl-public/Deprecated/voxl-hal3-tof-cam-ros) | 0.0.2 | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) | 0.9.3 | | [voxl-nodes](https://gitlab.com/voxl-public/Deprecated/voxl-nodes) | 0.0.8 | | [voxl-rtsp](https://gitlab.com/voxl-public/Deprecated/voxl-rtsp) | 1.0.2 | | [voxl-utils](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) | 0.5.1 | | [voxl-vision-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | 0.6.1 | | voxl_imu | 0.0.4 | Tested against: System Image 2.3.0-1.0.1 --- Source: https://docs.modalai.com/voxl-suite/ # VOXL SDK Release Notes A [VOXL SDK release](/flash-system-image/) bundles three things: the [voxl-suite](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite) meta-package (all VOXL SDK software packages installed on VOXL), a matching [system image](/voxl2-system-image/), and an installer. The release takes its version number from the included voxl-suite meta-package. Each release is cut from a tagged voxl-suite meta-package that pins the exact version of every package it contains — see the [release tags](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags) for precisely what is in each release. Releases go through alpha and beta cuts with internal flight testing before they are published. Because the system image and voxl-suite are tested together as a whole, we highly recommend installing SDK releases as-is with a full [system flash](/flash-system-image/). Experienced developers can configure VOXL to pull individual packages from development repositories by following the [voxl-configure-pkg-manager page](/configure-pkg-manager/), but we do not support software issues that arise from doing so. ## Which SDK Should I Flash? The build artifacts listed in the Release Index show which platforms a release was *built* for — not which vehicles it has been flight tested on. For ModalAI drones, flash the most recent release that has been flight tested on your vehicle (see each release's test matrix for details): | Part number | Description | SDK to flash | |-------------|-------------|--------------| | D0004 | [RB5 Flight](/qualcommflightrb5/) (EOL) | [SDK 1.5.0](/sdk-1.5-release-notes/) — last release with RB5 Flight support | | D0008-4-V5 | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | [SDK 1.6.6](/sdk-1.6-release-notes/) — not released publicly; ships preinstalled on this vehicle | | D0008-4-V6 | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | [SDK 1.6.4](/sdk-1.6-release-notes/) — SDK 1.8 replaces it on this vehicle when released | | D0008-9 | [Seeker Vision 5"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | [SDK 1.7.0](/sdk-1.7-release-notes/) — currently in beta; not yet available for download | | D0012 | [Starling 2 Max](/starling-2-max/) | [SDK 1.6.4](/sdk-1.6-release-notes/) | | D0013 | [Stinger Vision](/stinger-vision-fpv/) | [SDK 1.6.4](/sdk-1.6-release-notes/) — ships preinstalled on this vehicle | | D0014 | [Starling 2](/starling-2/) | [SDK 1.6.4](/sdk-1.6-release-notes/) | | D0019-4-V5 | [Seeker Vision 7"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | [SDK 1.6.8](/sdk-1.6-release-notes/) — not released publicly; ships preinstalled on this vehicle | | D0019-9 | [Seeker Vision 7"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | [SDK 1.6.8](/sdk-1.6-release-notes/) — not released publicly; ships preinstalled on this vehicle | | D0020-4-V5 | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | [SDK 1.6.8](/sdk-1.6-release-notes/) — not released publicly; ships preinstalled on this vehicle | | D0020-4-V6 | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (VOXL 2) | [SDK 1.6.6](/sdk-1.6-release-notes/) — not released publicly; ships preinstalled on this vehicle; SDK 1.8 replaces it on this vehicle when released | | D0020-9 | [Seeker Vision 10"](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form) (QCS6490) | [SDK 1.6.8](/sdk-1.6-release-notes/) — not yet available on downloads.modalai.com; SDK 1.8 replaces it on this vehicle when released | | M0006 | [VOXL](/voxl/) (apq8096) | [SDK 1.3.5](/sdk-1.3-release-notes/) — last release with apq8096 support | | M0019 | [VOXL Flight](/voxl-flight/) (apq8096) | [SDK 1.3.5](/sdk-1.3-release-notes/) — last release with apq8096 support | | M0054 | [VOXL 2](/voxl-2/) development kits | [SDK 1.6.4](/sdk-1.6-release-notes/) | | M0104, M0204 | [VOXL 2 Mini](/voxl2-mini/) development kits | [SDK 1.6.4](/sdk-1.6-release-notes/) | | R0001 | [VRX Ground Unit](/vrx-ground-unit/) | [SDK 1.6.4](/sdk-1.6-release-notes/) | ## Release Index | SDK series | Latest release | Released | Build artifacts | |------------|----------------|----------|-----------| | [SDK 1.7](/sdk-1.7-release-notes/) | in development — current cut [1.7.0-beta3](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.7.0-beta3); not expected to have a full release, development is moving to SDK 1.8 | - | VOXL 2, VOXL 2 Mini, VRX, QCS6490 | | [SDK 1.6](/sdk-1.6-release-notes/) | [1.6.8](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.8) (QCS6490, VOXL 2); [1.6.6](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.6) for VOXL 2 Mini and VRX (not released publicly; [1.6.4](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.6.4) is the current public release) | October 2026 | VOXL 2, VOXL 2 Mini, VRX, QCS6490 | | [SDK 1.5](/sdk-1.5-release-notes/) | [1.5.0](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.5.0) | June 25, 2025 | VOXL 2, VOXL 2 Mini, RB5 | | [SDK 1.4](/sdk-1.4-release-notes/) | [1.4.5](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.4.5) | May 16, 2025 | VOXL 2, VOXL 2 Mini, RB5 | | [SDK 1.3](/sdk-1.3-release-notes/) | [1.3.5](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.3.5) | October 3, 2024 | VOXL 2, VOXL 2 Mini, RB5, VOXL, VOXL Flight (apq8096) | | [SDK 1.2](/sdk-1.2-release-notes/) | [1.2.0](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.2.0) | April 15, 2024 | VOXL 2, VOXL 2 Mini, RB5, VOXL, VOXL Flight (apq8096) | | [SDK 1.1](/sdk-1.1-release-notes/) | [1.1.3](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.1.3) | February 26, 2024 | VOXL 2, VOXL 2 Mini, RB5, VOXL, VOXL Flight (apq8096) | | [SDK 1.0](/sdk-1.0-release-notes/) | [1.0.x](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite/-/tags/sdk-1.0.0) | 2023 | VOXL 2, VOXL 2 Mini, RB5, VOXL, VOXL Flight (apq8096) | | [SDK 0.9](/sdk-0.9-release-notes/) and [older](/old-release-notes/) | legacy | 2022-2023 | VOXL, VOXL Flight (apq8096) | To move to a new SDK release — including patch releases — download the full release from [downloads.modalai.com](https://downloads.modalai.com) and install it with a complete [system flash](/flash-system-image/). Upgrading individual packages in place with `apt` is not recommended: each SDK release is tested as a whole, and mixed package versions are not a supported configuration. --- Source: https://docs.modalai.com/configuration/ # SDK Configuration This section covers the tools and utilities in the VOXL SDK for configuring [Modal Pipe Architecture](/mpa/) services. The main entry point is [voxl-configure-mpa](/voxl-configure-mpa/), which applies the factory service configuration for your vehicle's SKU ([what's a SKU?](/sku/)). Per-camera layout is handled separately by [voxl-configure-cameras](/configure-cameras/). --- Source: https://docs.modalai.com/mpa-configuration-conventions/ # SDK Configuration Conventions All [MPA](/mpa/) services have configuration files in JSON format in `/etc/modalai/` and use [libmodal_json](/libmodal-json/) to read and write these files. The /etc/ directory is wiped during a system image flash, ensuring MPA is returned to a known state when reflashed. These configuration files are "self-maintaining" in the sense that during software updates, new config entries to support new features are automatically added to the config files by the service itself. Every service has a complementary `voxl-configure-xyz` bash script that can be used to enable or disable the service, as well as reset it to factory defaults. For a list of these config scripts, run: ```bash voxl2:/$ ls /usr/bin/voxl-configure-* /usr/bin/voxl-configure-cameras /usr/bin/voxl-configure-mavcam /usr/bin/voxl-configure-qvio /usr/bin/voxl-configure-cpu-monitor /usr/bin/voxl-configure-mavlink-server /usr/bin/voxl-configure-remote-id /usr/bin/voxl-configure-dfs /usr/bin/voxl-configure-modem /usr/bin/voxl-configure-sku /usr/bin/voxl-configure-docker-support /usr/bin/voxl-configure-mpa /usr/bin/voxl-configure-streamer /usr/bin/voxl-configure-extrinsics /usr/bin/voxl-configure-pkg-manager /usr/bin/voxl-configure-tag-detector /usr/bin/voxl-configure-feature-tracker /usr/bin/voxl-configure-portal /usr/bin/voxl-configure-tflite /usr/bin/voxl-configure-flow-server /usr/bin/voxl-configure-px4 /usr/bin/voxl-configure-uvc /usr/bin/voxl-configure-imu /usr/bin/voxl-configure-px4-imu-server /usr/bin/voxl-configure-vision-hub /usr/bin/voxl-configure-lepton /usr/bin/voxl-configure-px4-params ``` Each service has different options, but they all follow a common theme. For example, `voxl-configure-px4-params` is extremely elaborate with a wizard that helps the user configure PX4 parameters for different airframes, sensors, and flight behaviors. On the other end, voxl-cpu-monitor is a very simple service that can either be on or off. The help text for voxl-configure-cpu looks like this: ```bash voxl2:/$ voxl-configure-cpu-monitor --help Start wizard with prompts: voxl-configure-cpu-monitor Shortcut configuration arguments for scripted setup. factory_enable will reset the config file to factory defaults before enabling the service. voxl-configure-cpu-monitor disable voxl-configure-cpu-monitor factory_enable voxl-configure-cpu-monitor enable show this help message: voxl-configure-cpu-monitor help ``` These individual configure scripts are called in a particular sequence by [voxl-configure-mpa](/voxl-configure-mpa/) to set up all services. [Next: voxl-configure-mpa](/voxl-configure-mpa/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-configure-mpa/ # voxl-configure-mpa --- voxl-configure-mpa serves to define the set of config files and [MPA](/mpa/) services that should be enabled for a given [SKU](/sku/) number. When reflashing a VOXL with an [SDK installer](/flash-system-image/), the last step of the installation process is an automatic call to `voxl-configure-mpa` to set up all the necessary services. ```bash voxl-configure-mpa # interactive: confirms the SKU before running voxl-configure-mpa --debug # dry-run pause: shows the step list before executing voxl-configure-mpa --non-interactive # no prompts, for scripted setup ``` ## When to use voxl-configure-mpa? You should run `voxl-configure-mpa` if you wish to reset all config files and systemd service states to default conditions. This is useful if you've been experimenting with different services and configurations, but want to return to a known default state without reflashing VOXL. You should also run `voxl-configure-mpa` after changing the [SKU](/sku/) number on your VOXL to update all services to the respective defaults for the new [SKU](/sku/). ## How voxl-configure-mpa Decides What to Run Everything `voxl-configure-mpa` does is driven by a single input: the SKU stored at `/data/modalai/sku.txt`. That file is written by [voxl-configure-sku](/sku/) — see [Inspect and Configure SKU](/sku/) for what the SKU fields mean and how to change them safely. `voxl-configure-mpa` parses the SKU's fields and turns them into a concrete list of configuration steps: ``` voxl-configure-sku ──► /data/modalai/sku.txt e.g. MRB-D0005-4-V2-C6 │ family code ──┘ │ │ └─ camera config │ voxl-configure-mpa │ └─ hw version ▼ parses the SKU compute board ─┘ ~35 per-service settings, initialized to defaults │ ▼ the family code picks the vehicle: extrinsics, VIO cameras, per-vehicle overrides ESC setup, PX4 platform and parameter file, ... │ ▼ refined further by the camera, modem, RC-transmitter, and extras fields of the SKU CONFIG_STEPS — one voxl-configure-xyz call per installed service │ ▼ all steps execute in order; failures are retried and summarized ``` A few behaviors worth knowing: - **The step list adapts to what is installed.** A `voxl-configure-xyz` step is only added if that service exists on the system, so a minimal install configures fewer services than a full one. A few SKUs also work the other way around: SKUs whose hardware requires extra software (for example FPV and VRX vehicles) will `apt install` the needed package as one of the configuration steps. - **Failures don't stop the run.** Every step executes even if an earlier one fails. A failed step is retried exactly once after a one-second pause, and the final summary reports steps that "worked on the second try" separately from genuine failures. A step whose tool is missing from the system entirely is marked failed immediately (usually a sign a package didn't install). - **Flight-critical steps are sequenced.** `voxl-px4` is stopped and disabled before ESC and ELRS firmware steps, `voxl-mavlink-server` is stopped before PX4 parameters load, and the PX4 configuration step re-enables the autopilot for the next boot — which is why the run always ends with "PLEASE POWER CYCLE YOUR VOXL". - **It can run unattended.** `voxl-configure-mpa --non-interactive` skips all prompts; this is how the [SDK installer](/flash-system-image/) drives it as the last step of an install. ### Baseline Service Defaults Before any per-vehicle overrides, every run starts from the same baseline — this is what a bare board with no special SKU fields gets: | Enabled by default | Disabled by default | |:-------------------|:--------------------| | voxl-camera-server (per the SKU's camera config) | voxl-qvio-server, voxl-px4-imu-server | | voxl-imu-server, voxl-cpu-monitor | voxl-dfs-server, voxl-tag-detector, voxl-tflite-server | | voxl-open-vins-server | voxl-lepton-server, voxl-lepton-tracker, voxl-flow-server, voxl-feature-tracker | | voxl-vision-hub, voxl-mavlink-server | voxl-uvc-server, voxl-modem, voxl-rangefinder-server | | voxl-px4, voxl-portal | voxl-vtx, voxl-vrx, voxl-state-estimator | | voxl-streamer, voxl-mavcam-manager | voxl-io-server, voxl-osd, voxl-rc-server, voxl-static-ip | The family code then flips these per vehicle. Two common patterns: older platforms (RB5 Flight, Starling, Sentinel) enable `voxl-qvio-server` and disable `voxl-open-vins-server` — the reverse of the current default — and FPV SKUs disable `voxl-streamer`/`voxl-mavcam-manager` in favor of `voxl-vtx`, `voxl-osd`, `voxl-state-estimator`, and `voxl-lepton-tracker`, since video leaves through the VTX. See [how the SDK fits together](/voxl-sdk/#how-the-sdk-fits-together) for an interactive diagram of what these services do and how they connect. The family-code logic itself lives in the `voxl-configure-mpa` script in [voxl-configurator](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-configurator) — reading the case statement for your vehicle's family code is the definitive reference for exactly what a given SKU gets. ## What does voxl-configure-mpa do? ### 1. Reads and Validates SKU First, `voxl-configure-mpa` reads the `/data/modalai/sku.txt` file, validates it, and asks the user if it is correct before continuing: ```bash voxl2:/$ voxl-configure-mpa ------------------------------------------------------------------ Welcome to voxl-configure-mpa! VOXL is currently thinks it is in the following hardware: family code: MRB-D0005 (starling) compute board: 4 (voxl2) hw version: 2 cam config: 6 SKU: MRB-D0005-4-V2-C6 If this doesn't look right, quit and run voxl-configure-sku to set it correctly. Then run voxl-configure-mpa again. Continue? y/n: ``` ### 2. Constructs list of Config Steps > The example below is a Starling (MRB-D0005), an older platform that uses `voxl-qvio-server` — a current-generation SKU's list looks similar but enables `voxl-open-vins-server` instead (see [Baseline Service Defaults](#baseline-service-defaults)). Then, it internally makes a list of the necessary `voxl-configure-xyz` commands necessary to configure [MPA](/mpa/). This list is printed out during the configuration process but so is a lot of other stuff. If you want to do a dry-run just to see what would be executed, run it in debug mode with `voxl-configure-mpa --debug` which will pause the program before executing, letting you see what is about to be run. ``` voxl2:/$ voxl-configure-mpa --debug About to Execute: voxl-configure-extrinsics starling_v2_voxl2 voxl-configure-cameras 6 voxl-configure-cpu-monitor factory_enable voxl-configure-qvio factory_enable voxl-configure-dfs factory_disable voxl-configure-tag-detector factory_disable voxl-configure-tflite factory_disable voxl-configure-vision-hub factory_enable voxl-configure-mavlink-server factory_enable voxl-configure-portal enable voxl-configure-lepton disable voxl-configure-uvc disable voxl-configure-streamer factory_enable voxl-configure-modem disable voxl-configure-mavcam factory_enable voxl-configure-px4-imu-server factory_disable voxl-configure-imu factory_enable voxl-configure-flow-server disable voxl-configure-feature-tracker disable voxl-esc setup_starling_v2 voxl-elrs configure voxl-configure-px4 starling_v2 voxl-configure-px4-params -np MRB-D0005-V2 Continue? y/n: ``` ### 3. Executes these steps All steps are executed, whether they pass or fail. At the end, a summary is presented showing which steps failed, if any. Note the last step in the example above: the vehicle's PX4 parameter file is applied by `voxl-configure-px4-params` — see [How PX4 is Packaged on VOXL 2](/voxl-px4/#how-px4-is-packaged-on-voxl-2) for where those parameter sets come from. > If your SKU has a voxl-esc, `voxl-configure-mpa` will upgrade the ESC firmware if necessary and set ESC params for the motors and propellers on your particular SKU; likewise an ELRS radio's firmware is checked and updated. These steps are sequenced safely: `voxl-px4` is stopped and disabled *before* the ESC and ELRS steps run (and `voxl-rc-server` is stopped to free the radio's serial port, if present), then the PX4 configuration steps re-enable everything for the next boot. On much older SDK releases this ordering didn't exist and `voxl-configure-px4-params` could occasionally fail from a PX4 restart race — on those releases, simply run `voxl-configure-mpa` again. ### 4. Print summary If you've flashed VOXL with the [SDK installer](/flash-system-image/) then this summary print will look familiar as it's the last step of the installer. Note that the list of required calibration files can be accessed separately with the [voxl-check-calibration](/check-calibration/) tool. ```bash ------------------------------------------------------------------ SUCCESSFULLY CONFIGURED MPA SERVICES! Services will start up on next reboot Calibration File Status: Present /data/modalai/voxl-imu-server.cal Present /data/modalai/opencv_tracking_intrinsics.yml Present /data/px4/param/parameters_gyro.cal Present /data/px4/param/parameters_acc.cal Present /data/px4/param/parameters_mag.cal Present /data/px4/param/parameters_level.cal PLEASE POWER CYCLE YOUR VOXL ------------------------------------------------------------------ ``` ## Next Steps Now, `voxl-configure-mpa` has reset your configuration to defaults for a particular SKU. The remaining pages in the [Configuration](/configuration/) section are about customizing particular configuration files for your custom application. [Next: Configuring Extrinsics](/configure-extrinsics/){: .btn .btn-green } --- Source: https://docs.modalai.com/configure-extrinsics/ # Configure Extrinsics `/etc/modalai/extrinsics.conf` is a json file that describes the intrinsics (i.e. translations and rotations) between the coordinate frames of critical components of the drone body. This document serves to describe how to use and configure this file if needed for a custom application. The relation between camera, imu, and drone body (center of mass) is critical for proper VIO function. `voxl-inspect-extrinsics` is a helpful tool to determine what has been configured. An overview of the coordinate frames used in the extrinsics config file and throughout VOXL-SDK: ![geometry_overview](/images/voxl-sdk/voxl-vision-px4/px4_chart-geometry_overview.png) ## Preset Configurations with voxl-configure-extrinsics The `voxl-configure-extrinsics` utility will allow you to use preset extrinsics config files or select your own file. ``` voxl2:/$ voxl-configure-extrinsics -h Start wizard with prompts: voxl-configure-extrinsics Shortcut configuration arguments for scripted setup. leave_alone doesn't touch the file, it does nothing other factory options wipe /etc/modalai/extrinsics.conf factory_custom allows you to specify your own custom file which will then be copied into /etc/modalai/extrinsics.conf voxl-configure-extrinsics leave_alone voxl-configure-extrinsics factory_m500_flight_deck voxl-configure-extrinsics factory_seeker_v1_voxlcam voxl-configure-extrinsics factory_starling_v1 voxl-configure-extrinsics custom /xx/yy/my_custom_file.conf show this help message: voxl-configure-extrinsics help ``` ## File Structure This configuration file serves to describe the static relations (translation and rotation) between sensors and bodies on a drone. Mostly importantly it configures the camera-IMU extrinsic relation for use by VIO. However, the user may expand this file to store many more relations if they wish. By consolidating these relations in one file, multiple processes that need this data can all be configured by this one configuration file. Also, copies of this file may be saved which describe particular drone platforms. The rotation is stored in the file as a Tait-Bryan rotation sequence in intrinsic XYZ order in units of degrees. This corresponds to the parent rolling about its X axis, followed by pitching about its new Y axis, and finally yawing around its new Z axis to end up aligned with the child coordinate frame. The helper read function will read out and populate the associated data struct in both Tait-Bryan and rotation matrix format so the calling process can use either. Helper functions are provided to convert back and forth between the two rotation formats. Note that we elect to use the intrinsic XYZ rotation in units of degrees for ease of use when doing camera-IMU extrinsic relations in the field. This is not the same order as the aerospace yaw-pitch-roll (ZYX) sequence as used by the rc_math library. However, since the camera Z axis points out the lens, it is helpful for the last step in the rotation sequence to rotate the camera about its lens after first rotating the IMU's coordinate frame to point in the right direction by Roll and Pitch. The following online rotation calculator is useful for experimenting with rotation sequences: [https://www.andre-gaschler.com/rotationconverter/](https://www.andre-gaschler.com/rotationconverter/) The translation vector should represent the location center of the child coordinate frame with respect to the parent coordinate frame in units of meters. The parent and child name strings should not be longer than 63 characters. The relation from Body to Ground is a special case where only the Z value is read by voxl-vision-hub and voxl-qvio-server so that these services know the height of the drone's center of mass (and tracking camera) above the ground when the drone is sitting on its landing gear ready for takeoff. ## IMU locations on VOXL
On VOXL 1, there are two IMUs: imu1 (primary) and imu0 (secondary). Their locations on the VOXL1 PCB and orientation of published data are as follows: ![voxl-core-imu-locations](/images/voxl/voxl/voxl1_imu_locations_with_axis_large.png)
On VOXL 2 there are two IMUs: imu_apps is connected to the applications processor and driven by voxl-imu-server to publish IMU data to MPA for VIO and general use. imu_px4 is connected to the SDSP and is driven by PX4 on the SDSP for flight control. Data from imu_px4 is also available in MPA on all QRB5165-based platforms such as VOXL 2 and RB5-Flight as long as voxl-px4 and voxl-px4-imu-server are both running. RB5-Flight only has a single IMU (imu_px4) so the data is published in MPA for VIO to use. On VOXL 2, imu_apps should be used for VIO. ![voxl2-imu-locations](/images/voxl2/m0054_voxl2_imu_locations_with_axis.png) NOTE that on VOXL1 and VOXL2, voxl-imu-server publishes the IMU data in a common and more useful orientation such that both IMU's appear to be oriented in FRD frame for the VOXL M500, flight deck, and Starling reference platforms. This common orientation axis are labeled in the above diagrams. You may notice that the default extrinsic files for these platforms have 0 rotation between both IMUs and between the IMU and body frames as a result. While VOXL-SDK supports mounting the VOXL boards in other orientations, it is helpful for reference frames to be consistent where possible, thus we rotate the IMU data in the driver so that IMU data is published consistently across boards regardless of how the IMU is positioned on the PCB.
### Camera Coordinate Frame VOXL-SDK uses the standard convention of X to the right, Y down, and Z out the front of the lens. This is the same as OpenCV. For a camera mounted on the front of a drone facing forward in landscape orientation this would result in: - The X axis of the camera pointing to the right aligned with the Y axis of the drone. - The Y axis of the camera pointing down aligned with the Z axis of the drone. - The Z axis of the camera pointing forward along the X axis of the drone. ![Camera Coordinate Frame](/images/voxl/camera_frame.png) ## Example Default file for the VOXL M500 and Flight Deck: ``` { "name": "M500_flight_deck", "extrinsics": [{ "parent": "imu1", "child": "imu0", "T_child_wrt_parent": [-0.0484, 0.037, 0.002], "RPY_parent_to_child": [0, 0, 0] }, { "parent": "imu0", "child": "tracking", "T_child_wrt_parent": [0.065, -0.014, 0.013], "RPY_parent_to_child": [0, 45, 90] }, { "parent": "imu1", "child": "tracking", "T_child_wrt_parent": [0.017, 0.015, 0.013], "RPY_parent_to_child": [0, 45, 90] }, { "parent": "body", "child": "imu0", "T_child_wrt_parent": [0.02, 0.014, -0.008], "RPY_parent_to_child": [0, 0, 0] }, { "parent": "body", "child": "imu1", "T_child_wrt_parent": [0.068, -0.015, -0.008], "RPY_parent_to_child": [0, 0, 0] }, { "parent": "body", "child": "stereo_l", "T_child_wrt_parent": [0.1, -0.04, 0], "RPY_parent_to_child": [0, 90, 90] }, { "parent": "body", "child": "tof", "T_child_wrt_parent": [0.1, 0, 0], "RPY_parent_to_child": [0, 90, 90] }, { "parent": "body", "child": "ground", "T_child_wrt_parent": [0, 0, 0.1], "RPY_parent_to_child": [0, 0, 0] }] } ``` Other default files can be set up with `voxl-configure-extrinsics` and can be viewed [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/tree/master/extrinsic_configs) Let's deconstruct one of the more critical entries in this file, the relation between the IMU (imu0) and the tracking camera. This is used for VIO and needs to be accurate for VIO to function. ``` "parent": "imu0", "child": "tracking", "T_child_wrt_parent": [0.065, -0.014, 0.013], "RPY_parent_to_child": [0, 45, 90] ``` From the two sections above, we know that the IMU data is aligned with the drone body frame (FRD Forward Right Down) and the Camera frame uses the same convention as openCV (Right, Down, forward). First we look at the translation. The translation is the location of the child frame WITH RESPECT TO the parent. Given the vector `[0.065, -0.014, 0.013]` we can read that as the camera is 65mm in front of, 14mm to the left of, and 13mm below the IMU. The intrinsic XYZ (RPY) rotation [0, 45, 90] correctly rotates the parent frame to align with the camera frame for the M500 with tracking camera pointing forward and down 45 degrees below the horizon. This can be read as having 0 rotation about the IMU's X (roll) axis, followed by a 45 degree rotation about Y (pitch) to rotate the IMU's Z axis up from pointing straight down to pointing out along the Camera's lens. Finally, a 90 degree yaw rotation about the newly aligned Z axis aligns the X and Y axis. ## Stereo Camera Extrinsics Note that the stereo cameras go through a precise calibration procedure to determine the orientation between them, so only the left stereo camera is provided in the extrinsics config file. The right camera has a specified relation to the left camera in `/data/modalai/opencv_stereo_extrinsics.conf` which is created by the [stereo calibration](/calibrate-cameras/) process. ### Stereo Camera Mounting It is critical that the two stereo image sensors are securely mounted co-planar on a rigid surface. The stereo pair must be aligned as best as possible, and in such a way as to maintain that mounting, for the stereo calibration to be effective. The stereo calibration only refines the last bit of imperfection and cannot solve for sensors aligned or rotated significantly away from each other. --- Source: https://docs.modalai.com/configure-pkg-manager/ # How to Configure the VOXL Package Manager ## Overview The VOXL SDK is distributed as a pre-built [installer](/flash-system-image/#flash-the-sdk). After flashing, VOXL is configured to point its package manager at the Debian package repository section matching that SDK release at [http://voxl-packages.modalai.com/dists/](http://voxl-packages.modalai.com/dists/). This page describes how to use the `voxl-configure-pkg-manager` tool to point the package manager at a different release section. > Generally you do NOT need this tool unless you know what you are doing and have a good reason to change from a stable SDK distribution. Each SDK release is tested as a whole - system image and voxl-suite together - so the supported way to move between SDK releases, including patch releases, is a full [system flash](/flash-system-image/). Mixed package versions are not a supported configuration, and we will not support software issues that arise from pulling packages outside your flashed release. > VOXL SDK packages are licensed to run on ModalAI hardware only, so the package repository is for use on VOXL itself - not for installation on development machines. ## Available Sections ### sdk-x.y We periodically assemble all of our packages into a tested SDK release. These sections are enumerated to match the version of [voxl-suite](/voxl-suite/) within (i.e. SDK-1.6 has voxl-suite version 1.6.x and its dependencies). Alpha, beta, and full SDK releases are all built from these sections. Full releases are considered stable and receive new updates and features that should not break APIs. See the [Configuration Management](/voxl-sdk-configuration-management/) page for how releases are assembled and tested. An SDK minor version release is tied to a system image version so you cannot upgrade to a newer SDK with the voxl-configure-pkg-manager tool. You must follow the [SDK installer instructions](/flash-system-image/#flash-the-sdk). ### Dev This is the development repository containing often untested or experimental software that is automatically pushed via CI on every commit made by ModalAI's software team. Nightly SDK builds, along with nightly system image builds, are assembled from this repository. It serves for ModalAI to use internally. Packages on this repo are updated very regularly and are not guaranteed to function. ### Staging A holdover section that sees limited use; packages are promoted from dev directly into `sdk-x.y` release sections as part of the release process. --- Source: https://docs.modalai.com/calibration/ # Calibration These pages outline required required steps in calibrating various aspects of your flight system. --- Source: https://docs.modalai.com/calibrate-cameras/ # Calibrate Cameras --- ## Overview [VOXL Camera Calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) is a package in voxl-suite >= 0.5.0 for calibrating cameras on-board on voxl. If you are on an older voxl-suite image, we recommend that you upgrade and use this tool, but you can find a link to the deprecated ROS calibration process at the bottom of this page. Use of this tool requires the ability to view the overlay image coming off of voxl. We recommend using the [VOXL Web Portal](/voxl-portal/) to view the overlay images. ## Before You Start - **Find the camera pipe name.** The first argument to the calibrator is the name of the camera pipe published by voxl-camera-server, for example `tracking`, `tracking_front`, `tracking_down`, `stereo_front`, or `stereo_rear`. List the pipes on your VOXL with: ```bash voxl-list-pipes ``` - **Use the right stream.** Calibrate on the grayscale or raw pipe for a camera, not a color or encoded stream. The calibrator exits with `Received invalid camera format` if it is given the wrong one. - **Know your board.** The `-s` size is the count of inner corners, not squares, and `-l` is the edge length of one square in meters. Measure the printed board rather than trusting the file it was printed from. - **Open the overlay before you start collecting.** Run the command, open voxl-portal in a browser, and select the `camera_calibrator_overlay` stream. The overlay shows the thresholded image by default, which makes lighting problems obvious. Add `-r` to see the raw image instead. - **Tracking cameras use the fisheye model.** Add `-f` for any tracking camera. If you leave it off for an ar0144 tracking camera, the tool warns and waits: press Ctrl-C and rerun with `-f`. ## Recommended Chessboard The size and spacing of the chessboard is configurable on the command line. Internally, ModalAI uses a 5x6 with 65.5mm spacing on a stiff, foam-backed board with matte finish to reduce glare. This is the default used by the calibrator tool unless a different size and spacing is set. Note that the size is based on OpenCV's definition of a chessboard and matches the ROS calibrator tool. That is to say, the size (4x7, 5x6, etc) is the count of the number of inner corners which is what is actually being detected by the algorithm (not number of squares). This is usually #squares-1 noting that partial outer squares should not be counted. ![5x6_chessboard_small](/images/voxl-sdk/camera-calibration/5x6_chessboard_small.jpg) Here is an image for a 6x9: [https://raw.githubusercontent.com/opencv/opencv/4.x/doc/pattern.png](https://raw.githubusercontent.com/opencv/opencv/4.x/doc/pattern.png) --- ## Command Line Options ``` voxl-calibrate-camera [options] ``` | Short Option | Long Option | Effect | |:-------------|:---------------------|:--------------------------------------------------------------------------------------------| | `-d` | `--en_debug` | Enable debug prints | | `-e` | `--extrinsics-only` | For a stereo pair, load the existing intrinsics file and only calibrate extrinsics | | `-f` | `--fisheye` | Use the fisheye lens distortion model (required for tracking cameras) | | `-g` | `--skip-extrinsics` | For a stereo pair, calibrate intrinsics only and skip extrinsics | | `-h` | `--help` | Print the help message | | `-l` | `--length` | Edge length of a single square in meters (default 0.0655) | | `-m` | `--mirror` | Mirror the overlay output | | `-n` | `--no-targets` | Collect stereo extrinsics samples manually with the Enter key instead of guided targets | | `-r` | `--no-threshold` | Show the raw image in the overlay instead of the thresholded image (display only) | | `-s` | `--size` | Number of inner corners to look for, as NxM (default 5x6) | The `-t` / `--threshold` option from earlier releases has been removed. The thresholded overlay is now the default. Examples using a 6x8 checkerboard with 0.038 m squares: ```bash voxl-calibrate-camera tracking -f -s 6x8 -l 0.038 voxl-calibrate-camera stereo_front -s 6x8 -l 0.038 voxl-calibrate-camera stereo_rear -s 6x8 -l 0.038 ``` --- ## Monocular Calibration Process To calibrate a monocular camera, such as the tracking camera on voxl, run the command below, open the web portal, and fill the rectangles like such: ```bash voxl-calibrate-camera tracking --fisheye ``` ![Tracking Cal](/images/voxl-sdk/camera-calibration/tracking-cal.jpg) Once you've filled all the rectangles, the calibration will run, which will take a few seconds, and then the calibration will be printed to the terminal window. If the calibration was successful, it will also write to `/data/modalai/opencv_{camera-name}_intrinsics.yml` > A rectangle accepts a sample only when every detected corner lies inside it and the chessboard covers roughly 40 to 50 percent of the rectangle's area (the exact threshold depends on the lens type). Drawn corner markers alone do not count as a sample. The rectangle outline changes from red toward green as coverage increases. If collection stalls with corners visible, move the board closer to the camera until it fills most of the rectangle, keep the whole board inside the outline, and hold it still. Each rectangle needs 2 or 3 accepted samples before the next one appears. > These intrinsics files are also consumed by voxl-camera-server for [Electronic Image Stabilization](/camera-video/electronic-image-stabilization/). Calibrating a camera used with EIS improves stabilization quality. ``` voxl2:/$ voxl-calibrate-camera tracking -f Matrix [277.7090664510777, 0, 290.6865358454301; 0, 277.5687125242331, 240.1597738541476; 0, 0, 1] Distortion [-0.006319990900085937; 0.00155893534296691; 0; 0] distortion_model: fisheye Re-projection error reported by calibrateCamera: 0.172684 Calibration Succeded! Writing data to: /data/modalai/opencv_tracking_intrinsics.yml Saved! Exiting Cleanly ``` When calibrating the standard OV7251 Tracking Camera, make sure to use the `-f` or `--fisheye` flag to make sure that the calibrator uses the fisheye lens distortion model. --- ## Stereo Calibration Process To calibrate a stereo camera, run the command below, open the web portal, and fill the rectangles like such: ```bash voxl-calibrate-camera stereo_front ``` ![Stereo Cal](/images/voxl-sdk/camera-calibration/stereo-cal-intrinsics.jpg) The stereo calibrator runs in two stages. **Stage 1, intrinsics.** The calibrator calculates the intrinsics for each camera separately, so you will need to fill in all of the left rectangles, then all of the right rectangles. The same fill rule applies as for monocular calibration: the board must sit fully inside the rectangle and cover most of it before a sample is accepted. **Stage 2, extrinsics.** By default the calibrator then guides you through a second set of targets that need the board visible in both cameras at once: two large close-range boxes (one per camera) followed by five small far-range boxes in the corners and center. Hold the board flat and still in each box until it is accepted. When the last box is done the extrinsics are calculated automatically. ![Stereo Cal Left](/images/voxl-sdk/camera-calibration/stereo-cal-left.jpg) ![Stereo Cal Right](/images/voxl-sdk/camera-calibration/stereo-cal-right.jpg) If you prefer to choose the extrinsics frames yourself, run with `-n` / `--no-targets`. The calibrator then prints `Sampling overlapping images now`; press Enter in the terminal to capture a frame while the board is fully visible in both cameras, and type `stop` when you have enough. Take at least ten frames spread across the overlapping field of view at varied angles and distances. To redo only the extrinsics with existing intrinsics use `-e`, and to calibrate intrinsics only use `-g`. At the end the tool prints whether it detected a horizontal or vertical pair and the distance between the cameras. Check that this baseline matches the physical spacing on your camera module. If everything has been done properly, you will see output like this (this run used `--no-targets`; a target-guided run prints the same results without the sampling prompts): ``` voxl2:/$ voxl-calibrate-camera stereo Sampling overlapping images now Enter an empty line to take a sample or "stop" to finish sampling Taking Frame Taking Frame stop Stopping sampling Calibrating Left Camera Matrix [493.7322756669245, 0, 306.7896643027532; 0, 493.1380517350153, 217.4680594645219; 0, 0, 1] Distortion [-0.1698366125016952; 0.06988854948207439; -0.001138684086637882; -0.0007932118450081079; 0] distortion_model: plumb_bob Re-projection error reported by calibrateCamera: 0.177678 Calibration Succeded! Calibrating Right Camera Matrix [496.1483207581481, 0, 320.9542358074322; 0, 495.5756728109903, 223.7654477880258; 0, 0, 1] Distortion [-0.1725992238299667; 0.06664783196280108; -0.00172072316840736; -0.0004606934467252117; 0] distortion_model: plumb_bob Re-projection error reported by calibrateCamera: 0.179598 Calibration Succeded! Calibrating Extrinsics 2 frames will be processed R [0.999777546053251, -0.0004080345076243199, 0.02108771954432934; 0.002055883177889161, 0.9969371281114418, -0.07818015053240687; -0.02099123036171473, 0.07820611293723473, 0.9967161943839129] T [-0.08011754799309605; -0.001690038045698758; -0.0008435695774040179] Re-projection error reported by stereoCalibrate: 0.259720 Extrinsics Calibration Succeded! Saved intrinsics to: /data/modalai/opencv_stereo_intrinsics.yml Saved extrinsics to: /data/modalai/opencv_stereo_extrinsics.yml Exiting Cleanly ``` --- ## After Calibration - The results are written to `/data/modalai/opencv__intrinsics.yml` and, for stereo pairs, `/data/modalai/opencv__extrinsics.yml`. Each file records the `reprojection_error` of the run. - Restart the services that consume the calibration so they pick up the new files, for example voxl-open-vins-server or voxl-qvio-server for VIO and voxl-camera-server for EIS. See [Debugging Services](/debugging-services/) for the restart commands. - Confirm every required file is present: ```bash voxl-check-calibration ``` - A calibration is only valid for the resolution it was captured at. If you change the camera resolution or swap the camera hardware, calibrate again. See [Verifying Camera Calibration](/flying-with-vio/#verifying-camera-calibration) on the VIO page for how to read the files and the resolution check. --- ## Troubleshooting | Symptom or message | Cause | Fix | |:-------------------|:------|:----| | Corners are drawn but the rectangle never advances | The board does not fill enough of the rectangle, or some corners fall outside it | Move the board closer until it fills most of the rectangle and keep it entirely inside the outline | | No corners are ever drawn | Wrong `-s` size, glare or poor lighting, a bent board, or the wrong pipe | Check the inner-corner count, use diffuse light and a matte board, and confirm the pipe name with `voxl-list-pipes` | | `Waiting for valid pipe...` | voxl-camera-server is not running or the pipe name is wrong | Start the camera server and check the pipe name | | `ar0144 tracking cameras have fisheye lenses but the --fisheye argument was not given` | Tracking camera run without `-f` | Press Ctrl-C and rerun with `-f` | | `Received invalid camera format` | Color or encoded stream given instead of the grayscale pipe | Use the camera's grayscale or raw pipe | | `Calibration Failed` with `Max reprojection error: 0.75` (pinhole) or `0.60` (fisheye) | Samples were blurred or the board moved while being captured | Hold the board still in each rectangle, improve lighting, and run again | | `Calibration Failed` with reprojection error near 1.0 px on a higher-resolution camera such as the 1280x800 OV9782 | The chessboard is not flat. Higher resolution amplifies small errors in the printed grid | Mount the pattern on a rigid, perfectly flat backing and repeat; a flat board typically brings the error to about 0.3 px | | `Extrinsics Calibration Failed` with `exceeded allowable max reprojection error` | Board was not flat or not still during the overlap samples, or the samples did not cover the shared field of view | Repeat the extrinsics stage with a flat board held still in every box, or use `-e` to redo only the extrinsics | | `Extrinsics Calibration Failed` with `left/right cameras appear to be reversed` | The left and right cameras are swapped in the voxl-camera-server configuration | Swap the two camera entries in `/etc/modalai/voxl-camera-server.conf`, restart voxl-camera-server, and calibrate again | The allowed extrinsics reprojection error is 2.0 px at 640x480 and scales with the image area. --- ## Legacy ROS Calibration The deprecated ROS-based process is documented on the [VOXL ROS Camera Calibration](/ros-calibrate-cameras/) page for users on voxl-suite releases before 0.5.0. --- Source: https://docs.modalai.com/voxl-focus-camera/ # Calibrate Camera Focus --- ## Overview [VOXL Focus Camera](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-focus-camera/) is a package in VOXL SDK for calibrating / adjusting focal distance of cameras connected to VOXL. Use of this tool requires the ability to view the overlay image coming from this application running on VOXL. We recommend using the [VOXL Web Portal](/voxl-portal/) to view the overlay images. --- ## Command Line Options | Short Option | Long Option | Effect | |:-------------|:------------------------|:----------------------------------------------------------------------------------| | ```-h``` | ```--help ``` | Prints this help information | | ```-s``` | ```--size ``` | Specify the number of corners for the calibrator to look for (default 5x6) | | ```-e``` | ```--exposure ``` | Set manual exposure (ms). Must be used with -g (--gain) option | | ```-g``` | ```--gain ``` | Set manual gain (100 = 1.0x). Must be used with -e (--exposure) option | Sample command for calibrating Hires camera on Stinger ``` voxl2:/$ voxl-focus-camera hires_default_misp_color -s 7x5 voxl2:/$ voxl-focus-camera hires_default_misp_color -s 7x5 -e 16.0 -g 400 ``` --- ## Camera Focus Calibration Process To calibrate focus on a camera, such as the high resolution camera, you can simply run the command: ### Suggested Procedure - start `voxl-camera-server` if needed - start `voxl-focus-camera` using voxl2 command line (with optional args) - for example, - `voxl-focus-camera hires_default_misp_color -s 7x5` - open `voxl-portal` in browser and select the focus overlay stream (`misp_camera_focus_overlay`) - `voxl-portal` can be accessed either via wifi / ethernet or via [adb port forwarding](/voxl-portal-via-adb/) - position the calibration pattern in the frame. Once pattern is detected, it should be annotated with the green bounding box as well as small circles in each corner - use drag and zoom (mouse) to center the pattern in the view, such that it fills 25-33% of the image (as shown in the sample screen shot) - fix the pattern (and the camera) so that they do not move during the calibration process - click `Start` button inside the image and follow the instructions (found at the top of the overlay) - there will be several steps in the procedure, requiring the user to turn the camera lens back and forth in order to find maximum focus - the calibration quality indicator (color bar on the left) will be tall and green color when focus is at maximum - click `Reset` button inside the image to restart the procedure, if needed - when you reach the step 'Fine Tuning' step, make the final adjustments while observing the quality bar and focus metric value (top right corner) - end the procedure when satisfied with the results - stop `voxl-focus-camera` app using `control-c` ### Sample GUI View ![Sample View](/images/voxl-sdk/camera-calibration/voxl-focus-camera-annotation.jpg) ### How the Camera Focus Application Works - init - subscribe to the provided camera stream - lock AWB (Auto White Balance) by sending a command to the camera server via a control pipe - set the image de-bayering mode to `nearest` to avoid the smoothing artifacts in zoomed-in view (for color cameras) - calibration - lock exposure and gain to avoid brightness changes during calibration - downscale and convert the incoming image to monochrome - detect the calibration pattern - exact the full resolution image ROI around the calibration pattern and compute the focus metric - annotate and publish the image with calibration overlay - keep track of calibration state - cleanup - set AWB to auto - set AE to auto - set de-bayer mode to auto * Note: In order to reset the zoom to the original setting, restarting `voxl-camera-server` may be the best option after completing the focus calibration - `systemctl restart voxl-camera-server` - alternatively, open the `voxl-portal` to the standard camera view and set the zoom back to the original value (usually 1.0) ## Recommended Calibration Pattern A chessboard pattern is used for this calibration, however it is only used to detect how sharp the edges are. Nevertheless, the tool requires the user to input the correct size of the pattern (e.g. 7x5). Exact size of the squares in the pattern is not important. The size of the chessboard is configurable using command line options. Recommended pattern size is 6x5 or 7x5 which are commonly used in camera calibration. Here is an image for a 6x9: [https://raw.githubusercontent.com/opencv/opencv/4.x/doc/pattern.png](https://raw.githubusercontent.com/opencv/opencv/4.x/doc/pattern.png) ## Other Tips - grey or color images are supported - setting `voxl-set-cpu-mode perf` is optional. it may reduce viewing latency - there is no need to maximize the misp output image size - a long as the raw image size is larger (preview_width, height), using zoom during calibration will allow to make use of higher resolution source image --- Source: https://docs.modalai.com/calibrate-imu/ # Calibrate IMU Included in the [`voxl-imu-server`](/voxl-imu-server/) package are two tools for calibrating the two IMUs on VOXL and any auxiliary IMUs connected to an external SPI bus. Calibration data is saved to `/data/modalai/voxl-imu-server.cal` alongside all other calibration files. --- ## Temperature Calibration (OPTIONAL) This is an optional calibration step that can improve performance. You can skip to **Standard 6DOF Calibration** below if you want to skip this. This calibration uses the CPU to heat up the IMUs, then measures and records a quadratic model of the IMU temperature drift per axis. We recommend doing this with VOXL mounted in the drone and oriented in a normal flight orientation since temperature gradients and stress on the PCB will effect these results. The process is slow and boring, it should take 2-4 minutes. The on-screen instructions are fairly self explanatory so we simple paste them here for reference: ### Step 1 Cold Stage ``` voxl2:/$ voxl-calibrate-imu-temp Server has IMU0 enabled and available for temperature calibration WARNING, voxl-fan utility missing, can't turn on fan ============================================================================ We're now starting the COLD stage of the calibration. Please stop all unnecessary services in another terminal, and try your best to cool the PCB with a fan. Alternatively, start this process on a cold PCB. We will be measuring the static gyro and accel offset as the board heats up. VOXL must remain completely still through this entire process! The IMU temperatures will be printed here continuously. Press ENTER to start the heating process when you are happy that the IMUs are cold enough for the lower bound. 25-35C is a reasonable goal for this. ============================================================================ CPU: 35.1C IMU0: 29.6C ``` ### Step 2 Start Hot stage ``` ============================================================================ We're now starting the HOT stage of the calibration. We just turned off the fan, and started stressing the CPU to heat up the PCB. This will run automatically for a while collecting data points until enough data has been collected, something gets too hot, or the timeout is reached. ============================================================================ CPU: 62.9C IMU0: 45.8C ``` ### Step 3 Wait for Hot stage to finish ``` CPU: 76.4C IMU0: 53.0C IMU1: 46.1C taking sample #2 CPU: 86.7C IMU0: 59.5C IMU1: 53.2C taking sample #3 CPU: 93.2C IMU0: 66.0C IMU1: 59.5C taking sample #4 CPU: 94.8C IMU0: 72.5C IMU1: 66.6C taking sample #5 CPU: 94.4C IMU0: 75.1C IMU1: 69.1C IMU0 hit temp limit, finishing test taking sample #6 ``` ### Step 4 Results ``` COMPUTING RESULTS Successfully wrote calibration to disk voxl-imu-server should reload the new calibration automatically. You can now run voxl-inspect-imu to check that the new data looks good Now is probably a good time to run the normal voxl-calibrate-imu calibration routine since the IMUs should both be up to temperature. ```
## Standard 6DOF Calibration This is a multi-step process that will walk you through doing a static offset calibration for the gyroscope followed by a 6DOF calibration for the accelerometer. This is very similar to the gyro and accelerometer calibration procedure for PX4 in QGroundControl. It will also save the average IMU temperatures as part of this process which will be used in conjunction with the optional temperature calibration results if that is done in addition to this static calibration routine. In either case, we recommend performing this calibration with a warmed up VOXL board. If you intend to do the temperature calibration routine, it may be a good idea to do that FIRST since it will heat the board up. Then come back and do this static calibration after. Note that starting the calibration routine will put the IMU server into calibration mode which causes it to output raw unrotated data from the IMUs, this will most likely cause any background VIO service to fail. After calibration is complete, the server will automatically load in the new calibration data and resume publishing corrected and rotated IMU values without needing to be restarted! ### Step 1 ADB or SSH into VOXL. We recommend doing this wirelessly over SSH to allow more mobility when moving the drone around. ### Step 2 (Optional) make sure `voxl-imu-server` is running ``` voxl2:/$ voxl-inspect-services Service Name | Enabled | Running | CPU Usage ---------------------------------------------------------------- voxl-imu-server | Enabled | Running | 1.8 ``` ### Step 3 Launch the `voxl-calibrate-imu` utility and check that it detected all IMUs ("IMU0" and "IMU1" on VOXL and VOXL Flight, just "IMU0" on VOXL 2, and any external IMU's you may have attached). Then press ENTER. Make sure the drone is upright in a normal flight orientation and is perfectly still! If you have a fan connected to the VOXL fan header, it should have stopped automatically at this point to reduce vibration. ``` voxl2:/$ voxl-calibrate-imu Server has IMU0 enabled and available for calibration We're about to start calibrating the gyro, make sure VOXL is COMPLETELY STILL and press ENTER to start. ``` ### Step 4 After 1 second the results of the static gyroscope should print, for every IMU connected: ``` imu0 gyro offset (rad/s): -0.0115 -0.0130 0.0101 imu0 gyro baseline temp (C): 61.30 ``` ### Step 5 Now we are going to perform the 6DOF accelerometer calibration. This involves placing the drone perfectly still in 6 roughly orthogonal orientations such that the offset and scale of all 3 axis can be measured. The 6 orientations do not have to be perfectly aligned with gravity or perfectly orthogonal to each other. This calibration is not going to treat each axis individually and assume the accelerometer is experiencing exactly 1G in each orientation. Instead it takes all 6 points and fits an ellipsoid to the data. The centroid and size of this ellipsoid defines the accelerometer offset and scale. That being said, IMUs are not perfectly linear and orienting the drone such that each axis aligns within about 10 degrees of gravity will help exercise the full range of the sensor and give the best results. ``` We're about to start calibrating the accelerometer. This process will require you to orient the VOXL board in six roughly orthogonal orientations. Ideally this should be with the six sides of the board facing down. Try to do this without touching the board. When you are ready to collect data for orientation 1 of 6, press ENTER to start or Ctrl-C to quit ``` ### Step 6 Now go through the remaining 5 orientations. The exact order does not matter, just be sure to keep track and don't double up or the process will fail! Here is a visualization of the different orientations needed: ![calibration orientations](/images/voxl-sdk/imu-cal.png) ``` RESULTS: accl0 offsets (m/s2): 0.0118 -0.0010 0.1146 accl0 scales : 1.0017 1.0011 1.0010 accl0 baseline temp: 47.57C accl1 offsets (m/s2): -0.0958 -0.0903 0.0205 accl1 scales : 1.0015 1.0005 1.0026 accl1 baseline temp: 42.95C Successfully wrote calibration to disk voxl-imu-server should reload the new calibration automatically. You can now run voxl-inspect-imu to check that the new data looks good You can also optionally run voxl-calibrate-imu-temp to run a more involved temperature calibration. ``` ### Step 7 If the calibration was successful, the results should now be saved to `/data/modalai/voxl-imu-server.cal` and `voxl-imu-server` should have reloaded the new data. ## Troubleshooting ### PX4 reports "Preflight Fail: High Accelerometer Bias" This PX4 preflight check fails when the estimated accelerometer bias is large. Calibrating or running the board very hot can cause it: a VOXL 2 left idle on a desk with no airflow can exceed 100 C CPU temperature (check with `voxl-inspect-cpu`), and the bias is visible in the PX4 log. Cool the board with a fan, recalibrate the accelerometer with the airflow still on, and keep a fan on VOXL 2 whenever it sits on the bench during development. If the error persists after recalibrating at a normal temperature, capture a PX4 log (see [Param Files and Log Files](/voxl-px4-files/#starting-a-log-manually)) for analysis. ## Source The code is available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server/) --- Source: https://docs.modalai.com/calibrate-baro/ # Calibrate Barometer The barometer on VOXL 2 is sensitive to temperature drift. The barometer temperature calibration process measures pressure readings across a range of temperatures and fits a polynomial compensation curve to correct for this drift. This results in more stable and accurate altitude estimates. Calibration data is saved to `/data/px4/param/parameters_baro_tc.cal`. --- ## Overview The calibration process works by: 1. Stressing the CPU cores to heat up the board 2. Collecting barometer pressure and temperature samples as the board heats 3. Fitting a polynomial curve to compensate for temperature-induced pressure drift 4. Saving the thermal compensation parameters for PX4 The calibration can be performed either through the **VOXL Portal** web interface or directly from the **command line**. --- ## Method 1: VOXL Portal ### Step 1 - Open the Portal Navigate to the VOXL Portal in your web browser by going to `http://`. If you do not have a WiFi connection to VOXL, see [Accessing VOXL Portal via ADB](/voxl-portal-via-adb/). ### Step 2 - Navigate to Barometer Calibration In the top navigation bar, open the **Debug** dropdown menu and click **Barometer Calibration**. ![VOXL Portal Debug menu with Barometer Calibration option](/images/voxl-sdk/baro-calibration/baro-cal-page.png) ### Step 3 - Click Calibrate Barometer Click the **Calibrate Barometer** button to begin the process. ### Step 4 - Cool the Board If the board is above 35C, the portal will display the current temperature and prompt you to cool the board with a fan. Once the temperature drops below 35C, turn the fan off and click **Continue** to start the calibration. ![Portal waiting for barometer to cool below 35C](/images/voxl-sdk/baro-calibration/baro-cal-waiting.png) > If you are having trouble getting the board cool enough, try stopping resource-intensive services before starting the calibration: ``` voxl2:/$ systemctl stop voxl-open-vins-server voxl2:/$ systemctl stop voxl-camera-server ``` ### Step 5 - Wait for Calibration to Complete The portal will stress the CPU and collect barometer samples. A progress percentage will be displayed while the calibration runs. Wait for it to reach 100%. ![Barometer calibration in progress](/images/voxl-sdk/baro-calibration/baro-cal-in-progress.png) ### Step 6 - Save Parameters Once the calibration completes, the parameter table will populate with the computed values. Click **Save Parameters** to apply the calibration data to PX4. ![Barometer calibration complete with parameters](/images/voxl-sdk/baro-calibration/baro-cal-complete.png) --- ## Method 2: Command Line ### Step 1 ADB or SSH into VOXL. ### Step 2 Run the barometer temperature calibration script: ``` voxl2:/$ baro_temp_cal ``` This will use the default settings (1250 samples, 7 CPU cores stressed, 1 iteration). You can also customize the behavior with optional arguments: | Flag | Description | Default | |:-----|:------------|:--------| | `-n` | Number of samples to collect | 1250 | | `-c` | Number of CPU cores to stress for heating | 7 | | `-i` | Number of iterations | 1 | | `-f` | Force calibration (disable temperature range checks) | off | | `-s` | Sleep interval between samples (ms) | 300 | | `-p` | Log output path | `/data/baro_cal_logs/` | For example, to run with 4 CPU cores stressed (slower, more gradual heating): ``` voxl2:/$ baro_temp_cal -c 4 ``` ### Step 3 If the board is above 35C, the script will ask you to cool it down before proceeding. Once the board is cool enough, turn off the fan and press Enter: ``` Barometer temperature calibration process starting Starting iteration #0 Baro too hot [ 35.1C] cool the VOXL with a fan until <35C Please turn the fan OFF, then press Enter to continue. ``` The script will then stress the CPU and begin collecting samples. You will see output showing the sample count, pressure, and temperature as it progresses: ``` Starting stress tasks Starting data capture ( 1) P:100175.2Pa T: 30.5C ( 2) P:100175.5Pa T: 30.4C ( 3) P:100175.1Pa T: 30.4C ... (1248) P: 99997.2Pa T: 61.7C (1249) P: 99996.4Pa T: 61.7C (1250) P: 99997.1Pa T: 61.7C Finished collecting data ``` ### Step 4 Once data collection is complete, the script will automatically fit the polynomial curve, save the calibration to `/data/px4/param/parameters_baro_tc.cal`, and load the new parameters into PX4: ``` Poly Fit: [-5.36099897 3.40355239] param set TC_B_ENABLE 1 param set TC_B0_ID 12018473 param set TC_B0_TREF 45.94 param set TC_B0_TMIN 0.00 param set TC_B0_TMAX 71.69 param set TC_B0_X0 3.40355 param set TC_B0_X1 -5.36100 param set TC_B0_X2 0.00000 param set TC_B0_X3 0.00000 param set TC_B0_X4 0.00000 param set TC_B0_X5 0.00000 Loading new params to PX4 [INFO] Voxl-px4 process found and active. [INFO] Loading file: /data/px4/param/parameters_baro_tc.cal [INFO] Setting params... [INFO] PX4 parameter configuration successful! Barometer temperature calibration process ending ``` No manual parameter loading step is needed — the script handles it automatically. --- ## Verifying Calibration After calibration, you can confirm the baro calibration file is present and that the parameters were loaded correctly. First, run `voxl-check-calibration` to verify the calibration file exists: ``` voxl2:/$ voxl-check-calibration ``` You can also verify the baro thermal compensation parameters are loaded in PX4: ``` voxl2:/$ px4-param show | grep TC_B ``` This should show the `TC_B0_*` parameters (enable, ID, TREF, TMIN, TMAX, X0-X5) that were generated during calibration. --- Source: https://docs.modalai.com/calibrate-horizon/ # Calibrate Level Horizon This calibration process is an in-flight alternative to the level horizon calibration method in QGC. By doing this in flight, airframe asymmetries are taken into account, and you do not need a perfectly level surface with perfectly level landing gear. We still recommend having QGC open to monitor PX4 and battery health. `voxl-vision-hub` will announce when it has started and completed the calibration process through a mavlink message to QGC, so turn the volume up so you can hear when it is finished. This procedure should be done in a large enough room to avoid excessive turbulence. Make sure airflow in the room is minimized, including turning off fans and AC units. When you are ready, take off in position mode and fly/move around for 20-30 seconds to allow VIO to stabilize and for EKF2 to converge on its IMU bias. Then navigate the drone to the middle of the room and leave it hovering. `voxl-vision-hub` will monitor the roll/pitch values reported by PX4 until the drone remains still enough for 20 seconds to be confident that the measurement is correct. If the still condition is met, it will write new SENS_BOARD_X_OFF & SENS_BOARD_Y_OFF parameters to PX4. The drone may twitch a little in the air depending on how far off it was. `voxl-vision-hub` will then announce through QGC that the calibration is complete. If you have a particularly wobbly drone or a lot of turbulence, then the stationary condition may not ever be met. You can increase the allowable noise tolerance in `/etc/modalai/voxl-vision-hub.conf` with the field `horizon_cal_tolerance`. Note that increasing this will reduce the accuracy of the calibration. ``` voxl2:/$ voxl-calibrate-px4-horizon Press ENTER to start the calibration process or Ctrl-C to quit calibration started voxl2:/$ ``` # TODO: add Video --- Source: https://docs.modalai.com/high-level-features/ # High Level Features ## Overview These are the primary features and functions provided by the [VOXL SDK](/voxl-sdk/) which are designed as starting points to help you accelerate OEMs in the development of their own final products. --- Source: https://docs.modalai.com/mavlink/ # Mavlink Routing on VOXL Mavlink routing on VOXL is handled by [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) which routes mavlink messages between the autopilot, MPA services, and ground control stations. Up to 16 simultaneous external UDP connections can be established with voxl-mavlink-server. These can be connections to qGroundControl, MAVROS, MAVSDK, or any custom software on the same network as VOXL. voxl-mavlink-server listens for mavlink heartbeats on the standard mavlink port 14550 and opens a new link when it receives a heartbeat from a new IP. Each link receives all mavlink data coming from the autopilot and any messages received on the UDP port will be forwarded to the autopilot. ## Prerequisites This page assumes you have followed the VOXL Developer Bootcamp [Connecting VOXL to QGroundControl](/qgc-wifi/) page. ## Routing Paths (QRB5165 SDSP Mode) QRB5165 based systems (VOXL2 and VOXL2-mini) running voxl-px4 on the SDSP have two parallel mavlink streams running between the autopilot and voxl-mavlink-server. This allows very high datarate messages (aka 'Onboard Mode') to be sent from the autopilot to local services running on VOXL through MPA. A second low datarate stream (aka 'Normal Mode') is then transmitted to ground control stations over UDP. This data stream is still available for MPA services to inspect via the `mavlink_to_gcs` pipe. MPA services can also communicate directly with the GCS though the `mavlink_from_gcs` pipe. ![Mavlink Server Diagram SDSP](/images/voxl-sdk/voxl-mavlink-server-diagram-sdsp-mode.png) ## Routing Paths (External Autopilot Mode) On both QRB5165 and APQ8096 based systems where the user has connected an external Autopilot Via a UART port, the single mavlink stream is shared for both onboard and GCS communication. Note it is up to the user to configure the desired datarate on their own external Autopilot. For information on how to connect an external flight controller to VOXL2, go [here](/voxl2-external-flight-controller/). ![Mavlink Server Diagram External Autopilot](/images/voxl-sdk/voxl-mavlink-server-diagram-external-mode.png) ## Debugging with voxl-inspect-mavlink voxl-inspect-mavlink will show the mavlink message types and rates being published on any of the 14 pipes published by voxl-mavlink-server: mavlink_onboard, mavlink_ap_heartbeat, mavlink_sys_status, mavlink_gps_raw_int, mavlink_attitude, mavlink_local_position_ned, imu_mavlink, px4_baro, rc_channels, rc_active, mavlink_to_gcs, mavlink_from_gcs, gcs_ip_list, and mission. For example, to see the full datarate 'onboard mode' messages being published by the Autopilot for use by onboard services, run the following: ```bash voxl2:/$ voxl-inspect-mavlink mavlink_onboard | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 4 | 1.1 | | 1 | sys_status | 18 | 5.0 | | 2 | system_time | 4 | 1.1 | | 4 | ping | 4 | 1.1 | | 8 | link_node_status | 4 | 1.1 | | 24 | gps_raw_int | 29 | 8.0 | | 29 | scaled_pressure | 4 | 1.1 | | 30 | attitude | 36 | 10.0 | | 31 | attitude_quaternion | 36 | 10.0 | | 32 | local_position_ned | 109 | 30.2 | | 36 | servo_output_raw | 36 | 10.0 | | 65 | rc_channels | 72 | 20.0 | | 74 | vfr_hud | 36 | 10.0 | | 83 | attitude_target | 36 | 10.0 | | 85 | position_target_local_ned | 36 | 10.0 | | 105 | highres_imu | 36 | 10.0 | | 141 | altitude | 36 | 10.0 | | 147 | battery_status | 2 | 0.6 | | 230 | estimator_status | 4 | 1.1 | | 241 | vibration | 2 | 0.6 | | 245 | extended_sys_state | 18 | 5.0 | | 290 | esc_info | 36 | 10.0 | | 291 | esc_status | 36 | 10.0 | | 331 | odometry | 108 | 29.9 | | 380 | time_estimate_to_target | 3 | 0.8 | | 411 | current_event_sequence | 1 | 0.3 | | 12901 | open_drone_id_location | 4 | 1.1 | ``` Or to simply show that heartbeats are being broadcast by the autopilot: ```bash voxl2:/$ voxl-inspect-mavlink mavlink_ap_heartbeat | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 8 | 1.1 | ``` You can also see the much lower datarate packets going from the autopilot to the GCS. Note that this will show data even without a GCS connected since the autopilot broadcasts this data at all times. ```bash voxl2:/$ voxl-inspect-mavlink mavlink_to_gcs | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 8 | 1.1 | | 1 | sys_status | 8 | 1.1 | | 4 | ping | 1 | 0.1 | | 8 | link_node_status | 7 | 0.9 | | 24 | gps_raw_int | 7 | 0.9 | | 29 | scaled_pressure | 8 | 1.1 | | 30 | attitude | 111 | 14.9 | | 31 | attitude_quaternion | 75 | 10.1 | | 32 | local_position_ned | 8 | 1.1 | | 36 | servo_output_raw | 8 | 1.1 | | 65 | rc_channels | 38 | 5.1 | | 74 | vfr_hud | 30 | 4.0 | | 83 | attitude_target | 15 | 2.0 | | 85 | position_target_local_ned | 11 | 1.5 | | 141 | altitude | 8 | 1.1 | | 147 | battery_status | 4 | 0.5 | | 230 | estimator_status | 4 | 0.5 | | 241 | vibration | 1 | 0.1 | | 245 | extended_sys_state | 8 | 1.1 | | 290 | esc_info | 8 | 1.1 | | 291 | esc_status | 8 | 1.1 | | 380 | time_estimate_to_target | 7 | 0.9 | | 411 | current_event_sequence | 3 | 0.4 | | 12901 | open_drone_id_location | 8 | 1.1 | ``` You will, however, only see data coming from the GCS on the mavlink_from_gcs pipe once a GCS connects. Usually the GCS just sends a heartbeat once per second and a ping every 10 seconds. However, if you open voxl-inspect-mavlink BEFORE opening the GCS, you can see the variety of messages the GCS sends over during initial connection. Of note is the param_request_list message which triggers the param dump from the autopilot to the GCS on initial connection. Also the initial several command_long messages are mavlink commands requesting information about the camera capabilities and requesting the RTSP video stream URL. You can have two windows open at once inspecting both mavlink_from_gcs and mavlink_to_gcs to help debug if custom commands and command ACKs are being send back and forth. ```bash voxl2:/$ voxl-inspect-mavlink mavlink_from_gcs | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 26 | 1.1 | | 2 | system_time | 2 | 0.1 | | 4 | ping | 1 | 0.0 | | 21 | param_request_list | 1 | 0.0 | | 23 | param_set | 1 | 0.0 | | 43 | mission_request_list | 3 | 0.1 | | 47 | mission_ack | 3 | 0.1 | | 76 | command_long | 9 | 0.4 | ``` ## voxl-mavlink-server Configuration File ```json /** * voxl-mavlink-server Configuration File * * primary_static_gcs_ip & secondary_static_gcs_ip * These configure voxl-mavlink-server to automatically try to connect to * up to two known static GCS units. Set to empty or NULL if you don't want * to use this and you want the GCS to initialize the connection instead. * Note the default IP for the primary link is 192.168.8.10 which is the * first IP that VOXL DHCP serves when connecting in wifi softap mode. * * * Settings for running voxl-px4 on SLPI: * onboard_port_to_autopilot - UDP port to send high-rate onboard data to SLPI * onboard_port_from_autopilot - UDP port to receive high-rate onboard data from SLPI * gcs_port_to_autopilot - UDP port to send normal-rate gcs data to SLPI * gcs_port_from_autopilot - UDP port to receive normal-rate gcs data from SLPI * * Settings for running an external autopilot connected via UART: * en_external_uart_ap - set to true to enable an external flight controller * autopilot_uart_bus - uart bus, default 1 for VOXL2 * autopilot_uart_baudrate - default 921600 * en_external_fc_timesync - enable responding to timesync messages * (enabled by default) * en_external_ap_heartbeat - enable automatic sending of heartbeat * gcs_timeout_s - time without heartbeat to consider GCS disconnected * * udp_mtu - maximum transfer unit for UDP packets back to GCS. voxl-mavlink-server * will bundle up backets for the GCS into a single UDP packet with * a maximum size of this. This saves network traffic drastically. * Set to 0 to disable this feature and send one UDP packet per msg. * * * External FC field is for QRB5165 only. Set to true to enable UART * communication to an external flight controller, otherwise a UDP interface * will be started to talk to voxl-px4 on localhost which is the default behavior. * */ { "primary_static_gcs_ip": "192.168.8.10", "primary_static_gcs_ip_port": 14550, "secondary_static_gcs_ip": "192.168.8.11", "secondary_static_gcs_ip_port": 14550, "onboard_port_to_autopilot": 14556, "onboard_port_from_autopilot": 14557, "gcs_port_to_autopilot": 14558, "gcs_port_from_autopilot": 14559, "en_external_uart_ap": false, "autopilot_uart_bus": 1, "autopilot_uart_baudrate": 921600, "autopilot_mission_delay_start": -1, "autopilot_mission_delay_sound": false, "autopilot_mission_force_restart": 0, "autopilot_mission_notif_dur": 0.1, "en_external_ap_timesync": 1, "en_external_ap_heartbeat": 1, "en_elrs_rc_mux": false, "udp_mtu": 512, "gcs_timeout_s": 4.5 } ``` > Never set `primary_static_gcs_ip` or `secondary_static_gcs_ip` to localhost, these are meant for external ground control stations. For local MAVSDK and MAVROS communication, set the `en_localhost_mavlink_udp` flag in `/etc/modalai/voxl-vision-hub.conf` instead. ## voxl-mavlink-server debug modes ```bash voxl2:/$ voxl-mavlink-server --help voxl-mavlink-server usually runs as a systemd background service. However, for debug purposes it can be started from the command line manually with any of the following debug options. When started from the command line, voxl-mavlink-server will automatically stop the background service so you don't have to stop it manually -c, --load_config_only Load the config file and then exit right away. This also adds new defaults if necessary. This is used by voxl-configure-voxl-px4 to make sure the config file is up to date without actually starting this service. -h, --help Print this help text -i, --debug_pipe_recv show debug info on messages coming from MPA -j, --debug_pipe_send show debug info on messages sending to MPA -k, --debug_ap_recv show debug info on messages coming from autopilot -l, --debug_ap_send show debug info on messages sending to autopilot -m, --debug_gcs_recv show debug info on messages coming from GCS -n, --debug_gcs_send show debug info on messages sending to GCS -t, --debug_timesync show debug info on the timesync protocol handling -z, --debug_send_recv show debug info on all sent and received messages ``` ## Mavlink Headers ModalAI bundles up the [official MAVlink headers](https://github.com/mavlink/c_library_v2) into a deb (and ipk) package called voxl-mavlink for distribution in voxl-suite for easy distribution and building projects in the VOXL ecosystem. The source code for the voxl-mavlink package can be found [here](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-mavlink). [Next: Streaming Video to QGroundControl](/voxl-streamer/){: .btn .btn-green } --- Source: https://docs.modalai.com/flying-with-vio/ # Flying with VIO ## What is VIO (Visual Inertial Odometry)? VOXL supports two VIO engines: `voxl-qvio-server` and [voxl-open-vins-server](/voxl-open-vins-server/). Only one should be running at a time — disable the other before enabling one, e.g. with `voxl-configure-qvio disable`. ## Configure Parameters ModalAI's reference drones User's Guide should have instructions on how to configure the drone for VIO. If you are building your own setup, you need to configure the following before VIO will work: * [Configure the Extrinsic Parameters](/configure-extrinsics/) * Configure PX4's EKF2 parameters for vision-enabled flight. There are EKF2 helpers in Gitlab, here is a link to the PX4 v1.14 [EKF2 Helpers Directory](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/tree/master/params/v1.14/EKF2_helpers?ref_type=heads) Camera and IMU selection for the VIO servers lives in `/etc/modalai/vio_cams.conf`, which is managed with `voxl-configure-vio-cams` and can be inspected with `voxl-inspect-vio-cams`. `voxl-configure-qvio` itself accepts only the modes `disable`, `factory_enable`, and `enable` — the older `factory_enable_imu_*` modes are deprecated and will error. ## Switching the Primary VIO from QVIO to Open-VINS Current SDK releases configure Starling 2 and Starling 2 Max with `voxl-open-vins-server` as the primary VIO and `voxl-qvio-server` disabled; this is the default `voxl-configure-mpa` applies to these SKUs. Vehicles that were set up with an older SDK release may still run `voxl-qvio-server` as the primary VIO with `voxl-open-vins-server` as the fallback. On those vehicles `/etc/modalai/voxl-vision-hub.conf` contains: ```json "vio_pipe": "qvio", "secondary_vio_pipe": "ov", ``` voxl-vision-hub subscribes to `vio_pipe` and only switches to `secondary_vio_pipe` when no data is available on the primary pipe. The simplest way to get the current defaults is to update to the current SDK, or to rerun [voxl-configure-mpa](/voxl-configure-mpa/), which resets every service configuration to the SKU defaults. To change only the VIO selection on an existing installation: 1. Edit `/etc/modalai/voxl-vision-hub.conf`: set `vio_pipe` to `ov` and set `secondary_vio_pipe` to an empty string so voxl-vision-hub does not fall back to QVIO. An empty string disables the fallback; the full key reference is on the [voxl-vision-hub](/voxl-vision-hub/) page. ```json "vio_pipe": "ov", "secondary_vio_pipe": "", ``` 2. Disable and stop voxl-qvio-server so only one VIO engine is running: ```bash voxl-configure-qvio disable systemctl stop voxl-qvio-server ``` 3. Make sure voxl-open-vins-server is configured and enabled. `voxl-configure-open-vins ` writes its configuration files and enables the service; the available camera configurations are listed under [Installation and Setup](/voxl-open-vins-server/#installation-and-setup) on the Open-VINS page. If the configuration already exists and only the service was disabled: ```bash systemctl enable voxl-open-vins-server ``` 4. Restart the services and confirm the new pipe is producing data: ```bash systemctl restart voxl-open-vins-server voxl-vision-hub voxl-inspect-services voxl-inspect-vins ``` After switching, repeat the [hand-held test](#the-hand-held-test) before flying. ## Confirm PX4 is Getting VIO Data As part of the package installation a voxl-vision-hub systemd service is created which starts the interface automatically on boot. This takes up to about 30 seconds to start. By the time you have plugged in a battery, walked back to your laptop, and opened QGroundControl voxl-vision-hub should be running. Confirm before flight by opening the mavlink inspector and checking that X&Y values are non-zero in the ODOMETRY mavlink telemetry packets. ![voxl-vio-mavlink-inspector.png](/images/voxl-sdk/voxl-vio-mavlink-inspector.png) Alternatively, if your computer running QGroundControl has its volume turned up you should hear it announce the swap from "manual" to "position" mode when you flip the flight mode switch from up to middle. If VIO data is not being transmitted, the system will fall back to altitude mode and you will hear "position mode rejected, altitude flight mode". In this case, go back to manual flight mode (switch up) and wait a few more seconds for voxl-vision-hub to finish initializing. If this doesn't work, go back to Installation Step 1 and reconfirm VIO is working. You can also check the voxl-vision-hub systemd service for indications of what might have gone wrong. If you have changed the Flight Core's **PX4 EKF2 settings, you may need to set the parameters back into VIO mode**. To make this easier, we have a parameters file helper [located here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/v1.14/EKF2_helpers/indoor_vio.params) which are the parameters that ship with the [Starling](https://www.modalai.com/products/starling-2-max) drone. Specifically the **_EKF2_EV_CTRL_** (external vision control) parameter is often overlooked as an important parameter for VIO flight. Note that the older **_EKF2_AID_MASK_** parameter no longer exists on PX4 1.14. ## Confirm Data is in the Right Coordinate Frame While looking at the ODOMETRY data in QGroundControl's Mavlink Inspector, observe the xyz data as you move the quadcopter around. Make sure it aligns with NED coordinate frame. If there is a coordinate system mismatch PX4 will initially take off then very quickly run away out of control. TODO: Video/pictures ## Take off in Position Mode It is safer to take off in Position Flight Mode than it is to flip to this mode mid-flight from Manual Flight Mode. Take off and land with the same instructions as listed above but this time with the Flight Mode switch in the middle position. The quadcopter should take off straight up and be much easier to control than in manual mode. Be ready to flip back to manual mode should anything go wrong. It is safer to flip to manual mode and land than to kill the motors mid-flight. Killing the motors mid-flight may result in the propellers loosening from the reverse-torque and flying straight up off the quadcopter. Only kill the motors after landing and spooling down the motors OR in a serious emergency. ## Flip to Offboard Mode While flying in Position Mode, you may flip the Flight Mode Switch all the way down to enable offboard mode. The quadcopter should immediately fly back to a position 2 meters above wherever VIO initialized. If you plugged in the battery and let the VOXL and PX4 power up at the takeoff location (suggested normal practice) then it should hold a position 2 meters above the takeoff location. In Offboard Mode the 2 joysticks on the RC controller are ignored and the PX4 follows any commands given to it by VOXL over the UART link. In this case VOXL just sends a static location. # Troubleshooting VIO For general service debugging — logs, restarts, running in the foreground — see [Debugging Services](/debugging-services/). Visual Inertial Odometry (VIO) fuses tracked visual features with IMU data to produce dead-reckoning odometry. It depends on two things: **visible features to track** and **low-noise IMU data**. Degrade either — low light, featureless surfaces, vibration — and tracking suffers. It is *strongly recommended* to stay comfortable switching between manual and position control with a backup R/C while learning where VIO works well. > On current SDKs, [voxl-open-vins-server](/voxl-open-vins-server/) is the actively developed VIO and the recommended starting point — it supports multiple cameras and is continuously improved. voxl-qvio-server (single camera, closed source) is no longer being developed. The tools below cover both. ## Triage Ladder Work down this list in order — it resolves the vast majority of "VIO doesn't work" reports: 1. **Are the services running?** `voxl-inspect-services` — you need voxl-camera-server, your VIO service (voxl-open-vins-server or voxl-qvio-server), voxl-vision-hub (it sends the MAVLink odometry to PX4), and voxl-portal for debugging. 2. **Is the tracking camera detected?** `voxl-camera-server -l` lists detected cameras. Missing camera → see [Debugging Camera Issues](/debugging-camera-issues/). 3. **Look at the image.** In [voxl-portal](/voxl-portal/), check the tracking camera view: lens cover removed? Lens clean and in focus? Scene has texture with features both near and far? 4. **Do the hand-held test** (below). Features locked to the world and low drift → VIO itself is fine. 5. **Check the pose reaching PX4:** `voxl-inspect-pose vvhub_body_wrt_local` shows the pose after extrinsics are applied — it should match PX4's local position. Good VIO but wrong pose here → extrinsics problem ([Configure Extrinsics](/configure-extrinsics/)). 6. **Check what PX4 reports:** in QGC's MAVLink Inspector, watch `LOCAL_POSITION_NED`. **Z updating but X/Y stuck at zero indicates an EKF2 configuration problem, not a VIO problem** (see below). 7. **PX4 parameters must match your PX4 version.** Load the airframe + VIO params from the matching version directory of [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) — params from the wrong PX4 version cause subtle breakage. 8. **SDK coherence.** Mixed package versions (one service upgraded, others not) break the pipeline. Prefer flashing a complete SDK release over upgrading individual packages. ## The Hand-Held Test A reliable check that VIO itself is healthy — repeat it any time you change the VIO configuration: 1. Props off. Power up with VIO running and open the VIO tab in [voxl-portal](/voxl-portal/). 2. Slowly pick the vehicle up and move it around — half a meter is enough. Watch the feature markers (the qvio_overlay stream for QVIO, or the VIO tab's plot for Open-VINS): **features should stay locked onto the same physical points** as the vehicle moves. Features that appear and disappear or slide off their targets usually mean incorrect camera-to-IMU extrinsics. 3. Carry the vehicle around the room and return it to the exact starting position and orientation. Reported drift should be a **few percent of the distance traveled**, with very small orientation drift. ## Odometry X and Y Read Zero The most common VIO complaint. First, the decision rule: **if `voxl-inspect-qvio` / `voxl-inspect-vins` shows valid, moving position data, VIO is working** — no amount of camera recalibration will help, and the problem is on the PX4 side. Then: - If VIO output itself is zero or frozen: VIO hasn't initialized or has failed. Try `voxl-reset-qvio` (or `voxl-reset-vins`), restart the service, or power-cycle, and check the [error codes](#vio-states-quality-and-error-codes) below. - If VIO is good but `LOCAL_POSITION_NED` shows Z updating while X/Y stay zero: EKF2 is not fusing the vision inputs — check the EKF2 external-vision settings in your version-matched param file from [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) (e.g. `ekf2_indoor_vio.params`). (On old PX4 versions this was the `EKF2_AID_MASK` parameter, value 280 for all-vision aiding; current PX4 uses the split `EKF2_*_CTRL` scheme in the param files.) - PX4 may be rejecting position mode because it wants a magnetometer. For VIO-only (indoor) flight on PX4 1.12+: ``` SYS_HAS_MAG 0 EKF2_MAG_TYPE 5 ``` and for a vehicle with no GPS at all, also `SYS_HAS_GPS 0`. A connected GPS/mag unit fighting VIO can also corrupt the local position — for a quick experiment, disconnect it. - Old QGC versions can also display stale settings — update QGC before trusting its inspector. ## Verifying Camera Calibration - Calibration files live in `/data/modalai/` (`opencv__intrinsics.yml` / `_extrinsics.yml`). Each stores its own `reprojection_error` — the calibrator accepts **≤ 0.75 px** (pinhole) or **≤ 0.60 px** (fisheye); if your stored error is near the limit, recalibrate. See [Calibrate Cameras](/calibrate-cameras/). - **Resolution must match**: a calibration captured at 640x480 is invalid for a camera now running 1280x800. If tracking is bad after a camera or config change, check the resolution inside the cal file. - Swapping camera hardware (different sensor or module) always requires recalibration. - Tracking cameras are calibrated at the factory; hires (IMX412-class) cameras are not. ToF sensors carry intrinsics on the sensor itself. Extrinsics ship from CAD models — accurate, but not individually calibrated. - Lost your factory calibration? ModalAI keeps production calibration backups — ask on the [forum](https://forum.modalai.com/) with the serial number from the white sticker on the board. ## IMU Checks - The VIO IMU is the **apps-processor IMU** (`imu_apps`), not the one PX4 flies on — both matter, but VIO problems point at the former. - Recalibrate with `voxl-calibrate-imu` (or via voxl-portal), then confirm gravity magnitude reads ≈9.81 m/s² in `voxl-inspect-imu`. - IMU **temperature** calibration is optional and can hurt if it was captured poorly — when debugging VIO drift, try removing the IMU temperature calibration file from `/data/modalai/`. - Vibration degrades VIO significantly. Evaluate with [voxl-inspect-vibration](/voxl-inspect-vibration/) and PX4 log analysis; improve mechanical damping before chasing software. ## Environment and Optics - Feature-rich scenes with texture at **both near and far range** work best; far-only features (e.g. a camera pointed out a window) give orientation but poor position. - Difficult scenes: plain cement, waving grass, low light. Diffuse self-illumination on the airframe helps at night — avoid hot spots and glare. - Tracking camera focus: for the OV7251 fisheye, everything beyond ~15 cm should be in focus — test with two high-contrast objects at 15 cm and 1 m. The lens is plastic: clean gently with a microfiber cloth. - Anything added to the airframe that intrudes into the camera view (legs, payloads, wiring) hurts tracking — mask it out (below) or move it. ## Masking Propellers and Landing Gear (QVIO) voxl-qvio-server can ignore image regions via a mask image, set with `mask_file_path` in `/etc/modalai/voxl-qvio-server.conf`: - Format: **160x120 PGM (P5)**, where **white (255) marks regions to block** from feature detection and black (0) allows them. A known-good example: [mask_example_160x120_fixed.pgm](https://storage.googleapis.com/modalai_public/temp/voxl2-misc-packages/mask_example_160x120_fixed.pgm). - The PGM header must be exactly `P5 # 160 120 255` style with the comment marker — some editors write a header the underlying tracker rejects silently. - The path is resolved **relative to the service's working directory** — use an absolute path. - Sanity check: load a half-white/half-black mask and confirm new features only appear in the allowed half. (Features that begin in the allowed region may still be tracked into the masked region — that is expected.) ## VIO States, Quality, and Error Codes `voxl-inspect-qvio`, `voxl-inspect-vins`, and the portal all report three key fields from the VIO pipes: **State** — `FAIL` (0), `INIT` (1), `OKAY` (2). INIT means the estimator is still initializing; QVIO requires the vehicle stationary to initialize (and hard-resets every 3 seconds until it succeeds), while Open-VINS initializes dynamically at any attitude within tens of milliseconds. **Quality** — unitless, higher is better, **−1 means failed**. For QVIO it reflects how much of the image grid is covered by well-constrained features (100% ≈ half the grid covered); brief dips during fast motion are normal. Open-VINS applies hysteresis so quality transitions between good/bad states rather than flickering. **Error codes** — a hex bitfield, decoded by the inspect tools. Primarily meaningful when state is FAIL; the most common: | Bit | Name | Meaning | |---|---|---| | 0x1 | COV_ERROR | covariance blew up — usually vibration or bad calibration | | 0x2 | IMU_OOB | IMU exceeded measurement range (hard impact); in Open-VINS also raised for sustained fast spin-in-place | | 0x4 | IMU_BW | IMU bandwidth too low | | 0x8 | NOT_STATIONARY | not stationary at initialization (QVIO); in Open-VINS repurposed for "quality below threshold too long" | | 0x10 | NO_FEATURES | no trackable features for too long | | 0x20 | CONSTRAINT_ERROR | features gave insufficient geometric constraints | | 0x40 | FEATURE_ADD_ERROR | failed to add new features | | 0x80 / 0x100 | VEL_INST_CERT / VEL_WINDOW_CERT | velocity uncertainty exceeded limits (instant / windowed) | | 0x400 / 0x2000 | DROPPED_IMU / DROPPED_CAM | dropped sensor samples — check system load | | 0x800 | BAD_CAM_CAL | intrinsic calibration questionable — recalibrate | | 0x1000 | LOW_FEATURES | not enough good features to initialize | | 0x8000 | BAD_TIMESTAMP | sensor timestamps inconsistent | | 0x10000 / 0x20000 | IMU_MISSING / CAM_MISSING | sensor pipe disconnected — is the server running? | | 0x40000 / 0x80000 | CAM_BAD_RES / CAM_BAD_FORMAT | camera resolution/format not supported by the VIO config | | 0x200000 | STALLED | frame processing stalled | Both servers auto-reset on serious estimator errors (configurable via the `en_auto_reset` and `auto_reset_*` fields in their config files); transient transport warnings like dropped frames do not trigger resets. ## Debugging Tools ![VIO tab in voxl-portal](/images/voxl-sdk/voxl-portal/voxl-portal-vio-view.png) * The VIO tab in [voxl-portal](/voxl-portal/) shows the live trajectory and feature points. * With voxl-qvio-server, the qvio_overlay camera stream draws tracked features over the tracking image, plus quality, position, feature count, and decoded error codes. * [voxl-open-vins-server](/voxl-open-vins-server/) does not publish an overlay stream (its pipes are ov, ov_extended, and ov_status) — use the VIO tab's plot, optionally with the raw tracking feed alongside. * Command-line: [voxl-inspect-qvio](/voxl-inspect-qvio/) for QVIO, `voxl-inspect-vins` for Open-VINS, and [voxl-inspect-vio](/voxl-inspect-vio/) for the gravity-aligned output voxl-vision-hub sends to PX4. * Run the servers in the foreground for verbose output: `voxl-qvio-server -d` (also `-p` position prints, timing flags `-i/-t/-u`), `voxl-open-vins-server -d`. * Check MAVLink actually flowing with [voxl-inspect-mavlink](/voxl-inspect-mavlink/) on `mavlink_onboard`, and PX4's view with `px4-listener vehicle_odometry`. * [AprilTag relocalization](/voxl-vision-hub-apriltag-relocalization/) can remove accumulated drift in mapped environments. ## Logging VIO Data Use the following to log VIO data for offline analysis: ```bash voxl-logger --preset_odometry ``` For Open-VINS, `voxl-logger -b -v ov` captures a replayable log for offline evaluation with `voxl-evaluate-vins`. ## "VOXL rebooting PX4" If voxl-vision-hub reports "VOXL rebooting PX4", this is likely due to poor camera calibration. Follow the instructions [here](/calibrate-cameras/) to calibrate the tracking sensor. # ArduPilot VIO Support for ArduPilot is progressing! Here is the ArduPilot pull request for VOXL-compatible Visual Inertial Odometry support [Github](https://github.com/ArduPilot/ardupilot/pull/19563) --- Source: https://docs.modalai.com/voxl-open-vins-server/ # VOXL Open-VINS Server `voxl-open-vins-server` is a multi-camera visual-inertial odometry (VIO) service for the VOXL 2 platform. It uses an MSCKF-based estimator derived from [OpenVINS](https://docs.openvins.com/) to fuse data from up to 3 cameras and an IMU, producing real-time pose and velocity estimates that are forwarded to the autopilot as odometry data. Cameras may be hardware-synchronized **or fully unsynchronized**, global-shutter **or rolling-shutter** (including mixed rigs such as a rolling-shutter hires camera paired with a global-shutter tracking camera) — see [Asynchronous & Mixed-Shutter Cameras](/voxl-open-vins-async/). Initialization and recovery run a deterministic on-board SfM pipeline — see [Initialization & Resets](/voxl-open-vins-init/). The server is built around three modular subsystems: **VoxlCore** (configuration, housekeeping, publishing), **VoxlCam** (camera management and feature tracking via OpenCL), and **VoxlIMU** (IMU data acquisition and frame transformation). Data flows through ModalAI's **MPA pipe architecture**, which decouples sensor producers from VIO consumers and downstream clients. # Table of contents 1. TOC --- ## Architecture ### System Overview ![Architecture Diagram](/images/voxl-sdk/voxl-open-vins-server/architecture_diagram.png) The server follows an IMU-driven pattern: camera frames are staged lock-free as they arrive, and each IMU batch advances the filter and releases whatever frames are ready. 1. **IMU data** arrives via MPA pipe and is handled by `VoxlIMU` on an RT-priority thread. The `FrameTransform` module detects gravity direction and jerk events for initialization gating. 2. **Camera frames** arrive through per-camera MPA pipes. `CameraManager` dispatches frames to `MonoCamera` or `StereoCamera` instances (based on configuration), which push them **directly into the estimator's lock-free per-camera ingest** — there is no fusion thread and no frame pairing; camera callbacks never block. 3. Each IMU callback feeds the batch to the **OpenVINS VioManager**, which releases staged camera frames in global timestamp order (each frame only once inertial data covers it) and runs tracking plus the MSCKF update per released frame. Synchronized rigs produce same-timestamp frames that are bundled automatically; unsynchronized rigs flow through [epoch-anchored cloning](/voxl-open-vins-async/). 4. **Publisher** formats the resulting state (pose, velocity, quality, error codes) with coordinate frame transformation (OpenVINS → FRD) and writes to output pipes — on the same VIO thread, immediately after each update. 5. **HealthCheck** runs at 30 Hz, monitoring connectivity, triaging error codes by severity, and driving auto-reset. ### Data Flow ![Data Flow](/images/voxl-sdk/voxl-open-vins-server/data_flow_diagram.png) *Per-sample data flow: camera callbacks stage frames into lock-free per-camera rings; each `_imu_data_handler_cb` invocation feeds the IMU batch to the VioManager, which releases staged frames in global timestamp order, runs the MSCKF update, and publishes through `Publisher::publish()` on the same thread. Dropped frames (late, ring-full, bogus timestamp) are returned to their owner exactly once and are counted, never fatal.* ### Module Dependencies | Module | Key Classes | Responsibility | |---|---|---| | **VoxlCore** | `Publisher`, `HealthCheck`, `VoxlConfigure` | Main loop, configuration, publishing, quality metric, health monitoring | | **VoxlCam** | `CameraManager`, `CameraBase`, `MonoCamera`, `StereoCamera` | Camera pipe subscription, image preprocessing, direct push into the estimator ingest | | **VoxlIMU** | `FrameTransform`, `_imu_data_handler_cb` | IMU pipe subscription, frame transformation, jerk detection | | **ov_msckf** (library) | `VioManager`, `AsyncCameraBuffer`, `State`, updaters | Lock-free ingest, epoch-anchored MSCKF estimation, per-camera temporal/rolling-shutter states | | **ov_init** (library) | `DynamicInitializer`, `zbft_sfm` solver | Ceres-free SfM initialization, any-attitude init/reset, warm start | ### Camera Class Hierarchy ![Camera Hierarchy](/images/voxl-sdk/voxl-open-vins-server/camera_class_hierarchy.png) `CameraBase` is the abstract base class. `MonoCamera` handles single-camera pipes, `StereoCamera` handles stereo pairs. Both push frames directly into the estimator's lock-free per-camera ingest from the pipe callback — no intermediate fusion queue. ### Initialization Flow ![Init Flow](/images/voxl-sdk/voxl-open-vins-server/main_init_flow.png) *`main()` call graph: reads config, syncs camera calibration, starts Publisher (which starts HealthCheck), then enters the event loop.* --- ## Prerequisites - **VOXL 2** or **QCS6490-based** hardware - **VOXL SDK 1.4.0** or later - All tracking cameras calibrated (intrinsics files present in `/data/modalai/`) - Extrinsics configured in `/etc/modalai/extrinsics.conf` (see [Configure Extrinsics](/configure-extrinsics/)) - Camera feeds verified in voxl-portal before enabling VIO --- ## Installation and Setup ### Install If you are working on a non-development drone, back up configuration and intrinsic files first: ``` /etc/modalai /data/modalai ``` ### Disable qvio Only one VIO source should be active at a time. Disable `qvio` before starting `voxl-open-vins-server`: ```bash voxl-configure-qvio disable ``` ### Generate Configuration Run the configuration tool to create all necessary config files: ```bash voxl-configure-open-vins ``` Available configurations: | Argument | Rig | Cameras | |---|---|---| | `starling2_2cam` | Starling 2 | front + down tracking (unsynchronized ingest) | | `fpv` | VOXL 2 FPV | duo AR0144 tracking, hardware-synchronized | | `fpvhires` | VOXL 2 FPV, hires VIO | IMX664 hires (rolling shutter, 60 fps) + AR0144 tracking (global shutter, 30 fps), **unsynchronized** — see [Async & Mixed-Shutter Cameras](/voxl-open-vins-async/) | | `d8v4` | D0008 v4 | stereo OV9782, synchronized | | `d8v6` | D0008 v6 | dual AR0144 | | `factory_enable` | generic | default config for synced AR0144 cameras | For example, `voxl-configure-open-vins starling2_2cam` configures a two-camera setup using front and down tracking cameras. The result should be in agreement with the three configuration files in `/etc/modalai/`: - `voxl-open-vins-server.conf` - `vio_cams.conf` - `extrinsics.conf` (if not already present) ### Start the Service ```bash systemctl restart voxl-open-vins-server ``` --- ## Configuration Files Three files in `/etc/modalai/` control the server: ### extrinsics.conf Defines the geometric relationship between sensors (cameras, IMU) and the body frame. See the [extrinsics configuration page](/configure-extrinsics/) for details. When `imu_body_frame_mode` is enabled (default), the server also reads the `body -> imu_apps` extrinsic to transform VIO output into the body frame. For cross-platform compatibility OVins-server has been disable for IMU non-body frames. ### vio_cams.conf Defines which camera pipes to subscribe to and how each camera participates in VIO. Example for a two-camera setup: ```json { "cams": [{ "enable": true, "name": "tracking_front", "pipe_for_preview": "tracking_front", "pipe_for_tracking": "tracking_front", "is_occluded_on_ground": false, "imu": "imu_apps", "cal_file": "opencv_tracking_front_intrinsics.yml" },{ "enable": true, "name": "tracking_down", "pipe_for_preview": "tracking_down", "pipe_for_tracking": "tracking_down", "is_occluded_on_ground": true, "imu": "imu_apps", "cal_file": "opencv_tracking_down_intrinsics.yml" },{ "enable": false, "name": "tracking_rear", "pipe_for_preview": "tracking_rear", "pipe_for_tracking": "tracking_rear", "is_occluded_on_ground": false, "imu": "imu_apps", "cal_file": "opencv_tracking_rear_intrinsics.yml" }] } ``` | Field | Description | |---|---| | `enable` | Whether this camera is active in the VIO pipeline | | `name` | Camera identifier used in logs and overlays | | `pipe_for_tracking` | MPA pipe name to subscribe to for feature tracking frames. Can differ from the preview pipe (e.g. `tracking_front_misp_norm` or `tracking_front_misp_grey`) depending on which image processing yields the best features for your application | | `pipe_for_preview` | MPA pipe name used for overlay visualization | | `is_occluded_on_ground` | If `true`, this camera's view is obstructed while landed (e.g. a downward camera on the ground). The server will not use features from this camera until the drone reaches `takeoff_alt_threshold` altitude | | `imu` | IMU pipe name. All cameras must reference the same IMU | | `cal_file` | OpenCV intrinsics calibration file in `/data/modalai/` | To enable a third camera, set its `enable` field to `true`. ### voxl-open-vins-server.conf Main server configuration file. The server creates this file with default values if it does not exist. All parameters are read by `read_server_config()` in `VoxlConfigure.cpp`. #### Auto-Reset Parameters | Parameter | Type | Default | Description | |---|---|---|---| | `en_auto_reset` | bool | `true` | Enable automatic VIO reset when divergence or low feature count is detected | | `auto_reset_max_velocity` | float | `20.0` | Velocity magnitude threshold (m/s) above which the system considers the estimate divergent | | `auto_reset_max_v_cov_timeout_s` | float | `0.5` | Duration (s) that quality must remain below threshold before an auto-reset is recommended | | `auto_reset_min_features` | int | `1` | Minimum number of tracked features required to avoid a reset | | `auto_reset_min_feature_timeout_s` | float | `10.0` | Duration (s) that the feature count must stay below the minimum before triggering a reset | #### State Machine and Spin Monitoring | Parameter | Type | Default | Description | |---|---|---|---| | `ok_state_grace_timeout_s` | float | `2.0` | Grace period (s) after entering OK state during which quality is held low to avoid false confidence from bad initialization | | `fast_yaw_thresh` | float | `5.0` | Yaw rate (rad/s) above which spinning-in-place detection engages | | `fast_yaw_timeout_s` | float | `1.75` | Duration (s) of sustained spinning-in-place before an auto-reset is recommended | #### OpenVINS and Camera Mode | Parameter | Type | Default | Description | |---|---|---|---| | `yaml_folder` | string | `/usr/share/modalai/voxl-open-vins/VoxlConfig/starling2` | Path to the folder containing OpenVINS YAML configuration files (`estimator_config.yaml`, `kalibr_imucam_chain.yaml`) | | `using_stereo` | int | `0` | Set to `1` to enable stereo camera mode | | `stereo_z_min` | float | `0.10` | Minimum depth (m) accepted by the stereo matcher | | `stereo_z_max` | float | `100.0` | Maximum depth (m) accepted by the stereo matcher | | `sync_config` | bool | `true` | Calibration synchronization at startup — this flag does **not** affect frame ingest or timing. `true`: the server regenerates the OpenVINS YAMLs from system calibration — camera intrinsics/distortion are refreshed from `/data/modalai`, the cam-to-cam extrinsic is composed from the per-camera `cam → imu` extrinsics, and the estimator/camchain YAMLs are rewritten. `false`: the calibration files shipped in `yaml_folder` are authoritative and are never overwritten (e.g. `starling2_2cam`) | #### Takeoff and Occlusion | Parameter | Type | Default | Description | |---|---|---|---| | `takeoff_alt_threshold` | float | `0.5` | Altitude (m) above which cameras marked `is_occluded_on_ground` become active | | `takeoff_occlude_stereo_left` | bool | `false` | Occlude the stereo left camera during takeoff | | `takeoff_occlude_stereo_right` | bool | `false` | Occlude the stereo right camera during takeoff | #### Frame Settings | Parameter | Type | Default | Description | |---|---|---|---| | `imu_body_frame_mode` | bool | `true` | When enabled, the server reads the `body -> imu` extrinsic and outputs VIO in the body frame. The IMU pipe is subscribed as `imu_apps_body` instead of `imu_apps` | | `imu_init_max_gravity_angle_deg` | float | `-1.0` | Level-start gate for IMU initialization, in degrees: if set `>= 0`, IMU data is held back from the estimator until the measured gravity angle is within this many degrees of level. The default `-1.0` disables the gate so (re)initialization can happen at any attitude | #### Quality Hysteresis The server uses a state machine with hysteresis to classify VIO quality: **INITIAL**, **GOOD**, and **BAD**. The thresholds and transition counts below control state transitions. | Parameter | Type | Default | Description | |---|---|---|---| | `quality_low_thresh_initial` | int | `15` | Quality score threshold below which degradation is detected in INITIAL state | | `quality_low_thresh_good` | int | `14` | Quality score threshold below which degradation is detected in GOOD state | | `quality_high_thresh` | int | `35` | Quality score threshold above which recovery is detected (used for INITIAL->GOOD and BAD->GOOD transitions) | | `quality_initial_to_bad_count` | int | `20` | Consecutive low-quality samples required to transition from INITIAL to BAD | | `quality_initial_to_good_count` | int | `50` | Consecutive high-quality samples required to transition from INITIAL to GOOD | | `quality_bad_to_good_count` | int | `60` | Consecutive high-quality samples required to transition from BAD to GOOD | | `quality_good_to_bad_count` | int | `45` | Consecutive low-quality samples required to transition from GOOD to BAD | --- ## MPA Pipes ![MPA pipe map](/images/voxl-sdk/voxl-open-vins-server/pipe_map.svg) The tables below summarize the interface; the complete communications reference — packet fields, states, quality semantics, and the full error-code table with severities — is on the dedicated [Pipe Interface](/voxl-open-vins-pipes/) page. ### Output Pipes | Pipe | Type | Description | |---|---|---| | `ov_extended` | `ext_vio_data_t` | Full VIO state including covariance matrices, feature counts, quality, and error codes | | `ov` | `vio_data_t` | Simplified VIO data with pose and velocity for basic consumers | | `ov_status` | `ov_status_t` | System status, health information, and operational state | ### Publisher Pipeline ![Publisher Pipeline](/images/voxl-sdk/voxl-open-vins-server/publisher_pipeline.png) *`Publisher::publish()` call graph: calculates quality score, computes angular velocity via dirty quaternion differentiation, applies OpenVINS→FRD coordinate transform, and checks auto-reset conditions before writing to output pipes.* ### Input Pipes | Pipe | Source | Description | |---|---|---| | `imu_apps` (or `imu_apps_body`) | `voxl-imu-server` | IMU data (accelerometer and gyroscope). The `_body` variant is used when `imu_body_frame_mode` is enabled | | Camera pipes (dynamic) | `voxl-camera-server` | One pipe per camera defined in `vio_cams.conf` (e.g. `tracking_front`, `tracking_down`) | ### Control Pipe The server exposes a control pipe at `/run/mpa/ov/control` that accepts the following commands: | Command | Description | |---|---| | `RESET_VIO_SOFT` | Soft reset: reinitializes the VIO state without recreating the VioManager | | `RESET_VIO_HARD` | Hard reset: destroys and recreates the VioManager from scratch | Control pipes are available on both the `ov_extended` and `ov` server channels. --- ## Command-Line Options ``` Usage: voxl-open-vins-server [OPTIONS] Options: -d, --debug Enable debug output and detailed logging -v, --verbose Enable verbose output and status information -c, --config Configuration only mode (load and validate config, then exit) -i, --imu-body Enable IMU body measurements (overrides conf file) -h, --help Display help message ``` Examples: ```bash voxl-open-vins-server # Run with default settings voxl-open-vins-server -d # Run with debug output voxl-open-vins-server -v -c # Validate configuration only voxl-open-vins-server --imu-body # Force IMU body frame mode ``` --- ## Client Tools ### voxl-reset-vins Sends a reset command to the running server through the control pipe. ```bash voxl-reset-vins # Send a hard reset voxl-reset-vins -s # Send a soft reset ``` ### voxl-inspect-vins Real-time terminal display of VIO data from the `ov` pipe. Shows position, rotation, velocity, features, quality, state, and error codes. ```bash voxl-inspect-vins # Default view (position, rotation, features, quality, state, errors) voxl-inspect-vins -v # Include velocity voxl-inspect-vins -b # Display values in body frame (reads body->imu extrinsic) voxl-inspect-vins -z # Print all fields voxl-inspect-vins -n # Print each sample on a new line (useful for logging) ``` | Flag | Description | |---|---| | `-a` | Print IMU angular velocity | | `-b` | Print values in body frame | | `-g` | Print gravity vector | | `-m` | Print camera-to-IMU extrinsics | | `-n` | Print each sample on a new line | | `-t` | Print timestamp in nanoseconds | | `-v` | Print velocity | | `-z` | Print all fields | ### voxl-benchmark-vio Utility for benchmarking VIO performance on VOXL. `voxl-benchmark-vio` orchestrates repeatable, automated replay-based benchmarking of `voxl-open-vins-server` (or `voxl-open-sqrtvins2-server`) over one or more recorded logs. Given an input definition JSON, for each listed log it stages the appropriate camera/VIO config, spawns the VIO server alongside an analyzer that listens to its outputs, and runs `voxl-replay` to feed the log data through the pipeline. Per-run metrics (pose, CPU usage, etc.) are written to per-log JSONs and merged into a single summary JSON. Typical use cases: - Comparing the impact of a config change (e.g. GPU vs CPU tracking, OpenVINS vs SqrtVINS) across a fixed set of logs. - Regression-testing VIO accuracy and CPU cost across SDK releases. - Monte-Carlo runs of the same suite to measure run-to-run variance. For full details on the input JSON schema, expected log layout, CLI flags, and output format, see the dedicated page: [**voxl-benchmark-vio →**](/voxl-benchmark-vio/) --- ## Testing ### Hand Testing Hand testing verifies that extrinsics are correct and the VIO pipeline is functioning before flight. This is the recommended starting point. #### Steps 1. SSH or ADB shell into the VOXL 2. 2. Make sure `voxl-camera-server` is running (it provides the camera pipes that VIO subscribes to), then start the VIO service: ```bash systemctl status voxl-camera-server # confirm it is active/running systemctl restart voxl-open-vins-server ``` 3. Open voxl-portal and navigate to the **VIO** tab. Optionally toggle **Raw Feed: ON** to confirm the tracking camera feed(s) currently being consumed by VIO are live. ![vio_tab_raw_feed.png](/images/voxl-sdk/voxl-open-vins-server/vio_tab_raw_feed.png) 4. Lift the drone with a small jerk motion (simulating takeoff). Features should start populating on the overlay. Then perform translational motion — move the drone left-right and front-back — and watch the XYZ position values update in the VIO tab. ![vio_tab_features.png](/images/voxl-sdk/voxl-open-vins-server/vio_tab_features.png) 5. Check roll, pitch, and yaw by selecting `ov_extended` or `vvhub_wrt_local` in the **VIO** tab. 6. Move the drone around in 3D space, verifying distance readings are accurate. Position and orientation can also be viewed directly in the terminal with `voxl-inspect-vins`: ``` voxl2:/$ voxl-inspect-vins dt(ms) | T_imu_wrt_vio (m) |Roll Pitch Yaw (deg)|features|quality| state| error_codes 33.3 | 0.05 -0.03 0.12| 4.1 -2.6 0.6| 45 | 95% | OKAY | ``` 7. Verify in QGroundControl that the drone shows "Ready to Fly" in Position mode. ![QGC_image.png](/images/voxl-sdk/voxl-open-vins-server/QGC_Image.png) 8. If tracking looks correct, proceed to flight testing. If not, double-check your `extrinsics.conf`. You can isolate cameras by disabling them one at a time in `vio_cams.conf`. ### Flight Testing **You must complete hand testing before flight to avoid fly-aways from bad extrinsics or incorrect parameters.** 1. SSH or ADB shell into the VOXL 2. 2. Start the service: ```bash systemctl restart voxl-open-vins-server ``` 3. Open QGroundControl and connect to the VOXL 2. 4. Verify QGC shows "Ready to Fly". 5. Ensure the drone is in **Position** flight mode and begin flying. 6. Test roll, pitch, yaw maneuvers and hover in place for several seconds to verify tracking stability. 7. If everything is stable, continue normal flight operations with OpenVINS. --- ## Troubleshooting For general service debugging — logs, restarts, running in the foreground — see [Debugging Services](/debugging-services/). ### No config file If `voxl-open-vins-server.conf` does not exist, run: ```bash voxl-configure-open-vins ``` ### Server fails to start - Check that `voxl-camera-server` and `voxl-imu-server` are running and providing data. - Verify camera intrinsics files exist in `/data/modalai/`. - Verify extrinsics are configured: `cat /etc/modalai/extrinsics.conf`. - Check the journal for error details: `journalctl -u voxl-open-vins-server -n 50`. ### VIO quality is poor or resets frequently - Increase `auto_reset_min_feature_timeout_s` to allow more time before feature-count resets. - Verify cameras have clear field of view with sufficient texture. - Check for vibration issues. Excessive IMU vibration degrades the estimator. - If using occluded cameras, verify `takeoff_alt_threshold` matches your takeoff environment. - Tune quality hysteresis thresholds if transitions between GOOD and BAD are too sensitive. ### IMU body frame errors If you see `Failed to fetch body->imu_apps extrinsic`, add the `body -> imu_apps` relationship to your `extrinsics.conf`. --- ## Legacy Parameter Notes The following parameters from older versions of `voxl-open-vins-server.conf` have been removed. They are either handled internally, moved to OpenVINS YAML configs, or no longer applicable: | Removed Parameter | Notes | |---|---| | `en_vio_always_on` | VIO now initializes via jerk detection and does not require arming. No longer needed | | `en_ext_feature_tracker` | External feature tracker support removed; tracking is handled internally via OpenCL | | `en_gpu_for_tracking` | GPU/DSP tracking replaced by OpenCL-based tracking in all configurations | | `histogram_method` | Handled automatically based on detected camera sensor | | `use_mask` | Masking configuration moved to OpenVINS YAML configs | | `en_force_init` | Initialization is now handled by the jerk detection system in `FrameTransform` | | `max_slam_features` | Moved to OpenVINS `estimator_config.yaml` | | `max_slam_in_update` | Moved to OpenVINS `estimator_config.yaml` | | `max_msckf_in_update` | Moved to OpenVINS `estimator_config.yaml` | | `en_force_ned_2_flu` | Replaced by `imu_body_frame_mode` and extrinsic-based frame transformation | | `takeoff_cam` | Takeoff camera is now automatically determined from `is_occluded_on_ground` in `vio_cams.conf` | | `takeoff_threshold` | Renamed to `takeoff_alt_threshold` | | `auto_reset_max_v_cov`, `auto_reset_max_v_cov_instant` | Removed. Velocity-uncertainty auto-reset is driven by the sustained-quality timeout (`auto_reset_max_v_cov_timeout_s`); the instantaneous check depended on an arming signal that was never wired | | `auto_fallback_timeout_s`, `auto_fallback_min_v` | Removed. Fallback-mode logic was never implemented; the parameters had no effect | | `en_cont_yaw_checks` | Removed. Spinning-in-place detection is always on, tuned by `fast_yaw_thresh` / `fast_yaw_timeout_s` | | `fusion_rate_dt_ms` | Removed. There is no fusion loop anymore — cameras feed the estimator's lock-free ingest directly and publishing follows each estimator update | --- ## API Reference For detailed C++ API documentation including class hierarchies, call graphs, and source code reference, see the [Doxygen API Documentation](/api/open-vins-server/). --- Source: https://docs.modalai.com/voxl-open-vins-pipes/ # Pipe Interface `voxl-open-vins-server` communicates exclusively through ModalAI's [MPA pipe architecture](/mpa/): sensors stream in through client pipes, estimates stream out through server pipes, and a control pipe accepts runtime commands. This page is the complete communications reference — what each pipe carries, when it publishes, and how to interpret states, quality, and error codes. --- ## The pipe map ![MPA pipe map](/images/voxl-sdk/voxl-open-vins-server/pipe_map.svg) Publishing happens **on the VIO thread, immediately after every estimator update** — there is no separate publish timer. The output rate therefore tracks the camera update rate (e.g. ~60 Hz on a rig whose reference camera runs 60 fps), with IMU-rate pose propagation available to consumers that extrapolate between updates. --- ## Input pipes | Pipe | Source | Contents | |---|---|---| | `imu_apps_body` | `voxl-imu-server` | Calibrated IMU samples (~1 kHz), already rotated into the body frame. Used when `imu_body_frame_mode` is enabled (default) | | `imu_apps` | `voxl-imu-server` | Raw-orientation IMU pipe, used when `imu_body_frame_mode` is disabled | | camera pipes | `voxl-camera-server` | One image pipe per camera enabled in `vio_cams.conf` (e.g. `tracking_front`, `tracking_down`, `hires_misp_grey`). Cameras may be synchronized or fully unsynchronized — see [Asynchronous & Mixed-Shutter Cameras](/voxl-open-vins-async/) | > All cameras must reference the **same IMU** in `vio_cams.conf`. The IMU clock is the common > timebase against which every camera's time offset is estimated. Camera frames are pushed into the estimator's **lock-free per-camera ingest** directly from the camera pipe callbacks — nothing blocks a camera thread, and a stalled camera cannot stall the pipeline. The IMU callback drives estimation: each IMU batch advances the filter and releases any camera frames whose global time order is now decided. --- ## Output pipes ### `/run/mpa/ov` — primary VIO output Publishes `vio_data_t` (defined in `pipe_interfaces/vio_data_t.h`), the packet consumed by `voxl-px4` for position control: | Field group | Meaning | |---|---| | `timestamp_ns` | Timestamp of the state estimate (monotonic clock, nanoseconds) | | `T_imu_wrt_vio`, `R_imu_to_vio` | Position and rotation of the IMU/body frame with respect to VIO local frame (FRD conventions) | | `vel_imu_wrt_vio` | Velocity in the VIO frame | | `imu_angular_vel` | Body-rate estimate (from quaternion differentiation of consecutive states) | | `quality` | Estimation quality score — see [Quality](#quality) below | | `state` | `VIO_STATE_INITIALIZING`, `VIO_STATE_OK`, or `VIO_STATE_FAILED` | | `error_code` | Bitmask of active error codes — see [Error codes](#error-codes) | | `n_feature_points` | Number of SLAM landmarks currently in the state vector | ### `/run/mpa/ov_extended` — extended output Publishes `ext_vio_data_t`: everything in `vio_data_t` plus pose/velocity covariance diagonals, gyro/accel bias estimates, camera extrinsics in use, and the list of currently tracked feature locations (consumed by `voxl-portal` for the VIO overlay). Only written when at least one client is connected, so it costs nothing in normal flight. ### `/run/mpa/ov_status` — health and diagnostics Publishes `ov_status_t` at the health-check cadence: hysteresis state, counters, and operational diagnostics for logging and fleet monitoring (`voxl-log-vins` consumes this alongside `ov`). --- ## Control pipe The server listens on `/run/mpa/ov/control` (also reachable through the `ov_extended` channel): | Command | Effect | |---|---| | `RESET_VIO_SOFT` | **Warm reset.** Rebuilds the filter state while preserving feature tracks, IMU history, calibration values, and the live gyro/accel bias estimates (carried into re-initialization as priors). Recovers in seconds, in motion, at any attitude | | `RESET_VIO_HARD` | **Cold reset.** Destroys and recreates the whole estimator; all queued frames are released safely and every error code is cleared. Re-initializes from scratch | ```bash voxl-reset-vins # hard reset voxl-reset-vins -s # soft reset ``` See [Initialization & Resets](/voxl-open-vins-init/) for what each reset preserves and when the server triggers them autonomously. --- ## States | State | Meaning | |---|---| | `VIO_STATE_INITIALIZING` | Waiting for motion/gravity gates, or actively initializing (static or dynamic). Also reported during a reset and re-initialization. Quality is capped low in this state so a freshly built covariance cannot masquerade as confidence | | `VIO_STATE_OK` | Estimator initialized and updating normally | | `VIO_STATE_FAILED` | Auto-reset conditions met — the estimate should not be trusted; a reset is in progress or imminent | ## Quality `quality` is a 0–100 score computed from the tracked-feature population: per-camera image coverage (a 5×5 occupancy grid), SLAM landmark uncertainty, and MSCKF track quality, pooled over a short window so that asynchronous per-camera updates score exactly like synchronized batch updates. The published value is smoothed with a short time constant; `-1` means failed, `0` means resetting. A hysteresis state machine (INITIAL → GOOD/BAD) sits on top of the raw score to prevent rapid quality flapping; its thresholds are configurable in `voxl-open-vins-server.conf` (see the [main page](/voxl-open-vins-server/#configuration-files)). The full design and the exact formulas — the windowed feature union, per-camera grid scoring, and the published-value EMA — are documented on the async page: [Estimation quality on asynchronous rigs](/voxl-open-vins-async/#estimation-quality-on-asynchronous-rigs) and [Appendix A.5](/voxl-open-vins-async/#a5-quality-metric). --- ## Error codes `error_code` is a bitmask; multiple codes can be active simultaneously. The health monitor (30 Hz) classifies codes into two severities: > **Only estimator-health codes can trigger an automatic reset.** Transport hiccups — a dropped > frame or IMU sample — are expected events on a busy system (the asynchronous ingest disposes > frames deliberately for ordering and staleness) and must never take down a healthy filter. > Warning-class codes self-clear after 10 s without a new occurrence. | Code | Class | Meaning | |---|---|---| | `ERROR_CODE_COVARIANCE` | auto-reset | Covariance no longer positive definite — filter is corrupt | | `ERROR_CODE_IMU_OOB` | auto-reset | IMU measurement exceeded sensor range | | `ERROR_CODE_IMU_BW` | auto-reset | IMU bandwidth/rate too low to propagate safely | | `ERROR_CODE_NOT_STATIONARY` | auto-reset | Estimation quality below threshold for too long (bit name is historical) | | `ERROR_CODE_NO_FEATURES` | auto-reset | No usable features for an extended period | | `ERROR_CODE_CONSTRAINT` | auto-reset | Insufficient geometric constraints from current features | | `ERROR_CODE_FEATURE_ADD` | auto-reset | Failed to add new features to the map | | `ERROR_CODE_VEL_INST_CERT` / `ERROR_CODE_VEL_WINDOW_CERT` | auto-reset | Velocity estimate uncertainty exceeded bounds | | `ERROR_CODE_DROPPED_CAM` | warning | A camera frame was dropped (ring full, stale, or out of order) | | `ERROR_CODE_DROPPED_IMU` | warning | IMU samples dropped | | `ERROR_CODE_DROPPED_GPS_VEL` | warning | A GPS velocity sample was dropped | | `ERROR_CODE_BAD_TIMESTAMP` | warning | A sensor timestamp regressed or jumped | | `ERROR_CODE_LOW_FEATURES` | warning | Not enough good features to (re)initialize yet | | `ERROR_CODE_BAD_CAM_CAL` | warning | Camera intrinsic calibration looks questionable | | `ERROR_CODE_STALLED` | warning | Frame processing stalled | | `ERROR_CODE_UNKNOWN` | warning | Unclassified estimator error | | `ERROR_CODE_CAM_MISSING` / `ERROR_CODE_IMU_MISSING` | reconnect | Sensor pipe not delivering — handled by reconnect logic, not by reset | | `ERROR_CODE_CAM_BAD_RES` / `ERROR_CODE_CAM_BAD_FORMAT` | config | Camera stream resolution/format unsupported — fix the camera configuration | --- ## Frame conventions Internally the estimator runs in the OpenVINS world frame (gravity-aligned, z-up). The publisher transforms every output into ModalAI's **FRD (front-right-down)** local frame convention before writing to the pipes, using the `body → imu` extrinsic from `/etc/modalai/extrinsics.conf` when `imu_body_frame_mode` is enabled. Heading is re-zeroed at every (re)initialization: the local frame's x-axis is the vehicle's heading at init, which is what position controllers expect. --- ## Client tools | Tool | Purpose | |---|---| | `voxl-inspect-vins` | Live terminal view of the `ov` stream (`-v` velocity, `-b` body frame, `-z` everything) | | `voxl-log-vins` | CSV logging of VIO output and features for offline analysis | | `voxl-reset-vins` | Sends `RESET_VIO_HARD` / `RESET_VIO_SOFT` (`-s`) on the control pipe | | `voxl-benchmark-vio` | Replay-based benchmarking harness — see [voxl-benchmark-vio](/voxl-benchmark-vio/) | --- Source: https://docs.modalai.com/voxl-open-vins-async/ # Asynchronous & Mixed-Shutter Cameras Classical multi-camera VIO assumes hardware-synchronized cameras: every camera exposes at the same instant, so one filter clone serves all of them. `voxl-open-vins-server` removes that requirement. Cameras may free-run at **different rates with arbitrary phase**, and each camera may be **global- or rolling-shutter** — including rigs that mix a rolling-shutter hires sensor with a global-shutter tracking camera. Synchronized rigs run the identical code path, unchanged. This page explains the three mechanisms that make it work: the lock-free ingest, epoch-anchored cloning with the ACI² preintegration bridge, and the per-row rolling-shutter measurement model. --- ## Why unsynchronized cameras are hard Feeding unsynchronized cameras to a stock MSCKF filter fails in one of two ways: 1. **Snapping timestamps** (pretending frames are synchronized) injects a systematic timing error of up to half a frame period. At a focal length of 450 px and a rotation rate of 1 rad/s, a 7 ms phase error is a ~3 px *systematic* reprojection bias against a ~1 px noise model. The filter cannot tell timing error from calibration error, so it slowly corrupts its own calibration and bias estimates until it diverges. 2. **Cloning at every camera's frame time** fragments the filter's sliding window. With N cameras, each camera's feature tracks only span 1/N of the window, so tracks hit the marginalization horizon early, never reach the length that promotes them to SLAM landmarks, and triangulation loses its baseline. The estimator starves. The resolution is to keep **one clone timeline** — anchored to a single reference camera — and to attach every other camera's measurements to that timeline *exactly*, using the IMU itself. --- ## Lock-free asynchronous ingest ![Async data flow](/images/voxl-sdk/voxl-open-vins-server/data_flow_diagram.png) Every camera owns a lock-free single-producer/single-consumer ring inside the estimator. Camera pipe callbacks push frames and return immediately — no locks, no fusion thread, no pairing logic. The IMU callback (the single VIO thread) releases frames when three conditions hold: - **IMU coverage** — inertial data spans past the frame time (plus a small guard), so propagation never extrapolates; - **global order** — every other live camera has either delivered a frame at or beyond this time, or has been silent long enough (relative to its own measured frame period) that it cannot block; - **per-stream order** — frames that arrive out of order or too late are dropped, and every dropped frame is released back to its owner exactly once. A dead or throttled camera therefore adds bounded latency instead of stalling VIO, and a healthy rig holds all drop counters at zero. The staleness gate is self-tuning: each stream maintains an **exponentially-weighted moving average of its own frame period**, updated on every arrival (90/10 blend — see [Appendix A.4](#a4-ingest-ordering-and-the-period-ema)). The declared per-camera frame rate (`camN_fps`, below) seeds this EMA, so the ordering gates run at design width from the very first frame after boot and after every reset instead of converging over a warm-up window. --- ## Epoch-anchored cloning and the ACI² bridge ![Epoch binding timeline](/images/voxl-sdk/voxl-open-vins-server/epoch_binding_timeline.svg) With `epoch_mode` enabled, stochastic clones are created **only at the reference camera's frame times** — the *epochs*. When another camera's frame arrives at time `t_f`, its known offset from the preceding epoch, `δ = t_f − t_e` (non-negative, since frames are released in global time order), is bridged with an **ACI²-style closed-form preintegration** of the actual IMU samples spanning `[t_e, t_f]`: a relative rotation `ΔR` and position/velocity preintegrals `α, β` that express the camera pose at `t_f` exactly in terms of the epoch clone at `t_e`. Two properties make this a first-class filter update rather than an approximation: - **Exactness** — the bridge integrates real IMU data in closed form; there is no first-order "pose interpolation" error, no matter where in the frame interval the measurement falls. - **Analytic bias Jacobians** — the bridge carries `∂(ΔR, α, β)/∂(b_g, b_a)`, so camera residuals on bridged frames still correct the IMU biases through the bridge, preserving the estimator's observability structure and consistency (first-estimate Jacobians throughout). > **The reference camera must be the fastest camera.** A slower reference forces the faster > camera to deliver more than one frame per epoch; the extras fall back to private clones and the > window fragments — exactly the failure epoch mode exists to prevent. The server warns at boot > if the declared rates violate this. **Deferred marginalization.** An epoch's measurements arrive in installments — the reference frame first, bound frames up to one binding horizon later. The oldest clone is marginalized only when its epoch *completes*, so every camera's tracks span the full clone window and SLAM landmark promotion behaves exactly as on a synchronized rig. --- ## Rolling-shutter support ![Rolling shutter model](/images/voxl-sdk/voxl-open-vins-server/rolling_shutter_model.svg) A rolling-shutter sensor exposes row by row: a pixel on row `m` of `M` was imaged at ``` t(m) = t_frame + t_offset + t_readout · m/M ``` The estimator applies this **per measurement row**: each observation is transported to its true row time using the clone's angular and linear velocity. Two rules keep this safe: - **Value vs. estimation.** The readout *value* is always applied when nonzero. The readout is *estimated online* (`calib_cam_readout`) only for cameras explicitly declared `"rolling"` — a global-shutter camera's readout stays pinned at zero and never becomes a spurious estimated state. - **Degenerate-motion gating.** Temporal parameters (time offsets, readout) are only observable when the motion varies. Under hover or constant-velocity cruise the estimator freezes their estimation (values remain applied) rather than letting them drift on noise. > A **wrong readout value is worse than none.** The row-averaged part of a readout error is > indistinguishable from a camera time offset and will silently bias it, while the row-dependent > part corrupts calibration. Measure the readout of the streamed sensor mode (rows × line time) > rather than guessing from a datasheet; if you cannot measure it yet, declaring the camera > `rolling` with readout `0` runs the sensor deliberately unmodeled with a loud boot warning — > a legitimate bring-up state. --- ## Mixed-shutter rigs and the `fpvhires` configuration ![Mixed shutter rig](/images/voxl-sdk/voxl-open-vins-server/mixed_shutter_rig.svg) The mechanisms above compose: a rolling-shutter hires camera and a global-shutter tracking camera, at different rates, with no sync line, share one clone window and both contribute MSCKF and SLAM updates. That is the `fpvhires` configuration: ```bash voxl-configure-open-vins fpvhires ``` which points the server at the `/usr/share/modalai/voxl-open-vins/VoxlConfig/fpvhires` estimator configuration — IMX664 hires (rolling shutter, 60 fps, epoch reference) plus AR0144 tracking (global shutter, 30 fps) with `epoch_mode` enabled — and sets `sync_config: true`, so the OpenVINS calibration YAMLs are regenerated from your system calibration at every startup. (`sync_config` only controls this calibration synchronization; frame ingest is always the lock-free asynchronous path, and whether frames share timestamps is a property of the rig, not a configuration switch.) > Because `fpvhires` synchronizes calibration from the system at startup, **your system > calibration must be complete and correct before enabling it**: > > 1. **Intrinsics** — both cameras calibrated, with their calibration files present in > `/data/modalai/` (see [Camera Calibration](/calibrate-cameras/)). > 2. **Extrinsics** — `/etc/modalai/extrinsics.conf` must contain the `body → imu` and > camera relationships for **both** the hires and the tracking camera (see > [Configure Extrinsics](/configure-extrinsics/)). > 3. **`/etc/modalai/vio_cams.conf`** — edit it so exactly these two cameras are enabled: > the hires camera's `pipe_for_tracking` (e.g. the hires grey/misp stream) and the > tracking camera's pipe, each with the correct `cal_file`, and both referencing the > **same** `imu`. > > With any of these missing or stale, the regenerated calibration will be wrong and the > estimator will misbehave in ways that look like tracking problems. The classic synchronized configurations (`fpv`, `starling2_2cam`, …) are untouched and keep running the synchronized path. ### Epoch-synced AR0144 tracking cameras Support for AR0144 tracking cameras whose frames carry epoch-synchronized timestamps is not in the released `voxl-open-vins-server` package. ModalAI's guidance (August 2026) is to update to the `master` branch of the [voxl-open-vins-server repository](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server), and for epoch-synced AR0144 tracking cameras to use the [`synced-timestamp` branch](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server/-/tree/synced-timestamp). Both require building the server from source on the target. --- ## Estimation quality on asynchronous rigs The published `quality` score (see the [Pipe Interface](/voxl-open-vins-pipes/#quality) page) needs special care on asynchronous rigs. Updates arrive **per camera** — the reference camera opens an update, the other camera's features join up to a binding horizon later — and MSCKF features only surface in an update when their tracks end. Scoring any *single* update therefore sees a sparse, noisy sample of tracking health: half the rig on reference ticks, nothing at all on zero-velocity ticks. (A synchronized rig never noticed, because every update carried both cameras at once.) The server solves this with a **windowed union + EMA** design: 1. **Pool** every update's used-feature list from the last 120 ms and de-duplicate by feature id — this reconstructs the full per-camera track set that a synchronized batch would have carried (and it is the horizon over which a dead camera's evidence naturally ages out); 2. **Score each camera** over the pooled set with the standard scorer — a 5×5 image-coverage grid combined with per-feature weights (SLAM landmarks by covariance and track quality, MSCKF tracks by quality and track length); 3. **Sum across cameras and clamp** to 100 — identical fusion to the synchronized path; 4. **Smooth** the published value with a 250 ms time-constant EMA: a single weak update moves the score by a couple of points, while a real tracking collapse still reaches the reset thresholds in about half a second. The quality state is invalidated on **every** reset (sensor time is continuous across resets, so smoothed values from the previous estimation episode can never pre-charge the new one), and the score is capped low during initialization so a freshly built covariance cannot report false confidence. Exact formulas in [Appendix A.5](#a5-quality-metric). --- ## Configuration reference All keys live in the selected `estimator_config.yaml`. Per-camera declarations tell the estimator what each physical camera *is*; they are validated at boot and the server fails fast on contradictions. ### Per-camera declarations | Key | Example | Meaning | |---|---|---| | `camN_shutter` | `"rolling"` / `"global"` | Authoritative shutter type. `global`: readout forced to 0, never estimated. `rolling`: rolling-shutter model active whenever the readout value is nonzero | | `camN_readout_time_s` | `0.0058` | Sensor readout time (first→last row, seconds) of the *streamed mode*. Overrides any `t_readout` in the kalibr chain. Must satisfy `t_readout ≤ 1/fps` | | `camN_fps` | `60.0` | Nominal rate of the streamed mode; `0` or absent means *undeclared* (no gate seeding, no readout bound). When positive: seeds the ingest ordering gates and the epoch binding horizon from the first frame; used to sanity-check the readout and the reference-camera choice | ### Asynchronous multi-camera keys | Key | Default | Meaning | |---|---|---| | `epoch_mode` | `false` | Enable epoch-anchored cloning. `false` preserves the classic synchronized behavior exactly | | `cam_imu_dt_ref_camid` | `0` | The reference (clock/epoch) camera — must be the fastest | | `epoch_bind_factor` | `1.2` | Binding horizon in reference frame periods: a frame binds to the preceding epoch when `0 ≤ t_f − t_e ≤` this many reference periods | | `epoch_bridge_bias_cols` | `true` | Analytic IMU-bias Jacobian columns on bridged measurements | | `async_ring_size` | `16` | Per-camera ingest ring capacity (frames) | | `async_guard` | `0.002` | IMU coverage guard (seconds) before a frame is released | | `async_stale_factor` | `1.5` | A camera silent longer than this multiple of its own frame period cannot block release ordering | ### Rolling-shutter / temporal calibration keys | Key | Default | Meaning | |---|---|---| | `calib_cam_timeoffset` | — | Estimate per-camera time offsets online (offsets are read per camera from the kalibr chain's `timeshift_cam_imu`) | | `calib_cam_readout` | `false` | Refine the readout online — declared-`rolling` cameras only | | `calib_cam_readout_init_sigma` | `0.001` | Initial 1-σ prior on an estimated readout (s). Use ~`0.005` when starting from a datasheet-grade guess | | `dt_calib_gate` | `false` | Opt-in freeze of time-offset/readout estimation under degenerate motion (values remain applied) | | `dt_calib_gate_min_omega` | `0.10` | Gate threshold: window peak angular rate (rad/s) | | `dt_calib_gate_min_vel_spread` | `0.10` | Gate threshold: window velocity spread (m/s) | > Runtime telemetry: with debug verbosity the estimator prints a per-update `[EPOCH]` line — > epochs snapped vs. fallbacks, plus ingest drop counters (late / ring-full / bogus). On a > well-configured rig **fallbacks and all drop counters stay at zero**; a climbing fallback > count almost always means the reference camera is not the fastest declared camera. --- ## Further reading The full mathematical specification — the bridge closed forms and bias Jacobian recursions, the rolling-shutter Jacobians, the measurement-noise analysis, and the consistency validation — lives with the source in `ov_msckf/README_ASYNC.md` in the [ModalAI OpenVINS fork](https://github.com/modalai/open_vins). Server-side integration is in the [voxl-open-vins-server repository](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-open-vins-server). --- ## Appendix — mathematical reference Notation follows [OpenVINS](https://docs.openvins.com/): JPL quaternions, with $${}^{I}_{G}R$$ the rotation taking a vector from the global frame into the IMU frame, $${}^{G}p_I, {}^{G}v_I$$ position and velocity, $$b_g, b_a$$ the gyro/accel biases, and $$\lfloor\cdot\rfloor$$ the skew operator. ### A.1 Time model and epoch binding A pixel on row $$m$$ of $$M$$, in a frame stamped $$t_{f,i}$$ by camera $$i$$ with time offset $$t_{d,i}$$ and readout $$t_{r,i}$$, was imaged at $$ t(m) \;=\; t_{f,i} + t_{d,i} + t_{r,i}\,\tfrac{m}{M} . $$ With epochs at the reference camera's frame times $$t_e$$, a frame's epoch residual and the binding rule are $$ \delta_i \;=\; \underbrace{\big(t_{f,i} - t_e\big)}_{\text{raw, stored}} \;+\; \Delta t_{d,i} , \qquad\text{bind} \iff 0 \le t_{f,i} - t_e \le \beta\, T_{\mathrm{ref}} , $$ with $$\beta$$ = `epoch_bind_factor` and $$T_{\mathrm{ref}}$$ the reference frame period. The ordered ingest release makes the raw residual non-negative, so binding is one-sided (a frame binds to the epoch that precedes it). The raw part is stored per (clone, camera); the calibration part $$\Delta t_{d,i} = t_{d,i} - t_{d,r}$$ is applied at update time, so the transport stays differentiable in the estimated time-offset states. One frame per (camera, epoch); a frame outside the horizon falls back to its own clone. ### A.2 ACI² preintegration bridge The bridge relates the IMU pose at the true imaging time $$t_f = t_e + \delta$$ to the epoch clone by integrating the actual IMU samples over $$[t_e, t_f]$$ into relative terms $$\Delta R, \alpha, \beta$$ (all expressed in the epoch frame): $$ {}^{I_f}_{G}R = \Delta R\; {}^{I_e}_{G}R, \qquad {}^{G}p_{I_f} = {}^{G}p_{I_e} + {}^{G}v_{I_e}\,\delta - \tfrac{1}{2}\,{}^{G}g\,\delta^{2} + {}^{I_e}_{G}R^{\top}\alpha, \qquad {}^{G}v_{I_f} = {}^{G}v_{I_e} - {}^{G}g\,\delta + {}^{I_e}_{G}R^{\top}\beta . $$ Per IMU step of length $$\Delta t$$ (bias-corrected midpoint signals $$\hat\omega, \hat a$$; step rotation $$R_{s} = \mathrm{Exp}(-\hat\omega\,\Delta t)$$; $$A = \Delta R^{\top}$$; $$\Xi_{1..4}$$ the ACI² closed-form integrals): $$ \alpha \leftarrow \alpha + \beta\,\Delta t + A\,\Xi_2\,\hat a, \qquad \beta \leftarrow \beta + A\,\Xi_1\,\hat a, \qquad \Delta R \leftarrow R_{s}\,\Delta R . $$ The bridge is built once at the bias linearization $$\bar b$$ and corrected to first order at update time via analytic bias Jacobians, transported per step as $$ J_{\alpha g} \leftarrow J_{\alpha g} + J_{\beta g}\,\Delta t + A\big(\Xi_4 + \lfloor \Xi_2\hat a\rfloor J_{\theta g}\big), \qquad J_{\alpha a} \leftarrow J_{\alpha a} + J_{\beta a}\,\Delta t - A\,\Xi_2 , $$ $$ J_{\beta g} \leftarrow J_{\beta g} + A\big(\Xi_3 + \lfloor \Xi_1\hat a\rfloor J_{\theta g}\big), \qquad J_{\beta a} \leftarrow J_{\beta a} - A\,\Xi_1 , \qquad J_{\theta g} \leftarrow R_{s}\, J_{\theta g} + J_r\big({+\hat\omega\,\Delta t}\big)\,\Delta t , $$ Note the **positive** argument of the right Jacobian in the $$J_{\theta g}$$ increment: the per-step contribution enters as $$R_{s}\, J_r(-\hat\omega\Delta t) = J_l(-\hat\omega\Delta t) = J_r(+\hat\omega\Delta t)$$ once transported through the step rotation — using $$J_r(-\hat\omega\Delta t)$$ here would be wrong by $$O(\|\hat\omega\|\Delta t)$$ per step. so that at update time, with $$\delta b = \hat b - \bar b$$: $$ \Delta R(\hat b) = \mathrm{Exp}\big(J_{\theta g}\,\delta b_g\big)\,\Delta R(\bar b), \qquad \alpha(\hat b) = \alpha + J_{\alpha g}\,\delta b_g + J_{\alpha a}\,\delta b_a, \qquad \beta(\hat b) = \beta + J_{\beta g}\,\delta b_g + J_{\beta a}\,\delta b_a . $$ These Jacobians become columns of the measurement matrix on $$b_g, b_a$$ (`epoch_bridge_bias_cols`), so bridged camera residuals correct the IMU biases; all linearization points follow the first-estimate-Jacobian convention. ### A.3 Rolling-shutter Jacobians For a measurement on row fraction $$u = m/M$$, the time transport beyond the clone is $$\Delta = \Delta t_{d,i} + t_{r,i}\, u$$, linearized with the clone kinematics. The readout columns are, on the observing clone $$I$$ and (for anchored representations) the anchor $$I_a$$: $$ \frac{\partial\, {}^{I}p_f}{\partial t_{r}} = -\Big( \big\lfloor {}^{I}\omega \big\rfloor\, {}^{I}p_f + {}^{I}_{G}R\; {}^{G}v_I \Big)\, u , \qquad \frac{\partial\, {}^{G}p_f}{\partial t_{r,a}} = \Big( {}^{I_a}_{G}R^{\top} \big\lfloor \omega_a \big\rfloor\, {}^{I_a}p_f + {}^{G}v_{I_a} \Big)\, u_a . $$ The same transport with $$u = 1$$ generates the paired per-camera time-offset columns ($$+$$ on $$t_{d,i}$$, $$-$$ on the reference $$t_{d,r}$$) — which is exactly the structure that leaves the common clock shift unobservable (a gauge freedom) while keeping the relative offsets observable. Readout columns exist only for declared-rolling cameras; all temporal columns are skipped (values still applied) when the window motion is degenerate. ### A.4 Ingest ordering and the period EMA Each stream $$j$$ tracks its own frame period with an exponentially-weighted moving average, seeded from the declared rate $$f_j$$ (`camN_fps`): $$ \hat T_j \leftarrow 0.9\,\hat T_j + 0.1\,\Delta t_{\mathrm{arrival}}, \qquad \hat T_j(0) = 1/f_j . $$ The merge head at time $$t_h$$ (the minimum staged timestamp) is released when inertial data covers it and no live stream can still precede it: $$ \mathrm{release}(t_h) \iff t_{\mathrm{imu}} \ge t_h + g \;\wedge\; \forall j:\; \big(t_j^{\mathrm{staged}} \ge t_h\big) \,\vee\, \big(t_{\mathrm{imu}} - t_j^{\mathrm{last}} \gt s\,\hat T_j\big) , $$ with $$g$$ = `async_guard` and $$s$$ = `async_stale_factor`. A silent camera can therefore delay release by at most $$s\,\hat T_j$$ before it is treated as stale and bypassed. ### A.5 Quality metric Let $$U(t)$$ be the union of all used-feature lists from updates in $$[t - W,\ t]$$, de-duplicated by feature id (window $$W = 0.12$$ s, capacity 256). Each feature carries a weight by class: $$ q_{\mathrm{SLAM}} = \tfrac{1}{2}\,\frac{1}{1 + \lambda_{\max}/\sigma_{\mathrm{ref}}} + \tfrac{1}{2}\, q_{\mathrm{feat}}, \qquad q_{\mathrm{MSCKF}} = 0.4\; q_{\mathrm{feat}}\; \min\!\big(1,\ n_{\mathrm{meas}}/C\big), $$ where $$\lambda_{\max}$$ is the largest eigenvalue of the landmark's marginal covariance, $$\sigma_{\mathrm{ref}} = 1.4$$, $$q_{\mathrm{feat}}$$ the tracker's per-feature quality, $$n_{\mathrm{meas}}$$ the feature's measurement count and $$C = 11$$ the clone window. Per camera, features are binned into a $$5\times 5$$ image grid; a cell with $$n \ge 2$$ features contributes its mean weight, a sparser cell is discounted by $$\sqrt{n/2}$$. With $$\rho$$ the fraction of occupied cells, the camera score combines coverage and content: $$ s_c = \tfrac{1}{2}\; 100\,\min\!\big(1,\ \rho/0.5\big) \;+\; \tfrac{1}{2} \sum_{\mathrm{cells}} \bar q_{\mathrm{cell}} , \qquad q_{\mathrm{fused}} = \min\!\Big(100,\ \sum_{c \,\in\, \mathrm{cameras}(U)} s_c\Big) . $$ The published value is the time-constant EMA of the fused score ($$\tau = 0.25$$ s, $$\Delta t$$ the time since the previous update): $$ q \;\leftarrow\; q + \min\!\Big(1,\ \frac{\Delta t}{\tau}\Big)\,\big(q_{\mathrm{fused}} - q\big) . $$ The EMA state is discarded on every reset, and the published value is floored at 10 while the filter runs (collapse is reported through the hysteresis machine and the auto-reset path, not by this metric alone). --- *The asynchronous multi-camera architecture — the lock-free ingest, epoch-anchored cloning, the ACI² preintegration bridge — and the `zbft_sfm` initialization solver are authored by **Joao Leonardo Silva Cotta, PhD**, building on the OpenVINS estimator by Patrick Geneva, Guoquan Huang, and the OpenVINS contributors.* --- Source: https://docs.modalai.com/voxl-open-vins-init/ # Initialization & Resets A VIO estimator is only as trustworthy as its ability to *start* well and to *recover* well. `voxl-open-vins-server` initializes through a structure-from-motion (SfM) pipeline that runs entirely on-board with deterministic, real-time-friendly numerics — no Ceres, no dynamic thread pools — and recovers through a two-tier reset system designed so that a healthy filter is never torn down for a transient hiccup. --- ## Lifecycle ![Initialization and reset lifecycle](/images/voxl-sdk/voxl-open-vins-server/init_reset_flow.svg) --- ## Getting started: gravity and jerk gating Before any visual initialization, the server's IMU front-end establishes two facts: - **Gravity direction** — a plausible gravity sample orients the initial frame. By default the server accepts *any attitude* (the estimator's SfM initializer is attitude-agnostic); platforms that want a level-start gate can opt in with `imu_init_max_gravity_angle_deg`. - **Motion state** — a jerk detector watching accelerometer/gyroscope windows distinguishes "sitting on the bench" from "picked up / taking off", which selects between the static and dynamic initializers and arms zero-velocity updates appropriately. ## Static initialization If the platform is stationary, the filter initializes directly: gravity from the averaged accelerometer, zero velocity, and bias priors from the quiet window. A deliberately **tight tilt gate** applies here — a pitched platform held in hand must *fall through* to dynamic initialization rather than receive a confidently wrong level-start seed. ## Dynamic initialization — Ceres-free SfM If the platform is moving (or tilted), the estimator solves a small structure-from-motion problem over a short window (~2 s) of feature tracks and preintegrated IMU segments: recover attitude (including gravity), velocity, biases, and feature depths, jointly, from scratch — at any attitude, mid-motion. The refinement is a full maximum-likelihood solve, executed by a purpose-built solver — `ov_init::zbft_sfm`, authored by **Joao Leonardo Silva Cotta, PhD** — that replaces Ceres on the flight target: - **Deterministic and RT-friendly** — fixed memory, bounded iterations, lock-free bounded parallelism; identical inputs produce identical outputs, run after run. - **Analytic Jacobians everywhere** — closed-form derivatives for the IMU preintegration and reprojection factors (finite differences exist only as test oracles). - **Well-conditioned gravity handling** — gravity is optimized on the unit sphere (S²) with a weak direction prior and a post-solve sanity gate, which is what makes reliable *any-attitude* initialization possible without flip ambiguities. - **Fast** — full dynamic initialization completes in **~17–20 ms end-to-end on a QRB5165** (the legacy Ceres path took ~65 ms), including aggressive-motion cases with over 170° of rotation across the window. **Warm-start injection.** The initializer does not just hand over a single state: the window's poses and their joint covariance are injected as filter clones, so the filter performs useful updates *immediately* instead of cold-starting a fresh 2-second window after init. ## Choosing static or dynamic initialization The choice between static and dynamic initialization depends on what the application can tolerate. > If the application needs VIO from takeoff and is not robust to structure-from-motion resets > (a possible jump discontinuity in the estimate), do not rely on dynamic initialization or on > the [warm (soft) reset](#soft-reset-warm). Initialize statically on the ground, confirm the > estimator is in the `OKAY` state, and take off from there. "Convergence" applies to dynamic initialization, which solves a nonlinear optimization; static initialization does not optimize anything. A static initialization can still be poor as soon as the platform is in the air if the zero-velocity updates were noisy or the IMU calibration and noise (sigma / random-walk) values are wrong. This is common on custom or modified airframes, and a full IMU intrinsics recalibration is the first thing to try. The dynamic initializer is switched with `init_dyn_use` in `estimator_config.yaml`. --- ## Resets Two tiers, one contract: the filter must come back honestly — no stale confidence, no leftover evidence from the previous life. ### Soft reset (warm) Triggered by `RESET_VIO_SOFT` on the control pipe or autonomously by health monitoring. The EKF state and covariance are rebuilt while everything expensive survives: - **feature tracks and the IMU history buffer** — re-initialization is warm, not a cold restart; - **calibration knowledge** — per-camera time offsets and readouts are re-pinned (value and linearization point) to the **configured** calibration; online refinements from the previous episode are deliberately discarded, so the new episode restarts from the trusted prior rather than from estimates a divergence may have poisoned; - **live bias estimates** — the running gyro/accel biases (with age-inflated uncertainty) are handed to the dynamic initializer as priors, dramatically conditioning the re-solve. The priors are gated: implausible magnitudes or uncertainties are rejected, and a divergence-suspected reset inflates them further before use. What is deliberately *purged*: per-update bookkeeping keyed to the old timeline (the published feature list, quality smoothing, zero-velocity latches) — sensor time is continuous across a reset, so anything time-keyed would otherwise present pre-reset evidence as current. ### Hard reset (cold) Triggered by `RESET_VIO_HARD` or by estimator-poisoning error codes. The entire estimator object is destroyed and recreated: queued camera frames are released back to their owners exactly once, error codes are cleared (including those raised by the teardown itself — housekeeping is not a health event), and the system returns to the gravity/jerk gate. ### Auto-reset policy The health monitor (30 Hz) applies a strict severity split (full code table on the [Pipe Interface](/voxl-open-vins-pipes/#error-codes) page): > **Estimator-health codes** (corrupt covariance, sustained low quality, feature starvation, > velocity-uncertainty breaches) recommend a reset — the filter itself is suspect. > **Transport warnings** (dropped frame, dropped IMU sample, timestamp glitch) never do: the > asynchronous ingest drops frames *by design* for ordering and staleness, and a single dropped > frame once caused a mid-flight reset loop. Warning codes self-clear after 10 quiet seconds. Additional guards prevent reset *loops*: quality checks arm only at the initialized rising edge (a re-initializing filter gets its full grace window), quality is capped during initialization so a freshly rebuilt covariance cannot report false confidence, and a reset that begins while a publish is in flight forces that last packet to report `INITIALIZING`. --- ## Troubleshooting: VIO does not initialize from rest Symptoms: the estimator stays in `INIT` while the vehicle sits on the ground, no features are tracked after an automatic takeoff, or position hold only starts working once the vehicle has been picked up and moved by hand. Work through the list in order. 1. **IMU calibration.** Recalibrate the IMU from [voxl-portal](/voxl-portal/) or with `voxl-calibrate-imu` ([Calibrate IMU](/calibrate-imu/)), then confirm the gravity magnitude reads close to 9.81 m/s^2: ```bash voxl-inspect-imu imu_apps ``` A wrong gravity magnitude or bad bias values give a static initialization that looks fine on the bench and falls apart once airborne. 2. **Camera calibration for the current resolution.** Open the intrinsics file in `/data/modalai/` for each VIO camera and check that the resolution stored in it matches the resolution the camera streams now; a calibration captured at a different resolution is not valid. Recalibrate if the stored `reprojection_error` is near the limit ([Calibrate Cameras](/calibrate-cameras/), [Verifying Camera Calibration](/flying-with-vio/#verifying-camera-calibration)). 3. **Lighting and texture at the takeoff spot.** Look at the tracking camera image in voxl-portal from the vehicle's resting position. Static initialization does not need image features, but the filter needs tracked features immediately after it; a plain floor directly below a down-facing camera, low light, or a lens cover give it nothing to track. Move the vehicle or add scene texture rather than tuning the estimator. 4. **Static or dynamic initialization.** Decide which initializer the application relies on (previous section). Static initialization requires the vehicle to be stationary and inside the tilt gate; dynamic initialization requires motion with enough parallax over its ~2 s window, which a vehicle sitting still never provides. If VIO must be initialized before takeoff, wait for `voxl-inspect-vins` to report `OKAY` on the ground before arming. 5. **Vibration and airframe changes.** Added payloads, lights, or prop guards in the camera view and extra vibration both degrade initialization. Check [voxl-inspect-vibration](/voxl-inspect-vibration/) and the camera view for intrusions. 6. **Record a log.** Capture `voxl-logger -b -v ov` around the failing takeoff so the run can be replayed offline with [voxl-benchmark-vio](/voxl-benchmark-vio/). Include the log when asking for help. --- ## Related configuration Server-side knobs (`/etc/modalai/voxl-open-vins-server.conf` — see the [main page](/voxl-open-vins-server/#configuration-files)): `en_auto_reset`, `auto_reset_max_velocity`, `auto_reset_max_v_cov_timeout_s`, `auto_reset_min_features`, `auto_reset_min_feature_timeout_s`, `ok_state_grace_timeout_s`, and the quality-hysteresis thresholds. Estimator-side knobs (`estimator_config.yaml`, prefix `init_`): window length and feature budget (`init_window_time`, `init_max_features`), dynamic-init MLE controls (`init_dyn_mle_max_iter`, `init_dyn_mle_max_threads`, LM damping schedule), gravity gates (`init_gravity_max_angle`, `init_static_gravity_max_angle`, `init_dyn_grav_prior_sigma`, `init_dyn_grav_gate_deg`), warm start (`init_warmstart_inject`), and the reset bias priors (`init_dyn_reset_prior_use` and its acceptance gates). > The shipped platform configurations already encode sensible values for all of these; the knobs > exist for bring-up and research. If you are tuning, change one group at a time and validate > with [voxl-benchmark-vio](/voxl-benchmark-vio/) replays before flying. --- Source: https://docs.modalai.com/voxl-benchmark-vio/ # voxl-benchmark-vio Utility for benchmarking VIO performance on VOXL. `voxl-benchmark-vio` orchestrates repeatable, automated replay-based benchmarking of `voxl-open-vins-server` (or `voxl-open-sqrtvins2-server`) over one or more recorded logs. For each entry in an input definition JSON it stages the appropriate camera/VIO config, spawns the VIO server, an analyzer that listens to its outputs, and `voxl-replay` to feed it the log data, then collects per-run metrics (pose, CPU usage, etc.) into a combined summary JSON. # Table of contents 1. TOC --- ## What gets installed The Debian/IPK package installs the following binaries into `/usr/bin/`: | Binary | Purpose | |---|---| | `voxl-benchmark-vio` | Main orchestrator — drives replay + VIO + analyzer for a list of logs. | | `voxl-vio-analyzer` | Subscribes to VIO server output pipes and writes per-log metrics JSON. | | `voxl-cpu-analyzer` | CPU sampling helper (used internally / standalone). | | `voxl-benchmark-cmp-res` | Diffs two benchmark summary JSONs key-by-key. | A legacy Python wrapper (`scripts/voxl-benchmark-vio`) also exists for an older flow that downloads logs from URLs and shells out to `voxl-feature-tracker` / `voxl-feature-analyzer`. It is **not** the primary entry point — the C++ `voxl-benchmark-vio` binary is what should be used for VIO benchmarking, and the rest of this page describes that binary. --- ## How a benchmark run works For each test entry in the input JSON, `voxl-benchmark-vio`: 1. **Backs up** the device's current `/etc/modalai/*.conf` and `/data/modalai/*.yml` into a temp folder under `/data/benchmark-logs/` so they can be restored at the end (or on `SIGINT` / `SIGSEGV`). 2. **Stages config from the log.** Copies `/etc/modalai/*.conf` → `/etc/modalai/` and `/data/modalai/*.yml` → `/data/modalai/` so the VIO server runs with the calibration/config that was active when the log was recorded. 3. **Optionally overrides** the open-vins config with the file passed via `-c/--config`. 4. **Patches `voxl-open-vins-server.conf`** to force `en_ext_feature_tracker=false` and to set `en_gpu_for_tracking` per the test entry's `en_gpu` flag. 5. **If `en_cam_as_ion_buf` is set**, appends `_ion` to every `pipe_for_tracking` entry in `/etc/modalai/vio_cams.conf` so the VIO server consumes ion-buffer pipes. 6. **Drops the page cache** (`echo 3 > /proc/sys/vm/drop_caches`) to keep per-run timing comparable. 7. **Forks three processes**, in order: - `voxl-vio-analyzer -o /[_gpu]_vio.json` — collects VIO metrics into per-log JSON. - `voxl-open-vins-server` (or `voxl-open-sqrtvins2-server` if `use_sqrt_vins` is true). - `voxl-replay -p -y [-b] [-i ...]` — replays the log. `-b` is added when `en_cam_as_ion_buf` is true, and one `-i ` is added per entry in `pipe_includes`. 8. **Tracks CPU usage** of the VIO server in a background thread for the duration of the replay. 9. **Waits for `voxl-replay` to exit**, then `SIGTERM`s the VIO server and analyzer. Median and total CPU usage are appended into the per-log JSON under `ovins-median-cpu-pct` and `ovins-total-cpu-pct`. 10. After all tests in all Monte Carlo runs are finished, all per-log JSONs in the output folder are merged into a single `summary.json`. 11. Original configs are restored, temp folders removed. --- ## Expected directory layout ### Logs Logs live (by default) under `/data/benchmark-logs/`. Each log is a directory named after its `id` and must contain at minimum the things `voxl-replay` expects (an `info.json` and the recorded pipe data) plus the original device config that produced it: ``` /data/benchmark-logs/ └── / ├── info.json ├── run/mpa//... # recorded pipe data consumed by voxl-replay │ ... ├── etc/modalai/ │ ├── voxl-open-vins-server.conf │ ├── vio_cams.conf │ └── ... # any other *.conf the log needs └── data/modalai/ └── *.yml # camera calibration etc. ``` If a test entry's `log_folder` is set, logs are looked up at `//` instead of `/data/benchmark-logs//`. ### Results Per-log analyzer output and the merged summary are written under `/data/benchmark-results//`: ``` /data/benchmark-results// ├── _vio.json # one per log (or _gpu_vio.json if en_gpu) ├── _vio.json └── summary.json # merged across all logs ``` The output directory is **wiped** at the start of a run if it already exists. --- ## Input JSON structure The input JSON passed via `-p/--path` must contain a top-level `replay_defs` array. Each element describes one log/test: ```json { "replay_defs": [ { "id": "indoor-flight-01", "log_folder": "/data/benchmark-logs/", "url": "https://storage.googleapis.com/.../indoor-flight-01.tar.gz", "pipe_includes": "tracking,stereo_front_l,stereo_front_r,imu_apps", "en_ext_tracker": false, "en_gpu": false, "en_cam_as_ion_buf": false, "use_sqrt_vins": false }, { "id": "outdoor-loop-02", "pipe_includes": "tracking,imu_apps", "en_gpu": true, "use_sqrt_vins": true } ] } ``` ### Field reference | Field | Type | Required | Meaning | |---|---|---|---| | `id` | string | yes | Folder name of the log under `` (or `/data/benchmark-logs/`). Also used to name the per-log result JSON. | | `log_folder` | string | no | Parent directory of the log. Defaults to `/data/benchmark-logs/`. Must end with `/`. | | `url` | string | no | Informational / used by the legacy Python wrapper to fetch logs. The C++ binary does not download. | | `pipe_includes` | string | no | Comma-separated list of pipe names to pass to `voxl-replay` as `-i ` (one flag per pipe). Restricts which recorded pipes are replayed. | | `en_ext_tracker` | bool | no | Forces external feature tracker on/off in `voxl-open-vins-server.conf`. The orchestrator currently always writes this as `false`. | | `en_gpu` | bool | no | Sets `en_gpu_for_tracking` in `voxl-open-vins-server.conf`. When `true`, the per-log result is named `_gpu_vio.json`. | | `en_cam_as_ion_buf` | bool | no | If `true`, passes `-b` to `voxl-replay` and appends `_ion` to every `pipe_for_tracking` in `vio_cams.conf`. | | `use_sqrt_vins` | bool | no | If `true`, runs `voxl-open-sqrtvins2-server` instead of `voxl-open-vins-server`. | All bool/string fields are optional and default to `false` / empty. --- ## Usage Run on the VOXL target as root (config files under `/etc/modalai/` and the page-cache drop require it). > **Important:** before running a replay, stop `voxl-camera-server` and > `voxl-imu-server`. The replay supplies its own recorded camera and IMU > data over the same MPA pipes, and leaving the live servers running will > cause pipe conflicts and contaminate the inputs the VIO server sees. > > ```bash > systemctl stop voxl-camera-server > systemctl stop voxl-imu-server > ``` ```bash voxl-benchmark-vio -p -o [options] ``` | Flag | Description | |---|---| | `-p, --path ` | **Required.** Path to the input definition JSON. | | `-o, --output ` | **Required.** Folder name created under `/data/benchmark-results/`. | | `-i, --index ` | Run only the test at this index in `replay_defs`. May be passed multiple times. | | `-c, --config ` | Override the open-vins config with this file (copied into `/etc/modalai/`). | | `-m, --mc_runs ` | Number of Monte Carlo repetitions over the full test list. Default 1. | | `-v, --verbose` | Show stdout/stderr from the spawned child processes; otherwise they are silenced to `/dev/null`. | | `-h, --help` | Print usage and exit. | ### Example ```bash voxl-benchmark-vio \ -p /data/benchmark-logs/my-suite.json \ -o my-suite-2025-10-28 \ -m 3 \ -v ``` This will run all tests in `my-suite.json` three times each, write per-log results into `/data/benchmark-results/my-suite-2025-10-28/`, and produce `summary.json` at the end. ### Comparing two runs ```bash voxl-benchmark-cmp-res \ /data/benchmark-results/run-A/summary.json \ /data/benchmark-results/run-B/summary.json ``` Reports the per-key numerical differences between two summary JSONs. --- ## Notes / gotchas - The orchestrator **modifies device config in place** (`/etc/modalai/*.conf`, `/data/modalai/*.yml`). It backs the originals up to `/data/benchmark-logs/{etc,data}_config_temp/` and restores them on clean exit, `SIGINT`, or `SIGSEGV`. If the process is killed harder (e.g. `SIGKILL`), manually restore from those temp folders. - Page cache is dropped at the start of every Monte Carlo iteration to make timing comparisons less noisy. - The output folder under `/data/benchmark-results//` is cleared at the start of each run. - Each log directory must include the `etc/modalai/` and `data/modalai/` subtrees that were active when it was recorded; otherwise the VIO server will run against whatever happens to be on the device. --- Source: https://docs.modalai.com/voa/ # VOXL Vision Hub Visual Obstacle Avoidance The `voxl-vision-hub` service supports consuming a point cloud from the [Depth from Stereo](/voxl-dfs-server/) service and processing it into an obstacle_distance mavlink message for use by PX4 and ArduPilot. voxl-vision-hub will use its history of VIO data to correct for the motion of the stereo cameras over time during the depth processing. Without VIO enabled it will just use PX4's reported attitude to correct for orientation.
--- ## VOXL Configuration - VOXL needs to be equipped with calibrated stereo cameras or a PMD TOF to use this feature. If you purchased a [Flight Deck](/flight-deck/) or [M500 Developer Drone](/m500/) then the cameras should have been calibrated from the factory. - Next, make sure the [Depth from Stereo](/voxl-dfs-server/) server is running if you are using DFS for VOA. This can be done by looking at [voxl-inspect-services](/voxl-inspect-services/). It is disabled by default by [voxl-configure-mpa](/voxl-configure-mpa/) so you will likely need to enable it with `systemctl enable voxl-dfs-server`. - Make sure the `"en_voa"` field in `/etc/modalai/voxl-vision-hub.conf` file is set to `true` which is is by default. This option is there mostly to enable you to disable voxl-vision-hub from consuming DFS data if you wish to use DFS for something other than PX4's Collision Prevention. - Check that point cloud data is being published from voxl-dfs-server using the voxl-inspect-points[/voxl-inspect-points/) tool. - Make sure you have a correct extrinsic relation from the `body` frame to the `stereo` or `tof` frame in `/etc/modalai/extrinsics.conf`. For ModalAI reference drones this is set up automatically with [voxl-configure-extrinsics](/configure-extrinsics/) and by extension the higher level [voxl-configure-mpa](/voxl-configure-mpa/) tools. This can be checked with the [voxl-inspect-extrinsics](/voxl-inspect-extrinsics/) tool. ## PX4 Configuration The above only enables voxl-vision-hub to send obstacle data to PX4. PX4 must then be configured to use this data. For full information see the PX4 docs here: [https://docs.px4.io/main/en/computer_vision/collision_prevention.html](https://docs.px4.io/main/en/computer_vision/collision_prevention.html) We suggest the following parameters for testing this indoors: ``` CP_DIST: 1.5 CP_DELAY: 0.0 CP_GUIDE_ANG: 0.0 CP_GO_NO_DATA: 1 ``` The delay can safely be set to 0 since we do accurate timestamping and delay compensation inside voxl-vision-hub. Increasing the delay over 0 will only cause twitchiness and unpredictable performance. ## Debugging Collision Prevention ### voxl-vision-hub voxl-vision-hub can be started with the following argument to print obstacle data to the screen before it is sent to PX4. ``` -s, --debug_stereo print detected stereo obstacles as linescan points ``` The `en_send_voa_to_qgc` parameter no longer exists and is automatically removed from `/etc/modalai/voxl-vision-hub.conf` when the config file is loaded. There is no separate toggle for VOA output: while `en_voa` is `true`, voxl-vision-hub always sends mavlink OBSTACLE_DISTANCE messages to the autopilot at the rate set by `voa_send_rate_hz` (default 20 Hz). #### Logging VOA Data Use the following command to log VOA data, this is helpful for offline analysis ```voxl-logger --cam stereo --cam dfs_disparity``` ### voxl-portal to View Depth Map The [voxl-portal Cameras](/voxl-portal/) page can be used to view image sensor data, including processed stereo data. The following data is useful: * Stereo is the data that goes into [voxl-dfs-server](/voxl-dfs-server) - [code](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) * DFS Disparity Scaled is the data that goes into the collision prevention algorithm. * voa_pc is the output of the VOA algorithm and what is sent on the obstacle_distance message [code](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/src/voa_manager.c#L202) ### Calibrating Stereo Image Sensors The stereo algorithm is highly sensitive to extrinsic calibration. If the sensors have been moved at all, it is likely they need to be re-calibrated. Details of how to calibrate stereo image sensors can be found [here](/calibrate-cameras/#stereo-calibration-process) using [voxl-portal](/voxl-portal). ## Frames of Reference Used The geometry module inside voxl-vision-hub keeps track of the following frames of reference. ![px4_chart-geometry_overview](/images/voxl-sdk/voxl-vision-px4/px4_chart-geometry_overview.png) voxl-vision-hub maintains a short history of visual odometry data to compensate for the time delay when computing the depth-from-stereo data as well as the motion and tilt of the drone body. ![px4_chart-stereo_frames](/images/voxl-sdk/voxl-vision-px4/px4_chart-stereo_frames.png) --- Source: https://docs.modalai.com/voxl-tag-detector/ # Apriltag Detection voxl-tag-detector is a background systemd service that subscribes to up to 3 camera image feeds and outputs AprilTag detections via pipe at /run/mpa/tag_detections. The following tag families are supported: [tag36h11](/images/voxl-sdk/apriltags1-20.pdf) (default), tag16h5, tag25h9, tagCircle21h7, tagCircle49h12, tagCustom48h12, tagStandard41h12, and tagStandard52h13. The family for each detector is selected with the `april_tag_family` config key. For information on how this can be used, see the [AprilTag relocalization page](/voxl-vision-hub-apriltag-relocalization/). ![geometry_overview](/images/voxl-sdk/voxl-portal/voxl-portal-tag-overlay.png) --- --- ## Tag Location Types A tag can be flagged by the user as fixed, static, or dynamic. These types are used in the `tag_locations.conf` config file and are specified in the output data struct too. - "fixed": The tag is at a known location in space as described by the T_tag_wrt_fixed vector and R_tag_to_fixed rotation matrix. These fixed tags are used by [voxl-vision-hub](/voxl-vision-hub/) for [AprilTag relocalization](/voxl-vision-hub-apriltag-relocalization/). - "static": A static tag can be trusted to be static (not moving) but does not have a known location. For example, a landing pad. - "dynamic": A dynamic tag can be expected to be in motion such as an object to be tracked or followed dynamically. If a tag is detected that has not been listed by the user as a known tag in /etc/modalai/tag_locations.conf then it will be listed as unknown. ## Output Format The data format is standardized in [libmodal_pipe](/libmodal-pipe/) in `pipe_interfaces/tag_detection_t.h` as follows: ``` #define TAG_LOCATION_TYPE_STRINGS {"unknown", "fixed","static","dynamic"} #define N_TAG_LOCATION_TYPES 4 #define TAG_LOCATION_UNKNOWN 0 #define TAG_LOCATION_FIXED 1 #define TAG_LOCATION_STATIC 2 #define TAG_LOCATION_DYNAMIC 3 // max name length of a tag name #define TAG_NAME_LEN 64 /** * describes an apriltag, aruco, or similar detection. Provides the tag's position and rotation * relative to the camera that detected it. * * This packet is 252 bytes long. */ typedef struct tag_detection_t{ uint32_t magic_number; ///< Unique 32-bit number used to signal the beginning of a VIO packet while parsing a data stream. int32_t id; ///< id number of the tag float size_m; ///< size of the tag in meters int64_t timestamp_ns; ///< timestamp at the middle of the frame exposure in monotonic time char name[TAG_NAME_LEN]; ///< optional name of the tag int loc_type; ///< location type float T_tag_wrt_cam[3]; ///< location of the tag with respect to camera frame in meters. float R_tag_to_cam[3][3]; ///< rotation matrix from tag frame to camera frame float T_tag_wrt_fixed[3]; ///< only set if location type is LOCATION_FIXED float R_tag_to_fixed[3][3]; ///< only set if location type is LOCATION_FIXED char cam[MODAL_PIPE_MAX_DIR_LEN]; ///< camera pipe where the detection was made int reserved; ///< reserved field } __attribute__((packed)) tag_detection_t; ``` For an example of how to read this data, see [voxl-inspect-tags](/voxl-inspect-tags/). ## voxl-configure-tag-detector Like all MPA services, voxl-tag-detector has a basic configure script to enable/disable the service as well as to reset the config file back to default for factory resets. ``` voxl2:/$ voxl-configure-tag-detector -h Start wizard with prompts: voxl-configure-tag-detector Shortcut configuration arguments for scripted setup. factory_enable will reset the config file to factory defaults before enabling the service. voxl-configure-tag-detector disable voxl-configure-tag-detector factory_disable voxl-configure-tag-detector factory_enable voxl-configure-tag-detector enable show this help message: voxl-configure-tag-detector help ``` ``` voxl2:/$ voxl-configure-tag-detector Starting Wizard Do you want to reset the config file to factory defaults? 1) yes 2) no #? 1 wiping old config file Creating new config file: /etc/modalai/voxl-tag-detector.conf Created new empty json file: /etc/modalai/tag_locations.conf The JSON tag location data was modified during parsing, saving the changes to disk do you want to enable or disable voxl-tag-detector 1) enable 2) disable #? 1 enabling voxl-tag-detector systemd service Created symlink from /etc/systemd/system/multi-user.target.wants/voxl-tag-detector.service to /etc/systemd/system/voxl-tag-detector.service. starting voxl-tag-detector systemd service Done configuring voxl-tag-detector ``` ## Tag Detector Configuration File Up to 3 parallel detection threads can be configured independently. They all output detection data on the same pipe, but have separate debug overlay streams which can be configured here. The default configuration file has recommended settings for the front and down tracking cameras, with both the front and down tracking detectors enabled by default. ``` voxl2:/$ cat /etc/modalai/voxl-tag-detector.conf /** * This file contains configuration parameters for voxl-tag-detector. * You can specify up to 3 cameras to do detection on simultaneously. * For the stereo camera pair, only the left camera is used. */ { "detector_0": { "enable": true, "input_pipe": "tracking_front", "en_fast_mode": true, "n_threads": 1, "en_undistortion": true, "undistort_scale": 0.600000023841858, "overlay_name": "tracking_front_tag_overlay", "lens_cal_file": "/data/modalai/opencv_tracking_front_intrinsics.yml", "skip_n_frames": 5, "april_tag_family": "tag36h11" }, "detector_1": { "enable": true, "input_pipe": "tracking_down", "en_fast_mode": true, "n_threads": 1, "en_undistortion": true, "undistort_scale": 0.600000023841858, "overlay_name": "tracking_down_tag_overlay", "lens_cal_file": "/data/modalai/opencv_tracking_down_intrinsics.yml", "skip_n_frames": 5, "april_tag_family": "tag36h11" }, "detector_2": { "enable": false, "input_pipe": "extra", "en_fast_mode": true, "n_threads": 1, "en_undistortion": false, "undistort_scale": 1, "overlay_name": "extra_tag_overlay", "lens_cal_file": "/data/modalai/opencv_extra_intrinsics.yml", "skip_n_frames": 5, "april_tag_family": "tag36h11" } } ``` ### Tag Family Each detector can select its AprilTag family with the `april_tag_family` key (default `tag36h11`). Supported values are `tag36h11`, `tag16h5`, `tag25h9`, `tagCircle21h7`, `tagCircle49h12`, `tagCustom48h12`, `tagStandard41h12`, and `tagStandard52h13`. An unknown value falls back to `tag36h11`. The small `tag16h5` and `tag25h9` families carry fewer data bits and produce more false positives; prefer `tag36h11` unless you need their smaller footprint. Family selection requires voxl-tag-detector 0.1.0 (SDK 1.6 and later); earlier versions always use `tag36h11`. ### Undistort Ratio This is mostly relevant to undistorting the fisheye tracking camera images. When undistorting an image, you can choose to either shrink the edges of the image in towards the center to keep all image data but leave black areas, or stretch the corners out which discards image data at the corners. We find that somewhere in the middle (0.6) is ideal for the fisheye tracking cameras, and this is the default for both tracking detectors. For less distorted lenses a higher value can be used to preserve more of the image. The scale number is a multiplier on the focal length of the lens, thus a value of 1.0 will preserve the same focal length and result in no black areas on the image, but parts of the image will be lost during the undistortion process. ### Fast Mode Fast mode is enabled by default and scales the image down by a factor of two to perform the quadrangle detection which is one of the most computationally intensive steps. This does reduce detection rates slightly for small or distant tags and can be turned off if detection range is a high priority. ### Multithreading For small VGA images, there is little to no benefit to enabling more than one core for processing images. It is generally faster to keep the image in one core's cache and let one CPU work on it without interruptions or context switches. There are generally other things to keep the other CPU cores occupied. ### Skipping Frames voxl-tag-detector will always drop backed-up frames if it cannot keep up with the input frame rate. However, it is rarely needed to run tag detection on every frame so you can configure voxl-tag-detector to automatically skip frames to reduce CPU load. The default is to skip 5 frames, resulting in every 6th frame being processed. This results in a reasonable 5hz detection rate for a 30fps camera stream. ## Tag Location Configuration File The location, size, type, and ID of each tag you expect to see needs to be listed in the tag_locations.conf configuration file. This data is forwarded through to the output data pipe so subscribers have access to this information without needing to read it manually. The reference PDFs for the 36h11 family can be found [here](/images/voxl-sdk/apriltags1-20.pdf). Print them to scale for the localization to work properly. The ```size_m``` parameter must align with the actual size of the physically printed tag for the localization to be accurate. ``` voxl2:/$ cat /etc/modalai/tag_locations.conf /** * Apriltag Location Configuration File * This file is used by voxl-tag-detector * * A tag can be flagged by the user as fixed, static, or dynamic. * * - fixed: The tag is at a known location in space as described by the * T_tag_wrt_fixed vector and R_tag_to_fixed rotation matrix. These fixed * tags are used by voxl-vision-hub for apriltag relocalization. * * - static: A static tag can be trusted to be static (not moving) but does not * have a known location. For example, a landing pad. * * - dynamic: A dynamic tag can be expected to be in motion such as an object * to be tracked or followed dynamically. * * * If the tag is fixed then you must specify its location and rotation relative * to the fixed reference frame. Otherwise the translation and rotation * parameters can be ignored. * * The name parameter is currently only used for info prints but can be helpful * for the user to keep track of what tag is which. * * Each tag must have its size listed. Tags not listed will be assumed to have * size equal to the default_size. * * Currently only 36h11 apriltags are supported */ { "locations": [{ "id": 0, "name": "default_name", "loc_type": "unknown", "size_m": 0.40000000596046448, "T_tag_wrt_fixed": [0, 0, 0], "R_tag_to_fixed": [[0, -1, 0], [1, 0, 0], [0, 0, 1]] }], "default_size_m": 0.40000000596046448 } ``` > The "Currently only 36h11 apriltags are supported" line in the generated file's comment header predates multi-family support; tag IDs listed here are matched for whichever families the detectors are configured for. ## Tag Coordinate Frame Apriltags have a coordinate frame similar to cameras such that X points out the right of the tag, Y points towards the bottom edge of the paper, and Z points into the paper. The example rotation matrix in the default tag_locations.conf corresponds to a tag sitting on the floor with the top of the picture pointing forward along the X axis. We recommend you try to remain consistent with your Apriltag orientations to avoid confusion and error. Positions are easier to visualize and debug. ## Tag Detection Debug Overlay Each detector can output a debug overlay image stream which is another normal camera pipe. As such, it can be viewed with [voxl-portal](/voxl-portal/), converted to ROS with [voxl_mpa_to_ros](/ros-installation-voxl2/), and logged to disk with [voxl-logger](/voxl-logger/). The overlay highlights the 4 detected corners of the tag and writes the ID number of the tag in the middle. See the image at the top of this page for an example. ## Troubleshooting Accurate tag detection requires [calibrated cameras](/calibrate-cameras/). The voxl-tag-detector service won't even start if image undistortion is enabled and the specified camera calibration file cannot be found. We recommend having a white border around your AprilTags at least twice as wide as the individual squares in the black portion of the tag. This greatly improves detection reliability at longer distances by improving the contrast around the tag, making the black square easier to distinguish. This is particularly true when using fast mode. If the distances seem incorrect, make sure you have specified the correct tag size in the `tag_locations.conf` file. Outdoors, shiny Apriltags are particularly susceptible to glare. Try to use a matte surface whenever possible. ## Source Source code is available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) --- Source: https://docs.modalai.com/voxl-vision-hub-apriltag-relocalization/ # Relocalization One inherent shortcoming of navigating with VIO is that VIO algorithms are generally unaware of their absolution location unless they employ a mapping and relocalization function. Most of them only know their position relative to where the algorithm started. One reliable and configurable method for relocalization is using fiducial markers. We incorporate this functionality into [voxl-vision-hub](/voxl-vision-hub/) specifically using Apriltags. In this demonstration video you can see the drone start up crooked so that it thinks forward is offset and yawed to the right. It's told to fly forward and back in a straight line before landing at the 0,0,0 point. On its return to the landing pad it sees the Apriltag and immediately corrects the error, allowing it to land squarely on its landing pad.
--- ### Video Walkthrough
### Configuration Files To use this feature, you must enable VIO and the "en_tag_fixed_frame" feature in `/etc/modalai/voxl-vision-hub.conf` which will be discussed later in this page. ```json { "en_vio": true, "en_tag_fixed_frame": true, "en_transform_mavlink_pos_setpoints_from_fixed_frame": true } ``` When using the "en_tag_fixed_frame" feature you need to specify the position and rotation of each Apriltag relative to fixed frame in the `/etc/modalai/tag_locations.conf` file. See the [Tag Locations config file description](/voxl-tag-detector/#tag-location-configuration-file) for how to set this up. Specifically you should be configuring apriltags with the type `fixed` for use with the relocalization feature. ### Frames of Reference The geometry module inside [voxl-vision-hub](/voxl-vision-hub/) keeps track of the following frames of reference. ![px4_chart-geometry_overview](/images/voxl-sdk/voxl-vision-px4/px4_chart-geometry_overview.png) Calculation of the translation and rotation between fixed and local frame is done using the relation between the following frames. voxl-vision-hub keeps a small buffer of odometry data relating the IMU to VIO frames as the drone moves. Using the accurate camera frame timestamps, [voxl-vision-hub](/voxl-vision-hub/) then goes back in time and interpolates to best estimate the position and orientation of the drone when the Apriltag was detected. ![px4_chart-apriltag_frames](/images/voxl-sdk/voxl-vision-px4/px4_chart-apriltag_frames.png) ### Debugging Before first flight, we highly suggest running [voxl-vision-hub](/voxl-vision-hub/) from the command line with each of the following options one at a time. This will let you inspect the behavior of the relocalization algorithm and Apriltag detection. A small typo when configuring the Apriltag positions and orientations in the config file can be disastrous. ```bash -g, --debug_fixed_frame print debug info regarding the calculation of fixed frame relative to local frame as set by apriltags. -l, --debug_tag_local print location and rotation of each tag in local frame note that apriltag frame of reference is not the same as local frame so interpreting roll/pitch/yaw requires some thought -m, --debug_tag_cam print location and rotation of each tag detection wrt cam -o, --debug_odometry print the odometry of body in local frame each time a VIO packet is sent to PX4 -p, --debug_odometry_fixed print the odometry of body in fixed frame. Note this is not the data being sent to px4. This is to help ensure fixed apriltags are set correctly in config file ``` ### Fixed Frame Pipe for user-provided localization The user may wish to implement their own method of localization instead of using the integrated Apriltag feature. For example: multi-fiducial-marker detection, or landing pad detection. In this case, the user may simply disable the Apriltag localization feature. The fixed-pose input pipe has no enable option and is always available. In `/etc/modalai/voxl-vision-hub.conf` ```json "en_tag_fixed_frame": false, ``` voxl-vision-hub opens a sink pipe named `vvhub_fixed_pose_input` at `/run/mpa/vvhub_fixed_pose_input` to which the user can write data in the form of a pose_4dof_t struct relating the location of the body to fixed frame. The pipe name is defined in `/usr/include/voxl_vision_hub.h` and the struct is defined by libmodal-pipe: ```c #define FIXED_POSE_INPUT_NAME "vvhub_fixed_pose_input" #define FIXED_POSE_INPUT_LOCATION (MODAL_PIPE_DEFAULT_BASE_DIR FIXED_POSE_INPUT_NAME) typedef struct pose_4dof_t{ uint32_t magic_number; // unique 32-bit number signaling the start of a packet int64_t timestamp_ns; // timestamp in apps-proc clock-monotonic double p[3]; // meters double yaw; // radians, between +- PI } pose_4dof_t; ``` An example of how to write to this pipe can be found here: [https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/examples/fixed_frame_pipe_example.c](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/examples/fixed_frame_pipe_example.c) Passing data in through the fixed_frame_pipe uses the same basic method as Apriltag detection and the low pass filter described below is also used. Accurate timestamping is critical when passing data in this way since the geometry module will look back in time and use interpolation to find the VIO odometry data corresponding to the provided timestamp. ### Filter Configuration As with all sensors, there is inherent noise and uncertainty with Apriltag detections. For this reason we incorporate a moving average filter to smooth out the estimate of the rotation and translation between local and fixed frame. This filter is configured such that if only one detection is made, the filter will output exactly that value to prevent the rise time that would be incurred if the filter had to wait to be completely filled before converging. The filter length is user-configurable. It can be increased if the use-case involves the drone hovering still over a target in order to better estimate its position. If the user wishes to ensure the drone very quickly localizes given only a few camera frames looking at a tag then the filter length can be reduced. It is possible to set the filter length to 1 which will result in the local-to-fixed frame relation being completely determined by the most recent tag detection. In `/etc/modalai/voxl-vision-hub.conf` ```json "fixed_frame_filter_len": 5 ``` ### Correcting Setpoints with the Fixed Frame Offset So far, we have only discussed how the offset between local and fixed frame is computed. This information is never actually sent to PX4. PX4 always receives odometry data as the position and rotation of the body with respect to local frame. If PX4 was provided with the Body with respect to Fixed frame then the sudden jump that occurs upon relocalization would cause PX4's EKF2 to misbehave and likely fall out of position-hold mode. Instead, the user can provide setpoints in fixed frame and voxl-vision-hub will automatically translate those setpoints into local frame so PX4 will fly where you want it to go relative to apriltags. ```json "en_transform_mavlink_pos_setpoints_from_fixed_frame": true, ``` When enabled, any SET_POSITION_TARGET_LOCAL_NED mavlink messages received through UDP will have its position, velocity, acceleration, and yaw values updated with the fixed frame offset before being sent to PX4 over UART. This is very useful for MAVROS and MAVSDK processes running locally or remotely. This feature is completely optional if you wish to have more control yourself. ## Precision Landing A common question is whether VOXL supports precision landing on an AprilTag. The current status: - AprilTag relocalization corrects VIO drift in the local frame as described on this page. Landing at a known location above a fixed tag benefits from this correction, since the position estimate is re-aligned to the tag each time it is observed. - PX4's dedicated precision-landing mode is not integrated: no VOXL SDK service publishes the MAVLink `LANDING_TARGET` message that mode requires. - voxl-vision-hub's tag-follow offboard mode holds position relative to a tag; it does not descend or land. Tag-relative landing behavior beyond this must be implemented by the user, for example through offboard mode. --- Source: https://docs.modalai.com/aoi-yaw-tracking/ # AOI Yaw Tracking > AOI yaw tracking **commands the vehicle's yaw in flight** to keep the tracked target centered. Test in a safe, open area in VFC position mode with good VIO, and be ready to take manual control at any time. ### Summary #### What - [voxl-nano-tracker](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-nano-tracker) is a headless object-tracking service for VOXL devices that uses the NanoTrack/NCNN tracker and OpenCV (with optional OpenCL GPU acceleration) available in SDK 1.6.3+. #### Inputs - subscribes to camera frames via MPA pipes (configurable camera pipe). #### Processing - pre-processes frames (undistort/resize/color convert) - runs the NCNN-based tracker, computes object offset (yaw correction) and tracking ROI; supports calibration (use_cal) and OpenCL for speed. #### Outputs - publishes camera frames and metadata/ROIs via MPA pipes and sends object_tracking_data_t (yaw offset, timestamp, sequence) for downstream consumers. #### Config - runtime options live in `/etc/modalai/voxl-nano-tracker.conf` (camera pipe, ROI size, rates, debug, etc.). ### Usage In order to enable `voxl-nano-tracker` to run on boot, run the following: ```bash voxl-configure-nano-tracker factory_enable ``` The generated config file lives at `/etc/modalai/voxl-nano-tracker.conf` and has the following default settings: ```json { "camera_pipe_name": "hires_misp_color", "yaw_rate": 0.25, "yaw_accel": 2, "xy_rate": 1, "forward_vel": 0.5, "z_vel": 0.5, "min_track_size": 950, "roi_size_x": 150, "roi_size_y": 150, "neutral_border": 5, "min_sensitivity": 8, "dewarp_as_needed": 0, "track_valid_objects_only": 1, "en_debug": false, "ai_pipe_name": "mobilenet_tflite_data" } ``` Each setting can be tweaked to fit the user's application. In order to enable AOI yaw tracking in flight the user must be in VFC position mode (VIO). The VFC (VOXL Flight Controller) sub-mode selection is configured in `/etc/modalai/vfc.conf`, while the tracking gains below remain in `/etc/modalai/voxl-vision-hub.conf`. The relevant config options are below: ```json "tracking_trigger_ch": 12, "tracking_trigger_ch_thresh_temp": 1200, "tracking_trigger_ch_thresh_new": 1800, ``` The user can choose which RC channel is used to start tracking (default: 12) as well as the channel value threshold. #### voxl-portal AOI Yaw tracking can also be started, stopped, and reset via voxl-portal ![voxl-portal-nanotrack.png](/images/voxl-sdk/voxl-portal/voxl-portal-nanotrack.png) The clip below shows tracking started from the portal's nanotrack view — the ROI box stays locked on the target while the vehicle yaws to keep it centered: #### voxl-vtx Yaw Tracking AOI, crosshairs, target, etc. can also be transmitted via voxl-vtx and rendered directly onto user's screen via voxl-vrx. ![vrx-nanotrack.png](/images/voxl-sdk/vrx-nanotrack.png) In order to enable this, users can modify `/etc/modalai/voxl-vtx.conf`, enable `ai_detection_enable`, and set `ai_detection_source` to that of voxl-nano-tracker (`object_tracker_meta`) ```json { "name": "Default", "mcs": 0, "mtu": 1000, "power": 1000, "source": "hires_default_misp_encoded", "invert_toggle": -1, "joystick_toggle": -1, "ai_detection_enable": true, "ai_detection_source": "object_tracker_meta", "ai_detection_qty": 3, "ai_detection_threshold": 0.5 } ``` ### voxl-tflite-server integration #### Summary `voxl-nano-tracker` can integrate directly with [voxl-tflite-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server/) (TFLite inference service) to receive object detections and use them to seed or re-acquire the tracker. #### Configuration The MPA pipe name to listen for TFLite detections is configurable via the `ai_pipe_name` setting in `/etc/modalai/voxl-nano-tracker.conf`. The default value is `mobilenet_tflite_data`. #### Behavior When connected to the TFLite server pipe, `voxl-nano-tracker` will parse `ai_detection_t` packets and build a list of candidate ROIs. By default the service filters detections for the classes `person` and `car` with confidence > 0.7 and only accepts detections whose area is between `min_track_size` and a large fraction of the frame size. Scaling: incoming detection coordinates are scaled to the tracker's input size before use. Reacqusition: if tracking is lost and detections meeting the filter/size criteria are available, the tracker will automatically begin a reacquire/seed sequence using the TFLite ROIs. #### Notes and tuning - Adjust `ai_pipe_name` if your TFLite server publishes on a different pipe. - Tune `min_track_size` and the detection thresholds in your TFLite model to control which detections are used to seed tracking. - The tracker also exposes `track_valid_objects_only` and other parameters in the config file to change filtering behavior. This integration allows running a lightweight detector (voxl-tflite-server) to provide ROIs for the NanoTrack tracker, improving robustness and enabling automatic target acquisition. --- Source: https://docs.modalai.com/voxl-dfs-server/ # Depth From Stereo voxl-dfs-server is a background systemd service that subscribes to a stereo image feed and outputs depth information via three MPA pipes: dfs_disparity, dfs_disparity_scaled, and dfs_point_cloud. > voxl-dfs-server is not actively supported by ModalAI. The service originally required a combined `STEREO_RAW8` stream, and current ModalAI development drones do not publish that format by default, so the shipped package produces no output on them. In August 2026 the [qrb5165-dfs-server repository](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-dfs-server) was patched to also accept `RAW8` images (two independent left and right pipes, selected with `input_pipe_right` in the config). There are no official plans for the repository and it is expected to become community driven; build it from source to use the patched version. ![geometry_overview](/images/voxl-sdk/voxl-portal/voxl-portal-dfs.png) --- --- ## Output Format The data format is unique to each output pipe: dfs_disparity: Grayscale image with pixel values corresponding to calculated disparity. Each pixel will be within the range [0, `n_disparity_levels`], which can be changed in the configuration file. dfs_disparity_scaled: Grayscale image as above, but pixel values will correspond to scaled disparity values in the range of [0, 255]. dfs_point_cloud: An XYZ pointcloud (as specified by [libmodal_pipe](/libmodal-pipe/) in `pipe_interfaces/point_cloud_metadata_t.h`) with the reprojected distances. For an example of how to read this data, see [voxl-inspect-points](/voxl-inspect-points/). ## Configuration APQ8096 (VOXL1) and QRB5165 (VOXL2) based platforms have different implementations of the DFS algorithm. See the following child pages for platform-specific configuration. ## Visualization Options You can view either the regular disparity or scaled image streams as another normal camera pipe. As such, it can be viewed with [voxl-portal](/voxl-portal/), converted to ROS with [voxl_mpa_to_ros](/ros-installation-voxl2/), and logged to disk with [voxl-logger](/voxl-logger/). The pointcloud can be viewed with [voxl-portal](/voxl-portal/). --- Source: https://docs.modalai.com/voxl-tflite-server/ # Deep Learning on VOXL 2's GPU and NPU ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server/-/badges/release.svg?key_text=Latest Release&key_width=100) --- VOXL 2 delivers state-of-the-art machine learning performance through both GPU and NPU acceleration on the QRB5165. This is best illustrated through `voxl-tflite-server`, our service for on-device inference of [LiteRT](https://ai.google.dev/edge/litert) (formerly TensorFlow Lite) models. Current releases build against LiteRT/tflite 2.17.1 and target QRB5165-based platforms (VOXL 2 and VOXL 2 Mini); the original VOXL 1 is no longer supported by new releases. ![voxl-tflite-yolo](/images/voxl-sdk/voxl-tflite-server/voxl-tflite-yolov5.png) ## Configuration `voxl-tflite-server` reads its configuration from `/etc/modalai/voxl-tflite-server.conf`, generated and edited by the `voxl-configure-tflite` tool. Run it with no arguments to get an interactive wizard with presets for every bundled model (plus a "Custom" option that prompts for every parameter), or pass flags to script it: ```bash voxl-configure-tflite # interactive wizard voxl-configure-tflite --model-path /usr/bin/dnn/yolov11n_float16.tflite \ --model-arch YOLOV11 --norm-type HARD_DIVISION \ --label-path /usr/bin/dnn/coco_labels.txt \ --input-pipe /run/mpa/hires_small_color/ --delegate gpu \ --output-prefix yolo --skip-frames 0 ``` Config file parameters: | Parameter | Default | Meaning | |-----------|---------|---------| | `model` | `/usr/bin/dnn/...` | path to the `.tflite` model file | | `model_architecture` | `MOBILE_NET` | how to interpret the model's output tensors. One of `MOBILE_NET`, `MOBILE_NET_CLASSIFIER`, `YOLOV5`, `YOLOV8`, `YOLOV11`, `EFFICIENT_NET`, `POSENET`, `FAST_DEPTH`, `DEEPLAB`. An unrecognized value exits at startup. | | `norm_type` | `PIXEL_MEAN` | input normalization: `PIXEL_MEAN` scales to [-1,1], `HARD_DIVISION` to [0,1] (used by the YOLO family), `NONE` leaves [0,255]. A wrong value doesn't error — it silently degrades accuracy. | | `requires_labels` | `true` | whether the model needs a labels file | | `labels` | `/usr/bin/dnn/coco_labels.txt` | path to the labels file | | `input_pipe` | `/run/mpa/hires_small_color/` | full path of the camera pipe to consume. The wizard enumerates live camera pipes on your system to choose from. | | `delegate` | `gpu` | hardware acceleration: `gpu` (float16 models), `nnapi` (quantized int8/uint8 models; automatically selects the best accelerator), or `cpu` (XNNPACK, multi-threaded). If a delegate fails to apply, the server prints an error and falls back to plain CPU. | | `skip_n_frames` | — | frames to skip between inferences. For a 30Hz input, 5 gives ~5Hz output; 0 processes every frame. | | `allow_multiple` | `true` | allow multiple server instances; output pipes get the `output_pipe_prefix` prepended | | `output_pipe_prefix` | `mobilenet` | prefix for this instance's output pipes | ## Output With the default configuration (`allow_multiple` true, prefix `mobilenet`), the overlay stream is published at `/run/mpa/mobilenet_tflite` — in general `_tflite`. Set `allow_multiple` to `false` to get the un-prefixed names `tflite` / `tflite_data`, which some consumers expect. The stream is a normal camera pipe: view it with [voxl-portal](/voxl-portal/), convert to ROS with [voxl_mpa_to_ros](/ros-installation-voxl2/), or log it with [voxl-logger](/voxl-logger/). Each model provides a task-specific overlay, with an fps counter and inference timer in the top left. ![voxl-portal-tflite](/images/voxl-sdk/voxl-tflite-server/voxl-portal-tflite-multiview.png) Object-detection models additionally publish `_tflite_data`, a metadata pipe with one struct per detection: ```c // struct containing all relevant metadata to a tflite object detection typedef struct ai_detection_t { uint32_t magic_number; int64_t timestamp_ns; uint32_t class_id; int32_t frame_id; char class_name[BUF_LEN]; char cam[BUF_LEN]; float class_confidence; float detection_confidence; float x_min; float y_min; float x_max; float y_max; } __attribute__((packed)) ai_detection_t; ``` The detection pipe also accepts a runtime control command: send `set_cam ` to it to switch the input camera on the fly without restarting the server. Useful flags when running the server by hand: `-d` (debug output), `-t` (per-stage timing breakdown), `-p ` (use an alternate config file — this is how multiple instances run), `-c` (load config and exit). ## Benchmarks Stats were collected across 5000 inferences, using the hires [640x480x3] camera as input, on an older tflite runtime — treat them as relative guidance rather than current absolutes. Current releases pipeline pre-processing, inference, and post-processing on separate threads, so end-to-end throughput is higher than single-pass numbers suggest. | Model | Task | Avg Cpu Inference(ms) | Avg Gpu Inference(ms) | Avg NNAPI Inference(ms) | Max Frames Per Second(fps) | Input Dimensions | Source | |------------------------------|------------------|-----------------------|-----------------------|-------------------------|----------------------------|------------------|-----------------------------------------------------------------------------------------------------------------------------| | MobileNetV2-SSDlite | Object Detection | 33.89ms | 24.68ms | 34.42ms | 34.86750349 | [1,300,300,3] | [link](http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz) | | EfficientNet Lite4 | Classifier | 115.30ms | 24.74ms | 16.42ms | 48.97159647 | [1,300,300,3] | [link](https://tfhub.dev/tensorflow/lite-model/efficientnet/lite4/uint8/2) | | FastDepth | Monocular Depth | 37.34ms | 18.00ms | 37.32ms | 45.45454546 | [1,320,320,3] | [link](https://github.com/PINTO0309/PINTO_model_zoo/tree/main/146_FastDepth) | | DeepLabV3 | Segmentation | 63.03ms | 26.81ms | 61.77ms | 32.45699448 | [1,321,321,3] | [link](https://github.com/PINTO0309/PINTO_model_zoo/tree/main/020_edgetpu-deeplab) | | Movenet SinglePose Lightning | Pose Estimation | 24.58ms | 28.49ms | 24.61ms | 34.98950315 | [1,192,192,3] | [link](https://tfhub.dev/google/lite-model/movenet/singlepose/lightning/tflite/float16/4) | | YoloV5 | Object Detection | 88.49ms | 23.37ms | 83.87ms | 36.53635367 | [1,320,320,3] | [link](https://github.com/PINTO0309/PINTO_model_zoo) | | MobileNetV1-SSD | Object Detection | 19.56ms | 21.35ms | 7.72ms | 85.324232082 | [1,300,300,3] | [link](https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip) | | MobileNetV1 | Classifier | 19.66ms | 6.28ms | 3.98ms | 125.313283208 | [1,224,224,3] | [link](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tgz) | Newer YOLOv8 and YOLOv11 models ship with the server (`/usr/bin/dnn/yolov8n_float16.tflite`, `yolov11n_float16.tflite`) and are the recommended starting point for object detection. ## Custom Models You do **not** need to modify or rebuild `voxl-tflite-server` to run your own model, as long as its outputs match one of the supported architectures (`model_architecture` above). The workflow is: convert your model to `.tflite`, copy it to the target, and point the config at it. ### 1. Convert your model to LiteRT **YOLO (Ultralytics)** — export directly to TFLite; no frozen graph is involved (Ultralytics no longer produces one): ```python from ultralytics import YOLO YOLO("best.pt").export(format="tflite") # produces best_saved_model/best_float16.tflite ``` Under the hood this goes PyTorch → ONNX → [onnx2tf](https://github.com/PINTO0309/onnx2tf) → TFLite. Our [voxl-train-yolov8](https://gitlab.com/voxl-public/support/voxl-train-yolov8) repo provides a complete training + export environment with working dependency pins (notably `onnx2tf>1.17.5,<=1.22.3`). **TensorFlow models** — use the modern converter on a SavedModel or Keras model: ```python import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model("path/to/saved_model") converter.target_spec.supported_types = [tf.float16] # float16 for the gpu delegate tflite_model = converter.convert() open("model_float16.tflite", "wb").write(tflite_model) ``` **Other PyTorch models** — export to ONNX first, then convert with [onnx2tf](https://github.com/PINTO0309/onnx2tf), or use [Qualcomm AI Hub](https://aihub.qualcomm.com/) with the 'RB5 (Proxy)' device. Quantization determines which delegate you can use: float16 models for `gpu`, full-integer (int8/uint8) models for `nnapi`. ### 2. Deploy — no code changes 1. Copy your `.tflite` (and labels file, if applicable) to `/usr/bin/dnn/` on target. 2. Run `voxl-configure-tflite`, choose **Custom - specify all parameters manually**, and supply the model path, architecture, normalization type, labels, input pipe, and delegate (or pass the equivalent flags shown in [Configuration](#configuration)). 3. Restart the service: `systemctl restart voxl-tflite-server`. The input tensor size is read from the model automatically, and camera frames are resized and color-converted for you. YOLO-family models use `norm_type` `HARD_DIVISION`. ### 3. Only for genuinely new output layouts — extend the server If your model's output tensors don't match any supported architecture, add one: a new enum in `include/model_helper/model_info.h`, a mapping in `get_model_type()` in `src/main.cpp`, a case in `create_model_helper()` in `src/model_helper/model_helper.cpp`, and a `ModelHelper` subclass (under `include/model_helper/` and `src/model_helper/`) overriding `post_process()` and `worker()` — `preprocess()` and `run_inference()` have generic base implementations you can usually keep. The existing helpers (YOLOv11 simply reuses the YOLOv8 helper) are good templates. To surface your model as a wizard preset, add an entry in `scripts/voxl-configure-tflite-wizard` and the architecture to the bash completion. ## Running Multiple Models The wizard supports this directly: run `voxl-configure-tflite`, and when asked how many instances to configure, answer 2 or more. It writes one config per instance (`/etc/modalai/voxl-tflite-server_2.conf`, …) with distinct `output_pipe_prefix` values and updates the systemd service to launch each instance with `-p `. Each instance publishes under its own prefix (e.g. `/run/mpa/yolo_tflite`, `/run/mpa/depth_tflite`). > The board heats up much quicker when running multiple models. Adding an external fan when benchtop testing helps combat the extra heat. ## Current Limitations Limitations of the current implementation: - **Only the `model_architecture` values listed above are supported.** YOLO support means **v5, v8, and v11** (v11 shares the v8 decoder). A model with any other output layout requires [extending the server](#3-only-for-genuinely-new-output-layouts--extend-the-server) in C++. - **Detection thresholds are compile-time constants**, not configurable: SSD/MobileNet score 0.6; YOLOv5 box 0.40 / class 0.20 / NMS 0.50; YOLOv8/v11 score 0.45 / confidence 0.25 / NMS 0.5. Changing them means rebuilding. - **One model and one camera per server instance.** Run more models with multiple instances (see above). Switching cameras at runtime (`set_cam` on the control pipe) works for object-detection models only. - **Camera input formats: YUV and RAW8** (stereo variants use the left frame). RGB pipes are not handled without a code change. Frames above 4K are rejected, the input resolution is locked at the first frame (which is itself skipped while building the resize map), and mid-stream resolution changes are not supported. - **Model input dtype must be float32, int8, or uint8** — and quantized inputs receive raw image bytes with no scale/zero-point handling. In practice: **export custom models as float16 and run the `gpu` delegate**; that is the tested path. - **Inference pauses when nothing consumes the output pipes** (a power optimization). If you're testing over `adb` with no portal or inspect tool attached, it will look dead — attach a consumer, or run with `-d`/`-t` which disables the optimization. - **Delegates fail soft**: if the requested delegate can't apply (or the name is unrecognized), the server quietly runs on CPU — check the startup output. There is no Hexagon delegate; `nnapi` picks its accelerator automatically. - The service is capped at 4 GB RAM by systemd and drops frames under backpressure rather than queueing. - Use the **short CLI flags** (`-d` debug, `-t` timing, `-p `); the long-form flags are currently miswired. - Supported platform: the QRB5165 family (VOXL 2 / VOXL 2 Mini). ## Troubleshooting For general service debugging see [Debugging Services](/debugging-services/). **Custom model runs but produces no detections.** Triage: 1. Stop the service and run the server in the foreground: `systemctl stop voxl-tflite-server`, then `voxl-tflite-server -d`. 2. If the output repeats `Error in TensorData: should not reach here`, your model's **output tensor dtype doesn't match what the server expects** — this is a model-export problem, not a labels problem. Re-export **unquantized** (float16) following [voxl-train-yolov8](https://gitlab.com/voxl-public/support/voxl-train-yolov8), and use the `gpu` delegate. 3. Verify detections flow with `voxl-inspect-detections tflite_data -a` (add your `output_pipe_prefix` if set) and visually in [voxl-portal](/voxl-portal/). If the overlay stream never appears in portal at all, the server failed at startup — read the foreground output. 4. A missing labels file exits the server at startup; a labels file with fewer entries than the model has classes shows numeric class ids instead of names. **The board reboots when the server runs.** Almost always **power delivery, not software**: viewing tflite output kicks off real inference, the CPU/GPU load spikes, and a worn power-cable contact browns out the board. Replace the 4-pin power cable between VOXL 2 and its power source (repeated unplugging loosens the contacts — a "wiggle fix" is temporary and makes it worse). A true kernel panic reboots into recovery mode, which distinguishes it from a power reset. **Building from source fails.** The `install_build_deps.sh` branch argument must match the SDK branch of the source you checked out — `./install_build_deps.sh qrb5165 sdk-1.4` for the sdk-1.4 branch, `dev` only for tip-of-tree — and the required voxl-cross image version tracks the branch (current master needs voxl-cross ≥ 4.3). Mismatched deps produce compile/link errors deep in TensorFlow. **Not supported**: custom YOLOv5 training assistance, RTSP streams as server input (MPA camera pipes only), and cropping/resizing inside the server — produce an appropriately-sized stream from [voxl-camera-server](/voxl-camera-server/) instead (e.g. a small or MISP stream). ## Demo ## Source Source code is available on [GitLab](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tflite-server) ## Frequently Asked Questions (FAQ) **I want to use my Python script to pre/post-process inputs/outputs to the model, how can I do this?** The inputs and outputs for the model are both done using `libmodal-pipe` which only supports C/C++ and so there isn't a way to directly interface with Python. However, it's possible to use `libmodal-pipe` to create a very simple wrapper which consumes from a pipe, runs a Python executable, and then passes information along to another pipe. In the `libmodal-pipe` repo check out the [examples](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/examples) dir for an example of setting up a basic pipe interface on VOXL. **Why is my model predicting less accurately when deployed on VOXL?** The most common cause is a wrong `norm_type` — it fails silently and just degrades results; check what normalization your model was trained with. Beyond that, `voxl-tflite-server` does its own pre/post-processing on the image tensors which may differ from your local pipeline, and quantization can reduce accuracy versus the non-quantized original. --- Source: https://docs.modalai.com/voxl-mapper/ # VOXL Mapper The voxl-mapper package provides a way to map and plan through indoor environments. It enables 3D volumetric mapping via onboard sensors and allows for path planning in both known and unknown environments. The best platform to run voxl-mapper is Starling 2 [Source Code](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mapper) > VOXL Mapper is provided as a reference package for users to better understand how such a system would fit within the VOXL ecosystem. Make sure you are following all proper safety protocols before attempting autonomous flight. ModalAI is NOT responsible for any damages caused during the use of VOXL Mapper. --- Source: https://docs.modalai.com/setting-up-voxl-mapper/ # Setting up VOXL Mapper --- ## Starting voxl-mapper voxl-mapper ships with a systemd service that runs `/usr/bin/voxl-mapper`. Enable and start it with: ```bash systemctl enable --now voxl-mapper ``` For testing, voxl-mapper can instead be run manually in the foreground with the following options: | Option | Description | |---|---| | `-c`, `--config` | load the config file only, for use by the config wizard | | `-d`, `--debug` | run in debug mode | | `-t`, `--timing` | run in timing mode, printing how long each step takes | | `-h`, `--help` | print the help message | > voxl-portal is a package dependency of voxl-mapper, so it is always installed alongside it. The Mapper tab only appears in VOXL Portal when voxl-mapper is installed. --- ## Flying with VOXL Mapper ### Confirm VOXL Vision Hub is correctly setup VOXL Mapper heavily relies on [voxl-vision-hub](/voxl-vision-hub/) and the VIO system. As such, it is important that you have correctly setup both of these before attempting to run voxl-mapper. Setup for voxl-vision-hub can be found here [Flying with VIO](/flying-with-vio/): ### Confirm Figure Eight Offboard Mode is working Prior to running any of the planning capabilities it is important to ensure that the figure eight offboard mode is working correctly. A short guide on enabling figure eight mode can be found here: [Offboard Figure Eight Mode](/voxl-vision-hub/) ### Set Offboard Mode to trajectory In order for voxl-mapper to be able to command the robot to move along the desired trajectory, the offboard mode must be changed. In the `/etc/modalai/voxl-vision-hub.conf` configuration file ensure that the offboard mode parameter is set to trajectory: ```json "offboard_mode": "trajectory", ``` ### Take off in Position Mode It is safer to take off in position flight mode than it is to flip to this mode mid-flight from manual flight mode. The quadcopter should take off straight up and be much easier to control when in position flight mode. Be ready to flip back to manual mode should anything go wrong. It is safer to flip to manual mode and land than to kill the motors mid-flight. Killing the motors mid-flight may result in the propellers loosening from the reverse-torque and flying straight up off the quadcopter. Only kill the motors after landing and spooling down the motors OR in a serious emergency. ### Change to Offboard Mode While flying in position mode, make sure the quadcopter is hovering comfortably before changing the flight mode to offboard mode. The quadcopter should hold its position. In offboard mode the two joysticks on the RC controller are ignored and the PX4 follows any commands given to it by VOXL over the UART link. In this case VOXL will wait for a plan from voxl-mapper. --- Source: https://docs.modalai.com/interacting-with-voxl-mapper/ # Interacting with VOXL Mapper --- ## Interacting with VOXL Mapper through VOXL Portal ### Viewing the map In VOXL Portal, select the map tab to interact with voxl-mapper. VOXL Portal has two options for viewing. A 2D view which will show the distances to objects for a given height (this view represents a slice through the 3D map at the specified height). There is also a 3D view which will show the mesh of the surrounding area. ### Sending a Plan Select `Plan to a Point` and click anywhere on the map. A point will appear at a height of 0. Use the arrows to drag the point to your desired location. Next, select `Go` to create a plan to that point. Once a plan is found, press the `Follow Path` button at the bottom of the page to tell the robot to follow the path. You may press `Abort` at anytime to stop the robot from moving. Please adhere to the safety messages before allowing the robot to fly autonomously. Alternatively, you can press `Plan Home` to have the robot plan to its home position. Home will always be 1.5m above the (0, 0) location. ### Saving and Loading Maps Within the map view of VOXL Portal, there are options for `Save Map` and `Load Map`. To save a map, select `Save Map`, optionally enter a directory path for the files to be saved at (defaults to /data/voxl-mapper/), and choose a mesh format to save from the radio options. The files that will be saved are: esdf_map, tsdf_map, mesh.(depending on file type you select), with the esdf and tsdf maps used by voxl-mapper and the mesh as an export tool. For loading maps, simply select `Load Map` and optionally enter a directory path for the files to be loaded from (default again is /data/voxl-mapper). ### Mesh Api VOXL Portal also serves an Api to directly grab the mesh data in one of four file formats: .ply, .obj, .gltf, or .esdf. To use this Api, simply fetch /mesh_api/, where format can be any of the supported file extensions without the . (ply, obj, gltf, esdf). Example: fetch(192.168.8.1/mesh_api/gltf) ### Other Controls Alongside planning and map saving/loading, the Mapper tab provides: - `Download Map` — download the mesh directly in your browser in the chosen format - `Clear Map` — clear the current map - `Reset VIO` — reset the VIO estimator - `Clear Paths` — remove planned paths from the view - `Position`, `Debug Pointcloud`, and `Debug ESDF` toggles for visualizing the robot position and the raw data behind the map - `Orbit Control`, `Fly Control`, and `FPV Mode` camera modes for navigating the 3D view - A height slider in the 2D costmap view to select the height of the map slice - A camera stream overlay for displaying a live camera feed on top of the map view --- Source: https://docs.modalai.com/improving-performance/ # Improving VOXL Mapper's performance --- ## Improving Mapping ### Parameter tweaks The mapping performance heavily depends on the set parameters. Below is a quick description of a few key parameters that help to speed up mapping and reduce its computational load. These parameters can be found in the mapper config file `/etc/modalai/voxl-mapper.conf` `voxel_size`: Side length of a voxel within the map (in metres). Reducing this number will give higher resolution maps but will greatly increase computational load. Default: 0.10. `esdf_max_distance`: The maximum distance to which the Euclidean Signed Distance Field (ESDF) will be calculated (in metres). The ESDF is a 3D map that returns the distance to the closest obstacle for any position within it. The ESDF is mainly used for planning. If you are only using VOXL mapper for mapping you can set this parameter to a very small number. Default: 2.0. Up to four TOF inputs can be configured in the same file via per-sensor pipe, enable, rate, and extrinsics keys (`tof_pipe_0` and `tof_1_pipe`/`tof_2_pipe`/`tof_3_pipe`, plus `tof_N_enable`, `tof_N_rate`, and `tof_extrinsics_N_name` for N = 0-3). ## Improving Planning ### Parameter tweaks The planning performance can be improved by altering a few parameters. Below is a quick description of the parameters that will have the greatest effect. `voxel_size`: Side length of a voxel within the map (in metres). If this number is very small the local planning will be slower as it has to search through more voxels. `rrt_min_distance`: The length of an edge in the RRT Tree used in the planner. A larger number allows the planner to search faster but will limit its ability to squeeze through smaller gaps. > When using the planning capabilities, ensure that the following parameters are set correctly: `robot_radius`: Radius of your robot (in metres). Default: 0.35. `esdf_max_distance`: The maximum distance to which the Euclidean Signed Distance Field (ESDF) will be calculated (in metres). This should be set to a value larger than the robot radius. `esdf_default_distance`: For unobserved voxels or voxels further from obstacles than `esdf_max_distance` this is the value that the ESDF will return. A good rule of thumb is to set this to the same value as `esdf_max_distance`. Default: 1.0. > `treat_unknown_as_occupied` defaults to 0, so by default the planner will plan paths through space that has not been mapped yet. Set it to 1 to forbid planning through unknown space. ### Planner and trajectory defaults The planner and trajectory keys ship with the following defaults: | Key | Default | |---|---| | `loco_optimize_time` | 1 | | `loco_v_max` | 1.0 | | `loco_a_max` | 2.0 | | `loco_yaw_rate_max` | pi/4 | | `loco_sampling_dt` | 0.1 | | `loco_resample_visibility` | 0 | | `rrt_goal_threshold` | 0.05 | | `rrt_prune_iterations` | 100 | --- Source: https://docs.modalai.com/voxl-elrs/ # voxl-elrs ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/badges/release.svg?key_text=Latest Release&key_width=100) ## Overview [ExpressLRS (ELRS)](https://www.expresslrs.org/quick-start/getting-started/) is a completely open, high-refresh, long-range radio control link using the CRSF protocol. `voxl-elrs` is ModalAI's tool for managing ELRS radios attached to VOXL: verifying the link, binding, flashing firmware, reading and writing receiver parameters, mapping PWM outputs, and applying whole configurations automatically by [SKU](/sku/). > `voxl-elrs` was rewritten as a compiled CLI in version 1.0.0. The old Python tool and its interactive wizard (`voxl-elrs -w`) no longer exist, and several old flags changed meaning (`-b` is now `--baud`, not `--bind`; `-p` is now `--port`, not `--setid`). If you are following instructions that mention the wizard, `--scan`, or `/etc/modalai/voxl-elrs.conf`, they predate the rewrite — the current equivalents are all on this page. ### Supported hardware Firmware bundled with `voxl-elrs` (currently ELRS 3.5.3.x) covers: | Device | Role | Notes | |--------|------|-------| | ModalAI M0184 | Receiver | see [M0184](/M0184/) | | ModalAI M0193 | Transmitter (a receiver build is also bundled) | | | BetaFPV Nano 900MHz | Receiver | | | ModalAI M0220 | Transceiver | different update mechanism (MRC bundles) — see [M0220](/M0220/) and [Firmware — M0220](#firmware--m0220-mrc-bundles) below | In theory any ELRS-compatible receiver can be talked to over CRSF, but bind/PWM/preset functionality depends on ModalAI firmware modifications. To see exactly what firmware your installed version bundles, run `voxl-elrs list-firmware` on target. ### Transmitter compatibility The ELRS version the transmitter must run depends on which ModalAI radio is installed on the vehicle: - **M0184 receiver:** the bundled receiver firmware is ELRS 3.x, so the transmitter module must run ELRS v3. Transmitters on ELRS 4.x cannot bind to the M0184 and must be downgraded to the latest 3.x release using the standard [ExpressLRS transmitter update process](https://www.expresslrs.org/quick-start/transmitters/updating/). The transmitter must also be a 900 MHz or dual-band module operating in the low band. 2.4 GHz-only modules, for example the internal ELRS module of the Radiomaster Boxer, cannot bind to the M0184. See [M0184 transmitter compatibility](/M0184/#transmitter-compatibility). - **M0220 transceiver:** compatible with ELRS v4+ devices by default; operation with ELRS v3 devices is experimental. See the [M0220 page](/M0220/). ### Installation `voxl-elrs` ships with the VOXL SDK, and can be installed on VOXL or any Debian/Ubuntu machine with the [ModalAI package repository](/configure-pkg-manager/) configured: ```bash sudo apt install voxl-elrs ``` Bash completion is included; `voxl-elrs version` prints the git version and which transports/APIs were compiled in — useful first diagnostic when reporting issues. ## Ports and Transports By default `voxl-elrs` uses `--port auto`: when `voxl-px4` is running it talks over the MPA pipe (`mpa:crsf_raw`) so it can coexist with the autopilot, otherwise it opens the radio UART (`qup7`) directly. Override with `-p`: ```bash voxl-elrs ping # auto port selection voxl-elrs -p qup7 ping # explicit VOXL 2 radio UART voxl-elrs -p /dev/ttyUSB0 ping # USB serial adapter on a host PC voxl-elrs -p mpa:crsf_raw ping # explicit MPA pipe ``` `-b/--baud` overrides the serial baud rate (default 420000). Three passthrough modes exist for radios that aren't wired directly to VOXL, all requiring an explicit `/dev/...` port: - `-B/--betaflight` — receiver behind a Betaflight flight controller: sets up serial passthrough (the Betaflight configurator must be disconnected). Passthrough persists until the FC power cycles. - `-E/--edgetx` — internal TX module in an EdgeTX handset connected via USB (Serial/VCP mode). - `-T/--tx` — talk directly to a TX module's CRSF UART (TX addressing and TX default baud). For flashing across a bootloader that runs at a different baud than the app, add `--boot-baud ` (e.g. `-b 420000 --boot-baud 921600`). ## Verify the Link Always start with `ping` — it prints the device name, serial, hardware/firmware ID, and parameter count: ```bash voxl2:/$ voxl-elrs ping ``` If the device doesn't respond, check the wiring and the [ELRS LED status](https://www.expresslrs.org/quick-start/led-status/) of the receiver. ## Binding ```bash voxl-elrs bind # put the connected receiver into bind mode voxl-elrs unbind # unbind a bound transmitter ``` Receiver and transmitter must be on the same major ELRS version to bind (3.x with current firmware). A binding phrase can instead be set through the SKU preset system or [voxl-portal](/voxl-portal/), which converts the phrase to a UID and writes it to the receiver. `bind` and `unbind` aren't special cases: any command parameter the receiver exposes over CRSF can be invoked by name the same way. Use `enumerate` to see everything the device offers, and `get-param ` / `set-param ` to read and write individual parameters. `get-rc`, `get-link-stats`, and `failsafe` are also available for checking RC input, link quality, and failsafe behavior. ## Firmware Updates For M0184 / M0193 / BetaFPV devices, firmware ships on-target under `/usr/share/modalai/voxl-elrs/firmware`: ```bash voxl-elrs list-firmware # what's bundled, per target voxl-elrs update # auto-detect device, flash if out of date voxl-elrs update --target MODALAI_M0184_RX # skip device detection ``` `update` stops `voxl-px4` if it's running (to free the UART), flashes over XMODEM (ModalAI targets) or esptool (ESP targets), and restarts the autopilot after. The `--target` form is also the recovery path for a receiver that no longer responds to detection. `upload-firmware [xmodem|esp]` flashes an arbitrary firmware file — for firmware built yourself with the [ExpressLRS Configurator](/elrs-configurator/). ### Recovering a bricked ESP receiver Manually enter the bootloader: power off, hold the boot button, power on while holding it for a second. Then flash directly with esptool: ```bash python3 -m esptool --port /dev/slpi-uart-7 --chip ESP8266 --baud 115200 \ --before no_reset --after soft_reset write_flash 0x00 ``` ![Bootloader button](/images/voxl-sdk/voxl-elrs/elrs_recover_1.jpg) ### Firmware — M0220 (MRC bundles) The M0220 uses a different update mechanism: MRC bundles staged over MAVLink FTP, with an A/B bootloader so a failed update is non-bricking. ```bash voxl-elrs -p /dev/ttyUSB0 update-mrc ``` Expect 6–10 minutes plus a reboot; add `-E` when updating through an EdgeTX handset. The M0220's web UI is an alternative update path. Full details on the [M0220 page](/M0220/). ## PWM Outputs For receivers with PWM output pins (M0184 and M0193: 4 pins), three commands manage the channel mapping: ```bash voxl-elrs pwm-map 0 # decode and plot pin 0's current mapping voxl-elrs pwm-map-set 0 1 50 1500 # set pin 0 map point 1: 50% input -> 1500us out voxl-elrs pwm-map-tune 0 # interactive editor for pin 0 ``` `pwm-map-set` accepts `--mode off|step|interp` and `--yes` to skip confirmation. Outputs flagged as arm-gated in the receiver firmware only drive once armed — `voxl-elrs arm`, `disarm`, and `get-arm-status` control that gate. ## SKU Presets — Automatic Configuration Receiver configuration (PWM maps, binding phrase, LED behavior, and other parameters) is managed as JSON presets under `/usr/share/modalai/voxl-elrs/config`, matched by regex against the vehicle's [SKU](/sku/): ```bash voxl-elrs list-presets # everything on disk voxl-elrs list-presets-for-sku # what applies to a given SKU voxl-elrs get-merged-preset # the fully merged result voxl-elrs configure-sku # apply presets matching this vehicle's SKU voxl-elrs configure # update firmware first, then configure-sku ``` `voxl-elrs configure` is what [voxl-configure-mpa](/voxl-configure-mpa/) runs during SDK installation on ELRS-equipped SKUs, so a freshly configured vehicle comes up with the right receiver firmware and settings automatically. Individual presets can be inspected and applied with `load-preset ` and `preset-get`, and whole device configurations exported/imported with `save-json` / `load-json`. ## Wiring ### BetaFPV Nano RX ![BetaFPV Nano RX Wiring Diagram](/images/voxl-sdk/voxl-elrs/BetaFPV_wiring.png) For ModalAI radios, see the wiring sections of the [M0184](/M0184/) and [M0220](/M0220/) pages. ## Tips - Receiver and transmitter must share the same ELRS major version to bind. - The receiver's LED blink pattern tells you its state — see [the ELRS LED status page](https://www.expresslrs.org/quick-start/led-status/). - `voxl-elrs update` compares versions before flashing; if you run custom receiver firmware, avoid plain `update` (it will overwrite you) and use `upload-firmware` or `update --target` deliberately. - General ELRS background lives at the [ELRS quickstart](https://www.expresslrs.org/quick-start/getting-started/). --- Source: https://docs.modalai.com/voxl-remote-id/ # Remote ID --- # Introduction ## Video Quickstart ## Summary The [voxl-remote-id](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-remote-id) is a VOXL SDK based service that be used to facilitate remote ID compliance on VOXL2 only. There are various use cases and radio types depending one end user requirements, thus there are multiple use cases captured below. ![voxl-remote-id-use-case-1](/images/voxl-sdk/voxl-px4/voxl-remote-id-use-case-1.png) ## Supported PX4 Versions ### QRB5165 (VOXL 2) `voxl-remote-id` requires `voxl-px4` 1.12.30 or newer to function on the QRB5165 based platforms. ## How to Enable/Disable The PX4 parameter `COM_PREARM_ODID` can be used to enable or disable the remote ID pre-arm check by developers. - When `COM_PREARM_ODID` is `0`, the remote ID pre-arm check is disabled and the pilot can arm the vehicle regardless of the remote ID status. - When `COM_PREARM_ODID` is `1`, the remote ID pre-arm check is enabled and the pilot can not arm the vehicle unless there's a valid remote ID status. For final product requiring remote ID, you would want to remove the parameter and hardcode the check on. ## Support Use Cases | ID | Flight Controller | Radio | Reference | Status | |--- |------------------- |--------------|---------- |--------- | | 1 | VOXL 2 | WiFi, SoftAP | Sentinel | in beta | | 2 | VOXL-Flight, VOXL + FC | WiFi, SoftAP | M500 | in beta | Please send use case requests [here](https://forum.modalai.com/category/29/feature-requests)! # User Guide ## Beta Release Limitation - Install Package ### Online Install The `voxl-remote-id` is currently available for beta testing. Locate the latest `voxl-remote-id` package from: - QRB5165: http://voxl-packages.modalai.com/dists/qrb5165/dev/binary-arm64/ While connected to the internet, run the following, as an example to install `voxl-remote-id_0.0.5-202210140144_arm64.deb` ```bash adb push voxl-remote-id_0.0.5-202210140144_arm64.deb /home adb shell cd /home dpkg -i voxl-remote-id_0.0.5-202210140144_arm64.deb ``` See: ## Use Case 1 - VOXL Wi-Fi SoftAp ### Summary - Vehicle advertises remote ID data via Wi-Fi beacons using vehicle in SoftAP mode - PX4 runs on VOXL 2 or an external flight controller (VOXL-Flight) - `voxl-remote-id` runs on the applications processor of VOXL/VOXL2 and a hostapd based service facilitate beacon comms - a GPS fix is provided from PX4 to `voxl-remote-id` to send out in ![voxl-remote-id-use-case-1](/images/voxl-sdk/voxl-px4/voxl-remote-id-use-case-1.png) ### Requirements Hardware: - VOXL 2 (Sentinel reference drone) - Add on board supporting USB (like [M0151](/m0151/)), with MCBL-00009 - Wi-Fi dongle (Alpha Networks AWUS036ACS used for test) - or VOXL-Flight (M500 reference drone, built in WiFi) - GPS unit (Holybro M9N GPS used for test) with a GPS fix (fix_type > 2) Software: - Platform Release 1.0 or newer (available for beta test in 0.9 with limitation noted below) - `voxl-mavlink-server`, `voxl-px4` configured and running Visualization Tools: - QGroundControl v4.2 or newer - Android device with [OpenDroneID OSM](https://play.google.com/store/apps/details?id=org.opendroneid.android_osm&hl=en_US&gl=US) application installed ### Network Setup #### Enter SoftAP Mode for Beacon Broadcasting To create a SoftAP network to enable broadcasting with SSID name `remoteId` and password `1234567890`, run the following: ```bash voxl-wifi softap remoteId 1234567890 ``` #### Connect Ground Station to SoftAP Connect you groundstation machine to the network above. Obtain the IP address from your machine. #### Update conf file Update `/etc/modalai/voxl-vision-px4.conf` with the IP address above in `qgc_ip` in the file. #### Open QGroundControl Open QGroundControl and confirm you have a telemetry connection. ### voxl-px4 Configuration #### Beta Release Limitation - Enable using PX4 Parameter Set the `COM_PREARM_ODID` value to `1` to enable the check. ``` voxl2:/$ px4-param set COM_PREARM_ODID 1 COM_PREARM_ODID: curr: 0 -> new: 1 ``` If you have a QGC connection open, you will see this if attempting to arm now without completing the remainder of the guide. ![voxl-px4](/images/voxl-sdk/voxl-px4/voxl-remote-id-prearm-error-1.jpg) ### Enable voxl-remote-id Run the `voxl-configure-remote-id` command to open the configuration wizard. *Note: see installation note above if command not found* *Note: beta Release Limitation, the `operator registration ID` is not used.* ``` voxl2:/$ voxl-configure-remote-id Starting Wizard Do you want to reset the config file to factory defaults? 1) yes 2) no #? 1 wiping old config file INFO: Writing new configuration file to /etc/modalai/voxl-remote-id.conf Do you want to enable the voxl-remote-id service 1) yes 2) no #? 1 Now we are going to do a preliminary configuration of /etc/modalai/voxl-remote-id.conf Please enter your operator registration ID Some regulations require operators to include their operator id in the remote ID packets. If the rule in your area doesn't require this, you can press enter to leave this option empty enabling voxl-remote-id systemd service Created symlink /etc/systemd/system/multi-user.target.wants/voxl-remote-id.service → /etc/systemd/system/voxl-remote-id.service. starting voxl-remote-id systemd service Done configuring voxl-remote-id ``` ### Check voxl-remote-id Status Run the following `systemctl status voxl-remote-id` ``` voxl2:/$ systemctl status voxl-remote-id ● voxl-remote-id.service - voxl-remote-id Loaded: loaded (/usr/bin/voxl-remote-id; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-09-06 03:22:58 UTC; 18s ago Main PID: 2541 (voxl-remote-id) Tasks: 5 (limit: 4915) CGroup: /system.slice/voxl-remote-id.service └─2541 /usr/bin/voxl-remote-id Sep 06 03:22:58 m0054 systemd[1]: Started voxl-remote-id. Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: SN: 1814C819434028 Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: Attempting to Connect to hostapd: /data/misc/wifi/hostapd/wlan0 Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: Connected to hostapd: /data/misc/wifi/hostapd/wlan0 Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: Connected to voxl-mavlink-server Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: Detected PX4 Mavlink SYSID 1 Sep 06 03:22:58 m0054 voxl-remote-id[2541]: INFO: Remote ID is active ``` ### Validate GPS To get GPS status and confirm `fix_type > 2`, run the following: - VOXL2, run `px4-listener sensor_gps` - VOXL1, run `voxl-px4-shell listener sensor_gps` For example: ``` px4-listener sensor_gps TOPIC: sensor_gps sensor_gps_s timestamp: 171195446 (0.087693 seconds ago) time_utc_usec: 0 lat: 327783759 lon: -1170410696 alt: 159712 alt_ellipsoid: 125966 s_variance_m_s: 0.3480 c_variance_rad: 2.8493 eph: 1.8870 epv: 2.6060 hdop: 0.9900 vdop: 1.6100 noise_per_ms: 105 jamming_indicator: 167 vel_m_s: 0.0600 vel_n_m_s: -0.0180 vel_e_m_s: -0.0570 vel_d_m_s: 0.0780 cog_rad: 0.0000 timestamp_time_relative: 0 heading: nan heading_offset: 0.0000 fix_type: 4 jamming_state: 0 vel_ned_valid: True satellites_used: 10 ``` ### Ready To Arm At this point, the vehicle is broadcasting Wi-Fi Beacons advertising remote ID data, and the vehicle is ready to arm. # Troubleshooting ## Not in SoftAP Mode If you run `systemctl status voxl-remote-id` and see something like this: ``` voxl:/$ systemctl status voxl-remote-id ● voxl-remote-id.service - voxl-remote-id Loaded: loaded (/usr/bin/voxl-remote-id; enabled; vendor preset: enabled) Active: active (running) since Thu 1970-01-01 02:19:30 UTC; 52 years 9 months ago Main PID: 2447 (voxl-remote-id) CGroup: /system.slice/voxl-remote-id.service └─2447 /usr/bin/voxl-remote-id Jan 01 02:19:30 apq8096 systemd[1]: Started voxl-remote-id. Jan 01 02:19:31 apq8096 voxl-remote-id[2447]: INFO: Remote ID SN: 1814C4056553343 Jan 01 02:19:31 apq8096 voxl-remote-id[2447]: INFO: Attempting to Connect to hostapd: /data/misc/wifi/hostapd/wlan0 ``` It means that you need to put the device into SoftAP mode. You can do that with SSID of `remoteId` and password `1234567890`: ```bash voxl-wifi softap remoteId 1234567890 ``` # Developer Guide ## Wireshark ### Soft AP - WiFi Beacons In order to decode Opendrone ID packets in Wireshark, the following was done (on OSX host as example): - Open Wireshark > About > Folders - Locate "Global Configuration" and "Personal LUA Plugins" - Using [this](https://github.com/opendroneid/wireshark-dissector) project, clone into those directories above - On OSX, you need to "disconnect" from any networks to use monitor mode - Now, monitor the WLAN interface to sniff for ODID packets: ![voxl-px4](/images/voxl-sdk/voxl-px4/voxl-remote-id-wireshark.jpg) --- Source: https://docs.modalai.com/voxl-modem/ # voxl-modem ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem/-/badges/release.svg?key_text=Latest Release&key_width=100) ## Overview [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem) The `voxl-modem` package provides software support for the various ModalAI supported modem hardware options, such as: - LTE Modems (Sierra Wireless WP/RC series) - 5G Modems (Quectel, managed via `quectel-CM`, and Sierra EM9X91, managed via `qmicli`) - Microhard Modems - Doodle Labs Modems - DTC Modems (Community Supported) Silvus radios (SKU modem code 33) and plain Ethernet (SKU modem code 34) are not managed by `voxl-modem`. See the [SKU modem table](/sku/) for the full list of modem codes. ## Usage As with most SDK services, `voxl-modem` can be configured and enabled to run on boot using it's configuration script. Usage is as follows: ``` voxl2:/$ voxl-configure-modem -h Config script for voxl-modem voxl-configure-modem enable voxl-configure-modem disable voxl-configure-modem factory_enable voxl-configure-modem doodle voxl-configure-modem doodle-vrx voxl-configure-modem dtc voxl-configure-modem dtc-vrx voxl-configure-modem microhard voxl-configure-modem v2-tmobile voxl-configure-modem v2-usmobile show this help message: voxl-configure-modem help ``` Running `voxl-configure-modem` without providing an argument, will execute a wizard with the following options (on qrb5165-based devices such as VOXL 2): ``` voxl2:/$ voxl-configure-modem Starting interactive mode What type of modem are you using? 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9X91 #? ``` Selecting an option from this menu will trigger more questions catered to that modem type: ``` voxl2:/$ voxl-configure-modem Starting interactive mode What type of modem are you using? 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9X91 #? 5 Are you attempting to connect to ModalLink? (not common) 1) yes 2) no #? 2 Which APN is correct for your SIM card? AT&T - IoT device - APN: m2m.com.attz AT&T - Laptop or Tablet - APN: broadband AT&T - Smartphone - APN: phone T-Mobile - APN: fast.t-mobile.com Verizon - APN: vzwinternet Google Fi - APN: h2g2 US Mobile (Dark Star/Verizon) - APN: ereseller 1) m2m.com.attz 4) fast.t-mobile.com 7) ereseller 2) broadband 5) vzwinternet 8) Custom 3) phone 6) googlefi #? ``` After the APN question you will be asked which region your modem will be used in: ``` Select modem region: 1) Americas 2) Europe/Middle-East/Asia ``` If you select `doodle`, the wizard instead asks for the static IP to use on the Doodle network (default `10.223.0.100`), and then for the network interface the radio is connected to (default `eth1`). The interface choice is written to the `doodle_interface` field of the config file, `udp_mtu` is set to 500 in `/etc/modalai/voxl-mavlink-server.conf`, and the `voxl-modem-doodle` service is enabled. At runtime the interface is auto-detected by driver name, with the configured `doodle_interface` value used as a fallback if no match is found. Going through the `voxl-modem` configuration process will set up a configuration file located at `/etc/modalai/voxl-modem.conf` as well as enable the `voxl-modem` service to run on boot ``` voxl2:/$ cat /etc/modalai/voxl-modem.conf { "modem_type": "quectel", "apn": "h2g2", "world": "false", "microhard_ip": "192.168.168.100", "dtc_ip": "192.168.0.100", "doodle_ip": "10.223.0.100", "doodle_interface": "eth0", "modallink": "false", "placeholder": "hello world" } ``` ``` voxl2:/$ voxl-configure-modem doodle wiping old config file reloading systemd services enabling voxl-modem systemd service Created symlink /etc/systemd/system/multi-user.target.wants/voxl-modem.service → /etc/systemd/system/voxl-modem.service. starting voxl-modem systemd service DONE configuring voxl-modem ``` It is possible to modify this config file manually in some circumstances, but not recommended. ## Tips When checking to see if a modem is enumerated correctly, it can be helpful to check `lsusb` to see if the device has been detected: ``` voxl2:/$ lsusb Bus 002 Device 002: ID 0424:5744 Standard Microsystems Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2740 Standard Microsystems Corp. Bus 001 Device 003: ID 05ac:1402 Apple, Inc. Ethernet Adapter [A1277] Bus 001 Device 002: ID 0424:2744 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ``` Another helpful command is `ifconfig`, which displays the VOXL's network interfaces and their IP addresses: ``` voxl2:/$ ifconfig bond0: flags=5123 mtu 1500 ether 2a:f2:52:11:bf:f8 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 dummy0: flags=195 mtu 1500 inet6 fe80::10:e3ba:b70f:f411 prefixlen 64 scopeid 0x20 ether 3e:a1:0a:d0:b3:40 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 1648 (1.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4099 mtu 1500 ether 48:d7:05:ea:06:36 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 200 bytes 14500 (14.5 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 200 bytes 14500 (14.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` `voxl-modem` can be disabled from running on boot via. the following: ``` voxl2:/$ voxl-configure-modem disable disabling voxl-modem systemd service stopping voxl-modem systemd service Done configuring voxl-modem ``` As with most services, it is recommended to reboot your device after doing so. To check the status of `voxl-modem` when it is running, use the following: ```bash systemctl status voxl-modem ``` ## Diagnostics For Quectel 5G/LTE modems, `voxl-inspect-modem-5g` queries the modem via AT commands and displays real-time signal statistics (mode, state, band, RSRP, RSRQ, SINR, and ARFCN) for both LTE and 5G NR (NSA/SA): ``` Options: -h, --help Print this help message -n, --newline Print each sample on a new line (default: overwrite) -s, --save Save samples to CSV file (/data/voxl-inspect-cell-modem.csv) -r, --rate Poll rate in milliseconds (default: 1000) -p, --port Serial port for AT commands (default: /dev/ttyUSB2) ``` For Doodle Labs radios, `doodle-cli` talks to the radio connected over USB: ``` Usage: doodle-cli -i get VOXL2 IP address on the doodle network for the radio connected over USB -w get wlan0 IP address of radio connected over USB -f get the FW version of the radio connected over USB -m get mesh ID -k get mesh key -l get information about wlan0 -a get information about connected mesh nodes -s set a new mesh ID using the drone's serial number ``` ## Tailscale The `voxl-modem` package also ships automatic [Tailscale](https://tailscale.com) startup, no manual install needed. Place a Tailscale auth key in `/data/modalai/tailscale.key` and the `voxl-tailscale-startup` script (run when the `tailscaled` service starts) will authenticate the device to your tailnet with the hostname `voxl2-`. --- Source: https://docs.modalai.com/connect-gcs-4g5g/ # How to Connect to QGC over 4G/5G 1. TOC ## Prerequisites Before attempting to connect over 4G/5G, make sure you understand how to [connect to QGC over WiFi](/qgc-wifi/) and how [Mavlink Routing on VOXL](/mavlink/) works. Then follow the steps to [connect to the 5G network](/5G-Modem-user-guide/) and confirm the drone has an internet connection over the modem. ## VPN Setup A typical use case of a cellular connection is to connect a drone to a Ground Control Station (GCS) such as [QGroundControl](http://qgroundcontrol.com/). Typically the GCS is also connected to a cellular network. In this case, both the drone and the GCS have been assigned IP addresses that are private to the carrier network. This prevents the drone from directly connecting to the GCS since their IP addresses are not visible to each other over the internet. There are a variety of ways to solve this issue. ModalAI uses a VPN as the preferred solution. ![LTE data flow](/images/rb5/lte-data-flow-v2.jpg) This diagram shows how the VPN solution works. In this example a server is allocated with a static IP address, `35.236.55.229`. Once the drone has connected to the AT&T network, it obtains the IP address `10.47.x.y` and the GCS, once connected, obtains the address `10.47.x.z`. With the VPN server software running on the cloud server and VPN client software on both the drone and the GCS, the devices can now connect and get VPN IP address assignments. In this diagram, the drone is assigned `10.8.0.6` and the GCS is assigned `10.8.0.8`. The drone can now communicate directly to the GCS using the `10.8.0.8` IP address. It is desirable for the drone and the GCS to always get the same IP address when connecting to the VPN. This is possible by assigning each separate network endpoint a unique security certificate. When each endpoint connects using its certificate it can be configured to receive the same address every time. We prefer to use [Tailscale](https://tailscale.com/) as our VPN provider. Tailscale is simple, fast, and straightforward to set up, and its free tier is a solid choice for robotics use cases. If you prefer to host your own server, you can do so with [Google Cloud Platform](https://cloud.google.com/), [Amazon Web Services](https://aws.amazon.com/), [Microsoft Azure](https://azure.microsoft.com/en-us/), etc. Ubuntu is our preferred OS for our servers. Our self-hosted VPN server is set up using the [OpenVPN](https://openvpn.net/) software package. ## Tailscale VPN Setup To install the Tailscale client on VOXL 2, follow the instructions for your device's Ubuntu release at [Tailscale: Install on Linux](https://tailscale.com/download/linux). Once the client is installed and authenticated, the drone appears in your Tailscale network with a stable VPN address. Install the Tailscale client on the GCS computer as well and confirm both devices are in the same Tailscale network. ## Confirm Connection In QGroundControl, add a UDP comm link targeting the drone's VPN address on port 14550. If the connection succeeds, you should get a connected status in QGC. --- Source: https://docs.modalai.com/voxl-logger/ # voxl-logger Tool to save data published through Modal Pipe Architecture to disk. By default, this saves images to /data/voxl-logger/ since the /data/ partition is the largest partition on VOXL. You can change this with the -d argument. The [voxl-replay](/voxl-replay/) tool is used to play back the logs on target. voxl-logger checks the free disk space before it starts and while it is logging, and stops the log rather than filling the disk. ## Usage ``` -a, --armed only record to log when armed -b, --benchtest_vio log normalized tracking cams + imu for vio benchtesting -B, --barometer {name} log barometer data from mpa -c, --cam {name} name of a camera to log, e.g. tracking. greyscale images will be saved as a lossless png. color images as jpg unless --color-png is set -d, --directory {dir} name of the directory to save the log to, default is /data/voxl-logger/ if argument is not provided. -f, --pose_6dof {name} name of a pose6DOF topic to log, e.g. vvpx4_attitude -h, --help print this help message -i, --imu {name} name of an imu to log, e.g. imu1. -j, --benchtest_vio_no_tracking[=skip] log imu and barometer data for vio benchtesting without tracking data optional skip parameter sets frames to skip for tracking camera (default=500) -k, --skip {n_to_skip} number of samples to skip between logged samples -l, --local_position_ned log local position NED data from mavlink stream -m, --mavlink {name} name of a mavlink pipe. -n, --note {note} optionally add a very short note to the end of the log directory name, e.g. flight_with_new_motors -o, --preset_odometry record a preset log containing qvio, ovins, tracking cam and IMUs for testing VIO. This can be used with other pipes. -p, --tof {name} name of a PMD TOF pipe. -q, --qvio log the extended qvio data including feature points and covarience -r, --snapshot_rate_hz {hz} How fast to send snapshot commands to snapshot camera pipes -R, --rc_channels log RC channel data from mpa -s, --samples {samples} maximum samples to save for one specific channel, otherwise it will run untill you quit the program. -t, --time {seconds} time to log for in seconds. -v, --vio {name} name of a vio pipe to log, e.g. qvio -w, --raw log raw binary data to data.raw file -O, --offboard_log log the offboard_log pipe (ext_vfc_data_t) as a structured CSV (no post-conversion needed). Also logs px4_baro on the side. -z, --debug enable verbose debug mode typical uses: To log one camera image: voxl2:/# voxl-logger --cam tracking --samples 1 To log 5000 imu samples: voxl2:/# voxl-logger -i imu1 -s 5000 --note "primary imu test" To log barometer data for 60 seconds: voxl2:/# voxl-logger -B {name} -t 60 --note "barometer test" To log RC channels for 30 seconds: voxl2:/# voxl-logger -R -t 30 --note "RC test" To log 1000 imu0 samples and 2000 imu1 samples: voxl2:/# voxl-logger -i imu0 -s 1000 -i imu1 -s 2000 To log every 5th imu sample (skip 4) for 5.5 seconds: voxl2:/# voxl-logger -i imu1 --skip 4 -t 5.5 To log tracking camera and both imus until you press ctrl-c voxl2:/# voxl-logger --preset_odometry To record a typical log for testing VIO (imu + tracking) for 1 minute voxl2:/# voxl-logger --preset_odometry --time 60 --note "log for vio replay test 1" ``` > The `--color-png` option mentioned in the help text above is not actually implemented in this version, so color images are always saved as jpg. ## Log Automatically on Boot The `voxl-logger.service` systemd service runs `/usr/bin/voxl-logger-autorun.sh` on boot. This script is meant to be edited by the user to record whatever you want; the default script runs: ```bash voxl-logger --armed --benchtest_vio ``` The `-a`/`--armed` flag makes voxl-logger record only while the vehicle is armed, so the service can be left enabled and it will only write logs during flight. Enable it with: ```bash systemctl enable --now voxl-logger ``` ## Triggered Logging with voxl-logger-auto For logging that starts and stops on demand (from a script, a button, or a flight event) use the config-driven auto mode: ```bash systemctl enable --now voxl-logger-auto ``` This runs `voxl-logger --config /etc/modalai/voxl-logger-auto.conf` persistently. It waits for a trigger before recording, and writes one `logNNNN/` session directory per trigger. Control it with the helper CLI: ``` voxl-logger-auto start [note] begin a recording session voxl-logger-auto stop end the current session voxl-logger-auto status print whether a session is active voxl-logger-auto arm-trigger {on|off} ``` `arm-trigger` toggles record-on-arm live (the daemon applies it immediately, no restart) and persists it by rewriting the config's `trigger` field so the change survives a reboot. The config file `/etc/modalai/voxl-logger-auto.conf` supports the following keys: | Key | Description | | --- | --- | | `base_dir` | where log sessions are written, one `logNNNN/` dir per trigger (default `/data/voxl-logger-auto/`) | | `control_pipe_name` | MPA control pipe that start/stop/status commands are sent to (default `voxl-logger-auto`) | | `max_duration_s` | safety auto-stop for a session in seconds, 0 disables the limit | | `trigger` | `manual` = control pipe only; `armed` = also start on vehicle arm and stop on disarm | | `note` | default note written into each session's info.json | | `pipes` | list of `{type, name}` entries to log, using the same type vocabulary as voxl-logger; an optional `skip` drops N of every N+1 samples | ## Related Tools - `voxl-convert-cal` prints `.cal`, `.yml`, and `.csv` calibration files as JSON; use `-k` for human-readable formatting. - `voxl-logger-to-rosbag` is a host-side ROS package included in the voxl-logger repo for replaying voxl-logger logs into ROS topics. [Source code here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger) --- Source: https://docs.modalai.com/voxl-replay/ # voxl-replay voxl-replay plays back MPA logs that were captured by [voxl-logger](/voxl-logger/) Example of playing back a voxl-logger log stored in /data/voxl-logger/log0003: ```bash voxl-replay -p /data/voxl-logger/log0003 ``` ## Usage ``` Replay a log -d, --debug enable verbose debug mode -h, --help print this help message -n, --number {number} number of log to open, e.g. 32 -p, --path {path} complete path of log to open, e.g. /data/mylog/ -s, --start {seconds} starts the replay (float) seconds into the log -f, --finish {seconds} ends the replay (float) seconds into the log -i, --include {name} name of pipe to publish, publish all if not specified -e, --exclude {name} name of pipe to not publish, publish all if not specified -y, --auto_kill automatically kills servers that conflict with the log -F, --start_frame starts the replay N camera frames into the log -b, --ion_buf publish camera frames as ion buffers -B, --both publish camera frames on both normal and ion buffer pipes typical uses: To replay a log with all pipes, all the way through voxl2:/$ voxl-replay -p /data/voxl-logger/log0000/ To replay a log with only the imu_apps pipe voxl2:/$ voxl-replay -p /log0000/ -i imu_apps To replay a log *without* only the imu_apps pipe voxl2:/$ voxl-replay -p /log0000/ -e imu_apps To replay a log for only 5.0 seconds voxl2:/$ voxl-replay -p /log0000/ -f 5.0 To replay a log starting 2.0 seconds in voxl2:/$ voxl-replay -p /log0000/ -s 2.0 To replay a log from 1.0 seconds in to 15.0 seconds in voxl2:/$ voxl-replay -p /log0000/ -s 1.0 -f 15.0 ``` [Source Code Here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger/-/blob/master/tools/voxl-replay.cpp) --- Source: https://docs.modalai.com/rangefinders/ # How to use VL53L1CX Rangefinders with VOXL 2 The VOXL 2 SDK supports MPA integration of VL53L1X & VL53L1CX mini time-of-flight rangefinders. A single rangefinder is included in the Starling 2, Starling 2 Max, and PX4 Autonomy Dev kits facing down for integration into the autopilot for altitude sensing. Up to 8 can also be supported for custom applications using a TCA9548A I2C Multiplexer. --- --- ## Wiring [voxl-rangefinder-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server) runs on the applications processor and therefore requires an I2C port connected to the applications process, not the SLPI. Therefore you cannot use port J19 on the VOXL 2 board with voxl-rangefinder-server. ### Single Rangefinder using M0141 Expansion Board The [M0141 USB2 Breakout Board](/usb2-type-a-breakout-add-on/) exposes power and I2C that can be used with these rangefinders. This is the wiring configuration used on the PX4 Autonomy Dev Kit. This method can also be used with the Starling Development Drone which uses the M0141 breakout board too. Port J5 on M0141 exposes VOXL 2's I2C port 1 (/dev/i2c-1). These are 3.3v level signals with 2.2k pullups included on the M0141 board. | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 3P3V | | | 8 | I2C9_SDA | `/dev/i2c-1` | | 9 | I2C9_SCL | `/dev/i2c-1` | | 12 | GND | | [![rangefinder_on_m0141.jpeg](/images/voxl-sdk/rangefinders/rangefinder_on_m0141.jpeg)](/images/voxl-sdk/rangefinders/rangefinder_on_m0141.jpeg) Configure voxl-rangefinder-server to use this with either: ```bash voxl-configure-rangefinders 1_downward_on_m0141 voxl-configure-rangefinders 1_on_m0141 ``` ### Single Rangefinder using M0173 Camera Breakout Board Starling 2 and Starling 2 Max use the [M0173](/M0173/) camera breakout board which also exposes a SPI and I2C port designed to be connected to the M0157 Lepton and Rangefinder board. Port J6 on M0173 exposes VOXL 2's I2C port 4 (/dev/i2c-4). [![D0014-M0157.jpg](/images/d0014/D0014-M0157.jpg)](/images/d0014/D0014-M0157.jpg) Configure voxl-rangefinder-server to use this with: ```bash voxl-configure-rangefinders 1_downward_on_m0173 ``` This step is run as part of the normal voxl-configure-mpa setup step on Starling 2 and Starling 2 Max. ### Multiple Rangefinders on a Multiplexer Up to 8 rangefinders can be connected via a TCA9548A multiplexer or up to 4 can be connected via a PCA9846 multiplexer. This can be prototyped with breakout boards such as [this from Sparkfun](https://www.sparkfun.com/sparkfun-qwiic-mux-breakout-8-channel-tca9548a.html). An example configuration file setup can be generated with the following: ```bash voxl-configure-rangefinders 4_on_m0141 ``` ## voxl-rangefinder-server Configuration Use of one of the above configure commands will enable the voxl-rangefinder-server systemd service and generate a default config file to represent the respective hardware setup. Each individual sensor can be configured with a different field of view. All sensors must share the same timing budget as they will all be triggered to start ranging at the same, then data will be read from each sensor sequentially in the order listed in the config file. The range_max_m, position, and orientation fields for each sensor should also be set correctly in this config file. They are not used by the voxl-rangefinder-server other than to populate the published rangefinder data with the location and orientation of the sensor for convenience of the data subscriber. This data IS used by voxl-vision-hub for obstacle avoidance. For the M0141 setup above, the following config file is generated. Note when is_on_mux is set to false, the contents of i2c_mux_address and i2c_mux_port are ignored. ```json voxl2:/$ voxl-configure-rangefinders 1_downward_on_m0141 creating new config file for 1 downward TOF without multiplexer DONE enabling voxl-rangefinder-server systemd service Done configuring voxl-rangefinder-server voxl2:/$ cat /etc/modalai/voxl-rangefinder-server.conf /** * Rangefinder Configuration File * This file is used by voxl-rangefinder-server * please use voxl-rangefinder-server --config {arrangement} * to set up this file. * * FOV for VL53l1X TOF rangefinder is a diagonal FOV in degrees and * can be set between 15 and 27 degrees. * * vl53l1x_timing_budget_ms MUST be one of 20, 33, 50, 100, 200, 500 * 100 is default * vl53l1x FOV options are 15, 20, and 27 degrees * default is 27 * * set id_for_mavlink to a valid id (0+) to publish that sensor reading to * mavlink as a DOWNWARD sensor for the autopilot to use * set to -1 to disable this feature. */ { "i2c_bus": 1, "vl53l1x_timing_budget_ms": 50, "id_for_mavlink": 0, "sensors": [{ "enabled": true, "sensor_id": 0, "type": "TOF_VL53L1X", "fov_deg": 15, "range_max_m": 3, "location_wrt_body": [-0.02500000037252903, 0.019999999552965164, 0.00800000037997961], "direction_wrt_body": [0, 0, 1], "is_on_mux": false, "i2c_mux_address": 112, "i2c_mux_port": 0 }] } ``` A longer example config file of using 4 rangefinders on a multiplexer can be generated with `voxl-configure-rangefinders 4_on_m0141` ```json { "i2c_bus": 1, "vl53l1x_timing_budget_ms": 50, "id_for_mavlink": -1, "sensors": [{ "enabled": true, "sensor_id": 0, "type": "TOF_VL53L1X", "fov_deg": 27, "range_max_m": 3, "location_wrt_body": [0, 0.027000000700354576, -0.029999999329447746], "direction_wrt_body": [0, 1, 0], "is_on_mux": true, "i2c_mux_address": 112, "i2c_mux_port": 0 }, { "enabled": true, "sensor_id": 1, "type": "TOF_VL53L1X", "fov_deg": 27, "range_max_m": 3, "location_wrt_body": [-0.014999999664723873, 0, -0.045000001788139343], "direction_wrt_body": [-0.97399997711181641, 0.22499999403953552, 0], "is_on_mux": true, "i2c_mux_address": 112, "i2c_mux_port": 1 }, { "enabled": true, "sensor_id": 2, "type": "TOF_VL53L1X", "fov_deg": 27, "range_max_m": 3, "location_wrt_body": [-0.014999999664723873, 0, -0.045000001788139343], "direction_wrt_body": [-0.97399997711181641, -0.22499999403953552, 0], "is_on_mux": true, "i2c_mux_address": 112, "i2c_mux_port": 2 }, { "enabled": true, "sensor_id": 3, "type": "TOF_VL53L1X", "fov_deg": 27, "range_max_m": 3, "location_wrt_body": [0, -0.027000000700354576, -0.029999999329447746], "direction_wrt_body": [0, -1, 0], "is_on_mux": true, "i2c_mux_address": 112, "i2c_mux_port": 3 }] } ``` This represents a set of sensors being aimed out the sides and rear of a drone, a possible arrangement for obstacle avoidance. ## Inspecting Data Check that the voxl-rangefinder-server is running in the background with one of the following methods: ``` voxl2:/$ systemctl status voxl-rangefinder-server voxl2:/$ voxl-inspect-services ``` Now you can use the voxl-inspect-rangefinder tool to see the data being published. If multiple rangefinders are configured, their distances will be listed on the same line. ``` voxl2:/$ voxl-inspect-rangefinders id |latency(ms)|distances (m) 13173 | 26.3 | 2.222 ``` For debugging, you can also run the voxl-rangefinder-server binary from the command line with the debug flag enabled to see more data about the sensor as well as debug messages. ``` voxl2:/$ voxl-rangefinder-server --debug ================================================= i2c_bus: 1 has_nonmux_sensor: 1 n_mux_sensors: 0 n_enabled_sensors: 1 vl53l1x_timing_budget_ms: 50 id_for_mavlink: 0 #0: enabled: 1 sensor_id: 0 type: TOF_VL53L1X fov_deg: 15.000 range_max_m: 3.000 location_wrt_body: -0.025 0.020 0.008 direction_wrt_body: 0.000 0.000 1.000 is_on_mux: 0 i2c_mux_address: 0x70 i2c_mux_port: 0 ================================================= initializing i2c bus 1 initializing non-multiplexed tof sensor id 0 read whoami reg 0x010f = 0xeacc initializing a sensor using 4 pads, for a diagonal fov of 15.0 deg done initializing a sensor finished initializing 1 vl53l1x sensors mavlink pipe connected --------------------------- data ready: 1 i=0 mm: 152 signal: 2374 SD: 2 status: 0 Valid Range --------------------------- data ready: 1 i=0 mm: 149 signal: 2465 SD: 2 status: 0 Valid Range --------------------------- data ready: 1 i=0 mm: 150 signal: 2468 SD: 2 status: 0 Valid Range --------------------------- data ready: 1 i=0 mm: 152 signal: 2483 SD: 2 status: 0 Valid Range --------------------------- data ready: 1 i=0 mm: 149 signal: 2489 SD: 2 status: 0 Valid Range --------------------------- ``` ## Data Format The datatype for each sensor reading is defined in a header owned by the qrb5165-rangefinder-server project and is installed to the file system at /usr/include/voxl-rangefinder_interface.h Source code available here: [https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server/-/blob/master/include/voxl_rangefinder_interface.h?ref_type=heads](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server/-/blob/master/include/voxl_rangefinder_interface.h?ref_type=heads) ```C typedef struct rangefinder_data_t{ uint32_t magic_number; ///< Unique 32-bit number used to signal the beginning of a struct int64_t timestamp_ns; ///< Timestamp in clock_monotonic system time uint32_t sample_id; ///< When multiple sensors are sampled at the same time they should share the same sample_id int sensor_id; ///< unique id identifying the sensor from which the sample originated. float distance_m; ///< distance in meters float uncertainty_m; ///< uncertainty in meters. Set negative if unknown. ///< this is calculated as two standard deviations when ///< the sensor reports measurement sigma like vl53l1x float fov_deg; ///< field of view of the sensor in degrees float location_wrt_body[3]; ///< location of the rangefinder with respect to body frame in meters float direction_wrt_body[3];///< direction vector of the rangefinder with respect to body frame, unitless vector float range_max_m; ///< Maximum range of the sensor in meters int type; ///< Rangefinder type, e.g. RANGEFINDER_TPYE_VL53L1X int reserved; ///< reserved for future use } __attribute__((packed)) rangefinder_data_t; ``` The server publishes this data on the `rangefinders` pipe. The voxl-inspect-rangefinders tool serves as a good example of reading this data and can be found here [https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server/-/blob/master/tools/voxl-inspect-rangefinders.c?ref_type=heads](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-rangefinder-server/-/blob/master/tools/voxl-inspect-rangefinders.c?ref_type=heads). ## voxl-vision-hub Obstacle Avoidance voxl-vision-hub also serves as a good example of subscribing to rangefinder data. In the following function, it takes groups of rangefinder data and using the timestamp, field-of-view, location, and orientation of the data, projects points into 3D space for integration into the filtered obstacle point cloud. This 3D data can be viewed in voxl-portal as the voa_pc_out pointcloud. [https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/src/voa_manager.c?ref_type=heads#L471](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/src/voa_manager.c?ref_type=heads#L471) ## PX4 Autopilot Height Estimate Integration One rangefinder in the config file can be flagged as the downward-facing rangefinder for PX4 by setting the `id_for_mavlink` field to the chosen sensor id. When set, the data from that one rangefinder will also be published as a mavlink distance sensor message to the autopilot via the `mavlink_onboard` control pipe. This is enabled by default on Starling 2 and Starling 2 Max. Validate PX4 is receiving the data by checking mavlink-inspector in qGroundControl. [![qgc.png](/images/voxl-sdk/rangefinders/qgc.png)](/images/voxl-sdk/rangefinders/qgc.png) When using voxl-px4 running on the VOXL 2 SDSP as opposed to an external autopilot, you can also inspect the uorb message being published by PX4: ``` voxl2:/$ px4-listener distance_sensor TOPIC: distance_sensor distance_sensor timestamp: 522745702 (0.024082 seconds ago) device_id: 9699590 (Type: 0x94, MAVLINK:0 (0x01)) min_distance: 0.00000 max_distance: 3.00000 current_distance: 1.60000 variance: 0.02550 h_fov: 0.26180 v_fov: 0.26180 q: [nan, nan, nan, nan] (Roll: -nan deg, Pitch: -nan deg, Yaw: nan deg) signal_quality: 100 type: 2 orientation: 25 ``` To configure how PX4 uses this data, see the [PX4 parameter reference](https://docs.px4.io/main/en/advanced_config/parameter_reference.html). A few relevant parameters are as follows: ``` EKF2_RNG_CTRL: set to 1 to enable integration of the rangefinder data into EKF2's height estimate EKF2_HGT_REF: set to 2 to use the rangefinder as the primary height reference. ``` --- Source: https://docs.modalai.com/camera-video/ # Cameras and Video Everything about getting image data through VOXL: the camera server, per-SKU camera configuration, streaming, recording, and debugging. --- Source: https://docs.modalai.com/mpa-camera-interface/ # MPA Camera Interface ## Table of Contents 1. TOC --- # Overview MPA offers an ultra lightweight bidirectional interface to allow multiple clients to subscribe to image and video streams as well as send commands back to the server such as for taking snapshots or setting exposure. [voxl-camera-server](/voxl-camera-server/), [voxl-lepton-server](/voxl-lepton-server/), and [voxl-uvc-server](/voxl-uvc-server/) (among others) share this common interface. ## Published Format Camera data is published to pipes in a binary form with a metadata struct followed by the raw image data (in a format defined by the metadata): ``` /** * The metadata for the camera image. One of these is sent before every frame */ typedef struct camera_image_metadata_t { uint32_t magic_number; ///< set to CAMERA_MAGIC_NUMBER int64_t timestamp_ns; ///< timestamp in apps-proc clock-monotonic of beginning of exposure int32_t frame_id; ///< iterator from 0++ starting from first frame when server starts on boot int16_t width; ///< image width in pixels int16_t height; ///< image height in bytes int32_t size_bytes; ///< size of the image, for stereo this is the size of both L+R together int32_t stride; ///< bytes per row int32_t exposure_ns; ///< exposure in microseconds int16_t gain; ///< ISO gain (100, 200, 400, etc..) int16_t format; ///< raw8, nv12, etc int16_t framerate; ///< expected framerate hz int16_t reserved; ///< extra reserved bytes } __attribute__((packed)) camera_image_metadata_t; ``` This definition can be found [here](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/library/include/pipe_interfaces/camera_image_metadata_t.h). A number of common formats are defined in [libmodal-pipe](/libmodal-pipe/). Clients are not expected to be able to decode any arbitrary format, only the format they expect for normal operation. voxl-portal and voxl-logger can handle most of the common formats for debugging and logging. For example, a VIO algorithm may only accept raw8 format and it's perfectly valid to error out if it's told to subscribe to a pipe publishing an unexpected format. ```C // Common image formats for use by a camera server. This is not an exhaustive // list and custom values not included here can be used as long as the server // and client both agree on the image format. #define IMAGE_FORMAT_RAW8 0 // 8-bit gray image, used for tracking camera #define IMAGE_FORMAT_NV12 1 #define IMAGE_FORMAT_STEREO_RAW8 2 // 8-bit gray, two sequential images #define IMAGE_FORMAT_H264 3 #define IMAGE_FORMAT_H265 4 #define IMAGE_FORMAT_RAW16 5 // 16-bit image, for disparity maps or HDR gray images #define IMAGE_FORMAT_NV21 6 // Android NV21 format from hal3 #define IMAGE_FORMAT_JPG 7 #define IMAGE_FORMAT_YUV422 8 // Standard YUV422 with YUYV mapping scheme #define IMAGE_FORMAT_YUV420 9 #define IMAGE_FORMAT_RGB 10 // 24-bits per pixel #define IMAGE_FORMAT_FLOAT32 11 // 32-bit float per pixel, for depth map #define IMAGE_FORMAT_STEREO_NV21 12 // Android NV21 format from hal3, two sequential images #define IMAGE_FORMAT_STEREO_RGB 13 // 24-bits per pixel, two sequential images #define IMAGE_FORMAT_YUV422_UYVY 14 // YUV422 with alternate UYVY mapping scheme #define IMAGE_FORMAT_STEREO_NV12 15 ``` ## voxl-inspect-cam ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/badges/release.svg?key_text=Latest Release&key_width=100) The utility `voxl-inspect-cam` is a tool to check image metadata coming from MPA services that are publishing camera data. It requires that [voxl-camera-server](/voxl-camera-server/) is running in the background, which can be checked with [voxl-inspect-services](/voxl-inspect-services/). It can also be used to check non-camera images, such as the overlays coming out of [VOXL TFLite Server](/voxl-tflite-server/) or [voxl-open-vins-server](/voxl-open-vins-server/). ### Arguments #### Required Cam: Which image to display data from. Available images can be seen by typing ```voxl-inspect-cam {TAB} {TAB}```. Options that will regularly be available are: `tracking`, `stereo`, `hires`, `tof_depth`, `tof_conf`, `tof_noise`, `tof_ir`, `dfs_disparity`, `qvio_overlay`, `tflite_overlay`. #### Optional | Parameter | Description | Example | |--- |--- |--- | |-h --help | Print help message | ```voxl-inspect-cam --help``` | |-n --newline | Print each sample on a new line instead of updating the current output line | ```voxl-inspect-cam tracking -n``` | |-t --test | Test mode, simple pass/fail test after two seconds of waiting for a frame | ```voxl-inspect-cam tracking -t``` | #### Example Single Output ``` voxl2:/$ voxl-inspect-cam tracking |size(bytes)| height | width |exposure(ms)| gain | frame id |latency(ms)|Framerate(hz)| format | 307200 | 480 | 640 | 3.8 | 100 | 71976 | 18.6 | 30.0 | RAW8 voxl2:/$ ``` ### Inspect all camera streams When run with the `-a` or `--all` argument, voxl-inspect-cam will subscribe to every image and video pipe simultaneously. This is very useful, but remember it also puts a lot of stress on the system as a lot of image streams are often paused by default. As you can see, the `hires_large_color` raw NV12 video stream transfers over 3 gbps of data while the H265 encoded version of the same 4K stream is only 11.4mbps. ```bash voxl2:/$ voxl-inspect-cam -a ``` ![voxl-streamer-arch](/images/voxl-sdk/voxl-inspect-cam.png) ### Debug Metrics voxl-inspect-cam measures the bitrate of data it receives which is particularly useful for tuning video compression. It also identifies header, I and P frames for H264 and H265 streams. Using the `--newline` argument on a compressed video pipe will let you confirm that a header and I frame are being sent at the beginning of a new client connection. This will also let you count the number of P frames between I frames. The latency is also calculated based on the time between the end of the exposure as reported by the image metadata and the time that voxl-inspect-camera receives its copy of the complete frame. [voxl-inspect-cam source code.](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam.c) ## Sending Commands Back to the Server [libmodal-pipe](/libmodal-pipe/) supports clients sending commands back to a server. It's up to the server to implement commands relevant to its functionality. Here are some camera-related commands: ### Snapshot Command This is only supported by [voxl-camera-server](/voxl-camera-server/). It sends a command to voxl-camera-server for a particular camera to instruct the ISP to process a single high quality image and save to disk. This is called by [voxl-mavcam-manager](/voxl-mavcam-manager/) when the user clicks the image shutter button in QGroundControl. Nothing needs to be subscribed to the pipe to take a snapshot. However, if something like voxl-inspect-cam is subscribed to a `xyz_snapshot` pipe then they will receive a JPG compressed image through the pipe whenever a snapshot is taken by them or another client or user. If the user only wants the data through the pipe and does not want a copy saved to disk, they can use the `snapshot-no-save` command. ```bash voxl2:/$ voxl-send-command hires_snapshot snapshot OR voxl2:/$ voxl-send-command hires_snapshot snapshot-no-save ``` ### Exposure Control Commands This is only supported by [voxl-camera-server](/voxl-camera-server/). VOXL Camera Server primarily uses ModalAI's [libmodal_exposure](/libmodal-exposure/) for camera auto exposure/gain values, but this can also be changed to use the ISP's (Image Signal Processing) exp/gain settings, or can be disabled altogether. Additionally, you can use ```voxl-send-command``` to manually send commands to update the exposure/gain of a specific camera. If a camera was using auto exposure/gain when such a command is sent, the AE will be disabled until the ```start_ae``` command is sent and the camera will sit at the requested exposure/gain. When an image sensor is configured to use a ModalAI exposure algorithm, (see [voxl-camera-server config file](/voxl-camera-server/#camera-server-config-file)) one can manually set exposure and gain values from the command line. This can be useful for debugging image sensor performance. ```bash voxl2:/$ voxl-send-command tracking set_exp_gain ``` For example: ```bash voxl2:/$ voxl-send-command tracking set_exp_gain 200 150 ``` ### Other Commands Every server providing image data can implement their own commands. For example [voxl-lepton-server](/voxl-lepton-server/) provides commands to control the calibration shutter on the Flir Lepton. voxl-send-command has dynamic tab completion that will show you that commands are available for a particular pipe. Just type the following and double-tap the tab button. ```bash voxl2:/$ voxl-send-command tracking {TAB}{TAB} voxl2:/$ voxl-send-command hires_small_encoded {TAB}{TAB} ``` ## JSON Info File Any service publishing image or video pipes should be sure to set up the format, dimensions, and framerate where possible in the pipe's json info file. This allows subscribers like voxl-streamer to validate and initialize based on this information before actually subscribing to the pipe data. Good examples are the camera pipes published by voxl-camera-server, voxl-uvc-server, and voxl-lepton-server. Here is the hires_large_encoded pipe info for reference: ```json voxl2:/$ cat /run/mpa/hires_large_encoded/info { "name": "hires_large_encoded", "location": "/run/mpa/hires_large_encoded/", "type": "camera_image_metadata_t", "server_name": "voxl-camera-server", "size_bytes": 134217728, "server_pid": 1368, "available_commands":["set_exp_gain", "set_exp", "set_gain", "start_ae", "stop_ae", "snapshot", "snapshot-no-save"], "string_format": "H265", "int_format": 4, "width": 4096, "height": 2160, "framerate": 30 } ``` ## Stream to ROS2 The [VOXL MPA to ROS2](/ros2-installation-voxl2/) node can be used to provide data coming out of camera server to ROS2. ROS2 is supported in SDK 1.1 and later [ROS2 Installation](/ros2-installation-voxl2/) ## Example to Programmatically use Data To programmatically access the camera frame buffers from MPA, [voxl-inspect-cam](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam.c) is a great example. One can use that project as a starting point to create their own application. The core of it, condensed, is a camera-helper callback and an open call: ```c // camera helper callback whenever a frame arrives static void _helper_cb(int ch, camera_image_metadata_t meta, char* frame, void* context) { // meta describes the frame: meta.width, meta.height, meta.size_bytes, // meta.exposure_ns, meta.gain, meta.format, meta.frame_id. // frame points to the image data itself. } pipe_client_set_camera_helper_cb(0, _helper_cb, NULL); pipe_client_open(0, pipe_path, CLIENT_NAME, EN_PIPE_CLIENT_CAMERA_HELPER, 0); ``` The `camera_image_metadata_t` struct is defined in [libmodal_pipe](/libmodal-pipe/)'s pipe interfaces. --- Source: https://docs.modalai.com/voxl-camera-drivers/ # VOXL Camera Drivers ## Table of Contents 1. TOC ## Components of a Camera Driver There are three main components of the camera drivers on VOXL2: - sensormodule (.bin) - sensor (.so) - tuning file (.bin) ## Sensormodule File - binary file (not human readable), located in `/usr/lib/camera/` - a sensormodule is required for each camera and the slot id has to match actual port where the camera is connected - the slot id in the sensormodule is the number at the end of the bin, such as: `com.qti.sensormodule.imx412_fpv_1.bin` -- slot 1 - note that the number in the name has no effect on the value -- the slot id is also stored inside the .bin and changing filename will not change the slot number - example name: `com.qti.sensormodule.imx412_fpv_1.bin` - contains the following information - camera's hardware ID (slot ID), i2c address, and *WHOAMI* register information for camera probing - a different sensormodule is required if an alternate i2c slave address is used for a camera - power on/off sequencing order - specification of all camera modes, including resolution, fps, bayer type, bit depth, etc - a list of camera configuration registers for each streaming mode - the name of the tuning file to load (has an effect on ISP pipeline only) - ... ## Sensor File - shared library, located in `/usr/lib/camera/` - example file names: `com.qti.sensor.imx412_fpv.so`, `com.qti.sensor.imx664.so` - contains functions for converting the exposure / control information between real units and camera registers - the sensor name (e.g. `imx412_fpv`) has to match the sensor name that is stored in the sensormodule, otherwise the sensor.so will not be loaded correctly - if the sensor.so is not found, the camera pipeline will not fail, but it will use built-in default functions for exposure / gain conversion and those will most likely not work correctly ## Tuning File - applies to the ISP pipeline only - located in `/usr/lib/camera/` - example file names : `com.qti.tuned.default.bin`, `com.qti.tuned.imx412_fpv.bin` - upload loading of sensormodule, the camera pipeline will see which tuning file is associated with the sensormodule and tries to load that tuning file - if the specific tuning file is not found, the default tuning file is loaded `com.qti.tuned.default.bin` - if neither the spefic nor the default tuning files are present, the camera will appear not detected ---- # Camera Frame Rotation for Tracking Cameras - applies to AR0144, OV7251, OV9782, TOF, Boson, IMX577, IMX412, and IMX664 sensors - all camera server versions use `en_rotate` flag in `voxl-camera-server.conf` to speficy whether the camera should be set to reverse the readout direction - bayer type does not matter because the AR0144 tracking camera is monochrome ---- # Camera Frame Rotation for Hires Cameras - applies to IMX412 and IMX664 cameras - image rotation (180 degrees) can be achieved by reversing the readout direction from camera (both X and Y) - this results in zero processing overhead, however usually changes the bayer pattern (reversed) from RGGB to BGGR (etc) ## ISP Processing Path - applies to the following streams, if enabled: `small_video`, `large_video` - also applies to `preview` stream if `en_raw_preview` is set to `false` - Qualcomm ISP is used to process the image to generate YUV and encoded videos - `sensormodule` bin file contains the register setting for the readout direction as well as the bayer pattern (RGGB, BGGR, etc) - the ISP will use the bayer pattern specification from the sensormodule file to properly debayer the image - incorrectly debayered image will have R and B colors swapped ## MISP Processing Path - applies to all MISP streams when `en_raw_preview` is set to `false` (MISP requires it) - MISP does *not* use the bayer specification from sensormodule, unlike the ISP - the bayer pattern is determinted by the default patter type (stored in the camera server) and the `en_rotate` flag, which reverses the readout and the bayer pattern. ## voxl-camera-server integration - camera server before `v2.2.12` - does not control the image readout direction for imx412 and imx664 cameras - `en_rotate` option in `voxl-camera-server.conf` does not change camera registers, but it does change interpretation of bayer for MISP pipeline (RGGB vs BGGR) - camera server `v2.2.12` and later uses `en_rotate` option from `voxl-camera-server.conf` to override the rotation setting in the sensormodule - this is done by setting the readout direction register after the camera pipeline initializes the camera using the registers from sensormodule - the relevant camera registers are written in the `cci_direct_helpers` file / functions - `en_rotate` option also controls the interpretation of colors in the MISP pipeline - this means that rotation register in sensormodule no longer has effect because it is overridden - since camera server can override the readout direction, but it cannot change the bayer pattern specification in the sensormodule, the ISP may not correctly interpret the image, unless the camera server sets the rotation register that is consistent with the sensormodule - Configuration that works for all versions of `voxl-camera-server` - non-rotated image: - use sensormodule *without* `_flip_` - set `en_rotate` to `false` in `voxl-camera-server.conf` - this will allow MISP to interpret colors correctly (and set the readout direction register for version >= `v2.2.12`) - ISP pipeline automatically determines bayer pattern from sensormodule and it will be consistent with camera registers - rotated image: - use sensormodule *with* `_flip_` - set `en_rotate` to `true` in `voxl-camera-server.conf` - this will allow MISP to interpret colors correctly (and set the readout direction register for version >= `v2.2.12`) - ISP pipeline automatically determines the reversed bayer pattern from sensormodule and it will be consistent with camera registers --- Source: https://docs.modalai.com/voxl-camera-server/ # VOXL Camera Server ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/badges/release.svg?key_text=Latest Release&key_width=100) ## Table of Contents 1. TOC --- ## Overview VOXL Camera Server publishes MIPI Camera images and video to [MPA](/mpa/) pipes to allow multiple clients to utilize each camera. It is one of many MPA services that publish image data. See the previous page to read more about the [MPA camera interface](/mpa-camera-interface/). Example services that are clients for `voxl-camera-server` include `voxl-qvio-server`, [voxl-portal](/voxl-portal/), ROS, and [voxl-streamer](/voxl-streamer/). VOXL Camera Server uses Google's [HAL3 API](https://source.android.com/devices/camera/camera3) to access the Qualcomm ISP pipeline, with hardware-accelerated H264/H265 video compression (via `libvoxl-codec` in current releases). ## Hardware Configuration MIPI camera interfaces and drivers are very complicated, requiring careful schematic and PCB design to connect. Driver bringup requires deep knowledge of the Qualcomm camera stack and kernel. These are not USB webcams and cannot be plugged in willy-nilly to whatever port you fancy. ModalAI provides a set of supported camera configurations to cover a range of use cases for the [VOXL 2](/voxl2-camera-configs/), and [VOXL 2 Mini](/voxl2-mini-image-sensors/). QRB5165 based platforms (VOXL 2 and VOXL 2 mini) are more flexible but it would impossible for us to support the thousands of possible camera configurations. Therefore we suggest starting with a supported camera configuration, seeing how the [voxl-configure-cameras tool](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/scripts/voxl-configure-cameras) sets up the drivers and voxl-camera-server config file, then modifying to suit your use case from there. Only connect and disconnect cameras while VOXL is powered off!! The following sensor types are supported [code reference](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/include/common_defs.h): * ov7251 * ov9782 * ov64b * ov2311 * ar0144 (plus `ar0144-rotated`, `ar0144-color`, `ar0144-12bit` variants) * imx214 * imx412 (plus `imx412-fpv-misp`) * imx565 (plus `imx565-color`) * imx577 * imx664 (plus `imx664-fpv`) * imx678 * pmd-tof * pmd-tof-liow2 * boson (plus `boson-fpv`) ## Software configuration [voxl-configure-cameras](/configure-cameras/) is a top-level helper script used to set up camera sensor drivers and the`/etc/modalai/voxl-camera-server.conf` config file. It will write default settings for the selected camera configuration as a starting point for further customization if necessary. If you want to change some aspects of the camera server behavior such as disabling a camera or changing video encoding settings, you can do so by modifying that file and restarting camera server with `systemctl restart voxl-camera-server`. ## HAL3 Streams HAL3 can provide multiple simultaneous image streams with different formats and resolutions. On QRB5165 (VOXL 2) up to 3 simultaneous streams can be enabled per camera. voxl-camera-server's config file is set up to configure 4 different streams with specific intended use cases. The streams are not activated until a client is connected. | Mode | Purpose | Format | |---------- |--------------------------------------------------------------|--------------| | preview | Low latency uncompressed images computer vision algorithms | NV12 or RAW8 | | small_encoded | Compressed video for wireless stream (See voxl-streamer) | H264 or H265 | | large_encoded | Compressed video for saving to disk | H264 or H265 | | snapshot | Save full-quality ISP processed JPG to disk or to pipe | JPG | FPV and low-latency products additionally use a MISP stream family (`en_misp`, `misp_venc_*`, `misp_channels[]`, and electronic image stabilization via `en_eis`) — those parameters are documented on the [Electronic Image Stabilization](/camera-video/electronic-image-stabilization/) and [Low Latency Streaming](/camera-video/low-latency-video-streaming/) pages. The primary stream for computer video sensors such as the OV7251 Tracking camera and stereo pairs is the preview stream. For example, `voxl-qvio-server` takes a preview stream in RAW8 format as its input for the tracking sensor. voxl-camera-server V1.4.5 and above has the ability to use hardware acceleration to compress H264 and H265 video. This is provided by the small_encoded and large_encoded streams. [voxl-streamer](/voxl-streamer/) is configured to stream the hires_small_encoded stream by default. Note that if you want to change the resolution of the RTSP stream provided by voxl-streamer you need to set it in voxl-camera-server.conf since it's voxl-camera-server that's encoding the video! Finally the snapshot stream is unique in that it's not a steady stream at constant framerate but instead takes a snapshot when it receives the "snapshot" command through any of that camera's control pipes. This triggers the Qualcomm ISP to do the same pipeline as clicking the shutter button in your smartphone's camera app! ## Camera Server Config File All of these parameters are valid for every camera or stereo pair. However many of them will be hidden in the config file to reduce clutter where they are not applicable for a particular camera or configuration. For example, the preview stream params are hidden on IMX214 hires sensors since out of the box only the two video streams and snapshot streams are enabled. But, you could opt to disable one of the default streams and enable the preview stream. The Camera Server config file is in json format and contains an array of camera, each of which may contain the following values: #### General Settings `type`: sensor type string — see the supported sensor list above `name`: name used as prefix for pipes published by this camera
`enabled`: `true` by default. Set to `false` to disable the camera.
`camera_id`: This is the the id of the camera as enumerated by HAL3
`camera_id_second`: id of the secondary camera when running a stereo pair. Omit or leave as -1 for monocular.
`independent_exposure`: true or false to enable independent auto exposure for a stereo pair. Default: false
`fps`: framerate
`ae_mode`: Auto exposure mode "off", "manual", "auto", "isp", or "lme_msv"
`standby_enabled`: enable decimated framerate when CPU reports standby mode, only for TOF (default false)
`decimator`: TOF framerate decimator when in standby mode
#### Preview Stream Settings `en_preview`: Enable the preview stream (true or false)
`preview_width`: Width of the preview stream image (default sensor dependent, e.g. 640 for ov7251)
`preview_height`: Height of the preview stream image (default sensor dependent, e.g. 480 for ov7251)
`en_raw_preview`: publish the raw (pre-ISP) frames instead of ISP-processed ones. (The old `pre_format` key is no longer used and is removed from configs automatically.)
#### Small Video Stream Settings `en_small_video`: true or false to enable the small video stream
`small_video_width`: default 1024
`small_video_height`: default 768
`small_venc_mode`: "h264" or "h265"
`small_venc_br_ctrl`: "cqp" or constant quantization or "cbr" for constant bitrate
`small_venc_Qfixed`: Quantization to use for cqp mode
`small_venc_Qmin`: Minimum quantization to allow in cbr mode
`small_venc_Qmax`: Max quantization to allow in cbr mode
`small_venc_nPframes`: number of P frames to use between I frames (default 9)
`small_venc_mbps`: target bitrate for cbr mode (default 2)
#### Large Video Stream Settings `en_large_video`: true or false to enable the large video stream
`large_video_width`: default dependent on sensor, typically full resolution
`large_video_height`: default dependent on sensor, typically full resolution
`large_venc_mode`: "h264" or "h265"
`large_venc_br_ctrl`: "cqp" or constant quantization or "cbr" for constant bitrate
`large_venc_Qfixed`: Quantization to use for cqp mode
`large_venc_Qmin`: Minimum quantization to allow in cbr mode
`large_venc_Qmax`: Max quantization to allow in cbr mode
`large_venc_nPframes`: number of P frames to use between I frames (default 29)
`large_venc_mbps`: target bitrate for cbr mode (default 40 for h264, 30 for h265)
#### Snapshot Stream Settings `en_snapshot`: true or false
`en_snapshot_width`: default dependent on sensor, typically full resolution
`en_snapshot_height`: default dependent on sensor, typically full resolution
`snapshot_jpeg_quality`: JPEG quality for saved snapshots
`exif_focal_length`, `exif_focal_length_in_35mm_format`, `exif_fnumber`: EXIF metadata written into snapshots
#### libmodal exposure settings When using libmodal exposure (lme_msv) instead of the ISP's autoexposure you have more control, this is exposed through the following parameters. `ae_desired_msv`: the desired mean sample value, a.k.a. the average value of pixels that the auto exposure algorithm should try to achieve in frame
`ae_k_p_ns`: the desired p_ns for the exposure algorithm
`ae_k_i_ns`: the desired k_i for the exposure algorithm
`ae_max_i`: the desired max_i for the exposure algorithm
`ae_filter_alpha`: a low-pass filter constant that filters the calculated MSV to slow down responses - the filter used is an IIR filter
`ae_ignore_fraction`: maximum percentage of saturated (255) pixels that will be used in calculation of MSV. If there are more saturated_pixels / total_pixels, then additional saturated pixels are not used to calculate MSV. This helps prevent image getting too dark if there are large blobs of very bright light
`ae_slope`: ratio that specifies how much gain vs exposure should be changed when trying to achieve desired MSV. Both gain and exposure linearly affect the pixel brightness, but gain and exposure have different effects on the image quality - mostly in the sense that gain affects granularity and that exposure affects motion blur.
`ae_exposure_period`: controls the duration where the cells of the camera sensor are exposed to light
`ae_gain_period`: the gain period associated to the auto exposure (think of this as an amplification factor of the pixels)
## Constant Quantization vs Constant Bitrate Mode > *As of SDK 1.3.5, CBR mode for h264 and h265 is working properly with some (bitrate) limitations* ### SDK 1.3.5+ CBR (Constant Bit Rate) - `*_venc_mbps` parameters is used to specify desired video bitrate in Mbit/s - CBR has the following limitations on VOXL2 : | Encoder Mode | FPS | Min Bitrate (mbps) | Max Bitrate (mbps) | | ------------ | --- | ------------------ | ------------------ | | H264 | 30 | 1.5 | 5.0 | | H264 | 60 | 1.5 | 10.0 | | H265 | 30 | 3.0 | 10.0 | | H265 | 60 | 3.0 | 20.0 | - if desired mbps is lower than the above min bitrate limit, camera server will override the value and set it to min - if camera server does not limit the min value, encoder will use MAXIMUM possible Mbps - if desired mbps is higher than the limit, encoder will automatically use the maximum value from above - `_venc_Qmin` value should be set to a low value (default 15), allowing encoder to adjust QP to achieved the desired bitrate - `_venc_Qmax` should be set to a high value (in the 40-50 range, maximum 51), allowing encoder to adjust QP to achieved the desired bitrate - note that this limitation is not a Hardware limit, it is due to a mis-configuration of the encoder. The fix (`[OMX] Fix FPS Hack workaround and fix CBR mode`, libvoxl-codec 0.1.3, pulled in by voxl-camera-server 2.2.32) is included in SDK 1.7.0, which is in pre-release at the time of writing; see the [SDK 1.7 release notes](/sdk-1.7-release-notes/). SDK 1.3.5 through SDK 1.6.x carry the limits in the table above - lower bitrates for h264 / h264 are supported by `voxl-streamer` application, which can encode raw frames to video and serve rtsp stream CBR + CQP - This is a hybrid mode that uses Constatnt Quantization when there is little motion and Constant Bitrate to limit the maximum bitrate - In order to use this mode, select `cbr` as the bitrate control, however also adjust the `Qmin` parameter, as described below - `_venc_Qmin` value can be used to lower the bit rate when video is mostly still (value needs to be tuned for use case) - As the amount of motion in the image increases, the encoder's bit rate controller will increase QP (reduce quality), if needed, (up to Qmax) in order to keep the bitrate capped at the desired bitrate - `Qmin` (lowest quantization bound) specifies the lowest quantization that encoder can use, meaning the highest image quality - if the encoder would need to use a lower `Qmin` than is configured (in order to achieve target bitrate), the bitrate controller would be limited by the `Qmin` and resulting bitrate would be smaller than desired. - Sometimes this can be desired in order to avoid wasting bandwidth in CBR mode - When there is little motion, the actual bit rate may be smaller than specified in mbps parameter - However, when there is sufficient motion, the bitrate will increase and will be capped by the desired mbps value - Note: this results in a MAX bitrate instead of CBR mode, which sometimes is desired (low bit rate when there is no motion, capped bitrate during motion) - `_venc_Qmax` should be set to a high value (in the 40-50 range, maximum 51) - this value specifies the largest Quantization Parameter used in CBR mode when needed to increase quantization in order to keep bitrate at desired value (this typically happens during lots of motion in the image) - if `Qmax` is not large enough, the bit rate controller may not be allowed to increase the quantization parameter sufficiently enough to achieve (to lower) the desired bitrate - the following parameters are ignored: `_venc_Qfixed` CQP (Constant Quantization Parameter) - `small_venc_Qfixed` / `large_venc_Qfixed` parameter is used to set the constant Quantization Parameter - constant QP does not mean constant bit rate. QP is used to quantize the pixel values but motion estimation will drive bandwidth usage - actual bitrate will also depend on video resolution and FPS (more pixels = more bandwidth) - the following parameters are ignored: `*_venc_Qmin`, `*_venc_Qmax`, `*_venc_mbps` ### Pre SDK 1.3.5 Constant bitrate video compression works but there is a known issue with the hardware accelerated video compressor where a scale factor is applied to the desired bitrate that is dependent on resolution. This scale factor is roughly 13x for 1024x768 video and roughly 30x for 4K video. If you wish to use constant bitrate mode you will need to set a much smaller target bitrate in the config file than desired. Then use voxl-inspect-cam to measure the output bitrate during motion and while still until you find the config file bitrate value that achieves the desired result. The default encoding scheme is "cqp" or Constant Quantization Parameter which is more useful in most scenarios as it allows the bitrate to drop automatically when there is little motion in the video. Simply tune the small_venc_Qfixed and large_venc_Qfixed quantization parameters to achieve the desired bitrate and quality while in motion. This will save bandwidth and disk space when the drone is still. ## Config File Example Whenever you run `voxl-configure-cameras` a new default camera server config file is created for that particular camera setup. Here is an example default config file for camera config #6 used on Starling. It was generated by an older release — a config generated today additionally omits `pre_format` (no longer used) and names the stereo secondary id `camera_id_second` — but the overall structure is unchanged. ```json { "version": 0.1, "cameras": [{ "type": "pmd-tof", "name": "tof", "enabled": true, "camera_id": 0, "fps": 5, "en_preview": true, "preview_width": 224, "preview_height": 1557, "pre_format": "tof", "ae_mode": "off", "standby_enabled": false, "decimator": 5 }, { "type": "imx214", "name": "hires", "enabled": true, "camera_id": 1, "fps": 30, "en_preview": false, "preview_width": 640, "preview_height": 480, "pre_format": "nv21", "en_small_video": true, "small_video_width": 1024, "small_video_height": 768, "small_venc_mode": "h265", "small_venc_br_ctrl": "cqp", "small_venc_Qfixed": 30, "small_venc_Qmin": 15, "small_venc_Qmax": 40, "small_venc_nPframes": 9, "small_venc_mbps": 2, "en_large_video": true, "large_video_width": 4096, "large_video_height": 2160, "large_venc_mode": "h265", "large_venc_br_ctrl": "cqp", "large_venc_Qfixed": 38, "large_venc_Qmin": 15, "large_venc_Qmax": 50, "large_venc_nPframes": 29, "large_venc_mbps": 30, "en_snapshot": true, "en_snapshot_width": 4160, "en_snapshot_height": 3120, "ae_mode": "isp" }, { "type": "ov7251", "name": "tracking", "enabled": true, "camera_id": 2, "fps": 30, "en_preview": true, "preview_width": 640, "preview_height": 480, "pre_format": "raw8", "ae_mode": "lme_msv", "ae_desired_msv": 60, "ae_filter_alpha": 0.600000023841858, "ae_ignore_fraction": 0.20000000298023224, "ae_slope": 0.05000000074505806, "ae_exposure_period": 1, "ae_gain_period": 1 }] } ``` ## Camera sensor options and capabilities For the available camera configurations as well as the accepted FPS/Dimensions associated to each camera sensor, please follow the link [here](/voxl2-camera-configs/#voxl-2-camera-configurations). ### Supported Resolutions From voxl-camera-server 1.7.0 onwards, all resolutions a sensor supports can be compressed in real time by the hardware encoder. ## Geo-tag Snapshots with GPS __Note:__ this feature is only available on VOXL 2 When GPS is being published via the [voxl-mavlink-server](/voxl-mavlink-server/), voxl-camera-server will geo-tag each snapshot captured with the latest GPS coordinates. The GPS data (latitude, longitude, altitude) will be saved in the JPEG Snapshot EXIF metadata. In order for this to occur, the user must have a valid GPS connected and actively publishing data from a MAVLink compatible flight controller, such as PX4 or ArduPillot. You can verify GPS is being published with the [voxl-inspect-gps](/voxl-inspect-gps/) tool. In order to view the EXIF metadata of the photo, the user must pull the photo from the VOXL 2 (that lives in /data/snapshots) and then can look at the properties of the image via a double click or by uploading the image to a website that allows for metadata from the EXIF to be viewed. ## Troubleshooting For general service debugging — logs, restarts, running in the foreground — see [Debugging Services](/debugging-services/). From a command line, run ```voxl-camera-server -d0``` to view the output of the camera-server initialiation process. ### Debugging Exposure Settings Send the following command to set the fixed exposure and gain: voxl-send-command set_exp_gain for example: ```voxl-send-command tracking set_exp_gain 20.0 100``` The name-of-output-stream should match the pipe/stream name that you are using. Since there can be multiple streams for the same camera, you can use any stream to set this param. The full set of control commands accepted on a camera's control pipes: `set_exp_gain`, `set_exp`, `set_gain`, `set_fps`, `start_ae`, `stop_ae`, `snapshot`, `snapshot_no_save`, `set_small_venc_mbps`, `set_large_venc_mbps`, `set_misp_venc_mbps`, `set_misp_venc_roi`, `set_misp_awb`, `set_misp_gamma`. ### Supported Configurations Make sure you are using a supported camera configuration for the [VOXL 2](/voxl2-camera-configs/), and [VOXL 2 Mini](/voxl2-mini-image-sensors/). ## Source Code The source code for VOXL Camera Server can be found [here](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) --- Source: https://docs.modalai.com/configure-cameras/ # Configuring VOXL Cameras When setting up a custom VOXL board for the first time or when changing camera configurations, you will need to configure VOXL's software to make it aware of the physical camera configuration. This is done with the `voxl-configure-cameras` tool, which ships with the voxl-camera-server package: ``` voxl2:~$ voxl-configure-cameras ``` Run without arguments it prompts you interactively. The full usage is: ``` voxl-configure-cameras - set up a specific camera config voxl-configure-cameras custom - use /data/modalai/custom_camera_config.txt voxl-configure-cameras disable - configure but leave the service disabled voxl-configure-cameras --dry-run - print the resulting camera + driver list, change nothing voxl-configure-cameras help - show help text ``` ## Camera config IDs are per-platform The list of valid config IDs depends on which board you are on — there is no single global list. Run `print-camera-configs` on target to see the live list for your hardware: - **VOXL 2 / VOXL 2 Mini** (M0054/M0104/M0205): the platform config is read from `/sys/module/voxl_platform_mod/parameters/config`, which selects one of three config sets — the legacy breakout-board set (M0074/M0135 era), the M0173/M0181 coax front-end set, and the VOXL 2 Mini (M0188/M0195) set. - **M0197**: its own dedicated config set. Each numbered config corresponds to a known combination of sensors on known connectors (for example, on Starling the config provides hires + TOF + tracking). The [camera configs reference](/voxl2-camera-configs/) describes the common combinations and their connector wiring. ## What the script does - Generates `/etc/modalai/voxl-camera-server.conf` with per-sensor defaults for the chosen configuration - Applies frame-sync settings (`fsync_en` / `fsync_gpio`) where the config calls for them - Removes all camera driver files (`com.qti.sensormodule*`) from `/usr/lib/camera/` and copies in only the ones the configuration needs - Enables the `voxl-camera-server` systemd service > Power cycle the board after running the script. It changes low-level camera drivers, and the new configuration is not fully applied until a full power cycle. You can further customize the configuration (image resolutions, encoder settings, etc.) by editing the config file directly — see [`voxl-camera-server`](/voxl-camera-server/) for the config file reference. ## Custom camera configurations If your combination of cameras isn't one of the numbered configs, use the custom config workflow instead of hand-editing `voxl-camera-server.conf`: ```bash cp /usr/share/modalai/voxl-camera-server/custom_camera_config.txt /data/modalai/ vi /data/modalai/custom_camera_config.txt voxl-configure-cameras custom --dry-run # preview the camera + driver list voxl-configure-cameras custom ``` The file declares, per camera connector, which sensor is attached and how it should be presented: `J6_LOWER_SENSOR`, `J6_LOWER_NAME`, `J6_LOWER_ROTATE`, combo-mode fields for stereo pairs (`left-right`, `right-left`, `independent`, `single`) with a second name for the pair, and frame-sync fields (`FSYNC_GPIO`, `FSYNC_EN`). The script assigns camera IDs and installs the right drivers for you — no manual renumbering needed. A vehicle can be permanently marked as using a custom camera config by setting the camera field of its [SKU](/sku/) to `CC`. # Connect A New Camera > For most cases, the [custom camera config workflow](#custom-camera-configurations) above handles new cameras automatically. The manual steps below explain what happens under the hood, for unusual setups. When a new camera is physically connected to VOXL2, it is not automatically detected by software. Please follow the steps below to enable a new camera that is added to an existing camera configuration - identify the type of camera (such as IMX412, ov7251, AR0144, etc) - based on where the new camera is actually connected, figure out the camera's hardware slot ID - For VOXL2 without M0173: [link](/voxl2-camera-configs/#overview), see HW Sensor ID (0...5) - VOXL2 J6L : slot 0, J6U : slot 1, J7L : slot 2, J7U : slot 3, J8L : slot 4, J8U : slot 5 - For VOXL2 + M0173: [link](/M0173/#m0173-voxl-2-starling-2-front-end) [link2](/voxl2-coax-camera-bundles): - M0173 J1 : slot 0 (Front Tracking) - M0173 J4 : slot 1 (Hires) - M0173 J5 : slot 2 (Rear Tracking) - M0173 J3 : slot 3 (TOF sensor) - M0173 J2 : slot 6 (Down Tracking) - VOXL2 J8L : slot 4 (can be used with M0076 or M0135, etc) - VOXL2 J8U : slot 5 (can be used with M0076 or M0135, etc, but needs a kernel change due to a reset mapping change) - copy the appropriate sensormodule from `/usr/share/modalai/chi-cdk/` to `/usr/lib/camera` - check if camera is detected, see [link](/debugging-camera-issues/#checking-which-cameras-are-detected-by-camera-server) - you should see your new camera detected in the correct slot - sensor i2c ID (WHOAMI register value) for all cameras is provided [here](/debugging-camera-issues/#sensor-id-to-sensor-type-mapping) - also note the new camera IDs (not slot IDs). The camera IDs are sequentially assigned as the cameras are probed, so connecting the new camera can cause the camera IDs to shift - update the camera IDs for previously existing cameras (in `/etc/modalai/voxl-camera-server.conf`) - add a new camera entry to `/etc/modalai/voxl-camera-server.conf` - if an additional camera is of the same type as another camera in the configuration, simply copy the whole entry and update the camera name and camera id and any settings you might want to change - if the new camera is of a different type, you should at least try to start off with a similar configuration and update camera name, id, type - if your new camera is present in another standard configuration, you can run `voxl-configure-cameras` and temporarily configure the system for that configuration, then check `voxl-camera-server.conf` for the corresponding entry for your camera. After copying that entry, you can restore your original configuration and copy the new sensormodule again - keep in mind that running `voxl-configure-cameras` will change which `sensormodule` files (camera drivers) are present in `/usr/lib/camera` and will re-write `voxl-camera-server.conf` (save changes before running it) ## Useful Definitions - `Camera ID`: Software ID, which is assigned to each camera as the camera is detected during probing state. Camera IDs start from zero and are consecutive. - `Slot ID` : Hardware ID that uniquely maps a camera to the hardware port on VOXL2. Slot ID of a camera remains the same regardless of what other cameras are connected. - `Sensor ID` : typically means the value of WHOAMI register, which is used to detect the camera via I2C (CCI) during camera probing stage as camera server starts up. --- Source: https://docs.modalai.com/camera-video/electronic-image-stabilization/ # Electronic Image Stabilization ## Table of Contents 1. TOC --- ## Overview Electronic Image Stabilization (EIS) enables software-based image (video) stabilization. EIS uses IMU data (accelerometer and gyroscope) to help with removing unwanted rotation of the image. On VOXL2, the EIS processing is performed using a combination of algorithms running on the CPU and GPU. ## Hardware Requirements - VOXL2 or VOXL2 Mini ### Supported Cameras and Input Resolutions ``` - IMX412 (M0107 or M0161) - 4040x3040 - calibration file resolution 4040x3040 or 2020x1520 up to 60FPS - 1996x1520 - calibration file resolution 1996x1520 or 2020x1520 up to 120FPS - IMX664 (M0186) - 2704x1540 - calibration file resolution 2704x1540 or 1352x770 up to 120FPS ``` - Note that output (stabilized) resolution can be any resolution equal to or smaller than the input resolution - If intrinsic calibration files are not provided, ideal defaults will be used (OK for testing without intrinsics cal) ## Software Requirements - EIS implementation will be part of `voxl-camera-server` starting VOXL2 SDK 1.5.? (TBD) ### Latest Source Code - [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/tree/dev) - build from source or use latest nightly build : [dev packages](http://voxl-packages.modalai.com/dists/qrb5165/dev/binary-arm64/) - [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal/-/tree/eis-integration) - need to build the latest package manually in order to use the latest version (not required for basic testing) ## Minimal Setup For Testing ### Minimal Software Setup - Use a recent VOXL2 SDK (1.4.5 or later) - Use standard VOXL2 and camera orientation - VOXL2 right side up, X axis pointing forward - Camera right side up, facing straight forward - Use latest camera drivers - For IMX412: [test drivers](https://storage.googleapis.com/modalai_public/temp/imx412_test_bins/20250409/imx412_fps_eis_20250409_drivers.zip) - For IMX664: included with the SDK - use latest `voxl-camera-server` from nightly or build from `dev` branch - Update `voxl-imu-server` settings : `/etc/modalai/voxl-imu-server.conf` - set `imu0_fifo_poll_rate_hz` to 250 - confirm `imu0_sample_rate_hz` is 1000 - Confirm: - in `/vendor/etc/camera/camxoverridesettings.txt` ... `maxRAWSizes=20` - this allows the camera pipeline to use any of the raw image sizes for the preview stream ### Minimal Camera Server Configuration ``` { "version": 0.1, "cameras": [ { "type": "imx412", "name": "hires", "enabled": true, "camera_id": 0, "fps": 30, "en_preview": true, "en_raw_preview": true, "en_misp": true, "preview_width": 4040, "preview_height": 3040, "misp_width": 1280, "misp_height": 720, "misp_awb": "auto", "misp_zoom": 1.5, "en_eis": true, "eis_mode": "horizon-level", "eis_view": "pip", "eis_follow_rate": 0.01, "en_large_video": false, "en_small_video": false, "en_snapshot": false, "ae_mode": "lme_msv", "en_rotate": false, "misp_venc_enable": true, "misp_venc_mode": "h264", "misp_venc_br_ctrl": "cbr", "misp_venc_Qfixed": 30, "misp_venc_Qmin": 15, "misp_venc_Qmax": 51, "misp_venc_nPframes": 29, "misp_venc_mbps": 3, "ae_desired_msv": 100, "exposure_min_us": 25, "exposure_max_us": 15000, "gain_min": 100, "gain_max": 32000, "exposure_soft_min_us": 5000, "snapshot_jpeg_quality": 75 }], "fsync_en": false, "fsync_gpio": 109 } ``` ### Relevant Camera Server Config parameters - Please note the parameter names may change during development cycle ``` - "type" : should be one of: "imx412", "imx412-fpv-misp", "imx664", "imx664-fpv" - "en_raw_preview" : has to be set to "true" for EIS to work. - "en_misp" : enable Modalai ISP processing, has to be set to "true" - "misp_width" : the output size of the stabilized image. Can be arbitrary size - "misp_height" : the output size of the stabilized image. Can be arbitrary size - "misp_awb" : white balance mode, should be set to "auto" - "en_eis" : enable image stabilization ("true" or "false") - "misp_zoom" : initial digital zoom for eis output (start with 1.5) - "eis_mode" : type of behavior of the stabilized view - "horizon-level" : will completely stabilize roll, but stabilize and follow yaw and pitch - "full-follow" : will stabilize and follow all three axes - "eis_view" : type of output (stabilized) image view - "eis-only" : only show the stabilized view - "pip" : stabilized view + full frame and ROI outline in PIP (picture-in-picture) - "side-by-side" : stabilized view and full frame + ROI outline side by size (wide image) - "eis_follow_rate" : parameter that specifies convergence rate of the ROI to the IMU (0.0 = no convergence, 1.0 = instant) ``` ### Running EIS - For best results, make sure the cpu is in perf mode : `voxl-set-cpu-mode perf` - start `voxl-camera-server` in foreground and confirm that it does not report a critical error - enable adb forwarding `adb forward tcp:8080 tcp:80` - open browser to access `voxl-portal` at localhost : `http://localhost:8080` - select `hires_misp_color` in cameras drop down menu - you should see the stabilized camera view as well as the debug view to the right of the stabilized image ## Calibration Files ### Intrinsic Calibration Files - If intrinsic calibration file is not found, an ideal calibration is assumed for the specific camera / mode - for each camera, calibration file with the following file name format needs to be present in `/data/modalai/` - The `` needs to match the camera `name` property in `voxl-camera-server.conf` ``` /data/modalai/_intrinsics.yml ``` - if the intrinsics file name is not found, a default one for the camera type will be loaded, which will result in suboptimal stabilization quality - calibration files have very specific requirements, related to the resolutions supported by EIS, see Supported Cameras and Resolutions section ### Extrinsic Calibration - If the extrinsics transform is not found, a default transform will be used, assuming the camera is right side up and points straight forward. Specifically: - the camera Z axis is aligned with IMU X axis (forward) - the camera X axis is aligned with IMU Y axis (right) - the camera Y axis is aligned with IMU Z axis (down) - A common file with all extrinsic calibration parameters should already be located in `/etc/modalai/extrinsics.conf` - For each camera, the following entry must be present, where matches the camera `name` property in `voxl-camera-server.conf` - The translational part (`T_child_wrt_parent`) is currently not used by EIS - The rotational part can be approximated based on the design, if exact calibration is not available ``` { "parent": "imu_apps", "child": "", "T_child_wrt_parent": [0.0, 0.0, 0.0], "RPY_parent_to_child": [0, 90, 90] } ``` - Extrinsic rotation examples: - Refer to docs: [VOXL2 IMU](/voxl2-onboard-sensors/#imus) and [VOXL2 Mini IMU](/voxl2-mini-onboard-sensors/#imus) - For these examples we will assume that the VOXL2 / VOXL2 Mini is nominal orientation (X=Forward, Y=Right, Z=Down) - Camera is right side up its optical axis (z) is aligned with VOXL2 X axis (camera points straight forward) ``` "RPY_parent_to_child": [0, 90, 90] ``` - Similar to above, but instead of pointing forward, the camera is pitched down 45 degrees ``` "RPY_parent_to_child": [0, 45, 90] ``` - Similar to above, but instead of pointing forward, the camera is pitched straight down (90 degrees) ``` "RPY_parent_to_child": [0, 0, 90] ``` ## Using EIS with MISP Channels - 3 additional output channels are now supported in addition to the main MISP channel - currently, EIS stabilization parameters are shared for all output channels - eis on/of can be selected on per channel basis ("eis_mode" = "off" will disable EIS on this channel, otherwise will enable. This parameter will be extended) - sample "misp_channels" entry is provided below (this should go in `voxl-camera-server.conf`) ``` ... "eis_follow_rate": 0.01, "misp_channels": [{ "enable": 1, "name": "default_misp", "width": 1280, "height": 720, "fps": 30, "mbps": 2, "nPframes": 29, "codec": "h265", "eis_mode": "on" }, { "enable": 1, "name": "long_range_misp", "width": 960, "height": 540, "fps": 30, "mbps": 0.8, "nPframes": 29, "codec": "h265", "eis_mode": "off" }, { "enable": 1, "name": "low_latency_misp", "width": 960, "height": 540, "fps": 60, "mbps": 1.5, "nPframes": 29, "codec": "h265", "eis_mode": "off" }], ... ``` ### Other Info - EIS includes image undistortion according to the camera calibration parameters - Correct camera calibration will produce better stabilization results - Rolling shutter compensation is not yet available - For best output quality, use maximum input (preview) resolution (`4040x3040` for IMX412), up to 60FPS is supported. - For reduced rolling shutter effect, use lower (2x2 binned) input resolution of (`1996x1520`) - this resolution has faster readout time = reduced rolling shutter effect - debayering process currently adds image smoothing, so using 2x2 binned resolution will result in some loss of image crispness ### Tips - In dark environments, force lower exposure by setting `exposure_max_us` parameter to 5000-10000 us to avoid motion blur - Use H265 encoder for best results (CBR or CQP, depending on desired behavior) - see [link](/voxl-camera-server/#constant-quantization-vs-constant-bitrate-mode) ### Supported Control Commands via `voxl-portal` - Make sure `voxl-portal` is up to date (EIS controls shipped in voxl-portal 0.8.8, included in current SDKs) - Make sure the advanced control panel is active (click on the check box at the bottom left corner of the image view) - Zoom : use mouse wheel while hovering over the image to zoom in / out - Click : click either in stabilized view or full frame view to center the ROI on the clicked point - Drag : click and drag the image to move the ROI (either stabilized or unstabilized) - Manual exposure / gain controls. Note that once manual exposure / gain is selected, the auto exposure does not come back until camera server is restarted (will be fixed soon) - Enable / Disable EIS : checkbox in the advanced control panel ### Performance - up to `3840x2160` @ 60 FPS encoded (h264/h265). GPU utilization about 30% (no pip or side-by-side view) - use of h265 encoder is strongly encouraged (not h264), especially for larger size output streams - viewing larege YUV images in `voxl-portal` will result in significant voxl2 cpu usage and dropped frames in the feed (due to mjpg encoding) - initial testing recommended at lower output resolutions (easier streaming and viewing... `1280x720`, `1920x1080`) ### Calibrating Camera at Half Resolution - set the preview size to full frame (`4040x3040` for IMX412) - set `misp_width` and `misp_height` to half resolution (`2020x1520` for IMX412) - disable EIS (config file: `"en_eis": false`) - set max exposure to 5ms to reduce motion blur (in camera config) - use a pattern displayed on a PC screen (suggested 10x7 checkerboard) - run `voxl-cameera-server` - run `voxl-calibrate-camera hires_misp_grey -f -m -s 10x7 -l 0.1` --- Source: https://docs.modalai.com/voxl-lepton-server/ # FLIR Lepton ## Overview `voxl-lepton-server` (v1.4.x) is a background systemd service that publishes thermal images from a FLIR Lepton 3.5, connected via SPI and I2C, to the Modal Pipe Architecture as a camera. Currently only for QRB5165-based platforms (VOXL 2). If you are connecting a Lepton via USB, please see [voxl-uvc-flir](/voxl-uvc-flir/) Supports the following FLIR cameras: * Lepton V3.5 Images are published at the Lepton's native 160x120 resolution at 9 fps and can be viewed live with [voxl-portal](/voxl-portal/). ## Supported Carrier Boards The Lepton can be connected directly to the VOXL 2 J10 connector (SPI-only) or through one of the following ModalAI carrier boards: | Board | Notes | |---|---| | M0130 | SPI+I2C expansion board, VOXL 2 only (SPI bus 11, I2C bus 0) | | M0141 | SPI+I2C (SPI bus 14, I2C bus 1), requires a system image newer than Dec 1, 2023 | | M0173 | SPI+I2C (SPI bus 0, I2C bus 4), with rotated-image variants for Starling 2 | | M0187 | Lepton breakout board with IO expander, supports hard resets of the Lepton | | M0188 | VOXL 2 Mini Lepton board, I2C connection (single instance off J10 only, channel 0 of the mux) | | M0216 / M0226 | Camera boards with a PI4IO IO expander for toggling the Lepton clock signal (server v1.4.0 and newer) | The M0187, M0188, and M0216/M0226 IO expanders are auto-detected at runtime over I2C. ## Configuration Like all MPA services, `voxl-lepton-server` has a configuration script to enable or disable the service and set up the config file for your hardware: ``` voxl2:/$ voxl-configure-lepton -h Usage: voxl-configure-lepton {MODE} Valid Modes are: disable disable the service VOXL2_J10 configure for SPI-only connection on VOXL2 J10 m0130 configure for SPI+I2C connection on M0130 (VOXL2 only) m0130_flow M0130 on VOXL2 with flow shutter mode m0130_manual M0130 on VOXL2 with manual shutter mode m0173 configure for SPI+I2C connection on M0173 m0173_manual like above but with manual shutter m0173_rotated like above but rotated image for Starling 2 m0173_rotated_manual like above but with manual shutter m0188 configure for I2C connection on M0188 enable enable the service, leave config file alone show this help message: voxl-configure-lepton help ``` An `m0141` mode is also accepted for configuring the M0141 board. ### Config File The service reads its configuration from `/etc/modalai/voxl-lepton-server.conf`. The available fields and their defaults are: | Field | Default | Description | |---|---|---| | `spi_bus` | 14 | SPI bus the Lepton is connected to | | `spi_speed` | 16000000 | SPI clock speed | | `en_i2c` | false | enable the optional I2C CCI (command and control interface) | | `i2c_bus` | 0 | I2C bus for the CCI | | `shutter_mode` | `auto` | one of `auto`, `manual`, or `flow` (see below) | | `flow_shutter_s` | 20 | seconds to wait between shutters in flow mode while on the ground | | `closePeriodInFramesInAir` | 1 | Lepton usually does 4, reduced for a faster shutter in the air | | `openPeriodInFramesInAir` | 0 | Lepton usually does 1, reduced for a faster shutter in the air | | `desiredFfcPeriodMsInAir` | 360000 | FFC period in the air; Lepton usually does 3 minutes, increased to 6 minutes | | `desiredFfcTempDeltaCentiDegInAir` | 600 | sensor temp delta triggering an FFC in the air, in centi-degrees C | | `assign_cpu_num` | 7 | assign the server to a certain CPU number, -1 to disable | | `en_timing_msg` | false | enable the debug timing message pipe | | `en_rotate` | false | rotate the image 180 degrees to compensate for being mounted upside down | Shutter modes: - **Auto** shutter mode is the factory default. The Lepton automatically runs the FFC (flat-field correction) shutter every 3 minutes or during large sensor temperature swings. - **Manual** shutter mode disables the shutter unless manually commanded via the control pipe or the `voxl-lepton-shutter` utility. - **Flow** shutter mode is specific to using the FLIR for optical flow position hold. It runs the shutter every `flow_shutter_s` seconds on the ground and while flying in manual or acro mode. In position mode it lets the Lepton decide when to run the shutter, but with the updated in-air parameters above. ## Pipes `voxl-lepton-server` publishes the following pipes in `/run/mpa/`: | Pipe | Description | |---|---| | `lepton0_raw` | 8-bit greyscale thermal image | | `lepton0_color` | colormapped thermal image | | `lepton0_16raw` | 16-bit raw thermal image | | `lepton0_log` | Lepton log packets | | `lepton0_timing` | timing debug packets, only published when `en_timing_msg` is enabled | | `lepton0_encoded` | H265-encoded video stream | ## Shutter Control The `voxl-lepton-shutter` utility changes the shutter mode while `voxl-lepton-server` is running, forces an FFC shutter calibration, or reboots the Lepton. It sends commands over the `lepton0_raw` control pipe and requires `en_i2c` to be enabled. ``` voxl-lepton-shutter auto voxl-lepton-shutter manual voxl-lepton-shutter flow voxl-lepton-shutter run voxl-lepton-shutter reboot ``` The `run` command can be used in either manual or auto mode. Set the default mode with `shutter_mode` in `/etc/modalai/voxl-lepton-server.conf`. ## Command Line Options For debugging, `voxl-lepton-server` can be run manually from the command line: ``` voxl2:/$ voxl-lepton-server -h Usage: voxl-lepton-server Options: -c, --config load/create config file only, used by configurator -d, --debug Show debug messages. -e, --debug_ffc debug messages for shutter and CCI -h, --help Show help. -t, --timing Enable timing debug print messages -v, --verbose Enable verbose messages -x, --crystal_on Turn the m0226 crystal on only, then exit -y, --crystal_off Turn the m0226 crystal off only, then exit ``` ## Source Code [Source Code](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-lepton-server/) --- Source: https://docs.modalai.com/voxl2-hadron/ # FLIR Hadron 640R Support on VOXL 2 and VOXL 2 Mini --- ## Overview VOXL 2 and VOXL 2 Mini support the FLIR Hadron 640R dual thermal/EO payload. A ModalAI adapter set and micro-coax cables are required. ### Required Hardware - FLIR Hadron 640R (not included) - M0202 (or M0159) + M0181 adapters - MCBL-00084-180 micro coax 180mm cables, qty 2 (shorter options available) > M0202 is a newer version of M0159 with identical functionality and a slightly better fit into the Hadron. References to M0159 below apply equally to M0202. > Mate M0159 to M0181 with care. The two coax cables are identical, but their **order cannot be swapped**: M0159 J2 (5L) connects to M0181 J1 (5L), and M0159 J3 (HR) connects to M0181 J2 (HR) — HR to HR, 5L to 5L, as labeled next to the connectors on both boards. Connecting them incorrectly will likely **damage the Hadron 640R** due to incompatible power rails. Shipped assemblies come correctly connected and tested. ### Interfacing Options - With the M0159 adapter plugged into the back of the Hadron 640R, the USB port on M0159 can power the Hadron and configure the IR sensor over USB. - To use the MIPI connection for the IR sensor, the sensor must be configured to enable MIPI output — see the [M0153 software instructions](/M0153/). - On some Hadron firmware versions, switching from 60 to 30 FPS is required (as described in that document) because 60 FPS frame timing can be incompatible with the VOXL 2 camera ISP, stopping the stream shortly after start. - Hadron firmware `3.0.26416` has been tested to work at 60 FPS. On other firmware, select 30 FPS using the frame-skip feature in the Hadron configuration. - It is safe to have the Hadron connected to both VOXL 2 and USB — just make all connections while VOXL 2 is powered off. - The USB connection also works with the FLIR GUI for configuring the IR sensor, and with the standard Linux UVC driver for viewing IR images. ## Hardware Setup ### Connect the M0159 Adapter to the Hadron - If necessary, remove any interface boards plugged into the Hadron 640R so the M0159 sits flush against its back. - Make sure the M0159 connector aligns with the Hadron. - See the [images below](#images-and-diagrams) for a correctly mated connection. ### Connect M0181 to VOXL 2 or VOXL 2 Mini - Check pin alignment on the connectors: the mounting holes should align, and the M0181 tab will hover above the main SoC (the tab can be removed if not needed). - **VOXL 2 Mini** supports the Hadron on J6 or J7 with the default kernel: - J6 — sensormodules `com.qti.sensormodule.boson_0.bin` and `com.qti.sensormodule.ov64b40_1.bin` - J7 — sensormodules `com.qti.sensormodule.boson_2.bin` and `com.qti.sensormodule.ov64b40_3.bin` - **VOXL 2** supports the Hadron on J7 or J8: - J7 — sensormodules `com.qti.sensormodule.boson_2.bin` and `com.qti.sensormodule.ov64b40_3.bin` — **must use kernel variant 0** - J8 — sensormodules `com.qti.sensormodule.boson_4.bin` and `com.qti.sensormodule.ov64b40_5.bin` — **must use kernel variant 1** (for M0173) - J6 is possible but requires a kernel change and is not recommended. ## Software Setup Install VOXL SDK 1.4.0 or later on the VOXL 2 or VOXL 2 Mini. ### Confirm the Sensormodule Drivers Exist All camera drivers ship in the `chi-cdk` directory (present but unused until copied): ```bash ls /usr/share/modalai/chi-cdk/ov64b40 # com.qti.sensormodule.ov64b40_0.bin ... 5.bin ls /usr/share/modalai/chi-cdk/boson # com.qti.sensormodule.boson_0.bin ... 5.bin ``` ### Copy the Correct Sensormodule Drivers Select the sensormodule index matching the camera connector the Hadron is on (this example is VOXL 2 J7): ```bash cp /usr/share/modalai/chi-cdk/boson/com.qti.sensormodule.boson_2.bin /usr/lib/camera/ cp /usr/share/modalai/chi-cdk/ov64b40/com.qti.sensormodule.ov64b40_3.bin /usr/lib/camera/ ``` Also confirm the sensor libraries exist: ``` /usr/lib/camera/com.qti.sensor.ov64b40.so /usr/lib/camera/com.qti.sensor.boson.so ``` ### Configure the CCI Mux on M0159 via GPIO The Hadron module has a single CCI bus, while the two VOXL 2 camera ports in use (IR + RGB) expect two CCI buses. A mux on M0159 bridges them: - For the J7 option, drive GPIO 6 high to connect J7U CCI to the Hadron's camera CCI (for J6/J8 see below). - This must be done after every reboot, **before** starting the camera server. - After enabling the mux, the CCI buses for J7L and J7U are physically connected. Camera probing happens sequentially at camera-server startup, and VOXL 2 does not normally talk to the IR sensor after streaming starts, so bridging the buses is not a problem. ```bash # VOXL 2 / VOXL 2 Mini J6 voxl-gpio -m 30 out && voxl-gpio -w 30 1 # VOXL 2 / VOXL 2 Mini J7 voxl-gpio -m 6 out && voxl-gpio -w 6 1 ``` > **VOXL 2 J8**: the mux-enable pin for J8 is GPIO 14, but that pin is mapped to UART5_TX (`/dev/ttyHS0`) and cannot be driven as GPIO (see the [J8 pinout](/voxl2-connectors/#j8-pin-out)). When the UART is idle its TX line rests high, which happens to enable the mux — so there is nothing to configure; just **do not use** `/dev/ttyHS0` while the Hadron is on J8. ## Testing ### Detect Cameras ``` voxl2-mini:/$ voxl-camera-server -l DEBUG: Attempting to open the hal module DEBUG: SUCCESS: Camera module opened on attempt 0 DEBUG: ----------- Number of cameras: 2 DEBUG: Cam idx: 0, Cam slot: 2, Slave Address: 0x00D4, Sensor Id: 0x00FF DEBUG: Cam idx: 1, Cam slot: 3, Slave Address: 0x006C, Sensor Id: 0x6442 DEBUG: Note: This list comes from the HAL module and may not be indicative DEBUG: of configurations that have full pipelines DEBUG: Number of cameras: 2 ... ``` ### Minimum Configuration Paste into `/etc/modalai/voxl-camera-server.conf`: ```json { "version": 0.1, "fsync_en": false, "fsync_gpio": 109, "cameras": [ { "type": "boson", "name": "boson", "enabled": true, "camera_id": 0, "fps": 30, "en_preview": true, "en_misp": false, "preview_width": 640, "preview_height": 512, "en_raw_preview": true, "en_small_video": false, "en_large_video": false, "ae_mode": "off" }, { "type": "ov64b", "name": "hires", "enabled": true, "camera_id": 1, "fps": 30, "en_preview": true, "en_misp": false, "preview_width": 1920, "preview_height": 1080, "en_raw_preview": false, "en_small_video": false, "en_large_video": false, "en_snapshot": false, "ae_mode": "isp", "gain_min": 100, "gain_max": 32000 } ] } ``` ### Start the Camera Server Run `voxl-camera-server` in the foreground first to confirm everything works, and view the streams in [voxl-portal](/voxl-portal/). Without voxl-portal, streams can be checked with `voxl-inspect-cam`: ``` voxl2-mini:/$ voxl-list-pipes boson hires_color hires_grey voxl2-mini:/$ voxl-inspect-cam boson hires_color | Pipe Name | bytes | wide | hgt |exp(ms)| gain | frame id |latency(ms)| fps | mbps | format | boson | 327680 | 640 | 512 | 0.00 | 799 | 456 | 11.2 | 60.0 | 157.3 | RAW8 | hires_color | 3110400 | 1920 | 1080 | 16.64 | 324 | 224 | 40.0 | 29.8 | 741.8 | NV12 ``` > Very high resolution streams viewed as YUV (transferred as MJPG by voxl-portal) cost significant CPU to encode and a lot of bandwidth to stream. ## Supported Resolutions and Modes - The IR sensor supports `640x512` resolution. - The OV64B currently supports the RAW modes below; the camera pipeline picks the best mode for the requested resolution and FPS. - For example, requesting `3840x2160` at 30 FPS actually selects `4624x3472`, because it matches the desired FPS. - The selected mode can be checked with `logcat | grep -i selected` before starting the camera server — the selected resolution is printed for each camera. ``` # (Mbps per CSI lane) Mode0_9248x6944_10fps_2500.8Mbps Mode1_4624x3472_30fps_PD_1136x860_1502Mbps Mode4_3840x2160_60fps_2500.8Mbps Mode5_1920x1080_240fps_2500.8Mbps Mode6_1920x1080_30fps_800Mbps ``` ### Maximum Resolution `9248x6944` at 9 FPS, configured in `voxl-camera-server.conf`: ```json "preview_width": 9248, "preview_height": 6944, ``` At this >8K resolution the Qualcomm ISP runs in dual-VFE mode, which means no other non-RAW camera can use the ISP. The MISP approach below does not use the Qualcomm ISP and avoids this limit. ### MISP (ModalAI ISP) MISP is ModalAI's own image processing pipeline in `voxl-camera-server`. It bypasses the Qualcomm ISP entirely, so it is not subject to ISP resource limits like the dual-VFE constraint above — freeing the hardware ISP for other cameras. Electronic image stabilization ([EIS](/camera-video/electronic-image-stabilization/)) also runs on the MISP path. MISP is enabled per camera in `/etc/modalai/voxl-camera-server.conf`: ```json "en_misp": true, "misp_width": 1920, "misp_height": 1080, ``` MISP cameras publish their streams on `*_misp_*` pipes (e.g. `hires_misp_color`, `hires_misp_encoded`), and an onboard video encoder can be enabled with the `misp_venc_*` fields (codec, bitrate control — including an ROI mode that encodes the frame center at higher quality — and bitrate). See the [voxl-camera-server](/voxl-camera-server/) page for the full configuration reference. ## Images and Diagrams ### M0159 Adapter Plugged into Hadron 640R ![m0159-plugged-into-hadron](/images/voxl-sdk/flir/m0159_hadron_adapter.jpg) ### M0181 Adapter M0181 top: ![m0181-top](/images/voxl-sdk/flir/m0181_top.jpg) M0181 bottom: ![m0181-bottom](/images/voxl-sdk/flir/m0181_bottom.jpg) ### M0181 Plugged into VOXL 2 Mini J7 ![voxl2-mini-hadron-setup](/images/voxl-sdk/flir/hadron_m0181_voxl2_mini_j7.jpg) ### Connection Diagram The primary configuration is M0159 + M0181; M0159 + M0155 + M0162 is also possible. ![voxl2-hadron-connection-options](/images/voxl-sdk/flir/hadron-connection-options.png) ### USB Connector on M0159 (J4) M0159 has a 6-pin USB connector (J4), connector type `BM06B-SRSS-TBT`. Pin 1 is marked with a dot on the silkscreen (arrow in the image below). ![m0159-j4](/images/voxl-sdk/flir/m0159_j4.jpg) | Pin# | Signal | Notes/Usage | |------|----------------------|-------------------------------------------| | 1 | 5V_VDC | 5V power input from USB | | 2 | GND | GND | | 3 | SYNC_GPIO | Unused | | 4 | GND | GND | | 5 | USB_D_P | USB 2.0 Data P | | 6 | USB_D_N | USB 2.0 Data N | --- Source: https://docs.modalai.com/voxl-uvc-server/ # voxl-uvc-server ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server/badges/master/pipeline.svg?key_text=Master+Pipeline&key_width=100&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server/badges/dev/pipeline.svg?key_text=Dev+Pipeline&key_width=85&ignore_skipped=true) ![Project badge](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server/-/badges/release.svg?key_text=Latest Release&key_width=100) ## Overview [voxl-uvc-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-uvc-server) `voxl-uvc-server` is an application which grabs video from [UVC cameras](https://en.wikipedia.org/wiki/USB_video_device_class) and serves up the video as an MPA (Modal Pipe Architecture) pipe for other applications to pull from. This server is often used in conjunction with [voxl-streamer](/voxl-streamer/). There are a large array of UVC cameras on the market and we haven't tested them all, but below is a list of some that we know `voxl-uvc-server` supports. In general, `voxl-uvc-server` supports UVC cameras that have the ability to provide a raw frame output. - Logitech C270 - Logitech C930e - Logitech Brio - Videology 5MP Micro USB 2.0 Board Camera - [PureThermal Mini with Flir Lepton](https://groupgets.com/products/purethermal-mini-usb) - Flir Boson 640 - Blue Robotics h264 camera ## Usage As with all MPA services, `voxl-uvc-server` can be configured and enabled to run on boot using it's configuration script. Usage is as follows: ``` voxl2:/$ voxl-configure-uvc -h Tool to configure voxl-uvc-server Shortcut configuration arguments for scripted setup. factory_enable will reset the config file to factory defaults before enabling the service. voxl-configure-uvc disable voxl-configure-uvc factory_enable voxl-configure-uvc enable voxl-configure-uvc boson voxl-configure-uvc lepton voxl-configure-uvc vga30 (same as default) voxl-configure-uvc 1080p5 (for logitech 1080p webcam) show this help message: voxl-configure-uvc help ``` Configuring `voxl-uvc-server` will set up the following default configuration file: ``` voxl2:/$ cat /etc/modalai/voxl-uvc-server.conf /** * This file contains configuration that's specific to voxl-uvc-server. * parameter descriptions: * * width: Desired image width. (e.g. 640) * Default is 640. * * height: Desired image height. (e.g. 480) * Default is 480. * * fps: Desired frame rate in fps (e.g. 15). * Default is 30. * * pipe_name: Desired MPA pipe name in /run/mpa (e.g. webcam). * Default is uvc. * * encoder_enable: Enable the h264/h265 hardware encoder. * Default is true. * * encoder_codec: "h264" or "h265". * Default is h265. * * encoder_bitrate_mbps: Target bitrate in megabits/sec (CBR). * Default is 2.0. * * encoder_gop: Number of P-frames between keyframes. 0 = auto (fps). * Default is 0. * * encoded_pipe_name: MPA pipe name for encoded stream. Empty = _encoded. * Default is empty. * */ { "pipe_name": "uvc", "width": 640, "height": 480, "fps": 30, "encoder_enable": true, "encoder_codec": "h265", "encoder_bitrate_mbps": 2, "encoder_gop": 0, "encoded_pipe_name": "" } ``` ### Hardware Encoder As of version 0.1.8, `voxl-uvc-server` can hardware-encode the camera stream and publish it on a second pipe. This is controlled by five config keys: - `encoder_enable`: enable the h264/h265 hardware encoder (default `true`) - `encoder_codec`: `"h264"` or `"h265"` (default `"h265"`) - `encoder_bitrate_mbps`: target bitrate in megabits/sec, CBR (default `2.0`) - `encoder_gop`: number of P-frames between keyframes, `0` = auto (fps) (default `0`) - `encoded_pipe_name`: MPA pipe name for the encoded stream; empty means `_encoded` (default empty) If a camera doesn't support the default configuration, use one of the configuration presets or edit the config file. For example, the PureThermal Mini with FLIR Lepton requires 160x120 at 9 fps, which is set up by running: ```bash voxl-configure-uvc lepton ``` Presets are also available for the FLIR Boson (`boson`), a standard VGA webcam (`vga30`, same as the default), and 1080p webcams such as the Logitech 1080p models (`1080p5`). After modifying the configuration file, `voxl-uvc-server` can be restarted by power cycling or running the following: ```bash systemctl restart voxl-uvc-server ``` ## Tips `voxl-uvc-server` also provides a few helpful debugging tools in order to troubleshoot issues or determine the required configuration for a new camera. The Linux command line utility, `lsusb`, can be very helpful to see what devices have enumerated on the USB bus. One can run the command with a USB camera attached to see if the camera has enumerated. ``` voxl2:/$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ``` One can look at the above output and determine the vendor ID and Product ID of their camera, in this example the vendor ID is `046d`, while the product ID is `0825` `lsusb -v -d $VENDOR_ID:$PRODUCT_ID` can also provide a lot more information about a specific device, for example: ``` voxl2:/$ lsusb -v -d 046d:0825 Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x046d Logitech, Inc. idProduct 0x0825 Webcam C270 bcdDevice 0.12 iManufacturer 0 iProduct 0 iSerial 2 9C06CEC0 bNumConfigurations 1 ... ``` `voxl-uvc-server` also provides a script called `show-video-device-info.sh` which can be used to get useful information about any attached UVC cameras: ``` voxl2:/$ show-video-device-info.sh /dev/video2: UVC Camera (046d:0825) 046d:0825 ``` For debugging purposes, `voxl-uvc-server` can be ran manually from the command line and has the ability to pass in a few arguments for customization: ``` voxl2:/$ voxl-uvc-server -h Usage: voxl-uvc-server Options: -d Show extra debug messages -v USB vendor id of the desired UVC device in hexadecimal (e.g. 090c) Default is search for any vendor id -p USB product id of the desired UVC device in hexadecimal (e.g. 337b) Default is search for any product id -r Desired image resolution (e.g. 320x240) Default is 640x480 -f Desired frame rate in fps (e.g. 15) Default is 30 -l List all devices found then exit -o Custom output name Default is uvc -s Use this to launch a new instance alongside the default service -h Show help -E Disable the hardware encoder (default: enabled) -C Codec for encoded pipe (default: h265) -B Encoder target bitrate in Mbps (default: 2.0) -G Encoder GOP size (P-frames between I-frames, 0 = fps) -O Encoded pipe name (default: _encoded) ``` These arguments will override the config file at `/etc/modalai/voxl-uvc-server.conf` ## Simultaneous UVC cameras As of version 0.1.7, the supported way to run a second UVC camera is to launch a second instance of `voxl-uvc-server` with the `-s` (standalone) flag, which lets it run alongside the default service instead of replacing it. Give the second instance its own output pipe name with `-o` and select the desired camera by vendor and product id: ```bash voxl-uvc-server -s -o uvc2 -v 046d -p 0825 ``` > Due to a bug in [libuvc](https://github.com/libuvc/libuvc), two USB cameras may fail to stream simultaneously if they use identical formatting options. If you run into this, make one camera use different formatting options than the other; the least intrusive way is to set a different frame rate on one instance, e.g. `-f 25`. --- Source: https://docs.modalai.com/voxl-streamer/ # How to Stream Video with RTSP on VOXL --- ## Overview voxl-streamer is a background service that subscribes to [MPA image streams](/mpa-camera-interface/), compresses them if necessary, and makes them available as an RTSP stream at: ``` rtsp://:8900/live ``` The port is configurable (default 8900); the `/live` mount point is fixed. This is enabled by default on most systems to enable automatic streaming of video to QGroundControl by [voxl-mavcam-manager](/voxl-mavcam-manager/) — FPV SKUs are the exception, where video ships through voxl-vtx instead. This video shows setting up a 720p encoded video stream with a VOXL 2 and IMX412: [YouTube](https://www.youtube.com/watch?v=DFbJE9w4PGI&ab_channel=ModalAI) ## General Use as a Service voxl-streamer runs in the background via its systemd service (visible in [voxl-inspect-services](/mpa/#using-services)), started with no arguments — all behavior comes from the config file. Manage it with: ```bash voxl-configure-streamer factory_enable # reset config to defaults and enable voxl-configure-streamer enable # enable (starts on next reboot) voxl-configure-streamer disable # disable and stop ``` Multiple RTSP clients can watch the same stream simultaneously — the encoded media is shared. When no clients are connected, voxl-streamer disconnects from the MPA pipe entirely to save power and CPU, reconnecting when the next client shows up. ## Configuration File `/etc/modalai/voxl-streamer.conf` (JSON, created with defaults on first run): | Field | Default | Meaning | |:-------------|:----------------------|:-------------------------------------------------------------------------| | `input-pipe` | `hires_small_encoded` | MPA camera pipe to subscribe to | | `port` | `8900` | RTSP port to serve on | | `bitrate` | `1000000` | Bitrate for onboard encoding — **raw input only** (see below) | | `decimator` | `1` | Drop frames to reduce framerate — **raw input only** | | `rotation` | `0` | Rotate the video 0/90/180/270 degrees — **raw input only** | | `encoder` | `h264` | Onboard encoder when input is not already encoded: `h264` or `h265` | ## Two Primary Modes **Pre-encoded input (default).** voxl-streamer can subscribe to pre-encoded H264 or H265 MPA pipes such as the default `hires_small_encoded`. This is most efficient: frames pass straight through to RTSP with no re-encode. In this mode the `bitrate`, `rotation`, and `decimator` fields are **ignored** — set bitrate and GOP in `voxl-camera-server.conf` instead. **Raw input.** When pointed at an uncompressed pipe (RAW8, NV12, YUV, RGB — e.g. `tracking` or `qvio_overlay`), voxl-streamer builds a GStreamer pipeline that can rotate, decimate, and compress the video to the configured `bitrate` using the platform's hardware encoder. This works well but is less efficient than pre-encoded input. > The original VOXL (apq8096) supports H264 onboard encoding only — `encoder: h265` errors out there. VOXL 2 supports both. ## Running Multiple Instances Each voxl-streamer process serves one stream. To stream a second camera alongside the background service, launch another instance with `--standalone` (so it doesn't kill the service's process) and a unique `--port`: ```bash voxl-streamer --standalone --port 8901 -i tracking ``` That second stream is then at `rtsp://:8901/live`. > Running `voxl-streamer` by hand **without** `--standalone` kills the running background service instance — that's by design, so a manual run can take over cleanly. ## Command Line Reference ``` -b --bitrate <#> | Override bitrate specified in the config file -c --config | Load config file only and quit (used for scripted setup) -d --decimator <#> | Override the decimator specified in the config file -h --help | Print this help message -i --input-pipe | Override the input pipe specified in the config file -e --encoder | Choose video encoder h264 or h265 (if video is not already encoded) -p --port <#> | Override the RTSP port number specified in the config file -s --standalone | Use this to launch a new instance alongside the default service -v --verbosity <#> | Log verbosity level (Default 2) ``` CLI flags override the config file. Tab completion is installed — `-i` completes live camera pipes. ## Troubleshooting For general service debugging — logs, restarts, running in the foreground — see [Debugging Services](/debugging-services/). - **Stream won't open**: confirm the service is running (`voxl-inspect-services`) and the configured `input-pipe` exists (`voxl-list-pipes`). The startup log prints the stream URL. - **Choppy or stalling video**: voxl-streamer drops frames rather than buffering under load; if the source pipe backs up it is flushed. Reduce resolution/bitrate at the source, or lower the framerate with `decimator` (raw input). - **`Frame size mismatch ... Shutting down`**: the pipe's advertised frame size doesn't match reality — usually a camera configuration change; re-check `voxl-configure-cameras`. - **Rotation/bitrate/decimator "not working"**: those only apply to raw input — with a pre-encoded pipe, adjust `voxl-camera-server.conf`. - If the camera server restarts, voxl-streamer automatically reconnects and re-serves the stream. For a deeper latency-focused setup, see [Low Latency Video Streaming](/camera-video/low-latency-video-streaming/). --- Source: https://docs.modalai.com/camera-video/low-latency-video-streaming/ # Low Latency Video Streaming Using VOXL2 # Overview ## Components of Glass-To-Glass Latency Using Wifi - glass-to-glass means camera-to-screen, which represents the total end-to-end latency ### Typical Data Flow ![data-flow](/images/voxl-sdk/camera-misc/fpv_data_flow.jpg) ### Sources of Latency on the Transmitter Side (VOXL2) - frame acquisition - frame exposure time (controlled by Auto Exposure algorithm or manual exposure) - frame readout time (fixed for a given camera streaming mode, depends on camera, frame size and configured transmission speed) - frame exposure and readout (in a rolling shutter camera) happen concurrently in a rolling pattern - image processing (RAW to RGB / YUV conversion + all other image processing) - Using Qualcomm ISP, or - Using ModalAI processing pipeline (MISP) - video encoding, typically hardware encoder (H264 or H265) - either directly using `voxl-camera-server` - or using voxl-streamer to encode uncompressed frames - video packaging - for example, RTSP stream, using `voxl-streamer` - wifi transmission - latency depends on encoded frame size and communication link speed - unreliable link will result in data loss and re-transmission, resulting in extra delay - UDP protocol may be used to remove re-transmission latency, but corrupted frames will be lost ### Sources of Latency on the Receiver Side - reception of data via Wifi (the same latency as the transmission time on the transmitter, do not double count) - parsing of encoded packets and decoding the H264 / H265 stream into full image (using either SW or HW decoder) - buffering in order to ensure smooth playback (this is not good for latency!) - composition / rendering of the screens (if using a Desktop Manager) - transmission of the display buffer to the display (HDMI, DisplayPort, etc) - buffering on the display side, since the display is typically not frame-synchronized with the Receiver ## How to Measure Camera Pipeline Latency - use `voxl-inspect-cam` to inspect the `_encoded` stream - latency figure is the total latency after the frame starts transmitting into VOXL2 (after exposure of the first line for rolling shutter cameras) until the encoded frame is ready - this does not include the frame exposure time - in order to calculate total TX latency of the center of the image, as an approximation, add 1/2 of the frame exposure time - frame timestamp (from `voxl-camera-server`) is the start of exposure of the first row of the image - running VOXL in `Performance Mode` (`voxl-set-cpu-mode perf` should reduce the TX latency slightly) ## Optimizing Latency on the Transmitter Side - use latest camera drivers that reduce the readout time - for `IMX412 Camera` : https://storage.googleapis.com/modalai_public/temp/imx412_test_bins/20250409/imx412_fps_eis_20250409_drivers.zip - do not configure high-resolution streams if they are not used - this will allow selecting a lower resolution camera mode, reduce readout time - set VOXL2 to performance mode : `voxl-set-cpu-mode perf` - if possible, remove any buffering on the video server side (RTSP, etc) ## Optimizing Latency on the Receiver Side - A custom decoding / rendering pipeline may be required to achieve lowest latency - Use hardware-based decoder if available - Reduce buffering delay, typically added by decoder / player for smooth playback - the Display FPS will affect the total stream latency (higher FPS will result in lower latency) - Use a display that supports 120 or 240 FPS and configure your OS to run the display at highest refresh rate - running the display at highest possible rate will reduce the buffering time in OS and the display itself - there will still be extra frames of delay due to buffering, but the frame duration will be shorter at higher FPS - Desktop manager will add 1-2 frame latency in order to compose and render the whole "desktop" before sending to the display - if possible, reduce the delay of the desktop manager (e.g. enter full screen mode) ## Camera Pipeline Latency in Different Operating Modes - IMX412 Camera with latest drivers - does not include encoded frame packaging / transmission - latency measured `voxl-inspect-cam` tool and may include small additional overhead - `voxl-inspect-cam` tool subscribes to the camera stream and reports the time between start of frame readout and receiving the (encoded) frame - Note that increasing source resolution will typically improve the down-scaled image quality, so if the additional delay is not critical, using higher input resolution may be desired | Operating Mode (IN -> OUT) | Readout (ms) | Processing MISP / ISP (ms) | Encoding (ms) | Total Latency MISP / ISP (ms) | |------------------------|--------------------|----------------------------|---------------------|-------------------------------------| | 3840x2160 -> 3840x2160 | 12 | 6-10 / 10-15 | 14-15 | 34-38 / 40-42 | | 3840x2160 -> 1920x1080 | 12 | 4-6 / 6-8 | 7-8 | 26-28 / 28-30 | | 3840x2160 -> 1280x720 | 12 | 3-4 / 4-6 | 4-5 | 23-24 / 26-27 | | 1920x1080 -> 1920x1080 | 4 | 2-3 / 3-4 | 4-5 | 15-17 / 18-20 | | 1920x1080 -> 1280x720 | 4 | 1-2 / 2-3 | 4-5 | 11-13 / 14-16 | ## Voxl Camera Server Configuration ### How to Check Which RAW Resolutions are Available - in this example we are using IMX412 drivers dated 20250311 ``` voxl-camera-server -l ... ANDROID_SCALER_AVAILABLE_RAW_SIZES: These are likely supported by the sensor 4056 x 3040 4040 x 3040 4040 x 3040 3840 x 2160 3840 x 2160 3840 x 2160 1996 x 1520 1996 x 1520 1996 x 1520 1936 x 1080 1936 x 1080 .. ``` - multiple entries for each resolution are shown because there are different FPS for each resolution, but FPS are not shown - you should only request the resolution that is available and check the following table for available FPS: ### IMX412 Operating Modes - using camera drivers from 20250409 (see link above) - ** the camera in 4040x3040@60 mode is slightly overclocked from 2.1Gbps / lane to 2.2Gbps MIPI bit rate (voxl2 supports up to 2.5Gbps) in order to allow sufficient time between EOF and SOF. ``` - 4056x3040 @ 30 16.5ms readout time - 4040x3040 @ 30, **60** 16.5ms readout time - 3840x2160 @ 30, 60, 80 11.8ms readout time - 1996x1520 @ 30, 60, 120 5.5ms readout time - 1936x1080 @ 30, 60, 90, 120, 240 4.0ms readout time - 1996x480 @ 30, 480 1.8ms readout time *** experimental *** - 1996x240 @ 30, 800 0.9 - 1.0 ms readout time *** not always stable at 800 FPS *** ``` ### Voxl-camera-server.conf When Using Qualcomm ISP - using latest camera drivers with Qualcomm ISP option is not a must - however, it is still important to track the input resolution vs output - input resolution (`preview_width`) may need to be adjusted to 1920, depending on the camera driver used - using older drivers will result in slightly slower readout times (about 25% slower, which is not critical) - enabling `en_raw_preview` will enforce the specific camera mode, even if the preview stream is not actually consumed at run time - `en_preview` and `en_raw_preview` may be disabled if you want to just let the camera pipeline pick the best quality mode for the `small_encoded` video - typical `voxl_camera_server.conf` settings: ``` - fps: 60 - en_preview : true - en_raw_preview : true - en_misp : false - preview_width : 1936 (or 1920) - preview_height : 1080 - ae_mode : isp - en_small_video : true - en_large_video : false - en_snapshot : false - small_video_width : 1280 - small_video_height : 720 - small_venc_mode : h265 - small_venc_br_ctrl : cbr - small_venc_mbps : 1.0 - small_venc_nPframes : 29 ``` ### How to Confirm Which Camera Resolution Was Selected by the Pipeline - double check in `/vendor/etc/camera/camxoverridesettings.txt` - `maxRAWSizes=20` : this is needed to allow camera pipeline to use all available RAW resolutions - `systemLogEnable=1` : this is needed to see the selected resolution in the debug message. System log can be disabled after testing, will slightly reduce cpu usage. this is logging from camera pipeline that goes to logcat - run `logcat | grep -i selected` in one terminal on VOXL2 - start `voxl-camera-server` in another terminal on VOXL2 - the first terminal will print: ``` 03-19 22:22:35.774 27237 27237 I CHIUSECASE: [CONFIG ] chxextensionmodule.cpp:2358 InitializeOverrideSession() Session_parameters FPS range 60:60, previewFPS 0, videoFPS 0 BatchSize: 1 HALOutputBufferCombined 0 FPS: 60 SkipPattern: 2, cameraId = 2 selected use case = 1 03-19 22:22:35.778 27237 27237 I CHIUSECASE: [CONFIG ] chxsensorselectmode.cpp:635 FindBestSensorMode() Selected Usecase: 7, SelectedMode W=1936, H=1080, FPS:60, NumBatchedFrames:0, modeIndex:10 03-19 22:22:35.778 27237 27237 I CHIUSECASE: [CONFIG ] chxpipeline.cpp:371 CreateDescriptor() Pipeline[PreviewRaw] Pipeline pointer 0x55b9f62cf0 Selected sensor Mode W=1936, H=1080 03-19 22:22:35.778 27237 27237 I CamX : [CONFIG][CORE ] camxsession.cpp:5907 SetRealtimePipeline() Session 0x55ba1299d0 Pipeline[PreviewRaw] Selected Sensor Mode W=1936 H=1080 ``` - pay attention to the resolution listed as `Selected Sensor Mode` ## Suggested Use Case for FPV Wifi Streaming - IMX412 Camera is recommended for best low latency performance - output resolution `1280x720`, down-scaled during processing - binned camera resolution, such as `1920x1080`. Use `1936x1080` for compatibility with MISP (`1936x1080` input, `1280x720` output) - `h265` encoder, `CBR at 0.5 - 1.5 Mbps`; number of P frames: `29` or `59` (or choose lower if less dropout is needed in case of frame drop) - use 60FPS camera frame rate - ideally, use UDP-based transmission protocol (not discussed here) - for even lower latency, a lower resolution may be used, such as `960x540` ## How To Test End-to-end Latency - In order to eliminate measurement variability due to exposure length, use manual exposure and set to a small value (1-2ms) - An approximate measurement can be done by pointing the camera at a millisecond timer (using a phone or laptop screen) and taking a picture of the timer and rendered screen of the streamed video (side by side) - the difference in the time is the total latency - note that refresh rate of phone displays can be variable - Ideal test would involve a hardware timer that updates at a very fast rate, such as 1ms (instead of a timer that is rendered on a screen) - A delay in number of frames can be measured by embedding a frame count or a timestamp directly into the transmitted image - this measurement will have a granularity of one frame - How to enable frame number watermark (works only with ISP pipeline) ``` #add the following to /vendor/etc/camera/camxoverridesettings.txt and restart voxl-camera-server watermarkImage=TRUE watermarkOffset=20x20 forceDisableUBWCOnIfeIpeLink=TRUE ``` ### Example of Image With Frame Counter Watermark ![watermark-example](/images/voxl-sdk/camera-misc/watermark_example.jpg) ### Example of Streaming Delay Shown Using the Counter Watermark - using `voxl-portal` to display the YUV stream, which is transmitted encoded as MJPEG - in this example, the delay between 5-7 frames (probably 6 on average), at 60FPS, 6 * 16.666 = 100ms - note that MJPEG encoding is slower than H264 / H265 and Display used is running at 60Hz - however, in this case we are bypassing any buffering done by rtsp server and client because `voxl-portal` renders MJPEG instantly ![watermark-delay](/images/voxl-sdk/camera-misc/watermark_example_delay.jpg) ### Display Low Latency H264 or H265 Stream Using a Ubuntu Desktop or Laptop - use the ISP pipeline in this example (not MISP) - start `voxl-camera-server` on voxl2 - start `voxl-streamer` on voxl2: ```bash voxl-streamer -i hires_small_encoded ``` - using ffmpeg / ffplay ``` ffplay -fflags nobuffer -flags low_delay rtsp://:8900/live ``` - testing of alternate `ffplay` flags may be needed - ffplay is not robust to packet drops, may result in video freezing - achieving low latency using h264 / h265 requires experimentation with network transport and HW and SW selection and tuning on the receiver side ### Use FFplay with MJPEG from Voxl Portal ``` ffplay -fflags nobuffer -flags low_delay http://localhost:8080/video_raw/hires_small_color -f mjpeg -framerate 60 ``` - in this case, we have set up adb port forwarding, so we can access the mjpeg stream via ADB for testing - alternatively, replace the ip address with VOXL2 ip --- Source: https://docs.modalai.com/voxl-mavcam-manager/ # MAVCam Manager ## Overview [voxl-mavcam-manager](/mpa-camera-interface/) is a C++ code base that provides the interface between MPA camera streams and devices connected to VOXL 2 via MAVLink such as QGroundControl (QGC). This stream is leveraged from voxl-streamer and uses the rtsp stream created from said service. ## Source Code [voxl-mavcam-manager](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavcam-manager) ## Version Requirements - **Switching between multiple camera streams in QGC** requires the voxl-mavcam-manager shipped with SDK 1.6.x (voxl-mavcam-manager 0.6.0 in SDK 1.6.0 through 1.6.3, 0.6.1 from SDK 1.6.4 on). SDK 1.3.5 and SDK 1.4.0 do not support multi-camera streaming into QGC. - **Stream switching combined with snapshots** additionally requires voxl-camera-server 2.2.32. This version is not part of SDK 1.6.2 or any other SDK 1.6.x release, and there will most likely not be a backport to SDK 1.6.2. It is included in the [SDK 1.7.0 pre-release](/sdk-1.7-release-notes/) package set. See the [SDK 1.6 release notes](/sdk-1.6-release-notes/) for the package versions in each release. ## Setup Video from voxl-camera-server will be streamed automatically to a GCS if the following services are configured and running: 1. [voxl-camera-server](/voxl-camera-server/) 2. [voxl-streamer](/voxl-streamer/) 3. [voxl-mavlink-server](/voxl-mavlink-server/) > If you plan on NOT leveraging the `auto_ip` parameter to auto configure the ip address of the rtsp stream in mavcam manager, then voxl-mavlink-server does not need to be active during run of mavcam manager. To setup the config file, the user can run the following: `voxl-configure-mavcam` - this will create a config file in /etc/modalai that contains the information to stream one singular camera to the QGC instance. The config file has the following information in it: ``` * This file contains configuration parameters for voxl-mavcam-manager. * * mavcam_inputs: * Array of inputs if one wishes to stream more than one camera using mavcam inspector * Each entry has 5 inputs: * Fields:\n\ * snapshot_pipe_name: pipe to send snapshot command to (default hires_snapshot) * video_record_pipe_name: pipes to pull h264/h265 or raw frame data from for recording video * to disk when the user clicks the record button in QGC * default_uri: this is the default uri to assume the rtsp stream is at * Default value is rtsp://192.168.8.1:8900/live * enable_auto_ip: disable this to force the use of the default ip address * when advertizing to the GCS. Otherwise we will use * voxl-my-ip to auto-pick an ip address. * mavlink_sys_id: MAVLink system ID the camera identifies as when * sending messages and matching incoming commands. * Default value is 1 * * To change the pipe that the live rtsp video stream is pulled from, edit * /etc/modalai/voxl-streamer.conf instead. Other option is to stream another rtsp via the standalone feature. ``` Note that `enable_auto_ip` defaults to `true` and `mavlink_sys_id` defaults to `1`. So, for example, if the user wishes to have the ability to send both the tracking and hires video stream, the config file would look like the following: ``` /** * This file contains configuration parameters for voxl-mavcam-manager. * * mavcam_inputs: * Array of inputs if one wishes to stream more than one camera using mavcam inspector * Each entry has 5 inputs: * Fields: * snapshot_pipe_name: pipe to send snapshot command to (default hires_snapshot) * video_record_pipe_name: pipes to pull h264/h265 or raw frame data from for recording video * to disk when the user clicks the record button in QGC * default_uri: this is the default uri to assume the rtsp stream is at * Default value is rtsp://192.168.8.1:8900/live * enable_auto_ip: disable this to force the use of the default ip address * when advertizing to the GCS. Otherwise we will use * voxl-my-ip to auto-pick an ip address. * mavlink_sys_id: MAVLink system ID the camera identifies as when * sending messages and matching incoming commands. * Default value is 1 * * To change the pipe that the live rtsp video stream is pulled from, edit * /etc/modalai/voxl-streamer.conf instead. Other option is to stream another rtsp via the standalone feature. * */ { "mavcam_inputs": [{ "snapshot_pipe_name": "hires_snapshot", "video_record_pipe_name": "hires_large_encoded", "default_uri": "rtsp://192.168.8.1:8900/live", "enable_auto_ip": false, "mavlink_sys_id": 1 }, { "snapshot_pipe_name": "tracking", "video_record_pipe_name": "tracking", "default_uri": "rtsp://192.168.8.1:8901/live", "enable_auto_ip": false, "mavlink_sys_id": 1 }] } ``` Keep in mind that in order to stream both the tracking and the hires camera to qgc using mavcam manager, TWO instances of voxl-streamer must be running to create each rtsp endpoint. If the user wishes to send only one singular rtsp stream to the qgc instance and plans on using only the base instance of voxl-streamer, the user can turn `enable_auto_ip` to `true`, which will automatically set the uri correctly upon runtime of the service. If this is the case though, the user must have voxl-mavlink-server enabled as well as the voxl2 in SOFTAP mode so the IP address connected from the parent computer is that of one with a 192.168.8.X ip address. Once the config file is setup correct, and the user has the correct voxl-streamer services running, the user can restart their voxl2 and upon start of the mavcam service, the user will have the ability to select or watch whichever stream they wish to view without having to put in the streams into QGC's section for `RTSP Stream to watch`. ## How to view stream in QGC and take snapshots/video In order to view the stream in QGC, the user just has to ensure that the voxl2 and the parent computer are on the same network. From a QGC perspective, nothing needs to be done - the user should be able to see the rtsp streams out the gate on the instance. To select a specific stream, the user can use the settings camera option in the right side of qgc to select specific stream (gear icon on camera settings): ![camera-1-mavcam-manager](/images/voxl-sdk/voxl-mavcam-manager/camera-1-mavcam-manager.png) ![camera-2-mavcam-manager](/images/voxl-sdk/voxl-mavcam-manager/camera-2-mavcam-manager.png) If the user wishes to take a snapshot and save it on both the disk of the voxl2 and the disk of the computer running the QGC instance, they just need to click the red button here: ![snapshot-red-button](/images/voxl-sdk/voxl-mavcam-manager/snapshot-red-button.png) If the user wishes to save a hires video of the stream on disk of the voxl2, they can select the red button here: ![record-red-button](/images/voxl-sdk/voxl-mavcam-manager/record-red-button.png) The ability to save the video on disk on the parent computer running QGC has NOT been implemented in the most recent stable version of QGC. ### Geo-tagging Snapshots > This feature is supported on VOXL 2 and QCS6490-based platforms. When GPS is being published via the [voxl-mavlink-server](/voxl-mavlink-server/), voxl-camera-server will geo-tag each snapshot captured with the latest GPS coordinates. The GPS data (latitude, longitude, altitude) will be saved in the JPEG Snapshot EXIF metadata. In order for this to occur, the user must have a valid GPS connected and actively publishing data from a MAVLink compatible flight controller, such as PX4 or ArduPillot. You can verify GPS is being published with the [voxl-inspect-gps](/voxl-inspect-gps/) tool. In order to view the EXIF metadata of the photo, the user must pull the photo from the VOXL 2 (that lives in /data/snapshots) and then can look at the properties of the image via a double click or by uploading the image to a website that allows for metadata from the EXIF to be viewed. --- Source: https://docs.modalai.com/voxl-osd/ # voxl-osd ## Overview `voxl-osd` draws the on-screen display (OSD) for FPV video: battery, RC link, flight mode, arm state, position, heading, VIO state, VTX temperature and power, and warnings. It does not touch video pixels. It lays out a character-cell text canvas and streams it as **MSP DisplayPort** commands, which the video transmitter composites over the live video. On ModalAI FPV products the consumer is `voxl-vtx`; the same canvas can also be sent over UART to a third-party HDZero VTX. The service also owns the **OSD menu**, a stick-driven menu shown in the goggles for changing flight modes, failsafe behavior, logging, and VTX settings without a ground station. `voxl-osd` is enabled by [voxl-configure-mpa](/voxl-configure-mpa/) on FPV SKUs such as [Stinger](/stinger-vision-fpv/) and the [VTX Air Unit](/vtx-air-unit/), and disabled by default everywhere else. It runs as the systemd service `voxl-osd.service`, starting after `voxl-px4` (without requiring it) and restarting automatically. ![On-screen display elements, labeled](/images/d0013/163OSD_Labeled.png) ## Data Flow By default the service reads everything it displays from MPA pipes and writes the finished canvas to one output pipe. | Pipe | Direction | Used for | |:-----|:----------|:---------| | `mavlink_onboard` | in | PX4 telemetry from [voxl-mavlink-server](/voxl-mavlink-server/): battery, attitude, GPS, RC channels, arm state, flight mode | | `mavlink_from_gcs` | in | `MANUAL_CONTROL` from the ground, so the menu also responds to a joystick sent over IP | | `ov`, `qvio` | in | VIO quality from [voxl-open-vins-server](/voxl-open-vins-server/) or voxl-qvio-server | | `vfc` | in | Assisted flight mode state from [voxl-vision-hub](/voxl-vision-hub/), shown instead of PX4's "OFFBOARD" | | `vtx_latency` | in | VTX temperature, TX power, and link stats from `voxl-vtx` | | `cpu_stats2` | in | CPU and memory usage from voxl-cpu-monitor, for the optional usage lines and overload warnings | | `payload_status` | in | Optional payload arm and position strings shown at the top right | | `msp_osd` | out | MSP DisplayPort packets consumed by `voxl-vtx` | | `msp_ext_fc_status` | out | Arm state of an external flight controller, published only in MSP input mode | In **external flight controller** mode (see below) the MAVLink, VIO, and VFC inputs are replaced by an MSP UART link to the other flight controller. ## voxl-configure-osd `voxl-configure-osd` writes `/etc/modalai/voxl-osd.conf` and enables or disables the service. It must be run as root. ```bash voxl-configure-osd factory_enable # reset the config to defaults and enable voxl-configure-osd factory_enable_no_compass # defaults with the compass tape and degrees hidden voxl-configure-osd external_fc # take input from an external MSP flight controller over UART voxl-configure-osd hdzero # send the canvas over UART to an HDZero VTX voxl-configure-osd enable # enable the service without touching the config voxl-configure-osd disable # stop and disable the service ``` `external_fc` and `hdzero` pick the UART by platform: | Platform | `external_fc` input port | `hdzero` output port | |:---------|:-------------------------|:---------------------| | M0054, M0154 (VOXL 2) | `/dev/ttyHS1` | `/dev/ttyHS1` | | M0104, M0204 (VOXL 2 Mini) | `/dev/ttyHS0` | `/dev/ttyHS0` | Other platforms fall back to `/dev/ttyHS1` for input and leave the output port empty. Edit `input_port` or `output_port` in the config file if your wiring differs. ## Configuration File `/etc/modalai/voxl-osd.conf` is JSON. It is created with defaults the first time the service runs, and any missing keys are added with their defaults on load. To print the loaded values without starting the service: ```bash voxl-osd -c ``` ### Input and Output | Field | Default | Meaning | |:------|:--------|:--------| | `input_protocol` | `1` | `1` = MAVLink, `2` = MSP | | `input_type` | `1` | `1` = MPA pipes, `2` = UART | | `input_port` | `""` | UART device when `input_type` is `2` | | `output_type` | `1` | `0` = none, `1` = MPA (to `voxl-vtx`), `2` = UART (HDZero), `3` = both | | `output_port` | `""` | UART device when output includes UART | | `emit_canvas` | `true` | Emit the DisplayPort text canvas on the MPA output. UART output is never gated by this | | `resolution` | `1` | Canvas size in character cells: `0` = SD 30x16, `1` = HD 50x18, `2` = HD 30x16, `3` = HD 53x20 | | `font_type` | `0` | Font index reported to the VTX | ### Display Toggles | Field | Default | Meaning | |:------|:--------|:--------| | `show_compass_tape` | `true` | Scrolling compass tape along the top of the canvas | | `show_compass_degrees` | `true` | Numeric heading in degrees. Shown even when the tape is off | | `compass_fov_deg` | `120` | Field of view of the compass tape | | `show_mgrs` | `true` | MGRS grid reference line | | `mgrs_precision` | `5` | MGRS digits per axis, `0` to `5` | | `craft_name` | `""` | Free-text craft name drawn on the canvas | | `show_vtx_cpu_mem_usage` | `false` | VTX CPU and memory usage lines | | `show_vrx_stream_stats` | `false` | VRX stream statistics | | `show_vio_overlay` | `false` | VIO overlay | | `show_thermal_flow` | `false` | Thermal flow status | | `show_mavlink` | `false` | Raw MAVLink status | ### Element Positions Every movable element has a `*_col` / `*_row` pair giving its character cell, origin top left. Set either value to `-1` to hide the element. Defaults are for the HD 50x18 canvas. | Element | Fields | Default (col, row) | |:--------|:-------|:-------------------| | RC link RSSI | `rssi_col`, `rssi_row` | 0, 0 | | Compass tape | `compass_col`, `compass_row` | 22, 0 | | VIO state | `vio_col`, `vio_row` | 1, 1 | | Payload actuator state | `payload_actuator_col`, `payload_actuator_row` | 42, 2 | | Payload status | `payload_status_col`, `payload_status_row` | 42, 3 | | Craft name | `craft_name_col`, `craft_name_row` | 10, 3 | | VTX temperature | `vtx_temp_col`, `vtx_temp_row` | 0, 4 | | VTX TX power | `vtx_dbm_col`, `vtx_dbm_row` | 0, 5 | | VTX CPU usage | `vtx_cpu_usage_col`, `vtx_cpu_usage_row` | 0, 6 | | VTX memory usage | `vtx_mem_usage_col`, `vtx_mem_usage_row` | 0, 7 | | Crosshair | `crosshair_col`, `crosshair_row` | 26, 8 | | Velocity | `velocity_col`, `velocity_row` | 47, 13 | | Altitude | `altitude_col`, `altitude_row` | 47, 14 | | Distance and direction to home | `to_home_col`, `to_home_row` | 39, 14 | | VTX overheat warning | `vtx_overheat_warn_col`, `vtx_overheat_warn_row` | 0, 14 | | VTX overheat critical | `vtx_overheat_crit_col`, `vtx_overheat_crit_row` | 0, 15 | | MGRS grid reference | `mgrs_col`, `mgrs_row` | 39, 15 | | Armed / disarmed | `disarmed_col`, `disarmed_row` | 25, 15 | | VTX CPU overload warning | `vtx_overload_col`, `vtx_overload_row` | 0, 16 | | Latitude | `latitude_col`, `latitude_row` | 46, 16 | | Status text | `status_col`, `status_row` | 24, 17 | | VTX memory warning | `vtx_mem_leak_col`, `vtx_mem_leak_row` | 0, 17 | | Longitude | `longitude_col`, `longitude_row` | 46, 17 | | Flight mode | `flight_mode_col`, `flight_mode_row` | 24, 19 | Current draw, pack voltage, and per-cell voltage are pinned to the bottom right (column 43, rows 17 to 19) and cannot be moved. ### Menu and Flight Mode Fields | Field | Default | Meaning | |:------|:--------|:--------| | `menu_up_threshold` | `1550` | Pitch stick value (us) above which the cursor moves up | | `menu_down_threshold` | `1450` | Pitch stick value below which the cursor moves down | | `menu_right_threshold` | `1550` | Roll stick value above which a value is incremented | | `menu_left_threshold` | `1450` | Roll stick value below which a value is decremented | | `fltmode1_pset_mode`, `fltmode4_pset_mode`, `fltmode6_pset_mode` | `0` | VFC assisted mode assigned to each flight-mode switch position, written by the Flight Mode menu | | `shortcut` | `"OPT_A"` | Unused, kept for compatibility | > Menu thresholds were 1650 / 1350 / 1850 / 1150 in voxl-osd 0.4.x. Versions from 1.0.0 on use the values above, so the menu needs less stick travel. ## OSD Menu With the vehicle **disarmed**, hold **yaw up, throttle down, roll down, pitch down** to open the menu. It always opens at the main menu. Pitch up and down moves the cursor. Roll left and right changes the value on the selected row or enters the highlighted submenu. Every menu ends with `BACK`, `EXIT` (discard), and `SAVE AND EXIT` rows. When flying over IP with voxl-joystick-server instead of an RC link, the same inputs come from the joystick. | Menu | Rows | What it changes | |:-----|:-----|:----------------| | Main | `FLIGHT MODE`, `ADVANCED` | Entry point | | Flight Mode | `FLIGHT MODE`, `SWITCH VALUE` | Assigns a mode to the switch position currently selected on the transmitter. Writes `COM_FLTMODE*` and `PSET_MODE` and pushes a live `SET_MODE` over MAVLink. Modes that need GPS are hidden when `SYS_HAS_GPS` is off. Not shown for an external flight controller | | Advanced | `LOGGING`, `RC CHANNELS`, `FAILSAFE`, and on newer versions `ELRS` and `AR WAYPOINTS` | Submenu index | | Logging | `VOXL-LOGGER-AUTO`, `DEBUG LOG` | Toggles automatic voxl-logger recording on arm, and sets the VTX debug log to `DISABLED`, `ENABLED`, or `ON ARM` via `voxl-send-command vtx_latency debug_log` | | RC Channels | live table | Read-only view of every RC channel value | | Failsafe | `RC LOSS TIME`, `RC LOSS ACT`, `RC FINAL DELAY`, `RC FINAL ACT`, `GCS LOSS TIME`, `GCS LOSS ACT` | Writes `COM_RC_LOSS_T`, `NAV_RCL_ACT`, `COM_RCL_ACT_T`, `COM_RCL_ACT`, `COM_DL_LOSS_T`, and `NAV_DLL_ACT`. Actions: `AUTO RTL`, `AUTO LAND`, `HOLD`, `TERMINATE`, `DISARM`, `DESCEND`, plus `DISABLED` for GCS loss | | ELRS | `Custom Domain RX` | ELRS receiver option, voxl-osd 0.4.15 and later | | AR Waypoints | setup prompts | Augmented-reality waypoint markers on the video, voxl-osd 1.1.0 and later | The menu can also change VTX channel, video profile, and PIT mode. Those rows are driven by `voxl-vtx` and are described in the [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/#osd-menu). ## External Flight Controller (MSP) The VTX can act as the digital video system for a non-VOXL flight controller that speaks MSP over UART, such as Betaflight: ```bash voxl-configure-osd external_fc ``` This sets `input_type` to UART and `input_protocol` to MSP. The service then polls the external flight controller at 20 Hz for RC channels, status, box IDs, battery, analog, and GPS, renders the OSD from those, and publishes the arm state on `msp_ext_fc_status`. No MAVLink or PX4 is involved. Wiring and cable options are in the [VTX Air Unit Quick Start Guide](/vtx-air-unit-quick-start-guide/#osd-msp-dp). ## HDZero Output To drive a third-party HDZero VTX instead of, or as well as, `voxl-vtx`: ```bash voxl-configure-osd hdzero ``` This sets `output_type` to UART and the platform's default `output_port`. Set `output_type` to `3` to keep the MPA output as well. See [VOXL 2 with Third-Party VTX](/voxl2-with-third-party-vtx/) for the hardware side. ## Debugging ```bash voxl-inspect-services # is voxl-osd running and enabled? journalctl -u voxl-osd -f # live service log voxl-osd -c # print the loaded config and exit ls /run/mpa/ # msp_osd should exist once the service is up ``` - No OSD in the goggles but video is fine: check that `voxl-osd` is running and that `output_type` is `1` or `3`. `voxl-vtx` must be running to composite the canvas. - Telemetry fields blank: the service is up but `mavlink_onboard` has no data. Check [voxl-mavlink-server](/voxl-mavlink-server/) and [voxl-px4](/voxl-px4/). - Menu does not open: the vehicle must be disarmed, and the sticks must pass the thresholds in the config. The RC Channels menu is the quickest way to see the values the service is reading. - After editing the config file, restart the service with `systemctl restart voxl-osd`. ## Source Code Source is at [voxl-public/voxl-sdk/services/voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd). It builds in the `voxl-cross` docker image per the repository README. Package versions shipped in each SDK are in the [release notes](/voxl-suite/). --- Source: https://docs.modalai.com/voxl-record-video/ # Record Video voxl-record-video is a simple utility to record the encoded output of [voxl-camera-server](/voxl-camera-server/) to disk. If you want to use the built-in functionality to record video from QGroundControl, see [voxl-mavcam-manager](/voxl-mavcam-manager/) Encoded output is enabled by default on the hi-res cameras via the configuration file in [voxl-camera-server](/voxl-camera-server/). The name of the pipe this encoded data is being sent to is: `hires_small_encoded` which will be available when voxl-camera-server is configured and running, which should be the case by default. Like streaming low latency over h264 at 720p/4K, there is also the capability now of doing the same thing via this record feature. This once again, has the ability to compress image frames using OMX for a no-copy hardware accelerated and memory optimized data path to publish this compressed and encoded data. This encoded video is then saved on disk using this record feature. The following parameters are how a user can change the resolution and bitrate in voxl-camara server: 1. `record_width`
2. `record_height`
3. `record_bitrate`
To save the video, on SDK 0.9.5 or higher, the user can open a terminal window on the voxl2 and type the following `voxl-record-video hires_record -o DIRECTORY/OF/OUTPUTVIDEO.h264`. To stop recording, in the same terminal window, simply type `ctrl + c`. [Source Code](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-record-video.c) --- Source: https://docs.modalai.com/debugging-camera-issues/ ## Checking which cameras are detected by Camera Server - stop the background service for camera server if it is running ```bash systemctl stop voxl-camera-server ``` - run the command to list detected cameras ``` voxl2:/$ voxl-camera-server -l DEBUG: Attempting to open the hal module DEBUG: SUCCESS: Camera module opened on attempt 0 DEBUG: ----------- Number of cameras: 3 DEBUG: Cam idx: 0, Cam slot: 0, Slave Address: 0x0020, Sensor Id: 0x0214 DEBUG: Cam idx: 1, Cam slot: 1, Slave Address: 0x0030, Sensor Id: 0x0356 DEBUG: Cam idx: 2, Cam slot: 2, Slave Address: 0x0034, Sensor Id: 0x0577 DEBUG: Note: This list comes from the HAL module and may not be indicative DEBUG: of configurations that have full pipelines DEBUG: Number of cameras: 3 ``` ## Running Camera Server in the foreground with verbose logging When cameras are detected but streams do not come up, run the camera server in the foreground with the debug level set to verbose so every step of the startup sequence is printed: config file parsing, the HAL module open, per-camera gain limits, and the start or failure of each camera pipeline. - stop the background service first, otherwise the foreground instance will kill it and the logs get interleaved ```bash systemctl stop voxl-camera-server ``` - run the server with `-d0` ```bash voxl-camera-server -d0 ``` The `-d` (`--debug-level`) flag selects the minimum log level that is printed. The default is 2, so warnings and errors are shown but the informational startup messages are not. | Level | Prints | |-------|-----------------------------------------| | 0 | Verbose: everything, including debug | | 1 | Info and above | | 2 | Warning and above (default) | | 3 | Fatal errors only | Two related flags are useful while debugging: - `-l` (`--list`) prints the cameras the HAL reports, their slot, I2C address, sensor ID and supported resolutions, then exits. This is the command used in the section above. - `-s` (`--self-identify`) ignores `/etc/modalai/voxl-camera-server.conf` and instead builds a configuration from whatever the HAL detects. Use it to confirm the hardware works before suspecting the config file. Run `voxl-camera-server -h` for the full option list. The argument parsing and help text live in [`src/main.cpp`](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/main.cpp) in the voxl-camera-server repository, which is the reference for what each flag does in the SDK version you are running. > Press `Ctrl+C` to stop the foreground instance, then restart the service with `systemctl start voxl-camera-server`. ## Diagnosing a missing camera issue - check whether the number of detected cameras is correct (from step above) - match the Sensor Id to Sensor Type (see below) and verify that cameras have been correctly identified in their respective slots - see https://docs.modalai.com/voxl2-camera-configs/#overview for the mapping from physical connector to slot number - if there is a camera that is not detected but appears to be plugged in - troubleshoot physical / connection issue: - double check physical connections - try to user a different flex cable if possible - try to use a different camera of the same type if possible - re-run the above camera detection test - troubleshoot camera driver configuration issue - for every camera, there needs to be a `sensormodule` driver present in `/usr/lib/camera/` - every sensormodule file has a slot number at the end, which needs to match the actual slot number that the camera is connected to - all of the sensormodule drivers are stored in `/usr/share/modalai/chi-cdk` and can be manually copied to `/usr/lib/camera` when doing manual camera setup - for example, if we have IMX214 plugged into slot 0, AR0144 in slot 1 and IMX412 in slot 2, the following sensormodules should be present in `/usr/lib/camera` ``` com.qti.sensormodule.imx214_0.bin com.qti.sensormodule.ar0144_1.bin com.qti.sensormodule.imx412_2.bin ``` - removing unused sensormodules is recommended to avoid confusion (not required) ## Sensor Id to Sensor Type Mapping ``` - 0x7750 : OV7251 - 0x9281 : OV9782 / OV9281 / OV9282 - 0x6442 : OV64B40 - 0x0214 : IMX214 - 0x0356 : AR0144 - 0x0577 : IMX412 - 0x0600 : IMX664 (this is a workaround for WHOAMI register reading 0) - 0xA602 : IMX678 - 0x003D : IRS1645 (TOF V1) - 0x2975 : IRS2975 (TOF V2) - 0x00FF : Boson (this is a workaround) ``` ## Diagnosing incorrect Camera Server config - camera server configuration is stored in `/etc/modalai/voxl-camera-server.conf` - the camera id in the config file should match the camera id of each camera detected using `voxl-camera-server -l` - if there is a missing camera, the camera server will still attempt to run but it may incorrectly guess which camera is missing, resulting in wrong camera name assigned to a stream - make sure that requested resolution does not exceed the maximum resolution of each camera (supported resolutions are also listed in output of `voxl-camera-serverl -l`) --- Source: https://docs.modalai.com/sensors/ # Sensors --- Source: https://docs.modalai.com/voxl-imu-server/ ## Table of Contents 1. TOC # VOXL IMU Server The VOXL IMU Server receives and publishes data from the built-in IMUs on the pipe `imu#`. # Configuration The VOXL IMU server uses the configuration file located at: `/etc/modalai/voxl-imu-server.conf`. The config file contains the following fields: - `bus` integer, default = 1 - `imu_sample_rate_hz` integer (hz), default = 1000 - `imu_baud_rate_hz` integer (baud), default = 921600 - `imu_fsr_gyro` integer (dps), default = 480 - `imu_fsr_accel` integer (g), default = 8 # Usage The server runs as a service in the background which can be started/stopped with systemctl start/stop `voxl-imu-server`. The server can also be run manually from the shell using the command `voxl-imu-server`. There are also optional arguments that can be added when running the server manually such as: - `voxl-imu-server -d` to enable debug prints - `voxl-imu-server -t` to enable timestamp prints for the IMU packets - `voxl-imu-server -c` to create a new config file and exit - `voxl-imu-server -h` to print a help menu To check the satus of the server run `voxl-inspect-services` and find the `voxl-imu-server`. The data can be viewed by running the command `voxl-inspect-imu imu#` or by going to the IMUs tab under debug in the portal and selecting the desired IMU `imu_iim`. # Published Format IMU data is published to the pipes in an imu_data_t struct which consists of the following: - `struct imu_data_t`: - `uint32_t magic_number` Set to IMU_IMAGE_MAGIC_NUMBER for frame syncing - `float accl_ms2[3]` XYZ acceleration in m/s^2 - `float gyro_rad[3]` XYZ gyro rotation in rad/s - `float temp_c` temp in C, IMU_INVALID_TEMPERATURE_VALUE if no thermometer - `uint64_t timestamp_ns` timestamp in nanoseconds, uses system clock_monotonic ## Source Code The source code for VOXL IMU Server can be found [here](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) --- Source: https://docs.modalai.com/mini-tof-server/ ## Table of Contents 1. TOC # Voxl Mini Tof Server Description Creates a server which reads from a config directory and constantly reads and sends rangefinder data as a point cloud on the pipe `rangefinder_pc`. It first checks for a configuration file at /etc/modalai/voxl-mini-tof-server.conf. Since a process can only use one i2c bus at a time, if multiple rangefinder configurations exist on seperate i2c buses then multiple .conf files can instead be placed in the directory /etc/modalai/voxl-mini-tof-server.conf.d. The server will then create a seperate process to serve each configuration file and each bus. > Each configuration file in the voxl-mini-tof-server.conf.d directory MUST use a seperate i2c bus or hardware conflicts will ensue. If the /etc/modalai/voxl-mini-tof-server.conf file is used, the conf directory will be ignored and only one output pipe, `rangefinder_pc`, will be created. If multiple configuration files exist, a seperate pipe, `rangefinder_pc_x`, will be created for each file where "x" is an unspecified integer. The server can manage any number of sensors as long as they are connected through a TCA9548A i2c mux (or compatible alternative). If sensors are connected to a multiplexer, up to one can also be directly connected to the i2c bus. # Usage Use either the configuration wizard or `systemctl start voxl-mini-tof-server` to start the service in the backgroud. You can check on the service's status with `voxl-inspect-services`. `ls /run/mpa | grep rangefinder_pc` will list any open rangefinder pipes, you can use `voxl-inspect-points` to inspect the data output from the pipes. The pointcloud can be visualized in the portal by going to the pointcloud dropdown and selecting `rangefinder_pc`. # Configuration ![VL53L8_Diagram.png](/images/voxl-sdk/voxl-mini-tof-server/VL53L8_Diagram.png) The readings come from the SPAD array, which is on the left side of the sensor (shown in diagram above) so the configured location and orientation must be relative to that sensor. The default orientation of the sensor is shown in the diagram above. The location and orientation of the sensors must be configured precisely. # Configuration Tool If a known hardware configuration is used, the configuration can be loaded with the configuration wizard. Start the configuration wizard with the command "voxl-configure-mini-tofs -i". Use the wizard to add the configuration for your hardware if it is listed as an available option. Multiple configurations can be configured together using the add option. After the configuration is set, use the enable option to start the service and load the configuration. Use `voxl-inspect-points {rangefinder_pc, rangefinder_pc_1, ...}`, or view the pointcloud in the portal to check that the server is working correctly. The configuration tool can also be used in a non-interactive mode to get available configurations and to set the active configuration. `voxl-configure-mini-tofs -l`: Lists the names of available configurations. `voxl-configure-mini-tofs -s {configuration name} [configuration name...]`: Sets the active configuration to the file(s) with conf_name equal to the following argument(s). # Manual Configuration Each configuration file is formatted as a JSON object. The top-level object should have the following fields: - `i2c_bus` (integer) - `id_for_mavlink` (integer) - `sensors` (array of sensor objects) - `conf_name` (string) The sensors array consists of objects with the following fields. Empty fields will use defaults: - `enabled` (boolean: `true`, `false`) - `sensor_id` (integer) - `type` (enum: `TOF_1X33LGC`, `TOF_1X33L7CX`, `TOF_1X33L3X`) - `fov_deg` (integer, horizontal FOV) - `location_wrt_body` (array `[float, float, float]`) - `direction_wrt_body` (array `[float, float, float]`) - `is_on_mux` (boolean: `true`, `false`) - `i2c_mux_address` (integer, default `112`) - `i2c_mux_power` (integer) - `ranging_freq_hz` (integer) - `ranging_mode` (enum: `Continuous`, `Autonomous`) - `ranging_resolution` (integer, `2^n` where `n` is resolution) - `integration_time_ms` (integer) - `sharpener_pct` (integer) - `target_order` (enum: `Closest`, `Strongest`) - `fovea_resolution` (integer, `2^n`; disabled if `0` or `< ranging_resolution`) - `fovea_enr` (boolean, not yet implemented) # Location The location is specified in millimeters from the center of gravity of the robot. # Direction The direction is specified as a tait-bryan rotation from the forward facing vector of the drone. # FoV Degree Currently the FoV has to be set manually for each sensor. This field is also used for changing the FoV on sensors like the VL53L1X which support variable FoV. For the VL53L7CX it should always be set to 60 and for the VL53L8CX it should always be set to 45. # Ranging Frequency This is used to set the frequency of the ranging measurements. The maximum values depending on the ranging resolution and the type of sensor, please consult the individual sensor's datasheets for more information on possible values. # Target Order The sensors are capable of measuring a number of targets in a given zone, if the number of targets detected is greater than the number of targets read per zone (currently hardcoded to 1), then the points which are generated depend on the order the targets are reported in. Future updates will support multiple targets being reported per zone. # Fanout If the fanout_resolution is set to a value greater than the ranging_resoltion, more points will be estimated within the FOV based on the actual measurements. This is used to give the mapping software a better indication of the full field of view, especially with the VL53L1X sensors which are only capable of measuring one zone over a relatively large FOV. # Hardware Setup ![Hardware_setup.png](/images/voxl-sdk/voxl-mini-tof-server/Hardware_setup.png) # voxl-mini-tof-devices This library contains code to abstract away direct interaction with the vl53 sensors and provides a high-level interface for creating, starting, and reading from them. Include the header `vl53.h` to use the sensors. --- Source: https://docs.modalai.com/gps-magnetometer/ # GPS & Magnetometer ## How GPS and Compass Work on VOXL 2 - **VOXL 2 has no onboard magnetometer.** The compass arrives with the GPS module (the M0094 GPS/Mag/RC kit, Holybro-sourced), connected to J19. - PX4 on VOXL 2 is split between the applications processor (Linux) and the sensors DSP. The GPS and magnetometer drivers run **on the DSP** — interact with them via `px4-qshell` (e.g. `px4-qshell gps status`), and read their topics with `px4-listener`. - Driver start lines live in `/usr/bin/voxl-px4-start` — effectively the reference documentation for GPS/mag bring-up. At boot, PX4 probes **several magnetometer drivers** (qmc5883l, ist8310, and others) expecting most to fail — "failed to start" messages for absent mags are **normal**. - The J19 UART map: port 6 is GPS, port 7 is RC, and the same cable carries the I2C bus (`-b 1`) used by the mag and LED. > The red status LED is a general PX4 preflight indicator, not a GPS light. If it's blinking red, run `voxl-px4` in the foreground or check QGC's arming message to see *which* preflight check is failing. ## No GPS Data: The Triage Ladder 1. `px4-listener sensor_gps` — if it prints **"never published"**, the driver isn't talking to the receiver at all; keep going down this list. If data flows but there's no fix, skip to [No Lock](#gps-runs-but-no-lock). 2. `px4-qshell gps status` — driver state from the DSP side. 3. Full startup log: `journalctl --no-pager -b -u voxl-px4 > /tmp/log.txt` and read the GPS section. 4. Run PX4 in the foreground for everything: `systemctl stop voxl-px4`, then `voxl-px4 -d`. 5. **Check the start line.** On old SDKs `/etc/modalai/voxl-px4.config` shipped `qshell gps start -d 7 -b 115200` — those arguments were wrong (port 7 is RC, and `-d` wasn't parsed) and removing them was the standard fix. Current SDKs ship a plain `qshell gps start`. Don't execute the config file directly; edit it and reboot. 6. **Suspect the cable.** Intermittent serial communication usually indicates a marginal cable or connector — press on the connector while PX4 starts and watch whether behavior changes. `i2c probe failed` errors alongside GPS trouble point at the same cable (it carries both). 7. Still nothing? Verify the receiver independently ([below](#verifying-the-receiver-directly-with-u-center)), and if the unit is dead, [RMA](https://www.modalai.com/pages/rma). ## GPS Runs But No Lock - Be outside with clear sky view — indoors near a window rarely locks. - The receiver acquires its fix independently of PX4: a lock (or lack of one) says nothing about the VOXL connection, and VIO/EKF parameters have **no effect** on acquisition. - Distinguish "never locks anywhere" (suspect the unit or interference) from "locks slowly / poor accuracy at this location" (environment). A second known-good receiver is the fastest arbiter. - Standard L1 GPS accuracy is roughly 3-5 m — don't benchmark against a modern phone, which augments with dual-band and WiFi positioning. - `EKF2_GPS_CHECK 1` relaxes EKF gating to satellite count only (`EKF2_REQ_NSATS`, default 6) — useful for bench work, not a fix for a weak signal. ## Verifying the Receiver Directly with u-center To test the receiver in isolation: drone powered **off**, connect the GPS unit to a laptop with a USB-serial adapter (5V supply, 3.3V logic) and watch it in u-blox u-center. Wiring for the 6-pin connector (see the [pinout](/flight-core-v2-external-sensors/#gpscompass); directions given explicitly to avoid the usual confusion): ``` pin 1: 5V power from USB adapter to GPS pin 2: TX out of USB adapter -> RX into GPS pin 3: RX into USB adapter <- TX out of GPS pin 6: GND ``` Bump the receiver's baud to 115200+ first — the default 9600 overflows once satellite data flows. **What healthy looks like:** under open sky, the majority of satellites at **40-45 dB** SNR. Averages around 33 dB are ~10 dB low; 20-30 dB means something is actively wrong. The killer test: watch SNR live while powering the drone **on** — a ~10 dB drop across all satellites the moment the platform powers up is confirmed self-interference, and you likely can't fly GPS reliably even with a "lock". On the vehicle, enable per-satellite SNR with `param set GPS_SAT_INFO 1` (restart PX4, read `px4-listener satellite_info`) — and current [voxl-portal](/voxl-portal/) displays GPS SNR directly. ## Interference and EMI GPS self-interference is the root cause behind most "poor fix on the bench" reports. Known sources, strongest first: - **Your RC transmitter** — a 900 MHz handset within ~2 m of the drone can cost up to 10 dB SNR. Stand back before takeoff; don't hold the TX above the GPS antenna. - **The platform itself** — cameras, the 5G modem, and USB WiFi dongles all radiate. Isolate by switching subsystems off one at a time: `systemctl stop voxl-camera-server` (powers down cameras), power the 5G modem off via `voxl-gpio -m 1 out; voxl-gpio -w 1 0`, relocate a WiFi dongle off the board with a cable (M0151 breakout) instead of the direct M0141. - **Layout** — antennas beside power electronics wreck both GPS and the radio link. On a bench build, mimic the physical separation a production drone has. - Physical antenna damage: deep scratches through the patch antenna's plane detune it (the two factory notches are tuning cuts, not damage). Full guidance lives on [EMI Mitigation for GNSS](/emi-mitigation-for-gnss/) and the consolidated [GNSS EMI mitigation guidelines](https://forum.modalai.com/topic/5116/gnss-emi-mitigation-guidelines) forum post. For Starling 2 Max, ModalAI's GPS **mast kit** (raising the unit ~11 cm with a ground plane underneath) recovers signal to near-reference levels. > If you relocate the GPS unit (mast or otherwise): the magnetometer moved with it, so **recalibrate the compass**, and update the `EKF2_GPS_POS_*` position offsets to match the new location. ## Compass Problems - **"Compass Sensor 0 missing" / compass red in QGC**: on VOXL 2 this almost always means the GPS/mag unit isn't connected or its I2C isn't alive (same cable as GPS — see the triage ladder). There is no fallback onboard mag. On Flight Core V2, the internal mag exists but is deliberately disabled — the mag in play is still the GPS unit's. - **Mounting orientation**: the mag driver's `-R` rotation in the start line must match how the unit is mounted. For the standard Holybro unit: **`-R 10`** with the arrow pointing forward, **`-R 14`** if it points backward. - **Heading stuck at north / QGC always shows north**: usually an IMU-vs-mag rotation mismatch. Trace with `px4-listener sensor_mag` → `px4-listener vehicle_magnetometer` → QGC's `GLOBAL_POSITION_INT` (`hdg` field). Set rotation on the IMU driver line *or* `SENS_BOARD_ROT` — never both. - **Heading off by about 90 degrees after every PX4 restart** (reported on Starling 2): check `CAL_MAG0_ROT`. The magnetometer calibration normally detects the sensor rotation and sets this parameter automatically, but if it is `0` and the heading error is a constant 90 degrees, set `CAL_MAG0_ROT` to `2` (yaw 90), which corrected the reported case; `6` (yaw 270) is the other value to try. Restart PX4 afterwards. Manual Position mode can look normal with this fault while missions drift at the start and the log shows `resetQuatStateYaw` warnings until the yaw estimate converges. > Changing **any** rotation option or parameter invalidates existing sensor calibrations — recalibrate everything (mag, gyro, accel, level) after a rotation change, or old calibration data will corrupt the fixed setup. ### Flying Without GPS or Compass For pure indoor/VIO flight: set `GPS=NONE` in `/etc/modalai/voxl-px4.conf`, then `SYS_HAS_GPS 0`, `SYS_HAS_MAG 0`, `EKF2_MAG_TYPE 5`, `EKF2_GPS_CTRL 0`, and reboot. Two cautions from the field: - Only do this with **healthy VIO** — do the [hand-held VIO test](/flying-with-vio/#the-hand-held-test) before flying position mode. - On some setups the external-vision timeout needs headroom: `EKF2_NOAID_TOUT 8000000`. If the log shows repeated "yaw estimate error", check that the yaw bit of `EKF2_EV_CTRL` is enabled. The indoor (VIO) and outdoor (GPS) parameter sets in [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) are maintained as mutually exclusive configurations — pick the one matching your flight environment and PX4 version. ## Third-Party GPS Units - Known-good external receiver: the u-blox **MAX-M10S** (verified on both PX4 and ArduPilot). - Magnetometers supported out of the box: **qmc5883l** and **ist8310**. Units with other mags (e.g. lis3mdl) will have working GPS but a dead compass unless you build the driver into voxl-px4 yourself. - A silent unit can be scoped: M10-class receivers emit NMEA at 9600 baud from power-on, visible on the TX line. - RTK modules and dual-GPS configurations are not supported or tested. > Under **ArduPilot**, `voxl-inspect-gps` currently prints nothing even when GPS works — use QGC's MAVLink Inspector (`GPS_RAW_INT`) instead. --- Source: https://docs.modalai.com/voxl-iim-server/ ## Table of Contents 1. TOC # Voxl IIM Server The Voxl IIM Server receives and publishes data from the tdk-iim 46234 and 46230 IMUs on the pipe `imu_iim`. # Configuration The Voxl IIM server uses the configuration file located at: `/etc/modalai/voxl-iim-server.conf`. The config file contains the following fields: - `bus` integer, default = 1 - `imu_sample_rate_hz` integer (hz), default = 1000 - `imu_baud_rate_hz` integer (baud), default = 921600 - `imu_fsr_gyro` integer (dps), default = 480 - `imu_fsr_accel` integer (g), default = 8 # Usage The server runs as a service in the background which can be started/stopped with systemctl start/stop `voxl-iim-server`. The server can also be run manually from the shell using the command `voxl-iim-server`. There are also optional arguments that can be added when running the server manually such as: - `voxl-iim-server -d` to enable debug prints - `voxl-iim-server -t` to enable timestamp prints for the IMU packets - `voxl-iim-server -c` to create a new config file and exit - `voxl-iim-server -h` to print a help menu To check the satus of the server run `voxl-inspect-services` and find the `voxl-iim-server`. The data can be viewed by running the command `voxl-inspect-imu imu_iim` or by going to the IMUs tab under debug in the portal and selecting the desired IMU `imu_iim`. # Published Format IMU data is published to the pipes in an imu_data_t struct which consists of the following: - `struct imu_data_t`: - `uint32_t magic_number` Set to IMU_IMAGE_MAGIC_NUMBER for frame syncing - `float accl_ms2[3]` XYZ acceleration in m/s^2 - `float gyro_rad[3]` XYZ gyro rotation in rad/s - `float temp_c` temp in C, IMU_INVALID_TEMPERATURE_VALUE if no thermometer - `uint64_t timestamp_ns` timestamp in nanoseconds, uses system clock_monotonic --- Source: https://docs.modalai.com/mpa-services/ The MPA section outlines the architecture of VOXL's services and lists the dozens of services available. In this section, we dive into just a few critical services that are more than meets the eye. We will discuss how they work and how to use them. **We highly recommend reading this section for a full understanding of VOXL's capabilities.** When a service misbehaves, start with the [Debugging Services](/debugging-services/) guide. --- Source: https://docs.modalai.com/voxl-vision-hub/ # VOXL Vision Hub ## Overview `voxl-vision-hub` is the main hub managing communication between VOXL MPA services and autopilots such as PX4 and ArduPilot. It forwards VIO to the autopilot as MAVLink odometry, fuses obstacle sensors for Vision Obstacle Avoidance (VOA), and provides onboard autonomous flight behaviors in PX4 offboard mode — from simple demos (figure 8, trajectory following) up to VFC, the VOXL Flight Controller used on FPV platforms. `voxl-vision-hub` also underpins other tools such as `voxl-calibrate-px4-horizon`, MAVROS, and MAVSDK, so you will often find it must be running in the background for those to work. **If you want to develop applications that involve flight control without using ROS, voxl-vision-hub is the recommended starting point and will save you thousands of lines of code.** ## How It Works In the [`voxl-vision-hub` GitLab](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/tree/master/), you will find all the source code for the project. An overview of what each module does: - `autopilot_monitor.c`: subscribes to the `mavlink_onboard` pipe published by `voxl-mavlink-server` and tracks autopilot state (attitude, flight mode, armed state) - `config_file.c`: reads/writes the config file `/etc/modalai/voxl-vision-hub.conf` - `fixed_pose_input.c`: accepts a secondary (non-VIO) pose input on the `vvhub_fixed_pose_input` pipe to correct VIO drift; this should generally be a slow-but-accurate source (see `examples/fixed_frame_pipe_example.c` in the repo) - `geometry.c`: helper functions for transforming coordinate frames, used for VIO, VOA, and [relocalization](/voxl-vision-hub-apriltag-relocalization/) - `horizon_cal.c` / `horizon_cal_file.c`: in-flight IMU horizon calibration (find the orientation at which the drone hovers perfectly still) and its result file. See [horizon calibration](/calibrate-horizon/) — `voxl-vision-hub` must be running and `voxl-calibrate-px4-horizon` drives the process. - `imu_manager.c`: subscribes to the `imu_apps` pipe and keeps a short ring buffer of IMU samples for the other modules - `main.c`: starts every module, then starts the configured offboard mode - `mavlink_for_ros.c`: opens the localhost UDP port for MAVROS and MAVSDK to reach `voxl-mavlink-server`. Only active when `en_localhost_mavlink_udp` is enabled in the config (disabled by default). - `mavlink_io.c`: reads/writes MAVLink to the autopilot and GCS through `voxl-mavlink-server`'s pipes - `obs_pc_filter.c`: obstacle point-cloud filter; ring-buffers ~2 seconds of point cloud data, temporally filters it, and outputs a clean cloud at a constant rate - `offboard_figure_eight.c`: demo mode — flies a figure 8 around the point where offboard mode was engaged - `offboard_follow_tag.c`: demo mode — follows an AprilTag (ModalAI R&D only, see warning below) - `offboard_trajectory.c`: follows polynomial trajectories received on the `plan_msgs` pipe (e.g. from `voxl-mapper`); expects the input path to start at the drone's current position - `offboard_vfc.c`: VFC — the VOXL Flight Controller, a full onboard attitude/altitude/position controller with RC-selectable submodes (see [VFC](#offboard-flight-modes) below) - `offboard_backtrack.c`: records the last N seconds of flown path and, on RC-link loss or a switch trigger, flies it backwards to return toward where the link was healthy - `offboard_wps.c`: local-frame waypoint mission mode, reading waypoints from a CSV (supports photo capture, land, and return actions) - `offboard_mode.c`: dispatches whichever offboard mode the config file selects - `pose_filter.c` / `tag_manager.c`: low-pass filter over AprilTag localizations from `voxl-tag-detector`'s `tag_detections` pipe, used by the relocalization feature - `state_manager.c`: aggregates non-VIO state sources — the `state` pipe from `voxl-state-estimator` (optic-flow state used by VFC flow submodes) and, in HITL mode, the simulator's `hitl_vio` pipe - `trajectory_monitor.cpp`: for trajectory mode; predicts collisions from current pose, VOA data, and the trajectory - `transform_ringbuf.c`: ring buffer of timestamped transforms used throughout - `vio_manager.c`: transforms VIO output from body frame to a gravity-aligned local frame on the floor, health-checks VIO, and manages the fallback to the secondary VIO pipe - `voa_manager.c`: subscribes to the configured obstacle-sensor pipes (`voa_inputs`), converts them into point clouds, and fuses them for collision prevention - `voxl_vfc_config.c`: loader for the separate VFC config file `/etc/modalai/vfc.conf` ## Pipes Pipes published by `voxl-vision-hub`: | Pipe | Type | Contents | |---|---|---| | `vvhub_body_wrt_local` | `pose_vel_6dof_t` | body pose/velocity in the local (VIO-initialized) frame, at VIO rate | | `vvhub_body_wrt_fixed` | `pose_vel_6dof_t` | body pose/velocity in the fixed frame (AprilTag relocalization) | | `vvhub_aligned_vio` | `vio_data_t` | full VIO data re-aligned so the local frame origin sits under the takeoff center of mass with gravity along +Z | | `voa_pc_out` | point cloud | the fused, downsampled VOA point cloud (debug/inspection) | | `horizon_cal_io` | text + control | live status of the in-flight horizon calibration | | `vfc` | `vfc_data_t` | VFC status/telemetry, consumed by `voxl-inspect-vfc` | It also creates the `vvhub_fixed_pose_input` sink pipe, where an external localizer can write a `pose_4dof_t` stream to correct VIO drift. Pipes subscribed to include the primary and secondary VIO pipes, `imu_apps`, `state` (from `voxl-state-estimator`), `tag_detections`, `plan_msgs`, `object_tracker`, the MAVLink pipes from `voxl-mavlink-server` (`mavlink_onboard`, `mavlink_to_gcs`, `mavlink_from_gcs`), and every enabled `voa_inputs` entry. ## Configuration ### /etc/modalai/voxl-vision-hub.conf The main config file is created with defaults on first start (or with `voxl-vision-hub -c`). A legacy `/etc/modalai/voxl-vision-px4.conf` from old SDKs is migrated automatically. Obsolete keys (all the QGC IP/port settings, ADSB, and PX4 UART settings) are removed from the file on load — GCS connectivity is now entirely [voxl-mavlink-server](/voxl-mavlink-server/)'s job. > Ensure every parameter is reasonable before attempting flight. MAVROS / MAVSDK: | Field | Default | Description | |---|---|---| | `en_localhost_mavlink_udp` | `false` | open a localhost-only UDP MAVLink port for on-target MAVROS/MAVSDK. Must be enabled for MAVROS/MAVSDK to work. | | `localhost_udp_port_number` | `14551` | port for that socket (14550 is reserved for an off-board GCS) | VIO: | Field | Default | Description | |---|---|---| | `en_vio` | `true` | forward VIO to the autopilot as MAVLink `ODOMETRY` | | `vio_pipe` | `qvio` | primary VIO input pipe | | `secondary_vio_pipe` | `ov` | fallback VIO pipe (open-vins); empty string disables the fallback | | `en_reset_vio_if_initialized_inverted` | `true` | auto-reset VIO if it initialized upside-down or off-level | | `vio_warmup_s` | `3.0` | seconds of good VIO required before sending odometry to PX4 | | `send_odom_while_failed` | `true` | keep sending odometry with quality −1 during VIO failure so EKF2 dead-reckons (set `false` for PX4 older than 1.14) | | `en_hitl` | `false` | hardware-in-the-loop mode: VIO comes from the simulator's `hitl_vio` pipe instead | Note that your platform's SKU configuration (`voxl-configure-mpa`) decides which VIO service actually runs — `voxl-open-vins-server` on current SKUs, `voxl-qvio-server` on older platforms. Offboard behavior: | Field | Default | Description | |---|---|---| | `offboard_mode` | `figure_eight` | one of `off`, `figure_eight`, `follow_tag`, `trajectory`, `vfc`, `backtrack`, `wps` (SKU presets normally override this) | | `follow_tag_id` | `0` | AprilTag ID for follow_tag mode | | `figure_eight_move_home` | `true` | recenter the figure 8 where offboard mode was engaged | | `robot_radius` | `0.3` | collision radius (m) used by the trajectory monitor | | `collision_sampling_dt` | `0.1` | sampling step along the trajectory for collision checking | | `max_lookahead_distance` | `1.0` | max look-ahead distance (m) along the trajectory | Waypoint (`wps`) mode: | Field | Default | Description | |---|---|---| | `wps_move_home` | `true` | shift the mission to start at the current position | | `wps_stride` | `0.0` | interpolate intermediate points every N meters (0 = none) | | `wps_timeout` | `0.0` | hover pause (s) at each waypoint | | `wps_damp` | `1.0` | deceleration damping | | `wps_vfc_mission` | `true` | fly the mission with the VFC controller instead of raw PX4 setpoints | | `wps_vfc_mission_loop` | `false` | loop the mission | | `wps_vfc_mission_cruise_speed` | `1.0` | cruise speed (m/s) for VFC missions | Object-tracking trigger (used by VFC's yaw-follow, see [AOI yaw tracking](/aoi-yaw-tracking/)): | Field | Default | Description | |---|---|---| | `tracking_trigger_ch` | `12` | RC channel that arms/latches/clears tracking yaw-follow | | `tracking_trigger_ch_thresh_temp` | `1200` | PWM threshold for momentary tracking | | `tracking_trigger_ch_thresh_new` | `1800` | PWM threshold to latch a new target | Fixed-frame (AprilTag relocalization): | Field | Default | Description | |---|---|---| | `en_tag_fixed_frame` | `false` | enable the tag-relocalized fixed frame | | `fixed_frame_filter_len` | `5` | filter length for the fixed-frame pose | | `en_transform_mavlink_pos_setpoints_from_fixed_frame` | `false` | interpret incoming position setpoints in the fixed frame | VOA (collision prevention — see [VOA](/voa/) for the full guide): | Field | Default | Description | |---|---|---| | `en_voa` | `true` | enable Vision Obstacle Avoidance output to the autopilot | | `voa_upper_bound_m` / `voa_lower_bound_m` | `-0.15` / `0.15` | vertical slice of the world considered for obstacles | | `voa_voa_memory_s` | `1.0` | how long obstacle points persist (yes, the key really is `voa_voa_memory_s`) | | `voa_max_pc_per_fusion` | `100` | max point clouds fused per output | | `voa_pie_max_dist_m` / `voa_pie_min_dist_m` | `20.0` / `0.25` | range limits of the pie-slice output | | `voa_pie_slices` | `36` | angular resolution of the obstacle pie | | `voa_pie_bin_depth_m` | `0.15` | depth bin size | | `voa_pie_threshold` | `3` | points required to mark a bin occupied | | `voa_pie_under_trim_m` | `1.0` | trim distance under the vehicle | | `voa_send_rate_hz` | `20.0` | output rate to the autopilot | `voa_inputs` is an array of up to 6 sensor sources, each with `enabled`, `type` (`point_cloud`, `tof`, or `rangefinder`), `input_pipe`, `frame`, `max_depth`, `min_depth`, `cell_size`, `threshold`, `x_fov_deg`, `y_fov_deg`, and `conf_cutoff`. If the array is empty, defaults are created for `dfs_point_cloud`, `stereo_front_pc`, `stereo_rear_pc`, `tof`, and `rangefinders` — disable or delete the entries that don't exist on your vehicle. ### /etc/modalai/vfc.conf Since voxl-vision-hub 1.9.2 the VFC controller has its own config file, `/etc/modalai/vfc.conf`, also auto-created with defaults. It holds: - **RC mapping** — `vfc_thrust_ch` 3, `vfc_roll_ch` 1, `vfc_pitch_ch` 2, `vfc_yaw_ch` 4, `vfc_submode_ch` 6, plus stick deadbands - **Submode PWM windows** — `vfc__mode_rc_min`/`_max` pairs mapping positions of the submode switch to VFC submodes; a `0/0` window disables that submode (see [Flight Modes](#flight-modes) below) - **Backtrack** — `backtrack_seconds` 60, `backtrack_rc_chan` 10, `backtrack_rc_thresh` 1500 - **Limits** — `vfc_max_thrust` 0.8, `vfc_tilt_max` 0.436 rad, `vfc_yaw_rate_max` 3.0, `vfc_vxy_max` 3.0, `vfc_vz_max` 1.0, `vfc_thrust_hover` 0.25 - **Control gains** — separate PID gain sets for flow submodes (`vfc_kp_z`, `vfc_kp_xy`, …) and VIO submodes (`vfc_kp_z_vio`, `vfc_kp_xy_vio`, …), plus filters and transition times - **VIO health gates** — `vfc_q_min` 15 (minimum VIO quality), `vfc_points_min` - **Misc** — `vfc_rate` 100 Hz, `vfc_en_submode_announcement` (send submode changes to the GCS as STATUSTEXT), `vfc_disable_fallback`, `vfc_vio_pipe` (defaults to `ov`), `vfc_traj_csv` path > VFC tuning values placed in `/etc/modalai/voxl-vision-hub.conf` are ignored. Since voxl-vision-hub 1.9.2 the VFC configuration lives in `/etc/modalai/vfc.conf`. ### voxl-configure-vision-hub The service's configuration helper. `voxl-configure-vision-hub wizard` runs interactively; the notable non-interactive presets are: ```bash voxl-configure-vision-hub enable # enable + start the service voxl-configure-vision-hub disable # stop + disable voxl-configure-vision-hub factory_enable # reset config to factory default voxl-configure-vision-hub factory_enable_trajectory voxl-configure-vision-hub factory_enable_backtrack voxl-configure-vision-hub factory_enable_vfc_fpv # VFC preset for FPV platforms voxl-configure-vision-hub factory_enable_vfc_starling # VFC preset for Starling voxl-configure-vision-hub configure_hitl # hardware-in-the-loop setup voxl-configure-vision-hub update_vfc_settings # pull measured hover thrust into vfc.conf ``` Per-SKU presets (e.g. `d0013`) also exist and are what `voxl-configure-mpa` applies at SKU configuration time. `reset_config_file_to_default` deletes **both** `voxl-vision-hub.conf` and `vfc.conf` and regenerates defaults. ## Offboard Demo Modes `voxl-vision-hub` includes demonstration offboard modes that run out of the box: `figure_eight` and `trajectory` (plus the R&D-only `follow_tag`). > `follow_tag` mode is for ModalAI R&D only and is not recommended — the vehicle will chase a tag with no obstacle awareness. ### Other Requirements to Run `voxl-vision-hub` subscribes to pipes published by other services, which must be running: - `voxl-mavlink-server` - `voxl-imu-server` - a VIO service — `voxl-open-vins-server` (current SKUs) or `voxl-qvio-server` (legacy platforms) - `voxl-camera-server` - `voxl-tag-detector` (only for `follow_tag`) For `trajectory` mode, another service such as `voxl-mapper` must be publishing trajectories to the `plan_msgs` pipe. ### Running Power on your VOXL-equipped drone, ensuring that all the required services are running. In manual mode, using a radio transmitter, bring your drone to a hover in a safe and open space. When ready, switch the drone into offboard mode with your radio transmitter, and the configured autonomous behavior will begin. > The legacy offboard demo modes (`figure_eight`, `follow_tag`, `trajectory`) do not support autonomous takeoff and landing. The VFC `wps` mission mode does support takeoff, RTL, and land (voxl-vision-hub 1.8.23 / 1.9.1 and newer). ## Offboard Flight Modes voxl-vision-hub can fly the UAS in OFFBOARD mode using VFC (the VOXL Flight Controller) — a complete onboard attitude/altitude/position controller selected with `offboard_mode: "vfc"`. VFC is the flight stack used on ModalAI FPV platforms such as [Stinger](/stinger-vision-fpv/). ### Flight Modes The following vision-enabled flight modes are supported through VFC in OFFBOARD mode: * Manual (thrust + attitude) * Altitude Hold * Flow (optic-flow position hold, works with thermal flow) * Hybrid Flow * Position (Visual Inertial Odometry) * Trajectory (replays the CSV at `vfc_traj_csv`) * Backtrack VFC automatically falls back to a safer submode when VIO, flow, or altitude health checks fail (disable with `vfc_disable_fallback`), announces submode changes to the GCS as STATUSTEXT messages, and auto-tunes hover thrust in flight. With object tracking running, VFC can also yaw-follow a tracked target, gated by the `tracking_trigger_ch` RC channel (see [AOI yaw tracking](/aoi-yaw-tracking/)). ### Backtrack Backtrack continuously records the last `backtrack_seconds` (default 60) of position and yaw. When triggered — by RC-link loss, or by the switch on `backtrack_rc_chan` crossing `backtrack_rc_thresh` — it flies the recorded path in reverse to return the vehicle toward where the link was healthy, then hands control back. It is available both as a VFC submode and as a standalone `offboard_mode: "backtrack"`. ### Waypoint Missions (wps) `offboard_mode: "wps"` flies a local-frame waypoint mission from a CSV file (written by tools like voxl-mapper to `/tmp/voxl-mapper-traj_waypoints.csv`). Each waypoint carries x, y, altitude, and an optional action — supported actions include taking a hires snapshot and land/return. The `wps_*` config fields above control interpolation, pauses, and whether the VFC controller flies the mission. ### PX4 Configuration In PX4 the flight mode is mapped to channel 6 with the majority of positions as "offboard mode" which is integer value 7 in the PX4 config. When the channel 6 mode switch is away from the user it has a high PWM value, so PX4 flight modes 5 and 6 that correspond to that position are set to "altitude mode" which is a value of 1: ``` 1 1 COM_FLTMODE1 7 6 1 1 COM_FLTMODE2 7 6 1 1 COM_FLTMODE3 7 6 1 1 COM_FLTMODE4 7 6 1 1 COM_FLTMODE5 1 6 1 1 COM_FLTMODE6 1 6 ``` Once that channel 6 mode switch is in either the middle position or all the way towards the user, PX4 goes into offboard mode and simply takes roll/pitch/yaw/thrust commands from VFC. VFC monitors the same channel 6 switch position to decide which offboard submode to be in. By default the middle position (roughly 1500 µs) is VFC position mode, which uses VIO. When the switch is all the way towards the user (roughly 2000 µs), VFC swaps into the flow submode. This is configurable via `/etc/modalai/vfc.conf` (voxl-vision-hub 1.9.2 and newer); the relevant section looks like: ``` "vfc_submode_ch": 6, "vfc_alt_mode_rc_min": 0, "vfc_alt_mode_rc_max": 0, "vfc_flow_mode_rc_min": 1700, "vfc_flow_mode_rc_max": 2100, "vfc_hybrid_flow_mode_rc_min": 0, "vfc_hybrid_flow_mode_rc_max": 0, "vfc_position_mode_rc_min": 1300, "vfc_position_mode_rc_max": 1700, "vfc_traj_mode_rc_min": 0, "vfc_traj_mode_rc_max": 0, ``` ## Debugging `voxl-inspect-vfc` prints live VFC state from the `vfc` pipe — per-axis setpoint/current/error, thrust, hover thrust, and desired vs actual submode. Use `-t` for tuning data and `-v` for a live plot. Run `voxl-vision-hub --debug_offboard` on the bench over ADB, with propellers removed and a radio connected, to validate which submodes are being triggered in VFC. Running the binary manually automatically stops the background service. Other useful flags: ``` voxl-vision-hub -c # regenerate/validate the config files and exit voxl-vision-hub -o # print odometry being sent to the autopilot voxl-vision-hub -b # print MAVLink messages being sent voxl-vision-hub -d # print MAVLink messages being received voxl-vision-hub -r # print VOA filter debug info ``` For general service debugging (logs, restarts), see [Debugging Services](/debugging-services/). --- Source: https://docs.modalai.com/voxl-wait-for-fs/ # VOXL Wait for FS voxl-wait-for-fs is a simple bash script with an accompanying systemd service of the same name that makes tweaks to the file system write parameters and then waits for the /data/ partition to be mounted before exiting. ## Sync Rate Tweaks The Linux kernel typically wakes up to sync data to disk every 5 seconds, and will only sync data that is older than 30 seconds at that time. This is fine for desktop computers which are on for long periods and are shutdown properly every time. However, in an embedded system that is often shutdown by pulling the power plug this can easily result in a corrupt disk. We therefore speed up the sync period to twice per second to reduce the chance of a corrupted file system. You should also be sure only to write data to the /data/ partition on VOXL since corrupting the /data/ partition will still leave the system in a bootable state. ## Wait for partitions to be mounted The /data/ partition is the last partition to be mounted and it's possible it is not mounted before your own systemd services start on boot which is problematic if your program needs to read/write to /data/. To make use of this service, make your other systemd service files reference the voxl-wait-for-fs.service like this: ``` [Unit] After=voxl-wait-for-fs.service Requires=voxl-wait-for-fs.service ``` For example, voxl-qvio-server needs to read the tracking camera lens calibration file from /data/modalai/ so we ensure that service starts after the /data/ partition is mounted in its service file [here](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server/-/blob/dev/services/voxl-qvio-server.service). ## Source Source code for the script is [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/scripts/voxl-wait-for-fs). Source code for the service is [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/services/voxl-wait-for-fs.service). --- Source: https://docs.modalai.com/voxl-mavlink-server/ # voxl-mavlink-server ## Overview voxl-mavlink-server manages MAVLink routing between network interfaces, MPA applications, and the flight controller such as PX4. ## Configuration voxl-mavlink-server reads its configuration from `/etc/modalai/voxl-mavlink-server.conf`. The available fields and their defaults (as of v1.4.18) are: | Field | Default | Description | |-------|---------|-------------| | `primary_static_gcs_ip` | `"192.168.8.10"` | Static GCS IP that voxl-mavlink-server automatically tries to connect to. 192.168.8.10 is the first IP that VOXL DHCP serves when connecting in WiFi SoftAP mode. Set to empty or NULL to let the GCS initialize the connection instead. | | `primary_static_gcs_ip_port` | `14550` | UDP port number for the primary static GCS IP. | | `secondary_static_gcs_ip` | `"192.168.8.11"` | Second static GCS IP to automatically try to connect to. | | `secondary_static_gcs_ip_port` | `14550` | UDP port number for the secondary static GCS IP. | | `onboard_port_to_autopilot` | `14556` | UDP port to send high-rate onboard data to SLPI when running voxl-px4. | | `onboard_port_from_autopilot` | `14557` | UDP port to receive high-rate onboard data from SLPI. | | `gcs_port_to_autopilot` | `14558` | UDP port to send normal-rate GCS data to SLPI. | | `gcs_port_from_autopilot` | `14559` | UDP port to receive normal-rate GCS data from SLPI. | | `en_external_uart_ap` | `false` | QRB5165 only. Set to true to enable UART communication to an external flight controller, otherwise a UDP interface is started to talk to voxl-px4 on localhost. | | `autopilot_uart_bus` | `1` | UART bus for the external autopilot. Bus 1 goes through the legacy B2B connector (exposed by the M0125 and M0141 accessory boards); bus 12 goes through the ESC port (J18). | | `autopilot_uart_baudrate` | `921600` | UART baudrate for the external autopilot. | | `autopilot_mission_delay_start` | `-1` | -1 is off; a value >0 delays mission start by that many seconds. | | `autopilot_mission_delay_sound` | `false` | Play the ESC chime tone/behavior during the mission delay. | | `autopilot_mission_force_restart` | `0` | Force mission restart. | | `autopilot_mission_notif_dur` | `0.1` | Visual notification using motor spin, duration in seconds. | | `en_external_ap_timesync` | `1` | Enable responding to timesync messages. | | `en_external_ap_heartbeat` | `1` | Enable automatic sending of heartbeat. | | `en_elrs_rc_mux` | `false` | (v1.4.18 and newer) RC-source mux for the rc_active pipe with ELRS failsafe awareness. | | `udp_mtu` | `512` | Maximum transfer unit for aggregated UDP packets back to the GCS. Set to 0 to disable aggregation. See below. | | `gcs_timeout_s` | `4.5` | Time without a heartbeat before a GCS is considered disconnected. | > Never set `primary_static_gcs_ip` or `secondary_static_gcs_ip` to localhost, these are meant for external ground control stations. For local MAVSDK and MAVROS communication, set the `en_localhost_mavlink_udp` flag in voxl-vision-hub's `/etc/modalai/voxl-vision-hub.conf` file instead. ### udp_mtu For radios, such as Doodle Labs, that utilize larger packet sizes with increased latency, voxl-mavlink-server can bundle mavlink messages headed to the GCS into larger UDP packets. Since v1.4.14 this aggregation is on by default with a `udp_mtu` of 512 bytes. Set `udp_mtu` to 0 to disable aggregation and send one UDP packet per message. The config file contains the following description of the field: ``` * udp_mtu - maximum transfer unit for UDP packets back to GCS. voxl-mavlink-server * will bundle up backets for the GCS into a single UDP packet with * a maxium size of this. This saves network traffic drastically. * Set to 0 to disable this feature and send one UDP packet per msg. ``` Try a few different values such as 100, 200, 300 etc to find an optimal value for your setup. ## Pipes voxl-mavlink-server publishes the following 14 pipes into MPA. Data from the high-rate onboard stream: - `mavlink_onboard`: full high-rate 'onboard mode' mavlink stream from the autopilot - `mavlink_ap_heartbeat`: autopilot heartbeat messages - `mavlink_sys_status`: sys_status messages - `mavlink_gps_raw_int`: gps_raw_int messages - `mavlink_attitude`: attitude messages - `mavlink_local_position_ned`: local_position_ned messages - `imu_mavlink`: IMU data from the autopilot - `px4_baro`: barometer data from the autopilot - `rc_channels`: RC channel data - `rc_active`: active RC source, muxing rc_channels and manual_control GCS-related pipes: - `mavlink_to_gcs`: normal-rate stream from the autopilot to the GCS - `mavlink_from_gcs`: data coming from the GCS - `gcs_ip_list`: list of IP addresses of connected GCS - `mission`: mission data Up to 16 simultaneous GCS connections can be established over UDP port 14550. See the [Mavlink Routing](/mavlink/) feature guide for the routing paths and how to inspect these pipes with voxl-inspect-mavlink. --- Source: https://docs.modalai.com/debugging-services/ # Debugging Services ## Overview Every MPA service (voxl-camera-server, voxl-vision-hub, voxl-px4, …) is a standard Linux [systemd](https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units) service. Which services are enabled on your vehicle is decided by its SKU configuration — [voxl-configure-mpa](/voxl-configure-mpa/) enables the right set at configuration time. When something isn't working, the debugging loop is always the same: check what's running, read its log, then run it in the foreground for more detail. ## Check What's Running `voxl-inspect-services` lists every ModalAI-related service with its enabled state, running state, and CPU usage: ```bash voxl-inspect-services voxl-inspect-services -v # also show each package version (slower) voxl-inspect-services -j # machine-readable JSON ``` ![voxl-inspect-services.jpg](/images/voxl-sdk/voxl-inspect-services.jpg) For a single service, standard systemd tools work as expected: ```bash systemctl status voxl-camera-server ``` ## Read the Logs Each service's stdout/stderr goes to the systemd journal: ```bash journalctl -u voxl-camera-server # full log journalctl -u voxl-camera-server -f # follow live journalctl -u voxl-camera-server -b # this boot only journalctl -u voxl-camera-server -n 100 # last 100 lines ``` Startup errors — bad config files, missing pipes, missing hardware — almost always show up in the first screen of a service's journal after start. ## Start, Stop, Enable, Disable ```bash systemctl stop voxl-camera-server # stop now systemctl start voxl-camera-server # start now systemctl restart voxl-camera-server # e.g. after editing its config file systemctl disable voxl-camera-server # don't start on boot systemctl enable voxl-camera-server # start on boot ``` Most services also install a `voxl-configure-` helper that can enable/disable them and regenerate their config file. To reset the whole vehicle to its SKU's factory service set, run [voxl-configure-mpa](/voxl-configure-mpa/) (note this resets service configuration). ## Run a Service in the Foreground The most powerful debugging step: stop the background service, then run the same binary by hand in a shell. You get its full stdout in front of you, and nearly every service has extra debug flags — check with `-h`: ```bash systemctl stop voxl-camera-server voxl-camera-server -h ``` Some binaries (voxl-vision-hub, for example) automatically stop their background service when run manually, but stopping it first is a good habit. Remember to `systemctl start` the service again — or just reboot — when done. ## Check the Pipes MPA services talk through pipes in `/run/mpa/`. If a downstream service complains about a missing input, check whether the upstream pipe actually exists: ```bash ls /run/mpa/ # every pipe currently being served voxl-list-pipes # same, as a tool voxl-inspect-cam tracking # inspect a specific pipe with its matching tool ``` The [inspect tools](/inspect-tools/) family covers most pipe types, and [voxl-portal](/voxl-portal/) gives you a browser view of cameras and many data streams. ## Common Issues - **Service isn't running because it isn't enabled.** Not every SKU enables every service — check `voxl-inspect-services` and your SKU's defaults ([voxl-configure-mpa](/voxl-configure-mpa/)) before assuming a crash. - **Invalid config file.** Service config lives in `/etc/modalai/*.conf` as JSON — a stray comma stops the service from starting, and the journal will show the parse error. Most services regenerate a clean default config via their `voxl-configure-` helper or a `-c` flag on the binary. - **An upstream service is down.** Pipes missing from `/run/mpa/` mean the publisher isn't running — e.g. no VIO output usually traces back to voxl-camera-server or the IMU server, not the VIO service itself. Walk upstream. - **Services start before the filesystem is ready.** ModalAI services deliberately order themselves after `voxl-wait-for-fs.service`; if you write your own service that reads `/data`, add the same dependency. ## Service Reference Which config file and configure helper belongs to which service (all config files live in `/etc/modalai/`): | Service | Config file | Configure helper | Docs | |---|---|---|---| | voxl-camera-server | `voxl-camera-server.conf` | `voxl-configure-cameras` | [docs](/voxl-camera-server/) | | voxl-imu-server | `voxl-imu-server.conf` | `voxl-configure-imu` | [docs](/voxl-imu-server/) | | voxl-open-vins-server | `voxl-open-vins-server.conf` | `voxl-configure-open-vins` | [docs](/voxl-open-vins-server/) | | voxl-qvio-server (legacy platforms) | `voxl-qvio-server.conf` | `voxl-configure-qvio` | — | | voxl-vision-hub | `voxl-vision-hub.conf`, `vfc.conf` | `voxl-configure-vision-hub` | [docs](/voxl-vision-hub/) | | voxl-mavlink-server | `voxl-mavlink-server.conf` | `voxl-configure-mavlink-server` | [docs](/voxl-mavlink-server/) | | voxl-px4 | `voxl-px4.conf` | `voxl-configure-px4` | [docs](/voxl-px4/) | | voxl-portal | — | `voxl-configure-portal` | [docs](/voxl-portal/) | | voxl-streamer | `voxl-streamer.conf` | `voxl-configure-streamer` | [docs](/voxl-streamer/) | | voxl-mavcam-manager | `voxl-mavcam-manager.conf` | `voxl-configure-mavcam` | [docs](/voxl-mavcam-manager/) | | voxl-cpu-monitor | `voxl-cpu-monitor.conf` | `voxl-configure-cpu-monitor` | — | | voxl-tflite-server | `voxl-tflite-server.conf` | `voxl-configure-tflite-wizard` | [docs](/voxl-tflite-server/) | | voxl-tag-detector | `voxl-tag-detector.conf` | `voxl-configure-tag-detector` | [docs](/voxl-tag-detector/) | | voxl-lepton-server | `voxl-lepton-server.conf` | `voxl-configure-lepton` | [docs](/voxl-lepton-server/) | | voxl-mapper | `voxl-mapper.conf` | — | [docs](/voxl-mapper/) | Camera and IMU extrinsics (the vehicle's sensor geometry, used by VIO and the state services) live in the shared `/etc/modalai/extrinsics.conf`. ## Getting Help When posting on the [ModalAI Forum](https://forum.modalai.com/), include the output of `voxl-version`, `voxl-inspect-services -v`, and the failing service's `journalctl` output — those three answer most first-round questions. --- Source: https://docs.modalai.com/voxl-ardupilot/ # VOXL ArduPilot --- ## Overview VOXL 2 and VOXL 2 Mini are supported in mainline ArduPilot (4.6 and newer): ArduPilot runs directly on the VOXL 2's DSP in place of PX4, alongside the standard VOXL SDK services. ArduPilot on VOXL is **community supported**. The authoritative setup guide is the ArduPilot wiki's [ModalAI VOXL 2 page](https://ardupilot.org/copter/docs/common-modalai-voxl2.html); for questions, use the [ModalAI forum's ArduPilot category](https://forum.modalai.com/category/32/flight-core-ardupilot) and the ArduPilot community channels. ## Current Status - Flight tested on four models of small-to-medium quadcopter (ArduCopter) and one small fixed wing (ArduPlane). - The [VOXL 2 IO board](/voxl2-io/) is supported, providing up to 8 PWM outputs for PWM ESCs on multirotors or servos on fixed wings. It has been flight tested on a quadcopter with four PWM ESCs and on a fixed wing with PWM servos. ## Installation Prebuilt ArduPilot packages for VOXL 2 are published on the ArduPilot firmware server: - [ArduCopter](https://firmware.ardupilot.org/Copter/latest/QURT/) - [ArduPlane](https://firmware.ardupilot.org/Plane/latest/QURT/) - [ArduRover](https://firmware.ardupilot.org/Rover/latest/QURT/) On a VOXL 2 running SDK 1.4.0 or newer: 1. Disable the PX4 service: ```bash systemctl disable voxl-px4 ``` 2. Download and install the latest `voxl-ardupilot` package for your vehicle type, for example: ```bash wget https://firmware.ardupilot.org/Copter/latest/QURT/voxl-ardupilot_ArduCopter__arm64.deb dpkg -i voxl-ardupilot_ArduCopter__arm64.deb ``` 3. Optionally link a default parameter file in `/data/APM`: ```bash cd /data/APM ln -s D0013.parm defaults.parm ``` 4. Enable the ArduPilot service: ```bash systemctl enable voxl-ardupilot ``` ## Parameters Default parameter files for ModalAI frames are maintained in mainline ArduPilot under [Tools/Frame_params/ModalAI](https://github.com/ArduPilot/ardupilot/tree/master/Tools/Frame_params/ModalAI). The AutonomyDevKit parameters are also appropriate for the [Starling 2](/starling-2/). > Validate all parameter settings before flying. Follow the relevant [ArduPilot setup documentation](https://ardupilot.org/copter/docs/common-modalai-voxl2.html) to configure the vehicle fully, and calibrate all sensors and the RC. ## Building from Source Prebuilt firmware comes from the ArduPilot servers, or you can build it yourself. Building requires the Hexagon SDK from Qualcomm integrated into a build docker — [voxl-docker-ardupilot-build](https://gitlab.com/voxl-public/voxl-docker-images/voxl-docker-ardupilot-build) sets that up. Additional build and setup information is in the [ArduPilot QURT HAL documentation](https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_QURT/ap_host/service). ## Resources - [ArduPilot wiki: ModalAI VOXL 2](https://ardupilot.org/copter/docs/common-modalai-voxl2.html) - [Forum discussion: ArduPilot on VOXL 2](https://forum.modalai.com/topic/3640/ardupilot-on-voxl2) - [Test flight video](https://www.youtube.com/watch?v=l6c65-E-lzg) - Using an external ArduPilot flight controller with VOXL 2 instead? See [VOXL 2 as a Companion Computer](/voxl2-external-flight-controller/). --- Source: https://docs.modalai.com/voxl-px4/ # VOXL PX4 The `voxl-px4` package provides the infrastructure to install and run the PX4 flight controller as a Linux service on QRB5165 based platforms (VOXL 2 and VOXL 2 Mini). ![voxl-px4](/images/voxl-sdk/voxl-px4/voxl-px4.jpg) ## Overview The `voxl-px4` project is essentially a wrapper for the QRB5165 based build of the [PX4 Flight Controller](https://px4.io/). The PX4 flight controller and other related components are open source projects and have extensive online documentation to describe what they are, how to use them, and how to develop with them. It is recommended to start with that documentation to build an understanding of PX4 and how it is generally used. This documentation focuses more on how the QRB5165 based implementation of PX4 is unique and the aspects of it's use and/or development that differ from the standard use cases. ## How PX4 is Packaged on VOXL 2 PX4 reaches a VOXL 2 as a pair of Debian packages built from three open-source repositories: ``` voxl-px4 Debian package + systemd service gitlab.com/voxl-public/voxl-sdk/services/voxl-px4 └── px4-firmware git submodule, pinned ──► github.com/modalai/px4-firmware ModalAI's PX4 fork (upstream: github.com/PX4/PX4-Autopilot) voxl-px4-params Debian package gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params per-vehicle parameter sets, selected by SKU and applied on top of PX4's defaults ``` - **ModalAI maintains its own fork of PX4** at [github.com/modalai/px4-firmware](https://github.com/modalai/px4-firmware). Active development happens on the `voxl-dev` branch. QRB5165 support is upstreamed to mainline PX4, but upstreaming takes time, so the tip of the fork always carries the newest VOXL support ahead of upstream. - **The [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) project wraps that fork** as a git submodule and provides the packaging and installation layer — the Debian package, the systemd service, and the startup configuration — that runs PX4 as a Linux service. - **Parameters ship separately** in the [voxl-px4-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) package. It holds per-PX4-version parameter sets: one file per vehicle platform (Starling 2, Sentinel, PX4 Autonomy Dev Kit, ...) plus helper groups (radio, VOA, battery). These are subsets of non-default parameters applied over PX4's defaults; they are applied by the `voxl-configure-px4-params` script (shipped in the same repo), whose arguments select the vehicle's platform file — reading that script is the quickest way to see exactly which parameter files a given vehicle gets. It is invoked automatically, based on the vehicle's SKU, by [voxl-configure-mpa](/voxl-configure-mpa/) at the end of every SDK install. - **Versions match by design**: a `voxl-px4` release tag pins the `px4-firmware` submodule at the fork tag of the same version. Both use the scheme `v-`, so for example `voxl-px4` v1.14.0-2.0.146 contains exactly the fork's v1.14.0-2.0.146 source. The installed package version (`dpkg -l voxl-px4` on target) therefore identifies the exact PX4 source it was built from. Please refer to the following sections for more details. It is recommended to start with the system architecture section to get an idea of how the QRB5165 based build of PX4 differs from other implementations. --- Source: https://docs.modalai.com/voxl-px4-hardware/ # Hardware ## Supported Devices The `voxl-px4` package is supported on the following platforms: - VOXL 2 Mini (board ID `M0104`) - VOXL 2 (board ID `M0054`) ## Hardware Block Diagrams Below are hardware block diagrams that show the VOXL 2 and VOXL 2 Mini in supported architectures used to facilitate robotics applications. Many other variations are possible.
[View in fullsize](/images/voxl2-mini/m0104-px4-user-guide-overview-v1.jpg){:target="_blank"} ![m0104-px4-user-guide-overview-v1](/images/voxl2-mini/m0104-px4-user-guide-overview-v1.jpg) **Minimum Setup Option** Minimum requirements are (e.g. to play around at your desk) **Setup to Connect to Ground Control Station** Additionally/Optionally (e.g. to connect to Ground Control Station):
[View in fullsize](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1.jpg){:target="_blank"} ![D0006-C11-M13-T1](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1.jpg) **Minimum Setup Option** Minimum requirements are (e.g. to play around at your desk) - VOXL 2 Development Kit (MDK-M0054-1-01) - VOXL 2 (MDK-M0054-1-00) - VOXL Power Module (MDK-M0041-1-B-00) - Power cable (MCBL-00001-1) - Power supply 12V 3A ((MPS-00005-1), XT60) (or 2S-6S battery) - *Note: inrush current on bootup requires 30W power supply min, nominally ~8W at runtime in beta* - Host PC with [Android Debug Bridge]() - USBC cable **Setup to Connect to Ground Control Station** Additionally/Optionally (e.g. to connect to Ground Control Station): - Add-on board for networking: - USB Expansion Board (M0017) + JST-to-USB cable (MCBL-00009-1) + [Ethernet](/voxl-quickstarts/) or [Wi-Fi dongle](/wifi-setup/) - 5G Modem Add-on (M0090-3-01) + your own VPN - [Microhard Modem Add-On](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) (M0048-1) **Setup for Bringup and Manual Flight** Additionally/Optionally (e.g. to fly manual modes, testing and bringup): - [ModalAI 4-in-1 UART ESC](https://www.modalai.com/collections/electronic-speed-controls) (M0049) - GPS/Mag/Spektrum RC input wiring harness (MSA-D0006-1-00) - or make your own 12-pin JST GH connector ([pinouts](/voxl2-connectors/)) - the actual GPS/Mag/Spektrum RC* receiver hardware - Frame/Motors/Props/etc
## ESC Configs Information about ESC configs: - [VOXL 2 Mini](/voxl2-mini-esc-configs/) - [VOXL 2](/voxl2-esc-configs/) ## RC Configs Information about RC configs: - [VOXL 2 Mini](/voxl2-mini-rc-configs/) - [VOXL 2](/voxl2-rc-configs/) ## Onboard Sensors Information about onboard sensors: - [VOXL 2 Mini](/voxl2-mini-onboard-sensors/) - [VOXL 2](/voxl2-onboard-sensors/) ## Offboard Sensors Information about offboard sensors: - [VOXL 2 Mini](/voxl2-mini-offboard-sensors/) - [VOXL 2](/voxl2-offboard-sensors/) ## Autopilot Orientation Below are the default autopilot orientations. To update for your setup, use the `SENS_BOARD_ROT` parameter or configure using a Ground Control Station like QGC. ![voxl-px4-user-guide-autopilot-orientation](/images/voxl2-mini/voxl-px4-user-guide-autopilot-orientation.jpg) --- Source: https://docs.modalai.com/voxl-px4-system-architecture/ # Introduction The QRB5165 based build of PX4 for SDK release 1.0.0 is based on the 1.14.0 version of PX4 but has some custom features that allow it to work on the QRB5165. Mostly these changes were required due to the underlying architecture of the QRB5165 device and it's software architecture. The QRB5165 device is produced by Qualcomm, Inc. and documentation about it's feature set can be found on the Qualcomm site. [This](https://docs.qualcomm.com/bundle/publicresource/topics/80-PV086-1/introduction.html) provides a nice overview. # Architecture The QRB5165 device is a powerful System-on-Chip (SoC) that combines a number of high powered processing cores and compute accelerators. The main applications processor is composed of a complex of eight ARM64 cores running Linux. There is also a DSP based on the Qualcomm Hexagon architecture used for sensors applications. It is on this sensors DSP where the majority of the PX4 flight controller software runs. This DSP is often referred to as the SDSP, or SLPI in various documentation. It runs the QuRT RTOS which is a custom and proprietary Qualcomm product. Some of the PX4 flight controller also runs on the Linux application processor. So essentially PX4 runs as a split architecture on QRB5165 with all flight critical real time processing occurring on the DSP and support tasks such as logging and Mavlink processing occurring on the application processor. Understanding this split architecture is one of the keys to understanding how the QRB5165 based implementation of PX4 differs from PX4 on other architectures. How this affects development is explained in more detail in the development guide. ## CPU Load The CPU usage that `voxl-inspect-services` or `top` report for `voxl-px4` covers only the apps processor side of PX4: the MUORB bridge, MAVLink, and logging. The sensor drivers, estimator, controllers, and ESC driver run on the DSP, and their load does not appear in any apps processor tool. To check DSP load, take a PX4 log and look at the `cpuload` topic, which the DSP reports separately from the apps processor. Heavy load on the apps processor delays MAVLink and logging first. That shows up as gaps in telemetry and in the log, and is not by itself a sign that the control loops on the DSP are affected. Separately, warnings in a log about out-of-sequence or missing events are a by-product of the DSP and the apps processor each keeping their own event numbering sequence, and do not indicate dropped MAVLink messages. ## I/O A major part of any flight controller is the support for external sensors and other components. The QRB5165 provides an assortment of IO options for standard external sensors such as an IMU, barometer, GPS, magnetometer, radio control, and ESC. It is important to understand what IO options are available when designing a custom drone or outfitting a ModalAI development drone with new peripherals. - It is important to note that VOXL2 has no native support for PWM or CAN. Add on boards are required to get those types of I/O ports --- Source: https://docs.modalai.com/voxl-px4-files/ # Parameters - The full PX4 parameter guide can be found [here](https://docs.px4.io/main/en/advanced_config/parameter_reference.html) The default value for all parameters is built into the software image. Any parameter values that are changed from their default values are stored in a parameter file in the file system. The default location for this file is `/data/px4/param/parameters`. In order to get back to the default setting for all parameters one can delete this file. ## ModalAI Parameter Sets ModalAI provides sets of parameters that can be used for the various reference drones and for various use cases. These parameter sets are stored in a format that allows them to be loaded onto the drone with QGroundControl using the `load from file` option. These parameter sets are available [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) If PX4 is started via the `/usr/bin/voxl-px4` script and the parameters file does not exist it will create one populated with the parameters listed in the file `/etc/modalai/voxl-px4-set-default-parameters.config` ## Viewing/Editing Parameters You can use the param subsystem to interact with the parameters, e.g. viewing: ``` px4-param show ``` ![voxl-param-show.gif](/images/voxl-sdk/voxl-px4/px4-param-show.gif) # Log files PX4 log files can be a valuable way to tune performance of your drone or debug problems. The PX4 logger module is responsible for collecting the information and storing it into the log file. This module is started in the standard startup script with some standard options. The normal approach is to start a log file once the drone has been armed and close it once the drone has been disarmed. The log files are stored in the file system at `/data/px4/log`. In some cases it is desirable to start the logs immediately upon the start of PX4. To enable this add the `-e` option to the logger start line. Care must be used with this option because if power is removed from the drone (e.g. at the end of the flight) then it is possible to corrupt the log file and make it unusable. Instead it is advised to log into the drone via adb or ssh and issue the command `px4-logger stop` to cause the logger to finish the log file and close it safely before removing power. ## Starting a log manually Logging normally starts only when the drone is armed. To capture a log on the bench without arming, for example to share a problem with support, start the logger from an adb or ssh shell on VOXL 2: ```bash px4-logger on ``` Let it run for the period of interest, then close the file: ```bash px4-logger off ``` The `.ulg` file is written under `/data/px4/log`. Upload it to [PX4 Flight Review](https://review.px4.io/) and share the resulting link when reporting a problem; the site also extracts the parameter values from the log. --- Source: https://docs.modalai.com/voxl-px4-config-and-startup/ # PX4 startup on VOXL2 PX4 is auto-started via the systemd service using the file `etc\systemd\system\voxl-px4.service` This service file relies on the `/usr/bin/voxl-px4` convenience script to start PX4 in daemon mode. The voxl-px4 script is a simple bash script. ## voxl-px4 The voxl-px4 convenience script performs a few simple tasks: - Checks for the existence of the configuration file in `/etc/modalai/voxl-px4.conf`. If the configuration file exists it will be sourced to set the values of various important environment variables that control the startup process - Checks for the existence of the signature file that is required to run any custom software on the sensors DSP. If it does not exist it is created. - Parse any command line options. These options can be used to overwrite any environment variable values set by the configuration file (if one existed). - Check for existence of a parameters file in `/data/px4/param`. If one does not exist it will create one with the parameters listed in `/etc/modalai/voxl-px4-set-default-parameters.config` - Finally it will start the px4 and pass it the option to run the startup script located at `/usr/bin/voxl-px4-start`. The voxl-px4-start startup script is also a simple bash script. - As the voxl-px4 convenience script runs it will print out useful information ## Creating the configuration file The `voxl-configure-px4` script will create the configuration file at `/etc/modalai/voxl-px4.conf`. ## Auto start and daemon mode By default PX4 will be auto-started and will run as a system daemon. For development purposes it is often more appropriate to start PX4 manually from the command line. To disable the auto-start function use `systemctl disable voxl-px4` and then reboot the system. Once the system has restarted you can manually start PX4 by running `voxl-px4`. Be aware that the configuration file may be set up to run PX4 in daemon mode so even though it was started manually you will not be able to interact with the PX4 shell. In order to not start in daemon mode the configuration script can be updated. If voxl-px4 was auto-started and you want to see all of the normal console messages you can use this command: `journalctl -b -u voxl-px4` ## voxl-px4-start startup script The startup script `/usr/bin/voxl-px4-start` is the most important part of PX4 startup process. This script is responsible for starting all drivers and modules on both the applications processor and the DSP. It is important to note that the `qshell` driver is needed to interact with the PX4 code running on the DSP. All drivers and modules started on the DSP must be done via `qshell`. ## Interacting with PX4 after startup If PX4 has been started manually and is not in daemon mode then you can interact directly with the PX4 shell. If it has been auto-started or is in daemon mode then you cannot directly interact with the PX4 shell. However, many of the commands are still available from an adb shell or ssh session terminal prompt. Simply prefix the desired command with `px4-` and it will interact with the running PX4 process. A very common use case is to run `px4-listener` from a different shell to see the current output of a desired topic. For example `px4-listener sensor_gps` will give you the current value of the sensor_gps topic if it is being currently published by the GPS device driver. --- Source: https://docs.modalai.com/voxl-px4-connectivity/ # PX4 connectivity PX4 uses the [Mavlink protocol](https://mavlink.io/en/messages/common.html) to communicate to the outside world (Including QGroundControl). Generally this is handled over an IP link when using VOXL2. PX4 on VOXL2 utilizes a custom Mavlink router called `voxl-mavlink-server` to route all Mavlink traffic correctly. ## voxl-mavlink-server Daemon ### Enable Daemon `voxl-px4` communicates over IP to the outside world using the `voxl-mavlink-server` daemon. To enable, run the following: ```bash voxl-configure-mavlink-server factory_enable ``` *Example output from running command for reference:* ``` voxl2-mini:/$ voxl-configure-mavlink-server factory_enable wiping old config file Created new json file: /etc/modalai/voxl-mavlink-server.conf enabling voxl-mavlink-server systemd service Done configuring voxl-mavlink-server ``` ### IP Connection - To get an IP link on VOXL 2, see [here](/wifi-setup/) - To get an IP link on VOXL 2 Mini, see [here](/voxl2-mini-usb-connections/) for options to get a USB connection going, and use some network adapter like a WiFi dongle (e.g. `awus036acs`). > the adb connection does not pass IP traffic and can't be used for this link. ### GCS Connection using WiFi - Using SoftAP If using a WiFi dongle, an easy way to get a connection going is to setup VOXL 2 / VOXL 2 Mini as a Soft AP (access point) and have your host computer connect wirelessly to it. When in this mode, VOXL 2 Mini will provide your host PC an address of `192.168.8.10` by default. The default IP address `voxl-mavlink-server` will use for the main connection to QGC. So by default, a connection between VOXL 2 / VOXL 2 Mini and your GCS should be facilitated in this mode. ### GCS Connection using WiFi Station Mode or Ethernet Adapter If using WiFi in Station Mode or an Ethernet Adapter, connect VOXL 2 / VOXL 2 Mini to the same network as your QGC and update the configuration file's `primary_static_gcs_ip` field at `/etc/modalai/voxl-mavlink-server.conf` ## Differences When using PX4 on VOXL2 it is important to note a few differences to other micro-controller based platforms such as Pixhawk. - You cannot connect to QGroundControl via the USB-C port - The Mavlink console in QGroundControl does not work with VOXL2 - Software update is not handled via QGroundControl. It is done via Debian packages. --- Source: https://docs.modalai.com/voxl-px4-dev-build-guide/ # VOXL 2 PX4 Developer and Build Guide ## Introduction Since not all support for QRB5165 has been integrated into the mainline PX4 source code ModalAI maintains a fork of the project where our custom additions are kept. The intention is to eventually merge all of these customizations into the mainline PX4 source repository so that our fork will no longer be necessary other than for research and development purposes. ## Main components - The PX4 firmware lives in [ModalAI's fork](https://github.com/modalai/px4-firmware) of the main PX4 firmware repository. The `voxl-px4` package version matches the fork tag it pins — see [How PX4 is Packaged on VOXL 2](/voxl-px4/#how-px4-is-packaged-on-voxl-2). - The [voxl-px4](/voxl-px4/) project is a wrapper that includes the PX4 firmware as a git submodule. The main objectives are to provide packaging and installation support. - The [build environment](https://gitlab.com/voxl-public/rb5-flight/rb5-flight-px4-build-docker) for QRB5165 is encapsulated in a docker image. This docker includes an ARM64 toolchain from Linaro to build the code running on the applications processor and a Hexagon DSP toolchain to build the code running on the SDSP. The Hexagon SDK is only available directly from Qualcomm so instructions are provided to obtain the SDK and integrate it into the build environment docker image. ## Links to source code - [voxl-px4 wrapper project](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4) which runs the main service across Linux and sDSP. - [Development Branch on ModalAI's VOXL 2 PX4 Fork](https://github.com/modalai/px4-firmware/tree/voxl-dev) which has the latest source code for the PX4 build for VOXL 2. - [Docker image to build PX4 for VOXL 2 and RB5 Flight sDSP and CPU](https://gitlab.com/voxl-public/rb5-flight/rb5-flight-px4-build-docker) ## I2C debugging ### i2cdetect There are three external i2c buses available to the SLPI DSP (SDSP). In order to help troubleshoot devices attached to these buses the PX4 i2cdetect system command has been added to the build (As of v1.14.0-2.0.135). With this it is possible to scan each of the external buses to detect devices attached. - Make sure px4 isn't running. - ```systemctl disable voxl-px4``` - Then power cycle the board. - Start px4 from the command line in minimal mode - ```MINIMAL_PX4=1 voxl-px4 -d``` - At the px4 prompt enter the command - ```qshell i2cdetect -b 1``` - ```qshell i2cdetect -b 2``` - ```qshell i2cdetect -b 4``` #### VOXL 2 external i2c buses - bus 1: "Magnetometer" i2c on J19, pins 4 and 5 - bus 2: i2c on J4 - bus 4: "Spare" i2c on J19, pins 7 and 8 ## DSP debugging ### mini-dm mini-dm is a diag log tool for debugging the shell output of the Hexagon DSP. mini-dm is a part of the [Hexagon SDK](https://www.qualcomm.com/developer/software/hexagon-npu-sdk). To configure on Ubuntu: ```lsusb``` and find the Qualcomm entry. VOXL's device ID is ```05c6:901d Qualcomm, Inc.``` Add the udev rule with the following command: ```bash echo 'SUBSYSTEM=="usb",ATTRS{idVendor}=="05c6",ATTRS{idProduct}=="901d",MODE=="0666"' | sudo tee -a /etc/udev/rules.d/70-android.rules ``` Then reload udev rules or power cycle the voxl ```voxl2:/$ udevadm control --reload-rules && sudo udevadm trigger``` To execute mini-dm extract the dsp sdk and run on host machine: `sdk/x.x.x/tools/debug/mini-dm/UbuntuXX/mini-dm` mini-dm Ubuntu18 has been verified to work on Ubuntu24 Then on voxl run px4 dsp commands such as: `voxl2:/$ px4-qshell crsf_rc status` The output will show up in the mini-dm console ``` [08500/01] 51:17.578 0068:01: SDSP: [uORB] Marking DeviceNode(qshell_req) as advertised in process_remote_topic 0632 uORBManager.cpp [08500/01] 51:17.580 0049:01: SDSP: [qshell] qshell gotten: crsf_rc status 0088 qshell.cpp [08500/01] 51:17.580 0049:01: SDSP: [qshell] arg0 = 'crsf_rc' 0163 qshell.cpp [08500/01] 51:17.580 0049:01: SDSP: [qshell] arg1 = 'status' 0163 qshell.cpp [08500/01] 51:17.580 0049:01: SDSP: [crsf_rc] UART device: 7 0582 CrsfRc.cpp [08500/01] 51:17.580 0049:01: SDSP: [crsf_rc] UART RX bytes: 43316 0583 CrsfRc.cpp ... ``` --- Source: https://docs.modalai.com/voxl2-PX4-hitl/ # VOXL2 PX4 HITL --- # Introduction Software in the loop (SITL) and Hardware in the loop (HITL) are great ways to test new features before going out and trying to fly with them on a real drone. Since the VOXL2 PX4 software architecture is quite a bit different than what you get with SITL it makes HITL a valuable tool. ## HITL The VOXL2 is connected to a host computer via a serial link. The host computer is running the simulation where simulated sensor readings are sent to PX4 and actuator responses (essentially, ESC commands) are sent back to the simulation. Please refer to the official PX4 documentation for more details (https://docs.px4.io/v1.14/en/simulation/hitl.html) ## Gazebo Setup VOXL2 HITL supports the Gazebo simulator. Please be aware that gazebo naming is very confusing! In the past there was gazebo and gazebo ignition. Gazebo was the current version and gazebo ignition was new version. At some point they decided to change the name of gazebo ignition to gazebo and change gazebo to gazebo classic! PX4 1.14.x has this updated naming scheme. Unfortunately, the new gazebo does not support HITL yet so we have to use gazebo classic. On top of that, starting with Ubuntu 22.04, gazebo classic is no longer supported. So, to make things less confusing, we have incorporated everything you need into a Docker image so that you don't have to mess with patching and building gazebo yourself. However, if you want to see how we did it you can find our forked version of gazebo here: https://github.com/modalai/PX4-SITL_gazebo-classic/tree/voxl-dev > The following requires a knowledge of how to run software in terminal/bash. ### Hardware requirements 1. FTDI Cable (USB to serial) connected to a 4-pin JST. Don't connect the power line! Only ground, transmit, and receive. - Recommended cable: https://www.sparkfun.com/usb-to-ttl-serial-cable.html (CAB-12977) 2. Host computer that is capable of running gazebo (Ubuntu 18.04/20.04/22.04 or MacOS) 3. Voxl2 4. RC transmitter and receiver if you want to fly with that. This is optional. 5. WiFi or other network connectivity if you want to connect with QGC. This is optional. ### FTDI Cable Image ![m0052-FTDI-cable](/images/voxl2/voxl2_hitl_ftdi.png) ### Hardware setup 1. Connect the FTDI USB side to your host computer and the JST connector to the VOXL2 J18 port (https://docs.modalai.com/voxl2-connectors/#j18-uart-esc). ### Gazebo simulator setup on host computer This assumes that you already have Docker installed on your host computer. It will pull the compressed image from our public server and load it, tag it. 1. `wget https://storage.googleapis.com/modalai_public/modal_dockers/voxl-gazebo-docker_v1_2.tgz` 2. `docker load < voxl-gazebo-docker_v1_2.tgz` 3. `docker tag voxl-gazebo-docker:v1.2 voxl-gazebo-docker:latest` To verify that it was loaded properly use `docker images` and make sure that voxl-gazebo-docker is listed. ### Software setup on VOXL2 HITL support in PX4 was not introduced until after the SDK 1.0.0 release. It is recommended to get the latest SDK for the most up to date version. At a minimum you should be running SDK 1.1.2 or better. ### Running the simulation and PX4 in GPS mode #### On host computer > If the user wishes to use QGC with gazebo - this must be opened AFTER gazebo has been started. This is the standard way to launch Gazebo and will bring up the GUI: 1. `xhost +` 2. `docker run --rm -it --net=host --privileged -e DISPLAY=$DISPLAY -v /dev/input:/dev/input:rw -v /tmp/.X11-unix:/tmp/.X11-unix:ro voxl-gazebo-docker ./run_gazebo.bash` This can be used to launch Gazebo without the GUI (AKA headless mode): 1. `docker run --rm -it --net=host --privileged -v /dev/input:/dev/input:rw voxl-gazebo-docker ./run_headless.bash` #### On Voxl2 > The following commands are done on the voxl2 shell via adb or ssh. > You must disable auto start of PX4. Use `systemctl disable voxl-px4` to disable auto starting of PX4. Then use `sync` to make sure the changes are saved. Then reboot. Once rebooted you can use `voxl-inspect-services` to verify that voxl-px4 is not enabled or running. > Ensure that `voxl-qvio-server` is disabled. If it is enabled, it will confuse gazebo due to gazebo sending fake sensor data to the qvio algorithm and causing poor flight dynamics in HITL. This can be done with the `systemctl disable voxl-qvio-server` command. In a terminal instance, run: 1. `voxl-px4-hitl` This will start px4 to run in HITL mode and as long as the ftdi cable connection is connected to J8 on the voxl2 mavlink packets will be transferred between the gazebo simulator and PX4. To verify that HITL is working properly you can query the status of the HITL driver with the command `qshell dsp_hitl status`. You should see output like the following: ``` pxh> qshell dsp_hitl status INFO [qshell] Send cmd: 'dsp_hitl status' INFO [muorb] SLPI: Marking DeviceNode(qshell_req) as advertised in process_remote_topic INFO [muorb] SLPI: qshell gotten: dsp_hitl status INFO [muorb] SLPI: arg0 = 'dsp_hitl' INFO [muorb] SLPI: arg1 = 'status' INFO [muorb] SLPI: Running: yes INFO [muorb] SLPI: Status of IMU_Data counter: 1773 INFO [muorb] SLPI: Value of current accel x, y, z data: -0.256672, 0.150797, -9.858628 INFO [muorb] SLPI: Value of current gyro x, y, z data: -0.006096, -0.000621, 0.000415 INFO [muorb] SLPI: Value of HIL_Sensor counter: 1765 INFO [muorb] SLPI: Value of Heartbeat counter: 8 INFO [muorb] SLPI: Value of Vision data counter: 0 INFO [muorb] SLPI: Value of GPS Data counter: 44 INFO [muorb] SLPI: Ok executing command: dsp_hitl status INFO [qshell] qshell return value timestamp: 38659532, local time: 38667163 ``` You should see the IMU_Data, HIL_Sensor, Heartbeat, and GPS Data counters increasing each time you run the command. To run a simple flight to test operation use the following commands: 1. `qshell commander arm` 2. `qshell commander takeoff` 3. `qshell commander land` ### Flying the drone with a radio control To use an actual RC transmitter to fly the drone in HITL it is necessary to enable the required RC driver in PX4 and change a parameter to indicate that you want to use the RC. For example, on Starling the command to start the RC driver is `qshell crsf_rc start -d 7`. This command will be different depending on what type of RC unit you have installed. In addition to starting the RC driver it is necessary to change the parameter COM_RC_IN_MODE to 0. You also need to make sure that px4 is in the proper flight mode (For example position control or manual): ``` pxh> qshell commander mode posctl pxh> param set COM_RC_IN_MODE 0 + COM_RC_IN_MODE: curr: 1 -> new: 0 pxh> qshell crsf_rc start -d 7 ``` Then arm the drone with `qshell commander arm` and fly the drone with the RC transmitter. ### Running a mission from QGroundControl (QGC) 1. Open QGC on the parent computer running the simulation. 2. Ensure that all AutoConnect options within the QGC settings are unchecked except for "UDP". 3. Restart QGC and upon these setting changes, the VOXL2 instance of PX4 will auto connect to QGC - Note: QGC will ALWAYS need to be opened after gazebo - this is so there are no port conflicts. ![qgc-autoconnect](/images/voxl2/qgc_hitl_autoconnect.png) 4. Once connected, proceed to the top left corner of QGC, and select the Plan option within the Fly icon. 5. The user can now input a mission with an initial takeoff point, waypoints, and other options. Once satisfied with the mission, proceed to select upload option. This will push the mission to the VOXL2. ![qgc-mission-upload](/images/voxl2/qgc_mission_upload.jpg) 6. Navigate back to the original screen by selecting the Fly option in the top left of QGC, under the Plan icon. 7. Now that the mission has been uploaded, the user can select to takeoff and execute the mission by sliding the icon on the bottom of QGC to confirm/execute said mission. 8. Sit back and enjoy watching the mission be executed in the gazebo. ### Running a figure 8 via the microdds service and ROS2 1. Ensure that the following three packages have been installed on target: `voxl-ros2-foxy`, `voxl-microdds-agent`, `voxl-mpa-to-ros2` 2. Once these have been installed - enable the microdds service via `voxl-configure-microdds-agent` 3. Configure the mpa to ros2 pipeline with `voxl-configure-mpa-to-ros2`\ 4. Finally, continue with running `voxl-px4-hitl` and the dockerized gazebo environment. On another terminal window, you can now run `ros2 run voxl_offboard_figure8 voxl_offboard_figure8` and the drone will then fly in a figure via the microdds connection! ### Running pre-made mission and testing success of mission In this example MAVSDK is running on the host computer and sending Mavlink messages to PX4 over the network interface. MAVSDK can also be run locally on VOXL2. Information about how to run MAVSDK applications directly on VOXL2 are located [here](/mavsdk/) 1. Ensure earlier steps were followed and that HITL is actively running in gazebo on host computer (in headless or GUI mode) and that `voxl-px4-hitl` is running on voxl2 2. Clone the following repository to parent computer running gazebo: `https://gitlab.com/voxl-public/flight-core-px4/voxl-px4-test` 3. Plug parent computer into voxl2 on usb-c port 4. Run the mission run script via: `./upload_mission.py` which will upload and execute a predetermined mission 5. Once done, proceed to run the glean tester via: `./glean_tester.py` 6. If a successful mission was done, the glean_tester will print out a success message, otherwise it will print an assert failure # Archived instructions For those who were more comfortable with the original instructions they have been copied below for reference. However, It is not recommended to use these instructions. ## Gazebo Setup > The following requires a knowledge of how to run software in terminal/bash. ### Hardware requirements 1. FTDI Cable (USB to serial) connected to a 4-pin JST. 2. Host computer that is capable of running gazebo (Ubuntu or MacOS) 3. Voxl2 ### FTDI Cable Image ![m0052-FTDI-cable](/images/voxl2/voxl2_hitl_ftdi.png) ### Hardware setup 1. Connect the FTDI USB side to your host computer and the JST connector to the VOXL2 J18 port (https://docs.modalai.com/voxl2-connectors/#j18-uart-esc). 2. Open terminal window on parent computer and enter the following: `echo 1 | sudo tee /sys/bus/usb-serial/devices/ttyUSB0/latency_timer` - This will decrease the default latency associated with FTDI cables in order to meet the timing requirements of the simulation. > This setting will revert back to it's default when the host computer is restarted so this step will need to be completed after each restart. If wanted, place this in the ~/.bashrc or ~/.zsh file. ### Gazebo simulator setup on host computer In order to get gazebo running on the host machine, run the following: 1. `git clone https://github.com/PX4/PX4-Autopilot --recursive` 2. `cd PX4-Autopilot` 3. `./Tools/setup/ubuntu.sh` 4. Using vim or nano, open the `PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/iris_hitl/iris_hitl.sdf` and edit the `serialDevice` to `/dev/ttyUSB0` and save the file. 5. `DONT_RUN=1 make px4_sitl_default gazebo` 6. `source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default` > This is to run GPS Iris model - if you wish to run VIO - swap the `iris_hitl` model in the `hitl_iris` world, with the `iris_vision` model. ### Software setup on VOXL2 > If you are using a Voxl2 running the most recent build of PX4, the following steps do NOT need to be done. 1. `https://gitlab.com/voxl-public/voxl-sdk/services/voxl-px4` 2. Follow the instructions in the repository README above on gitlab to build px4 on a linux distro and push/download on a voxl2 ### Running the simulation and PX4 in GPS/VIO mode #### On host computer > If the user wishes to use QGC with gazebo - this must be opened AFTER gazebo has been spun up. 1. If the user wishes to use a specific GPS location, run the following in ones terminal (where XYZ represents the GPS coord): a. `export PX4_HOME_LAT=XYZ`
b. `export PX4_HOME_LON=XYZ`
c. `export PX4_HOME_ALT=XYZ`
2. `gazebo Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/hitl_iris.world` #### On Voxl2 > The following commands are done on the voxl2 shell via adb or ssh. In an terminal instance, run: 1. voxl-px4-hitl This will boot up px4 to run in HITL and as long as the ftdi cable connection is connected to J8 on the voxl2, mavlink packets are being sent to and from. If the user wishes to run some commands from px4-shell, you can run things such as: 1. qshell commander arm
2. qshell commander takeoff
3. qshell commander disarm
4. qshell commander mode posctl
### Running a mission from QGroundControl (QGC) 1. Open QGC on the parent computer running the simulation. 2. Ensure that all AutoConnect options within the QGC settings are unchecked except for "UDP". 3. Restart QGC and upon these setting changes, the VOXL2 instance of PX4 will auto connect to QGC - Note: QGC will ALWAYS need to be opened after gazebo - this is so there are no port conflicts. ![qgc-autoconnect](/images/voxl2/qgc_hitl_autoconnect.png) 4. Once connected, proceed to the top left corner of QGC, and select the Plan option within the Fly icon. 5. The user can now input a mission with an initial takeoff point, waypoints, and other options. Once satisfied with the mission, proceed to select upload option. This will push the mission to the VOXL2. ![qgc-mission-upload](/images/voxl2/qgc_mission_upload.jpg) 6. Navigate back to the original screen by selecting the Fly option in the top left of QGC, under the Plan icon. 7. Now that the mission has been uploaded, the user can select to takeoff and execute the mission by sliding the icon on the bottom of QGC to confirm/execute said mission. 8. Sit back and enjoy watching the mission be executed in the gazebo. --- Source: https://docs.modalai.com/m0197-fpv-hil/ # M0197-FPV Hardware-in-the-Loop Simulation --- # Overview Hardware-in-the-loop (HITL) simulation enables full-fidelity testing of the PX4 flight stack running on the VOXL2 DSP while the vehicle dynamics are simulated in Gazebo Sim on a host PC. Unlike software-in-the-loop (SITL), HITL exercises the real firmware, real sensor drivers, real EKF2 implementation, and real cross-processor communication paths — providing the highest fidelity simulation short of actual flight. This document covers the MUORB-based HITL architecture introduced for the M0197-FPV platform, which replaces the legacy FTDI serial approach with UDP-over-USB-Ethernet. **Key advantage**: The DSP runs the real flight stack (sensors, EKF2, controllers, commander) exactly as it does in flight. Only the sensor drivers are swapped for HITL shims that receive simulated data from the apps processor via MUORB. The full VOXL2/M0197 software stack is active during HITL — you get the same MPA pipes, mavlink-server telemetry, and VIO integration paths as in real flight. ## Key Differences from Legacy HITL | Feature | Legacy (FTDI Serial) | Current (UDP-over-USB) | |---|---|---| | Physical connection | FTDI cable to VOXL2 J18 UART | USB-C cable (power + network) | | Bandwidth | ~921600 baud (shared with debug console) | Full USB-Ethernet (~100 Mbps) | | Sensor data routing | Direct UART to DSP | Apps proc MAVLink -> MUORB -> DSP | | Apps proc services | Bypassed entirely | Fully active (MPA pipes, mavlink-server, VIO) | | VFC support | possible* | Native (via voxl-hitl-vio-server + voxl-vision-hub) | | FTDI latency tuning | Required (`latency_timer` sysfs hack) | Not needed | --- # Sample Repository Structure ``` ROOT_DIR/ ├── px4-gz-jetty-plugins/ # Gazebo plugins: MAVLink HITL bridge + Trajectory RC │ ├── src/ # Plugin source (mavlink_hitl_gazebosim, trajectory_rc) │ ├── worlds/ # Gazebo world files for HITL │ │ ├── hitl_x500.sdf # X500 quad HITL world │ │ └── hitl_x500_trajectory.sdf # X500 world with trajectory RC automation │ └── scripts/ │ └── hitl-gz-start.sh # Launch script for host PC ├── voxl-hitl-vio-server/ # Target-side: receives ODOMETRY UDP, writes MPA pipe ├── voxl-fpv-px4/ # PX4 firmware wrapper (submodule: px4-firmware) └── px4-firmware/ # PX4 with HITL startup scripts, dsp_hitl driver, x500_voxl model ``` --- # System Architecture The HITL system spans three execution domains: the host PC running Gazebo Sim, the M0197/VOXL2 apps processor (Linux), and the M0197/VOXL2 DSP (Qualcomm SLPI). All inter-device communication uses UDP over the USB-Ethernet link. ![HITL System Architecture](/images/fpv/m0197-fpv-hil/hitl_system_architecture.svg) ## Data Flow Summary ### Sensor Path (Host -> VOXL2/M0197 DSP) 1. **Gazebo Sim** generates simulated sensor readings (IMU at 250 Hz, magnetometer at 50 Hz, barometer at 10 Hz, GPS at 30 Hz) from the `x500_voxl` vehicle model 2. **mavlink_hitl_gazebosim** plugin packs sensor data into MAVLink `HIL_SENSOR` and `HIL_GPS` messages, performing ENU/FLU-to-NED/FRD frame rotation at the boundary 3. Messages are sent via **UDP port 14560** over the USB-Ethernet link to the VOXL2/M0197 apps processor 4. **MavlinkReceiver** (apps proc) decodes HIL messages and publishes two rate-decoupled uORB topics: - `hil_sensor_imu` at 250 Hz — accelerometer (m/s^2) + gyroscope (rad/s) in body FRD frame - `hil_sensor_mag_baro` at 100 Hz — magnetometer (Gauss) + barometer (Pa) with `fields_updated` bitmask 5. **MUORB** transparently transports these topics from apps proc to DSP 6. **dsp_hitl** driver (DSP) subscribes to both topics and republishes them as native PX4 sensor topics (`sensor_accel`, `sensor_gyro`, `sensor_mag`, `sensor_baro`) with fresh DSP timestamps 7. **VehicleIMU**, **EKF2**, and downstream controllers consume the sensor data identically to real flight ### Actuator Path (VOXL2/M0197 DSP -> Host) 1. PX4 **control allocator** on DSP computes motor commands and publishes `actuator_outputs` 2. **HIL_ACTUATOR_CONTROLS** MAVLink stream (200 Hz) sends motor commands back to the host via UDP port 14560 3. **mavlink_hitl_gazebosim** plugin converts normalized motor commands to rotor velocities and applies them to the Gazebo `MulticopterMotorModel` joints ### VIO Path (Host -> VOXL2/M0197 Apps Proc) 1. Gazebo **SceneBroadcaster** publishes ground-truth vehicle pose 2. **mavlink_hitl_gazebosim** plugin converts the pose to a MAVLink `ODOMETRY` message (NED/FRD frame, 250 Hz) 3. Messages are sent via **UDP port 14570** to the VOXL2/M0197 apps processor 4. **voxl-hitl-vio-server** (apps proc) decodes the ODOMETRY message and publishes pose data to MPA pipe `hitl_vio` 5. **voxl-vision-hub** (with `en_hitl=true`) consumes the pipe and runs its VFC control loop, sending `SET_ATTITUDE_TARGET` commands to PX4 ## Data Flow Rates | Data Path | Gz Sim | MAVLink Plugin | UDP Transport | MavlinkReceiver | MUORB | dsp_hitl (DSP) | PX4 Flight Stack | |---|---|---|---|---|---|---|---| | IMU (accel + gyro) | 250 Hz | 250 Hz | 250 Hz | 250 Hz | 250 Hz | 250 Hz | 250 Hz | | Magnetometer | 50 Hz | 50 Hz | 50 Hz | 100 Hz (batched) | 100 Hz | 50 Hz | 50 Hz | | Barometer | 10 Hz | 10 Hz | 10 Hz | 100 Hz (batched) | 100 Hz | 10 Hz | 10 Hz | | GPS | 30 Hz | 30 Hz | 30 Hz | 30 Hz | — | 30 Hz | 30 Hz | | Actuators (return) | — | — | 200 Hz | 200 Hz | — | 200 Hz | 200 Hz | | VIO (ODOMETRY) | — | 250 Hz | 250 Hz | — (to vio-server) | — | — | — (to VFC) | **Notes**: - IMU: 4 ms publish interval (`HIL_IMU_PUBLISH_INTERVAL_US = 4000`) - MAG/BARO: 10 ms publish interval, `fields_updated` bitmask tracks which fields are new - dsp_hitl polls at 250 Hz (4 ms usleep), republishes with fresh DSP timestamps - `HIL_ACTUATOR_CONTROLS`: `flags=0x0F` for quad (motors 0-3) --- # Component Architecture ![HITL Component Architecture](/images/fpv/m0197-fpv-hil/hitl_component_architecture.svg) ## Host-Side Components ### Gazebo Sim (gz-sim 10 / Jetty) The simulator runs with a 4 ms physics step (250 Hz real-time update rate) using the ODE physics engine. The world file loads the following system plugins: | Plugin | Purpose | |---|---| | `gz-sim-physics-system` | ODE physics at 250 Hz | | `gz-sim-imu-system` | Accelerometer + gyroscope | | `gz-sim-air-pressure-system` | Barometric pressure | | `gz-sim-magnetometer-system` | Magnetic field (body frame FLU, `use_earth_frame_ned=false`) | | `gz-sim-navsat-system` | GPS (spherical coordinates) | | `gz-sim-scene-broadcaster-system` | Ground-truth pose for VIO | ### x500_voxl Vehicle Model A standalone SDF model derived from the PX4 x500 quadcopter. Includes all sensors on `base_link` (IMU, barometer, magnetometer, NavSat) and four `MulticopterMotorModel` plugins for rotor dynamics. ### mavlink_hitl_gazebosim Plugin The core HITL bridge plugin. Subscribes to Gz Sim sensor topics, converts frames (ENU/FLU -> NED/FRD), packs MAVLink messages, and sends them to the VOXL2/M0197 over UDP. **Sensor data flow (Gz Sim -> PX4):** | MAVLink Message | Contents | Source Gz Topic | |---|---|---| | `HIL_SENSOR` | IMU (accel + gyro in FRD), magnetometer, barometer | IMU, air_pressure, magnetometer sensors | | `HIL_GPS` | GPS fix (lat/lon/alt, velocity, CoG) | NavSat sensor | | `ODOMETRY` (optional) | VIO pose in NED/FRD for EKF2 external vision fusion | `/pose/info` (SceneBroadcaster) | **Actuator data flow (PX4 -> Gz Sim):** | MAVLink Message | Description | |---|---| | `HIL_ACTUATOR_CONTROLS` | Motor commands from PX4's control allocator, converted to rotor velocities and applied to `MulticopterMotorModel` joints | **Plugin configuration** (via SDF `` parameters): | Parameter | Default | Description | |---|---|---| | `mavlink_addr` | `INADDR_ANY` | VOXL2/M0197 IP address (e.g. the USB-Ethernet IP) | | `mavlink_udp_remote_port` | `14560` | UDP port for HIL messages to PX4 | | `mavlink_udp_local_port` | `0` | Local bind port (0 = ephemeral) | | `serialEnabled` | `false` | Legacy serial FTDI mode (not needed) | | `enable_lockstep` | `false` | Simulation lockstep with PX4 | | `en_vio_output` | `false` | Enable ODOMETRY output for VIO fusion | | `vio_mavlink_addr` | `INADDR_ANY` | Target IP for VIO messages | | `vio_udp_remote_port` | `14570` | UDP port for VIO ODOMETRY messages | | `vio_update_rate` | `250` | VIO output rate in Hz | | `protocol_version` | `2.0` | MAVLink protocol version | ### trajectory_rc_gazebosim Plugin (Optional) A test automation plugin that flies pre-defined trajectories by sending `RC_CHANNELS_OVERRIDE` MAVLink messages to PX4. State machine: `INIT -> ARM -> TAKEOFF -> TRAJECTORY -> HOLD -> LAND -> DISARM -> DONE`. Trajectory format: JSON file with timestamped waypoints in ENU coordinates: ```json { "waypoints": [ {"t": 0, "x": 0, "y": 0, "z": 2.0, "yaw": 0}, {"t": 10, "x": 5, "y": 0, "z": 2.0, "yaw": 0}, {"t": 20, "x": 5, "y": 5, "z": 3.0, "yaw": 1.57} ] } ``` The plugin interpolates between waypoints, computes position error, and maps desired velocity to RC stick values via a P-controller. Supports `velocity` (position control) and `attitude` (manual/stabilized) control modes. ## Target-Side Components (Apps Processor) ### MavlinkReceiver The PX4 MAVLink receiver running on the apps processor. VOXL2-specific code (gated by `#if PX4_SOC_ARCH_ID == PX4_SOC_ARCH_ID_VOXL2`) handles the HIL sensor bridging: - Decodes `HIL_SENSOR` messages and splits into two rate-decoupled uORB topics - Publishes a simulated battery status (16.8V, 5.0A, 100%) at 10 Hz - Bridges `HIL_GPS` to the standard `sensor_gps` topic ### voxl-hitl-vio-server A standalone service that receives MAVLink `ODOMETRY` messages on UDP port 14570, extracts pose/velocity/covariance data, and publishes to MPA pipes `hitl_vio` and `hitl_vio_extended`. The pipe name `hitl_vio` (instead of `qvio`) avoids conflict with the real `voxl-qvio-server` and matches what `voxl-vision-hub` expects when `en_hitl=true`. **Data extracted from ODOMETRY:** - Position (x, y, z) - Orientation (quaternion -> rotation matrix) - Linear velocity (vx, vy, vz) - Angular velocity (rollspeed, pitchspeed, yawspeed) - Pose and velocity covariance diagonals **Configuration** (`/etc/modalai/voxl-hitl-vio-server.conf`): | Parameter | Default | Description | |---|---|---| | `receiver_ip` | `0.0.0.0` | Bind address for UDP socket (0.0.0.0 = all interfaces) | | `receiver_port` | `14570` | UDP port to listen on (14570 avoids conflict with primary HIL port 14560) | ### voxl-vision-hub When configured with `en_hitl=true`, the vision hub subscribes to the `hitl_vio` MPA pipe (instead of `qvio`) and runs its VFC (Vision Flight Controller) control loop during simulation. **Configuration** (`/etc/modalai/voxl-vision-hub.conf`): ```json { "en_vio": false, "vio_pipe": "qvio", "en_hitl": true, "offboard_mode": "vfc" } ``` - `en_hitl: true` — activates the HITL VIO path in state_manager (subscribes to `hitl_vio` pipe) - `offboard_mode: "vfc"` — enables the VFC offboard controller ## Target-Side Components (DSP / SLPI) ### dsp_hitl Driver The DSP-side HITL shim driver. Polls at 250 Hz for incoming `hil_sensor_imu` and `hil_sensor_mag_baro` topics via MUORB and republishes them as native sensor topics with fresh DSP timestamps. | Subscribed Topic | Published Topics | Rate | |---|---|---| | `hil_sensor_imu` | `sensor_accel`, `sensor_gyro` | 250 Hz | | `hil_sensor_mag_baro` (FIELD_MAG) | `sensor_mag` | 50 Hz | | `hil_sensor_mag_baro` (FIELD_BARO) | `sensor_baro` | 10 Hz | **Device IDs** (must match calibration parameters): | Sensor | Device ID | Device Type | |---|---|---| | Accelerometer / Gyroscope | 1310988 | `DRV_IMU_DEVTYPE_SIM` | | Magnetometer | 197388 | `DRV_MAG_DEVTYPE_MAGSIM` | | Barometer | 6620172 | `DRV_BARO_DEVTYPE_BAROSIM` | ### PX4 Flight Stack The standard PX4 flight stack runs on the DSP: `sensors -> EKF2 -> mc_pos_control -> mc_att_control -> mc_rate_control -> control_allocator`. The DSP has no awareness that sensor data originates from simulation. --- # uORB Message Definitions Two custom uORB messages transport HIL sensor data from the apps processor to the DSP via MUORB. ## HilSensorImu ``` uint64 timestamp # time since system start (microseconds) float32[3] accelerometer_m_s2 # acceleration in body FRD frame (m/s^2) float32[3] gyroscope_rad_s # angular velocity in body FRD frame (rad/s) float32 temperature # temperature (Celsius) ``` ## HilSensorMagBaro ``` uint64 timestamp # time since system start (microseconds) float32[3] magnetometer_ga # magnetic field in body FRD frame (Gauss) float32 pressure_pa # absolute pressure (Pa) float32 temperature # temperature (Celsius) uint8 fields_updated # bitmask: bit 0 = mag, bit 1 = baro uint8 FIELD_MAG = 1 uint8 FIELD_BARO = 2 ``` These messages are conditionally compiled: ModalAI boards include `HilSensorImu.msg` and `HilSensorMagBaro.msg` while removing `OrbTestMedium.msg` to stay within the uint8_t ORB_ID enum limit (256 topics). --- # Startup Sequence The HITL startup order is critical. MAVLink must be running before `dsp_hitl` starts, and `dsp_hitl` must be running before the sensors module starts. ![HITL Startup Sequence](/images/fpv/m0197-fpv-hil/hitl_startup_sequence.svg) ## Start Script (under the hood flow) ``` 1. Platform detection (M0052 / M0054 / M0104 / M0197) 2. Load HITL default parameters (if first boot) 3. Start apps-proc modules: dataman, navigator, load_mon 4. Start MAVLink instances: ├─ Primary (UDP 14560/14550) — HITL link to Gazebo ├─ Secondary (UDP 14556/14557) — voxl-mavlink-server └─ Tertiary (UDP 14558/14559) — GCS forwarding 5. Start dsp_hitl on DSP: qshell dsp_hitl start 6. Wait 1 second (allow MUORB subscriptions to establish) 7. Start sensors on DSP: qshell sensors start -h 8. Start flight stack on DSP: ekf2, controllers, commander 9. Configure MAVLink streams: ├─ HIL_ACTUATOR_CONTROLS at 200 Hz (to Gazebo) ├─ Disable HIGHRES_IMU, SCALED_IMU (reduce MUORB load) └─ Low-rate telemetry: ATTITUDE 10 Hz, GLOBAL_POSITION_INT 5 Hz ``` --- # Network Configuration All communication uses UDP over the USB-Ethernet link between the host PC and VOXL2/M0197. No FTDI cable is required. ## Port Allocation | Port | Direction | Protocol | Purpose | |---|---|---|---| | 14560 | Host -> VOXL2/M0197 | MAVLink v2 | HIL_SENSOR, HIL_GPS | | 14560 | VOXL2/M0197 -> Host | MAVLink v2 | HIL_ACTUATOR_CONTROLS (200 Hz) | | 14570 | Host -> VOXL2/M0197 | MAVLink v2 | ODOMETRY / VIO pose (250 Hz) | | 14556 | VOXL2/M0197 localhost | MAVLink v2 | voxl-mavlink-server (onboard) | | 14558 | VOXL2/M0197 localhost | MAVLink v2 | GCS forwarding | ## Connection Methods ### Option A: ADB Port Forwarding ```bash adb forward tcp:14560 tcp:14560 adb forward tcp:14570 tcp:14570 ``` Set `VOXL2_USB_IP` in world SDF to `127.0.0.1`. The `hitl-gz-start.sh` script handles this automatically. ### Option B: Direct USB-Ethernet IP ```bash # On VOXL2, find USB network IP: adb shell ifconfig # Default VOXL2 USB IP is usually 192.168.101.2 on HOST SIDE ``` Set `VOXL2_USB_IP` in world SDF to the discovered IP. --- # HITL Default Parameters The HITL parameter configuration (`voxl-px4-hitl-set-default-parameters.config`) sets PX4 parameters optimized for simulation. Key categories: ## System | Parameter | Value | Purpose | |---|---|---| | `SYS_AUTOSTART` | 1001 | Generic quadcopter airframe | | `SYS_HITL` | 1 | Enable HITL mode globally | | `IMU_GYRO_RATEMAX` | 800 | High IMU processing rate | ## Sensor Calibration All calibration offsets are zero and scales are 1.0 (identity) since simulated sensors produce ideal data. Device IDs must match the `dsp_hitl` driver: | Parameter | Value | Matches | |---|---|---| | `CAL_ACC0_ID` | 1310988 | `DRV_IMU_DEVTYPE_SIM` | | `CAL_GYRO0_ID` | 1310988 | `DRV_IMU_DEVTYPE_SIM` | | `CAL_MAG0_ID` | 197388 | `DRV_MAG_DEVTYPE_MAGSIM` | ## EKF2 | Parameter | Value | Purpose | |---|---|---| | `EKF2_GPS_CHECK` | 0 | Disable GPS quality gates | | `EKF2_HGT_REF` | 1 | GPS as height reference | | `EKF2_MAG_TYPE` | 1 | Heading-only mag fusion | | `EKF2_MAG_CHECK` | 0 | Disable mag strength validation | | `EKF2_BARO_CTRL` | 1 | Enable barometer fusion | | `EKF2_GPS_CTRL` | 7 | Full GPS fusion (lon/lat/alt/vel) | ## Arming (Relaxed for Simulation) | Parameter | Value | Purpose | |---|---|---| | `CBRK_SUPPLY_CHK` | 894281 | Bypass supply voltage check | | `CBRK_IO_SAFETY` | 22027 | Bypass IO safety switch | | `COM_ARM_MAG_STR` | 0 | Disable mag strength gate | | `COM_ARM_EKF_POS` | 1.0 | Relaxed EKF position threshold | | `COM_ARM_EKF_VEL` | 1.0 | Relaxed EKF velocity threshold | ## Control Allocation (X500 Geometry) The rotor positions match the physical x500 frame at +/-0.174m offset: | Motor | Position (X, Y) | Direction | KM | |---|---|---|---| | 0 (Front-Right) | +0.174, +0.174 | CCW | +0.05 | | 1 (Back-Left) | -0.174, -0.174 | CCW | +0.05 | | 2 (Front-Left) | +0.174, -0.174 | CW | -0.05 | | 3 (Back-Right) | -0.174, +0.174 | CW | -0.05 | --- # Quick Start Guide ## Prerequisites ### Host PC - Ubuntu 24.04 - Gazebo Jetty (gz-sim 10): `sudo apt install gz-jetty` - MAVLink v2 C headers installed to `/usr/include/mavlink/` - USB cable to VOXL2/M0197 ### VOXL2/M0197 - Latest SDK (1.6.2 or newer recommended) - `voxl-fpv-px4` built with HITL support - `voxl-hitl-vio-server` installed (if using VFC) ## Step-by-Step ### 1. Install Gazebo Jetty (Host) Follow the official install guide at [https://gazebosim.org/docs/jetty/install_ubuntu/](https://gazebosim.org/docs/jetty/install_ubuntu/) or: ```bash sudo apt-get update sudo apt-get install curl lsb-release gnupg sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] https://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null sudo apt-get update sudo apt-get install gz-jetty ``` ### 2. Install Build Dependencies (Host) ```bash sudo apt-get install \ build-essential \ cmake \ libboost-system-dev \ libboost-thread-dev \ libboost-filesystem-dev \ libeigen3-dev \ libprotobuf-dev \ protobuf-compiler \ libgz-sim-dev \ libgz-plugin-dev \ libgz-sensors-dev \ libgz-msgs-dev \ libgz-cmake3-dev ``` ### 3. Install MAVLink C Headers (Host) ```bash # Clone MAVLink with pymavlink submodule git clone https://github.com/mavlink/mavlink.git --recursive # Install pymavlink dependencies pip3 install --break-system-packages -r mavlink/pymavlink/requirements.txt # Generate C headers for the development dialect cd mavlink python3 -m pymavlink.tools.mavgen \ --lang=C \ --wire-protocol=2.0 \ --output=generated/include/mavlink/v2.0 \ message_definitions/v1.0/development.xml # (OPTIONAL) Install system-wide sudo cp -r generated/include/mavlink /usr/include/ cd .. ``` Verify: `ls /usr/include/mavlink/v2.0/common/mavlink.h` ### 4. Build Gazebo Plugins (Host) ```bash cd px4-gz-jetty-plugins mkdir -p build && cd build cmake .. make -j$(nproc) ``` This produces `build/libmavlink_hitl_gazebosim.so` and `build/libtrajectory_rc_gazebosim.so`. Or via Docker: ```bash docker build -t px4-gz-jetty-plugins . docker create --name tmp px4-gz-jetty-plugins docker cp tmp:/artifacts/. ./build/ docker rm tmp ``` ### 5. Build and Deploy voxl-hitl-vio-server (Target) ```bash cd voxl-hitl-vio-server voxl-docker -i voxl-cross # Inside docker: ./install_build_deps.sh $BOARD_SOC dev ./build.sh $BOARD_SOC ./make_package.sh exit # RUN THE FOLLOWING OUTSIDE OF THE DOCKER CONTAINER --(DEPENDING ON PERMISSIONS) ./deploy_to_voxl.sh ``` ### 6. Build and Deploy voxl-fpv-px4 (Target) ```bash cd voxl-fpv-px4 ./run_docker.sh ./build.sh ./make_package.sh # RUN THE FOLLOWING OUTSIDE OF THE DOCKER CONTAINER --(DEPENDING ON PERMISSIONS) ./deploy_to_voxl.sh ``` ### 7. Configure VOXL2/M0197 Services On the VOXL2/M0197, configure `voxl-hitl-vio-server` (`/etc/modalai/voxl-hitl-vio-server.conf`): ```json { "receiver_ip": "0.0.0.0", "receiver_port": 14570 } ``` Configure `voxl-vision-hub` (`/etc/modalai/voxl-vision-hub.conf`): ```json { "en_vio": false, "vio_pipe": "qvio", "en_hitl": true, "offboard_mode": "vfc" } ``` ### 8. Connect VOXL2/M0197 Connect the VOXL2/M0197 via USB-C. Verify connectivity: ```bash ping 192.168.101.2 # or use ADB: adb devices ``` ### 9. Start PX4 HITL on VOXL2/M0197 ```bash # Terminal 1 adb shell voxl-px4-hitl start # Terminal 2 # Start VIO server and vision hub adb shell systemctl start voxl-hitl-vio-server systemctl start voxl-vision-hub ``` ### 10. Launch Gazebo on Host ```bash cd px4-gz-jetty-plugins # With ADB port forwarding (default, VOXL2/M0197 connected via USB) ./scripts/hitl-gz-start.sh # With direct USB network IP ./scripts/hitl-gz-start.sh -i 192.168.101.2 # With trajectory automation ./scripts/hitl-gz-start.sh -i 192.168.101.2 -t /path/to/trajectory.json ``` The script: - Sets `GZ_SIM_SYSTEM_PLUGIN_PATH` to the plugin build directory - Sets `GZ_SIM_RESOURCE_PATH` to include PX4 vehicle models (x500_voxl) - Substitutes the VOXL2/M0197 IP into the world file's `VOXL2_USB_IP` placeholder - Sets up `adb forward tcp:14570 tcp:14570` if using localhost - Launches `gz sim` with the HITL world Or manually: ```bash export GZ_SIM_SYSTEM_PLUGIN_PATH=/path/to/px4-gz-jetty-plugins/build export GZ_SIM_RESOURCE_PATH=/path/to/voxl-fpv-px4/px4-firmware/Tools/simulation/gz/models gz sim worlds/hitl_x500.sdf -v 4 ``` ### 11. Verify On the VOXL2/M0197 PX4 shell after the startup HIL script runs: ```bash px4> qshell dsp_hitl status ``` Expected output showing incrementing counters: ``` Running: yes === IMU Section === HIL sensor_imu received: 12453 IMU updates published: 12450 Current accel (x,y,z): -0.257, 0.151, -9.859 Current gyro (x,y,z): -0.006, -0.001, 0.000 === MAG/BARO Section === HIL sensor_mag_baro received: 4980 MAG updates published: 4975 BARO updates published: 995 ``` Verify VIO data: (Regular VOXL shell) ```bash voxl-inspect-pipes # Look for "hitl_vio" pipe with data voxl-inspect-vio hitl_vio ``` ### 12. Test Flight (PX4 shell) ```bash px4> qshell commander arm px4> qshell commander takeoff # Observe vehicle in Gazebo px4> qshell commander land ``` --- # Verification ## Phase 1: Host-side only (no VOXL2 needed) ```bash # Terminal 1: start gz-sim cd px4-gz-jetty-plugins ./scripts/hitl-gz-start.sh # Terminal 2: listen for ODOMETRY on port 14570 python3 -c " import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('0.0.0.0', 14570)) while True: data, addr = sock.recvfrom(1024) print(f'Received {len(data)} bytes from {addr}') " ``` You should see packets arriving at ~250 Hz. ## Phase 2: Target-side pipeline 1. Start `voxl-hitl-vio-server` on VOXL2 2. Send ODOMETRY from host via gz-sim 3. Verify `hitl_vio` MPA pipe has data: `voxl-inspect-pipes` on VOXL2 ## Phase 3: Full closed-loop 1. Start PX4 HITL on VOXL2 (`voxl-px4-hitl start`) 2. Start gz-sim on host (`hitl-gz-start.sh`) 3. Verify VFC engages when RC channels are in range 4. Test position hold — drone should hover stably --- # Gazebo Version Compatibility This plugin stack is configured for **Gazebo Jetty** (gz-sim 10.x). The CMakeLists.txt uses unversioned cmake package names (`gz-sim`, `gz-plugin`, `gz-sensors`), which is the convention for Gazebo Jetty/Ionic. For older Gazebo versions, update `px4-gz-jetty-plugins/CMakeLists.txt`: | Gazebo Version | gz-sim | gz-plugin | gz-sensors | gz-msgs | |---|---|---|---|---| | Garden | gz-sim7 | gz-plugin2 | gz-sensors7 | gz-msgs9 | | Harmonic | gz-sim8 | gz-plugin2 | gz-sensors8 | gz-msgs10 | | Ionic | gz-sim9 | gz-plugin3 | gz-sensors9 | gz-msgs11 | | Jetty | gz-sim (10) | gz-plugin (4) | gz-sensors (10) | gz-msgs (12) | For versioned releases (Garden/Harmonic/Ionic), use versioned `find_package()` calls and target names (e.g., `gz-sim8::gz-sim8`). --- # Headless / Remote Operation Gz Sim can run fully headless for CI/automated testing: ```bash gz sim -s -r # server-only, no GUI, start running ``` --- # Troubleshooting ## Vehicle does not arm - Verify `dsp_hitl status` shows increasing counters - Check EKF2 is fusing: `listener estimator_status` on PX4 shell - Ensure sensor device IDs match calibration parameters - Check `commander status` for preflight check failures ## No sensor data received - Verify Gazebo is running and not paused (WorldControl widget) - Check UDP connectivity: `netstat -un | grep 14560` - Verify MAVLink instance is running: `mavlink status` on PX4 shell - Ensure `hitl-gz-start.sh` resolved the correct VOXL2 IP ## Motors not spinning in Gazebo - Verify `HIL_ACTUATOR_CONTROLS` stream is configured at 200 Hz - Check `msg.flags = 0x0F` is set (VOXL2 quad bitmask) - Ensure the x500_voxl model does not have `` tags in motor plugins ## VIO not working - Verify `voxl-hitl-vio-server` is running: `systemctl status voxl-hitl-vio-server` - Check MPA pipe: `voxl-inspect-pipes` should show `hitl_vio` - Verify `voxl-vision-hub` has `en_hitl=true` in config ## HIL Params not updating - Remove HIL params on /data/px4/param directory - **(Caution)** ```bash cd /data/px4/param && rm hitl* # Now run again voxl-px4-hitl ``` --- # References - [PX4 HITL Documentation](https://docs.px4.io/main/en/simulation/hitl.html) - [Gazebo Sim Documentation](https://gazebosim.org/docs/jetty) - [ModalAI VOXL2 Documentation](/voxl-2/) - [VOXL PX4 System Architecture](/voxl-px4/) --- Source: https://docs.modalai.com/px4-sih/ # PX4 Simulation in Hardware (SIH) --- # Introduction Simulation in Hardware (SIH) is a lightweight, self-contained flight simulation that runs entirely on the flight controller. Unlike [HITL](/voxl2-PX4-hitl/) which requires an external host PC running Gazebo, SIH uses a built-in rigid body dynamics model to generate simulated sensor data directly on the board. No external simulator, cables, or network connection are needed. SIH is useful for quick validation of flight logic, controller tuning, and parameter testing without needing to set up a full Gazebo simulation environment. The full PX4 flight stack (EKF2, controllers, commander) runs exactly as it does in real flight — only the sensor drivers are replaced by the physics model. Please refer to the official PX4 documentation for more details: [https://docs.px4.io/main/en/sim_sih/](https://docs.px4.io/main/en/sim_sih/) ## SIH vs. HITL vs. SITL | Feature | SIH | HITL | SITL | |---|---|---|---| | **Where simulation runs** | On the flight controller | External host PC (Gazebo) | Host PC (no flight controller) | | **Hardware required** | Flight controller only | Flight controller + host PC + USB/FTDI | Host PC only | | **PX4 execution** | Real firmware on real hardware | Real firmware on real hardware | Compiled natively on host | | **Sensor fidelity** | Simplified physics model | High-fidelity Gazebo sensors | High-fidelity Gazebo sensors | | **Visual output** | None (telemetry only) | Gazebo 3D rendering | Gazebo 3D rendering | | **Setup complexity** | Minimal | Moderate | Moderate | | **Best for** | Controller tuning, quick validation | Full system testing with VIO/camera | Algorithm dev on host | --- # Starting SIH on VOXL Boards On VOXL platforms, SIH is started using the `-S` (uppercase) flag on the `voxl-px4` script: ```bash voxl-px4 -S ``` This is analogous to how HITL is started with `voxl-px4 -s` (lowercase). The `-S` flag launches PX4 with the SIH-specific startup script (`voxl-px4-sih-start`). ## Startup Sequence When `voxl-px4 -S` is invoked, the following happens: 1. **Default parameters** are loaded from `/etc/modalai/voxl-px4-sih-set-default-parameters.config` (on first run) or from the saved parameter file at `/data/px4/param/sih_parameters` (on subsequent runs) 2. **Simulated sensor drivers** start on the DSP via `qshell`: - `simulator_sih` — the core physics simulation - `sensor_baro_sim` — simulated barometer - `sensor_gps_sim` — simulated GPS - `sensor_mag_sim` — simulated magnetometer - `pwm_out_sim` — simulated PWM output 3. **Flight stack modules** start on DSP: - `sensors`, `ekf2` - `mc_pos_control`, `mc_att_control`, `mc_rate_control` - `mc_hover_thrust_estimator`, `mc_autotune_attitude_control` - `land_detector`, `manual_control`, `control_allocator`, `rc_update` - `commander`, `flight_mode_manager` 4. **Apps processor modules** start: - `dataman`, `navigator` - `vehicle_air_data_bridge`, `sensor_baro_bridge`, `vehicle_local_position_bridge` - `sih_vio_bridge` — bridges SIH ground truth for VIO consumers 5. **ROS 2 interface** starts via `uxrce_dds_client` (UDP on port 8888) 6. **MAVLink** links start: - Onboard fast link on UDP 14556/14557 for `voxl-mavlink-server` - Normal link on UDP 14558/14559 for GCS forwarding - Visualization stream on UDP 14560 with `HIL_STATE_QUATERNION` at 200 Hz (for jMAVSim or other external viewers) 7. **Logger** starts based on the `SDLOG_MODE` parameter > Unlike the upstream PX4 `rcS`-based boot (which uses `SYS_HITL=2` and airframe files like `1100_rc_quad_x_sih.hil`), VOXL boards use the `voxl-px4` wrapper script to manage the startup sequence directly. --- # Quick Start ## 1. Start SIH ```bash voxl-px4 -S ``` On first run, default SIH parameters will be written to `/data/px4/param/sih_parameters`. On subsequent runs, parameters are loaded from this file. ## 2. Verify SIH is Running Confirm the simulator and simulated sensors are publishing data: ```bash listener sensor_accel # should show updating accel data listener sensor_gyro # should show updating gyro data listener sensor_baro # should show barometer readings ``` ## 3. Connect QGroundControl Connect QGroundControl via MAVLink (through `voxl-mavlink-server`). You should see the vehicle on the map at the simulated GPS location and the attitude indicator should be active. ## 4. Arm and Fly Arm and take off via QGroundControl or the MAVLink shell: ```bash commander arm commander takeoff ``` The vehicle will take off and hover in the simulated environment. Use QGroundControl's attitude indicator, map view, and telemetry widgets for feedback since there is no 3D visual rendering. ## Optional: jMAVSim Visualization The SIH startup script configures a MAVLink visualization stream on UDP port 14560 with `HIL_STATE_QUATERNION` at 200 Hz. You can connect jMAVSim or another external viewer to this stream for a 3D visualization of the simulated vehicle. The default target IP is `192.168.101.1` — adjust this in the startup script if needed. --- # Default Parameters The SIH default parameter configuration (`voxl-px4-sih-set-default-parameters.config`) sets up the following on first run: ## Airframe and Calibration | Parameter | Value | Description | |---|---|---| | `SYS_AUTOSTART` | 4001 | Quadrotor X airframe | | `CAL_ACC0_ID` | 1310988 | Simulated accelerometer (DRV_IMU_DEVTYPE_SIM) | | `CAL_GYRO0_ID` | 1310988 | Simulated gyroscope (DRV_IMU_DEVTYPE_SIM) | | `CAL_MAG0_ID` | 197388 | Simulated magnetometer | | `MAV_TYPE` | 2 | Quadrotor | ## Control Allocation | Parameter | Value | Description | |---|---|---| | `CA_AIRFRAME` | 0 | Multicopter | | `CA_ROTOR_COUNT` | 4 | Quadrotor | | `HIL_ACT_FUNC1–4` | 101–104 | Motor function mapping for `pwm_out_sim` | ## Safety Bypasses | Parameter | Value | Purpose | |---|---|---| | `CBRK_SUPPLY_CHK` | 894281 | Bypass battery check (no real battery in SIH mode) | Parameters are saved to `/data/px4/param/sih_parameters` and persist across reboots. To reset to defaults, delete this file and restart: ```bash rm /data/px4/param/sih_parameters voxl-px4 -S ``` --- # Limitations - **No visual output** — SIH does not provide 3D rendering on its own. Use QGroundControl for telemetry feedback, or connect jMAVSim to the visualization stream on UDP 14560. Flights can also be logged and analyzed with FlightReview. - **Simplified physics** — The rigid body model does not capture complex effects like ground effect, turbulence, rotor wake interaction, or detailed aerodynamic nonlinearities. - **No camera or VIO simulation** — SIH does not generate simulated images. For VIO testing, use [HITL with Gazebo](/voxl2-PX4-hitl/). - **No environment interaction** — There are no obstacles, wind, or terrain beyond a flat ground plane. - **Single vehicle only** — One simulated vehicle per flight controller instance. --- # Troubleshooting ## Resetting parameters If parameters get into a bad state, delete the saved parameter file and restart: ```bash rm /data/px4/param/sih_parameters voxl-px4 -S ``` --- # References - [PX4 SIH Documentation](https://docs.px4.io/main/en/sim_sih/) - [VOXL2 PX4 HITL Setup](/voxl2-PX4-hitl/) — for full-fidelity simulation with Gazebo --- Source: https://docs.modalai.com/build-environments/ --- Source: https://docs.modalai.com/developing-applications/ # Applications for VOXL SDK [VOXL Developer Bootcamp](/voxl-developer-bootcamp/) is a great place to start to learn how to develop applications for [VOXL SDK](/voxl-sdk/) If you would like to skip ahead to actually building code, start with the intro to [voxl-cross](/voxl-docker-and-cross-installation/), which is the primary cross-compiling development environment for VOXL. Working example code across the SDK, from the voxl-cross-template starting point to single-file pipe readers, is cataloged on the [Example Code](/example-code/) page. --- Source: https://docs.modalai.com/example-code/ # Example Code ## Overview The VOXL SDK ships working example code at several levels, from a complete buildable package template down to single-file pipe readers. This page catalogs the examples that exist today and what each one demonstrates, so you can start from running code instead of a blank file. ## Start a New Application: voxl-cross-template [voxl-cross-template](https://gitlab.com/voxl-public/voxl-sdk/voxl-cross-template/) is the starting point for a new VOXL application. It is a complete, buildable package that reads IMU data from MPA and prints it, and it carries the standard ModalAI project structure: `clean.sh`, `build.sh`, `make_package.sh`, and `deploy_to_voxl.sh`, producing a deb you install on VOXL. The [Developer Bootcamp walkthrough](/voxl-cross-template/) covers the full workflow: cloning the template, building it inside the voxl-cross docker image, and deploying it to a VOXL. Start there, then rename and extend the template into your own package following the [packaging standards](/packaging-on-voxl/). ## MPA Pipe Basics: libmodal-pipe Examples The [libmodal-pipe examples directory](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/examples) contains minimal single-file programs for the core pipe patterns. Read these to understand servers, clients, and control pipes before writing your own: | Example | Demonstrates | |---------|--------------| | [modal-hello-server.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-server.c) | Creating a pipe server that publishes data | | [modal-hello-client.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-client.c) | Subscribing to a pipe and receiving data via callback | | [modal-hello-sink.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-sink.c) | A sink pipe that other processes can write into | | [modal-hello-pause.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-pause.c) | Pausing and resuming a subscription | | [modal-pipe-ping.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-pipe-ping.c) | Measuring pipe latency | | [modal-kill-pipe.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-kill-pipe.c) | Sending a kill signal to a pipe server | The core of a pipe client is small. Condensed from [modal-hello-client.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-client.c): ```c // called whenever the simple helper has data for us to process static void _simple_cb(int ch, char* data, int bytes, __attribute__((unused)) void* context) { printf("received %d bytes on channel %d: %s\n", bytes, ch, data); return; } int main(int argc, char* argv[]) { int flags = CLIENT_FLAG_EN_SIMPLE_HELPER; // assign callbacks for data, connection, and disconnect pipe_client_set_simple_helper_cb(CLIENT_CH, _simple_cb, NULL); pipe_client_set_connect_cb(CLIENT_CH, _connect_cb, NULL); pipe_client_set_disconnect_cb(CLIENT_CH, _disconnect_cb, NULL); // init connection to server. In auto-reconnect mode this will "succeed" // even if the server is offline, but it will connect later on automatically ret = pipe_client_open(CLIENT_CH, PIPE_NAME, CLIENT_NAME, flags, PIPE_READ_BUF_SIZE); // keep going until signal handler sets the main_running flag to 0 while(main_running) usleep(500000); pipe_client_close_all(); return 0; } ``` See [Developing in MPA](/mpa-development/) for the concepts behind these, and [libmodal-pipe](/libmodal-pipe/) for the library reference. ## Reference Clients: Reading Each Pipe Type The inspect tools are small, readable programs, most one file each, that subscribe to a specific pipe type and print it. When you need to consume a particular data stream, the matching inspect tool source is a working reference for that pipe's data format and helper functions: | Source | Reads | Docs | |--------|-------|------| | [voxl-inspect-cam.c](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam.c) | Camera frame metadata from any camera pipe | [voxl-inspect-cam](/voxl-inspect-cam/) | | [voxl-inspect-cam-ascii.cpp](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam-ascii.cpp) | Camera frames, rendered as ASCII art in the terminal | | | [voxl-inspect-battery.c](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-battery.c) | Battery voltage and current | [voxl-inspect-battery](/voxl-inspect-battery/) | | [voxl-inspect-baro.c](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-baro.c) | Barometer data | | | [voxl-inspect-detections.c](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-detections.c) | AI detections from voxl-tflite-server | [voxl-inspect-detections](/voxl-inspect-detections/) | | [voxl-inspect-extrinsics.c](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-extrinsics.c) | The extrinsics configuration | [voxl-inspect-extrinsics](/voxl-inspect-extrinsics/) | | [voxl-inspect-tags.c](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector/-/blob/master/clients/voxl-inspect-tags.c) | AprilTag detections from voxl-tag-detector | [voxl-inspect-tags](/voxl-inspect-tags/) | The full set covers every standard pipe type; browse the [voxl-mpa-tools tools directory](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/tree/master/tools) for the rest, and the [inspect tools overview](/inspect-tools/) for what each prints. ## Configuration Files: libmodal-json Examples ModalAI services read and write their `/etc/modalai/*.conf` files through libmodal-json. The [libmodal-json examples](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json/-/tree/master/examples) show the read-modify-write pattern services use, which is also the right pattern for your own application's config file. See [libmodal-json](/libmodal-json/) for the library reference. ## Offboard Control [fixed_frame_pipe_example.c](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/examples/fixed_frame_pipe_example.c) in voxl-vision-hub shows how to feed fixed-frame poses into the vision hub from your own process. The [Figure 8 demo](/voxl-figure-8/) documents the built-in offboard trajectory modes, and [MAVSDK](/mavsdk/) covers commanding the vehicle from an external program over MAVLink. ## Bridges To consume MPA data in other ecosystems, [voxl-mpa-to-ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) and [voxl-mpa-to-ros2](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) republish pipes as topics; setup is covered in the [ROS](/ros-installation-voxl2/) and [ROS 2](/ros2-installation-voxl2/) installation guides. --- Source: https://docs.modalai.com/mpa-development/ # Developing in MPA (Modal Pipe Architecture) **Before reading this page, see [The Modal Pipe Architecture](/mpa/) page!** This page will discuss VOXL's software architecture in more detail, providing critical knowledge for any developer that would like to make custom applications for ROS. > If you would simply like to use ROS on VOXL, see the page on [Custom ROS Applications](/ros/). Working examples for the patterns on this page are cataloged on the [Example Code](/example-code/) page. ## Overview Every MPA service follows the same pattern: subscribe to input pipes with the [libmodal_pipe](/libmodal-pipe/) client API, process data, and publish results through the server API. The best way to learn it is: 1. Read the [libmodal_pipe](/libmodal-pipe/) page for the core concepts (servers, clients, sinks, the info file, and message types). 2. Build and run the hello examples from the [libmodal-pipe examples directory](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/examples) inside [voxl-cross](/voxl-docker-and-cross-installation/). 3. Start your own service from the [voxl-cross-template](/voxl-cross-template/) project, which ships the build scaffolding, packaging, and a working pipe client/server skeleton. ## The Pattern in Code The whole architecture reduces to two calls. A server creates a named pipe and writes to it. Condensed from [modal-hello-server.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-server.c): ```c pipe_info_t info = { .name = PIPE_NAME, .location = PIPE_LOCATION, .type = "text", .server_name = SERVER_NAME, .size_bytes = MODAL_PIPE_DEFAULT_PIPE_SIZE}; if(pipe_server_create(SERVER_CH, info, flags)) return -1; while(main_running){ pipe_server_write(SERVER_CH, str, len+1); usleep(1000000/frequency_hz); } ``` A client subscribes with a callback. Condensed from [modal-hello-client.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/examples/modal-hello-client.c): ```c // called whenever the simple helper has data for us to process static void _simple_cb(int ch, char* data, int bytes, __attribute__((unused)) void* context) { printf("received %d bytes on channel %d: %s\n", bytes, ch, data); } pipe_client_set_simple_helper_cb(CLIENT_CH, _simple_cb, NULL); pipe_client_open(CLIENT_CH, PIPE_NAME, CLIENT_NAME, CLIENT_FLAG_EN_SIMPLE_HELPER, PIPE_READ_BUF_SIZE); ``` Every service and inspect tool in the SDK is an elaboration of this pattern with different message types. --- Source: https://docs.modalai.com/voxl-emulator/ # VOXL Emulator Docker Image --- > voxl-emulator is deprecated. Use [voxl-cross](/voxl-docker-and-cross-installation/) for building VOXL applications instead. ## Install the voxl-emulator Docker Image
voxl-emulator enables one to develop CPU-based applications for VOXL and VOXL Flight, then test CPU-only in an emulated environment. The VOXL 1 emulator image (`voxl-emulator_v1.7.tgz`) is no longer distributed on [downloads.modalai.com](https://downloads.modalai.com).
qrb5165-emulator enables one to develop CPU-based applications for VOXL 2, then test CPU-only in an emulated environment. It is an ARM 64 emulator with the VOXL 2 sysroot mounted. It has very limited application to end developers. It is for low-level service development for cross-compiling applications not yet supported by cross-compiling in [voxl-cross](/voxl-docker-and-cross-installation/)
### Installation Process The installation process is the same for both VOXL and VOXL 2. 1. Download the archived docker image from the [Miscellaneous folder on downloads.modalai.com](https://modalai.filecloudonline.com/ui/core/index.html#expl-tabl./SHARED/downloads/Miscellaneous) (login required). - For VOXL 2: `865-rootfs_m0054_qrb5165-emulator-v1.5.tar` - For VOXL 1: no longer distributed 2. Install Dependencies: ``` # install packages $ sudo apt-get install qemu binfmt-support qemu-user-static # Execute the registering scripts, see $https://www.stereolabs.com/docs/integrations/docker/create-images-for-nvidia-jetson $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes ``` 3. Load and Tag the Docker Image: ``` $ docker load -i qrb5165-emulator_V1.5.tgz $ docker tag voxl-cross:V2.5 voxl-cross:latest ``` ### Using the Installed Docker Image To enter the docker image's build environment, run the command: ``` $ voxl-docker -i qrb5165-emulator_V1.5.tgz ``` --- Source: https://docs.modalai.com/voxl-hexagon/ # VOXL Hexagon Docker Image --- Develop for VOXL's Hexagon DSP (aDSP and sDSP/SLPI) in a Docker running on your Linux PC! This tool lets you use the docker build environments described in the [build environments page](/build-environments/). The voxl-hexagon docker image is based on the x86_64 Ubuntu Bionic docker image but additionally contains the `Qualcomm Hexagon SDK 3.1` and an ARM cross compiler. For legal reasons these components must be downloaded from their respective sources by the user before building the docker image. For convenience, `Qualcomm Hexagon SDK 3.1` is also available to download here : https://downloads.modalai.com. `Qualcomm Hexagon SDK 3.3.3` is available from https://www.qualcomm.com/developer/software/hexagon-npu-sdk (Linux version) In this project, we provide instructions and a docker build script. ## Prerequisite Follow the instructions to install Docker CE and the voxl-docker script [here](https://downloads.modalai.com). ## Build and Install the voxl-hexagon Docker Image Complete instructions for building and installing the voxl-hexagon Docker are found in the voxl-docker [README](https://gitlab.com/voxl-public/support/voxl-docker/-/blob/master/README.md) ## Signing aDSP modules for use on VOXL - tested on Hexagon SDK 3.1 and 3.3.3 - get the board's / DSP serial number: - `cd Hexagon_SDK/3.1/tools/elfsigner/getserial/UbuntuARM_Release$` - `adb push getserial /home/root/` - `adb shell /home/root/getserial` - output should be similar to : `Serial Num : 0xfb6b0021` - your serial number, e.g `0xfb6b0021` in thise case, should be used below as ```` - get the signature for your device from Qualcomm - `cd Hexagon_SDK/3.1` - `./setup_sdk_env.source` - `python tools/elfsigner/elfsigner.py -t -o /elf-signer-output` - (note that without setting up the sdk environment, the elfsigner script behaves strangely) - push the signature to VOXL - `adb push testsig-.so /usr/lib/rfsa/adsp/` - REBOOT VOXL !!! - test using a simple project from https://gitlab.com/voxl-public/support/adsp-proc-examples --- Source: https://docs.modalai.com/packaging-on-voxl/ # Software packaging on VOXL ## Packaging for VOXL 2 (Debian packages) VOXL 2 and VOXL 2 Mini run Ubuntu, so software is packaged as standard **Debian packages** (`.deb`) managed by `apt`/`dpkg` — the opkg/ipk content below applies only to the original VOXL. Every open-source VOXL SDK project follows the same packaging pattern, which you can copy for your own software: - Build in the `voxl-cross` docker image (see [build environments](/build-environments/)) with the project's `build.sh`. - `make_package.sh` assembles the deb: compiled artifacts plus the `pkg/control/` directory (package name, version, dependencies), any `services/*.service` systemd units, and `scripts/` installed to `/usr/bin`. - `deploy_to_voxl.sh` pushes and installs the freshly built deb over ADB or ssh for quick iteration. Any public SDK repo works as a template — for example [voxl-streamer](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-streamer) or [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io): copy the `pkg/` directory, `make_package.sh`, and `deploy_to_voxl.sh`, and adapt the control file to your project. ## Overview VOXL runs a variant of Linux created by ModalAI using the Yocto build system (Jethro version). This environment has a simple package management system known as [opkg](https://openwrt.org/docs/guide-user/additional-software/opkg). This is very useful for managing the software on VOXL but it does not have access to an external package feed like other more full featured package managers (e.g. apt). This means that the VOXL user must install packages and deal with all of the dependencies without the direct support of the package manager. ## Creating packages There are a couple of ways to create your own ipk packages. 1. When building software on target directly, in the voxl-emulator, or in a cross compile environment the relevant artifacts can be archived into an ipk using one of our example packaging scripts. The opkg format is fairly straightforward to understand and creating your own utility to handle this task is not that much effort. One example to help you get started is located in the ModalAI project [voxl-ffmpeg](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ffmpeg). Look at the make_package.sh bash shell script and the ipk subdirectory. 2. You can use Yocto to create a package. This is useful if a Yocto build recipe or layer already exists for the desired package. You do not need the full Yocto environment that ModalAI uses to create the system image. An example of this approach is in the [poky project](https://gitlab.com/voxl-public/system-image-build/poky). This is forked from the main Yocto Poky repository and has VOXL specific documentation / configuration. This is a nice way to build a package because it will also build all of the package dependencies. ## Docker Running Ubuntu or other Linux distro in a Docker on target is a great way to get access to a more full featured package management system such as apt. Documentation on this approach is located [here](/docker-on-voxl/). Please note that there are some limitations that are listed at the end of that document. --- Source: https://docs.modalai.com/voxl2-vs-code-user-guide/ # VOXL 2 VS Code --- ## Overview Microsoft's VS Code is a free and open source IDE. In the video below, you'll learn how to use VS Code to remotely browse the VOXL2 file system and build a package on target. --- Source: https://docs.modalai.com/opencv/ # OpenCV ModalAI hosts a native, VOXL-tuned version of OpenCV in 32-bit and 64-bit. The repository containing the tools required to build the OpenCV package for VOXL is available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv). Some good examples of using OpenCV on VOXL: - [voxl-logger](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger/-/blob/master/tools/voxl-logger.cpp) and [voxl-replay](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-logger/-/blob/master/tools/voxl-replay.cpp) use OpenCV to save and load PNG files. - [voxl-tag-detector](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector) uses opencv to generate stereo image rectification maps, but uses a more optimized algorithm do do the actual undistortion. - [voxl-camera-calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-camera-calibration) uses OpenCV to calculate camera lens parameters. --- Source: https://docs.modalai.com/build-for-gpu-opencl/ # Build for GPU (OpenCL) --- ## Overview VOXL contains an embedded [Adreno 530](https://en.wikipedia.org/wiki/Adreno) GPU with 256 ALUs. This GPU is exposed through both OpenCL 1.1 and OpenGLES 3.1. The GPU can be exploited for significant algorithmic acceleration for use cases like computer vision and deep learning. ## Examples voxl-dfs-server voxl-tflite-server --- Source: https://docs.modalai.com/voxl-tflite-guide/ [LiteRT](https://ai.google.dev/edge/litert) (formerly TensorFlow Lite) is a powerful deep learning framework for embedded systems. VOXL supports this through the voxl-tflite-server. Please refer to the [voxl-tflite-server](/voxl-tflite-server/) documentation for more details. --- Source: https://docs.modalai.com/mavsdk/ # MAVSDK on VOXL2 ## Overview [Mavsdk](https://github.com/mavlink/MAVSDK) is a C++ based API that is capable of interfacing with PX4. It leverages mavlink alongside plugins written for each specific function (Action, System, Mission, etc.) in PX4 to allow for seemless communication from a programmer written code base. There also exists a Python version of the API which can be researched [here](https://github.com/mavlink/MAVSDK-Python) ## Communication from MAVSDK to VOXL2 In order to communicate with the VOXL2 from MAVSDK, the user must have the two following voxl2 services actively configured and running: 1. [voxl-vision-hub](/voxl-vision-hub/) 2. [voxl-mavlink-server](/voxl-mavlink-server/) For `voxl-vision-hub`, the user must edit the following two parameters to: 1. `en_localhost_mavlink_udp`: `true` 2. `localhost_udp_port_number`: `14551` Once these have been services have been configured properly, enabled, and are running in the background, the user now has the ability to interface with PX4 via MAVSDK. In order to run MAVSDK on target, you must build the voxl-docker-mavsdk docker container that encompasses all the necessary libraries - you can follow the build steps [here](https://gitlab.com/voxl-public/voxl-docker-images/voxl-docker-mavsdk-python) This link above is how we recommend running MAVSDK on target (in this case a VOXL2). We run mavsdk inside a bionic docker container that has the ability to interface with the PX4 instance running outside docker. Once you have finished building the docker instance, proceed to `adb shell` into the target/voxl2 and spin up the docker instance. This can be done by running the `run-docker.sh` executable in the `/data/docker/mavsdk` directory of your voxl2. Once you are in the Docker environment, you can now leverage the pre-written python and C++ examples of MAVSDK to control the drone. The two examples leveraged for this are the `takeoff_and_land` code written both in python and C++. If you wish to inspect the actual MAVSDK code that drives the drone to takeoff and land, Python examples can be found [here](https://github.com/mavlink/MAVSDK-Python/blob/main/examples/takeoff_and_land.py) and the C++ examples can be found [here](https://github.com/mavlink/MAVSDK/blob/main/cpp/examples/takeoff_and_land/takeoff_and_land.cpp). It is recommended when starting out with MAVSDK to leverage HITL to test out the communications. In order to setup HITL, follow the documentation [here](/voxl2-PX4-hitl/). ## Video Demonstration Below is a video showing how to setup `voxl-docker-mavsdk` in tandem with HITL to get a drone armed and flying in the simulation: --- Source: https://docs.modalai.com/voxl-figure-8/ # Figure Eight as an Example Custom VOXL SDK Application ## Overview [voxl-vision-hub](/voxl-vision-hub/) is the core of the VOXL SDK interacting with the [internal](/voxl-px4/) or [external](/voxl2-external-flight-controller/) flight controller. [voxl-vision-hub](/voxl-vision-hub/) has an example autonomous indoor path following example called figure eight. Please get comfortable using this mode prior to developing custom code. Once you are ready to make changes, you can use the [figure eight source code](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/-/blob/master/src/offboard_figure_eight.c) as a template for your development. --- Source: https://docs.modalai.com/ros/ # ROS Overview For developers with experience using ROS, we've built support for ROS into VOXL, as an alternative to coding within VOXL's [Modal Pipe Architecture](/mpa/) with `systemd` services and POSIX pipes. This approach is more of a wrapper around VOXL's Modal Pipe Architecture and introduces more overhead. The way it works is that a ROS node translates POSIX pipes in the VOXL Modal Pipe Architecture into topics that can be used in ROS. High performance can be achieved either way. --- Source: https://docs.modalai.com/ros2-installation-voxl2/ # ROS2 Installation on VOXL 2 VOXL2 SDK 1.1 and Above will contain the debians onboard for ROS2 Foxy (base) to be installed on disk (NOTE: If a user wishes to use a newer version, they must leverage docker). In order to install on disk, a user must run the following on their command line: `apt-get install voxl-ros2-foxy -y` > An internet connection is NOT required to install this package. ### Environment Setup Script Once the ROS2 environment has been installed, the user can source the required bash script in order to have all the proper paths setup for ros2 foxy to run. This can be done by running: `source /opt/ros/foxy/setup.bash` If you wish to add this to your `bashrc` file so you don't need to rerun this each time you adb shell or ssh into the VOXL 2, run the following: `echo 'source /opt/ros/foxy/setup.bash' >> ~/.bashrc` ## MPA-TO-ROS2 Once the installation of ros2 has been done, the user can then install [`voxl-mpa-to-ros2`](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros2) - which is a ros2 node that will convert the following from MPA to ROS2 messages: 1. IMU data 2. Camera Images (Hires, tracking, and stereo) 3. Point Cloud Information 4. 6DOF VIO data In order to install it, run the following on your command line: `apt-get install voxl-mpa-to-ros2 -y` Once this is installed, you will need to configure the package accordingly, which can be done by running on the command line (NOTE: This configuration WILL need internet!!!): `apt-get install python3-pip -y && voxl-configure-mpa-to-ros2` This will automatically place the right lines into your bashrc to tell the system where the voxl-mpa-to-ros2 executables are! > Make sure before you run the code, you either source your bashrc via `source ~/.bashrc` OR you reboot your VOXL 2. Once this is done, in order to run voxl_mpa_to_ros2, run: `ros2 run voxl_mpa_to_ros2 voxl_mpa_to_ros2_node` ``` MPA to ROS app is now running Found new interface: hires_small_color Found new interface: stereo_front Found new interface: stereo_rear Found new interface: tracking Found new interface: imu_apps Found new interface: imu_apps_raw ``` > In order to see the interfaces above, the user must ensure the voxl SDK services are running as well. For example, if you wish to see IMU data in ROS2, the user must have voxl-imu-server enabled and running. ### List Topics > If you're accessing topics from another device (such as your laptop), it is recommended to use ROS2 versions ≤ Humble. In a new shell, run the following: ``` voxl2:~$ ros2 topic list /hires_small_color /imu_apps /stereo_front/left /stereo_front/right /tracking /voa_pc_out ``` ### All topic outputs and ROS2 msgs formats Topics: ``` /hires_large_color - sensors_msg/msg/Image /hires_large_encoded - sensors_msg/msg/Image /hires_large_grey - sensors_msg/msg/Image /hires_small_color - sensors_msg/msg/Image /hires_small_encoded - sensors_msg/msg/Image /hires_small_snapshot - sensors_msg/msg/Image /stereo - sensors_msg/msg/Image /tracking - sensors_msg/msg/Image /imu_apps - sensor_msgs/msg/Imu /qvio - geometry_msgs/msg/PoseStamped / nav_msgs/msg/Odometry /qvio_overlay - sensors_msg/msg/Image /tof_conf - sensors_msg/msg/Image /tof_depth - sensors_msg/msg/Image /tof_ir - sensors_msg/msg/Image /tof_pc - sensors_msg/msg/PointCloud2 /voa_pc_out - sensors_msg/msg/PointCloud2 /vvhub_body_wrt_fixed - geometry_msgs/msg/PoseStamped / nav_msgs/msg/Odometry /vvhub_boxy_wrt_local - geometry_msgs/msg/PoseStamped / nav_msgs/msg/Odometry /tflite_data - voxl_msgs/msg/Aidetection ``` > The way mpa_to_ros2 is programmed, topics only get published when something is subscribed to the topic. Otherwise it will just be advertised! ## Voxl2 MicroDDS Communication with PX4 Users on SDK 1.1 and above will have the ability to install voxl-microdds-agent which runs a dds agent middle-ware that can communicate with the px4 instance running onboard. This can be installed via: `apt install -y voxl-microdds-agent && voxl-configure-microdds` Once this is setup and running (can be checked with a `voxl-inspect-services`), the user now has the ability to probe px4 via ros2. The topics that you can interface with are the following: ``` /fmu/in/obstacle_distance /fmu/in/offboard_control_mode /fmu/in/onboard_computer_status /fmu/in/sensor_optical_flow /fmu/in/telemetry_status /fmu/in/trajectory_setpoint /fmu/in/vehicle_attitude_setpoint /fmu/in/vehicle_command /fmu/in/vehicle_mocap_odometry /fmu/in/vehicla_rates_setpoint /fmu/in/vehicle_trajectory_bezier /fmu/in/vehicle_trajectory_waypoint /fmu/in/vehicle_visual_odometry /fmu/out/failsafe_flags /fmu/out/position_setpoint_triplet /fmu/out/sensor_combined /fmu/out/timesync_status /fmu/out/vehicle_attitude /fmu/out/vehicle_control_mode /fmu/out/vehicle_gps_position /fmu/out/vehicle_local_position /fmu/out/vehicle_odometry /fmu/out/vehicle_status ``` ### Running a figure 8 via ros2, microdds, and px4 With microdds agent running and the client running on px4, we now have the ability to send setpoints in via the dds bridge and ros2. This feature is already implemented with the voxl-mpa-to-ros2 code base. In order to run this, the user must run: `ros2 run voxl_offboard_figure8 voxl_offboard_figure8` Using a Bernoulli's Lemniscate, we calculate the position, velocity, and acceleration along the path, and package those up into a trajectory_setpoint ros2 message, when then gets published to px4 to execute the path! In order to run this demo, ensure that you have the parameter `offboard_mode` set to `off` in the voxl-vision-hub.conf file. Then restart voxl-vision-hub via `systemctl restart voxl-vision-hub` --- Source: https://docs.modalai.com/ros-installation-voxl2/ # ROS Installation on VOXL 2 ROS must be installed on both the Host computer and on VOXL. This page guides you through this process. ## 1. Set up ROS on Host PC ### Install You can use whichever distribution of ROS 1 on your host PC (i.e. ROS Melodic on Ubuntu 18.04). Follow the ROS wiki instructions to install `ros-melodic-desktop-full`: ### Environment Setup Script We will set up a `my_ros_env.sh` script on the host pc: ```bash me@mylaptop:~/$ touch ~/my_ros_env.sh me@mylaptop:~/$ echo ". ~/my_ros_env.sh" >> ~/.bashrc ``` Then paste the following into your `my_ros_env.sh` script. This is where you will edit IP addresses as necessary. ``` bash #!/bin/bash # Script loads ROS envrionment variables and sets IP addresses # load main ros environment if [ -f /opt/ros/melodic/setup.bash ]; then source /opt/ros/melodic/setup.bash elif [ -f /opt/ros/kinetic/setup.bash ]; then source /opt/ros/kinetic/setup.bash elif [ -f /opt/ros/indiego/setup.bash ]; then source /opt/ros/indigo/setup.bash fi # if a catkin workspace is setup then make sure the launch # files and run files are available in the ROS PATH if [ -f ~/catkin_ws/devel/setup.bash ]; then source ~/catkin_ws/devel/setup.bash fi if [ -f ~/catkin_ws/install/setup.bash ]; then source ~/catkin_ws/install/setup.bash fi # ignore ROS_HOSTNAME, it only causes problems and overrides ROS_IP unset ROS_HOSTNAME # configure ROS IPs HERE export ROS_MASTER_IP=192.168.8.1 export ROS_IP=192.168.8.91 # ROS_MASTER_URI is derived from ROS_MASTER_IP export ROS_MASTER_URI=http://${ROS_MASTER_IP}:11311/ ## bonus alias to ssh into ros master alias sshh='sshpass -p oelinux123 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@${ROS_MASTER_IP}' ``` The script above provides an alias 'sshh' which allows you to ssh remotely into your VOXL using default credentials. Update `ROS_MASTER_IP` and `ROS_IP` to match your network configuration. On your host machine, also be sure to update `ROS_MASTER_IP` and `ROS_IP` to match this VOXL IP address. You will need to install sshpass to use the aforementioned alias. ```bash # ON HOST PC me@mylaptop:~/$ sudo apt install sshpass ``` ### Troubleshooting > Due to SSH environment variable issues using the default terminal, we recommend that users with host Ubuntu machine versions newer than Ubuntu 14.04 use XTerm (not the default terminal) to connect to VOXL via SSH while using ROS. ## 2. Set up ROS on VOXL 2 ### Tutorial Video ### Install ROS VOXL 2 can use apt package management, which allows flexibility on what ROS version to install, and allows us to keep the core system image smaller. For these reasons, we leave it up to the end user to select what to install. To install ROS Melodic (as an example), connect VOXL 2 to the internet (see the [WiFi guide](/wifi-setup/) for help on this) and run the following: ``` voxl2:/$ apt-get update voxl2:/$ apt install -y libyaml-cpp-dev voxl2:/$ apt install -y ros-melodic-ros-base ros-melodic-image-transport ``` If you get the error: "Unable to locate package", add the ros repo and key to apt using the following: ``` voxl2:/$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' voxl2:/$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 voxl2:/$ sudo apt update voxl2:/$ apt install -y ros-melodic-ros-base ros-melodic-image-transport ``` ### Launch Source ROS setup script: ``` voxl2:~/$ . /opt/ros/melodic/setup.sh ``` Run the [voxl_mpa_to_ros](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-to-ros) node, which uses this launch file `/opt/ros/melodic/share/voxl_mpa_to_ros/launch/voxl_mpa_to_ros.launch` ``` voxl2:~/$ roslaunch voxl_mpa_to_ros voxl_mpa_to_ros.launch ``` You should get similar output: ``` ... logging to /home/root/.ros/log/81ccbc5c-34ac-11ed-80c6-00c0caafca29/roslaunch-m0054-2535.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://m0054:45955/ SUMMARY ======== PARAMETERS * /rosdistro: melodic * /rosversion: 1.14.13 NODES / voxl_mpa_to_ros_node (voxl_mpa_to_ros/voxl_mpa_to_ros_node) auto-starting new master process[master]: started with pid [2557] ROS_MASTER_URI=http://localhost:11311 setting /run_id to 81ccbc5c-34ac-11ed-80c6-00c0caafca29 process[rosout-1]: started with pid [2568] started core service [/rosout] process[voxl_mpa_to_ros_node-2]: started with pid [2571] MPA to ROS app is now running Found new interface: hires Found new interface: qvio_overlay Found new interface: stereo_front Found new interface: stereo_rear Found new interface: tracking Found new interface: imu_apps Found new interface: voa_pc_out Found new interface: qvio ``` ### List Topics In a new shell, run the following: ``` voxl2:~$ rostopic list /hires /imu_apps /qvio/odometry /qvio/pose /qvio_overlay /rosout /rosout_agg /stereo_front/left /stereo_front/right /stereo_rear/left /stereo_rear/right /tracking /voa_pc_out ``` ## Next Steps See the [MAVROS test example for VOXL 2](/mavros/). See the [building ROS nodes for VOXL](/building-ros-nodes/) for information on making your own ROS nodes. --- Source: https://docs.modalai.com/ros-installation-voxl/ # ROS Installation on VOXL 1 ROS must be installed on both the Host computer and on VOXL. This page guides you through this process. ## 1. Set up ROS on Host PC ### Install You can use whichever distribution of ROS 1 on your host PC (i.e. ROS Melodic on Ubuntu 18.04). Follow the ROS wiki instructions to install `ros-melodic-desktop-full`: ### Environment Setup Script We will set up a `my_ros_env.sh` script on the host pc: ```bash me@mylaptop:~/$ touch ~/my_ros_env.sh me@mylaptop:~/$ echo ". ~/my_ros_env.sh" >> ~/.bashrc ``` Then paste the following into your `my_ros_env.sh` script. This is where you will edit IP addresses as necessary. ``` bash #!/bin/bash # Script loads ROS envrionment variables and sets IP addresses # load main ros environment if [ -f /opt/ros/melodic/setup.bash ]; then source /opt/ros/melodic/setup.bash elif [ -f /opt/ros/kinetic/setup.bash ]; then source /opt/ros/kinetic/setup.bash elif [ -f /opt/ros/indiego/setup.bash ]; then source /opt/ros/indigo/setup.bash fi # if a catkin workspace is setup then make sure the launch # files and run files are available in the ROS PATH if [ -f ~/catkin_ws/devel/setup.bash ]; then source ~/catkin_ws/devel/setup.bash fi if [ -f ~/catkin_ws/install/setup.bash ]; then source ~/catkin_ws/install/setup.bash fi # ignore ROS_HOSTNAME, it only causes problems and overrides ROS_IP unset ROS_HOSTNAME # configure ROS IPs HERE export ROS_MASTER_IP=192.168.8.1 export ROS_IP=192.168.8.91 # ROS_MASTER_URI is derived from ROS_MASTER_IP export ROS_MASTER_URI=http://${ROS_MASTER_IP}:11311/ ## bonus alias to ssh into ros master alias sshh='sshpass -p oelinux123 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@${ROS_MASTER_IP}' ``` The script above provides an alias 'sshh' which allows you to ssh remotely into your VOXL using default credentials. Update `ROS_MASTER_IP` and `ROS_IP` to match your network configuration. On your host machine, also be sure to update `ROS_MASTER_IP` and `ROS_IP` to match this VOXL IP address. You will need to install sshpass to use the aforementioned alias. ```bash # ON HOST PC me@mylaptop:~/$ sudo apt install sshpass ``` ### Troubleshooting `Note:` Due to SSH environment variable issues using the default terminal, we recommend that users with host Ubuntu machine versions newer than Ubuntu 14.04 use XTerm (not the default terminal) to connect to VOXL via SSH while using ROS. ## 2. Set up ROS on VOXL ### Set up Environment Variables VOXL ships with ROS Indigo and the `voxl-utils` package pre-installed. `voxl-utils` installs the script `my_ros_env.sh` to `/home/root/` which sources the normal `/opt/ros/indigo/setup.bash` script to configure the ROS environment variables. It also sets the IP address environment variables. Since everyone's VOXL will be on a different IP address, you will need to edit this script to match the network configuration for your desired ROS master/slave configuration which will be different depending on your use case. We recommend having the ROS Master be on VOXL. The Master IP is already set up to `192.168.8.1` to match the VOXL's default IP address when in SoftAP mode. If you have your VOXL in station mode and connected on a WiFi network you will need to change this address to match your configuration. ```bash voxl2:/$ vi ~/my_ros_env.sh ... # IP Environment variables must be set after setup scripts # Set ROS_IP & ROS_MASTER_URI appropriately for your configuration # 192.168.8.1 is default for the robot in soft access point mode export ROS_MASTER_URI=http://localhost:11311/ export ROS_IP=192.168.8.1 unset ROS_HOSTNAME ``` You can refresh your environment variables after updating this script by running: ```bash voxl2:/$ exec bash ``` And then check that they have been updated by using the `voxl-env` tool or just grep'ing the bash environment variables. ```bash voxl2:/$ voxl-env show ROS_MASTER_URI=http://localhost:11311/ ROS_IP=192.168.1.150 CAM_CONFIG_ID=1 HIRES_CAM_ID=-1 TRACKING_CAM_ID=0 STEREO_CAM_ID=1 TOF_CAM_ID=-1 voxl2:/$ env | grep "ROS" ROS_ROOT=/opt/ros/indigo/share/ros ROS_PACKAGE_PATH=/home/root/catkin_ws/install/share:/home/root/catkin_ws/install/stacks:/opt/ros/indigo/share:/opt/ros/indigo/stacks ROS_MASTER_URI=http://localhost:11311/ ROSLISP_PACKAGE_DIRECTORIES= ROS_DISTRO=indigo ROS_IP=192.168.8.1 ROS_ETC_DIR=/opt/ros/indigo/etc/ros ``` ### Testing ROS Configuration To test that your ROS configuration is working, start `roscore` on VOXL. > Currently an [issue](https://gitlab.com/voxl-public/support/documentation/issues/4) can be seen when attempting to use ROS using the native Ubuntu terminal. As a workaround XTerm can be used. ```bash # ON VOXL voxl2:/$ echo $SHELL /bin/bash voxl2:/$ roscore process[rosout-1]: started with pid [5706] started core service [/rosout] ``` Now on your host PC use `rostopic` to see if it can communicate with VOXL. ```bash # ON HOST PC me@mylaptop:~$ rostopic list /rosout /rosout_agg ``` ### Known Issue Running ROS Through SSH If you try to use ROS commands while SSH'd to VOXL and see errors such as this: ```bash load_parameters: unable to set parameters (last param was [/rosdistro=indigo ]): :not well-formed (invalid token): line 13, column 15"> ``` The cause is a known issue with the GNOME Terminal, the default terminal emulator of Ubuntu. The solution is to use another terminal emulator such as XTerm or Konsole instead of GNOME Terminal. More information here: https://gitlab.com/voxl-public/support/documentation/issues/4 ### Next Steps Now explore the [VOXL MPA to ROS](/ros-installation-voxl2/) package. See the [building ROS nodes for VOXL](/building-ros-nodes/) for information on making your own ROS nodes. --- Source: https://docs.modalai.com/building-ros-nodes/ # Building ROS Nodes --- ## Overview VOXL ships with the [`voxl-utils`](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) and [`voxl-nodes`](https://gitlab.com/voxl-public/Deprecated/voxl-nodes) package pre-installed alongside ROS Indigo so you can start developing with ROS right away. You can choose to compile ROS nodes either directly on-target (on VOXL), or in the `voxl-emulator` docker on a host PC and then push the compiled application onto the VOXL (see [voxl-emulator](/voxl-emulator/) for more info). ## Building on VOXL 1) Prerequisite: you will need to have [`ros-indigo-build-deps`](https://storage.googleapis.com/modalai_public/modal_packages/latest/ros-indigo-build-deps_1.0.0.ipk) installed to build ROS nodes directly on VOXL. This is not necessary when building in the `voxl-emulator` docker image. 2) ADB or ssh into VOXL and go to your VOXL's home directory. This assumes you have followed the previous setup pages in this manual to get ADB and/or ssh working. ```bash me@mylaptop:~$ adb shell ... voxl2:/$ cd ~/ voxl2:~$ ``` 3) make a new catkin workspace and initialize it with catkin_make ```bash voxl2:~$ mkdir -p catkin_ws/src voxl2:~$ cd catkin_ws voxl2:~/catkin_ws$ catkin_make ``` 4) Make a new node source directory in the src folder. Here we use the VOXL time-of-flight node as an example. ```bash voxl2:~/catkin_ws$ cd src voxl2:~/catkin_ws/src$ git clone https://gitlab.com/voxl-public/Deprecated/tof_cam_ros.git voxl2:~/catkin_ws/src$ ls CMakeLists.txt tof_cam_ros voxl2:~/catkin_ws/src$ cd ../ voxl2:~/catkin_ws$ ``` 5) Build! ```bash voxl2:~/catkin_ws$ catkin_make install ``` 6) This installed the newly built ROS node to `~/catkin_ws/install` which should be part of your ROS_PACKAGE_PATH if you have `voxl-utils` installed and it is sourced by the `~/my_ros_env.sh` script. Check to confirm ```bash voxl2:~/catkin_ws$ exec bash voxl2:~/catkin_ws$ env | grep "ROS_PACKAGE_PATH" ROS_PACKAGE_PATH=/home/root/catkin_ws/install/share:/home/root/catkin_ws/install/stacks:/opt/ros/indigo/share:/opt/ros/indigo/stacks ``` 7) Now you can launch your new ROS node! **Note** the tof_cam_ros node will fail to start unless you have a TOF sensor installed on VOXL. ```bash voxl2:~/catkin_ws$ cd ../ voxl2:~$ rospack list | grep tof_cam_ros tof_cam_ros /home/root/catkin_ws/install/share/tof_cam_ros voxl2:~$ roslaunch tof_cam_ros tof.launch ``` ## Building in `voxl-emulator` Docker Image You can build a ROS node in the voxl-emulator docker image following the same steps as you did for building on the VOXL itself. However, the process of getting the built package onto the VOXL itself will be different. The `voxl-nodes` package and it's README file provide a great example of how to do this. We recommend copying this project and swapping out the nodes in `catkin_ws/src` for your own and working from there. It includes instructions on how to build and helper scripts for making a package and installing on VOXL. --- Source: https://docs.modalai.com/building-ros2-nodes/ # Building ROS2 Nodes --- ## Overview **Note:** This is only meant to be done on VOXL2 VOXL2 ships with the [`voxl-utils`](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils) and ROS2 FOXY pre-installed on target. You can choose to compile ROS2 nodes either directly on-target (on VOXL2), or in the `qrb5165-emulator` docker on a host PC and then push the compiled application onto the VOXL2 (see [voxl-emulator](/voxl-emulator/) for more info). ## Building on VOXL2 1) ADB or ssh into VOXL and go to your VOXL2's home directory. This assumes you have followed the previous setup pages in this manual to get ADB and/or ssh working. ```bash me@mylaptop:~$ adb shell ... voxl2:/$ cd ~/ voxl2:~$ ``` 3) make a new colcon workspace ```bash voxl2:~$ mkdir -p colcon_ws/src voxl2:~$ cd colcon_ws ``` 4) Make a new node source directory in the src folder. Here we use the PX4's [`px4_ros_com`](https://github.com/PX4/px4_ros_com) and PX4's [`px4_msgs`](https://github.com/PX4/px4_msgs) ```bash voxl2:~/colcon_ws$ cd src voxl2:~/colcon_ws$ apt install -y libeigen3-dev libtinyxml2-dev voxl2:~/colcon_ws/src$ git clone https://github.com/PX4/px4_ros_com --recursive voxl2:~/colcon_ws/src$ git clone https://github.com/PX4/px4_msgs --recursive voxl2:~/colcon_ws/src$ cd ../ voxl2:~/colcon_ws$ ``` 5) Build! ```bash voxl2:~/colcon_ws$ colcon build ``` 6) This will build out the px4_ros_com ROS2 node as well as the px4_msgs required by this node. It will take about 3 minutes to finish compiling. Once finished compiling - you will want to source the install directory created from build. This contains all the path setups. ```bash voxl2:~/colcon_ws$ source install/setup.bash ``` 7) Now you can run your new ROS2 node! ```bash voxl2:~/colcon_ws$ ros2 run px4_ros_com sensor_combined_listener ``` 8) This can be done in the qrb5165-emulator as well. Just follow the same steps above in this demo and once compiled - `adb push` the `install` and `build` folders created in the `~/colcon_ws/` directory to your colcon_ws on target (VOXL2). --- Source: https://docs.modalai.com/mavros/ # How to Run MAVROS --- ## Tutorial Video ## Overview This tutorial demonstrates how to fly a VOXL 2 based drone autonomously in a figure 8, using MAVROS. For this setup, MAVROS is installed and runs on VOXL 2. Additionally, the `voxl-px4`, `voxl-vision-hub` and `voxl-mavlink-server` background services will be running. This provides the PX4 flight controller, Visual Inertial Odometry (VIO) for PX4, and manages the mavlink telemetry between the ground control station remotely and ROS locally. > At the end of this tutorial, your drone will be flying autonomously. Please only run this in a **safe location** away from people and **wear protective eyewear!!** ## Block Diagram ![sw-mavros](/images/voxl-sdk/ros/sw-mavros.png) ## Prerequisites ### Install ROS Melodic - Have vehicle [connected to the internet](/wifi-setup/) - Install ROS Melodic on VOXL 2 following [this guide](/ros-installation-voxl2/) ### Install MAVROS Dependencies - Install the following packages MAVROS packages: ```bash apt-get install ros-melodic-mavros ros-melodic-mavros-extras ros-melodic-control-toolbox ``` - Install `GeographicLib dataset` (which is a dependency of MAVROS, for whatever reason): ``` cd /opt/ros/melodic/lib/mavros ./install_geographiclib_datasets.sh ``` ### Configure voxl-vision-hub localhost Use `voxl-inspect-services` to validate `voxl-vision-hub` is enabled and running. Edit the configuration file: ```bash vi /etc/modalai/voxl-vision-hub.conf ``` We will check the following - `qgc_ip` - should be your host PCs IP address where the Ground Control Station is - `en_localhost_mavlink_udp` - set to true to allow UDP MAVLink comms on localhost - `offboard_mode` - set to "off". When `offboard_mode` is on, this enables `voxl-vision-hub` to command the drone to move, which we don't want (we only want MAVROS to be sending movement commands). Validate your configuration file ```bash "qgc_ip": "X.X.X.X", "en_localhost_mavlink_udp": true, ... "offboard_mode": "off" ``` ### Configure voxl-mavlink-server Use `voxl-inspect-services` to validate `voxl-mavlink-server` is enabled. ## mavros_test Project (simple-example) ### Checklist - Make sure your drone can arm - Have RC transmitter bound to vehicle with 'offboard' and 'manual' mode - This `simple-example` can be done on the bench **WITHOUT PROPS** ### Overview This `simple-example` branch demo project: - waits for `offboard` mode - arms the vehicle - disarms the vehicle ### Build On VOXL 2, clone the `simple-example` branch of the `mavros_test` project. In this example, we're cloning to `/home`: ```bash cd /home git clone -b simple-example https://gitlab.com/voxl-public/support/mavros_test.git ``` Build the project: ```bash cd /home/mavros_test ./build.sh Base path: /home/mavros_test/catkin_ws Source space: /home/mavros_test/catkin_ws/src Build space: /home/mavros_test/catkin_ws/build Devel space: /home/mavros_test/catkin_ws/devel Install space: /home/mavros_test/catkin_ws/install Creating symlink "/home/mavros_test/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake" ... ``` ### Configure ROS ENV The `ros_environment.sh` file contains environment variables used by ROS. Update the `ROS_IP` value to use your IP address on target (you can use `ifconfig`): ``` more /home/mavros_test/ros_environment.sh #!/bin/bash # source /opt/ros/kinetic/setup.bash source catkin_ws/install/setup.bash unset ROS_HOSTNAME # configure ROS IPs here export ROS_MASTER_IP=127.0.0.1 export ROS_IP=192.168.8.1 export ROS_MASTER_URI=http://${ROS_MASTER_IP}:11311/ # mavros needs to know what PX4's system id is export PX4_SYS_ID=1 ``` ### Launch the simple-example Demo You can do this on bench top if you'd like, but **REMOVE THE PROPELLORS** as this will arm the drone! - Open an adb shell - Run the following to launch the program ``` cd /home/mavros_test ./run_mavros_test.sh ``` You should get an output that ends similar to this: ``` ... INFO] [1663886683.264138601]: MAVROS started. MY ID 1.240, TARGET ID 1.1 [ INFO] [1663886683.264246359]: udp0: Remote address: 127.0.0.1:38711 [ INFO] [1663886683.264606406]: IMU: Attitude quaternion IMU detected! [ INFO] [1663886683.265673318]: IMU: High resolution IMU detected! [ WARN] [1663886683.267312670]: GP: No GPS fix [ INFO] [1663886683.313571850]: CON: Got HEARTBEAT, connected. FCU: PX4 Autopilot [ INFO] [1663886683.315295002]: IMU: High resolution IMU detected! [ INFO] [1663886683.378609250]: IMU: Attitude quaternion IMU detected! [ INFO] [1663886684.337418988]: GF: Using MISSION_ITEM_INT [ INFO] [1663886684.337929605]: RP: Using MISSION_ITEM_INT [ INFO] [1663886684.338302621]: WP: Using MISSION_ITEM_INT [ INFO] [1663886684.338667459]: VER: 1.1: Capabilities 0x000000000000e4ef [ INFO] [1663886684.339006205]: VER: 1.1: Flight software: 01041040 (33795a0a30000000) [ INFO] [1663886684.339548645]: VER: 1.1: Middleware software: 01041040 (33795a0a30000000) [ INFO] [1663886684.339894838]: VER: 1.1: OS software: 04137dff (e7701b9e792e3101) [ INFO] [1663886684.340202177]: VER: 1.1: Board hardware: 00000001 [ INFO] [1663886684.340527172]: VER: 1.1: VID/PID: 0000:0000 [ INFO] [1663886684.340860813]: VER: 1.1: UID: 3044494530303030 [ WARN] [1663886684.341231173]: CMD: Unexpected command 520, result 0 [ INFO] [1663886687.929310850]: waiting for offboard mode [ INFO] [1663886693.315015302]: HP: requesting home position [ INFO] [1663886696.836791903]: RC_CHANNELS message detected! [ INFO] [1663886698.315995312]: RP: mission received [ INFO] [1663886698.317024880]: GF: mission received [ INFO] [1663886698.317390396]: WP: mission received [ INFO] [1663886703.314904662]: HP: requesting home position [ INFO] [1663886707.538530390]: VER: 1.1: Capabilities 0x000000000000e4ef [ INFO] [1663886707.538779396]: VER: 1.1: Flight software: 01041040 (33795a0a30000000) [ INFO] [1663886707.538893405]: VER: 1.1: Middleware software: 01041040 (33795a0a30000000) [ INFO] [1663886707.539031580]: VER: 1.1: OS software: 04137dff (e7701b9e792e3101) [ INFO] [1663886707.539153506]: VER: 1.1: Board hardware: 00000001 [ INFO] [1663886707.539264337]: VER: 1.1: VID/PID: 0000:0000 [ INFO] [1663886707.539952557]: VER: 1.1: UID: 3044494530303030 [ WARN] [1663886707.540114325]: CMD: Unexpected command 512, result 0 [ INFO] [1663886707.708296390]: VER: 1.1: Capabilities 0x000000000000e4ef [ INFO] [1663886707.708538834]: VER: 1.1: Flight software: 01041040 (33795a0a30000000) [ INFO] [1663886707.708672791]: VER: 1.1: Middleware software: 01041040 (33795a0a30000000) [ INFO] [1663886707.708817060]: VER: 1.1: OS software: 04137dff (e7701b9e792e3101) [ INFO] [1663886707.708943881]: VER: 1.1: Board hardware: 00000001 [ INFO] [1663886707.709068618]: VER: 1.1: VID/PID: 0000:0000 [ INFO] [1663886707.709161221]: VER: 1.1: UID: 3044494530303030 [ INFO] [1663886708.451312390]: WP: seems GCS requesting mission [ INFO] [1663886708.452393312]: WP: scheduling pull after GCS is done [ INFO] [1663886708.566541986]: GF: seems GCS requesting mission [ INFO] [1663886708.566864534]: GF: scheduling pull after GCS is done [ INFO] [1663886708.610489220]: RP: seems GCS requesting mission [ INFO] [1663886708.611010150]: RP: scheduling pull after GCS is done [ INFO] [1663886713.314919596]: HP: requesting home position [ WARN] [1663886713.449405269]: GP: No GPS fix [ INFO] [1663886713.456587822]: WP: mission received [ INFO] [1663886713.568093669]: GF: mission received [ INFO] [1663886713.612369544]: RP: mission received [ INFO] [1663886723.314870316]: HP: requesting home position [ INFO] [1663886726.379315832]: arming [ INFO] [1663886726.427174936]: FCU: Armed by external command [ INFO] [1663886726.428385127]: Vehicle armed [ INFO] [1663886726.476409542]: FCU: [logger] /data/px4/log/sess005/log001.ulg [ INFO] [1663886731.379187081]: disarming [ INFO] [1663886731.395421067]: FCU: Disarmed by external command [ INFO] [1663886731.396092620]: Vehicle disarmed [ INFO] [1663886731.396233503]: done [mavros_test_node-3] process has finished cleanly log file: /home/root/.ros/log/25b80dbe-3ac8-11ed-b22c-00c0caafc7f0/mavros_test_node-3*.log ... ``` ## Building Custom MAVROS Applications --- Source: https://docs.modalai.com/misc-user-guides/ --- Source: https://docs.modalai.com/customize-sdk-installer/ It is possible to customize your SDK installer to do things like configure VOXL automatically during the SDK flashing process. This may be useful especially if you are manufacturing a large number of drones. This page will outline some possible ways to do this. ## The Post-Tweaks Method ### Overview Inside of each SDK tar archive is a folder called `post-tweaks`. In this folder you can add a bash script called `apply-tweaks.sh` containing any extra setup and configuration steps you may want run automatically. This script will be executed from within the `post-tweaks` directory by the top-level install.sh script after the normal SDK installation. Depending on the SDK you are trying to install, this script may already exist and contain something from ModalAI. You can also add files to this folder and `adb push` them to VOXL in the `apply-tweaks.sh` script. ### Example This `apply-tweaks.sh` script pushes an [extrinsics configuration](/configure-extrinsics/) file from the host computer and to VOXL's filesystem. It then sets this extrinsics file as VOXL's new extrinsics configuration. Finally, the script configures VOXL's camera setup (`7` means ToF + Stereo + Tracking cameras). This example might be useful, for example, if you are designing a drone with a custom camera configuration, and need to flash the latest firmware to a large number of drones. ```bash #!/bin/bash adb shell "rsync -r /share/qualcomm-proprietary/usr/ /usr" echo echo "Configuring Extrinsics" adb push custom_extrinsics_file.conf /etc/modalai/ adb shell "voxl-configure-extrinsics custom /etc/modalai/custom_extrinsics_file.conf" adb shell "voxl-configure-cameras 7" echo echo "Rebooting" adb reboot adb wait-for-device echo "Done" ``` --- Source: https://docs.modalai.com/enabling-file-encryption/ # Background VOXL2 supports hardware-based file encryption which can be enabled without any changes in the Kernel. `Fscrypt` software is used to encrypt folders and files. - each top-level encrypted folder uses a separete encryption key - sub-directories, file contents, file names, and symbolic links are encrypted - timestamps, file sizes, number of files, and extended attributes are not encrypted # Setup - Check which device is mounted as the root file system (`/`). In this case, it is `/dev/sda9` ``` voxl2:/$ mount /dev/sda9 on / type ext4 (rw,relatime) ... ``` - Confirm that the file system uses page-sized blocks (both should be 4096): ``` voxl2:/$ tune2fs -l /dev/sda9 | grep "Block size" Block size: 4096 voxl2:/$ getconf PAGE_SIZE 4096 ``` - Enable encryption on the device that corresponds to the desired (`/`) partition ``` voxl2:/$ tune2fs -O encrypt,stable_inodes /dev/sda9 tune2fs 1.44.3 (10-July-2018) ``` - Set up fscrypt tool ``` fscrypt setup ``` - Check `fscrypt` status ``` voxl2:~/$ fscrypt status filesystems supporting encryption: 1 filesystems with fscrypt metadata: 1 MOUNTPOINT DEVICE FILESYSTEM ENCRYPTION FSCRYPT / /dev/sda9 ext4 supported Yes ... ``` # Usage - Create an empty directory ```bash mkdir /home/root/encrypted_folder ``` - Encrypt new directory - The directory has to be created first, encrypted and then files and sub-directories that are added will be automatically encrypted ``` voxl2:~$ fscrypt encrypt /home/root/encrypted_folder/ Should we create a new protector? [y/N] y The following protector sources are available: 1 - Your login passphrase (pam_passphrase) 2 - A custom passphrase (custom_passphrase) 3 - A raw 256-bit key (raw_key) Enter the source number for the new protector [2 - custom_passphrase]: 2 Enter a name for the new protector: my_new_protector Enter custom passphrase for protector "my_new_protector": Confirm passphrase: "/home/root/encrypted_folder/" is now encrypted, unlocked, and ready for use. ``` - Check status of the encrypted directory ``` voxl2:~$ fscrypt status /home/root/encrypted_folder/ "/home/root/encrypted_folder/" is encrypted with fscrypt. Policy: e33179f4c202cd56b8bf5bd173299072 Options: padding:32 contents:AES_256_XTS filenames:AES_256_CTS policy_version:2 Unlocked: Yes Protected with 1 protector: PROTECTOR LINKED DESCRIPTION 6d14bd87c1bad978 No custom protector "my_new_protector" ``` - Create a test file in the encrypted (unlocked) directory ``` voxl2:~$ cd encrypted_folder/ voxl2:~/encrypted_folder$ echo "encryption test" > test.txt voxl2:~/encrypted_folder$ more test.txt encryption test ``` - Reboot VOXL2 or lock the folder ``` voxl2:~/encrypted_folder$ ls test.txt voxl2:~/encrypted_folder$ cd ../ voxl2:~$ fscrypt lock encrypted_folder "encrypted_folder" is now locked. voxl2:~$ cd encrypted_folder/ voxl2:~/encrypted_folder$ ls AAAAAAAAAAAFH2ySNPYji272kseHB,V930yZHVIT5RlMUU,rY3PLoA ``` - Unlock the encrypted folder ``` voxl2:~/encrypted_folder$ fscrypt unlock . Enter custom passphrase for protector "my_new_protector": "." is now unlocked and ready for use. voxl2:~/encrypted_folder$ ls test.txt voxl2:~/encrypted_folder$ more test.txt encryption test ``` --- Source: https://docs.modalai.com/voxl-libgphoto2/ # How To Stream and Control Popular DSLR Cameras to your VOXL-based Drone --- ## Overview [voxl-libgphoto2](https://gitlab.com/voxl-public/Deprecated/voxl-libgphoto2) enables streaming a live video feed from a wide range of digital cameras to [QGroundControl](http://qgroundcontrol.com/). The following software is used to make this possible. [gPhoto2](http://www.gphoto.org/) is a free, redistributable, ready to use set of digital camera software applications for Unix-like systems, supporting more than [2,500 cameras](http://www.gphoto.org/proj/libgphoto2/support.php). These cameras include popular options like Sony A6500, Panasonic DC-GH5, Nikon DSC, Nikon CoolPix, Canon PowerShot, and many more! [FFmpeg](https://ffmpeg.org/) is a complete, cross-platform solution to stream video. FFmpeg has a large number of options that can be used to tune the video stream to your liking. On top of the default video encoders, voxl-libgphoto2 supports software encoding using [libx264](https://trac.ffmpeg.org/wiki/Encode/H.264) and hardware encoding using [OpenMax](https://trac.ffmpeg.org/wiki/HWAccelIntro). ## Building voxl-libgphoto2 ### Installing necessary files ``` # On host PC $ git clone git@gitlab.com:voxl-public/voxl-libgphoto2.git $ cd voxl-libgphoto2 # With VOXL connected to host PC via. ADB $ ./push-files-to-target ``` ### Building Docker Image ``` # ADB over to VOXL $ adb shell # Enable station mode in order to download dependencies $ voxl-wifi station [ssid] [password] # Reboot to save changes $ reboot ``` After VOXL has rebooted ``` # ADB over to VOXL $ adb shell # Move to Docker directory $ cd /data/docker # Build Docker image $ docker build -t libgphoto2 libgphoto2/ ``` After build has completed, switch WiFi mode to SoftAP ``` $ voxl-wifi softap [SSID] # Reboot to save changes $ reboot ``` ## Hardware Setup In order to stream a video feed to QGroundControl, voxl-libgphoto2 requires the use of a Flight Core or VOXL Flight. The following additional hardware is required to stream video from a digital camera through VOXL to QGroundControl. | Part Number | Description | Link | | --- | --- | --- | | MCBL-00009-1 | USB Cable (Host, 4-pin JST to USB 2.0 Type A Female) | [Purchase](https://www.modalai.com/products/mcbl-00009) | Camera USB Cable | USB Cable included with camera e.g. (USB-C, Mini USB, Micro USB) | One of the following VOXL Add-on boards is required. | Part Number | Description | Link | | --- | --- | --- | | VOXL-ACC-MH | VOXL Microhard Modem Add-on | [Purchase](https://www.modalai.com/collections/voxl-add-ons/products/voxl-microhard-modem-usb-hub) | VOXL-ACC-HUB | VOXL USB Expansion Board with Fastboot and Emergency Boot | EOL | VOXL-ACC-LTEH | VOXL Cellular LTE and USB hub add-on | EOL - Before beginning setup, make sure the VOXL is disconnected from both it's power source and it's USB to host PC cable - Attach the add-on board to the VOXL and make sure that the boot switch(es) are turned off or to the left - Plug the jst side of the MCBL-00009-1 USB Cable into the add-on board - Plug the camera's USB cable into both the camera and the USB female side of the MCBL-00009-1 USB cable - Power the VOXL ![MH Standalone](/images/voxl-sdk/dslr-setup.jpg) ## Running voxl-libgphoto2 ### Starting Docker container Run a container with the following parameters in order to give voxl-libgphoto2 access to the camera via. it's USB port. ``` $ adb shell $ docker run -i -t --rm -v /dev/bus/usb/:/dev/bus/usb --net=host --privileged libgphoto2 ``` ### Testing gPhoto2 functionality The [gPhoto docs](http://www.gphoto.org/doc/manual/using-gphoto2.html) provide a good explanation on how to use the gPhoto command line interface Here are a few examples: ``` $ gphoto2 --list-ports Devices found: 4 Path Description -------------------------------------------------------------- ptpip: PTP/IP Connection ip: IP Connection serial: Serial Port Device usb:001,005 Universal Serial Bus ``` In this example we can see that gPhoto has detected a USB bus on the device. However, we cannot tell yet whether we will have write access to the USB device file your camera will be assigned by the operating system. The next step is to connect your camera and find out whether gPhoto can find it. This only works with USB. ``` $ gphoto2 --auto-detect Model Port ---------------------------------------------------------- Canon EOS 700D usb:001,005 ``` In this case, a camera called "Canon EOS 700D" has been detected on your system's USB bus. Next, we can test capturing and image. ``` $ gphoto2 --capture-image-and-download New file is in location /capt0000.cr2 on the camera Saving file as capt0000.cr2 Deleting file /capt0000.cr2 on the camera ``` This command can be used to take a picture and immediately save the image to the host Docker container instead of the camera. ### Streaming video using voxl-libgphoto2 In order to stream a live video feed from the digital camera to QGroundControl, use the following: ``` $ ./voxl-libgphoto2 192.168.8.XXX ``` The referenced IP address should be the IP address of the host PC running QGroundControl. - On the host system, while connected to the VOXL's WiFi network, run QGroundControl - In QGroundControl, press the purple QGC logo in the top left corner in order to access the `Application Settings` menu - Under the `General` tab, scroll down until you find the `Video` section - Under the `Video Source` dropdown, choose `MPEG-TS (h.264) Video Stream` - In the `UDP Port` field, enter the default port: `4242` - You will now be able to view the video stream under QGroundControl's `Fly` view ## Customizing FFmpeg parameters By default, voxl-libgphoto2 uses the following basic FFmpeg parameters, specified in the [voxl-libgphoto2.py](https://gitlab.com/voxl-public/Deprecated/voxl-libgphoto2/-/blob/master/voxl-libgphoto2.py#L42) script: ``` $ ffmpeg -i - -c:v libx264 -f mjpeg udp://192.168.8.XXX:4242 ``` These parameters can be modified to change the stream's encoder, resolution, bitrate, framerate, etc. as needed. ## ModalAI Tested Cameras The following cameras were tested by ModalAI and successfully used to stream video to QGroundControl: - Canon EOS 700D - Canon Powershot G7 X Mark III --- Source: https://docs.modalai.com/voxl-px4-user-guide-offboard-sensors/ --- Source: https://docs.modalai.com/voxl2-thermal-performance/ # VOXL 2 Thermal Performance and EMC > this is written with a soft tongue-in-cheek demeanor to keep the topic light and fun. This page will focus on some brief information and guidance to help hardware and system designers meet the thermal and EMC/EMI challenges most likely to occur. This is not a comprehensive list, and of course, we encourage feedback and other questions on our [Forum](https://forum.modalai.com/category/26/voxl-2). We hope to update this page often, and it's applicability will not be limited to just Voxl2, but rather, all hardware designs. It may move locations in the future as we author more and more application notes. --- ## Thermal Performance Thermal is a huge challenge, especially in tight spaces and with enormous compute power. We have decades of experience with thermal management, and the summary that best explains how to approach thermal design is this 4-step process: ### 1. Do not solve a problem you do not have. - This is the biggest mistake we see designers do. Prior experiences and peer led discussions and legacy designs lead many designers into instinctively wanting to add heat-sinks and thermal mass to a device that generates heat. This is a mistake. - Yes, there are times when heatsinks are needed, however do not forget what they do. - All a heatsink is trying to do is provide a good thermally conductive path for heat energy to be removed from the heat source and put someplace else benign. - Good heatsinks have a ton of surface area to aid in dissipation into the ambient/surrounding air. - Even a great heatsink needs airflow to move the heat energy off it. If there is no airflow, the ambient air provides very little thermal conductance, and the heatsink will effectively become a large thermal capacitor. So, it will certainly delay the onset of thermal performance degradation, but it will also sustain that degradation even when no new thermal energy is being added and take much longer to return to an ambient state. - In many instances, designers end up chasing their tail solving self-induced issues brought on by adding thermal mass (or any engineering “solution” needlessly added). One such item is EMC performance, especially if the heatsink was grounded. We know of instances where folks added a heatsink and then they failed FCC. Why? It was grounded incorrectly, and then became a noise radiator. Don’t be that designer. - So, how do you know if you need any thermal solution… item #2: ### 2. Test your use-cases first! - You must understand what your system is trying to achieve, and you need to know “what does success look like”. There are many use cases using our Voxl ecosystem and components that do not require any additional thermal mitigation techniques at all. It would be a shame to add more SWaP-C elements (size, weight, power, and cost) for no benefit whatsoever. - Our Voxl tools have comprehensive logging and monitoring features that will report temperatures, frame rates, RSSI, etc. You must log the important factors relevant for your design goals, and create the overlap of temperature changes to these performance metrics. You need to confirm if you are indeed experiencing thermal mitigation, or some other artifact, such as sub-optimal data paths (having overflows or re-tries due to pushing too much data into a slow data channel, such as 500Hz+ IMU data over I2C, or trying to push 1Gb links into USB2, and so forth), or over-constrained and/or buggy algorithms for your AI processing. - Get comfortable running tests. Just do it. A 10-20 minute test can open your eyes much more than weeks of design and analysis. Work with your SW team to automate and log results you need. ### 3. Give yourself options in your design. - Whether you need more thermal mass (in the form of a heatsink) or a fan (preferred), make sure you think through your design and give yourself the option to incorporate these elements later on, after you have tested your use-case and observe performance limitations brought upon by thermal throttling, and try them out one at a time and re-test. - Plan on a fan, where it can fit, and how to plug into the Voxl board. ### 4. Airflow, airflow, airflow (4th in this list of info, but this is “the” first way to solve it!) - Airflow is the single biggest factor for improved thermal performance, which is why every Voxl platform has a dedicated fan connector, and we sell a very convenient small 25mm x25mm 5V fan on our website that will plug directly into Voxl, Voxl-Flight, Voxl2, and Voxl2-Mini. https://www.modalai.com/collections/accessories/products/voxl-cooling-fan - If you want to add a heatsink into your design to improve thermal mass, you still should have a fan to blow the heat off of the fins. - You are making a drone, right? Use the prop-wash!!! Recall step #2 to test your use case? Add into your monitoring the overlap with active flight. You should try to add into your design the ability to deflect some of the drone’s prop-wash into the circuit areas, and you will find a tremendous boost in thermal performance. - We have a story about a very experienced thermal team, using the latest and greatest thermal modeling techniques ($100k+ software license add-ons, months of cad development, then months of simulations that took days to converge on each pass, etc.) and after 8-12 months of modeling and physical testing, they found that simply using the drone’s prop wash the most effective solution compared to high-end vapor chambers, heatsinks, or any passive thermal material, by many degrees C. We unfortunately cannot share that data, but it was an eye opener for many on that project that were convinced otherwise from their decades of experience in the mobile space. It took them over $1M to come to that conclusion. And now we all get to benefit from it. This is why ModalAI will always first push the claim of airflow before using any passive metal brick that WILL negatively impact flight time and your payload capability. - We understand that ground-based robots, or drones that may “perch look and listen” potentially in a solar loaded environment, will not benefit from active prop-wash. Therefore, know your use case, test for it, and be clever with ways to avoid that. Maybe reduced performance in that simple “perched” use case is OK? Then, you fly a bit to regain performance and perch back again. - Re-test and improve on your airflow. If you really think you still need a heatsink or even a heat spreader, then that’s OK. But, make sure you do not create additional issues, such as an EMC violation. Keep your thermal solutions passive, do not make them electrically conductive. ModalAI will help ensure you have all the 3D data you need to accurately design your thermal solution. If we do not have a 3D step file for a specific board on our website, please reach out to us on the [Forum](https://forum.modalai.com/category/26/voxl-2) and we will address it. ## EMC EMC is also a design and integration challenge, but one that can be methodically planned for in advance and solved with a careful set of actions. It is a system level challenge and may require mitigation in all areas of design, including hardware, mechanical, industrial design, and even software or use-case control. Much of the advice we can offer for EMC mitigation follows closely with the thermal design topic above. 1. Do not solve a problem you do not have. 2. Test your use-cases first! 3. Give yourself options in your design. 4. And, in the case of EMC, it’s all about proper PCB design and smart wire/cable management. We are confident ModalAI already handled the PCB design portion on our products by following tried-and-true techniques in the PCBs. This small topic brief will provide several pointers so you can provide the same level of EMC/EMI mitigation fundamentals into your custom designs, wire harnesses, and overall strategy. 1. The one difference between thermal management and EMI mitigation is that you must do some effort up-front in anticipation of issues, but do not go overboard. Even the most basic strategies can get you far. Many cheaply made electronic products less than $20 can pass FCC, so it’s not an insurmountable goal. Just take it slowly. The biggest thing to manage is unplanned radiators or antennas. If you think about those during the industrial design phase, the rest should go smooth. Do not plan in shielding everything and adding size and weight and assembly time into something you are not sure is needed. 2. Find your preferred certification lab that offers unofficial pre-screen testing time. You want to take your mock-up prototypes and run them under a similar testing environment with similar software builds to get a sense of where your margins are for the emissions masks, or if there are any mask limit violations so you can focus on what matters. This will be money well worth it. If your normal certification process is about $10-15K, you should be able to get pre-screen testing for a fraction of that. - If you have failures, use “sniffer” equipment to find the general area where the noise is coming from and focus on that spot. - If you already pass, do not make drastic changes in your cabling or that can result with a failure later. 3. The options you will need are to potentially fit shielding around certain cables (but not necessary all of them). You will need to think about cables that are either high current (like motor wires) or very high frequency, such as USB3 and MIPI-CSI cables. Most UART/SPI/I2C etc. low-speed cables will not be a problem if you keep simple point-to-point connections cleanly routed. - Do not always plan on shielding if you can avoid it. Shielding is a way to stop radiated noise from reaching certain areas but is not the solution for the “source” of the noise. It’s best to always target the source of the noise (i.e.: the aggressor or radiator) so that if you can improve your design there, you will not need shielding. 4. PCB Design Tricks and Cable Management ModalAI has already followed these PCB design strategies in all our designs, but if you are making custom PCBs, please follow these guidelines (all steps are ways to reduce the risk of creating unplanned radiators): - Always have ground planes (4-layer+ boards). Just because you can route a design on 2-layers, does not mean it’s a good idea. If you have any 2-layer PCBs in your system, and you fail any certification, target those first. - Do not route high-speed or high-current signals along the PCB edge. Use Ground floods to fill in the route layers and try to create a full boundary of ground around those layers. - Do not “t-route” any signals if you can avoid it. Not only will this help with signal integrity, but it will reduce noise in the PCB. Some architectures, like DDR, are meant for this type of routing and provide guidelines for success. But for general purpose routing, always try to avoid it. - Manage your ground and power planes carefully. - - Always make sure every flood has multiple vias in it and you do not create “antenna islands”, such as a ground shape that only has one via on one side. This is a perfect antenna and will radiate all noise within it’s frequency response characteristics. - - Be sure to have close (thin) dielectrics on high-power planes and controlled impedance layers. This will optimize plane capacitance and keep signal inductance low. - Do not use grounded or metal hardware (screws/washers/spacers). - - All ModalAI PCBs have mounting holes that are non-plated and we provide nylon hardware where we can. Do not make your custom hardware have grounded mounting holes or use metal hardware unless you have an entire EMC team that can help guide you through this delicate process. Most likely doing this creates ground loops and antennas, wreaking havoc on your system. - Shields for GPS/GNSS, or other areas of highly sensitive circuits, do not need to be grounded. In most cases, just a floating chunk of metal is enough to block noise. If you ground them you risk more problems. Be sure to give your design an option to remove ground connections from shields. - If you must use Earth-GND or Chassis-GND in your setup, you will need to work with your EMC/Radiation/Compliance SME (Subject Matter Experts) on ways to implement this at the entire system. Keep in mind, Drones or ground-based robots operate on batteries, and much like mobile phones, do not have a true “earth-ground” reference. Trying to add one in (at DC) can prevent the system from operating properly. In all cases across ModalAI’s hardware descriptions, pin tables, schematics, these app notes, etc., when we refer to “ground” we imply signal return, not Earth-Ground. We will indicate otherwise. - Use ground planes in flexes and add EMI coating. Most of our flexes have these. The only ones that may not have them are short runs leading directly into the image sensors, but any longer run and extension flex certainly has the coating. We will provide more info on this in the image sensor design guidelines page. - With cables, the most common issue is turning conductive noise that would normally stay local on a PCB or circuit, and then the cable acts as an antenna allowing it to radiate. Cable strategies are hard to change once implemented, so be sure to follow these techniques up-front in order to reduce the impact of changes: - Not all cables need to be shielded, but any cable will benefit from twisted pair techniques. Some of our cables we sell have twisted pairs just on the high-speed differential conductors, but it is OK and advisable to twist every signal wire with another cable conductor of its class. 1. i.e.: you can twist UARTs together, or I2C lines together, or Power and Ground, but do not twist a UART with an SPI, or an I2C with a power wire, etc. 2. The goal is to have signal edges that occur at the same time provide equal and opposite noise effects, creating destructive interference. That cannot happen if the interfaces are noncoherent. 3. Some mechanical designs benefit from having cables twisted to maintain routing control (so they do not fray or vibrate), so be sure to work with your ME to track these efforts. In this case, you can twist a UART with an I2C, or other, but you will not get any noise reduction benefits. Do not twist power with highly sensitive signals or you can impact performance. - Do not lay cables directly above or over any PCB, IC, or power circuit. Make sure that all cables egress from their connector and immediately go away from the electronics or sources of high noise. What can happen in this case is the cable can pick up near-end radiated noise from the IC/High current emanator, and then the cable will re-radiate that noise elsewhere in the system turning it into far-end radiation. If you must lay a cable across a high-noise source, then you may need to plan on shielding that cable in that location or try to place as much of an air gap as possible. Be careful you do not create active ground connections potentially shorting out the PCB/circuit. --- Source: https://docs.modalai.com/voxl-other-software/ --- Source: https://docs.modalai.com/cpp-dev-environment/ # Setting up a C/C++ Dev Environment ## Introduction A large share of the ModalAI software stack is written in C/C++ and so if you intend to develop applications for VOXL there's a decent chance you'll need to use the language. However, C/C++ is a complicated language with a very dated build system, and as such editors like VSCode can struggle to understand these projects out of the box leading to a ton of red squiggles and errors while trying to work on the project. In addition to being visually distracting, this also massively limits the functionality of these modern IDEs: features like code completion function lookup/referencing will all mostly struggle to work. In this document, I'll outline the main ways you can set up a development environment for C/C++ to make working with the VOXL SDK a breeze. ## Setup Start by downloading VSCode from their [downloads page](https://code.visualstudio.com/download). Also make sure to install the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) extensions as both will be needed to get the environment set up correctly. Also make sure to [set up voxl-cross](/voxl-docker-and-cross-installation/) so that you'll have the container to build in. ## Process * Open a terminal and launch the `voxl-cross` container using `voxl-docker -i voxl-cross`. Make sure to launch this in a directory above or at the project you intend to work on (e.g. don't runt his command in `~/git/voxl-portal/src` if you intend to work on `~/git/voxl-portal/`). * Open VSCode and `CTRL+Shift+P` to open and find the option `Dev Containers: Attach to Running Container...`. This will prompt you to pick a running container, you should pick the one corresponding to the `voxl-cross` instance you just spun up. From here you can use `File > Open Folder` to open up the project you want to work on. * Open up `CMakeLists.txt` at the root of the project you're working on and look for the line `set(CMAKE_EXPORT_COMPILE_COMMANDS ON)`. If it isn't already in the `CMakeLists.txt` file, add it! This line generates a `.json` file that tells the `C/C++` extension how to interpret our project. * Go back to the terminal with `voxl-cross` in it and navigate to your project. Then run `./clean.sh`, `./install_build_deps.sh qrb5165 dev` and finally `./build.sh`. Now check the `build64` directory that was created in your project. Inside there should be a file called `compile_commands.json`. * At the root of your project, run `mkdir .vscode && cd .vscode && touch c_cpp_properties.json`, then open this `c_cpp_properties.json` file. Paste the following content: ``` { "configurations": [ { "name": "Linux", "compileCommands": "${workspaceFolder}/build64/compile_commands.json", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 } ``` And you should be set! A few things to keep in mind: * Every time you shut down `voxl-cross` and restart it, you'll need to re-run the `./install_build_deps qrb5165 dev` command to re-install the build dependencies for the project * These setup steps only apply to this project. If you go to another project you'll need to do the same process as above. Fortunately you can just copy your `.vscode` dir around for easier access. * If you change to a 32-bit build system the link to the compile commands file may change. The command `find . -name "compile_commands.json"` can help you get the right path to that file so you can update your `c_cpp_properties.json`. --- Source: https://docs.modalai.com/voxl-portal-via-adb/ # Accessing VOXL Portal via ADB ## Introduction The [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) package provides an embedded webserver on VOXL. It enables camera inspection and other debug tools all via web browser interface at your VOXL’s IP address. See [here](/voxl-portal/) for more info. By default, portal can be accessed by navigating to a drone's IP address in one's browser. This requires a network connection from the drone to the host PC via an IP link, like WiFi. Starting with SDK 1.3.5, portal can be accessed using an ADB connection alone! ## Setup In order to accomplish this, we can take use of ADB's port forwarding ability. Port forwarding is a networking technique that allows external device to access services on a private network. It works by directing incoming traffic on a specific port of a router or firewall to a particular device and port within the local network. `adb forward` allows a user to forward TCP traffic on a port from the device (VOXL 2) to one's host PC. voxl-portal's webserver runs on port 80, we can use `adb forward` in order to send TCP traffic to our host PC's network on port `8080` with the following: ```bash adb forward tcp:8080 tcp:80 ``` ## Usage Now that voxl-portal's TCP traffic is being forwarded to our host machine, we can navigate to our browser and go to: http://localhost:8080/ ![voxl portal via adb](/images/voxl-sdk/voxl-portal/voxl-portal-via-adb.png) All of voxl-portal's pages can be accessed as usual: ![voxl portal via adb cameras](/images/voxl-sdk/voxl-portal/voxl-portal-via-adb-cameras.png) Unfortunately, this port forwarding must be started each time the ADB server is run. However, what we recommend is setting up an alias in your terminal emulator to automatically run this forwarding so you don't have to start it up each time. Add the following to your `~/.bashrc` file (`~/.zshrc` for zsh) ``` alias voxl='adb wait-for-device && adb forward tcp:8080 tcp:80 && adb shell' ``` Restart your terminal and run `voxl`, you will both ADB onto your drone as well as enable the ability to access voxl-portal via. your browser without an external network connection. ## Helper Batch File for Windows Pre-requisites: - ADB installed - Device connected to ADB via USB [Windows Batch File](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal/-/blob/dev/scripts/voxl-portal-via-adb-ip-win.bat) --- Source: https://docs.modalai.com/qgc-via-adb/ # Accessing QGC via ADB ## Table of Contents 1. TOC Enabling NCM on VOXL 2 for QGC over UDPThis doc assumes you have basic familiarity with setting up QGC This change will require system image changes in the future, but for now we'll just need to do a one time target side setup. The host side configuration should be done every time the target device is connected to the host machine (reboots, unplug-replug usb device, etc) Requires [SDK 1.6.3](/voxl-sdk/) or newer # Target Side Configuration (One time setup) Make sure the device is booted and ADB is available. The following commands should be ran on target Begin by configuring the usb gadget setup script that Qualcomm has already provided us. This command should be ran on target ```sed -i '/ln -s functions\/ffs.adb configs\/c.1\/f2/a \ ln -s functions\/ncm.0 configs\/c.1\/f3 2>\/dev\/null | true' /sbin/usb/compositions/901D``` Next setup a udev rule to give our NCM device a static IP (192.168.7.2) ```echo 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb0", RUN+="/bin/sh -c '"'"'sleep 2; /sbin/ifconfig usb0 192.168.7.2 netmask 255.255.255.0 up'"'"'"' > /etc/udev/rules.d/80-usb-ncm.rules``` Finally reboot the device, if everything is setup correctly you should now see a usb0 network interface with the static ip we assigned ``` voxl2:/$ ifconfig usb0 usb0: flags=4163 mtu 1500 inet 192.168.7.2 netmask 255.255.255.0 broadcast 192.168.7.255 inet6 fe80::935f:1a09:ab1d:d2fb prefixlen 64 scopeid 0x20 ether 56:77:2d:6c:84:9b txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` # Host Side Configuration On the host side you should see a new usb0 network interface appear ``` ❯ ifconfig usb0 usb0: flags=4098 mtu 1500 ether fa:74:5a:f3:2b:88 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` Begin by bringing up the usb0 interface and setting a static IP for the host (192.168.7.1) ```bash sudo ip addr add 192.168.7.1/24 dev usb0 sudo ip link set usb0 up ``` In order to make the above permanent set the following on the host machine: ![qgc-host-config.jpg](/images/voxl-sdk/qgc/qgc-host-config.jpg) You can validate that this worked by pinging the target side IP ``` ❯ ping 192.168.7.2 -c 3 PING 192.168.7.2 (192.168.7.2) 56(84) bytes of data. 64 bytes from 192.168.7.2: icmp_seq=1 ttl=64 time=4.12 ms 64 bytes from 192.168.7.2: icmp_seq=2 ttl=64 time=3.90 ms 64 bytes from 192.168.7.2: icmp_seq=3 ttl=64 time=3.94 ms --- 192.168.7.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 3.900/3.986/4.119/0.095 ms ``` # Getting QGC Working Finally load up QGC and setup a new comm link with the following settings ![qgc-get-working.jpg](/images/voxl-sdk/qgc/qgc-get-working.jpg) Save the config and connect to the device. You're now ready to go! --- Source: https://docs.modalai.com/voxl-2-opencl-in-docker/ # Using OpenCL inside a Docker Container on VOXL2 ## Introduction OpenCL can be used within a Docker container on VOXL2 after following the correct setup instructions. ## Create a New Directory on VOXL2 ```bash cd /home/root/ mkdir -p opencl-docker/deps cd opencl-docker/deps ``` ## Generate the Required Dependencies using VOXL2 Native OS ```bash apt install dpkg-repack dpkg-repack qti-adreno dpkg-repack libcutils0 dpkg-repack libsync dpkg-repack qti-libion dpkg-repack liblog0 ``` You should have the following deb packages in `opencl-docker/deps`: ``` ls opencl-docker/deps libcutils0_0-r1_arm64.deb liblog0_1.0-r1_arm64.deb libsync_1.0-r1_arm64.deb qti-adreno_1.0-r0_arm64.deb qti-libion_0-r1_arm64.deb ``` ## Install Docker on VOXL2 - follow official instructions https://docs.docker.com/engine/install/ubuntu/ , specifically: ``` curl -fsSL https://get.docker.com -o get-docker.sh chmod +x get-docker.sh ./get-docker.sh ``` ## Create a `Dockerfile` with the following contents in `opencl-docker` directory ``` FROM arm64v8/ubuntu:22.04 # Install necessary dependencies RUN apt-get update && \ apt-get install -y \ cmake \ build-essential \ libglib2.0-0 COPY deps /opt/deps ## Create required directory for qti-adreno install RUN mkdir /usr/include/KHR RUN dpkg -i /opt/deps/*.deb ``` ## Build the Docker Image ```bash cd opencl-docker docker build -t opencl-docker:latest . ``` ## Create a Test Application Create a source file `opencl-query.c` with the following contents ``` #include #include #include int main() { int i, j; char* value; size_t valueSize; cl_uint platformCount; cl_platform_id* platforms; cl_uint deviceCount; cl_device_id* devices; cl_uint maxComputeUnits; // get all platforms clGetPlatformIDs(0, NULL, &platformCount); printf("OpenCL platform count: %d\n",platformCount); platforms = (cl_platform_id*) malloc(sizeof(cl_platform_id) * platformCount); clGetPlatformIDs(platformCount, platforms, NULL); for (i = 0; i < platformCount; i++) { // get all devices clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &deviceCount); printf("OpenCL device count: %d\n",deviceCount); devices = (cl_device_id*) malloc(sizeof(cl_device_id) * deviceCount); clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, deviceCount, devices, NULL); // for each device print critical attributes for (j = 0; j < deviceCount; j++) { // print device name clGetDeviceInfo(devices[j], CL_DEVICE_NAME, 0, NULL, &valueSize); value = (char*) malloc(valueSize); clGetDeviceInfo(devices[j], CL_DEVICE_NAME, valueSize, value, NULL); printf("%d. Device: %s\n", j+1, value); free(value); // print hardware device version clGetDeviceInfo(devices[j], CL_DEVICE_VERSION, 0, NULL, &valueSize); value = (char*) malloc(valueSize); clGetDeviceInfo(devices[j], CL_DEVICE_VERSION, valueSize, value, NULL); printf(" %d.%d Hardware version: %s\n", j+1, 1, value); free(value); // print software driver version clGetDeviceInfo(devices[j], CL_DRIVER_VERSION, 0, NULL, &valueSize); value = (char*) malloc(valueSize); clGetDeviceInfo(devices[j], CL_DRIVER_VERSION, valueSize, value, NULL); printf(" %d.%d Software version: %s\n", j+1, 2, value); free(value); // print c version supported by compiler for device clGetDeviceInfo(devices[j], CL_DEVICE_OPENCL_C_VERSION, 0, NULL, &valueSize); value = (char*) malloc(valueSize); clGetDeviceInfo(devices[j], CL_DEVICE_OPENCL_C_VERSION, valueSize, value, NULL); printf(" %d.%d OpenCL C version: %s\n", j+1, 3, value); free(value); // print parallel compute units clGetDeviceInfo(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(maxComputeUnits), &maxComputeUnits, NULL); printf(" %d.%d Parallel compute units: %d\n", j+1, 4, maxComputeUnits); } free(devices); } free(platforms); return 0; } ``` ## Build the Test Application ``` gcc -O2 -Wall -o opencl-query opencl-query.c -lOpenCL ``` ## Run the Test App Outside Docker ``` voxl2:~/opencl-docker$ ./opencl-query OpenCL platform count: 1 OpenCL device count: 1 1. Device: QUALCOMM Adreno(TM) 1.1 Hardware version: OpenCL 2.0 Adreno(TM) 650 1.2 Software version: OpenCL 2.0 QUALCOMM build: commit # changeid # Date: 11/10/21 Wed Local Branch: Remote Branch: Compiler E031.37.12.01 1.3 OpenCL C version: OpenCL C 2.0 Adreno(TM) 650 1.4 Parallel compute units: 3 ``` ## Spin up a Docker Container - `--privileged` flag maps all the linux devices to the container - if this is a concern, the `--privileged` flag can be replaced with `--device=/dev/kgsl-3d0 --device=/dev/ion` ```bash docker run -it --rm --privileged -v `pwd`:/opt/code -w /opt/code opencl-docker:latest bash ``` ## Run the Test App Inside the Docker Container ``` root@f23c81c4a254:/opt/code# ./opencl-query OpenCL platform count: 1 OpenCL device count: 1 1. Device: QUALCOMM Adreno(TM) 1.1 Hardware version: OpenCL 2.0 Adreno(TM) 650 1.2 Software version: OpenCL 2.0 QUALCOMM build: commit # changeid # Date: 11/10/21 Wed Local Branch: Remote Branch: Compiler E031.37.12.01 1.3 OpenCL C version: OpenCL C 2.0 Adreno(TM) 650 1.4 Parallel compute units: 3 ``` --- Source: https://docs.modalai.com/emi-mitigation-for-gnss/ # EMI Mitigation for GNSS Applications This page focuses on the analysis of EMI sources which can affect GNSS performance on ModalAi Starling 2 and Starling 2 Max UAVs. We provide a list of components, means of testing, results and solutions. Please note that in some cases, the solution is to remove the particular component due to the severity of the interference. The combined interference of all the components with GNSS signal is quite substantial, in many cases rendering GNSS unusable on these vehicles. For this reason, Starling 2 and Starling 2 Max are no longer advertised as equipped with GNSS receivers, although the products may still ship with GNSS receivers. Nevertheless, the analysis provides guidance how to work towards achieving much improved GNSS performance. In some cases, simply disabling components that are not needed or upgrading mechanical mount is sufficient to make quick progress. Additional discussion of the topic can be found on our [Forum](https://forum.modalai.com/category/2/ask-your-questions-right-here) --- # Background ## Summary of Main EMI Sources | Component | EMI Severity | Solution | Notes | | :--- | :--- | :--- | :--- | | **TOF Sensor** | **High** | Disable for outdoor use | TOF is for indoor use | | **Hires Camera (IMX412)** | **High** | PLL settings update | TODO | | **Lepton Camera** | **High** | Disable, unplug | (or move away from GNSS) | | **RC Transmitter** | **High** | Move at least 2-3 meters from vehicle | -- | | Wifi Adapter | Medium | Move away from GNSS antenna | Especially on Starling 2 | | RC Receiver | Low | Move antenna away from GNSS antenna | 1-2 dB drop w/ telemetry enabled | | CPU Frequency | Low | Avoid 1574.4Mhz | TBD, force perf mode, modify governor | | M0173 Camera Front End | Low | None | Some concern with 25Mhz clock | | Tracking Camera (AR0144) | None | None | -- | | LTE Add-on (M0130) | None | Note | May need more testing | | ESC (M0129) | None | None | -- | ## TOP Suggestions For Improving GNSS Performance - Disable TOF sensor (in `voxl-camera-server.conf`) - Elevate the GNSS receiver, if possible - Upgrade GNSS receiver with larger antenna + larger ground plane - Move any other antennas away from the GNSS antenna (including wifi module) - Do not use RC Transmitter in close proximity to the GNSS receiver - (Temporarily) disable some or all cameras for testing ## Information About Satellite Signal Strength - GNSS Receivers are very sensitive to interference, especially around L1 frequency band (1575Mhz) - Minimum usable SNR is 25-30dB, maximum SNR is around 50dB - Maximum observable SNR of any satellite depends on its elevation (higher SNR when satellite is right above) - At least 30dB is required to download the full Ephemeris from each satellite - At least 4 satellites (30+dB) are required for an initial 3D lock - Weather conditions (cloud cover, etc) will affect satellite SNR - In good conditions (no significant interference), a GNSS receiver should get a 3D lock in 30 seconds or less (from cold start) - Many GNSS receivers are equipped with a small back-up battery, which helps the receiver store the recent GNSS satellite info - Warm start after a recent lock may only take a few seconds - Therefore, initial lock time should not be used as a metric of signal quality during repeated tests within a short period of time, unless a cold start has been explicitly commanded - It is common to observe 2-4 satellites around or above 45dB (per constellation) when the GNSS receiver operates properly - note that this is highly dependent on the satellite locations, but if the maximum SNR observed is 40 (or even 35), that is a sign of a (big) issue ## GNSS Receiver Used For Testing - Ublox Max M10S (standard in Starling 2 and Starling 2 Max) ## Notes on Testing - Satellite locations are constantly changing (GNSS satellites are not geo-stationary), therefore one cannot directly compare SNR levels from different tests, unless the tests are performed concurrently - using an additional GNSS receiver (free of any interference) is good practice. Use a similar receiver as device under test or another (official EVK from Ublox, etc) - Effect of EMI on SNR is not additive. For example, if there are two sources that individually cause a 10dB drop in SNR, it does not mean that having both EMI sources present will result in 20dB SNR drop ## Applicable Vehicles - ModalAI Starling 2 - ModalAI Starling 2 Max # EMI Sources ## TOF Sensor - Note that TOF sensor starts streaming data as soon as camera server starts, even if there are no stream clients - the data is discarded if there are no camera stream clients - Significant source of EMI (5-20dB). Do not use with GPS - the SNR drop is correlated with the sensor FPS and the maximum IR emitter time (which is set using `exposure_max_us` in `voxl-camera-server.conf`) Testing done by enabling the TOF sensor in camera server config, starting `voxl-camera-server` and optionally running `voxl-inspect-tof` **Solution:** Disable the TOF sensor in `voxl-camera-server.conf` by setting `"enabled"` property to `false` ## Lepton Sensor connected to M0173 - With Lepton in streaming mode, signal drops 5-10dB when Lepton is right next to GPS receiver, less if farther away - only when voxl-lepton-server is running - i2c communication with lepton has no effect - Changing SPI bit rate has some effect, but Lepton has limitations on SPI bit rate - Further investigation: figure out if SPI or Lepton itself is emitting the EMI **Solution:** do not run voxl-lepton-server or disconnect the Lepton sensor ## Hires Cameras (IMX412) - There are up to two IMX412 cameras on Starling2 Max (front and rear) - Strong interference observed (10-20dB, especially from rear hires camera) - camera server must be running and camera stream active (not idle) - interference depends on the camera **PLL settings, image resolution and FPS** - larger interference observed with fpv_misp and eis drivers for IMX412 due to higher clock rates than original driver - original driver can be found on voxl2 in `/usr/share/modalai/chi-cdk/imx412/` - interference depends on exposure and gain (likely affects the noise due to type of data being sent from camera) - Running `voxl-camera-server` without any stream clients does not start the cameras and does not cause any interference - ** Ongoing investigation to evaluate different camera PLL settings and camera shielding ** **Solution:** TBD change PLL setting of the camera shield the cameras ## RC Transmitter - RC transmitter (Commando 8) in proximity of GPS receiver - Even though the Transmitter frequency is in the 900Mhz band, it interferes with GPS L1 **Solution:** Transmitter needs to be at least 2-3 meters to avoid interference ## USB Wifi Dongle - Starling 2 has the wifi dongle sitting right under the GNSS receiver / antenna - interference observed when the wifi adapter is active - moving wifi dongle serveral inches away from the GNSS receiver resolves the issue - Starling 2 Max should not be affected because the Wifi dongle is already mounted at the bottom - Loading up the WIFI link increases the interference, see test example using `iperf` - The EMI could be coming from the antenna or the PCB, in case of a small wifi adapter, it is impossible to tell **Solution:** disable wifi dongle or move it as far away from GNSS receiver / antenna as possible ## RC Receiver - When telemetry is enabled, initial tests show 1-2 dB drop **Solution:** If possible, move the RC Rx antennas farther from the GNSS receiver / antenna ## CPU clock frequency - CPU cores 4-6 have available frequency of 1574.40Mhz, which is very close to GPS L1 frequency of 1575.42Mhz - Test: fix cpu frequency to 1574.4Mhz, load the cpu cores and observe the satellite SNR in `voxl-portal` - See below for a test script to stress test cores at a certain frequency - It appears that setting cores 4-6 to frequency 1574400 and running a stress test, the SNR drops by 2-5 db. Frequencies one notch up or down from 1574400 do not cause any interference ( 1478400 and 1670400) - Placing GNSS module right next to QRB5165 SIP does produce noticeable interference, however if the GNSS module is in the back (the original location on Starling 2 Max), observing 2-5 dB drop during CPU stress test with cores 4-6 set to 1.5744Ghz. - This most likely implies that the EMI is coming from PMIC (located in the back of VOXL2) or the power wiring - Note that hitting that exact frequency is not likely, however it would be nice to guarantee avoiding this frequency **Solution:** - Set cpu mode to perf mode will force all cores to the max frequency - Set minimum (or maximum) frequency for cores 4-6 above (or below) 1574400 - Blacklist 1.5744 Ghz - how? ## M0173 Camera Front End - X1 25Mhz xtal and U7 high speed buffer - are needed for providing a 25Mhz clock for Lepton camera - 25Mhz clock is provided to Lepton via the 8-pin connector - There is some EMI at 1575Mhz, observed using an RF spektrum analyzer - it seems there is no effect at all on SNR, GNSS receiver is filtering it out - fixed frequency uniform interference is easier to deal with - Tested by wiring a on/off switch to the whole Lepton power (including clock) - lepton power and clock can be cycled on / off while observing satellite SNR **Solution:** not needed. unplug the 8-pin Lepton cable from M0173 just in case - Removal of R13 on M0173 completely disables the Lepton functionality, including the 25Mhz clock - Future variants of this board will be able to control Lepton power and clock via SW ## Tracking Cameras (AR0144) - Test: run voxl-camera-server and stream both tracking camera feeds - use either `voxl-portal` to view the images or `voxl-inspect-cam` to trigger the stream - no interference observed **Solution:** not needed ## LTE Add-on (M0130) - Based on customer testing, disabling the power to the LTE card via GPIO has not resulted in any improvements **Solution:** none required? ## ESC (M0129) - ESC used in Starling 2 and Starling 2 Max is ModalAI M0129 - Tests: observe GNSS SNR using `voxl-portal` while testing elements involving Modalai ESC - Move an idling ESC (no UART comms, powered externally) next to GNSS antenna (5cm apart, do not block antenna) - No observed effect on the satellite SNR from the ESC board, excluding active UART - Using Starling 2 Max, stop and start voxl-esc px4 driver to stop and start UART communication: ``` px4-qshell voxl_esc stop px4-qshell voxl_esc start ``` - No observed effect on the satellite SNR from UART communications (2mbps) **Solution:** none required # Modifications and Upgrades The following modifications will help improve the GNSS signal quality ## Mechanical Modifications - Move GNSS receiver as far as possible from electronics that emits EMI - use a 4-6-inch mast in the center (above roll cage) or in the back - need a longer 6-pin cable or an extension for GNSS receiver - use a copper ground plane under the GNSS receiver - optionally, use the upgraded GPS mast from Starling 2 Max V3 (CAD available), no need for longer cable - CAD available [here](https://downloads.modalai.com) - Twisted GPS cable routed to the side of the VOXL2 board generally performs better - Do not run cables on top of potentially noisy components like CPU, PMIC, etc - Shield cameras (TBD) ## GNSS Receiver Upgrade - use another GNSS receiver with a larger antenna and / or ground plane - suggested PCB / Ground plane size : > 35mm - note that using a custom ground plane right under the antenna may de-tune the antenna ## Thermal Considerations - Unless the GNSS receiver is equipped with a TCXO (Temperature Compensated Crystal Oscillator), rapid changes in the oscillator's temperature will introduce a temporary frequency bias, which will reduce SNR and solution quality. - If the vehicle is operating in environments, where temperature can change rapidly, consider enclosing the GNSS receiver to slow down the temperature change, so that the GNSS receiver can track the frequency bias quickly enough. # Recomendations for Starling 2 - Disable the TOF camera in `voxl-camera-server.conf` - Unplug the 8-pin Lepton cable from M0173 (just to be sure Lepton sensor is not used) - move the Wifi adapter from under the GPS receiver - in order to do this, it may be best to upgrade M0141 to M0151 USB breakout (for more flexibility) - choose M0151 board + cables (will get a USB3.0 cable), alternatively get MCBL-00009 or MCBL-00041 for USB2.0 (to save weight) - make sure the gps cable is twisted (not too tight) and is not routed over the VOXL2 board (route along the side) - route the cable along the side of the GPS mast - upgrade GNSS receiver to one with larger antenna and larger ground plane, if possible # Recomendations for Starling 2 Max - Disable the TOF camera in `voxl-camera-server.conf` - Unplug the 8-pin Lepton cable from M0173 (just to be sure Lepton sensor is not used) - Remove wifi dongle if wifi not used, otherwise perform testing to make sure wifi is not interfering with GPS - if interference detected, move the wifi adapter farther from GNSS antenna - install a new mast that is shipping with Starling 2 Max V3 (CAD provided) - making the mast taller should help, but will need a longer power/uart/i2c cable - make sure the gps cable is twisted (not too tight) and is not routed over the VOXL2 board (route along the side) - route the cable along the side of the GPS mast - upgrade GNSS receiver to one with larger antenna and larger ground plane, if possible - modify the new GPS mast (from Starling 2 Max V3) to fit the new receiver # Testing Notes and Tips It is recommended to begin testing with as many components disabled as possible with the goal of establishing a baseline of high satellite SNR. After achieving the baseline, start turning on and testing other components that are required for vehicle operation. ## How to view live satellite signal strength (SNR) - Make sure PX4 service (`voxl-px4`) is running - use `voxl-portal` to open the GPS debug page (Debug -> GPS tab) ## Disable power (VBUS) to the USB port used by the wifi dongle on Starling 2 / Max - pin GPIO_157 controls VBUS, which is USB power on VOXL2 - to disable, run `voxl-gpio write 157 0` - to enable, run `voxl-gpio write 157 1` ## Power Down 5G modem (when using M0130) - Full card power OFF (almost as if it is not installed) via GPIO_1 - to disable, run `voxl-gpio write 1 0` - to enable, run `voxl-gpio write 1 1` ## GNSS PX4 debug tools (command line) - make sure PX4 is running - get overall GNSS state and status: `px4-listener sensor_gps` - view raw satellite SNR: `px4-listener satellite_info` ## How to test a GNSS receiver without VOXL2 - use a serial-to-usb adapter to connect GND, 5V, TX and RX and use Ublox Ucenter ## Stress Testing Wifi - install iperf on a linux host and VOXL2: `(sudo) apt install iperf` - run on linux host : `iperf -s` - run on voxl2 : `iperf -c ` - look for any changes in SNR when transitioning between idle and running the test ## How to Query Available CPU Core Frequencies - List available cpu frequencies on Voxl2 (qrb5165). Units are Khz. ``` cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies 300000 403200 518400 614400 691200 787200 883200 979200 1075200 1171200 1248000 1344000 1420800 1516800 1612800 1708800 1804800 300000 403200 518400 614400 691200 787200 883200 979200 1075200 1171200 1248000 1344000 1420800 1516800 1612800 1708800 1804800 300000 403200 518400 614400 691200 787200 883200 979200 1075200 1171200 1248000 1344000 1420800 1516800 1612800 1708800 1804800 300000 403200 518400 614400 691200 787200 883200 979200 1075200 1171200 1248000 1344000 1420800 1516800 1612800 1708800 1804800 710400 825600 940800 1056000 1171200 1286400 1382400 1478400 1574400 1670400 1766400 1862400 1958400 2054400 2150400 2246400 2342400 2419200 710400 825600 940800 1056000 1171200 1286400 1382400 1478400 1574400 1670400 1766400 1862400 1958400 2054400 2150400 2246400 2342400 2419200 710400 825600 940800 1056000 1171200 1286400 1382400 1478400 1574400 1670400 1766400 1862400 1958400 2054400 2150400 2246400 2342400 2419200 844800 960000 1075200 1190400 1305600 1401600 1516800 1632000 1747200 1862400 1977600 2073600 2169600 2265600 2361600 2457600 2553600 2649600 2745600 2841600 ``` - Force a core to a specific frequency by setting min and max to the same value: ``` voxl2:$ echo 1574400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq voxl2:$ echo 1574400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq ``` ## CPU Stress Test Script with Frequency Lock - Dependencies: `apt install stress-ng` ``` #!/bin/bash # Dependencies: # apt install stress-ng # List all available frequencies for all cores: # cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies # Target CPU cores CORES=(4 5 6) # Frequency in kHz #FREQ=1478400 FREQ=1574400 #FREQ=1670400 # Stress duration (seconds) DURATION=5 # Stress workers (one per core) WORKERS=${#CORES[@]} echo "Setting CPU frequency to $FREQ kHz for cores: ${CORES[*]}" for CPU in "${CORES[@]}"; do echo $FREQ > /sys/devices/system/cpu/cpu$CPU/cpufreq/scaling_min_freq echo $FREQ > /sys/devices/system/cpu/cpu$CPU/cpufreq/scaling_max_freq done echo "Verifying frequencies..." for CPU in "${CORES[@]}"; do cat /sys/devices/system/cpu/cpu$CPU/cpufreq/scaling_cur_freq done echo "Running stress test for $DURATION seconds..." taskset -c 4-6 stress-ng \ --cpu $WORKERS \ --timeout ${DURATION}s \ --metrics-brief echo "Stress test complete." ``` ## IMX412 PLL Frequency Tests IMX412 camera has several internal clocks, which are generated from the 24 Mhz base frequency that is fed from Voxl2 to all cameras. These clocks are configured during the camera initialization phase - the settings are contained within the imx412 sensormodule files. Tests were performed to measure the effect of the PLL / MIPI bitrate on the GNSS Satellite SNR, while keeping all other settings the same (gain, exposure, fps). The test was set up as follows: - generate imx412 sensormodule drivers for desired frequency range (e.g. 1200-2100 Mhz / Mbps) - all tests use the same camera resolution 3840x2160 at 45FPS - higher fps = more interference - tried to have a relatively large frequency range while keeping the fps high (low mipi rates cannot support high fps), so 45fps was a good compromise - repeat for each frequency - copy appropriate sensormodules (for specific frequency) into /usr/lib/camera/ - log baseline satellite signal strengths for all satellites 10 seconds -- this allows the experiment to not depend on any initial SNR captures at the beginning of the test, since SNR can change relatively quickly due to the environmental factors - start voxl-camera-server and voxl-inspect-cam hires_front_misp_color hires_down_misp_color and wait for 3 seconds - collect satellite SNRs for 10 seconds while the cameras are streaming - stop voxl-camera-server - wait for 3 seconds and repeat the loop for the next frequency After data has been collected, analyze the logs and generate plots. The tests were done outdoors using Starling 2 Max with original GPS receiver + V3 GPS mast and 75mm FR4 (with copper) circular plate under the receiver. Full Sun light and exposure was set to 0.1ms, gain to 100 (1.0x). During testing it was discovered that the most interference was present when the image was darker than normal (under-exposed) -- probably related to specifics of the MIPI packets that are causing the interference. Note that the default IMX412 MIPI bitrate was set to the maximum that the camera officially supports, which is 2100Mbps. As the plots show, there are several peaks where the satellite SNRs drop by 10-15dB, as initially noted in the overall system testing. Additionally, 2100Mbps is one of the worst frequencies to use, based on this data. As a result of testing, the following frequencies were identified as causing significant interference with GPS L1 band: - 1212Mhz - 1260Mhz - 1572-1578 Mhz (L1 band!!) - 1800Mhz - 2100Mhz There results below show 3 tests: - 1200-2100 Mhz sweep with steps of 30Mhz - 1200-2100 Mhz sweep with steps of 6Mhz - 1760-2200 Mhz sweep with steps of 8Mhz (focusing on the upper range, slightly different PLL configuration) ### 1200-2100 Mhz sweep with steps of 30Mhz ![imx412_pll_sweep_1200_2100_30_3840x2160_45fps_heatmap](/images/gps-emi-tests/imx412_pll_sweep_1200_2100_30_3840x2160_45fps_heatmap.png) ### 1200-2100 Mhz sweep with steps of 6Mhz ![imx412_pll_sweep_1200_2100_6_3840x2160_45fps_heatmap](/images/gps-emi-tests/imx412_pll_sweep_1200_2100_6_3840x2160_45fps_heatmap.png) ![imx412_pll_sweep_1200_2100_6_3840x2160_45fps_median](/images/gps-emi-tests/imx412_pll_sweep_1200_2100_6_3840x2160_45fps_median.png) ![imx412_pll_sweep_1200_2100_6_3840x2160_45fps_dist](/images/gps-emi-tests/imx412_pll_sweep_1200_2100_6_3840x2160_45fps_dist.png) ### 1760-2200 Mhz sweep with steps of 8Mhz ![imx412_pll_sweep_1760_2200_8_3840x2160_45fps_heatmap](/images/gps-emi-tests/imx412_pll_sweep_1760_2200_8_3840x2160_45fps_heatmap.png) ![imx412_pll_sweep_1760_2200_8_3840x2160_45fps_median](/images/gps-emi-tests/imx412_pll_sweep_1760_2200_8_3840x2160_45fps_median.png) --- Source: https://docs.modalai.com/wsl2-sdk-install/ ## Table of Contents 1. TOC # EXPERIMENTAL - Using ADB and Fastboot in WSL 2 (via usbipd) This guide outlines the steps to connect Android devices to WSL 2 using **usbipd** for both **ADB** and **Fastboot** modes. Using Ubuntu directly is preferred, but this guide will help if WSL2 is the only option. ## Overview [USBIPD](https://learn.microsoft.com/en-us/windows/wsl/connect-usb) is a Windows service that enables access to physical USB devices from within WSL 2. To support Android device flashing and debugging, USBIPD must be configured separately for both the ADB and Fastboot USB interfaces. During installation or device flashing, two USBIPD attachment sessions need to be active—one for ADB mode and one for Fastboot mode—to ensure seamless transitions between device states. USBIPD will be slower than a direct Ubuntu install. ## Prerequisites - WSL 2 installed and running [(Instructions)](https://learn.microsoft.com/en-us/windows/wsl/install) - Install **usbipd** on Windows [(Instructions)](https://learn.microsoft.com/en-us/windows/wsl/connect-usb) - ADB and Fastboot (Android Platform Tools) installed inside WSL 2 ## Connect ADB Device ### Step 1: Open PowerShell (Window 1) #### Find BUSID ``` powershell usbipd list ``` Example output: Connected: BUSID VID:PID DEVICE STATE 2-2 2ac1:20c9 Intel(R) USBIO Bridge Device Not shared 2-3 05c6:901d KONA-QRD _SN:29AD1D93, ADB Interface Shared 2-5 27c6:633c Goodix MOC Fingerprint Not shared #### Bind Device Using BUSID ``` powershell usbipd bind --busid 2-3 ``` #### Find VID:PID ``` powershell usbipd list ``` Example output after rebinding: Connected: BUSID VID:PID DEVICE STATE 2-2 2ac1:20c9 Intel(R) USBIO Bridge Device Not shared 2-3 18d1:d00d Android Shared 2-5 27c6:633c Goodix MOC Fingerprint Not shared #### Attach Device to WSL 2 ``` powershell usbipd attach --wsl --hardware-id 18d1:d00d --auto-attach ``` ### Step 2: Verify in WSL 2 Open your WSL terminal and run: #### Check USB Devices ``` bash lsusb ``` #### Verify ADB Connection ``` bash adb devices ``` ## Reboot Device into Bootloader (Fastboot) From WSL: ``` bash adb reboot bootloader ``` ## Connect Fastboot Device ### Step 3: Open PowerShell (Window 2) Repeat the same steps for the Fastboot interface. #### Find BUSID ``` powershell usbipd list ``` #### Bind Device ``` powershell usbipd bind --busid 2-3 ``` #### Find VID:PID ``` powershell usbipd list ``` #### Attach Device to WSL 2 ``` powershell usbipd attach --wsl --hardware-id 18d1:d00d --auto-attach ``` ### Step 4: Verify Fastboot in WSL 2 #### Check USB Devices ``` bash lsusb ``` #### Verify Fastboot Connection ``` bash fastboot devices ``` ## Upgrade VOXL SDK You are now ready to [Upgrade the SDK](/flash-system-image/) ## Notes - The **VID:PID** may change between ADB and Fastboot modes. - You may need to repeat the bind/attach steps after rebooting the device. - Using `--auto-attach` ensures the device reconnects automatically when replugged. --- Source: https://docs.modalai.com/core-libs/ # Core SDK Libs The pages in this section explain the inner workings of core libraries that the VOXL SDK is built on. This is a highly recommended read if you plan to build custom applications for VOXL that will depend on these. --- Source: https://docs.modalai.com/libmodal-pipe/ # libmodal_pipe libmodal_pipe is a C helper library (with a Python interface, `pympa`) to make publishing and subscribing to data via POSIX named pipes easy and flexible without adding any extra overhead. This serves as the foundation for [Modal Pipe Architecture](/mpa/). POSIX pipes are a [fast](https://github.com/goldsborough/ipc-bench), portable, and reliable method of inter-process communication. However, they only practically support transferring data in one direction from a single process to another. libmodal_pipe offers more flexible functionality on top of this along with features such as automatically connecting/disconnecting, and bidirectional communication. ## Server & Client Relationship An MPA server advertises and publishes data. An MPA client opens the pipe created by a server and reads data from it. A single process can be a server and a client to multiple pipes. When a server wishes to advertise data, it creates a new pipe. In this context, a 'pipe' is actually a directory in the file system consisting of multiple POSIX pipes and an information file. These directories can live anywhere in the file system chosen by the server, but typically live in /run/mpa/ since this is a non-permanent directory that is not saved to disk. Within each directory lives: - Request pipe. A client will request their own dedicated POSIX pipe by sending a request to the server through the request pipe. - Control pipe: Clients can send commands back to the server through the control pipe, for example to put voxl-imu-server into calibration mode or to request voxl-qvio-server to reset. - An info file. - An individual POSIX pipe for each connected client to read from. ### Info File When a Server creates a new pipe with `pipe_server_create()`, an info file is created advertising basic information about the pipe in json format. The first 6 json fields are automatically populated when the server creates a new pipe. The server may publish additional fields to provide extra information that doesn't need to be updated frequently. This information has the advantage of being readable with the `pipe_get_info()` and `pipe_get_info_json()` functions without needing to subscribe to the pipe. For example, voxl-imu-server publishes the state of the IMU calibration and also commands that can be sent to the control pipe. ```json voxl2:/$ cat /run/mpa/imu_apps/info { "name": "imu_apps", "location": "/run/mpa/imu_apps/", "type": "imu_data_t", "server_name": "voxl-imu-server", "size_bytes": 131072, "server_pid": 1742, "is_calibrated": true, "is_temp_calibrated":true, "available_commands":["start_calibration", "stop_calibration"] } ``` The 'type' field is typically the name of the C-struct that is sent over the pipe. It is used by clients to ensure that the pipe is publishing the correct data type that it expects before subscribing. It is also used by bash auto-completion so that tools like voxl-inspect-cam and voxl-inspect-imu can tab-complete available pipes that they can subscribe to. For example you can type out voxl-inspect-imu {TAB}{TAB} and bash will suggest and auto-complete any pipes publishing imu data, typically both imu0 and imu1 are being published. ```bash voxl2:/$ voxl-inspect-imu {TAB}{TAB} imu_apps ``` The server_pid field is used so that the server publishing a particular pipe can be identified and shut down with the voxl-kill-pipe tool. The available_commands field is optional but should be set if text commands can be sent to the server as this enables bash-autocompletion for the voxl-send-command tool. The `voxl-inspect-pipe-info` tool pretty-prints any pipe's info file for you. Another good example are the camera pipes published by voxl-camera-server, voxl-uvc-server, and voxl-lepton-server. Anything publishing image data should, if possible, also advertise the image resolution and format in the info json file so subscribers like voxl-streamer can validate and initialize based on this information before actually subscribing to the pipe data. Here is the hires_large_encoded pipe info for reference: ```json voxl2:/$ cat /run/mpa/hires_large_encoded/info { "name": "hires_large_encoded", "location": "/run/mpa/hires_large_encoded/", "type": "camera_image_metadata_t", "server_name": "voxl-camera-server", "size_bytes": 134217728, "server_pid": 1368, "available_commands":["set_exp_gain", "set_exp", "set_gain", "start_ae", "stop_ae", "snapshot", "snapshot-no-save"], "string_format": "H265", "int_format": 4, "width": 4096, "height": 2160, "framerate": 30 } ``` ### Pipe Size POSIX Pipes act as FIFO buffers and the server initially sets their size. It is important that the server set a pipe size reasonable for the data being transferred to prevent overflowing the buffer. For example, 4k color images require larger pipes than imu data. The largest pipe size varies from one platform to another, but 256MB is a typical max. Each data type's header under [library/include/pipe_interfaces/](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/library/include/pipe_interfaces) provides a recommended pipe size (`*_RECOMMENDED_PIPE_SIZE`), and `pipe_suggest_cam_pipe_size()` computes a sensible size for camera pipes from the image format and resolution. If a client expects to have long processing time between pipe reads, then it may elect to increase the size of the pipe for its specific application. Functions are available in both the client and server APIs for reading the current size of a pipe, the amount of data waiting to be read in a pipe, and for setting the size of a pipe. Generally these are not necessary and it is sufficient for the server to set a reasonable safe size for pipes from the beginning. ## Client Interface Features The client-side interface defined in `modal_pipe_client.h` has the most features, options, and configurability. ### Client Helpers A basic call to `pipe_client_open()` will request a new dedicated POSIX pipe for a client to read data from. You can then retrieve a file descriptor and read from the pipe however you wish. However, we HIGHLY recommend using one of the client helpers by adding one of these flags to the call to pipe_client_open() ```c #define CLIENT_FLAG_EN_SIMPLE_HELPER (1<<0) #define CLIENT_FLAG_EN_CAMERA_HELPER (1<<1) #define CLIENT_FLAG_EN_POINT_CLOUD_HELPER (1<<2) #define CLIENT_FLAG_EN_DEBUG_PRINTS (1<<3) #define CLIENT_FLAG_DISABLE_AUTO_RECONNECT (1<<5) #define CLIENT_FLAG_START_PAUSED (1<<6) #define CLIENT_FLAG_EN_ION_BUF_HELPER (1<<7) #define CLIENT_FLAG_MANUAL_ION_BUF_RELEASE (1<<8) ``` All of these helpers will start a background thread to handle automatic opening/closing/reopening of the pipe as the server starts, stops, and restarts. They also handle allocating memory for read buffers and reading data from the pipe. The client simply needs to set callback functions to be set when the helper thread either connects, disconnects, or has read data from the pipe. See the examples for how to use the helpers. ### Pause & Resume After opening a pipe with `pipe_client_open()` it can be paused and resumed again with `pipe_client_pause()` and `pipe_client_resume()` which disconnect and reconnect to the server but the channel remains claimed and configured such that calls to `pipe_client_get_next_available_channel()` won't grab a paused channel, and you don't need to pass in pipe name and flag arguments when reconnecting. This feature is primarily used when a process wants to preemptively open any pipes that it will need, then quickly resume to start getting data only once needed. This sort of behavior can take advantage of simply opening the pipe in a paused state from the beginning, then calling `pipe_client_resume()` when data is needed. voxl-mpa-to-ros is a good example of this. To open a pipe in a paused state, simply used the `CLIENT_FLAG_START_PAUSED` flag when calling `pipe_client_open()`. ### Claiming Channels Typical clients will subscribe to a known fixed number of pipes, such as voxl-qvio-server which only subscribes to one IMU and one camera pipe. In this case it's easy to just pre-define which pipe channel numbers correspond to which data stream like this: ``` #define IMU_CH 0 #define CAM_CH 1 pipe_client_set_connect_cb(IMU_CH, _imu_connect_cb, NULL); pipe_client_set_disconnect_cb(IMU_CH, _imu_disconnect_cb, NULL); pipe_client_set_simple_helper_cb(IMU_CH, _imu_helper_cb, NULL); pipe_client_set_connect_cb(CAM_CH, _cam_connect_cb, NULL); pipe_client_set_disconnect_cb(CAM_CH, _cam_disconnect_cb, NULL); pipe_client_set_camera_helper_cb(CAM_CH, _cam_helper_cb, NULL); ``` For clients like voxl-mpa-to-ros which must dynamically subscribe to an unknown number of pipes, it can be helpful to call `pipe_client_get_next_available_channel()` to claim the next available channel. Any channel that has has already been opened is also considered claimed. ## Sinks Wheras the server interface allows multiple clients to read data from one server, a sink is intended for one or multiple processes to send data to a single process. For example, voxl-vision-hub creates a sink into which one or more processes can pass in relocalization data for it to use. This is a typical use for for POSIX pipes and the sink interface does little more than create a single POSIX pipe along with a read helper thread. This is useful for cases where the full server/client interface is unnecessary. ## Server Interface A server advertises a pipe with `pipe_server_create()`, optionally with `SERVER_FLAG_EN_CONTROL_PIPE` (accept commands from clients), `SERVER_FLAG_EN_DEBUG_PRINTS`, or `SERVER_FLAG_EN_ION_BUF` (zero-copy buffers, below). Data is published with `pipe_server_write()` or one of the type-aware writers: `pipe_server_write_list()`, `pipe_server_write_string()`, `pipe_server_write_camera_frame()`, `pipe_server_write_stereo_frame()`, `pipe_server_write_point_cloud()`, and `pipe_server_write_ion_buffer()`. Callbacks are registered with `pipe_server_set_control_cb()`, `pipe_server_set_connect_cb()`, and `pipe_server_set_disconnect_cb()`, and the info file can be extended at runtime with `pipe_server_update_info()` and `pipe_server_set_available_control_commands()`. Channel limits: 64 server channels, 16 clients per channel, 128 client channels, 16 sink channels. ## Control Commands Connected clients send commands to a server's control pipe with `pipe_client_send_control_cmd()` (or `_bytes()` for binary payloads). A process that isn't a subscribed client can also fire a one-shot command with `pipe_send_control_cmd()` / `pipe_send_control_cmd_bytes()` — this is what the `voxl-send-command` tool uses under the hood. ## Zero-Copy ION Buffers For large frames (4K images, MISP streams), copying through a pipe costs real CPU. libmodal_pipe supports zero-copy sharing of ION/DMA buffers: the server allocates a pool (`mpa_ion_buf_pool_t`, `mpa_ion_buf_pool_alloc_bufs()`) and publishes buffer handles with `pipe_server_write_ion_buffer()`; clients enable `CLIENT_FLAG_EN_ION_BUF_HELPER` and receive `mpa_ion_buf_t` references via `pipe_client_set_ion_buf_helper_cb()`. By default the helper releases each buffer when the callback returns; a client that needs to hold buffers longer sets `CLIENT_FLAG_MANUAL_ION_BUF_RELEASE` and returns them explicitly with `pipe_client_report_mpa_ion_buf_unused()`. The [libmodal-flow page](/libmodal-flow/) shows a complete client-side example. ## Message Types Every standard MPA message type lives in its own header under [library/include/pipe_interfaces/](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/library/include/pipe_interfaces): `camera_image_metadata_t`, `imu_data_t`, `vqf_data_t`, `baro_data_t`, `vio_data_t`, `pose_4dof_t`, `pose_vel_6dof_t`, `tof_data_t`, `tof2_data_t`, `point_cloud_metadata_t`, `tag_detection_t`, `object_tracking_data_t`, `vfc_data_t`, `rc_channels_t`, `crsf_raw_data_t`, `cpu_stats2_t`, `payload_status_t`, `mpa_ion_buf_t`, and more. Each header carries its type's magic number, recommended read-buffer and pipe sizes, and a `pipe_validate_*()` helper. (`modal_pipe_interfaces.h` still exists but is now just an umbrella include.) ## Support Utilities `modal_start_stop.h` provides the process scaffolding used by every MPA service: `make_pid_file()` / `kill_existing_process()` / `remove_pid_file()`, `enable_signal_handler()` with the `main_running` idiom, `pipe_pthread_create()` with RT priority levels, CPU affinity helpers, and the loop timing helpers `mpa_nanosleep()` / `mpa_loop_sleep()`. Services can also report structured faults to the shared `/run/mpa/fault` channel with `write_fault_code()` (see `modal-test-fault-code.c`). ## Python: pympa A Python binding ships in the repo's `python/` directory: `pympa_create_pub()`, `pympa_publish_imu()`, `pympa_publish_image()`, `pympa_get_image()`, and autogenerated Python versions of the interface types. Useful for quick prototyping and test scripts where C is overkill. ## API Reference and Examples The libmodal_pipe headers are thoroughly self-documented and human readable. Please read them carefully for details on using the API. [https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/library/include](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/library/include) Complete working examples live in [the examples directory](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/tree/master/examples): `modal-hello-server`, `modal-hello-client`, `modal-hello-sink`, `modal-hello-pause` (the pause/resume pattern above), `modal-pipe-ping` (latency measurement), `modal-kill-pipe`, and `modal-test-fault-code`. --- Source: https://docs.modalai.com/libmodal-json/ # libmodal_json libmodal_json is an extension of Dave Gamble's excellent cJSON library with the following helper functions to facilitate the most common JSON file operation used at ModalAI for config and calibration files. All the cJSON functions and types are included in this header and library to give the user complete low-level control. If there isn't a helper function in this header for something you want to do, look through cJSON.h and you will find what you need! This library is used by most MPA services to support configuration files. It is also used by libmodal_pipe to publish human and computer readable information about pipes in the file system. libmodal_json is distributed as a dual-architecture 32/64 library in IPK format as part of VOXL Suite. If you wish to dive deeper or compile yourself, then you can find source code and build instructions [here](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json). Almost every MPA project serves as some example of how to use libmodal_json. However, the [modal-test-json](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json/-/blob/master/examples/modal-test-json.c) test program is a good starting point as it covers use of almost the entire API. The read-modify-write pattern services use for their config files, condensed from that example: ```c cJSON* parent = json_read_file(PATH); // fetch values, adding the default to the file if an entry is missing json_fetch_bool_with_default( parent, "bool1", &bool1, DEFAULT_BOOL1); json_fetch_int_with_default( parent, "int1", &int1, DEFAULT_INT1); json_fetch_double_with_default(parent, "double1", &double1, DEFAULT_DOUBLE1); // every fetch helper sets a shared error flag, so check once at the end if(json_get_parse_error_flag()) return -1; // if any defaults were added above, write the updated file back to disk if(json_get_modified_flag()){ json_write_to_file(PATH, parent); } ``` API straight from [modal_json.h](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-json/-/blob/master/library/include/modal_json.h) ``` /** * @brief Makes a new empty json file if one does not already exist at the * specified path. * * Use this in cases where a program may run before a config file * has been made and you wish the program to populate the config * file with default values itself on the first run. The empty json * file simple consists of open and closed curly braces {} which is * the minimum viable json syntax. * * @param[in] path The absolute file path * * @return 0 if file already existed, 1 if a new file was successfully * created, -1 on failure. */ int json_make_empty_file_if_missing(const char* path); /** * @brief same as json_make_empty_file_if_missing() but can optionally * write a header before the empty curly braces. * * The header must be a valid comment for it to be parsed back. * Valid comments are the same as C and can be single or multi-line * C comments. The header string should end in '\n' * * @param[in] path The absolute file path * @param[in] header The header as a valid comment string ending in '\n' * * @return 0 if file already existed, 1 if a new file was successfully * created, -1 on failure. */ int json_make_empty_file_with_header_if_missing(const char* path, const char* header); /** * @brief reads a json file and puts the data into a cJSON type * * This will allocate new memory for the returned cJSON object. The * user is responsible for freeing this memory after they are done * using it with cJSON_delete(). * * @param[in] path The absolute file path * * @return pointer to new cJSON data or NULL on failure. */ cJSON* json_read_file(const char* path); /** * @brief writes json data to specified file * * this overwrites any data already in the file. * * @param[in] path The absolute file path * @param json The json object to write * * @return 0 on success, -1 on failure */ int json_write_to_file(const char* path, cJSON* json); /** * @brief same as json_write_to_file() but can optionally write a header * before the json data. * * The header must be a valid comment for it to be parsed back. * Valid comments are the same as C and can be single or multi-line * C comments. The header string should end in '\n' * * @param[in] path The absolute file path * @param obj The json object to write to disk * @param[in] header string to write at the top of the file * * @return 0 on success, -1 on failure */ int json_write_to_file_with_header(const char* path, cJSON* obj, const char* header); /** * @brief print json data to stdout in the same form as would be written to a file. * * @param json The json object to print * * @return 0 on success, -1 on failure */ int json_print(cJSON* json); /** * @brief Get the parse error flag. * * If at any point one of the json_fetch_xxx helpers encountered an * error such as an item missing or of the wrong type, it will set * this flag to 1 in addition to returning an error. * * Use json_get_parse_error_flag() to check at the end of a sequence * of json_fetch_xxx calls to see if any of them had an error. This * prevents the need for checking the return value of every single * json_fetch_xxx() call. * * You may also set this flag manually with * json_set_parse_error_flag() if you wish. * * This flag will be set back to 0 on a call to json_read_file(). * * @return 0 if there was no error, 1 if there was. */ int json_get_parse_error_flag(void); void json_set_parse_error_flag(int flag); /** * @brief Get the modified flag. * * If at any point one of the json_fetch_xxx_with_default or * json_fetch_xxx_and_add_if_missing() helpers modified the parent, * they will set the modified flag to 1. * * Use json_get_modified_flag() to check at the end of a sequence of * json_fetch_xxx calls to see if any of them modified the parent, * indicating the data should be written back to disk with the new * items. * * You may also set this flag manually with json_set_modified_flag() * if you wish. * * This flag will be set back to 0 on a call to json_read_file(). * * @return 0 if there was no modification, 1 if there was. */ int json_get_modified_flag(void); void json_set_modified_flag(int flag); /** * Helper functions for fetching a value. These functions can be used two ways: * * 1. Fetch an item's value from an object by name. In this case cJSON* obj * points to a cJSON object (parent or child) that contains the desired * value by name. * * 2. Fetch an item's value directly from the item itself. In this case * cJSON* obj should be a pointer to the item itself you want to extract * the value from. 'name' must be set to NULL. This use case is helpful * when parsing arrays since you will likely loop through the array * fetching each item by index. Items in an array DO NOT have names * unlike items in an object. * * Information on specific types: * * - bools are written out to an integer, 0 for false, 1 for true. * * - ints are written out as ints. * * - doubles are written out as doubles. * * - strings are written out using strcpy. Make sure you provide a char* to * enough memory for (maxlen+1) bytes to allow for the null terminator. * * - For enums you provide an array of strings (options) along with the * number of strings in the array (n_options). json_fetch_enum will try to * match the string value to one of the provided options and writes back * the index of the matched option. If the string contained in the file * does not match an option, val is set to -1 and the function returns -1. * * - fixed vectors are arrays of doubles. The array must be of known length. * If the array in the file is missing, not the right length, or the wrong * type then this function will return -1. * * - fixed vector floats are the same as fixed vectors but writes the data * out to an array of single-precision floats insead of doubles. The * array must be of known length. If the array in the file is missing, not * the right length, or the wrong type then this function will return -1. * * - dynamic vectors are also arrays of doubles but allow for any length * from 0 to maxlen. Be sure to provide an array long enough for maxlen * doubles to be written into. The actually number of doubles found in the * array is written out to len if len!=NULL * * - fixed matrices are arrays of arrays of doubles and are written out in * row-major order to the beginning of contiguous memory. See the example * program. * * * Each of these functions sets the parse error flag to 1 if a problem in * encountered such as a missing value, entry is of the wrong type, or a fixed * vector/matrix is the wrong size. They all return 0 on success or -1 on * failure. */ int json_fetch_bool(cJSON* obj, const char* name, int* val); int json_fetch_int(cJSON* obj, const char* name, int* val); int json_fetch_double(cJSON* obj, const char* name, double* val); int json_fetch_float(cJSON* obj, const char* name, float* val); int json_fetch_string(cJSON* obj, const char* name, char* val, unsigned int maxlen); int json_fetch_enum(cJSON* obj, const char* name, int* val, const char** options, int n_options); int json_fetch_fixed_vector(cJSON* obj, const char* name, double* val, int len); int json_fetch_fixed_vector_float(cJSON* obj, const char* name, float* val, int len); int json_fetch_dynamic_vector(cJSON* obj, const char* name, double* val, int* len, int maxlen); int json_fetch_fixed_matrix(cJSON* obj, const char* name, double* val, int rows, int cols); /** * All of the following json_fetch_xxx_with_default() functions mimic the * behavior of the json_fetch_xxx() equivalent except they will add a new item * to the provided cJSON object with the given name and default value. These are * useful for config files which may expand with new features over time. * * If the provided name is missing from obj and the new default value is added * successfully then the modified flag is set to 1 indicating the cJSON data has * been modified and should be written back to disk with the new data. The data * won't be written back to disk automatically, you will need to do that * yourself after checking the flag with json_get_modified_flag(). * * Since the purpose of these functions is to retrieve and optionally add a * named item to an object, cJSON* obj must be an object and the name string * cannot be left NULL as is possible with the non "with_default" fetch * functions. * * each function returns 0 on success or -1 on failure. */ int json_fetch_bool_with_default(cJSON* obj, const char* name, int* val, int default_val); int json_fetch_int_with_default(cJSON* obj, const char* name, int* val, int default_val); int json_fetch_double_with_default(cJSON* obj, const char* name, double* val, double default_val); int json_fetch_float_with_default(cJSON* obj, const char* name, float* val, float default_val); int json_fetch_string_with_default(cJSON* obj, const char* name, char* val, unsigned int maxlen, const char* default_val); int json_fetch_enum_with_default(cJSON* obj, const char* name, int* val, const char** options, int n_options, int default_val); int json_fetch_fixed_vector_with_default(cJSON* obj, const char* name, double* val, int len, double* default_val); int json_fetch_fixed_vector_float_with_default(cJSON* obj, const char* name, float* val, int len, float* default_val); int json_fetch_dynamic_vector_with_default(cJSON* obj, const char* name, double* val, int* len, int maxlen, double* default_val, int default_len); int json_fetch_fixed_matrix_with_default(cJSON* obj, const char* name, double* val, int rows, int cols, double* default_val); /** * Similar to the above fetch functions for basic data types, these functions * will fetch child objects, arrays, and arrays of objects. They are all * essentially wrappers around the cJSON_GetObjectItem() function provided by * the cJSON library, but with additional functionality and error prints. If you * are trying to retrieve an optional object or array and don't want the error * prints, then you can call the silent cJSON_GetObjectItem() function instead. * * Child objects can contain named basic types just like the parent object. * * Arrays contain non-named objects in order. When fetching an array, these * helpers will also write out the length of the array to aid in parsing. * * Similar to the "_with_default()" functions, the "_and_add_if_missing()" * equivalents here will add an empty object, empty array, or an array * containing one empty object to the cJSON* obj object and return a handle to * the new object/array. These just make it easier to add new default values * since an empty object/array will already have been created to add to. * * If you are constructing a json file complicated enough to use child objects * and array, you most likely want to make use of the powerful cJSON functions * included in this header/library. Rememember, modal_json is just a collection * of helper functions bundled with cJSON giving you low-level access to the * cJSON structure if you require it. You are in no way restricted to using just * these helper functions. * * See the example program for how to use these. * * All these functions return a handle to the desired object/array or NULL on * failure. */ cJSON* json_fetch_object(cJSON* obj, const char* name); cJSON* json_fetch_object_and_add_if_missing(cJSON* obj, const char* name); cJSON* json_fetch_array(cJSON* obj, const char* name, int* length); cJSON* json_fetch_array_and_add_if_missing(cJSON* obj, const char* name, int* length); cJSON* json_fetch_array_of_objects(cJSON* obj, const char* name, int* length); cJSON* json_fetch_array_of_objects_and_add_if_missing(cJSON* obj, const char* name, int* length); /** * @brief Remove an item from the cJSON object if it is present * * This is useful for old/deprecated values to be removed from the * file. Note that it does not recursively search through child * objects, it only looks in the object provided. * * If the value is removed then the modified flag is set such that * json_get_modified_flag() will return 1 if the value was * removed. * * @param obj The json object to remove an object from * @param[in] name The name of the item to remove * * @return 0 if item was not present, 1 if it was present and was deleted. */ int json_remove_if_present(cJSON* obj, const char* name); ``` --- Source: https://docs.modalai.com/libvoxl-cutils/ # VOXL-CUtils VOXL C Utils is a small package of C/C++ Utilities for use in various packages. ## Table of Contents 1. TOC --- ## Silencing Macros The package contains the macros ```VCU_silent``` and ```VCU_silentErrors``` which can be used to silence the stdout and stderr outputs of their contents, respectively. For example: ``` VCU_silent( some_noisy_libaray_call(); ) ``` will only print the output of stderr to the screen. You can also combine these to completely silence terminal output such as: ``` VCU_silent( VCU_silentErrors( some_very_noisy_libaray_call(); ) ) ``` ## Timing functions The package contains the functions ```VCU_time_realtime_ns``` and ```VCU_time_monotonic_ns``` to get the real and monotonic time of the system, respectively. These can be used to time the execution of code or provide timestamps of sensor readings. ## Terminal Font Manipulation These definitions allow you to manipulate the terminal output in various ways. You can change the face/color of print statements like such: ```printf("This sentence has both " FONT_BOLD "bold" RESET_FONT " and " COLOR_RED "red" RESET_COLOR "text in it!");``` resulting in: "This sentence has both __bold__ and red text in it!" ### Space Manipulation |Name |Definition |Code | |--- |--- |--- | |Clear Screen |CLEAR_TERMINAL | \033c | |Disable Line Wrap |DISABLE_WRAP | \033[?7l | |Enable Line Wrap |ENABLE_WRAP | \033[?7h | |Clear Current Line |CLEAR_LINE | \033[2K | |Move Cursor To Top Left |GOTO_TOP_LEFT | \033[f | ### Face |Name |Definition |Code | |--- |--- |--- | |Reset All Font Items |RESET_FONT | \e[0m | |Bold |FONT_BOLD | \e[1m | |Dim |FONT_DIM | \e[2m | |Underline |FONT_UNDERLINE | \e[4m | |Flashing Font |FONT_BLINK | \e[5m | |Invert Fore/Back Colors |FONT_INVERT | \e[7m | |Hidden Text |FONT_HIDDEN | \e[8m | |Reset Bold |RESET_BOLD | \e[21m | |Reset Dim |RESET_DIM | \e[22m | |Reset Underline |RESET_UNDERLINE | \e[24m | |Reset Blink |RESET_BLINK | \e[25m | |Reset Invery |RESET_INVERT | \e[27m | |Reset Hidden |RESET_HIDDEN | \e[28m | ### Foreground Color |Name |Definition |Code | |--- |--- |--- | |Reset Color |RESET_COLOR | \e[39m | |Black |COLOR_BLK | \e[30m | |Red |COLOR_RED | \e[31m | |Green |COLOR_GRN | \e[32m | |Yellow |COLOR_YLW | \e[33m | |Blue |COLOR_BLU | \e[34m | |Magenta |COLOR_MAG | \e[35m | |Cyan |COLOR_CYN | \e[36m | |Light Gray |COLOR_LIT_GRY | \e[37m | |Dark Gray |COLOR_DRK_GRY | \e[90m | |Light Red |COLOR_LIT_RED | \e[91m | |Light Green |COLOR_LIT_GRN | \e[92m | |Light Yellow |COLOR_LIT_YLW | \e[93m | |Light Blue |COLOR_LIT_BLU | \e[94m | |Light Magenta |COLOR_LIT_MAG | \e[95m | |Light Cyan |COLOR_LIT_CYN | \e[96m | |White |COLOR_WHT | \e[97m | ### Background Color |Name |Definition |Code | |--- |--- |--- | |Reset Background Color |RESET_COLOR_BKG | \e[49m | |Background Black |COLOR_BKG_BLK | \e[40m | |Background Red |COLOR_BKG_RED | \e[41m | |Background Green |COLOR_BKG_GRN | \e[42m | |Background Yellow |COLOR_BKG_YLW | \e[43m | |Background Blue |COLOR_BKG_BLU | \e[44m | |Background Magenta |COLOR_BKG_MAG | \e[45m | |Background Cyan |COLOR_BKG_CYN | \e[46m | |Background Light Gray |COLOR_BKG_LIT_GRY | \e[47m | |Background Dark Gray |COLOR_BKG_DRK_GRY | \e[100m | |Background Light Red |COLOR_BKG_LIT_RED | \e[101m | |Background Light Green |COLOR_BKG_LIT_GRN | \e[102m | |Background Light Yellow |COLOR_BKG_LIT_YLW | \e[103m | |Background Light Blue |COLOR_BKG_LIT_BLU | \e[104m | |Background Light Magenta |COLOR_BKG_LIT_MAG | \e[105m | |Background Light Cyan |COLOR_BKG_LIT_CYN | \e[106m | |Background White |COLOR_BKG_WHT | \e[107m | --- Source: https://docs.modalai.com/libvoxl-io/ # libvoxl_io All serial ports and GPIO on VOXL are controlled by the Sensors DSP (SDSP) which allows for a lot of real-time processing to be offloaded from the Applications Processor for time-sensitive tasks such as handling high data-rate IMUs and Mavlink communication with a PX4 flight controller. `libvoxl_io` serves to provide access to these functions from Linux Userspace without requiring the user to build Hexagon DSP Code. That being said, `libvoxl_io` is the only project for VOXL which is built using the [voxl-hexagon](/voxl-hexagon/) docker image and serves as the best starting point for writing your own SDSP programs. For the remainder of this page we will simply duplicate the documentation already provided in the header [voxl_io.h](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/-/blob/master/lib/include/voxl_io.h). --- --- ## RPC Shared Memory ```c /** * @brief allocates memory shared between SDSP and APPS proc * * @param[in] bytes bytes to allocate * * @return pointer to memory on success, NULL on failure */ uint8_t* voxl_rpc_shared_mem_alloc(size_t bytes); /** * @brief frees previously allocated RPC shared memory * * @param ptr pointer to memory */ void voxl_rpc_shared_mem_free(uint8_t* ptr); /** * @brief deinitiazes the RPC shared memory system */ void voxl_rpc_shared_mem_deinit(); ``` ## UART ```c #define UART_J7 9 // BLSP 9 on physical port J7 pins 2&3 #define UART_J10 7 // BLSP 7 on physical port J10 pins 2&3 #define UART_J11 12 // BLSP 12 on physical port J11 pins 2&3 #define UART_J12 5 // BLSP 5 on physical port J12 pins 2&3 #define UART_DATA_BUF_LEN 128 // uart read buffer should be this length /** * @brief Initializes a UART bus /dev/tty-{bus} at specified baudrate * * This is a very generalized function that configures the bus for * 8-bit characters, ignores the modem status lines, disables * parity, disables canonical mode, and enables 1 stop bit. More * flexibility in configuration could be added in the future if * necessary. For now this covers the majority of sensors. * * @param[in] bus UART bus number (BLSP #) * @param[in] baudrate must be one of the standard speeds in the UART spec. * 115200 and 57600 are most common. * * @return 0 on success, -1 on failure */ int voxl_uart_init(int bus, int baudrate); /** * @brief closes a UART bus * * Please make an effort to call this before your process exits to * help ensure a safe cleanup. * * @param[in] bus UART bus number (BLSP #) * * @return returns 0 on success, -1 on error. */ int voxl_uart_close(int bus); /** * @brief Sends data out the specified uart port through the SDSP * * This will return immediately, even if the data hasn't been sent * out yet. Use voxl_uart_drain if you need to ensure the data has * been sent before continuing. Max write length is currently * untested, UART_DATA_BUF_LEN is a safe limit. * * @param[in] bus UART bus number (BLSP #) * @param[in] data pointer to data to be sent * @param[in] bytes number of bytes to send * * @return returns number of bytes sent or -1 on error */ int voxl_uart_write(int bus, uint8_t* data, size_t bytes); /** * @brief Reads any and all data available from the UART hardware buffer * * This is a non-blocking function call! You do not get to specify * the number of bytes it reads, it will always read out everything * in the hardware buffer. The dataLen argument should be the size * of the data buffer in bytes which should generally be set to * UART_DATA_BUF_LEN (128) * * @param[in] bus UART bus number (BLSP #) * @param data pointer to read buffer * @param[in] dataLen length of the read buffer (should be UART_DATA_BUF_LEN) * * @return Returns number of bytes read or -1 on error. */ int voxl_uart_read(int bus, uint8_t* data, size_t dataLen); /** * @brief flushes (discards) any data received but not read, or data * written but not sent. * * uses tcflush(fd, TCIOFLUSH) * * @param[in] bus UART bus number (BLSP #) * * @return 0 on success or -1 on failure */ int voxl_uart_flush(int bus); /** * @brief waits for data in the write buffer to be sent before returning * * @param[in] bus UART bus number (BLSP #) * * @return 0 on success or -1 on failure */ int voxl_uart_drain(int bus); ``` ## Timing ```c /** * @brief get the current monotonic time of the sdsp in nanoseconds * * @return current monotonic time of the sdsp or -1 on error */ int64_t voxl_sdsp_time_monotonic_ns(); /** * @brief get the current realtime time of the sdsp in nanoseconds * * @return current realtime time of the sdsp or -1 on error */ int64_t voxl_sdsp_time_realtime_ns(); /** * @brief get the current monotonic time of the apps proc in nanoseconds * * @return current monotonic time of the apps proc or -1 on error */ int64_t voxl_apps_time_monotonic_ns(); /** * @brief get the current realtime time of the apps proc in nanoseconds * * @return current realtime time of the apps proc or -1 on error */ int64_t voxl_apps_time_realtime_ns(); /** * @brief get the time difference between apps and dsp clocks * * sdsp clock is ahead of the apps proc so this offset should be * positive. Note that the SDSP clock is sourced differently than * the apps-proc clock so you may see 10us drift each second between * the two clocks. Don't assume this offset is constant forever! * * Represented as offset_ns = sdsp_monotonic_ns - apps_monotonic_ns * * @return current monotonic time of the sdsp or -1 on error */ int64_t voxl_sdsp_time_offset_ns(); ``` ## SPI ```c /** * The maximum length of any receive or transmit over SPI bus. */ #define DSPAL_SPI_TRANSMIT_BUFFER_LENGTH 512 #define DSPAL_SPI_RECEIVE_BUFFER_LENGTH 512 /** * @brief Initializes a SPI port a specified mode and frequency * * For description of the 4 SPI bus modes, see * * * Frequency is provided in hertz. MPU9250 claims to support up to 20mhz but we observed corrupted data. In practice 10mhz is plenty fast. * * @param[in] bus SPI bus number (BLSP #) * @param[in] bus_mode 0,1,2, or 3 * @param[in] freq_hz The frequency in hz * * @return 0 on success, -1 on failure */ int voxl_spi_init(int bus, int bus_mode, int freq_hz); /** * @brief update the speed of the SPI port * * Use this is you wish to run the bus slower for some operations * and faster for others. For example register configuration may * want to run more slowly for robustness but read in data quickly. * * @param[in] bus SPI bus number (BLSP #) * @param[in] freq_hz The frequency in hz * * @return 0 on success, -1 on failure */ int voxl_spi_set_freq(int bus, int freq_hz); /** * @brief closes a SPI bus * * Please make an effort to call this before your process exits to * help ensure a safe cleanup. * * @param[in] bus SPI bus number (BLSP #) * * @return returns 0 on success, -1 on error. */ int voxl_spi_close(int bus); /** * @brief writes data out the SPI bus * * data length can't exceed DSPAL_SPI_TRANSMIT_BUFFER_LENGTH (512) * * @param[in] bus SPI bus number (BLSP #) * @param data pointer to data to be written * @param[in] bytes number of bytes to send * * @return 0 on success -1 on failure */ int voxl_spi_write(int bus, uint8_t* data, int bytes); /** * @brief reads specified number of bytes out of a register * * You cannot read/write more than DSPAL_SPI_RECEIVE_BUFFER_LENGTH (512) * bytes at a time. * * @param[in] bus SPI bus number (BLSP #) * @param write_buf data to send out bus * @param[in] write_len number of bytes to write * @param read_buf Buffer to write result into * @param[in] read_len number of bytes to read * * @return 0 on success, -1 on failure */ int voxl_spi_transfer(int bus, uint8_t* write_buf, int write_len, uint8_t* read_buf, int read_len); /** * @brief writes a single byte register at specified address * * this works by writing the address followed by val which is how we * write registers on the mpu9250 IMU. It may not work on your * sensor. * * @param[in] bus SPI bus number (BLSP #) * @param[in] address register address * @param[in] val The value to write * * @return 0 on success, -1 on failure */ int voxl_spi_write_reg_byte(int bus, uint8_t address, uint8_t val); /** * @brief writes a single word (16 bit) register at specified address * * this works by writing the address followed by val which is how we * write registers on the mpu9250 IMU. It may not work on your * sensor. * * @param[in] bus SPI bus number (BLSP #) * @param[in] address register address * @param[in] val The value to write * * @return 0 on success, -1 on failure */ int voxl_spi_write_reg_word(int bus, uint8_t address, uint16_t val); /** * @brief reads specified number of bytes out of a register * * This works by sending the requested address with the MSB set to 1 * indicating a read operation on MPU9250 and similar IMUs. It then * reads the specified number of bytes out. This is intended for MPU * series IMUs and may not work with your sensor if it behaves * differently. * * If reading chunks of data you should allocate RPC shared memory * with voxl_rpc_shared_mem_alloc(size_t bytes) to use for the * output buffer. * * You cannot read more than DSPAL_SPI_RECEIVE_BUFFER_LENGTH (512) * bytes at a time. * * @param[in] bus SPI bus number (BLSP #) * @param[in] address register address * @param out_buf pointer to buffer write the result into * @param[in] length The length of data to read in bytes * * @return 0 on success, -1 on failure */ int voxl_spi_read_reg(int bus, uint8_t address, uint8_t* out_buf, int length); /** * @brief reads a single byte register * * This works by sending the requested address with the MSB set to 1 * indicating a read operation on MPU9250 and similar IMUs. It then * reads one byte out. This is intended for MPU series IMUs and may * not work with your sensor if it behaves differently. * * @param[in] bus SPI bus number (BLSP #) * @param[in] address register address * @param out pointer to where to write the result * * @return 0 on success, -1 on failure */ int voxl_spi_read_reg_byte(int bus, uint8_t address, uint8_t* out); /** * @brief reads a single word (16-bit) register * * This works by sending the requested address with the MSB set to 1 * indicating a read operation on MPU9250 and similar IMUs. It then * reads two bytes out. This is intended for MPU series IMUs and may * not work with your sensor if it behaves differently. * * @param[in] bus SPI bus number (BLSP #) * @param[in] address register address * @param out pointer to where to write the result * * @return 0 on success, -1 on failure */ int voxl_spi_read_reg_word(int bus, uint8_t address, uint16_t* out); ``` ## IMU FIFO Reader ```c /** * @brief helper function to read out a regularly formed FIFO buffer * * This is intended for the MPU series IMU FIFO buffers. The process * consists of first reading the number of bytes available in the * IMU's FIFO as read from the fifo_count register address. This * count should be a multiple of packet_size. * * The data (even multiple of packet_size) is then read out of the * fifo_address register and placed into the out_buf buffer. * * The user should allocate RPC shared memory with * voxl_rpc_shared_mem_alloc(size_t bytes) to use for the output * buffer with at least the size of the IMU's FIFO. Also provide the * size of this buffer with the dataLen argument so the functions * knows not to write too far and create an overflow. You should * make sure your RPC shared mem and this length are appropriately * sized for the fifo you are reading. * * For example the icm42688 has a 2k buffer but also has additional * read cache so it can technically hold 103 packets (2060) bytes. * We use a 2k + 128 = 2170 bytes buffer in voxl-imu-server to be * safe. * * The user can specify an optinal minimum number of packets to * read. If greater than 0, the function will not return until the * fifo has at least min_packets available to read. This can help * reduce CPU usage at high sample rates. * * @param[in] bus SPI bus number (BLSP #) * @param[in] count_address fifo_count register address * @param[in] fifo_address fifo_data address * @param[in] packet_size expected bytes per fifo packet * @param[in] min_packets The minimum number of packets to read before * returning * @param[out] packets_read The number of packets read * @param[out] data The output buffer (should be RPC shared memory) * @param[in] dataLen Size of the output buffer. * @param[in] count_speed SPI speed in hz to read fifo_count register * @param[in] data_speed SPI speed in hz to read the fifo data register * * @return 0 on success, -1 on failure */ int voxl_spi_read_imu_fifo( int bus, uint8_t count_address, uint8_t fifo_address,\ uint8_t packet_size, int min_packets, \ int* packets_read, uint8_t* data, int dataLen, \ int count_speed, int data_speed); ``` ## GPIO ```c //highest number of GPIO pin which can be used (note that actual available pin count may vary) #define MAX_NUM_GPIO_PINS 256 #define GPIO_DIRECTION_INPUT 0 #define GPIO_DIRECTION_OUTPUT 1 /** * @brief Initializes a GPIO pin with desired direction and extra flags * * @param[in] gpio_pin GPIO pin number (not BLSP #) * @param[in] direction Direction : GPIO_DIRECTION_INPUT or GPIO_DIRECTION_OUTPUT * @param[in] flags Reserved for future use * * @return 0 on success, -1 on failure */ int voxl_gpio_init(int gpio_pin, int direction, int flags); /** * @brief Read the state of a GPIO pin * * The pin must be initialized using voxl_gpio_init before reading its state * * @param[in] gpio_pin GPIO pin number * @param[in] gpio_state_ptr Pointer to the integer where pin state will be written * * @return 0 on success, -1 on failure */ int voxl_gpio_read(int gpio_pin, int * gpio_state_ptr); /** * @brief Set the state of a GPIO pin * * The pin must be initialized using voxl_gpio_init in output mode before setting its state * * @param[in] gpio_pin GPIO pin number * @param[out] gpio_state Desired state of the pin (0=LOW or 1=High) * * @return 0 on success, -1 on failure */ int voxl_gpio_write(int gpio_pin, int gpio_state); /** * @brief Clean up after using GPIO pin * * @param[in] gpio_pin GPIO pin number * * @return 0 on success, -1 on failure */ int voxl_gpio_close(int gpio_pin); ``` ## I2C ```c #define MAX_NUM_I2C_PORTS 16 //highest number of i2c port (BLSP #) #define MAX_I2C_TX_BUFFER_SIZE 128 /** * @brief Initializes an I2C port * * Note that I2C bus speed and slave ID are sent using voxl_i2c_slave_config * * @param[in] bus I2C bus number (BLSP #) * * @return 0 on success, -1 on failure */ int voxl_i2c_init(uint32_t bus); /** * @brief Closes an I2C port * * @param[in] bus I2C bus number (BLSP #) * * @return 0 on success, -1 on failure */ int voxl_i2c_close(uint32_t bus); /** * @brief Configures I2C port for communication with a certain i2c slave ID * * @param[in] bus I2C bus number (BLSP #) * @param[in] slave_address_7bit I2C slave address (7bit format, 7bit only (10 bit slave addresses are not supported)) * @param[in] bit_rate I2C bus bit rate (e.g 100000, 400000) * @param[in] timeout_us Timeout for transfer (in microseconds) * * @return 0 on success, -1 on failure */ int voxl_i2c_slave_config(uint32_t bus, uint16_t slave_address, uint32_t bit_rate, uint32_t timeout_us); /** * @brief Write data to I2C slave device starting from the specified 8-bit register address * * @param[in] bus I2C bus number (BLSP #) * @param[in] register_address Register address to access on the device (note: byte order is LS Byte first if > 8 bits) * @param[in] address_num_bits Number of bits to use for sending register address (8, 16, 24, or 32) * @param[in] output_buffer Buffer with data to send to the device * @param[in] length Number of bytes to send to device (in addition to the register address) * * @return 0 on success, -1 on failure */ int voxl_i2c_write(uint32_t bus, uint32_t register_address, uint32_t address_num_bits, uint8_t * write_buffer, uint32_t write_length); /** * @brief Read data from I2C slave device starting from the specified 8-bit register address * * @param[in] bus I2C bus number (BLSP #) * @param[in] register_address Register address to access on the device (note: byte order is LS Byte first if > 8 bits) * @param[in] address_num_bits Number of bits to use for sending register address (8, 16, 24, or 32) * @param[in] input_buffer Buffer to hold the incoming data * @param[in] length Number of bytes to read from device * * @return 0 on success, -1 on failure */ int voxl_i2c_read(uint32_t bus, uint32_t register_address, uint32_t address_num_bits, uint8_t * read_buffer, uint32_t read_length); ``` ## UART Mavlink Parsing ```c /** * @brief starts a UART mavlink parsing thread on the SDSP * * buflen specifies how large of a buffer the SDSP should allocate * internally. The user should allocate their own RPC shared memory * buffer matching this length for the data to be copied out into * late. * * There is currenly only one valid flag available: * * FLAG_MAVPARSER_ALLOW_CRC_FAILURES * * The allow CRC failures flag is useful because the CRC on Mavlink * messages is more than just a message integrity check. It has been * overloaded with a type of message version check and this can be * specific to certain implementations. See the description of * CRC_EXTRA at this link: * https://mavlink.io/en/guide/serialization.html#crc_extra * * @param[in] bus The UART bus * @param[in] baudrate The baudrate * @param[in] buflen Buffer length for SDSP to use * @param[in] flags flags to change behavior * * @return 0 on success, -1 on failure */ int voxl_mavparser_init(int bus, int baudrate, int buflen, int flags); /** * @brief Copies out any complete parsed mavlnk messages and their status * to the RPC data buffer allocated during the init step. * * Each message has a corresponding status written to the user's * status array. The status matches mavlink_framing_t: * * MAVLINK_FRAMING_OK=1, MAVLINK_FRAMING_BAD_CRC=2, * MAVLINK_FRAMING_BAD_SIGNATURE=3 * * Messages are returned to the user even if they are parsed with * bad signatures or bad CRCs since these two errors don't necessary * mean there was an integrity problem. * * The CRC on Mavlink messages is more than just a message integrity * check. It has been overloaded with a type of message version * check and this can be specific to certain implementations. If the * mavlink packet structures used by the sender differs from the * version we have built into this library, the CRC may fail. But * once the message is forwarded to another receiver, they may * decode the packet correctly with no CRC error. See the * description of CRC_EXTRA at this link: * https://mavlink.io/en/guide/serialization.html#crc_extra * * This library is always built with the latest master branch of the * Mavlink project to keep up with new packets. * * The status array should be long enough to hold the single-byte * status of the maxiumum number of mavlink_message_t structs that * can fit in the user's data buffer. See voxl-test-mavparser.c for * an example. * * This function will block for up to 1/2 second and will return if * at least one message is ready or the 1/2 second timeout elapsed. * * @param[in] bus The UART bus * @param[out] data pointer to a mavlink_msg_t array to write out to * @param status pointer to user's status array * * @return returns number of mavlink messages read or -1 on failure */ int voxl_mavparser_read(int bus, char* data, uint8_t* status); /** * @brief stop a mavparser thread * * @param[in] bus The uart bus * * @return 0 on success, -1 on failure */ int voxl_mavparser_close(int bus); ``` ## Source Source code available on [GitLab](https://gitlab.com/voxl-public/Deprecated/libapq8096-io). --- Source: https://docs.modalai.com/librc-math/ # librc_math `librc_math` is a fork of the [librobotcontrol](https://github.com/beagleboard/librobotcontrol) project that strips away everything except the math portion. It is now maintained independently and provides core math functions for projects such as [`voxl-vision-hub`](/voxl-vision-hub/). The voxl package contains borth 32 and 64 bit shared object libraries as well as the plethora of testing and benchmarking tools in 64-bit form. Since `librc_math` is a fork, the original Robot Control library documentation is valid and available at [strawsondesign.com/docs/](http://strawsondesign.com/docs/librobotcontrol/group___math.html). However, it is evolving and new functions are added regularly. The headers are self-documenting, up-to-date, and available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/core-libs/librc-math). The following test programs are available as part of the package, they all serve as example usage of the library: # FACT CHECK THIS ``` voxl2:/$ rc_ {TAB} rc_benchmark_algebra rc_test_matrix rc_test_algebra rc_test_polynomial rc_test_complementary_filters rc_test_quaternion rc_test_filters rc_test_vector rc_test_kalman ``` --- Source: https://docs.modalai.com/libmodal-exposure/ # libmodal-exposure libmodal_exposure provides auto-exposure algorithms that take an image (with metadata) and return what the new exposure and gain should be. The default auto-exposure algorithm used by [voxl-camera-server](/voxl-camera-server/) is the Mean Sample Value (MSV) algorithm. Configuration of libmodal_exposure is achieved through [voxl-camera-server.conf](/voxl-camera-server/#camera-server-config-file). Note that voxl-camera-server vendors its own copy of the MSV algorithm, so these config keys work regardless of whether the standalone libmodal-exposure package is installed. The parameters exposed include the following | Parameter | Description | |----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `ae_mode` | auto exposure mode: one of `off`, `manual`, `auto`, `isp`, or `lme_msv`. `lme_msv` engages the MSV algorithm from this library | | `ae_manual_exposure_us` | fixed exposure time in microseconds, used when `ae_mode` is `manual` | | `ae_manual_gain` | fixed sensor gain, used when `ae_mode` is `manual` | | `exposure_min_us` | minimum exposure time in microseconds the algorithm may command | | `exposure_max_us` | maximum exposure time in microseconds the algorithm may command | | `gain_min` | minimum sensor gain the algorithm may command | | `gain_max` | maximum sensor gain the algorithm may command | | `exposure_soft_min_us` | preferred lower bound on exposure time. The algorithm holds exposure here in bright scenes and adjusts gain first, only raising exposure above it as scene brightness demands (in the ratio set by `ae_slope`) | | `ae_desired_msv` | the desired mean sample value, a.k.a. the average value of pixels that the auto exposure algorithm should try to achieve in frame | | `ae_filter_alpha` | a low-pass filter constant that filters the calculated MSV to slow down responses - the filter used is an IIR filter | | `ae_ignore_fraction` | maximum percentage of saturated (255) pixels that will be used in calculation of MSV. If there are more saturated_pixels / total_pixels, then additional saturated pixels are not used to calculate MSV. This helps prevent image getting too dark if there are large blobs of very bright light | | `ae_slope` | ratio that specifies how much gain vs exposure should be changed when trying to achieve desired MSV. Both gain and exposure linearly affect the pixel brightness, but gain and exposure have different effects on the image quality - mostly in the sense that gain affects granularity and that exposure affects motion blur. | | `ae_exposure_period` | controls the duration where the cells of the camera sensor are exposed to light | | `ae_gain_period` | the gain period associated to the auto exposure (think of this as an amplification factor of the pixels) | Source code and README on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-exposure) --- Source: https://docs.modalai.com/libmodal-cv/ # libmodal-cv ## Introduction `libmodal-cv` is ModalAI's internal computer vision library designed to be run on VOXL. The library implements a number of discrete computer vision tasks as well as a few pipelines. Both the algorithms and pipelines make use of hardware optimizations to use less CPU and power than their complements in other libraries like OpenCV. Importantly, the code for `libmodal-cv` is **closed source** and so its usage is only available through headerfiles. These headerfiles can be found in `/usr/include/modalcv` on VOXL and VOXL 2. The following sections enumerate some of the common paradigms in the library as well as a brief listing on each algorithm and pipeline which has been implemented. ## Common Paradigms Types in the library are typically prefixed with `mcv_cvp_` and suffixed with `_t`. (e.g. `mcv_cvp_undistort_config_t`). Nearly all modules start with some sort of configuration object which takes basic type or enum parameters. For example in the descriptor calculation and matching module we have a configuration object: ``` /** * @brief Represents the configuration for descriptor calculation and matching */ typedef struct mcv_cvp_dcm_config_t { int w; // width of the input image int h; // height of the input image } mcv_cvp_dcm_config_t; ``` which simply needs the width and height for the image that the descriptor calculation and matching will be performed on. These configuration objects are usually passed to some sort of `init` method which returns some sort of `void* handle`. For example: ``` typedef void* mcv_cvp_undistort_handle; /** * @brief Initializes the undistort process using the specified configuration * * @param config A populated undistort configuration object * @return The generated undistort handle if successful, NULL otherwise */ mcv_cvp_undistort_handle mcv_cvp_undistort_init(mcv_cvp_undistort_config_t config); ``` Inside of this `mcv_cvp_undistort_handle` is all of the internal information needed to operate the module. This oftentimes contains proprietary information related to the memory management, hence why this is returned as a `void *`. After calling an `init` function and receiving a non-`NULL` handle, one can then call the corresponding "process" function using the handle. The structure of the process functions vary from module to module as different modules need different numbers of images and different types of output structures. Some modules also contain multiple process functions when there are more than one way to use the same functionality. An example process function might look like: ``` /** * @brief Executes the undistort process for a provided input image. * * @param handle The undistort handle created via mcv_cvp_undistort_init * @param inImg The input image for undistorting * @param outImg The output image object * @return 0 on success or -1 on failure */ int mcv_cvp_undistort_process( mcv_cvp_undistort_handle handle, uint8_t* inImg, uint8_t* outImg ); ``` We can see that for image undistortion, we need to provide the undistortion handle we obtained from the init call as well as a pointer to the input image for undistortion and a pointer to write the output (undistorted) image to. Again, all of the internal information needed to perform the undistortion is stored within the handle. Typically as much preprocessing as possible is performed in the init call so that these process function calls can be repeatedly called in a loop or callback context. Once you're done with a specific module, you need only to call that module's deinit function which typically has a signature like: ``` /** * @brief De-initializes the undistort process * * @param handle The handle generated from mcv_undistort_init * @return 0 on success or -1 on failure */ int mcv_cvp_undistort_deinit(mcv_cvp_undistort_handle handle); ``` needing only the handle to tear down all of the necessary memory structures. Some modules may need more, though, so always adhere to the method signature. ## Algorithm List - Descriptor Calculation and Matching - Depth From Stereo - Feature Point Extraction - Normalized Cross Correlation - Optical Flow - Image Pyramiding - Pyramid Feature Point Extraction - Image Undistortion ## Pipeline List - Undistort -> Depth from Stereo - Patch Tracker --- Source: https://docs.modalai.com/libmodal-flow/ # libmodal-flow `libmodal-flow` is the visual frontend used by `open-vins-server` on VOXL for feature-point detection and sparse optical-flow tracking. It ingests grayscale camera frames (commonly from `tracking_*_misp_norm_ion` pipes), builds image pyramids on GPU, detects keypoints, and tracks points frame-to-frame. ## Public Header APIs The current user-facing headers are in: - `library/include/modal_flow/Types.hpp` - `library/include/modal_flow/Manager.hpp` - `library/include/modal_flow/Detector.hpp` - `library/include/modal_flow/Tracker.hpp` In the current examples, users instantiate the OpenCL backend directly via: - `library/include/modal_flow/ocl/OclDevice.hpp` - `library/include/modal_flow/ocl/ManagerCL.hpp` - `library/include/modal_flow/ocl/DetectorCL.hpp` - `library/include/modal_flow/ocl/TrackerCL.hpp` ### Core types `Types.hpp` defines `Camera`, `ImageView`, `Frame`, `BufferId`, `Keypoint`, and related enums (`PixelFormat`, `ExternalType`, `Backend`). ### Manager operations `Manager.hpp` exposes camera and buffer lifecycle plus batched detection/tracking: - `add_camera()` / `remove_camera()` - `acquire_pyramid_buf()` / `release_pyramid()` - `upload_frame_to_buf()` - `detect_many()` and `track_many()` ### Detect and track IO `Detector.hpp` defines: - `DetectOptions` - `DetectInput` - `DetectResult` `Tracker.hpp` defines: - `TrackInput` - `TrackResult` ## Field Reference (Used in Detect + Track Examples) This section maps the commonly initialized structs to the field values used by the test apps. ### `modal_flow::Camera` | Field | Meaning | Example value(s) | |---|---|---| | `id` | Logical camera identifier used throughout manager/detect/track calls | `0` (front), `1` (down) | | `width` | Frame width in pixels | `1280` | | `height` | Frame height in pixels | `800` | | `format` | Camera pixel format | `modal_flow::PixelFormat::R8` | `add_camera(cam, num_bufs)` also sets how many internal pyramid buffers are reserved per camera. The examples use `num_bufs = 3` (detect) and `num_bufs = 6` (track). ### `modal_flow::ImageDesc`, `modal_flow::ImageView`, and `modal_flow::Frame` These wrap each incoming ION frame before upload. | Type | Field | Meaning | Example value | |---|---|---|---| | `ImageDesc` | `width` | Image width | `data->img_meta.width` | | `ImageDesc` | `height` | Image height | `data->img_meta.height` | | `ImageDesc` | `format` | Pixel format | `modal_flow::PixelFormat::R8` | | `ImageDesc` | `strideBytes` | Row stride in bytes | `data->img_meta.stride` | | `ImageView` | `data` | CPU pointer input (unused when external handle is used) | `nullptr` | | `ImageView` | `handle_type` | External buffer handle type | `modal_flow::ExternalType::ClMem` | | `ImageView` | `external_handle` | Opaque `cl_mem` handle value | cast of `cl_mem_out[ch]` | | `Frame` | `cam` | Camera id associated with this frame | `(modal_flow::CameraId)ch` | | `Frame` | `t` | Timestamp field (ns) | `0` in these tests | | `Frame` | `img` | Image payload wrapper | `iv` | ### `modal_flow::DetectOptions` | Field | Meaning | Value used in `modal-flow-test-detect` | |---|---|---| | `border_x` | Left/right image border ignored by detector | `3` | | `border_y` | Top/bottom image border ignored by detector | `3` | | `threshold` | FAST-like detection threshold | `35.f` | | `use_grid_detect` | Enable grid-partitioned detection | `true` | | `horizontal_grid_cells` | Number of grid columns | `5` | | `vertical_grid_cells` | Number of grid rows | `5` | | `grid_cells_to_search` | Explicit grid cells to search | all `(row, col)` pairs from `(0,0)` to `(4,4)` | | `use_nms` | Enable non-max suppression | `true` | ### `modal_flow::DetectInput` | Field | Meaning | Value set in example | |---|---|---| | `cam_id` | Camera id to run detect on | `i` | | `img_buf` | Claimed pyramid buffer id for that camera | `g_img_buf[i]` | | `opts` | Detect options for this camera | shared `opts` instance | ### `modal_flow::DetectResult` `detect_many()` returns: - `std::vector` (one result per input camera) - each `DetectResult` contains `keypoints` (`std::vector`) Minimal usage pattern: ```cpp std::vector results = mgr->detect_many(in); const auto& cam0 = results[0]; for (const auto& kp : cam0.keypoints) { float x = kp.x; float y = kp.y; float score = kp.score; // use or filter keypoints here } ``` Example shape of one camera result: ```cpp // Pseudodata for illustration modal_flow::DetectResult cam0_result; cam0_result.keypoints.push_back(modal_flow::Keypoint{102.3f, 87.1f, 34.0f}); cam0_result.keypoints.push_back(modal_flow::Keypoint{245.8f, 121.6f, 41.0f}); cam0_result.keypoints.push_back(modal_flow::Keypoint{512.0f, 300.4f, 29.5f}); ``` ### `modal_flow::TrackInput` | Field | Meaning | Value set in `modal-flow-test-track` | |---|---|---| | `prev_cam_id` | Camera id for previous frame | `i` | | `next_cam_id` | Camera id for current frame | `i` | | `prev_img_buf` | Buffer id containing prior frame pyramid | `prev_img_buf[i]` | | `next_img_buf` | Buffer id containing current frame pyramid | `next_img_buf[i]` | | `prev_points` | Input keypoints to propagate | `seed_pts` / current tracked points | ### `modal_flow::TrackOptions` `TrackOptions` exists in the API and provides LK tuning parameters. The current track example uses library defaults (it does not override them in `TrackInput`). | Field | Meaning | Default value in header | |---|---|---| | `win` | LK tracking window size | `21` | | `max_iters` | Max LK iterations per level | `30` | | `epsilon` | Convergence tolerance | `0.01f` | ### `modal_flow::TrackResult` | Field | Meaning | How example uses it | |---|---|---| | `next_points` | Tracked keypoints for next frame | updates `g_current_points` | | `status` | Per-point validity flag (`1` success, `0` lost) | success keeps trajectory; lost resets to origin | | `error` | Per-point tracking error metric | returned but not thresholded in this test | ### Point layout (`modal_flow::Keypoint`) and indexing The point type used by detect and track is: | Field | Type | Meaning | |---|---|---| | `x` | `float` | X pixel coordinate | | `y` | `float` | Y pixel coordinate | | `score` | `float` | Detector/tracker score or confidence-like value | Practical construction example: ```cpp std::vector seed_pts; seed_pts.push_back(modal_flow::Keypoint{100.f, 100.f, 0.f}); seed_pts.push_back(modal_flow::Keypoint{320.f, 240.f, 0.f}); seed_pts.push_back(modal_flow::Keypoint{640.f, 400.f, 0.f}); ``` Detect output shape: - `DetectResult.keypoints` is `std::vector`. - Each entry is one detected feature point with `x/y/score`. Track input/output shape: - `TrackInput.prev_points` is the input point vector for a frame-to-frame track step. - `TrackResult.next_points`, `TrackResult.status`, and `TrackResult.error` are aligned by index with `prev_points`. Index alignment example: ```cpp for (size_t i = 0; i < res.status.size(); ++i) { const auto& prev = seed_pts[i]; // input point i const auto& next = res.next_points[i]; // tracked output for point i uint8_t ok = res.status[i]; // 1=tracked, 0=lost float err = res.error[i]; // tracking error for point i } ``` ### `ion_buf_release_msg_t` (manual ION release) When `CLIENT_FLAG_MANUAL_ION_BUF_RELEASE` is set, the detect test releases each consumed ION buffer using: - `client_id = 0` - `buffer_id = data->buffer_id` - `generation = data->generation` and sends that struct via `pipe_client_send_control_cmd_bytes(...)`. ## Example Workflow: Detect + Track from ION pipes The code below is adapted directly from: - `examples/modal-flow-test-detect.cpp` - `examples/modal-flow-test-track.cpp` libmodal-flow is not open source; the library and its examples are installed on target as part of the VOXL SDK. ### 1) Create the flow manager, detector/tracker, and register cameras ```cpp auto& dev = modal_flow::ocl::OclDevice::Instance(); mgr = new modal_flow::ocl::ManagerCL(dev); auto det = std::make_unique(dev, /*nms_radius*/ 3); mgr->set_detector(std::move(det)); auto trk = std::make_unique(dev); mgr->set_tracker(std::move(trk)); modal_flow::Camera cam_front{.id = 0, .width = 1280, .height = 800, .format = modal_flow::PixelFormat::R8}; int num_bufs = 3; mgr->add_camera(cam_front, num_bufs); ``` ### 2) Subscribe to camera ION pipes ```cpp for (int ch = 0; ch < kNumCh; ++ch) { pipe_client_set_ion_buf_helper_cb(ch, _ion_buf_cb, nullptr); pipe_client_set_disconnect_cb(ch, _disconnect_cb, nullptr); pipe_client_open( ch, pipes[ch].c_str(), CLIENT_NAME, CLIENT_FLAG_EN_ION_BUF_HELPER | CLIENT_FLAG_MANUAL_ION_BUF_RELEASE, 0); } ``` Use `CLIENT_FLAG_MANUAL_ION_BUF_RELEASE` when your app will explicitly release buffers back to the producer. ### 3) In the ION callback: claim pyramid buffers and upload frames ```cpp modal_flow::ImageDesc desc{data->img_meta.width, data->img_meta.height, modal_flow::PixelFormat::R8, data->img_meta.stride}; modal_flow::ImageView iv{desc, nullptr, modal_flow::ExternalType::ClMem, static_cast(reinterpret_cast(cl_mem_out[ch]))}; modal_flow::Frame f{(modal_flow::CameraId)ch, 0, iv}; if (g_img_buf[ch]) { mgr->release_pyramid((modal_flow::CameraId)ch, g_img_buf[ch]); g_img_buf[ch] = 0; } g_img_buf[ch] = mgr->acquire_pyramid_buf((modal_flow::CameraId)ch); mgr->upload_frame_to_buf(f, g_img_buf[ch]); ``` This is the claim/use/release cycle for internal pyramid buffers. ### 4) Run feature detection ```cpp std::vector in(kNumCh); modal_flow::DetectOptions opts; opts.border_x = 3; opts.border_y = 3; opts.threshold = 35.f; opts.use_grid_detect = true; opts.horizontal_grid_cells = 5; opts.vertical_grid_cells = 5; opts.use_nms = true; for (int i = 0; i < kNumCh; i++) { in[i].cam_id = i; in[i].img_buf = g_img_buf[i]; in[i].opts = opts; } auto res = mgr->detect_many(in); ``` ### 5) Run tracking between previous and current buffers ```cpp std::vector inputs(kNumCh); for (int i = 0; i < kNumCh; ++i) { inputs[i].prev_cam_id = i; inputs[i].next_cam_id = i; inputs[i].prev_img_buf = prev_img_buf[i]; inputs[i].next_img_buf = next_img_buf[i]; inputs[i].prev_points = seed_pts; } std::vector results = mgr->track_many(inputs); ``` ### 6) Release pyramid buffers (`release_pyramid`) after detect/track use The API method is `release_pyramid(CameraId, BufferId)` (there is no `release_pyramid_buf` symbol in the header). Recommended lifecycle: - claim: `BufferId id = mgr->acquire_pyramid_buf(cam_id);` - use: `mgr->upload_frame_to_buf(frame, id);` and run detect/track using that `id` - release: `mgr->release_pyramid(cam_id, id);` when the buffer is no longer needed Common patterns used in the examples: - detect loop: release previous frame's `g_img_buf[ch]` before acquiring the next one - track loop: when `next_img_buf[ch]` becomes `prev_img_buf[ch]`, release the old previous buffer first - shutdown: release any remaining non-zero `BufferId` values before exit Minimal cleanup pattern: ```cpp for (int ch = 0; ch < kNumCh; ++ch) { if (g_img_buf[ch]) { mgr->release_pyramid((modal_flow::CameraId)ch, g_img_buf[ch]); g_img_buf[ch] = 0; } } ``` ### 7) Release ION buffers when images are no longer needed If manual release is enabled, return each consumed buffer to the producer: ```cpp ion_buf_release_msg_t msg; msg.client_id = 0; msg.buffer_id = data->buffer_id; msg.generation = data->generation; int ret = pipe_client_send_control_cmd_bytes(ch, &msg, sizeof(ion_buf_release_msg_t)); ``` Without this release step, camera producers can stall due to unreleased buffers. ## Notes - `modal-flow-test-detect` demonstrates a detection-oriented pipeline and explicit ION buffer release. - `modal-flow-test-track` demonstrates temporal tracking with `prev_img_buf`/`next_img_buf` and `TrackResult.status` handling. - For clean shutdown, close all subscriptions with `pipe_client_close_all()`. --- Source: https://docs.modalai.com/pipe-utilities/ # Pipe Utilities These are the everyday commands for working with [MPA](/mpa/) pipes: listing what's available in `/run/mpa`, reading a pipe's info, sending control commands, shutting down a pipe's server, and recording camera pipes to disk. They are small companions to [libmodal-pipe](/libmodal-pipe/), which defines the pipe architecture itself. Most live in the voxl-mpa-tools package; `voxl-inspect-pipe-info` ships with libmodal-pipe. --- ## voxl-list-pipes Lists all available MPA pipes in `/run/mpa`, grouped and sorted by pipe type (read from each pipe's `info` file). Use `-t ` to print only pipe names of one type. ``` voxl2:/$ voxl-list-pipes --help voxl-list-pipes List all of the available MPA pipes Options: -h|--help : Show this help message -t : Show only pipes of this type ``` ```bash voxl2:/$ voxl-list-pipes -t imu_data_t ``` ``` imu_apps ``` ## voxl-inspect-pipe-info Reads and pretty-prints the JSON `info` file for a pipe, showing its name, location, type, owning server, pipe size, and server PID, plus the pipe's `available_commands` when the server declares them. ``` voxl2:/$ voxl-inspect-pipe-info --help Tool to read and print the json info for a pipe -h, --help print this help message example useage: /# voxl-inspect-pipe-info imu_apps ``` ```bash voxl2:/$ voxl-inspect-pipe-info imu_apps ``` ``` { "name": "imu_apps", "location": "/run/mpa/imu_apps/", "type": "imu_data_t", "server_name": "voxl-imu-server", "size_bytes": 131072, "server_pid": 2214 } ``` ## voxl-send-command Sends a control command to a pipe's control channel by writing it into `/run/mpa//control`. The first argument is the pipe name (or path); everything after it is sent as the command. The commands a server accepts are listed in the `available_commands` field of its pipe info, which you can read with `voxl-inspect-pipe-info`. ```bash voxl2:/$ voxl-send-command qvio reset_vio_soft ``` ``` Successfully sent command to /run/mpa/qvio/control ``` If the pipe does not exist or has no control channel, it prints `Unable to find valid pipe that accepts control commands at: ` and exits with an error. ## voxl-kill-pipe Tells the server that owns a given pipe to shut down, and cleans up any dangling pipes it leaves behind. ``` voxl2:/$ voxl-kill-pipe --help Tool to stop the owning process for a given pipe name and clean up any dangling pipes that may remain. This will first send SIGINT to simulate ctrl-C and wait for the specified timeout (default 2 seconds). If the process does not exit gracefully in the timeout, it will be sent SIGKILL to force the process to stop with blind and barbaric fury. If the process does not exit gracefully, it may leave the specified pipe dangling in the file system. If that were to occur, this program will cleanup the pipe from the file system. You can perform this same operation with this function that is part of libmodal_pipe: pipe_kill_server_process(pipe_path, 2.0) -h, --help print this help message -t, --timeout_s{seconds} timeout to wait before sending SIGKILL default is 2.0 seconds. example useage: long method to kill voxl-imu-server: /# voxl_kill_pipe /run/mpa/imu0/ shortcut method to kill voxl-camera-server /# voxl_kill_pipe tracking ``` ```bash voxl2:/$ voxl-kill-pipe tracking ``` ## voxl-record-video Records an encoded camera pipe to disk as an H.264/H.265 video file (default output `/data/video/voxl-record-video.h264`). Encoder parameters can be overridden on the command line. Stop recording with Ctrl-C; the tool prints the output file path on exit. ``` voxl2:/$ voxl-record-video --help Record camera pipe to disk Options are: -o, --out Output file path -h, --help Print this help message Encoder options (override defaults): --qfixed Fixed QP (default 38) --qmin Min QP (default 15) --qmax Max QP (default 50) --pframes Number of P-frames between I-frames (default 29) --mbps Target Mbps for CBR/CQP (default 2.00) --codec Codec (default h265) --br Bitrate control (default cbr) Examples: voxl-record-video hires voxl-record-video hires -o /data/vid.h265 --codec h265 --qfixed 34 --pframes 29 --mbps 3.0 --br cbr ``` ```bash voxl2:/$ voxl-record-video hires -o /data/vid.h265 ``` ## voxl-record-raw-image Saves raw frames from a camera pipe to disk (default directory `/data/raw-images/`), typically for inspecting raw or YUV image formatting or for post-processing in MATLAB or OpenCV. Added in voxl-mpa-tools 1.5.9, it can also convert frames to JPEG (`-j`, with `-q` quality), skip frames between saves (`-s`), and embed the timestamp, exposure, and gain metadata in the file name (`-m`). ``` voxl2:/$ voxl-record-raw-image --help Record a raw image from an MPA pipe to disk This is typically used for inspecting raw or YUV image data formatting or for loading into something like MATLAB or OpenCV for post-processing. Optional arguments are: -d, --dir {dir} directory to save output files in (default: /data/raw-images/) -h, --help print this help message -j, --jpeg convert to JPEG before saving (supports NV12, NV21, RGB, RAW8 formats) -q, --jpeg-quality JPEG quality for compression (1-100, default: 90) -n, --num-images {n} number of images to save from the pipe (default 1) -m, --meta save metadata in file name (timestamp (us), exposure (us), gain) -s, --skip {n} skip n frames before saving a new frame typical usage: -/# voxl-record-raw-image tracking -/# voxl-record-raw-image tracking -d /data/tracking_test_1/ -n 10 -/# voxl-record-raw-image hires_misp_color -j -q 95 ``` ```bash voxl2:/$ voxl-record-raw-image tracking -n 10 ``` ## Source `voxl-list-pipes`, `voxl-send-command` ([scripts](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/tree/master/scripts)), `voxl-kill-pipe`, `voxl-record-video`, and `voxl-record-raw-image` ([tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/tree/master/tools)) are part of voxl-mpa-tools. `voxl-inspect-pipe-info` lives in [libmodal-pipe](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/tools/voxl-inspect-pipe-info.c). --- Source: https://docs.modalai.com/voxl-inspect-services/ # VOXL Inspect Services `voxl-inspect-services` is a simple tool to show which of ModalAI's systemd background services are enabled (start on boot), running, and what their cpu usage is (if running). The CPU usage should be taken with a grain of salt, as it a momentary snapshot of CPU usage. We recommend using `top` for more accurate process-specific cpu utilization. ## Arguments | Parameter | Description | Example | |--- |--- |--- | |-h --help | Show the help message | ```voxl-inspect-services --help``` | |-d --debug | Debug mode | ```voxl-inspect-services -d``` | |-v --version | Show versions as well (takes longer to run) | ```voxl-inspect-services -v``` | |-j --json | Output in Json Format | ```voxl-inspect-services -j``` | ## Typical Use ``` voxl2:/$ voxl-inspect-services Service Name | Enabled | Running | CPU Usage -------------------------------------------------------------- docker-autorun | Disabled | Not Running | docker-daemon | Disabled | Not Running | modallink-relink | Disabled | Not Running | voxl-camera-server | Enabled | Running | 3.4 voxl-cpu-monitor | Enabled | Running | 0.0 voxl-dfs-server | Disabled | Not Running | voxl-imu-server | Enabled | Running | 1.9 voxl-modem | Disabled | Not Running | voxl-portal | Enabled | Running | 0.0 voxl-qvio-server | Enabled | Running | 11.7 voxl-streamer | Disabled | Not Running | voxl-tag-detector | Enabled | Not Running | voxl-tflite-server | Disabled | Not Running | voxl-time-sync | Disabled | Not Running | voxl-vision-hub | Enabled | Running | 4.0 voxl-wait-for-fs | Enabled | Completed | ``` ## Optionally Show Version Numbers The version column is disabled by default since the version number lookup is slow compared with the default three columns. However, it can be enabled with the `-v` or `--version` flag ``` voxl2:/$ voxl-inspect-services --version Service Name | Version | Enabled | Running | CPU Usage -------------------------------------------------------------------------- docker-autorun | 1.1.3 | Disabled | Not Running | docker-daemon | 1.1.3 | Disabled | Not Running | modallink-relink | 0.12.0 | Disabled | Not Running | voxl-camera-server | 0.8.1 | Enabled | Running | 5.2 voxl-cpu-monitor | 0.2.0 | Enabled | Running | 0.0 voxl-dfs-server | 0.2.2 | Disabled | Not Running | voxl-imu-server | 0.9.0 | Enabled | Running | 1.7 voxl-modem | 0.12.0 | Disabled | Not Running | voxl-portal | 0.1.2 | Enabled | Running | 0.0 voxl-qvio-server | 0.3.4 | Enabled | Running | 12.2 voxl-streamer | 0.2.6 | Disabled | Not Running | voxl-tag-detector | 0.0.2 | Enabled | Not Running | voxl-tflite-server | 0.1.6 | Disabled | Not Running | voxl-time-sync | 0.8.3 | Disabled | Not Running | voxl-vision-hub | 0.9.5 | Enabled | Running | 4.0 voxl-wait-for-fs | 0.8.3 | Enabled | Completed | ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/scripts/voxl-inspect-services). --- Source: https://docs.modalai.com/voxl-inspect-cpu/ # VOXL Inspect CPU `voxl-inspect-cpu` is a tool to check the CPU/GPU utilization and temperature of the various voxl components. It is part of the voxl-cpu-monitor package and subscribes to the `cpu_monitor` pipe. If you don't get data using this tool, make sure the voxl-cpu-monitor systemd service is running using [VOXL Inspect Services](/voxl-inspect-services/). ## Arguments ``` voxl2:/$ voxl-inspect-cpu --help Tool to print cpu monitor information to the screen for inspection Run this in debug mode to enable debug prints in the libmodal_pipe client code. You can also try the auto-reconnect mode which is useful for some projects but not all. -f, --full print full table with more data -j, --json output results as JSON instead of a table -k, --json_human print output in human-readable formatted json format for development and debug only -t, --test get a single sample -h, --help print this help message ``` The `-f`/`--full` option adds Top CPU Consumers and Top Memory Consumers process tables to the output. The `-t`/`--test` option prints a single sample and exits. ## Use The left column is a table of per-core frequency, temperature, and utilization followed by the GPU. The right column shows the clock, uptime, memory use, memory allocation rate, and the current flags. The Governor field shows one of Auto, Perf, Powersave, Conserv, or Cool. ``` voxl2:/$ voxl-inspect-cpu Name MHz Temp Util | Aug 3 2026 10:15:02 cpu0 1075 43.9 4.5 | Uptime: 2:14:37 cpu1 1075 43.6 3.1 | cpu2 1075 43.9 2.2 | Mem Use (MB) cpu3 1075 43.6 1.8 | 1201.4/7168 cpu4 2419 44.2 0.9 | Mem Allocation cpu5 2419 44.5 0.4 | 0.2 MB/s cpu6 2419 44.2 0.0 | cpu7 2841 44.8 0.0 | Governor: Auto Total 44.8 1.6 | Pitmode: Not Active 10s avg 1.7 | Auto Pitmode: OFF -------------------------| GPU 587 42.5 0.0 | GPU 10s avg 0.0 | ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor/-/blob/master/clients/voxl-inspect-cpu.c). --- Source: https://docs.modalai.com/voxl-inspect-imu/ # VOXL Inspect IMU `voxl-inspect-imu` is a tool to check the imu measurements of the imus on voxl. It requires that [VOXL IMU Server](/voxl-imu-server/) is running in the background, which can be checked with [VOXL Inspect Services](/voxl-inspect-services/). --- ## Arguments ### Optional Pipe
IMU: Which IMU to display data from. If omitted, this defaults to `imu_apps`. Available imus can be seen by typing ```voxl-inspect-imu {TAB} {TAB}```. On VOXL 2 this is typically imu_apps, on VOXL 1 your options are imu0 or imu1. ### Optional | Parameter | Description | Example | |--- |--- |--- | |-a --all | Show all imu data, not scaled down for screen performance (this will print lines at ~1khz)| ```voxl-inspect-imu imu_apps -a``` | |-c --csv | Print imu samples as csv for analysis | ```voxl-inspect-imu -c``` | |-d --debug | Enable libmodal-pipe debug mode | ```voxl-inspect-imu -d``` | |-h --help | Print help message | ```voxl-inspect-imu --help``` | |-j --json | Output results as JSON | ```voxl-inspect-imu -j``` | |-k --json_human | Format JSON output as human-readable | ```voxl-inspect-imu -k``` | |-n --newline | Print each sample on a new line instead of updating the current output line | ```voxl-inspect-imu imu_apps -n``` | |-t --time {sec} | Wait time in seconds between printing samples | ```voxl-inspect-imu -t 0.5``` | |-T --test | Get a single sample | ```voxl-inspect-imu -T``` | > Unlike `voxl-inspect-cam`, lowercase `-t` here sets the print interval, NOT test mode. Use uppercase `-T` for a single-sample test. ## Example Output ``` voxl2:/$ voxl-inspect-imu imu_apps Acc in m/s^2, gyro in rad/s, temp in C delay(ms)|gravity| accl_x accl_y accl_z| gyro_x gyro_y gyro_z | Temp |Samples| 1.2 | 9.63 | 0.12 -9.57 1.08 | 0.010 0.020 0.000 | 35.03 | 5 | ^C received SIGINT Ctrl-C closing and exiting voxl2:/$ ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-imu.c). --- Source: https://docs.modalai.com/voxl-inspect-cam/ # VOXL Inspect Cam The utility `voxl-inspect-cam` is a tool to check image metadata coming from MPA services that are publishing camera data. It requires that [VOXL Camera Server](/voxl-camera-server/) is running in the background, which can be checked with [VOXL Inspect Services](/voxl-inspect-services/). It can also be used to check non-camera images, such as the overlays coming out of [VOXL TFLite Server](/voxl-tflite-server/) or [voxl-open-vins-server](/voxl-open-vins-server/). --- ## Arguments ### Required
Cam: Which image pipe(s) to display data from. Available images can be seen by typing ```voxl-inspect-cam {TAB} {TAB}```, which lists all available camera pipes via tab completion. Multiple pipes can be given on one command line, e.g. ```voxl-inspect-cam tracking hires```. Options that will regularly be available are: #### Direct Cameras - tracking, or on newer platforms tracking_front / tracking_down - stereo - hires, plus downscaled streams such as hires_small_color / hires_small_grey - tof_depth #### Other Images - tof_conf - tof_noise - tof_ir - dfs_disparity - qvio_overlay - tflite_overlay ### Optional | Parameter | Description | Example | |--- |--- |--- | |-a --all | Inspect every available camera at once (not usable with --test or --newline) | ```voxl-inspect-cam -a``` | |-h --help | Print help message | ```voxl-inspect-cam --help``` | |-j --json | Output results as JSON | ```voxl-inspect-cam tracking -j``` | |-k --json_human | Output results as human-readable JSON | ```voxl-inspect-cam tracking -k``` | |-n --newline | Print each sample on a new line instead of updating the current output line | ```voxl-inspect-cam tracking -n``` | |-t --test | Test mode: prints `TEST PASSED` and exits 0 as soon as a frame arrives, or `TEST FAILED` and exits nonzero after ~10 seconds — useful in scripts | ```voxl-inspect-cam tracking -t``` | ## Example Output ``` voxl2:/$ voxl-inspect-cam tracking | Pipe Name | bytes | wide | hgt |exp(ms)| gain | frame id |latency(ms)| fps | mbps | format | tracking | 307200 | 640 | 480 | 3.8 | 100 | 71976 | 18.6 | 30.0 | 73.7 | RAW8 ^C received SIGINT Ctrl-C closing and exiting voxl2:/$ ``` For encoded streams, the format column decodes the frame type as `H264/H265 (head)/(I)/(P)`. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-cam.c). --- Source: https://docs.modalai.com/voxl-inspect-vio/ # VOXL Inspect VIO `voxl-inspect-vio` prints VIO data from Modal Pipe Architecture. By default it opens the `vvhub_aligned_vio` pipe published by [voxl-vision-hub](/voxl-vision-hub/), which is a gravity-aligned version of whatever raw VIO source voxl-vision-hub is consuming and sending to the autopilot. It represents the center of mass of the drone in the local FRD frame. You can also pass a pipe name such as `qvio` or `ov` as an argument to inspect a VIO server's output directly. > For inspecting the raw `qvio_extended` pipe from voxl-qvio-server, see the older [voxl-inspect-qvio](/voxl-inspect-qvio/) tool. `voxl-inspect-vio` is the more general tool and works with any `vio_data_t` pipe. --- ## Arguments ``` voxl2:/$ voxl-inspect-vio --help typical usage /# voxl-inspect-vio /# voxl-inspect-vio qvio -v This will print out vio data from Modal Pipe Architecture. By default this opens the vvhub_aligned_vio pipe from voxl-vision-hub but this can be changed by specifying a pipe name to inspect qvio or openvins data directly. The vvhub_aligned_vio pipe is a gravity-aligned version of whatever raw vio source is being consumed by voxl-vision-hub and being sent to the autopilot and represents the COM of the drone in local FRD frame. Position and rotation will always print. Additional options are: -a, --imu_angular_vel print imu_angular_vel -g, --gravity_vector print gravity_vector -h, --help print this help message -m, --extrinsics print cam to imu extrinsics -n, --newline print each sample on a new line -t, --timestamp_ns print timestamp_ns -v, --vel_imu_wrt_vio print vel_imu_wrt_vio -z, --print_everything print everything ``` ## Example Output Position and rotation always print. The sample interval `dt(ms)`, feature count, quality, state, and error codes are also shown by default; the remaining columns are enabled with the flags above. ```bash voxl2:/$ voxl-inspect-vio ``` ``` dt(ms) | T_imu_wrt_vio (m) |Roll Pitch Yaw (deg)|features|quality| state| error_codes 33.4 | -4.96 0.94 -0.00| 17.9 -52.3 9.3| 45 | 62% | OKAY | ``` ## Troubleshooting If no data appears when using the default pipe, make sure [voxl-vision-hub](/voxl-vision-hub/) and a VIO server are running, which can be checked with [voxl-inspect-services](/voxl-inspect-services/). ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-vio.c). --- Source: https://docs.modalai.com/voxl-inspect-qvio/ # VOXL Inspect QVIO `voxl-inspect-qvio` is a tool to check VIO localization data coming from QVIO. It requires that VOXL QVIO Server is running in the background, which can be checked with [VOXL Inspect Services](/voxl-inspect-services/). > `voxl-inspect-qvio` inspects the raw `qvio_extended` pipe only. For gravity-aligned VIO output from [voxl-vision-hub](/voxl-vision-hub/), use the newer [voxl-inspect-vio](/voxl-inspect-vio/) tool, which defaults to the `vvhub_aligned_vio` pipe. --- ## Arguments ```bash voxl2:/$ voxl-inspect-qvio --help typical usage /# voxl-inspect-qvio This will print out qvio data from Modal Pipe Architecture. By default this opens the extended qvio pipe /run/mpa/qvio_extended/ but this can be changed with the --pipe option. Position and rotation will always print. Additional options are: -a, --imu_angular_vel print imu_angular_vel -b, --accl_gyro_bias print accl and gyro bias -c, --time_shift_s print imu_cam_time_shift_s -d, --feature_depth print distance to good features -g, --gravity_vector print gravity_vector -h, --help print this help message -m, --extrinsics print cam to imu extrinsics -n, --newline print each sample on a new line -p, --pipe {pipe_name} optionally specify the pipe name -t, --timestamp_ns print timestamp_ns -v, --vel_imu_wrt_vio print vel_imu_wrt_vio -z, --print_everything print everything ``` ## Example Output ``` voxl2:/$ voxl-inspect-qvio T_imu_wrt_vio (m) |Roll Pitch Yaw (deg)| state| error_codes -4.96 0.94 -0.00| 17.9 -52.3 9.3| OKAY | ^C received SIGINT Ctrl-C closing and exiting voxl2:/$ ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server). --- Source: https://docs.modalai.com/voxl-inspect-battery/ # VOXL Inspect Battery This tool subscribes to the `/run/mpa/mavlink_sys_status` pipe published by [voxl-vision-hub](/voxl-vision-hub/) which provides a copy of all SYS_STATUS mavlink messages received from a PX4 flight controller. Among other things, this packet contains battery status information which can be viewed here. Also note that [voxl-portal](/voxl-portal/) subscribes to the same pipe and also shows battery percentage in the top right corner of the webpage. --- ## Arguments ```bash voxl2:/$ voxl-inspect-battery --help Tool to print battery data from autopilot to the screen for inspection. If no data comes through then either: 1. the voxl-vision-hub service isn't running 2. autopilot isn't connected -h, --help print this help message -n, --newline print newline between each sample ``` ## Use ```bash voxl2:/$ voxl-inspect-battery Voltage | Charge | Current | Power | 12.22V | 89% | 0.49A | 5.99W | ``` ## Troubleshooting If no data is displayed, then either [voxl-vision-hub](/voxl-vision-hub/) is not running or PX4 is not connected or operating. Individual fields print `N/A` when the autopilot reports invalid values. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-battery.c). --- Source: https://docs.modalai.com/voxl-inspect-gps/ # VOXL Inspect GPS This tool subscribes to the `mavlink_gps_raw_int` pipe published by [voxl-vision-hub](/voxl-vision-hub/) which provides a copy of all GPS_RAW_INT mavlink messages received from a PX4 flight controller. Also note that [voxl-portal](/voxl-portal/) subscribes to the same pipe and also shows GPS satellites in the top right corner of the webpage. --- ## Arguments ```bash voxl2:/$ voxl-inspect-gps --help Tool to print GPS data from autopilot to the screen for inspection. If no data comes through then either: 1. the voxl-vision-hub service isn't running 2. Autopilot isn't connected 3. Autopilot doesn't have GPS lock yet -h, --help print this help message -n, --newline print newline between each sample ``` ## Use ``` voxl2:/$ voxl-inspect-gps dt(ms) |fix type|Sats|Latitude(deg)|Longitude(deg)| Alt(m) |Vel(m/s)|HorErr(m)|AltErr(m)| 200.2 | 3D FIX | 5 | 32.9007509 | -117.2223741 | 10.9 | 0.02 | 33.962 | 30.965 | ``` The fix type column can report: NO GPS, NO FIX, 2D FIX, 3D FIX, DGPS, RTKFLOAT, RTKFIXED, STATIC, or 3D PPP. ## Troubleshooting If no data is displayed, then either [voxl-vision-hub](/voxl-vision-hub/) is not running or PX4 is not connected or operating. PX4 may also not be connected to a GPS or configured to enable it. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-gps.c). --- Source: https://docs.modalai.com/voxl-inspect-extrinsics/ # VOXL Inspect Extrinsics This tool reads the `/etc/modalai/extrinsics.conf` file and prints the data to the screen for debug. For more info about this extrinsics config file, see the [Configure Extrinsics page](/configure-extrinsics/). --- ## Arguments ```bash voxl2:/$ voxl-inspect-extrinsics --help Tool to print extrinsic config as loaded from disk. quiet mode: only validate the file contents and exit all mode: print all extrisic relations single mode: print the relation between a specified parent and child -h, --help print this help message -q, --quiet quiet mode -a, --all print all relations -p, --parent Specify the parent in single mode -c, --child Specify the child in single mode typical usage: /# voxl-inspect-extrinsics --all /# voxl-inspect-extrinsics -p body -c tracking_front voxl2:/$ ``` ## Use ```bash voxl2:/$ voxl-inspect-extrinsics --all #0: parent: imu1 child: imu0 T_child_wrt_parent: -0.048 0.037 0.002 RPY_parent_to_child: 0.0 0.0 0.0 R_child_to_parent: 1.000 -0.000 0.000 0.000 1.000 -0.000 0.000 0.000 1.000 #1: parent: imu0 child: tracking T_child_wrt_parent: 0.065 -0.014 0.013 RPY_parent_to_child: 0.0 45.0 90.0 R_child_to_parent: 0.000 -0.707 0.707 1.000 0.000 -0.000 -0.000 0.707 0.707 #2: parent: imu1 child: tracking T_child_wrt_parent: 0.017 0.015 0.013 RPY_parent_to_child: 0.0 45.0 90.0 R_child_to_parent: 0.000 -0.707 0.707 1.000 0.000 -0.000 -0.000 0.707 0.707 #3: parent: body child: imu0 T_child_wrt_parent: 0.020 0.014 -0.008 RPY_parent_to_child: 0.0 0.0 0.0 R_child_to_parent: 1.000 -0.000 0.000 0.000 1.000 -0.000 0.000 0.000 1.000 #4: parent: body child: imu1 T_child_wrt_parent: 0.068 -0.015 -0.008 RPY_parent_to_child: 0.0 0.0 0.0 R_child_to_parent: 1.000 -0.000 0.000 0.000 1.000 -0.000 0.000 0.000 1.000 #5: parent: body child: stereo_l T_child_wrt_parent: 0.100 -0.040 0.000 RPY_parent_to_child: 0.0 90.0 90.0 R_child_to_parent: 0.000 -0.000 1.000 1.000 0.000 -0.000 -0.000 1.000 0.000 #6: parent: body child: tof T_child_wrt_parent: 0.100 0.000 0.000 RPY_parent_to_child: 0.0 90.0 90.0 R_child_to_parent: 0.000 -0.000 1.000 1.000 0.000 -0.000 -0.000 1.000 0.000 #7: parent: body child: ground T_child_wrt_parent: 0.000 0.000 0.100 RPY_parent_to_child: 0.0 0.0 0.0 R_child_to_parent: 1.000 -0.000 0.000 0.000 1.000 -0.000 0.000 0.000 1.000 ``` To print just one relation, specify the parent and child frames in single mode: ```bash voxl2:/$ voxl-inspect-extrinsics -p body -c tracking_front ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-extrinsics.c). --- Source: https://docs.modalai.com/voxl-inspect-vio-cams/ # VOXL Inspect VIO Cams `voxl-inspect-vio-cams` prints the VIO camera configuration as loaded from disk (`/etc/modalai/vio_cams.conf`). This is the data consumed by voxl-qvio-server, voxl-feature-tracker, and [voxl-open-vins-server](/voxl-open-vins-server/) to determine which cameras and IMUs to use for VIO. See [Flying with VIO](/flying-with-vio/) for how this fits into the overall VIO setup. After listing the camera entries, the tool also prints the IMU-to-body rotation matrix (fetched from the extrinsics configuration, see [voxl-inspect-extrinsics](/voxl-inspect-extrinsics/)) which voxl-open-vins-server needs. The write-side counterpart is `voxl-configure-vio-cams`, which installs and manages `/etc/modalai/vio_cams.conf`. --- ## Arguments ``` voxl2:/$ voxl-inspect-vio-cams --help Tool to print vio-cam config as loaded from disk. This is the data consumed by voxl-qvio-server, voxl-feature-tracker, and voxl-open-vins-server to see what camera and imus to use See also: voxl-inspect-apriltag-config -h, --help print this help message -e, --enabled_only only print enabled cameras typical usage: /# voxl-inspect-vio-cams ``` ## Example Use ```bash voxl2:/$ voxl-inspect-vio-cams -e ``` The output lists each (enabled) camera entry from `vio_cams.conf`, followed by the IMU-to-body rotation, e.g.: ``` R_imu_apps_to_body: 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-vio-cams.c). --- Source: https://docs.modalai.com/voxl-inspect-pose/ # VOXL Inspect Pose This inspect tool can display data from `pose_vel_6dof_t` type pipes. It is usually used for checking the local pose which is sent to PX4, and the fixed pose which is the result of [AprilTag relocalization](/voxl-vision-hub-apriltag-relocalization/). Both of these pipes are published by [voxl-vision-hub](/voxl-vision-hub/). --- ## Arguments ```bash voxl2:/$ voxl-inspect-pose --help Tool to print pose data to the screen for inspection. The --local and --fixed arguments are shortcuts to view the local and fixed frame poses published by voxl-vision-hub. However, any 6-dof pose pipe can be inspected. -f, --fixed print pose of body with respect to fixed frame -h, --help print this help message -l, --local print pose of body with respect to lcoal frame -n, --newline print newline between each pose typical usage: /# voxl-inspect-pose -l /# voxl-inspect-pose vvhub_body_wrt_local /# voxl-inspect-pose -f /# voxl-inspect-pose vvhub_body_wrt_fixed ``` ## Example Use ```bash voxl2:/$ voxl-inspect-pose --local timestamp(ms)| Position (m) | Roll Pitch Yaw (deg) | Velocity (m/s) | angular rate (deg/s) | 791952 | 0.05 -0.03 -0.10 | 1.6 -5.3 -0.1 | 0.00 0.00 0.00 | 0.17 -0.24 0.08 |^ ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-pose.c). --- Source: https://docs.modalai.com/voxl-inspect-points/ # VOXL Inspect Points `voxl-inspect-points` is a tool to debug point cloud data in MPA. As a command line tool it provides no visualization but does indicate if data is being published along with the number and type of point. --- ## Arguments ``` voxl2:/$ voxl-inspect-points -h Tool to print point cloud metadata to the screen for inspection. This will also print the first point received with each message. -h, --help print this help message -n, --newline print newline between each pose typical usage: /# voxl-inspect-points tof_pc ``` ## Example Output For example, to see if the [Depth from Stereo](/voxl-dfs-server/) is outputting data, run the following command. Note, you should be able to tab out any pipes with the point cloud type. ``` voxl2:/$ voxl-inspect-points dfs_point_cloud timestamp(ms)| # points | # bytes | 1st point | Format 1728549 | 4800 | 57600 | 0.51 0.03 1.20 | Float XYZ ``` For TOF sensors, use [voxl-inspect-tof](/voxl-inspect-tof/) instead (default pipe `tof`), which prints the middle point of the image. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-points.c). --- Source: https://docs.modalai.com/voxl-inspect-tof/ # VOXL Inspect TOF `voxl-inspect-tof` prints PMD Time of Flight (TOF) metadata to the screen for inspection, defaulting to the `tof` pipe. Along with the frame size and maximum depth it prints the middle point of the image with its confidence value, making it a quick way to check that the sensor is running and returning sane depth values. > For point cloud pipes such as `tof_pc`, use [voxl-inspect-points](/voxl-inspect-points/) instead. --- ## Arguments ``` voxl2:/$ voxl-inspect-tof --help Tool to print PMD TOF metadata to the screen for inspection. This will also print the middle point received with each message. For pipes publishing format tof_data_t only -h, --help print this help message -n, --newline print newline between each pose typical usage: /# voxl-inspect-tof tof ``` ## Example Output ```bash voxl2:/$ voxl-inspect-tof ``` ``` timestamp(ms)| w | h | Zmax | center point (m) (conf) 174964 | 224 | 172 | 6.0 | 0.0 -0.1 1.2 255 ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-tof.c). --- Source: https://docs.modalai.com/voxl-inspect-tags/ # VOXL Inspect Tags voxl-inspect-tags is a test utility that's part of the [voxl-tag-detector](/voxl-tag-detector/) project. It has no command line arguments, it just subscribes to the voxl-tag-detector output pipe at /run/mpa/tag_detections as prints all detections to the screen for debug. --- ## Use ``` voxl2:/$ voxl-inspect-tags connected to voxl-tag-detector id: 0 name: default_name XYZ: -1.70 -1.52 1.68 RPY: 34.1 -36.0 153.5 size_m: 0.40 latency_ms: 46.11 cam: tracking type: unknown ``` ## Source Source code available on [GitLab here](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-tag-detector/-/blob/master/clients/voxl-inspect-tags.c). --- Source: https://docs.modalai.com/voxl-inspect-vibration/ # VOXL Inspect Vibration `voxl-inspect-vibration` is a lightweight tool to example accelerometer and gyroscope noise and vibration while in flight. It works by calculating the RMS of each accelerometer and gyro channel over n_samples (default 1500). The data is pre-filtered through a configurable butterworth high-pass filter with default cutoff frequency of 50hz so that steady desirable motion does not contribute to the vibration measurement. This is a reasonable cuttoff frequency for the goal of measuring undesirable vibration on an airframe. Howveer, it can be changed with the `--freq` argument to suite different use cases. All of the outputs are colorized to red, yellow, or green depending on the vibration level. The exact thresholds for these colors can be found in the [source code](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-vibration.c) and are very rough guidelines for what is acceptible. --- ## Arguments ``` voxl2:/$ voxl-inspect-vibration --help Tool to measure IMU vibration through Modal Pipe Architecture. This works by calculating the RMS of each accelerometer and gyro channel over n_samples (default 1500). This can also be interpreted as the standard deviation of the signal. The data is pre-filtered through a configurable butterworth high-pass filter with default cutoff frequency of 50hz so that steady desirable motion does not contribute to the vibration measurement. Change this frequency with the --freq argument. Set it to 0 to disable the filter altogether. -f, --freq {freq_hz} high-pass cutoff frequency (hz) -h, --help print this help message -l, --newline print new line for every sample -n, --n_samples {samples} number of samples to use for each calculation -t, --timeout return after printing the first measurement typical usage on VOXL2: /# voxl-inspect-vibration typical usage on VOXL 1: /# voxl-inspect-vibration imu_1 ``` The `-t`/`--timeout` flag returns after the first measurement and also suppresses the header/legend, which is useful for scripting. ## Example Use On VOXL 2, run `voxl-inspect-vibration` with no arguments (default pipe `imu_apps`). On VOXL 1, specify the imu pipe, e.g. `voxl-inspect-vibration imu1`. For a drone sitting still, all values should show up in green. The small amount of vibration detected here is due to sensor noise and the fan. ``` voxl2:/$ voxl-inspect-vibration Noise values are RMS values in units of m/s2 and rad/s. Value in parenthesis are the max values recorded since the start. Values in RED are high (>5.00m/s2 or >0.50rad/s). Values in YELLOW are okay (>2.00m/s2 or >0.20rad/s). Values in GREEN are great! Accl (X) | Accl (Y) | Accl (Z) | Gyro (X) | Gyro (Y) | Gyro (Z) 0.03(0.03) 0.02(0.02) 0.01(0.01) 0.00(0.00) 0.00(0.00) 0.00(0.00) ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-vibration.c). --- Source: https://docs.modalai.com/voxl-inspect-detections/ # VOXL Inspect Detections `voxl-inspect-detections` prints AI detection data (`ai_detection_t` packets) from an MPA pipe, such as the `tflite_data` pipe published by [voxl-tflite-server](/voxl-tflite-server/). A pipe name must be given. By default it prints condensed info for every detection; the `-a`/`--all` option adds the frame ID, timestamp, and detection center columns. --- ## Arguments ``` voxl2:/$ voxl-inspect-detections --help Tool to print ai detection data to the screen for inspection. By default this will print all packets received each read with condensed info. Use the --all option to print some extra data about the detections. -a, --all print all data received -h, --help print this help message example usage: /# voxl-inspect-detections tflite_data ``` ## Example Output ```bash voxl2:/$ voxl-inspect-detections tflite_data ``` ``` | Class Name | Camera | Class Confidence | Detection Confidence | |------------------|--------------|------------------|----------------------| | person |hires | 77.34 | 88.9 | ``` ## Troubleshooting If no data appears, make sure [voxl-tflite-server](/voxl-tflite-server/) (or whichever server publishes your detection pipe) is running and that a camera is feeding it frames. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-detections.c). --- Source: https://docs.modalai.com/voxl-inspect-mavlink/ # VOXL Inspect Mavlink `voxl-inspect-mavlink` decodes MAVLink packets flowing through any MPA pipe carrying `mavlink_message_t` data and displays a live table of message IDs, human-readable message names, packet counts, and rates. It is the quickest way to see what traffic is moving between VOXL and the flight controller, for example on the `mavlink_onboard` and `mavlink_to_gcs` pipes published by [voxl-mavlink-server](/voxl-mavlink-server/). See the [MAVLink routing guide](/mavlink/) for how these pipes fit together. --- ## Arguments ``` voxl2:/$ voxl-inspect-mavlink --help Tool to print Mavlink Packet data from mavlink pipes to the screen for inspection. -h, --help print this help message Usage and examples: voxl-inspect-mavlink {pipe name} voxl-inspect-mavlink mavlink_onboard voxl-inspect-mavlink mavlink_to_gcs voxl-inspect-mavlink mavlink_sys_status ``` ## Example Output ```bash voxl2:/$ voxl-inspect-mavlink mavlink_onboard ``` ``` | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 7 | 1.0 | | 30 | attitude | 243 | 48.5 | | 74 | vfr_hud | 246 | 49.1 | | 105 | highres_imu | 251 | 50.1 | ``` ## Troubleshooting If no data appears, make sure [voxl-mavlink-server](/voxl-mavlink-server/) is running and communicating with the autopilot, which can be checked with [voxl-inspect-services](/voxl-inspect-services/). ## Notes - The `Hz` column is the average rate **since connecting**, not an instantaneous rate — leave the tool running a few seconds for it to settle, and expect it to react slowly to rate changes. - The table tracks up to 64 distinct message IDs; additional IDs beyond that are dropped with an error. ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-mavlink.c). --- Source: https://docs.modalai.com/voxl-inspect-baro/ # VOXL Inspect Barometer `voxl-inspect-baro` prints barometer data to the screen for inspection. It defaults to the `px4_baro` pipe; on VOXL 2 a `voxl_baro` pipe may also be available, as shown in the help text below. The default output shows the read latency plus the pressure (Pa) and temperature (C) averaged over each batch of samples. JSON output modes are available for scripting, and when the PX4 baro thermal calibration file `/data/px4/param/parameters_baro_tc.cal` is present its values are included in the JSON output. --- ## Arguments ``` voxl2:/$ voxl-inspect-baro --help Tool to print Baro data to the screen for inspection. -d, --debug enable libmodal-pipe debug mode -h, --help print this help message -n, --newline print each sample on its own line -t, --time wait time in seconds between printing samples -c, --csv format output for csv -T, --test single print test mode -j, --json json output formatting -k, --json_human human readable json output formatting default baro is px4 example usage on VOXL2: /# voxl-inspect-baro voxl_baro example usage on RB5 Flight: /# voxl-inspect-baro px4_baro ``` > The tool also accepts an `-a`/`--all` flag that is not listed in the help text: it prints every sample with its timestamp and inter-sample `dt(ms)` instead of the averaged output, and cannot be combined with `-t`. ## Example Output ```bash voxl2:/$ voxl-inspect-baro ``` ``` pressure in PA, temp in C delay(ms)| Pressure | Temp | 2.1 |100930.86 | 32.41 | ``` ## Source Source code available on [Gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/master/tools/voxl-inspect-baro.c). --- Source: https://docs.modalai.com/voxl-commands/ # VOXL Command Index Every user-facing `voxl-*` command that ships on target with the VOXL SDK, grouped by task. All commands support `--help`. Commands listed here reflect SDK 1.7 on VOXL 2. Long-running background services (`voxl-camera-server`, `voxl-imu-server`, `voxl-vision-hub`, …) are managed with `systemctl` rather than run by hand — see [voxl-inspect-services](/voxl-inspect-services/) for the full service list and [Core Services](/mpa-services/) for their documentation. This index covers the *commands you type*. ## System & Device Info | Command | What it does | Docs | |---------|--------------|------| | `voxl-version` | Print system image, kernel, SDK version, and hardware SKU | [voxl-version](/voxl-version/) | | `voxl-platform` | Print the board part number (e.g. M0054) | | | `voxl-chip` | Print the SoC (e.g. QRB5165) | | | `voxl-variant` | Print the kernel variant currently running | | | `voxl-serial` | Print the device serial number | | | `voxl-my-ip` | Print the current IP address and interface | [WiFi Setup](/voxl-2-wifi-setup/) | | `voxl-wifi` | Configure WiFi (station / SoftAP wizard) | [WiFi Setup](/voxl-2-wifi-setup/) | | `voxl-static-ip` | Assign a static IP address | | | `voxl-inspect-sku` | Print the parsed hardware SKU fields | [SKU](/sku/) | | `voxl-inspect-services` | Table of all VOXL services: enabled, running, CPU usage | [voxl-inspect-services](/voxl-inspect-services/) | | `voxl-health-check` | Print a health report of the target | | | `voxl-time-sync` | Sync the system clock (no RTC on VOXL 2) | | ## Monitoring & Hardware I/O | Command | What it does | Docs | |---------|--------------|------| | `voxl-inspect-cpu` | Live CPU/GPU/memory/temperature monitor | [voxl-inspect-cpu](/voxl-inspect-cpu/) | | `voxl-inspect-thermal-zones` | Print all thermal zone temperatures | | | `voxl-set-cpu-mode` | Set CPU governor (`perf` / `auto`) | | | `voxl-led` | Control the on-board status LED | | | `voxl-gpio` | Read/write GPIO pins from the command line | | | `voxl-serial` | Print device serial number | | ## Pipe Utilities MPA pipe plumbing — full reference on the [Pipe Utilities](/pipe-utilities/) page. | Command | What it does | |---------|--------------| | `voxl-list-pipes` | List all active MPA pipes, optionally filtered by type | | `voxl-inspect-pipe-info` | Print a pipe's info JSON (type, server, size, available commands) | | `voxl-send-command` | Send a control command to a pipe's server | | `voxl-kill-pipe` | Ask a pipe's server to exit | | `voxl-record-video` | Record an encoded camera pipe to a file | | `voxl-record-raw-image` | Save raw frames from a camera pipe | ## Sensors & Telemetry | Command | What it does | Docs | |---------|--------------|------| | `voxl-inspect-imu` | Live IMU data (accel, gyro, temperature) | [voxl-inspect-imu](/voxl-inspect-imu/) | | `voxl-inspect-cam` | Camera pipe stats: resolution, exposure, frame rate, latency | [voxl-inspect-cam](/voxl-inspect-cam/) | | `voxl-inspect-cam-ascii` | Render a camera stream as ASCII art in the terminal | | | `voxl-inspect-baro` | Live barometer data | [voxl-inspect-baro](/voxl-inspect-baro/) | | `voxl-inspect-battery` | Battery voltage, charge, current from the autopilot | [voxl-inspect-battery](/voxl-inspect-battery/) | | `voxl-inspect-gps` | GPS fix type, satellite count, position | [voxl-inspect-gps](/voxl-inspect-gps/) | | `voxl-inspect-tof` | Time-of-flight sensor data | [voxl-inspect-tof](/voxl-inspect-tof/) | | `voxl-inspect-points` | Point cloud metadata from any pointcloud pipe | [voxl-inspect-points](/voxl-inspect-points/) | | `voxl-inspect-rangefinders` | Rangefinder distance readings | [Rangefinders](/rangefinders/) | | `voxl-inspect-vibration` | IMU vibration RMS measurement | [voxl-inspect-vibration](/voxl-inspect-vibration/) | | `voxl-inspect-features` | Data on the feature tracker pipe | | | `voxl-inspect-detections` | Object detections from voxl-tflite-server | [voxl-inspect-detections](/voxl-inspect-detections/) | | `voxl-inspect-tags` | AprilTag detections | [voxl-inspect-tags](/voxl-inspect-tags/) | | `voxl-inspect-extrinsics` | Print the extrinsics configuration | [voxl-inspect-extrinsics](/voxl-inspect-extrinsics/) | | `voxl-inspect-pose` | 6-DOF pose from any pose pipe | [voxl-inspect-pose](/voxl-inspect-pose/) | | `voxl-inspect-mavlink` | Raw MAVLink traffic on the mavlink pipes | [voxl-inspect-mavlink](/voxl-inspect-mavlink/) | | `voxl-inspect-gcs-ip` | Show connected ground station IPs | [voxl-mavlink-server](/voxl-mavlink-server/) | ## VIO | Command | What it does | Docs | |---------|--------------|------| | `voxl-inspect-vio` | VIO output from any VIO pipe (position, features, quality, state) | [voxl-inspect-vio](/voxl-inspect-vio/) | | `voxl-inspect-vio-cams` | Show which cameras are configured for VIO | [voxl-inspect-vio-cams](/voxl-inspect-vio-cams/) | | `voxl-inspect-vins` | Live output of voxl-open-vins-server | [Open-VINS server](/voxl-open-vins-server/) | | `voxl-reset-vins` | Send a soft/hard reset to voxl-open-vins-server | [Open-VINS server](/voxl-open-vins-server/) | | `voxl-evaluate-vins` | Evaluate open-vins accuracy against a recorded log | [voxl-benchmark-vio](/voxl-benchmark-vio/) | | `voxl-inspect-qvio` | Live output of voxl-qvio-server | [voxl-inspect-qvio](/voxl-inspect-qvio/) | | `voxl-reset-qvio` | Reset voxl-qvio-server | [voxl-inspect-qvio](/voxl-inspect-qvio/) | ## Calibration | Command | What it does | Docs | |---------|--------------|------| | `voxl-calibrate-camera` | Intrinsic camera calibration | [Calibrate Cameras](/calibrate-cameras/) | | `voxl-calibrate-imu` | Static IMU calibration | [Calibrate IMU](/calibrate-imu/) | | `voxl-calibrate-imu-temp` | IMU temperature calibration | [Calibrate IMU](/calibrate-imu/) | | `voxl-calibrate-px4-horizon` | Level-horizon calibration for PX4 | [Calibrate Horizon](/calibrate-horizon/) | | `voxl-check-calibration` | Report which calibration files are present/missing | [Check Calibration](/check-calibration/) | | `voxl-convert-cal` | Print a calibration file as JSON (cal/yml/csv) | | | `voxl-focus-camera` | Focus assist for manual-focus camera modules | | ## Configuration Every SDK service ships a `voxl-configure-` script; [voxl-configure-mpa](/voxl-configure-mpa/) parses the [SKU](/sku/) and calls the right ones automatically during SDK install. The ones you're most likely to run by hand: | Command | Configures | Docs | |---------|------------|------| | `voxl-configure-mpa` | Everything — full service configuration from the SKU | [voxl-configure-mpa](/voxl-configure-mpa/) | | `voxl-configure-sku` | The hardware SKU in `/data/modalai/sku.txt` | [SKU](/sku/) | | `voxl-configure-cameras` | Camera server config by camera-config ID | [Configure Cameras](/configure-cameras/) | | `voxl-configure-extrinsics` | Sensor-to-body geometric relationships | [Configure Extrinsics](/configure-extrinsics/) | | `voxl-configure-vio-cams` | Which cameras feed VIO | [Flying with VIO](/flying-with-vio/) | | `voxl-configure-open-vins` | voxl-open-vins-server camera rigs | [Open-VINS server](/voxl-open-vins-server/) | | `voxl-configure-qvio` | Enable/disable voxl-qvio-server | [Flying with VIO](/flying-with-vio/) | | `voxl-configure-px4` | voxl-px4 autopilot service | [PX4 on VOXL 2](/voxl-px4/) | | `voxl-configure-px4-params` | PX4 parameter set by vehicle SKU | [PX4 on VOXL 2](/voxl-px4/) | | `voxl-configure-modem` | Cellular / Doodle / Microhard datalinks | [voxl-modem](/voxl-modem/) | | `voxl-configure-tflite` | voxl-tflite-server model selection | [voxl-tflite-server](/voxl-tflite-server/) | | `voxl-configure-pkg-manager` | ModalAI apt package repository | [Configure Package Manager](/configure-pkg-manager/) | | `voxl-configure-docker-support` | Docker support on target | [Docker on VOXL](/docker-on-voxl/) | ## Flight, RC & ESC | Command | What it does | Docs | |---------|--------------|------| | `voxl-px4` | The PX4 autopilot binary (normally run as a service) | [PX4 on VOXL 2](/voxl-px4/) | | `voxl-esc` | ESC tools: scan, firmware update, spin test, params | [VOXL ESC Manual](/modal-esc-v2-manual/) | | `voxl-elrs` | ELRS radio management: bind, flash, configure by SKU | [voxl-elrs](/voxl-elrs/) | | `voxl-2-io` | VOXL 2 IO expansion board tools | [VOXL 2 IO](/voxl2-io/) | | `voxl-send-esc-pwm-cmd` | Drive the ESC's auxiliary PWM outputs through PX4 | [FPV ESC Datasheet](/voxl-fpv-esc-datasheet/) | | `voxl-send-esc-tone-cmd` | Play tones on the motors through PX4 | [FPV ESC Datasheet](/voxl-fpv-esc-datasheet/) | | `voxl-send-esc-gpio-cmd` | Toggle ESC GPIO outputs (e.g. VTX power) through PX4 | [FPV ESC Datasheet](/voxl-fpv-esc-datasheet/) | | `voxl-send-neopixel-cmd` | Drive a Neopixel LED array on the ESC through PX4 | [FPV ESC Datasheet](/voxl-fpv-esc-datasheet/) | | `voxl-enable-px4-logs` | Enable PX4 ulog logging (requires reboot) | | | `voxl-reset-slpi` | Reset the sensors DSP without rebooting | | ## Logging & Replay | Command | What it does | Docs | |---------|--------------|------| | `voxl-logger` | Record MPA pipes (IMU, cameras, VIO, …) to `/data/voxl-logger/` | [voxl-logger](/voxl-logger/) | | `voxl-replay` | Replay a recorded log back onto MPA pipes | [voxl-replay](/voxl-replay/) | | `voxl-clear-logs` | Delete recorded logs to free disk space | [voxl-logger](/voxl-logger/) | ## Connectivity & Video Links | Command | What it does | Docs | |---------|--------------|------| | `voxl-modem` | Configure and manage cellular / Doodle / Microhard datalinks | [voxl-modem](/voxl-modem/) | | `voxl-inspect-modem-5g` | 5G modem signal and status | [voxl-modem](/voxl-modem/) | | `voxl-inspect-modem-doodle` | Doodle Labs radio link status | [voxl-modem](/voxl-modem/) | | `voxl-streamer` | RTSP video streaming from any camera pipe | [voxl-streamer](/voxl-streamer/) | | `voxl-vtx` | ModalAI VTX air unit management | [VTX Software Guide](/vtx-air-unit-software-guide/) | | `voxl-inspect-vtx` | VTX link status | [VTX Software Guide](/vtx-air-unit-software-guide/) | ## Host PC Tools These run on your development machine, not on VOXL: | Command | What it does | Docs | |---------|--------------|------| | `voxl-docker` | Launch the voxl-cross build container | [Docker & Cross Installation](/voxl-docker-and-cross-installation/) | | `adb shell` | Shell onto VOXL over USB | [Setting up ADB](/setting-up-adb/) | --- Source: https://docs.modalai.com/voxl-sdk-software-process/ # Software Process & Safety This section documents the engineering processes behind the VOXL SDK: how software is identified, change-controlled, built, tested, and released; how software anomalies and trouble reports are received, tracked, and resolved; and the software safety posture of the SDK, from flight-control architecture and failsafe behaviors to static analysis and the use of AI technology. --- Source: https://docs.modalai.com/voxl-sdk-configuration-management/ # VOXL SDK Configuration Management ## Overview This page summarizes how ModalAI manages software configuration for the VOXL SDK: how software is identified and versioned, how changes are controlled, how releases are assembled and tested, and how a released configuration is preserved so that any fielded system can be traced back to an exact, known set of software. This process applies to all VOXL SDK releases, including the SDK 1.6 series. ## Configuration Identification A [VOXL SDK release](/flash-system-image/) consists of three configuration-controlled elements: 1. **Software packages** — every SDK component (services, libraries, tools) is an individually versioned Debian package. Source code for each package is maintained in its own Git repository at [https://gitlab.com/voxl-public](https://gitlab.com/voxl-public), and each released package version corresponds to a tagged commit in that repository. 2. **The `voxl-suite` meta package** — the top-level configuration item that defines an SDK release. A stable `voxl-suite` release declares *exact* (`==`) dependency versions for every package it contains, so a given SDK release is a fully enumerated, immutable set of package versions. The SDK release takes its version number from `voxl-suite`. 3. **The system image** — the base operating system image, versioned independently and paired with each SDK release (for example, SDK 1.6.3 on the QRB5165 platform pairs with system image 1.8.06). See the [system image release notes](/voxl2-voxl2-mini-system-image/). Every SDK release is published with [release notes](/voxl-suite/) that enumerate the complete package list, the exact version of each package, and the version delta from the previous release, along with MD5 hashes of the release installers so a downloaded artifact can be verified. Version numbering follows a major.minor.patch scheme. Patch releases (e.g. 1.6.2 to 1.6.3) are in-place package updates against the same system image; minor releases pair with a new system image and are installed by a full [system flash](/flash-system-image/). ## Change Control All SDK source code is managed in Git on GitLab. Changes land on a package's mainline branch via GitLab merge requests, giving every change a reviewable, attributable history. Every commit to every package triggers an automated GitLab CI build. Packages are built inside version-controlled Docker [build environments](/build-environments/), so the toolchain used to produce a package is itself configuration-controlled and builds are reproducible. A commit that fails CI does not produce a package. Built packages then flow through a tiered repository structure at [http://voxl-packages.modalai.com/dists/](http://voxl-packages.modalai.com/dists/), described on the [package manager page](/configure-pkg-manager/): | Tier | Contents | |------|----------| | **dev** | Per-commit CI output from the development branches. Nightly SDK builds, paired with nightly system image builds, are assembled from this repository. Internal use. | | **sdk-x.y** | Release sections for each SDK version. Alpha, beta, and full SDK releases are built from these sections, and their contents change only as part of a tested release. | Promotion from dev into a release section is deliberate: a package version reaches an SDK release only by being pinned into a `voxl-suite` release, and each full release is preceded by alpha and beta releases built from the same `sdk-x.y` section and gated by the release testing described below. Alpha releases are used internally; beta releases are provided to customers upon request for early validation ahead of the full release. ## Release Process Stable SDK releases are assembled and gated by a release manager. The release cycle consists of: 1. **Candidate assembly** — the release manager pins the candidate package versions into `voxl-suite`, pairs the suite with its system image, and produces candidate SDK installers. 2. **Continuous exercise** — throughout the release cycle, nightly full-SDK builds (assembled from the development repository alongside nightly system image builds) are flashed onto hardware and exercised, so integration problems surface early rather than at release time. Nightly builds are also available to customers upon request. 3. **Release regression testing** — alpha and beta release candidates are flashed to each supported hardware platform (VOXL 2, VOXL 2 Mini, and supported vehicle configurations) and tested against ModalAI's internally controlled, numbered SWQA test documents, which define test procedures at the PCB, sub-assembly, and integrated drone/flight-test levels — covering boot, sensors, cameras, communications, and autopilot function. 4. **Flight testing** — release candidates are flown on development aircraft to verify integrated, real-world behavior before release. Flight logs are collected for every test flight and reviewed internally. 5. **Sign-off and publication** — once testing passes, the release manager signs off and publishes the release: installers (with MD5 hashes) to [downloads.modalai.com](https://downloads.modalai.com), the frozen `sdk-x.y` package repository section, and release notes with the full package list and changelog. ## Traceability and Reproducibility The released configuration is traceable end to end: - The published package list for a release maps every installed package version to a tagged commit in its public GitLab repository, where its full development history is available. - The software configuration of any fielded VOXL can be audited by comparing its installed package versions (`dpkg -l`) against the published package list for its SDK release. - Release installers are verifiable against published MD5 hashes. - Prior SDK releases and their package repository sections remain published, so any previously fielded configuration can be retrieved and reproduced. > ModalAI recommends operating on stable SDK releases as delivered, since they are tested as a whole (packages plus system image together). The [package manager configuration](/configure-pkg-manager/) that would point a system at development repositories is opt-in and not used on fielded stable systems. ## Related Pages - [VOXL SDK Release Notes](/voxl-suite/) — per-release package lists, changelogs, and hashes - [Software Anomaly Reporting](/voxl-sdk-anomaly-reporting/) — how defects are reported, tracked, fixed, and delivered - [Flashing a VOXL SDK Release](/flash-system-image/) --- Source: https://docs.modalai.com/voxl-sdk-anomaly-reporting/ # Software Anomaly Reporting ## Overview This page summarizes how ModalAI receives, tracks, and resolves software anomalies and trouble reports against the VOXL SDK, and how fixes are verified and delivered to users. ## Reporting Channels Software anomalies reach ModalAI engineering through three channels: 1. **GitLab issues** — every VOXL SDK package is open source at [https://gitlab.com/voxl-public](https://gitlab.com/voxl-public), and each repository accepts issues. This is the preferred channel for developers, since a report lands directly against the affected component with its version and reproduction details. 2. **The ModalAI forum** — [https://forum.modalai.com](https://forum.modalai.com) is actively monitored by ModalAI engineers. Reports that turn out to be software defects are pulled into internal tracking. 3. **Direct support** — customers and programs report issues through their ModalAI point of contact, who files the report internally on their behalf. ## Tracking and Triage Reports from all channels are triaged by ModalAI engineering. Confirmed or actionable anomalies are entered into ModalAI's internal issue tracking system (Asana) and tracked there to resolution; externally filed GitLab issues are mirrored into the same internal tracking so all defects are worked from one queue. Supporting engineering analysis and design documentation is maintained in Confluence. Anomalies are prioritized by operational impact: - **Critical** — defects affecting flight safety or system stability (crashes, loss of control or telemetry, fault-handling failures) are worked first and fast-tracked into the next patch release. - **Functional** — defects degrading a feature without a safety or stability impact are scheduled into the normal release cycle. - **Minor** — cosmetic or documentation-level defects are batched into future releases. ## Fix Lifecycle A confirmed anomaly follows the same configuration-controlled path as all SDK changes (see [Configuration Management](/voxl-sdk-configuration-management/)): 1. The defect is reproduced and root-caused by engineering. 2. A fix is developed and lands via a GitLab merge request, incrementing the affected package's version. 3. Automated CI builds the fixed package in the controlled build environment and publishes it to the development repository. 4. The fix soaks through nightly SDK builds assembled from the development repository, where it is exercised on hardware — including bench and flight testing — alongside the rest of the SDK. 5. The fixed package version is pinned into the next stable release, which passes the full release regression and flight-test gate before publication. ## Delivery and Communication of Fixes Fixes reach users through stable SDK releases: - **Patch releases** (e.g. 1.6.2 to 1.6.3) deliver targeted fixes; **minor releases** deliver fixes alongside system image updates. Both are installed the same way: a full [system flash](/flash-system-image/) with the release installer, since each release is tested as a whole. Every fix shipped in a release is documented in the [release notes](/voxl-suite/), which enumerate each package's version change with a changelog, so users can determine exactly which defects a given SDK release resolves. Critical defects are prioritized for expedited patch release and highlighted in the release notes of the release that carries the fix. > When reporting an anomaly, include the SDK version (`voxl-version`), the affected package and its version (`dpkg -l | grep `), and reproduction steps. This lets engineering trace the report directly to the exact software configuration involved. ## Related Pages - [VOXL SDK Configuration Management](/voxl-sdk-configuration-management/) - [VOXL SDK Release Notes](/voxl-suite/) --- Source: https://docs.modalai.com/voxl-sdk-software-safety/ # VOXL SDK Software Safety ## Overview This page summarizes the software safety posture of the VOXL SDK: how flight-critical software is separated from non-critical software, how the vehicle behaves under abnormal and emergency conditions, how code quality is enforced through analysis and testing, and how artificial intelligence technology is — and is not — used. It complements the [Configuration Management](/voxl-sdk-configuration-management/) and [Software Anomaly Reporting](/voxl-sdk-anomaly-reporting/) pages, which describe how software changes are controlled and how defects are handled. ## Flight Control Architecture VOXL 2 combines the flight controller and the companion computer on a single board, but not on a single processor. The PX4 flight controller ([voxl-px4](/voxl-px4/)) executes on a dedicated sensors DSP (the SLPI), isolated from the Linux applications processor where VOXL SDK services (cameras, computer vision, networking, autonomy features) run. This partitioning has two safety-significant properties: - **Companion-side failures do not stop flight control.** SDK services on the applications processor can fail, restart, or be stopped without taking down the flight controller; PX4 continues to fly the vehicle. - **Autonomy inputs are advisory.** Computer-vision and offboard inputs feed the flight controller as aiding data or commands, and the flight controller falls back to its own flight modes on loss of them. Autonomous behaviors are opt-in and disabled by default; the pilot can always take manual control. ## Failsafe Behaviors Flight control behavior under abnormal, emergency, and contingency conditions is provided by the PX4 failsafe system. All failsafe parameters are fully configurable, and each drone platform ships with its own defaults appropriate to that airframe; the behaviors below describe the mechanisms. - **RC link loss** — loss of the RC control link for longer than a configurable timeout triggers a configurable failsafe action (e.g. return-to-launch, land, or hold). - **Low battery** — a staged response: a warning at a configurable remaining-capacity threshold, escalating to an automatic return-to-launch or land action at critical thresholds. - **Position-estimate degradation** — autonomous and position-controlled modes require a healthy position estimate (GPS and/or visual-inertial odometry). If the estimate degrades or is lost, the vehicle falls back to altitude-controlled flight, and ultimately to manual/stabilized flight, rather than acting on bad position data. - **Arming checks and geofence** — pre-arm checks block arming until sensors, estimators, battery, and RC are healthy; an optional geofence triggers a configurable action on breach. ## Static Analysis and Code Quality As described under [Change Control](/voxl-sdk-configuration-management/), every commit to every SDK package is built by automated CI in a version-controlled build environment, and a commit that fails CI does not produce a package. In addition, every push to a package's development branch runs a required static analysis stage: - **Static analysis** of the source with Semgrep, using a broad ruleset (the full public registry plus secrets detection) with dataflow tracing. - **Compiler diagnostics** from the cross-compilation builds for each supported hardware target are captured and normalized alongside the static analysis results. - All findings are uploaded to a managed defect-tracking system (DefectDojo), where they are deduplicated per component and branch, triaged, and tracked to remediation. The analysis stage is a required (blocking) job in the pipeline: its results are recorded for every push, giving each component a continuous, reviewable code-quality history. ## Software Quality Assurance Testing Release testing is governed by ModalAI's internally controlled, numbered SWQA test documents, which define test procedures at three levels: PCB, sub-assembly, and integrated drone/flight test. As described in the [release process](/voxl-sdk-configuration-management/), every release candidate is flashed to each supported hardware platform and taken through release regression testing and flight testing on development aircraft, with flight logs collected and reviewed for every test flight, before the release manager signs off on publication. ## Use of Artificial Intelligence - **In development** — AI-assisted developer tooling may be used during software development. All resulting changes go through the same controls as any other change: merge request review, CI builds, static analysis, and release testing. - **In operation** — no AI/ML technology is used in flight-critical control paths. On-board state estimation, including visual-inertial odometry, uses classical computer-vision and filtering algorithms (deterministic feature tracking and Kalman-filter-based estimation), not machine-learned models. The VOXL SDK offers optional on-board inference through [voxl-tflite-server](/voxl-tflite-server/), which runs pre-trained, frozen models for perception tasks; it performs inference only, is disabled by default, and is not part of flight control. - **No on-board learning** — deployed models are static. They do not update their weights, learn from collected data, or accept new training input during operation. ## Related Pages - [VOXL SDK Configuration Management](/voxl-sdk-configuration-management/) - [Software Anomaly Reporting](/voxl-sdk-anomaly-reporting/) - [voxl-px4](/voxl-px4/) - [voxl-tflite-server](/voxl-tflite-server/) --- Source: https://docs.modalai.com/voxl-sdk-build-pipeline/ # VOXL SDK Build Pipeline ## Overview This page shows how VOXL SDK releases are actually built. The tooling that drives all of it is open source and lives in the [publishing-tools](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools) repository. The whole pipeline, end to end: ``` sdk_csvs/sdk-X.Y.Z.csv the release manifest: every package + version │ ▼ release-sdk.sh ── safety checks ──► git tag sdk-X.Y.Z on every repo, │ pushed in dependency order ▼ GitLab CI builds each package ──► voxl-packages.modalai.com sdk-x.y section │ ▼ voxl-suite tagged pins the exact version of every package │ ▼ make-sdk-release.sh ──► voxl2_SDK_X.Y.Z.tar.gz (one per platform) │ ▼ flash + test on hardware ──► final tag ──► downloads.modalai.com ``` This page covers the *mechanics*. For the surrounding process — versioning, change control, release testing, traceability — see [Configuration Management](/voxl-sdk-configuration-management/). ## What's in the Tarball An SDK build for a platform is a single archive that brings a board to a known software configuration: ``` voxl2_SDK_1.7.0/ ├── install.sh one-command SDK install to a connected board ├── README.md ├── system-image/ the flashable base OS image ├── voxl-suite/ every .deb package in the release + offline-install.sh ├── edgetx/ EdgeTX payload (voxl2 and voxl2-mini) └── misc/ ``` The publishing-tools repository is organized by platform: | Directory | Platforms | Status | |-----------|-----------|--------| | `qrb5165/` | VOXL 2, VOXL 2 Mini, ubun2.0-multi | active | | `qcs6490/` | QCS6490-based boards | active | | `apq8096/` | VOXL (original) | deprecated, kept for reference | ## Release Build Workflow A stable SDK release is driven by a release manager working through the tools in the repository's `other-tools/` directory, in this order: ### 1. Audit the package set Each SDK release is defined by a CSV listing every package and its intended version, kept under [`other-tools/sdk_csvs/`](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools/-/tree/master/other-tools/sdk_csvs) (one file per release). The release manager runs [`release-sdk.sh`](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools/-/blob/master/other-tools/release-sdk.sh) in test mode against it: ```bash cd other-tools ./release-sdk.sh --file sdk_csvs/sdk-1.7.0.csv --test ``` The tool clones every listed project and runs safety checks — verifying that each repository's state matches the planned version, and flagging things like commits pushed to master after a code freeze. The audit repeats until the manifest and the repositories agree. ### 2. Tag every package, in dependency order Once the package set is confirmed, the same tool applies an `sdk-x.y.z` Git tag to every repository — pushed in dependency order (computed by `build-order.py`) so each package's CI build finishes before anything that depends on it starts. Each tag triggers that package's GitLab CI pipeline, which compiles it inside its version-controlled Docker [build environment](/build-environments/) and publishes the Debian package into the release's `sdk-x.y` repository section. Build progress across all packages is watched on the [CI status page](https://gitlab.com/voxl-public/voxl-sdk/ci-status). ### 3. Tag voxl-suite With every package built, the `voxl-suite` meta package is tagged. It pins the exact version of every package in the release, and the SDK release takes its version number from it. The first tag is a beta (e.g. `sdk-1.7.0-beta1`); the final tag comes only after the beta installers pass testing. ### 4. Assemble the platform tarball: make-sdk-release.sh Each platform's SDK installer is assembled by that platform directory's [`make-sdk-release.sh`](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools/-/blob/master/qrb5165/make-sdk-release.sh). Run with no arguments it is fully interactive — it walks the release manager through every choice with menus, then downloads and packs everything. A typical session (output abridged): ``` $ cd qrb5165 $ ./make-sdk-release.sh ━━━ Platform ━━━ 1) voxl2 2) voxl2-mini 3) ubun2.0-multi Selection: 1 ✔ voxl2 ━━━ System Image Bucket ━━━ 1) release 2) candidate 3) nightlie Selection: 1 ━━━ System Image ━━━ 14 images available: 1) 1.7.8-M0054-14.1a-perf.tar.gz ... 14) 1.8.06-M0054-14.1a-perf.tar.gz Image number (ENTER = newest, or type text to search all): 14 ✔ 1.8.06-M0054-14.1a-perf.tar.gz ━━━ voxl-suite Version ━━━ Available repos: 1) dev 2) sdk-1.5 3) sdk-1.6 4) sdk-1.7 5) staging Selection: 4 ✔ sdk-1.7 ----Selecting EdgeTX payload---- Select an EdgeTX release to include: 1) edgetx-v2.9.4-modalai.tar.gz 2) edgetx-v2.11.2-modalai.tar.gz Selection: 2 ━━━ Release Version ━━━ The 'voxl2_SDK_' prefix is added automatically, enter the version only: ✔ 1.7.0 stable release ✔ 1.7.0-alpha1 alpha release ✔ 1.7.0-beta0 beta release ✘ SDK_1.7.0 no prefixes! Version: 1.7.0 ✔ voxl2_SDK_1.7.0.tar.gz ━━━ Release Summary ━━━ Platform voxl2 System image 1.8.06-M0054-14.1a-perf.tar.gz voxl-suite sdk-1.7 EdgeTX edgetx-v2.11.2-modalai.tar.gz Output voxl2_SDK_1.7.0.tar.gz Upload automatically when the build finishes? [Y/n]: y Proceed with build? [Y/n]: y ----Setting up folder structure---- ----Getting System Image---- ----Getting SDK---- ----Copying EdgeTX---- ----Tarring (be patient)---- ``` After the prompts, the script downloads the selected system image, mirrors the full package set from the chosen repository section of [voxl-packages.modalai.com](http://voxl-packages.modalai.com/dists/), bundles the install scripts and EdgeTX payload, and tars the folder shown in [What's in the Tarball](#whats-in-the-tarball). This is repeated for each platform. ### 5. Test, finalize, publish Beta tarballs are flashed and tested on hardware first ([release regression testing](/voxl-sdk-configuration-management/#release-process)). Once they pass, the final `voxl-suite` tag is applied and step 4 is repeated with the final version string. Released installers are published for end users at [downloads.modalai.com](https://downloads.modalai.com), which handles the license acknowledgment required before download. Release notes are generated by two tools: `generate-change-table.sh` diffs the new release's CSV against the previous one into a Markdown version table, and the [sdk-changelog-generator](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools/-/tree/master/sdk-changelog-generator) exports a detailed changelog aggregated from every package. Both feed the published [release notes](/voxl-suite/). ## Nightly and Staging Builds The same assembly tooling runs unattended every night, driven by GitLab CI scheduled pipelines defined in the repository's [`.gitlab-ci.yml`](https://gitlab.com/voxl-public/voxl-sdk/publishing-tools/-/blob/master/.gitlab-ci.yml). There are four scheduled jobs, one per platform target: - `voxl2_nightly` - `voxl2_mini_nightly` - `ubun2.0-multi_nightly` - `qcs6490_nightly` Each job calls the platform's `make-sdk-release.sh` in non-interactive mode — every menu above answered automatically — then stores the result for internal testing. A schedule variable selects one of two build flavors: | Flavor | System image | Packages | Purpose | |--------|--------------|----------|---------| | **nightly** | latest nightly system image build | `dev` repository (per-commit CI output) | exercises the newest everything; surfaces integration breakage within a day of a change landing | | **staging** | pinned release-candidate system image | `staging` repository | exercises the stabilized package set as it converges on the next release | Nightly tarballs are named with a datestamp (e.g. `voxl2_SDK_nightly_20260803...tar.gz`) rather than a version number, making them immediately distinguishable from releases. They are built for internal daily testing on hardware, as described in [Configuration Management](/voxl-sdk-configuration-management/), and are available to customers upon request. > Nightly builds are assembled from development-branch packages and are not release-tested. Fielded systems should run [stable SDK releases](/voxl-suite/), which go through the full regression and flight-test cycle before publication. ## Related Pages - [Configuration Management](/voxl-sdk-configuration-management/) — versioning, change control, release testing, and traceability - [VOXL SDK Release Notes](/voxl-suite/) — per-release package lists, changelogs, and hashes - [Build Environments](/build-environments/) — the Docker environments packages are compiled in - [Configuring the Package Manager](/configure-pkg-manager/) — the tiered package repository structure - [Flashing a VOXL SDK Release](/flash-system-image/) --- Source: https://docs.modalai.com/previous-sdks/ # Previous SDKs --- Source: https://docs.modalai.com/voxl-sdk-0_9/ # VOXL SDK 0.9 ## Overview VOXL SDK (Software Development Kit) consists of the open source [core libraries](/core-libs/), [services](/mpa-services/), [tools](/inspect-tools/), and [build environments](/build-environments/) that ModalAI provide to accelerate the use and development of [VOXL compute boards](/voxl-computers/) and accessories. ModalAI is primarily a manufacturer of small [compute boards](/voxl-computers/) designed to be integrated into final products by other OEMs. This section describes our Software Development Kit designed to help accelerate your own software development on [VOXL hardware](/voxl-computers/). VOXL SDK runs on [VOXL](/voxl/), [VOXL 2](/voxl-2/), and [RB5 Flight](/qualcommflightrb5/)! The build environment details for compiling code for the CPU, GPU, DSPs, and NPU can be found at the [build-environments](/build-environments/) page. The source code for projects within VOXL SDK can be found at [https://gitlab.com/voxl-public](https://gitlab.com/voxl-public) alongside build instructions. This section of the manual serves to provide a description of the use and functionality of the software. ![voxl-sdk-map](/images/voxl-sdk/voxl-sdk-mpa.png) Please continue reading through the following sections to learn more: --- Source: https://docs.modalai.com/voxl-computers/ # VOXL Autopilot & Compute Documentation for ModalAI's flight controllers and autonomous computing products. --- Source: https://docs.modalai.com/voxl-2/ # VOXL 2 VOXL 2 is ModalAI's flagship autonomous [Blue UAS Framework](https://www.diu.mil/blue-uas) AI Autopilot which is a powerful companion computer with integrated flight controller and is built around the Qualcomm Flight RB5 5G Platform using the QRB5165 processor. Also see: [VOXL 2 Mini](/voxl2-mini/) — the same platform, smaller and lighter · [VOXL 2 Dev Bundles](/voxl2-development-kits/) — board plus cameras, ready to develop. ![m0054-hero-f](/images/voxl2/m0054-hero-f.png) --- Source: https://docs.modalai.com/voxl2-user-guides/ # VOXL 2 User Guides ![m0054-quarter](/images/voxl2/m0054-quarter.png) ## Table of contents 1. TOC {:toc} --- Source: https://docs.modalai.com/voxl2-power/ # VOXL 2 Power --- ## Hardware ### J4 - Main 5VDC Input with I2C The main power input is `J4` and is typically paired with a [VOXL Power Module v3](/power-module-v3-datasheet/), which provides the up to 6A momentary inrush current and provides two I2C based power monitoring ICs, providing PX4 the battery status. The recommended cable is `MCBL-00001` for this interface. ![m0054-user-guides-power.png](/images/voxl2/m0054-user-guides-power.png) M0054 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S ### 5V Rail Tolerance > A droop of roughly 200 mV on VDC_5V_LOCAL and VDC_5V_LOCAL_USB1 under load (for example while a ToF sensor is ranging) is within the normal operating margin of the 5 V rail and is not a supply problem. A transient of that size is more likely localized contact or pin loss at a connector than a bulk supply issue. The eFuse on this rail does not assert until approximately 4.4 V, so a 200 mV droop from 5 V is nowhere near that threshold. Downstream logic is regulated from a 3.8 V VBAT rail that has margin well above the minimum needed, and that rail is permitted to droop past 3.3 V before any real issue occurs. A droop of this size is not a cause of RC dropouts. The power stage of the M0129 VOXL Mini ESC is proven to the same load capability and test rigor as the standalone M0041 power module, using the same parts. ## Software ### Checking Battery Status With the VOXL PM attached, you check the battery using `px4-listener battery_status` command after getting a shell to VOXL 2. Here's an example from a 3S battery: ``` px4-listener battery_status TOPIC: battery_status battery_status_s timestamp: 1080175258 (0.059704 seconds ago) voltage_v: 12.6662 voltage_filtered_v: 12.6659 current_a: 0.1758 current_filtered_a: 0.1791 average_current_a: 0.0000 discharged_mah: 51.6742 remaining: 1.0000 scale: 1.0000 temperature: nan cell_count: 3 voltage_cell_v: [4.1200, 4.3200, 4.2200, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000] max_cell_voltage_delta: 0.0000 capacity: 0 cycle_count: 0 run_time_to_empty: 0 average_time_to_empty: 0 serial_number: 0 manufacture_date: 0 state_of_health: 0 max_error: 0 interface_error: 0 connected: True source: 0 priority: 0 id: 1 is_powering_off: False warning: 0 ``` ### voxlpm PX4 Driver The [voxlpm](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/power_monitor/voxlpm) PX4 driver monitors both battery and companion computer regulated voltage. The driver runs in PX4 on the DSP, and interfaces through SSC QUP2. You can't get to this I2C bus through Ubuntu at this time. ## Related Video --- Source: https://docs.modalai.com/voxl2-rc-configs/ # VOXL 2 Remote Controller Configurations --- ## Summary We are working to expand the capabilities of VOXL 2 every day. The built-in PX4 flight controller enables industry leading SWAP for an autonomous flight controller, but not every interface and flight controller are supported yet. This page provides an overview of available connectivity. If this connectivity is insufficient for your application, VOXL 2 is a world-class companion computer for autonomous navigation and AI when paired with an [external flight controller](/voxl2-external-flight-controller/). ## Remote Controller Options for Built-in Flight Controller | R/C | Protocol | Includes Telemetry | Instructions | Adapter | Example Hardware | |-------------------|--------------|--------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------|------------------| | Ghost Atto | UART / GHST | No | | Not required | Ghost Atto | | Ghost Atto | SBUS | No | See Ghost Atto SBUS Protocol in this document | [VOXL 2 I/O](/voxl2-io/) | Ghost Atto | | ELRS | UART | Yes | MAVLink and CRSF raw | | | | Spektrum (DSMX) | UART | No | [Here](/sentinel-user-guide-pre-flight-setup/#rc-radio-setup) | M0094 | SPM9745 | | TBS Crossfire | UART | Yes | MAVLink and CRSF raw | | ES900RX | | Graupner | SBUS / UART | No | [Here](/voxl2-io-user-guide/#graupner-gr-16) | [VOXL 2 I/O](/voxl2-io/) | Graupner GR-16 | | FrSky | | No | Not yet supported | | | | Futaba | | No | Not yet supported | | | | WiFi | IP / Mavlink | No | [VOXL 2 Wifi Dongle User Guide](/wifi-setup/) [Connect QGC over WiFi](/qgc-wifi/)| | | | Microhard | IP / Mavlink | No | [Microhard Add-on Manual](/microhard-add-on-manual/) | | | | Doodle Labs | IP / Mavlink | No | [Doodle Labs User Guide](/doodle-labs-user-guide/) | | | | Cellular | IP / Mavlink | No | [4G](/lte-v2-modem-user-guide/) or [5G](/5G-Modem-user-guide) | | | ## Spektrum (DSMX) ### Hardware Tested hardware: - Spektrum SPM9X45 > VOXL 2 cannot put a Spektrum satellite receiver into bind mode — its driver does not generate the bind pulses that Pixhawk-style flight controllers send at power-up. Bind the receiver to your transmitter using other hardware first (a standalone Spektrum bind tool or another flight controller), then connect it to VOXL 2. ![m0054-user-guide-rc-dsmx.png](/images/voxl2/m0054-user-guide-rc-dsmx.png) M0054 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S ### Software #### Checking Status The `px4-listener input_rc` command can be used to check status. ## CRSF ### Hardware **PLEASE NOTE**: the baud rates for the receivers likely need to be updated. The baud rates for the receiver UART are set here when PX4 starts on VOXL 2: - MAVLink - https://github.com/modalai/px4-firmware/blob/voxl-dev-1.12/boards/modalai/rb5-flight/voxl-px4.config#L172 - CRSF - https://github.com/modalai/px4-firmware/blob/voxl-dev-1.12/boards/modalai/rb5-flight/voxl-px4.config#L175 Tested hardware: - Happymodel ES900EX (in CRSF mode) - TBS Crossfire Nano Rx (in MAVLink mode) ![m0054-user-guide-rc-crsf.png](/images/voxl2/m0054-user-guide-rc-crsf.png) M0054 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S ### Software **PLEASE NOTE**: If using voxl-px4, edit "/etc/modalai/voxl-px4.conf" setting "RC=CRSF_RAW" #### Checking Status The `px4-listener input_rc` or `px4-listener rc_channels` command can be used to trouble shoot, if neither have been published it's likely the receiver has yet to get RC data or the serial link isn't working. ## Ghost Atto RC ### GHST Protocol Connect the RC Receiver to J19 - TX on the GHOST receiver to RC_UART_RX on J19 - 5V on the GHOST receiver to VDC_5V_LOCAL on J19 - GND on the GHOST receiver to GND on J19 **PLEASE NOTE**: If using voxl-px4, edit "/etc/modalai/voxl-px4.conf" setting "RC=GHST" ### Ghost Atto vs ELRS Wiring on J19 A Ghost Atto and an ELRS receiver (for example the [M0184](/M0184/)) use the same J19 power and ground pins. The difference is the second data line: | J19 signal | Ghost Atto (GHST) | ELRS receiver | |--------------|-----------------------------------|------------------------------------------------------------------------------------------------------------| | VDC_5V_LOCAL | Receiver 5V | Receiver 5V | | GND | Receiver GND | Receiver GND | | RC_UART_RX | Receiver TX (the only data wire) | Receiver TX | | RC_UART_TX | Not connected | Receiver RX. Required for `voxl-elrs` firmware updates and configuration; basic RC control works without it | | `RC=` in `/etc/modalai/voxl-px4.conf` | `GHST` | `CRSF_RAW` | When converting a vehicle wired for a Ghost Atto to ELRS, add the RC_UART_TX wire to the J19 connector (pre-crimped JST GH wires are available) and update `RC=` in `/etc/modalai/voxl-px4.conf`. ### SBUS Protocol With the VOXL 2 wired up to the connect the [VOXL 2 IO](/voxl2-io/) board with the Ghost Atto receiver attached to port J3: 1. Power on the system, the Atto should have a solid blue LED indicating paring mode. 2. Power on the RC controller with the Ghost TX attached. 3. On the Ghost Module TX, click the nozzle in. 4. on the main menu, Navigate to `Mode...` and click in the nozzle. 5. Change the following: - `TX Mode` from `Auto` to `Manual` - `Protocol` from `GHST` to`SBus` 6. Move the nozzle to the left. 7. Navigate to `Bind...` then press in the nozzle. 8. Navigate to `Bind + Setup` and change `RX` to `ProtoSBus`. 9. Navigate to and Select `Start Bind` At this point the Atto should transition from a solid blue light to a red and yellow light indicating the binding was successful. If you go in to the Radio tab on QGC you should see the values for roll, pitch, and yaw. Change as you move the RC controller's Thumbsticks. ## Which UART Can My Receiver Use? UART routing rules on VOXL 2: - **J19's RC UART goes to the DSP.** Drivers started with `qshell` (spektrum_rc, crsf_rc, ghst_rc, gps) run on the DSP and use DSP-mapped UARTs. Drivers on the applications processor use `/dev/ttyHS` ports instead — but `ghst_rc` is DSP-only and cannot be moved to an apps UART. - **SBUS cannot run on J19** — its signal characteristics need the hardware inverter/buffer on the [VOXL 2 IO board (M0065)](/voxl2-io-datasheet/), whose J3 connector provides SBUS input plus 5V for the receiver. Futaba, Graupner (in SBUS mode), and Ghost-in-SBUS-mode receivers all go through M0065. - Sharing one link for RC **and** MAVLink requires the receiver on an apps-processor UART (expansion board required) — MAVLink can't run over a DSP-mapped UART. ## Binding Notes - **Always power-cycle the vehicle after a successful bind.** "Detected 0 radio channels" right after binding is almost always a missing power-cycle. - **Spektrum**: in bind mode the receiver flashes orange rapidly; hold the transmitter's bind control while powering it on until the receiver goes solid. DSMX vs DSM2 matters — if one fails, try the other. ModalAI's reference transmitter is the DX6e (SPMR6655). - **ELRS (M0184 and others)**: press and hold the receiver's physical button **within 30 seconds of power-on** to enter bind mode. Confirm your transmitter actually runs ELRS on the receiver's band (915 MHz for M0184). - **ELRS firmware compatibility**: receivers and transmitters are compatible within the same **major version** (3.x.x ↔ 3.x.x) but not across (3.x ↔ 2.x). Update the handset's TX module with **upstream ELRS firmware** — ModalAI doesn't modify transmitter firmware, and handset models/settings persist through the update. ModalAI's receiver patches only add `voxl-elrs` conveniences (unbind command, PWM config); any standard CRSF/ELRS receiver works with VOXL 2. - **Switching receiver types** (e.g. Ghost → ELRS): rewiring is only half the job — update `RC=` in `/etc/modalai/voxl-px4.conf` to match (`GHST` → `CRSF_RAW`). ## Troubleshooting For general service debugging see [Debugging Services](/debugging-services/). **"Detected 0 radio channels. To operate PX4 you need at least 5 channels":** 1. Power-cycle if you just bound (see above). 2. `px4-listener input_rc` — is anything publishing? 3. `journalctl -b -u voxl-px4` — is the right RC driver starting, and does it report parse errors? For more detail, add `-v` to the driver's start line in `/usr/bin/voxl-px4-start` (e.g. `qshell spektrum_rc start -v`). 4. Check `COM_RC_IN_MODE` isn't disabling RC input. 5. Then it's physical: reseat/replace the cable, scope the receiver's TX line to confirm it transmits at all, and finally try another receiver. **Verification chain when RC "sort of" works:** `px4-listener input_rc` shows channels → QGC radio calibration shows stick movement → `px4-listener manual_control_setpoint` shows correct mapping. When all three pass, the RC link is healthy — motor problems beyond that point are [ESC configuration](/voxl-escs/faq/), not RC. **Spektrum "receiver error" spam in the log:** older voxl-px4 builds rejected DSM frames whose protocol byte wasn't `0x01`/`0x02`, which some receiver/transmitter combinations produce. This check was removed — **update to a current SDK** rather than patching. If errors persist on a current build, try a different transmitter model (DSM protocol flavors vary). **RC dropouts, especially under throttle:** usually electrical, not radio — twist the receiver's UART wires, shorten the cable, route it away from power electronics, and check for connectors loosened by vibration. Dropouts that correlate with motor speed point at noise coupling or a marginal connector. **Historical note:** early system images only supported CRSF at 250000 baud (TBS Crossfire), requiring ELRS receivers to be forced down from their standard 420 kbaud. Current SDKs support standard ELRS rates — no baud workaround needed. --- Source: https://docs.modalai.com/voxl2-esc-configs/ # VOXL 2 ESC Configurations --- ## Summary We are working to expand the capabilities of VOXL 2 every day. The built-in PX4 flight controller enables industry leading SWAP for an autonomous flight controller, but not every interface and flight controller are supported yet. This page provides an overview of available connectivity. If this connectivity is insufficient for your application, VOXL 2 is a world-class companion computer for autonomous navigation and AI when paired with an [external flight controller](/voxl2-external-flight-controller/). ## ESC Options for Built-in Flight Controller | Protocol | Driver | Instructions | Max Number of Channels | Example Hardware | |----------|--------------------------------------------------------------------------------------------------|------------------------------------------------------------|------------------------|---------------------------------------------------| | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL 4-in-1 ESC](/voxl-esc-datasheet/) | | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL Mini 4-in-1 ESC](/voxl-mini-esc-datasheet/) | | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL FPV 4-in-1 ESC](/voxl-fpv-esc-datasheet/) | | PWM | [voxl2_io](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/voxl2_io) | [VOXL 2 IO](/voxl2-io-user-guide/) | 8 | [VOXL 2 IO](/voxl2-io/) | | DSHOT | voxl2_io in development | Not yet supported | 8 | | ## UART ESC Option ### Hardware Setup #### Communications For bi-direction UART communications, connect VOXL 2's `J18` connector to the VOXL ESC's (M0049 or M0117) `J2` using [MCBL-00029](/cable-datasheets/#mcbl-00029) or building your own following this. ![m0054-user-guides-esc.png](/images/voxl2/m0054-user-guides-esc.png) > J2 pin 1 is the end nearest the J3 connector and is marked with a dot on the board silkscreen — count pins from there. Pin 1 is a 3.3V reference output (VREF_OUT), not a no-connect; leave it unwired. M0049/M0117 J2: - Connector on board : Hirose DF13A-6P-1.25H - Mating connector : DF13-6S-1.25C M0054 J18: - Connector on board : SM04B-GHS-TB(LF)(SN) - Mating connector : GHR-04V-S #### VBAT Power and Motors Use standard installation processes following the [datasheet](/voxl-esc-datasheet/) pinouts. #### Tuning Most often, you will want to tune your ESC for your motor/prop setup. Tools to help facilitate this are [here](/modal-esc-v2-manual/#voxl-esc-tools). The outcome of the tuning process are parameters that you flash to the ESC using tools aforementioned. ### Software Setup #### Checking Status The `px4-qshell modalai_esc` command can be used to access the driver which has debug info and tools. The `px4-listener esc_status` can be used to check status of published topics. #### ModalAI ESC PX4 Driver The PX4 parameters that are used by the system are [here](/modal-esc-px4-user-guide/#px4-params) For example, if you need to change the motor ordering or min/max RPMs, these are params you will want to tweak. The driver source is [here](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) for reference. When PX4 runs on VOXL2, [this is where the driver is started](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4-start#L176) #### How to Spin Motors At this time, the motor test functionality offered via QGroundControl and MAVLink isn't routed into the ESC driver. To do a spin test, please see [here](/voxl-escs/faq/#unboxing-and-testing-new-standalone-esc) ## PWM ESC Option PWM ESCs can be used with VOXL 2 and VOXL 2 Mini's built in flight controller. Due to the lack of PWM output on the Qualcomm QRB5165 chipset, an external PWM generator is required. The VOXL 2 ecosystem supports the [VOXL 2 IO](/voxl2-io/). To use the VOXL 2 IO to control PWM ESCs follow the [VOXL 2 IO User's Guide](/voxl2-io-user-guide/) --- Source: https://docs.modalai.com/voxl2-user-guides-onboard-sensors/ # VOXL 2 Onboard Sensors --- ## IMU0 (U16) ### Hardware - ICM-42688p - DSP - SSC QUP5 ### Software #### Checking slpi_proc IMU Status The `px4-listener sensor_accel` and `px4-listener sensor_gyro` commands will provide status of this IMU. For example: ``` px4-listener sensor_accel TOPIC: sensor_accel sensor_accel_s timestamp: 50136333 (0.002592 seconds ago) timestamp_sample: 50136045 (288 us before timestamp) device_id: 2490378 (Type: 0x26, SPI:1 (0x00)) x: -0.3328 y: 0.2801 z: 9.7995 temperature: 32.9937 error_count: 0 clip_counter: [0, 0, 0] ``` ``` px4-listener sensor_gyro TOPIC: sensor_gyro sensor_gyro_s timestamp: 55642109 (0.001741 seconds ago) timestamp_sample: 55641871 (238 us before timestamp) device_id: 2490378 (Type: 0x26, SPI:1 (0x00)) x: 0.0205 y: -0.0528 z: -0.0229 temperature: 33.2654 error_count: 0 ``` #### PX4 Driver Please see driver at [icm42688p](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/imu/invensense/icm42688p) #### Setting IMU orientation This is currently set in a startup script [here](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4-start#L78) ## IMU1 (U17) ### Hardware - ICM-42688p - apps_proc - /dev/spidev3.0 ### Software #### Checking apps_proc IMU Status This IMU doesn't interface with PX4 but instead intended for the apps_proc. To view status: - Run `voxl-configure-imu` with the factory settings options - Run `voxl-inspect-imu imu_apps` ``` voxl-inspect-imu imu_apps Acc in m/s^2, gyro in rad/s, temp in C gravity | accel_x accel_y accel_z | gyro_x gyro_y gyro_z | Temp | 9.38 | 0.93 0.16 -9.34 | 0.003 -0.012 -0.017 | 28.84 | ``` #### Driver Please see [qrb516-imu-server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) Please see [voxl-inspect-imu](/voxl-inspect-imu/) as well. ## BARO (U19) ### Hardware - ICP-10100 - DSP - SSC QUP4 - Address: 0x63h ### Software #### Checking Baro Status This barometer interfaces with PX4 and the `px4-listener sensor_baro` command can be used to view its status: ``` px4-listener sensor_baro TOPIC: sensor_baro sensor_baro_s timestamp: 166216724 (0.008201 seconds ago) timestamp_sample: 166216722 (2 us before timestamp) device_id: 10249001 (Type: 0x9C, I2C:5 (0x63)) error_count: 0 pressure: 1019.6817 temperature: 30.3849 ``` #### PX4 Driver Please see [icp10100](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/barometer/invensense/icp10100) driver. --- Source: https://docs.modalai.com/voxl2-guides-onboard-offboard-sensors/ # VOXL 2 Offboard Sensors --- For connecting devices beyond the supported GPS/mag units — your own I2C, SPI, UART, or GPIO hardware — see [Connecting External Devices to VOXL 2](/voxl2-external-devices/). ## External GPS (Mag / GNSS) ### Hardware Tested hardware: - Holybro M9N GPS - Matek PN ??? ![m0054-user-guides-gps.png](/images/voxl2/m0054-user-guides-gps.png) | Pin # | Signal Name | Notes | |-------|-----------------|-------------------------------------| | 1 | VDC_5V_LOCAL | GNSS/Mag power * | | 2 | GNSS TX 3P3V | slpi_proc, SSC_QUP6 | | 3 | GNSS RX 3P3V | slpi_proc, SSC_QUP6 | | 4 | MAG SCL 3P3V | slpi_proc, SSC_QUP0 | | 5 | MAG SDA 3P3V | slpi_proc, SSC_QUP0 | | 6 | GND | | | (others omitted) | | | ### Software #### Checking Sensor Status You can check GPS and mag status using `px4-listener sensor_gps` and `px4-listener sensor_mag` ``` px4-listener sensor_gps TOPIC: sensor_gps sensor_gps_s timestamp: 291194815 (0.136990 seconds ago) time_utc_usec: 0 lat: 0 lon: 0 alt: -17000 alt_ellipsoid: 0 s_variance_m_s: 1000.0001 c_variance_rad: 3.1416 eph: 4294967.5000 epv: 3761869.7500 hdop: 99.9900 vdop: 99.9900 noise_per_ms: 103 jamming_indicator: 6 vel_m_s: 0.0000 vel_n_m_s: 0.0000 vel_e_m_s: 0.0000 vel_d_m_s: 0.0000 cog_rad: 0.0000 timestamp_time_relative: 0 heading: nan heading_offset: 0.0000 fix_type: 0 jamming_state: 0 vel_ned_valid: False satellites_used: 0 ``` ``` px4-listener sensor_mag TOPIC: sensor_mag sensor_mag_s timestamp: 331057756 (0.032405 seconds ago) timestamp_sample: 331057149 (607 us before timestamp) device_id: 396809 (Type: 0x06, I2C:1 (0x0E)) x: 0.0765 y: 0.1121 z: 0.3333 temperature: nan error_count: 0 is_external: True ``` #### PX4 Driver and Setup See GPS driver [here](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/gps). The default driver is Holybro and is set [here](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4#L93) For Matek, see [here](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4#L115) --- Source: https://docs.modalai.com/voxl2-external-devices/ # Connecting External Devices to VOXL 2 ## Processor Ownership VOXL 2 is a split-processor system: most of PX4 runs on the **sensors DSP** (SLPI), while Linux and your applications run on the **applications processor**. Every external bus belongs to one side or the other, and that decides everything about how you talk to a device: - **JST board-to-cable connectors (J18, J19) are DSP-owned** — they exist for flight-control peripherals. Devices there are only reachable through **PX4 drivers** (started with `qshell`), never from Linux. `i2cdetect`, `voxl_i2c`, and `/dev/tty*` will show *nothing* on these ports — the most common "no clock activity on J19" confusion. - **Board-to-board connectors (J3, J5) and J10 are apps-processor-owned** — reachable from Linux via standard `/dev` nodes and [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io). Expansion boards (the [Dev Test Board](/voxl2-dev-test-board-user-guide/), M0141 breakout, modem carriers) fan these out to usable connectors. - **DSP UARTs cannot be used outside PX4 while PX4 is running**, and the DSP's single SPI port is hardwired to the onboard IMU — SPI peripherals always go to the apps processor. Full pin-by-pin bus reference: [VOXL 2 Linux User Guide](/voxl2-linux-user-guide/) (UARTs, SPI, I2C, GPIOs) and [VOXL 2 Connectors](/voxl2-connectors/). ## Decision Guide | You want to connect... | Route | |---|---| | A flight sensor PX4 should consume (mag, rangefinder, PWM expander) | **DSP route**: wire to J19, use/add a PX4 driver ([below](#px4-dsp-route-flight-sensors)) | | A device your own Linux code will talk to | **Apps route**: B2B/J10 via an expansion board, use `/dev` nodes + libqrb5165-io ([below](#apps-processor-route-linux-devices)) | | A device that speaks MAVLink (e.g. a MAVLink rangefinder or peripheral) | Apps UART + a dedicated PX4 MAVLink instance ([below](#mavlink-devices-over-uart)) | | Simple on/off control (GPIO) | `voxl-gpio` on the exposed apps GPIOs — mind the TrustZone limits ([below](#gpio)) | | PWM outputs for servos/actuators | [VOXL 2 IO board](/voxl2-io-user-guide/) (the supported path), or a PCA9685 I2C expander on the DSP bus | ## Apps-Processor Route (Linux Devices) What Linux sees out of the box: | Node | Where | Notes | |---|---|---| | `/dev/ttyHS1` | J3 pins 3/5 (UART7); also the M0141 breakout's UART | 3.3V logic | | `/dev/ttyHS2` | J5; also J9 on the M0090 5G modem carrier | 3.3V logic | | `/dev/spidev14.0` | J10 SPI | On VOXL 2 **Mini**, J10 is a UART instead (`/dev/ttyHS0`) | | `/dev/i2c-N` | B2B and camera-group I2C buses | See the [I2C bus map](/voxl2-linux-user-guide/#i2cs); buses have pull-ups fitted | - Program them with [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) (C library + `voxl_i2c`, `voxl-gpio` and example apps), or standard Linux interfaces. A real-world SPI example is [voxl-lepton-server](/voxl-lepton-server/). - Quick UART bench test — set the baud, then watch or type: ```bash stty -F /dev/ttyHS2 115200 cat /dev/ttyHS2 # watch incoming data screen /dev/ttyHS2 115200 # interactive (ctrl-a k to exit) ``` Jumper TX to RX on the connector and typed characters echo back — the standard loopback sanity check. > `voxl_i2c` and `i2cdetect` only scan **apps-processor** buses. If you probe J19 with them you'll see nothing and no bus activity — that's the expected result, not a fault. J19 belongs to PX4. ## PX4 (DSP) Route (Flight Sensors) The DSP's external I2C lives on J19: **bus 1** on pins 4/5 (where the standard GPS unit's magnetometer connects) and **bus 4** on pins 7/8 (the spare); bus 5 is internal (onboard barometers). Drivers are started in `/usr/bin/voxl-px4-start` with `qshell`, e.g. `qshell ist8310 start -R 10 -X -b 1` or a PWM expander with `qshell pca9685_pwm_out start -b 4`. To add a driver that isn't in the build: 1. Add it to the board config: `boards/modalai/voxl2-slpi/default.px4board` (DSP buses) or the plain `voxl2` board (apps-processor ports) in [voxl-px4](https://github.com/modalai/px4-firmware). 2. Start it in `boards/modalai/voxl2/target/voxl-px4-start` (installed as `/usr/bin/voxl-px4-start`). 3. Build and install as a deb package rather than copying files. 4. Verify in the foreground: `systemctl stop voxl-px4`, then `MINIMAL_PX4=1 voxl-px4 -d`, and use `px4-qshell status` / `px4-listener `. I2C notes: - 400 kHz clock works; 1 MHz is in-code supported but untested by ModalAI; 3 MHz fails to open the port (a failed open does not crash PX4 — a crash means driver code, not the bus). - Prefer **batched multi-byte reads**: every single-register read costs ~3 bytes of bus time, so reading a sensor's six axis bytes in one transaction is ~3x faster. - A sensor that needs unplugging/replugging to enumerate usually has a power-up race with the driver's probe — add start-up delay tolerance in the driver. - An apps-side GPS is possible (`gps start -d /dev/ttyHS2`, or SPI: `gps start -i spi -d /dev/spidev14.0`) — but the **compass driver is DSP-only**, which is why the standard wiring splits a GPS unit between an apps UART and J19's I2C. For the supported external GPS/mag wiring itself, see [VOXL 2 Offboard Sensors](/voxl2-guides-onboard-offboard-sensors/). ## MAVLink Devices Over UART For a peripheral that speaks MAVLink, give PX4 a dedicated MAVLink instance on an apps UART by adding to `/usr/bin/voxl-px4-start`: ``` mavlink start -x -d /dev/ttyHS0 ``` This connects the device directly into PX4 (voxl-mavlink-server is not involved — that's for GCS/onboard routing, and routing it out a UART "TELEM-style" is untested territory). ## GPIO - Exposed apps GPIOs are listed in the [Linux User Guide GPIO section](/voxl2-linux-user-guide/#gpios) and driven with `voxl-gpio` (from libqrb5165-io). The sysfs interface is provided by the `voxl-gpio-mod` kernel module — if `/sys/class/gpio` is empty after a custom kernel build, check `dmesg | grep voxl-gpio-mod` (commonly a debug-vs-perf kernel/module mismatch). - **Repurposing arbitrary pins as GPIO is not generally supported** — pin muxing is locked by TrustZone plus device tree, and changing it means a [kernel rebuild](/voxl2-kernel-build-guide/) at minimum, with some pins simply off-limits. The [Dev Test Board](/voxl2-dev-test-board-user-guide/) exposes the B2B pins so you can test what's actually available before designing hardware. - Practical escape hatch when you need more/faster IO: a microcontroller bridge — e.g. a Raspberry Pi Pico or Arduino on an apps UART, receiving simple commands from VOXL 2 and doing the pin-wiggling itself. - If you're repurposing a bus pin for GPIO-like use, prefer SPI/UART pins over I2C pins — the I2C lines have pull-ups fitted, which ruins rise times. - Designing an expansion board? See the [Expansion Hardware Design Guide](/expansion-design-guide/) — ModalAI offers courtesy schematic reviews. ## Known Limits - PX4 has never been integrated with apps-processor SPI devices by ModalAI — the posix-side SPI driver path is uncharted; bring an oscilloscope. - RTK GPS is unsupported; there is a known issue where RTCM corrections don't reach a DSP-hosted GPS driver (apps-hosted works). - Only one PMD ToF sensor per VOXL 2 is supported. - DSP UART/I2C internals are Qualcomm-proprietary — DSP-side console output needs `mini-dm` from the Hexagon SDK. DSP UARTs have hardware FIFOs (64 bytes on UART2, 128 on UART6/7), no DMA, and proven throughput of 2 Mbaud at 800 Hz packet rates. --- Source: https://docs.modalai.com/voxl2-image-sensors/ # VOXL 2 Image Sensors --- # Overview ## Supported Architecture This documentation is valid for VOXL 2, VOXL 2 Mini staring SDK 1.0. ## Image Sensor Drivers Overview ### Driver Components The primary purpose of image sensor drivers are: - selecting the hardware location on VOXL 2 / VOXL 2 Mini - programming the image sensor with register values to support a desired setup The image sensor driver is broken into two components that support these requiements: - the `com.qti.sensormodule.xxxx_N.bin` - where `xxxx` is the sensor type, and `N` represents the HW ID (described below) - the `com.qti.sensor.xxxx_yyyy_zzzz.so` - where `xxxx` is the sensor type and `yyyy_zzzz` are a possible variants ### Sensor Module bin Location The "Sensor Module Bin" file is responsible for enabling a sensor to be probed. All the available `com.qti.sensormodule.xxxx_N.bin` files are located at `/usr/share/modalai/chi-cdk`. For example: ``` voxl2:/usr/lib/camera$ ls /usr/share/modalai/chi-cdk/ imx214 imx377 imx412 imx678 irs1645 ov7251 ov7251-combo ov7251-combo-flip ov9782 ov9782-combo ov9782-combo-flip ```

To enable a sensor to be probed, copy its appropriate `com.qti.sensormodule.xxxx_N.bin` file into `/usr/lib/camera`.

### Sensor so Location The "Sensor so" holds the sensors register settings (roughly). We can keep them all in `/usr/lib/camera` without affecting probes, so all options are shipped into this directory. # VOXL SDK Usage ## SDK 1.0 Usage Example To automatically generate a valid, default `/etc/modalai/voxl-camera-server.conf` file for a configuration, a helper script For reference, see an example for [C11 Sentinel](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/sdk-1.0.0/scripts/qrb5165-configure-cameras?ref_type=tags#L247) ``` camera-server-config-helper stereo_front:ov7251:0:1 tracking:ov7251:2 hires2:imx214:3 stereo_rear:ov7251:4:5 ``` And in in `/usr/lib/camera/` we'd expect: ``` com.qti.sensormodule.ov7251_combo_0.bin com.qti.sensormodule.ov7251_combo_1.bin com.qti.sensormodule.ov7251_2.bin com.qti.sensormodule.imx214_3.bin com.qti.sensormodule.ov7251_combo_4.bin com.qti.sensormodule.ov7251_combo_5.bin ``` # Image Sensor Hardware IDs ## Overview Image sensor hardware IDs are derived from the kernel's [device tree](https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/blob/master/recipes-kernel/linux-msm/files/dts/m0054/m0054-modalai-camera.dtsi). There are many ways to build interfaces to VOXL 2's 3 camera groups. ![m0054-image-sensors-groups](/images/voxl2/m0054-iamge-sensor-groups-v2.png) # Image Sensor Drivers ## SDK 1.1.0 (system image 1.7.x) All sensormodule binaries shipped in `/usr/share/modalai/chi-cdk`. ``` imx214 imx214-flip imx335 imx377 imx412 imx412-flip imx678 imx678-flip irs1645 ov7251 ov7251-combo ov7251-combo-flip ov7251-fsin ov7251-fsout ov9782 ov9782-combo ov9782-combo-flip ``` ## SDK 1.0.0 (system image 1.6.2) All sensormodule binaries shipped in `/usr/share/modalai/chi-cdk`. ``` imx214 imx377 imx412 imx678 irs1645 ov7251 ov7251-combo ov7251-combo-flip ov9782 ov9782-combo ov9782-combo-flip ``` ## SDK 0.9.5 (system image 1.5.5) All sensormodule binaries and sensor so files shipped in `/usr/lib/camera` ``` com.qti.sensormodule.m0_cmk_imx577_cam0.bin com.qti.sensormodule.m0_cmk_ov9782l_cam0.bin com.qti.sensormodule.m0_imx214_cam0.bin com.qti.sensormodule.m0_liteon_ov7251l_cam0.bin com.qti.sensormodule.m0_pmd_irs1645.bin com.qti.sensormodule.m1_cmk_ov9782r_cam1.bin com.qti.sensormodule.m1_liteon_ov7251r_cam1.bin com.qti.sensormodule.m1_pmd_irs1645.bin com.qti.sensormodule.m2_cmk_imx577_cam2.bin com.qti.sensormodule.m2_cmk_ov9782_cam2.bin com.qti.sensormodule.m2_imx214_cam2.bin com.qti.sensormodule.m2_imx678_cam2.bin com.qti.sensormodule.m2_liteon_ov7251_cam2.bin com.qti.sensormodule.m2_pmd_irs1645.bin com.qti.sensormodule.m3_cmk_imx377_cam3.bin com.qti.sensormodule.m3_cmk_imx577_cam3.bin com.qti.sensormodule.m3_imx214_cam3.bin com.qti.sensormodule.m3_imx678_cam3.bin com.qti.sensormodule.m3_pmd_irs1645.bin com.qti.sensormodule.m4_cmk_imx577_cam4.bin com.qti.sensormodule.m4_cmk_ov9782l_cam4.bin com.qti.sensormodule.m4_imx214_cam4.bin com.qti.sensormodule.m4_imx678_cam4.bin com.qti.sensormodule.m4_liteon_ov7251l_cam4.bin com.qti.sensormodule.m4_pmd_irs1645.bin com.qti.sensormodule.m5_cmk_ov9782r_cam5.bin com.qti.sensormodule.m5_imx678_cam5.bin com.qti.sensormodule.m5_liteon_ov7251r_cam5.bin com.qti.sensormodule.m5_pmd_irs1645.bin com.qti.sensormodule.sony_imx335.bin ``` --- Source: https://docs.modalai.com/voxl2-modems/ # VOXL 2 Modem User Guides --- ## Summary Overview of VOXL 2 modem user's guides. ## Modem Compatibility and User Guides | Air Interface | User Guide | Purchase | |---------------|-----------------------------------------------|---------------------------------------------------------------------------| | WiFi | [User's Guide](/wifi-setup/) | [Purchase](https://www.modalai.com/products/m0141) | | Microhard | [User's Guide](/microhard-add-on-manual/) | [Purchase](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) | | 4G LTE | [User's Guide](/lte-v2-modem-user-guide/) | [Purchase](https://www.modalai.com/products/m0130-3) | | 5G | [User's Guide](/5G-Modem-user-guide/) | [Purchase](https://www.modalai.com/products/mdk-m0090) | | Doodle Labs | [User's Guide](/doodle-labs-user-guide/) | EOL | | DTC | [User's Guide](/dtc-user-guide/) | Community Supported | --- Source: https://docs.modalai.com/voxl2-external-flight-controller/ # VOXL 2 Connecting an External Flight Controller --- ## Summary VOXL 2 is a great companion computer for [PX4](https://px4.io) and [ArduPilot](https://ardupilot.org). Although VOXL 2 has the capability to run PX4 in a real time DSP, some use cases call for an external flight controller. You can communicate between a flight controller TELEM port and a VOXL 2 UART port. For example, Flight Core has a default telemetry port on J5 with a MavLINK instance running at 57600 baud. ![m0054-ext-fc-real](/images/voxl2/m0054-ext-fc-real.jpg) ## VOXL-SDK Integration **Available starting in SDK 1.1.0** The [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) library can be used to interface with the UARTs. Using the Applications Process UARTs, you can follow standard Linux paradigms. Using the DSP UARTs, you need to use the `libqrb5165-io` library. If you are interfacing via MAVLink, it's recommended to use the [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) project, which depends on `libqrb5165-io` and shows usage. ## UART Devices ### Application Processor UARTs As of SDK 1.0.0 (System Image 1.6), there are [4 applications processor UARTs exposed](/voxl2-linux-user-guide/#uarts) on VOXL 2, which can be used using standard Linux techniques.
| UART | Connector | Add-On / Adapter | libqrb5165-io ID/enum | |---------------|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|-----------------------| | `/dev/ttyHS0` | [J8](/voxl2-connectors/), camera group 2 | [M0076](https://www.modalai.com/products/mdk-m0076-1) with hand soldering to test points | `0`, `APPS_HS0_UART` | | `/dev/ttyHS1` | [J3](/voxl2-connectors/), Board to Board | [M0151](/m0151/) / [Purchase Here](https://www.modalai.com/products/m0151?variant=40740708876339) | `1`, `APPS_HS1_UART` | | `/dev/ttyHS2` | [J5](/voxl2-connectors/), HS Board to Board | [M0090](/5G-Modem-datasheet/) / [Purchase Here](https://www.modalai.com/products/mdk-m0090?variant=40594936463411) | `2`, `APPS_HS2_UART` | | `/dev/ttyHS3` | [J5](/voxl2-connectors/), HS Board to Board | M0130 - Internal Use | `3`, `APPS_HS3_UART` |
As of SDK 1.1.0+ (System Image 1.7.1), on VOXL 2 Mini, there is 1 [applications processor UART exposed](/voxl2-mini-linux-user-guide/) | UART | Connector | libqrb5165-io ID/enum | |---------------|--------------------------------------------------|-----------------------| | `/dev/ttyHS0` | [J10](/voxl2-mini-connectors/), pins 4/5 (TX/RX) | `0`, `APPS_HS0_UART` |
### DSP UARTs (via Apps Proc) **Available starting in SDK 1.1.0** > At this time, only one of these QUPX UARTs can be used at a time — and if `voxl-px4` is running, these DSP UARTs aren't available. Additionally, through the [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) project, you can access the DSP UARTs from the applications processor as well, the the board-to-cable interfaces (no add on board required!). | UART | Connector | libqrb5165-io ID/enum | |--------|-----------------------------------------------------------------------------------------|------------------------| | `QUP2` | VOXL2 [J18](/voxl2-connectors/), VOXL2 Mini [J19](/voxl2-connectors/) pin 7/8, ESC Port | `12`, `SLPI_QUP2_UART` | | `QUP6` | [J19](/voxl2-connectors/) pin 2/3, GNSS Port | `16`, `SLPI_QUP6_UART` | | `QUP7` | [J19](/voxl2-connectors/) pin 10/11, RC IO Port | `17`, `SLPI_QUP7_UART` | ![m0054-ext-fc-dsp.jpg](/images/voxl2/m0054-ext-fc-dsp.jpg) #### DSP UART to Flight Core v2 ![M0054-ext-fc-m0087.jpg](/images/voxl2/M0054-ext-fc-m0087.jpg) ## Add-On Boards ### Using USB/UART Addon Board (M0125 or M0151) In the following example, we'll add the USB3/UART Add-On Board (M0125) to VOXL 2 (M0054) which gives us a 4 pin JST GH connector with a UART available at `/dev/ttyHS1` from the applications processor. Using `MCBL-00067-1`, connect from M0151's J3 to Flight Core's (v1/v2) (M0018/M0087) J5, TELEM1/TELEM2 (respectively). ![m0054-ext-fc-m0125.png](/images/voxl2/m0054-ext-fc-m0125.png) | M0125 or M0151 J3 | M0018 J5 | |-------------------|----------| | 1 | | | 2 RX | 2 TX | | 3 TX | 3 RX | | 4 GND | 6 GND | ### Using M.2 5G Modem Addon Board (M0090) The VOXL2 (`M0054`) can have the M.2 5G Modem Board Addon attached, which exposes a UART on `M0090 - J9` that is accessible in VOXL2's application processor as `/dev/ttyHS2`. Using `MCBL-00066-1`, connect from M0090's J9 to Flight Core's (v1/v2) (M0018/M0087) J5, TELEM1/TELEM2 (respectively). ![m0054-ext-fc-m0090.png](/images/voxl2/m0054-ext-fc-m0090.png) | M0090 J9 | M0018 J5 | |------ |--- | | 1 | | | 2 TX | 3 RX | | 3 RX | 2 TX | | 4 | | | 5 | | | 6 | 6 GND | ### Using J8 Camera Connector You will need to use a level shifter likely, as the logic is 1.8V here. VOXL2's camera group 3 connector can be used with M0076 interposer which has test points you can solder to. ![m0054-ext-fc-m0076.jpg](/images/voxl2/m0054-ext-fc-m0076.jpg) - UART_TX - TP7 - UART_RX - TP8 - VREF 1P8 - TP1 - DGND - TP11 ## VOXL SDK Software Setup For information on MAVlink routing in VOXL-SDK please see [here](/mavlink/). #### autopilot_uart_bus Values `voxl-mavlink-server` ships in the VOXL SDK, with a config file located at `/etc/modalai/voxl-mavlink-server.conf`. For the `autopilot_uart_bus` field, these are current options: | ENUM | Device / Name | autopilot_uart_bus value | |------------------|-------------------------|--------------------| | `APPS_HS0_UART` | `/dev/ttyHS0` | "autopilot_uart_bus": 0 | | `APPS_HS1_UART` | `/dev/ttyHS1` | "autopilot_uart_bus": 1 | | `APPS_HS2_UART` | `/dev/ttyHS2` | "autopilot_uart_bus": 2 | | `APPS_HS3_UART` | `/dev/ttyHS3` | "autopilot_uart_bus": 3 | | `SLPI_QUP2_UART` | `QUP2` | "autopilot_uart_bus": 12 | | `SLPI_QUP6_UART` | `QUP6` | "autopilot_uart_bus": 16 | | `SLPI_QUP7_UART` | `QUP7` | "autopilot_uart_bus": 17 | #### autopilot_uart_bus Values For `autopilot_uart_bus`, configure this the same as the MAVLink instance on Flight Core. In this example, we are using `921600`. For `en_external_uart_ap`, set to `true`. For apps proc, standard termios rates up to `4000000`. For DSP, a bit more custom rates: ``` 9600, 38400, 57600, 115200, 230400, 250000, 420000, 460800, 921600, 1843200, 2000000 ``` ### VOXL 2 as Companion Computer PX4 SW Setup If using Flight Core, you would likely need to connect over the USB interface first to configure the external flight controller. For this example to work out of the box, make sure to set `SER_TELX_BAUD` to the default baud rate of **921600** if you've changed it. - Connect to QGroundControl over USB and open the parameters. - On Flight Core v1 (M0018) - J1 is mapped to `TELEM2` in PX4 (/dev/ttyS4), use `SER_TEL2_BAUD` - J4 is mapped to `TELEM3` in PX4 (/dev/ttyS4), use `SER_TEL3_BAUD`. This is used by ModalAI ESCs by default. - J5 is mapped to `TELEM1` in PX4 (/dev/ttyHS6), use `SER_TEL1_BAUD` - On Flight Core v2 (M0087) - J1 is mapped to `TELEM1` in PX4 (/dev/ttyHS6), use `SER_TEL1_BAUD` - J5 is mapped to `TELEM2` in PX4 (/dev/ttyHS4), use `SER_TEL2_BAUD`. This is used by ModalAI ESCs by default. Check the status of MAVLink instances by opening the MAVLink Console in QGC and running `mavlink status`: On Flight Core v1, you should see something like this if using `921600` baud: ```bash instance #1: mavlink chan: #1 type: GENERIC LINK OR RADIO flow control: ON rates: tx: 81.8 B/s txerr: 0.0 B/s tx rate mult: 0.682 tx rate max: 1200 B/s rx: 20.9 B/s rx loss: 0.0% received from sysid: 0 compid: 197: 43, lost: 0, last 343 ms ago FTP enabled: YES, TX enabled: YES mode: Normal MAVLink version: 2 transport protocol: serial (/dev/ttyS6 @921600) ``` Above is showing you that the Flight Core is communicating with VOXL2 successfully, note `tx: 81.8 B/s` and `rx: 20.9 B/s` rates indicate bidirectional traffic. ### VOXL 2 as Companion Computer ArduPilot SW Setup ArduPilot works over the same UART link — voxl-mavlink-server's routing is dialect-agnostic and relays whatever the flight controller sends. ArduPilot support is community supported; the [ArduPilot wiki's ModalAI VOXL 2 page](https://ardupilot.org/copter/docs/common-modalai-voxl2.html) is the authoritative ArduPilot-side reference. **VOXL 2 side** — edit `/etc/modalai/voxl-mavlink-server.conf` by hand (the configure script's external-FC preset does not currently set this key), then restart the service: ```json "en_external_uart_ap": true, "autopilot_uart_bus": 1, "autopilot_uart_baudrate": 921600, ``` ```bash systemctl restart voxl-mavlink-server ``` > The config file's comment block refers to `en_external_fc_timesync` — the actual key is `en_external_ap_timesync` (default enabled), which runs MAVLink TIMESYNC with the external autopilot so sensor timestamps are aligned. **ArduPilot side** — on the serial port wired to VOXL 2: - `SERIALx_PROTOCOL` = 2 (MAVLink2) - `SERIALx_BAUD` = 921 (to match `autopilot_uart_baudrate` of 921600) - Stream rates are whatever the flight controller's `SRx_*` parameters emit — VOXL does not request streams. - For VOXL VIO into ArduPilot's EKF: `VISO_TYPE` = 3 (VOXL) — see the [ArduPilot wiki](https://ardupilot.org/copter/docs/common-modalai-voxl2.html) and the VIO support [pull request](https://github.com/ArduPilot/ardupilot/pull/26277). The autopilot's MAVLink system ID is auto-detected from its heartbeats, so a non-default `SYSID_THISMAV` works without extra configuration. Verify the link the same way as the PX4 case above — bidirectional traffic on the FC's MAVLink status for that serial port. ## pymavlink Software Based Example > This clashes with the example above, so ensure to disable the `voxl-mavlink-server` if you configured the VOXL SDK. The `SER_TEL1_BAUD`/`SER_TEL1_BAUD` baud rate should be set to `57600` for thi example (for Flight Core v1/v2 respectively). ![m0054-ext-fc-py](/images/voxl2/m0054-ext-fc-py.png) First, connect VOXL 2 to the internet so we can use `apt` to install `pymavlink`. You can connect an ethernet or WiFi dongle to the USB3 port. Conect to the VOXL 2 over ADB: ```bash adb shell ``` Now on target: ```bash apt update sudo apt-get install python3-pip sudo apt-get install libxml2-dev libxslt-dev python-dev sudo pip3 install pymavlink pyserial ``` Get the `mavlink_shell.py` tool from PX4: ```bash cd /home wget https://raw.githubusercontent.com/PX4/PX4-Autopilot/main/Tools/mavlink_shell.py ``` Now, run the program and interact with the Flight Core. ``` python3 mavlink_shell.py /dev/ttyHS1 Connecting to MAVLINK... NuttShell (NSH) nsh> ver all HW arch: MODALAI_FC_V1 HW type: V106 HW version: 0x00000000 HW revision: 0x00000006 FW git-hash: 7008425b466eba94e35304e502454208d578ba56 FW version: 1.11.3 0 (17498880) FW git-branch: fcio-v2 OS: NuttX OS version: Release 8.2.0 (134349055) OS git-hash: ec20f2e6c5cc35b2b9bbe942dea55eabb81297b6 Build datetime: May 10 2022 18:38:31 Build uri: localhost Toolchain: GNU GCC, 9.3.1 20200408 (release) PX4GUID: 0002000000003930353534385109003a002e MCU: STM32F76xxx, rev. Z ``` --- Source: https://docs.modalai.com/voxl2-unbricking/ # Unbricking your VOXL 2 --- ## Summary If you have corrupted your VOXL's filesystem (if ADB is unable to detect your VOXL, this is a common sign), follow this guide. > This process will perform a factory reset. All data on the VOXL will be wiped. > Back up `/data/modalai` before you flash. The flat build erases it, and it holds the camera and IMU calibration files, including the tracking camera intrinsics that ModalAI calibrates at the factory. Once overwritten, those files cannot be recovered from the board. If the board is still reachable over ADB, pull the directory to the host first: > > ```bash > adb pull /data/modalai ./modalai-backup > ``` > > After the SDK has been reinstalled, copy back only the calibration files (`voxl-imu-server.cal` and the `opencv_*_intrinsics.yml` / `opencv_*_extrinsics.yml` files) with `adb push`, rather than the whole directory, so the freshly installed configuration files are not overwritten. PX4 sensor calibration lives separately under `/data/px4/param/` and is also erased; back it up the same way if you want to keep it. If the board is already unreachable, ModalAI keeps production calibration backups; see [Verifying Camera Calibration](/flying-with-vio/#verifying-camera-calibration) for how to request them. ### How does it work? We use Qualcomm's tool for unbricking Snapdragon devices called QDL. Snapdragon based devices contain a special mode of operation, called Emergency Download Mode (EDL). In this mode, the device identifies itself as `05c6:901d Qualcomm, Inc.` via. USB and can communicate with a PC host. EDL mode itself implements the Qualcomm Sahara protocol, which accepts an OEM-digitally-signed programmer over USB. The programmer implements the Firehose protocol which allows the host PC to send commands to write into the onboard storage (UFS). An open source tool (for Linux) that implements the Qualcomm Sahara and Firehose protocols has been developed by Linaro, and can be used to program (or unbrick) Snapdragon based devices. ## Usage ### Prerequisites #### Ubuntu Host (Up to Ubuntu version 20.04) Some Linux distributions come with `ModemManager`, a tool for configuring Mobile Broadband. This program, if installed, will interfere with the QDL flashing. One option is to remove the program with the following: ``` $ sudo apt remove --purge modemmanager ``` Alternatively, if you need ModemManager, you can temporarily stop it from running with ``` $ sudo systemctl stop ModemManager ``` and restart it with: ``` $ sudo systemctl start ModemManager ``` GCC is also needed. This can be installed with ``` $ sudo apt install gcc ``` #### OSX Host Install `libusb`: ``` brew install libusb brew link libusb ``` ### Build Clone the [modal-qdl](https://gitlab.com/voxl-public/system-image-build/modal-qdl) repository using the following: ``` $ git clone git@gitlab.com:voxl-public/system-image-build/modal-qdl.git ``` Move into the project directory: ``` $ cd modal-qdl ``` Build and install program dependencies using: ``` $ ./install_dependencies.sh ``` Copy the qdl binary into your local binary path: ``` $ cp ./qdl/qfil_app/modules/qdl /usr/local/bin ``` This will install the `qdl` program into `/usr/local/bin` Test the install by running the following and verifying the output: ``` $ qdl qdl [--debug] [--storage ] [--finalize-provisioning] [--include ] [ ...] ``` ### Image Download Flat build images are hosted in the Flat Builds folder on the ModalAI downloads site ([downloads.modalai.com](https://downloads.modalai.com)). A free account is required to download them. Do not use images from any other source. > If the account verification email does not arrive, check your spam folder. If it still has not arrived, post on the [ModalAI Forum](https://forum.modalai.com) or [contact support](https://www.modalai.com/pages/contact-us) with your board part number and we will get you access. Download the zip that matches your hardware: | Hardware | File in Flat Builds | |----------|---------------------| | VOXL 2, M0054-1 / M0154-1 | `M0054(154)-1.zip` | | VOXL 2, M0054-2 / M0154-2 (including Starling D0005) | `M0054(154)-2.zip` | | VOXL 2 Mini, M0204-1 | `M0204-1.zip` | | VRX, M0205-1 | `M0205-1.zip` | | VRX, M0205-2 | `M0205-2.zip` | To tell M0054-1 and M0054-2 hardware apart, see [VOXL 2 HW Versions](/m0054-versions/). Unzip the downloaded release and move it into the following repository path: ``` $ ./qdl/qfil_app/modalai ``` To view the web UI, run: ``` $ ./run.sh ``` Open browser, go to [http://127.0.0.1:8000/](http://127.0.0.1:8000/) ## Flash ### Hardware preparation In order to force your VOXL 2 into EDL mode, slide the `SW2` switch into the `ON` position, see below: ![m0054-edl](/images/voxl2/m0054-edl.png) Now plug in power and USB-C cable from VOXL 2 to host PC. ### Flash Flat Build (Runtime: ~3-5 mins) Select the flat build that matches your hardware from the dropdown and click `Select Build` to choose which flat build to use After selecting a build, click `Flash Flat Build` to begin flashing the flat build After the flat build has successful flashed, remove power and USB from the device and flip the SW2 switch to `OFF` to depart from QDL mode You can now plug in power and, after a short time, USB (first boot after QDL takes slightly longer than following boots) ADB will be available. Verify that the flash was successful by checking the installed image version: ``` # adb onto VOXL 2 $ adb shell # check version $ root@qrb5165-rb5:/# cat /etc/version 1.1.2-M0054-14.1a-FLAT-V3 ``` This version should match the image you just flashed. DEBUGGING NOTE: If you are unable to ADB onto the device but the device is being detected correctly by the host PC as seen below: ``` $ lsusb Bus 001 Device 022: ID 05c6:901d Qualcomm, Inc. KONA-QRD _SN:21217FEB ``` restarting the ADB server may fix the issue: ``` $ adb kill-server $ adb start-server ``` You should now be able to ADB onto your device successfully. ### If the device still shows 900e or boot loops after a successful flash A board that enumerates as `05c6:900e Qualcomm QUSB_BULK` after QDL reported a successful flash has not booted the new image. A board that boots normally enumerates as `05c6:901d` and ADB becomes available. The same applies to a board that flashes successfully and then boot loops with ADB never appearing. Before anything else, re-check: - `SW2` is back in the `OFF` position. - Power and the USB cable were both removed after the flash, before `SW2` was moved and the board was powered again. - The image matches the board revision (M0054-1 versus M0054-2; see the table above and [VOXL 2 HW Versions](/m0054-versions/)). - Nothing is connected to the board except power and the USB cable. Remove the VOXL 2 from the vehicle and boot it bare, with every camera and add-on board disconnected. A mis-seated camera flex cable has produced this same `900e` state on an otherwise healthy board. Repeat the flash once with those points confirmed. If the board still returns to `900e` or keeps boot looping, ModalAI support's guidance is to send the unit in for an RMA. [Contact support](https://www.modalai.com/pages/contact-us) with the board serial number and the QDL log rather than continuing to reflash. ## Next Steps Now that your VOXL 2 has been reset to the factory image, you will need to reinstall the SDK (including the System Image and VOXL Suite) to get your VOXL back to it's original, out-of-the-box state. Without the SDK installed, your VOXL is unable to run the tools, utilities, and services that ModalAI has developed. To do this, follow [this guide](/flash-system-image/). --- Source: https://docs.modalai.com/voxl2-datasheets/ # VOXL 2 Datasheets ![m0054-exploded](/images/voxl2/m0054-exploded-v1.3-rev0.jpg) ## Table of contents 1. TOC {:toc} --- Source: https://docs.modalai.com/voxl2-feature-matrix/ # VOXL 2 Feature Matrix --- ## Summary ## Specifications | Feature | VOXL 2 | |-------------------------------------------------------------------------------|------------------------------------------------------------------| | CPU | QRB5165
8 cores up to 3.091GHz
8GB LPDDR5
128GB Flash | | OS | Ubuntu 18.04 - Linux Kernel v4.19 | | GPU | Adreno 650 GPU – 1024 ALU | | NPU | 15 TOPS | | Flight Controller Embedded | Yes (PX4 or Ardupilot on Sensors DSP) | | Integrated Sensors | QTY. 2 ICM-42688P IMU, QTY. 1 ICP-10100 | | Power Consumption | 0.1 - 7W | | Built in WiFi | No | | Add-on Connectivity | WiFi, 5G, 4G/LTE, Microhard | | Video Encoding | 8K30 h.264/h.265 64MP still images | | Computer Vision Sensors | QTY. 2 Stereo Pair
QTY. 1 Tracking | | Dimensions | 70mm x 36mm | | Weight | 16g | | VOXL SDK: GPS-denied navigation, SLAM, obstacle avoidance, object recognition | Yes | | ROS | ROS 1 & 2 | | QGroundControl | Yes | | ATAK | Yes | | NDAA ’20 Section 848 Compliant | Yes, Assembled in USA | | PMD TOF | Yes | | FLIR Boson | USB, MIPI | | FLIR Lepton | USB, SPI | --- Source: https://docs.modalai.com/voxl2-connectors/ # VOXL 2 Connectors --- ## Video Overview of Connectors ## Connector Callouts Hover a connector to identify it — click to jump to its pinout.
All single ended signals on B2B connectors J3, J5, J6, J7, and J8 are 1.8V CMOS unless explicitly noted. All single ended signals on cable-to-board connectors J10, J18, & J19 are 3.3V CMOS unless explicitly noted. | Connector | Description | MPN (Board Side) | Mating MPN (Board/Cable Side) | Type | Signal Feature Summary | |-----------|-------------------------------|-------------------------|-------------------------------|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | J2 | Fan | SM02B-SRSS-TB(LF)(SN) | SHR-02V-S | Cable Header, 2-pin R/A | 5V DC for FAN + PWM Controlled FAN-Return (GND) | | J3 | Legacy B2B | QSH-030-01-L-D-K-TR | QTH-030-01-L-D-A-K-TR | B2B Receptacle, 60-pin | 5V/3.8V/3.3V/1.8V power for plug-in boards, JTAG and Debug Signals, QUP expansion, GPIOs, USB3.1 Gen 2 (USB1) | | J4 | Prime Power In | 22057045 | 0050375043 | Cable Connector, 4-pin R/A | +5V main DC power in + GND, I2C@5V for power monitors | | J5 | High Speed B2B | ADF6-30-03.5-L-4-2-A-TR | ADM6-30-01.5-L-4-2-A-TR | B2B Socket, 120-pin | More 3.8V/3.3V/1.8V power for plug-in boards, 5V power in for “SOM Mode”, QUP expansion, GPIOs, SDCC (SD Card V3.0), UFS1 (secondary UFS Flash), 2L PCIe Gen 3, AMUX and SPMI PMIC signals | | J6 | Camera Group 0 | DF40C-60DP-0.4V(51) | DF40C-60DS-0.4V | B2B Plug, 60-pin | Qty-2 4L MIPI CSI ports, CCI and camera control signals, 8 power rails (from 1.05V up to 5V) for cameras and other sensors, dedicated SPI (QUP) port | | J7 | Camera Group 1 | DF40C-60DP-0.4V(51) | DF40C-60DS-0.4V | B2B Plug, 60-pin | Qty-2 4L MIPI CSI ports, CCI and camera control signals, 8 power rails (from 1.05V up to 5V) for cameras and other sensors, dedicated SPI (QUP) port | | J8 | Camera Group 2 | DF40C-60DP-0.4V(51) | DF40C-60DS-0.4V | B2B Plug, 60-pin | Qty-2 4L MIPI CSI ports, CCI and camera control signals, 8 power rails (from 1.05V up to 5V) for cameras and other sensors, dedicated SPI (QUP) port | | J9 | USB-C (ADB) | UJ31-CH-3-SMT-TR | USB Type-C | Cable Receptacle, 24-pin R/A | ADB USB-C with re-driver and display port alternate mode (USB0) | | J10 | SPI Expansion | SM08B-GHS-TB(LF)(SN) | GHR-08V-S | Cable Header, 8-pin R/A | SPI@3.3V with 2 CS_N pins, 32kHz CLK_OUT@3.3V | | J18 | ESC (SLPI Access) | SM04B-GHS-TB(LF)(SN) | GHR-04V-S | Cable Header, 4-pin R/A | ESC UART@3.3V, 3.3V reference voltage | | J19 | GNSS/MAG/RC/I2C (SLPI Access) | SM12B-GHS-TB(LF)(SN) | GHR-12V-S | Cable Header, 12-pin R/A | GNSS UART@3.3V, Magnetometer I2C@3.3V, 5V, RC UART, Spare I2C | ### Add-on Board to Board Design Package Reference add-on board Altium schematic package can be downloaded [here](https://storage.googleapis.com/modalai_public/modal_drawings/VOXL2_PLUGIN_STARTER_KIT_REVA.zip) ## Buttons ### SW1 - Force Fastboot Button Force Fastboot momentary button. To force device into fastboot mode: - power off device, remove USB cable to completely power down - press and hold SW1 button down - power on device, attach USB cable - release SW1 button - from host computer, run `fastboot devices` and verify the device shows up. If not, restart this procedure To reboot device to fastboot: - device is powered on - press and hold SW1 for 30 seconds until the device reboots into fastboot mode
### SW2 - EDL Switch Emergency Download switch, used for factory flashing. Should be left `OFF`. See [user guide for QDL](/voxl2-unbricking/) if interested in more information.
## Pinouts
### J2 - 5VDC Fan Control | Pin # | Signal Name | Notes | | --- | --- | --- | | 1 | VDC_5V_LOCAL | 5V protected power output * | | 2 | FAN RETURN (GND) | Return limited to ~400mA |
### J3 - Legacy Board to Board Connector (B2B) Currently Supported Legacy Add-Ons: - M0017 USB Debug Add-On - M0030 LTE Modem Add-On - M0048 Microhard Modem Add-On The Legacy Board to Board connector is designed to host VOXL Add-ons such as the LTE Add-on v2 and the Microhard Add-on. | Connector | MPN | |------------------|-----------------------| | Board Connector | QSH-030-01-L-D-K-TR | | Mating Connector | QTH-030-01-L-D-A-K-TR | #### J3 Pin-out | Odd Pin # | Signal/Voltage | Even Pin # | Signal/Voltage | |-----------|----------------------------------|------------|-----------------------------------| | 1 | DGND | 2 | VDC_5V_LOCAL | | 3 | GPIO_23_UART7_RXD, `/dev/ttyHS1` | 4 | VDC_5V_LOCAL | | 5 | GPIO_22_UART7_TXD, `/dev/ttyHS1` | 6 | VDC_5V_LOCAL | | 7 | GPIO_52_SPI17_MISO | 8 | USB1_HS_ID_LEGACY (Normally N.C.) | | 9 | GPIO_53_SPI17_MOSI | 10 | DGND | | 11 | DGND | 12 | USB1_HS_DM | | 13 | GPIO_126_I2C9_SCL | 14 | USB1_HS_DP | | 15 | GPIO_125_I2C9_SDA | 16 | VDC_5V_LOCAL_USB1 | | 17 | GPIO_55_SPI17_CS | 18 | DGND | | 19 | GPIO_54_SPI17_SCLK | 20 | USB1_SS_TX_M | | 21 | DGND | 22 | USB1_SS_TX_P | | 23 | GPIO_130_I2C10_SCL, `/dev/i2c-1` | 24 | GPIO_20 | | 25 | GPIO_129_I2C10_SDA, `/dev/i2c-1` | 26 | GPIO_21 | | 27 | GPIO_35_DBG_UART12_RX | 28 | GPIO_32_QUP12_L0 | | 29 | GPIO_34_DBG_UART12_TX | 30 | GPIO_33_QUP12_L1 | | 31 | DGND | 32 | USB1_SS_RX_M | | 33 | JTAG_SRST_N | 34 | USB1_SS_RX_P | | 35 | JTAG_TCK | 36 | DGND | | 37 | JTAG_TDI | 38 | GPIO_131_USB_HUB_RESET | | 39 | JTAG_TDO | 40 | GPIO_124 | | 41 | JTAG_TMS | 42 | GPIO_145 | | 43 | JTAG_TRST_N | 44 | DGND | | 45 | JTAG_PS_HOLD | 46 | GPIO_90_FAST_BOOT_3 | | 47 | VREG_S4A_1P8 | 48 | GPIO_76_FAST_BOOT_2 | | 49 | PM_RESIN_N | 50 | GPIO_47_SPI14_CS2_FAST_BOOT_1 | | 51 | SDM_RESOUT_N | 52 | GPIO_27_FAST_BOOT_0 | | 53 | VREG_3P3V_LOCAL | 54 | GPIO_128_WDOG_DIS | | 55 | KPD_PWR_N | 56 | SDM_FORCE_USB_BOOT | | 57 | VPH_PWR | 58 | DGND | | 59 | DGND | 60 | CLK_PMK_PMIC |
### J4 - Power Connector / I2C Battery Monitoring For use with [VOXL Power Module](/power-module-v3-datasheet/) | Pin# | Signal | Notes/Usage | |------|----------|-----------------------------------------------------------------| | 1 | VDCIN_5V | DC from Power Module, “unprotected” | | 2 | GND | Power Module Return | | 3 | I2C_CLK | slpi_proc, SSC_QUP_1, 5V signal levels, Pullups on Power Module | | 4 | I2C_SDA | slpi_proc, SSC_QUP_1, 5V signal levels, Pullups on Power Module | #### Input Power Requirements The [VOXL Power Module](/power-module-v3-datasheet/) provides the needed voltage and current demands of both VOXL (5V), VOXL 2 (5V), and VOXL 2 Mini (3.8V). It is a well tested and proven design. For VOXL 2, we5V +/- 5% is expected to keep the eFuse happy. The [VOXL Power Module](/power-module-v3-datasheet/) is set for 5.08V at no-load to help compensate for any cable drops. 6A of in-rush support is required during power-on. The steady-state current requirement depends on your application and if a plug-in board (5G modem, Microhard, etc) is connected. If you design with a 3A DC/DC, you will likely not be able to boot the system due to power on in-rush. Please use a 6A device for success with at least 188uF of bulk capacitance (qty-4 47uF for example) to match the [VOXL Power Module](/power-module-v3-datasheet/) performance. If one needs to design their own power module, please submit a PCB review on our forum [here](https://forum.modalai.com/category/40/pcb-design-reviews)
### J5 - High Speed Board to Board Connector (HSB2B) Currently Supported Add-Ons: - M0062 - Debug/PCIe Add-On - M0067 - 5G Add-On - M0090 - 5G Add-On | Connector | MPN | |------------------|-------------------------| | Board Connector | ADF6-30-03.5-L-4-2-A-TR | | Mating Connector | ADM6-30-01.5-L-4-2-A-TR | #### J5 Pin-out | Pin | Signal/Voltage | Pin | Signal/Voltage | Pin | Signal/Voltage | Pin | Signal/Voltage | |----------|-------------------|----------|--------------------------------|----------|-------------------------------------------------------|-----------|--------------------| | A1 (1) | VDCIN_5V | B1 (31) | VDCIN_5V | C1 (61) | VDCIN_5V | D1 (91) | VDCIN_5V | | A2 | VDCIN_5V | B2 | VDCIN_5V | C2 | VDCIN_5V | D2 | VDCIN_5V | | A3 | GND | B3 | GND | C3 | GND | D3 | GND | | A4 | GND | B4 | GND | C4 | GND | D4 | GND | | A5 | VREG_3P3V_LOCAL | B5 | GND | C5 | GPIO_119_SPI3_MISO | D5 | GPIO_36_UART13_CTS | | A6 | VREG_3P3V_LOCAL | B6 | GND | C6 | GPIO_120_SPI3_MOSI | D6 | GPIO_37_UART13_RTS | | A7 | GND | B7 | GPIO_16_QUP6_L0 | C7 | GPIO_121_SPI3_SCLK | D7 | GPIO_38_UART13_TXD | | A8 | GPIO_115_I2C2_SDA | B8 | GPIO_17_QUP6_L1 | C8 | GPIO_122_SPI3_CS | D8 | GPIO_39_UART13_RXD | | A9 | GPIO_116_I2C2_SCL | B9 | GPIO_18_QUP6_L2 | C9 | GPIO_24_I2C8_SDA | D9 | GPIO_8_I2C4_SDA | | A10 | GPIO_117_QUP2_L2 | B10 | GPIO_19_QUP6_L3 | C10 | GPIO_25_I2C8_SCL | D10 | GPIO_9_I2C4_SCL | | A11 | GPIO_118_QUP2_L3 | B11 | GPIO_155 | C11 | GND | D11 | PM8250_AMUX1 | | A12 | SD_UFS_CARD_DET_N | B12 | GPIO_154 | C12 | GPIO_145 (intentional duplicate to Legacy B2B pin 42) | D12 | GND | | A13 | GND | B13 | GPIO_153 | C13 | GPIO_144 | D13 | PCIE2_REFCLK_M | | A14 | SDC2_CLK | B14 | GPIO_152 | C14 | GPIO_143 | D14 | PCIE2_REFCLK_P | | A15 | GND | B15 | GND | C15 | GPIO_142 | D15 | GND | | A16 | VREG_L9C_2P96 | B16 | GPIO_0_QUP19_L0 | C16 | GPIO_137 | D16 | PCIE2_RX0_M | | A17 | SDC2_CMD | B17 | GPIO_1_QUP19_L1 | C17 | GND | D17 | PCIE2_RX0_P | | A18 | SDC2_DATA_0 | B18 | GPIO_2_QUP19_L2, `/dev/ttyHS2` | C18 | GPIO_88 | D18 | GND | | A19 | SDC2_DATA_1 | B19 | GPIO_3_QUP19_L3, `/dev/ttyHS2` | C19 | GPIO_89 | D19 | PCIE2_RX1_M | | A20 | SDC2_DATA_2 | B20 | GPIO_56_I2C18_SDA | C20 | GPIO_87_PCIE2_WAKE_N | D20 | PCIE2_RX1_P | | A21 | SDC2_DATA_3 | B21 | GPIO_57_I2C18_SCL | C21 | GPIO_86 | D21 | GND | | A22 | GND | B22 | GND | C22 | GPIO_85 | D22 | PCIE2_TX0_M | | A23 | UFS1_REFCLK | B23 | GPIO_60_QUP11_L0 | C23 | GND | D23 | PCIE2_TX0_P | | A24 | GND | B24 | GPIO_61_QUP11_L1 | C24 | PMIC_8150L_AMUX1 | D24 | GND | | A25 | UFS1_TX0_M | B25 | GPIO_62_QUP11_L2 | C25 | GND | D25 | PCIE2_TX1_M | | A26 | UFS1_TX0_P | B26 | GPIO_63_QUP11_L3 | C26 | GND | D26 | PCIE2_TX1_P | | A27 | GND | B27 | GND | C27 | GND | D27 | GND | | A28 | UFS1_RX0_M | B28 | SPMI_CLK | C28 | VPH_PWR_3P8V | D28 | GND | | A29 | UFS1_RX0_P | B29 | SPMI_DATA | C29 | VPH_PWR_3P8V | D29 | VREG_S4A_1P8 | | A30 (30) | GND | B30 (60) | GND | C30 (90) | VPH_PWR_3P8V | D30 (120) | VREG_S4A_1P8 |
### Camera Group J6, J7, and J8 Pin-outs #### General Pin-out Generic camera group pinout, please work with ModalAI for any mating designs to gauranteee proper operation | Pin# | Signal | |------|---------------------| | 1 | GND | | 2 | GND | | 3 | Lower CCI_I2C_SDA | | 4 | DVDD 1.2V | | 5 | Lower CCI_I2C_SCL | | 6 | DOVDD 1.8V | | 7 | GND | | 8 | DVDD 1.05V | | 9 | Lower CSI_CLK_P | | 10 | Lower RST_N | | 11 | Lower CSI_CLK_M | | 12 | Lower MCLK | | 13 | Lower CSI_DAT0_P | | 14 | GND | | 15 | Lower CSI_DAT0_M | | 16 | Lower CCI Timer | | 17 | GND | | 18 | Upper CCI Timer | | 19 | Lower CSI_DATA1_P | | 20 | Upper MCLK | | 21 | Lower CSI_DATA1_M | | 22 | AVDD 2.8V | | 23 | Lower CSI_DATA2_P | | 24 | GND | | 25 | Lower CSI_DATA2_M | | 26 | Upper RST_N, Shared | | 27 | GND | | 28 | Upper CCI_I2C_SDA | | 29 | Lower CSI_DATA3_P | | 30 | Upper CCI_I2C_SCL | | 31 | Lower CSI_DATA3_M | | 32 | Spare MCLK/GPIO | | 33 | GND | | 34 | Group SPI MISO (groups 0/1) | | 35 | Upper CSI_CLK_P | | 36 | Group SPI MOSI (groups 0/1) | | 37 | Upper CSI_CLK_M | | 38 | Group SPI SCLK (groups 0/1) | | 39 | Upper CSI_DATA0_P | | 40 | Group SPI CS_N (groups 0/1) | | 41 | Upper CSI_DATA0_M | | 42 | VREG_S4A_1P8 | | 43 | GND | | 44 | GND | | 45 | Upper CSI_DATA1_P | | 46 | VPH_PWR 3.8V | | 47 | Upper CSI_DATA1_M | | 48 | VPH_PWR 3.8V | | 49 | Upper CSI_DATA2_P | | 50 | GND | | 51 | Upper CSI_DATA2_M | | 52 | 3.3V | | 53 | GND | | 54 | GND | | 55 | Upper CSI_DATA3_P | | 56 | 5V | | 57 | Upper CSI_DATA3_M | | 58 | 5V | | 59 | GND | | 60 | GND | #### J6 - Camera Group 0 Specific Pinout Configured for the following hardware: ``` +--> M0010 - M0054 J6 <--> M0076-1 interposer <--> M0010 <--| +--> M0010 ``` More camera information [here](/voxl2-camera-configs/) Connector: `DF40C-60DP-0.4V(51)` Device Tree: - `qcom,cam-sensor0` - `qcom,cam-sensor1` ##### J6 Pin-out | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | GND | | | 2 | GND | | | 3 | CCI_I2C0_SDA | CAM0_CCI0_SDA, gpio101 | | 4 | VREG_PM8009_L2_1P2 | DVDD 1.2V | | 5 | CCI_I2C0_SCL | CAM0_CCI0_SCL, gpio102 | | 6 | VREG_PM8009_L7_1P8 | CAM0_VIO_1P8, CAM0_VIO_1P8 | | 7 | GND | | | 8 | VREG_PM8009_L1_1P05 | CAM0_VDD_1P05, NOTE: current this is ~1.13VDC | | 9 | CSI0_CLK_CON_P | | | 10 | GPIO_93_CAM0_RST_N | CAM0_RST_N, gpio93 | | 11 | CSI0_CLK_CON_N | | | 12 | GPIO_94_CAM_MCLK0_CON | CAM_MCLK0_CON, gpio94 | | 13 | CSI0_LANE0_CON_P | LEFT | | 14 | GND | | | 15 | CSI0_LANE0_CON_N | LEFT | | 16 | GPIO_110_CCI_TIMER1 | (unused in version 0) | | 17 | GND | | | 18 | GPIO_113_CCI_TIMER4 | CAM_FSYNC_1_OUT, CAM_FSYNC0_IN | | 19 | CSI0_LANE1_CON_P | RIGHT | | 20 | CAM_MCLK1_CON | CAM_MCLK1_CON, gpio95 | | 21 | CSI0_LANE1_CON_N | RIGHT | | 22 | VREG_PM8009_L5_2P8 | CAM0_AVDD_2P8, CAM1_AVDD_2P8 | | 23 | CSI0_LANE2_CON_P | | | 24 | GND | | | 25 | CSI0_LANE2_CON_N | | | 26 | GPIO_109_CAM3_RST_N | (shared, CAM3_RST_N) | | 27 | GND | | | 28 | CCI_I2C1_SDA | CAM1_CCI1_SDA, CAM4_CCI1_SDA | | 29 | CSI0_LANE3_CON_P | | | 30 | CCI_I2C1_SCL | CAM1_CCI1_SCL, CAM4_CCI1_SCL | | Pin # | Signal Name | Notes | | --- | --- | --- | | 31 | CSI0_LANE3_CON_N | | | 32 | MCLK6_G0_CON | (shared) CAM1_RST_N, gpio100, | | 33 | GND | | | 34 | GPIO_28_CAM0_SPI0_MISO| `/dev/spidev0.0` | | 35 | CSI1_CLK_CON_P | | | 36 | GPIO_29_CAM0_SPI0_MOSI| `/dev/spidev0.0` | | 37 | CSI1_CLK_CON_N | | | 38 | GPIO_30_CAM0_SPI0_CLK | `/dev/spidev0.0` | | 39 | CSI1_LANE0_CON_P | | | 40 | GPIO_31_CAM0_SPI0_CS | `/dev/spidev0.0` | | 41 | CSI1_LANE0_CON_N | | | 42 | VREG_S4A_1P8 | | | 43 | GND | | | 44 | GND | | | 45 | CSI1_LANE1_CON_P | | | 46 | VPH_PWR | | | 47 | CSI1_LANE1_CON_N | | | 48 | VPH_PWR | | | 49 | CSI1_LANE2_CON_P | | | 50 | GND | | | 51 | CSI1_LANE2_CON_N | | | 52 | VREG_3P3V_LOCAL | | | 53 | GND | | | 54 | GND | | | 55 | CSI1_LANE3_CON_P | | | 56 | VDC_5V_LOCAL | | | 57 | CSI1_LANE3_CON_N | | | 58 | VDC_5V_LOCAL | | | 59 | GND | | | 60 | GND | |
#### J7 - Camera Group 1 Specific Pinout Configured for the following hardware: ``` +--> M0014 (M0084-JL - lower) - M0054 J7 <--> M0084 flex <----| +--> M0025-2 (M0084-JU - upper) ``` Connector: `DF40C-60DP-0.4V(51)` Device Tree: - `qcom,cam-sensor2` - `qcom,cam-sensor3` ##### J7 Pin-out | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | GND | | | 2 | GND | | | 3 | CCI_I2C2_SDA | CAM2_CCI2_SDA, gpio105 | | 4 | VREG_PM8009_L2_1P2 | (M0084, R1 not stuffed, not routed) | | 5 | CCI_I2C2_SCL | CAM2_CCI2_SCL, gpio106 | | 6 | VREG_PM8009_L7_1P8 | CAM2_DOVDD_1P8, CAM3_DOVDD_1P8 | | 7 | GND | | | 8 | VREG_PM8009_L1_1P05 | (M0084, R2 stuffed) CAM2_VDD_1P05,CAM3_VDD_1P05 (NOTE: current this is ~1.13VDC) | | 9 | CSI2_CLK_CON_P | | | 10 | GPIO_92_CAM1_RST_N | RST_LOWER_N, gpio92 | | 11 | CSI2_CLK_CON_N | | | 12 | GPIO_96_CAM_MCLK2 | MCLK_LOW, gpio96 | | 13 | CSI2_LANE0_CON_P | | | 14 | GND | | | 15 | CSI2_LANE0_CON_N | | | 16 | GPIO_111_CCI_TIMER2 | CCI_TIMER_LOWER | | 17 | GND | | | 18 | GPIO_114_CCI_ASYNC_IN | CCI_TIMER_UPPER (**Do Not Use on M0054 Voxl2**, there is a HW limitation impacting this pin. It will be fixed on future HW. Voxl2 Mini is not impacted by this issue.) | | 19 | CSI2_LANE1_CON_P | | | 20 | GPIO97_CAM_MCLK3_CON | MCLK_UPPER, gpio97 | | 21 | CSI2_LANE1_CON_N | | | 22 | VREG_PM8009_L6_2P8 | AVDD_2P8, CAM2_DOVDD_2P8, CAM3_DOVDD_2P8 | | 23 | CSI2_LANE2_CON_P | | | 24 | GND | | | 25 | CSI2_LANE2_CON_N | | | 26 | GPIO_109_CAM3_RST_N | (shared, RST_UPPER_SHARED_N) | | 27 | GND | | | 28 | CCI_I2C3_SDA | CAM3_CCI3_SDA, CAM5_CCI3_SDA, gpio107 | | 29 | CSI2_LANE3_CON_P | | | 30 | CCI_I2C3_SCL | CAM3_CCI3_SCL, CAM5_CCI3_SCL, gpio108 | | Pin # | Signal Name | Notes | | --- | --- | --- | | 31 | CSI2_LANE3_CON_N | | | 32 | MCLK6_G1_CON | (shared) GPIO_MCLK6_SHARED, gpio100 | | 33 | GND | | | 34 | GPIO_4_CAM1_SPI1_MISO | GPIO_4, `/dev/spidev1.0` can be enabled in DT, see this [commit](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/commit/6635ada0543008fef310fa5bcfb8a1eee95494df) to see how to re-enable if needed.| | 35 | CSI3_CLK_CON_P | | | 36 | GPIO_5_CAM1_SPI1_MOSI | GPIO_5, `/dev/spidev1.0` can be enabled in DT see this [commit](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/commit/6635ada0543008fef310fa5bcfb8a1eee95494df) to see how to re-enable if needed.| | 37 | CSI3_CLK_CON_N | | | 38 | GPIO_6_CAM1_SPI1_CLK | GPIO_6, `/dev/spidev1.0` can be enabled in DT see this [commit](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/commit/6635ada0543008fef310fa5bcfb8a1eee95494df) to see how to re-enable if needed.| | 39 | CSI3_LANE0_CON_P | | | 40 | GPIO_7_CAM1_SPI1_CS | GPIO_7, `/dev/spidev1.0` can be enabled in DT see this [commit](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/commit/6635ada0543008fef310fa5bcfb8a1eee95494df) to see how to re-enable if needed.| | 41 | CSI3_LANE0_CON_N | | | 42 | VREG_S4A_1P8 | | | 43 | GND | | | 44 | GND | | | 45 | CSI3_LANE1_CON_P | | | 46 | VPH_PWR | | | 47 | CSI3_LANE1_CON_N | | | 48 | VPH_PWR | | | 49 | CSI3_LANE2_CON_P | | | 50 | GND | | | 51 | CSI3_LANE2_CON_N | | | 52 | VREG_3P3V_LOCAL | | | 53 | GND | | | 54 | GND | | | 55 | CSI3_LANE3_CON_P | | | 56 | VDC_5V_LOCAL | | | 57 | CSI3_LANE3_CON_N | | | 58 | VDC_5V_LOCAL | | | 59 | GND | | | 60 | GND | |
#### J8 - Camera Group 2 Specific Pinout Configured for the following hardware: ``` +--> M0010 - M0054 J8 <--> M0076-1 interposer <--> M0010 <--| +--> M0010 ``` More camera information [here](/voxl2-camera-configs/) Connector: `DF40C-60DP-0.4V(51)` Device Tree: - `qcom,cam-sensor4` - `qcom,cam-sensor5` ##### J8 Pin-out | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | GND | | | 2 | GND | | | 3 | CCI_I2C1_SDA | CAM1_CCI1_SDA, CAM4_CCI1_SDA, gpio103 | | 4 | VREG_PM8009_L2_1P2 | DVDD 1.2V | | 5 | CCI_I2C1_SCL | CAM1_CCI1_SCL, CAM4_CCI1_SCL gpio104 | | 6 | VREG_PM8009_L7_1P8 | CAM0_VIO_1P8, CAM0_VIO_1P8 | | 7 | GND | | | 8 | VREG_PM8009_L1_1P05 | CAM0_VDD_1P05, NOTE: current this is ~1.13VDC | | 9 | CSI4_CLK_CON_P | | | 10 | GPIO_78_CAM4_RST_N | CAM4_RST_N, gpio78 | | 11 | CSI4_CLK_CON_N | | | 12 | GPIO_98_CAM_MCLK4 | CAM_MCLK4_CON, gpio98 | | 13 | CSI4_LANE0_CON_P | LEFT | | 14 | GND | | | 15 | CSI4_LANE0_CON_N | LEFT | | 16 | GPIO_112_CCI_TIMER3 | (unused in version 0) | | 17 | GND | | | 18 | GPIO_111_CCI_TIMER2 | CAM_FSYNC_5_OUT, CAM_FSYNC4_IN | | 19 | CSI4_LANE1_CON_P | RIGHT | | 20 | CAM_MCLK5_CON | CAM_MCLK5_CON, gpio99 | | 21 | CSI4_LANE1_CON_N | RIGHT | | 22 | VREG_PM8009_L6_2P8 | CAM4_AVDD_2P8, CAM5_AVDD_2P8 | | 23 | CSI4_LANE2_CON_P | | | 24 | GND | | | 25 | CSI4_LANE2_CON_N | | | 26 | GPIO_109_CAM3_RST_N | (shared, CAM3_RST_N) | | 27 | GND | | | 28 | CCI_I2C3_SDA | CAM5_CCI3_SDA, CAM3_CCI3_SDA, gpio107 | | 29 | CSI4_LANE3_CON_P | | | 30 | CCI_I2C3_SCL | CAM5_CCI3_SCL, CAM3_CCI3_SCL, gpio108 | | Pin # | Signal Name | Notes | | --- | --- | --- | | 31 | CSI4_LANE3_CON_N | | | 32 | MCLK6_G2_CON | (shared) GPIO_MCLK6_SHARED, gpio100 | | 33 | GND | | | 34 | GPIO_12_CAM2 | Not used as RTS, not available as GPIO | | 35 | CSI5_CLK_CON_P | | | 36 | GPIO_13_CAM2 | Not used as CTS, not available as GPIO | | 37 | CSI5_CLK_CON_N | | | 38 | GPIO_14_CAM2_UART5_TX | `/dev/ttyHS0` | | 39 | CSI5_LANE0_CON_P | | | 40 | GPIO_15_CAM2_UART5_RX | `/dev/ttyHS0` | | 41 | CSI5_LANE0_CON_N | | | 42 | VREG_S4A_1P8 | | | 43 | GND | | | 44 | GND | | | 45 | CSI5_LANE1_CON_P | | | 46 | VPH_PWR | | | 47 | CSI5_LANE1_CON_N | | | 48 | VPH_PWR | | | 49 | CSI5_LANE2_CON_P | | | 50 | GND | | | 51 | CSI5_LANE2_CON_N | | | 52 | VREG_3P3V_LOCAL | | | 53 | GND | | | 54 | GND | | | 55 | CSI5_LANE3_CON_P | | | 56 | VDC_5V_LOCAL | | | 57 | CSI5_LANE3_CON_N | | | 58 | VDC_5V_LOCAL | | | 59 | GND | | | 60 | GND | |
### J10 - External SPI #### Overview Available from apps proc as `/dev/spidev14.0`. J10 Achieved feature parity with VOXL 2 Mini when the design was updated from M0054 -> M0154. It is capable of either UART or SPI based on GPIO_67 control, but fixed in the Kernel for that build (not dynamic) #### J10 Pin-out, SPI Mode (Fixed), M0054 | Pin# | Signal | Notes/Usage | |------|-------------------------------|------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | MISO (Input) | APPS_QUP_14, 3.3V signal levels | | 3 | MOSI (Output) | APPS_QUP_14, 3.3V signal levels | | 4 | SCLK (Output) | APPS_QUP_14, 3.3V signal levels | | 5 | CS0_N (Output) | APPS_QUP_14, 3.3V signal levels | | 6 | CS1_N/GPIO_46 (Output) | Second SPI CS_N or GPIO | | 7 | 32K_CLK_OUT (Output) | 32kHz PMIC Sleep CLK, 3.3V signal levels | | 8 | GND | GND | #### J10 Pin-out, SPI Mode (GPIO_67 = HIGH), M0154 | Pin# | Signal | Notes/Usage | |------|-------------------------------|----------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | MISO (Input) | APPS_QUP_14, 3.3V signal levels | | 3 | MOSI (Output) | APPS_QUP_14, 3.3V signal levels | | 4 | SCLK (Output) | APPS_QUP_14, 3.3V signal levels | | 5 | CS0_N (Output) | APPS_QUP_14, 3.3V signal levels | | 6 | CS1_N/GPIO_46 (Output) | Second SPI CS_N or GPO | | 7 | GPIO_64_INT (Input) | GPIO_64 as input for INT, 3.3V signal levels | | 8 | GND | GND | #### J10 Pin-out, UART Mode (GPIO_67 = LOW), M0154 | Pin# | Signal | Notes/Usage | |------|-------------------------------|----------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | GPIO_40 (Input) | GPIO_40 Input, 3.3V signal levels | | 3 | GPIO_41 (Output) | GPIO_41 Output, 3.3V signal levels | | 4 | UART_14_TX (Output) | APPS_QUP_14, 3.3V signal levels | | 5 | UART_14_RX (Input) | APPS_QUP_14, 3.3V signal levels | | 6 | GPIO_46 (Input) | GPIO_46 as input, 3.3V signal levels | | 7 | GPIO_64_INT (Input) | GPIO_64 as input for INT, 3.3V signal levels | | 8 | GND | GND |
### J18 UART (ESC) #### J18 ESC UART | Pin# | Signal | Notes/Usage | |------|----------------------|-------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | ESC_UART_TX (Output) | slpi_proc, SSC_QUP_2, 3.3V signal levels. | | 3 | ESC_UART_RX (Input) | slpi_proc, SSC_QUP_2, 3.3V signal levels. | | 4 | GND | GND | #### SW Summary Available from DSP as `QUP2`. In the factory configuration, PX4 communicates to the VOXL ESC through this UART.
### J19 - External Sensors (2x UART/ 2x I2C) #### J19 Pin-out | Pin # | Signal Name | Notes | |-------|---------------------|-----------------------------------------| | 1 | VDC_5V_LOCAL | GNSS/Mag power * | | 2 | GNSS TX 3P3V | slpi_proc, SSC_QUP6 | | 3 | GNSS RX 3P3V | slpi_proc, SSC_QUP6 | | 4 | MAG SCL 3P3V | slpi_proc, SSC_QUP0 | | 5 | MAG SDA 3P3V | slpi_proc, SSC_QUP0 | | 6 | GND | | | 7 | I2C3 SDA 3P3V | slpi_proc, SSC_QUP3 | | 8 | I2C3 SCL 3P3V | slpi_proc, SSC_QUP3 | | 9 | VREG_3P3V_RC | RC power *, controllable via GPIO 159 | | 10 | RC_UART_TX (Output) | slpi_proc, SSC_QUP7, 3.3V signal levels | | 11 | RC_UART_RX (Input) | slpi_proc, SSC_QUP7, 3.3V signal levels | | 12 | GND | | #### SW Summary All connected to the DSP, and in the factory configuration are used as follows: - `QUP0` - I2C for external magnetomter - `QUP3` - future use - `QUP6` - UART for external GNSS (GPS) - `QUP7` - UART for external RC input
### I2C Important Note * All I2C ports on the JST Board-to-Cable connectors (J19 on VOXL 2 and VOXL 2 Mini plus ModalAI Plug-in Boards such as M00130 & M0090) use a TCA9517 to translate and buffer the I2C from the Snapdragon SOC 1.8V to 3.3V logic levels. * The expectation is that these ports go directly to an accesory target device without further translation back down to lower voltages. For example; a micro-controller running at 3.3V native I/O levels. The TCA9517 cannot operate "B-port to B-port" and therefore if your system requires translating back down to lower voltages, such as 1.8V or 2.5V, a special un-buffered I2C translater will be required such as the PCA9306 or PCA9509. ### Power Input/Output Important Note * All power outputs on cable connectors are rated for 1A, however, the system cannot provide 1A simultaneously on all connectors. Contact ModalAI for design assistance. * The difference between VDCIN_5V and VDC_5V_LOCAL is very important. The power module provides VDCIN_5V (raw voltage input) to the platform. On-board is an eFuse that protects the system from accidental wrong-voltage application, droops/brown-outs, or down-stream shorts or overloads. The output of the eFuse is VDC_5V_LOCAL (i.e.: protected output). * Refer to the [Expansion Hardware Design Guide](/expansion-design-guide/) for more detailed explanations. --- Source: https://docs.modalai.com/voxl2-mechanical-drawings/ # VOXL 2 Mechanical Drawings --- # Mechanical Drawings ## 2D Drawings ### VOXL 2 IMU Locations ![voxl2-imu-locations](/images/voxl2/m0054_voxl2_imu_locations_with_axis.png) ### Dimensions #### Front ![voxl2-2D-front](/images/voxl2/M0054-2D-front-dimensions.png) #### Back ![voxl2-2D-back](/images/voxl2/M0054-2D-back-dimensions.png) ## 3D Drawings [3D STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/M0054_VOXL2_PVT_SIP_REVA.step) --- Source: https://docs.modalai.com/voxl2-camera-configs/ # VOXL 2 Camera Configurations --- ## Overview VOXL 2 has 3 camera groups (shown below), where each group has: - QTY-2 full 4 lane MIPI CSI ports - CCI and camera control signals - 8 power rails (from 1.05V up to 5V) for cameras and other sensors - Dedicated I/O bus (one of UART, SPI, i2c hard-coded depending on group) ![m0054-image-sensors-groups](/images/voxl2/m0054-iamge-sensor-groups-v2.png) ## Available Configurations The camera configurations are purpose built via a combination of hardware and software to support more flexible options. Each configuration needs to be developed as its own effort, and then supported as a part of the [system image](/voxl2-system-image/) and [voxl-camera-server](/voxl-camera-server/). The software needs to be configured using [voxl-configure-cameras](/voxl-camera-server/), and the image sensors must be connected to the port that matches the configurations documented on this page. The configurations are not mix and match. One may have luck with different combinations, but that does not mean it will work in the future. ### SDK 1.0 - SDK 1.0.0 - System Image 1.6.2 Please see a new [voxl2-image-sensors](/voxl2-image-sensors/) page if you are on SDK 1.0+ and looking for additional setup information. #### 1.6.2 Supported Sensor Hardware IDs | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:-------------------------|:------------|:--------------| | 0 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 0 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 0 | PMD TOF [M0040](/M0040/) | ToF | M0040 + M0076 | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:-------------------------|:------------|:--------------| | 1 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 1 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 1 | PMD TOF [M0040](/M0040/) | ToF | M0040 + M0076 | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:----------------| | 2 | OV7251 [M0014](/M0014/) | Tracking | M0076, M0084 JL | | 2 | ov9782 | Tracking | M0076, M0084 JL | | 2 | PMD TOF [M0040](/M0040/) | Depth | M0076, M0084 JL | | 2 | IMX678 [M0061-2](/M0061/) | Hi-res | M0076, M0084 JL | | 2 | IMX412 [M0107](/M0107/) | Hi-res | M0076, M0084 JL | | 2 | IMX214 [M0025-2](/M0025/) | Hi-res | M0076, M0084 JL | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:-----------| | 3 | IMX678 [M0061-2](/M0061/) | Hi-res | M0084 JU | | 3 | IMX412 [M0107](/M0107/) | Hi-res | M0084 JU | | 3 | IMX214 [M0025-2](/M0025/) | Hi-res | M0084 JU | | 3 | PMD TOF [M0040](/M0040/) | ToF | M0084 JU | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:----------------| | 4 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 4 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 4 | PMD TOF [M0040](/M0040/) | ToF | M0040 + M0076 | | 4 | IMX678 [M0061-2](/M0061/) | Hi-res | M0076, M0084 JL | | 4 | IMX412 [M0107](/M0107/) | Hi-res | M0076, M0084 JL | | 4 | IMX214 [M0025-2](/M0025/) | Hi-res | M0076, M0084 JL | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:--------------------------|:-------------------------|:----------------| | 5 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 5 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 5 | PMD TOF [M0040](/M0040/) | ToF | NA | | 5 | IMX678 [M0061-2](/M0061/) | Hi-res(alt address 0x20) | M0076, M0084 JL | #### 1.6.2 Supported Sensor Settings | Sensor | Sensor Type | Resolution @ FPS | |:------------------------------|:--------------------|:---------------------------------------------------------------------------------------------------------| | IMX678 [M0061-2](/M0061/) | Hi-res | 3840x2160 @ 30
1920x1080 @ 30 | | IMX412 [M0107](/M0107/) | Hi-res | 1920x1080 @ 30 | | IMX214 [M0025-2](/M0025/) | Hi-res | 4096 x 2160 @ 30
3840x2160 @ 30
2048x1536 @ 30
1920 x 1080 @ 30
1280 x 720 @ 30
1024 x 768 @ 30
640 x 480 @ 30 | | PMD TOF [M0040](/M0040/) | ToF | 224 x 1557 @ 5
224x172 @ 5 | | OV7251 [M0014](/M0014/) | Tracking Config | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Left | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Right | 640x480 @ 30 | | ov9782 | Tracking Config | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Left | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Right | 1280x800 @ 30 | ## Quickstart Video The following video demonstrates setting up the image sensors for the "C11" VOXL 2 development kit: ## Image Sensor Configurations - SDK 1.0 Please see a new [voxl2-image-sensors](/voxl2-image-sensors/) page if you are on SDK 1.0+ and looking for additional setup information. ### C-01: Front Stereo and Tracking ![M0054-tracking-stereo](/images/voxl2/M0054-tracking-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) | Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) | Fsync out0 | Front stereo | | 2 (J7L) | OV7251 [M0014](/M0014/) | | Tracking | ### C-02: Tracking Only ![M0054-tracking](/images/voxl2/M0054-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 2 (J7L) | OV7251 [M0014](/M0014/)| | Tracking | ### C-03: Front Stereo, Hires, and Tracking ![M0054-imx214-tracking-stereo](/images/voxl2/M0054-imx214-tracking-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/)|Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/)|Fsync out0 | Front stereo | | 2 (J7L) | OV7251 [M0014](/M0014/)| | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | ### C-04: Hires and Tracking ![M0054-imx214-tracking](/images/voxl2/M0054-imx214-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 2 (J7L) | OV7251 [M0014](/M0014/) | | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | ### C-05: ToF and Tracking ![M0054-pmdtof-tracking](/images/voxl2/M0054-pmdtof-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/) | | ToF | | 2 (J7L) | OV7251 [M0014](/M0014/) | | Tracking | ### C-06: ToF, Hires, and Tracking (D0005 Starling) ![M0054-pmdtof-imx214-tracking](/images/voxl2/M0054-pmdtof-imx214-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/) | | ToF | | 2 (J7L) | imx214, imx412 | | Hi-res | | 3 (J7U) | OV7251 [M0014](/M0014/) | | Tracking | ### C-08: Hires Only ![M0054-imx214](/images/voxl2/M0054-imx214.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 3 (J7U) | imx214, imx412 | | Hi-res | ### C-09: ToF Only ![M0054-pmdtof](/images/voxl2/M0054-pmdtof.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/)| | ToF | ### C-10: Front Stereo Only (ov7251) ![M0054-stereo](/images/voxl2/M0054-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) |Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) |Fsync out0| Front stereo | ### C-11: Front Stereo, Rear Stereo, Hires, and Tracking (D0006 Sentinel) ![M0054-D0006-sentinel](/images/voxl2/M0054-D0006-sentinel.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) |Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) |Fsync out0| Front stereo | | 2 (J7L) | OV7251 [M0014](/M0014/) | | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | | 4 (J8L) | OV7251 [M0015](/M0015/) |Fsync in1 | Rear Stereo | | 5 (J8L) | OV7251 [M0015](/M0015/) |Fsync out1| Rear Stereo | ### C-12: Front Stereo Only (ov9782) ![M0054-ov9782-stereo](/images/voxl2/M0054-ov9782-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV9782, M0113 | Fsync in0 | Front stereo | | 1 (J6L) | OV9782, M0113 | Fsync out0 | Front stereo | ### C-13: Front Stereo (ov9782) and Hires ![M0054-imx412-ov9782-stereo](/images/voxl2/M0054-imx214-ov9782-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV9782, M0113 | Fsync in0 | Front stereo | | 1 (J6L) | OV9782, M0113 | Fsync out0 | Front stereo | | 3 (J7U) | imx214, imx412 | | Hi-res | ### C-14: ToF, Hires, and Tracking ![M0054-pmdtof-imx214-tracking](/images/voxl2/M0054-pmdtof-imx214-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/)| | ToF | | 2 (J7L) | imx214, imx412 | | Hi-res | | 3 (J7U) | OV7251 [M0014](/M0014/) | | Tracking | ### C-15: Stereo flip (ov9782) ![M0054-ov9782-stereo](/images/voxl2/M0054-ov9782-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV9782, M0113 | | Stereo | | 1 (J6L) | OV9782, M0113 | | Stereo | ### C-16: ToF, Hires, and 2 Trackings ![M0054-imx214-tracking-pmdtof](/images/voxl2/M0054-imx214-tracking-pmdtof.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/)| | ToF | | 2 (J7L) | imx214, imx412 | | Hi-res | | 3 (J7U) | OV7251 [M0014](/M0014/) | | Tracking | | 3 (J8L) | OV7251 [M0014](/M0014/) | | Tracking 2 | ### C-17: ToF, Tracking, Stereo(0v9782), and Hires(imx412) ![M0054-pmdtof-imx412,tracking-tracking2](/images/voxl2/M0054-pmdtof-imx412-tracking-tracking2.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD ToF [M0040](/M0040/)| | ToF | | 2 (J7L) | imx412 [M0061](/M0061/) | | Hi-res | | 3 (J7U) | OV7251 [M0014](/M0014/) | | Tracking | | 4 (J8L) | OV9782, M0113 | | Stereo | | 5 (J8L) | OV9782, M0113 | | Stereo | ## Current Limitations - As a means to allow coexistence of OV7251 sensors on `CCI3`, we are not resetting sensors when they normally should per Qualcomm, to prevent the sensors losing a runtime address swap. This modification is in the kernel, dmesg shows `MODALAI HACK` where it's happening. - Sensor ID 1 and Sensor ID 5 share a reset line (gpio100), no specific known defects but an area to watch out. - Sensor indices assume all six sensors are in place and will shift when not fully populated. - All camera AVDD rails in this configuration are left on always (2P8VDC) as they're shared ![m0054-camera](/images/voxl2/m0054-camera-config-v0.png) ## Legacy configurations (Platform Release 0.9.5) > The configurations in this section apply to pre-SDK-1.0 images (Platform Release 0.9 and 0.9.5). They are kept for reference only. Use the SDK 1.0+ configurations above for current images. ### Platform Release 0.9.5 - SDK 0.9.5 - System Image 1.5.5 #### Changes - Added IMX678 support 1920x1080@30, 3840x2160@30 - Enabled more sensor options (see table below) #### 1.5.5 Supported Sensor Hardware IDs | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:-------------------------|:------------|:--------------| | 0 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 0 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 0 | PMD TOF [M0040](/M0040/) | ToF | M0040 + M0076 | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:-------------------------|:------------|:--------------| | 1 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 1 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 1 | PMD TOF [M0040](/M0040/) | ToF | NA | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:--------------| | 2 | OV7251 [M0014](/M0014/) | Tracking | M0076, M0084 JL | | 2 | ov9782 | Tracking | M0076, M0084 JL | | 2 | PMD TOF [M0040](/M0040/) | Depth | M0076, M0084 JL | | 2 | IMX678 [M0061-2](/M0061/) | Hi-res | M0076, M0084 JL | | 2 | IMX412 [M0107](/M0107/) | Hi-res | M0076, M0084 JL | | 2 | IMX214 [M0025-2](/M0025/) | Hi-res | M0076, M0084 JL | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:--------------| | 3 | IMX678 [M0061-2](/M0061/) | Hi-res | M0084 JU | | 3 | IMX412 [M0107](/M0107/) | Hi-res | M0084 JU | | 3 | IMX214 [M0025-2](/M0025/) | Hi-res | M0084 JU | | 3 | PMD TOF [M0040](/M0040/) | ToF | M0084 JU | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:------------------------------|:------------|:----------------| | 4 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 4 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 4 | PMD TOF [M0040](/M0040/) | ToF | M0040 + M0076 | | 4 | IMX678 [M0061-2](/M0061/) | Hi-res | M0076, M0084 JL | | 4 | IMX412 [M0107](/M0107/) | Hi-res | M0076, M0084 JL | | 4 | IMX214 [M0025-2](/M0025/) | Hi-res | M0076, M0084 JL | | HW Sensor ID | Sensor Type | Description | Interposer | |:-------------|:--------------------------|:-------------------------|:----------------| | 5 | OV7251 [M0015](/M0015/) | Stereo | M0010 + M0076 | | 5 | OV9782 [M0113](/M0113/) | Stereo | M0010 + M0076 | | 5 | PMD TOF [M0040](/M0040/) | ToF | NA | | 5 | IMX678 [M0061-2](/M0061/) | Hi-res(alt address 0x20) | M0076, M0084 JL | #### 1.5.5 Supported Sensor Settings Some sensors may list additional capabilities when probed from software. Below are what we've tested against, other settings may have unexpected results. | Sensor | Sensor Type | Resolution @ FPS | |:-------------------------------|:---------------------|:---------------------------------------------------------------------------------------------------------| | IMX678 [M0061-2](/M0061/) | Hi-res | 3840x2160 @ 30
1920x1080 @ 30 | | IMX412/577 [M0107](/M0107/) | Hi-res | 1920x1080 @ 30 | | IMX214 [M0025-2](/M0025/) | Hi-res | 4096 x 2160 @ 30
3840x2160 @ 30
2048x1536 @ 30
1920 x 1080 @ 30
1280 x 720 @ 30
1024 x 768 @ 30
640 x 480 @ 30 | | PMD TOF [M0040](/M0040/) | ToF | 224 x 1557 @ 5 | | OV7251 [M0014](/M0014/) | Tracking Config | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Left | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Right | 640x480 @ 30 | | ov9782 | Tracking Config | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Left | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Right | 1280x800 @ 30 | ### Platform Release 0.9 - SDK 0.9 - System Image 1.4.1 #### 1.4.1 Supported Sensor Hardware IDs | HW Sensor ID | Sensor Type | Description | |:--------------|:-------------------------|:-------------| | 0 | OV7251 [M0015](/M0015/) | Stereo | | 0 | OV9782 [M0113](/M0113/) | Stereo | | 0 | PMD TOF [M0040](/M0040/)| ToF | | HW Sensor ID | Sensor Type | Description | |:--------------|:--------------------------|:-------------| | 1 | OV7251 [M0015](/M0015/) | Stereo | | 1 | OV9782 [M0113](/M0113/) | Stereo | | 1 | PMD TOF [M0040](/M0040/) | ToF | | HW Sensor ID | Sensor Type | Description | |:--------------|:--------------------------|:-------------| | 2 | OV7251 [M0014](/M0014/) | Tracking | | 2 | ov9782 | Stereo | | 2 | PMD TOF [M0040](/M0040/) | ToF | | HW Sensor ID | Sensor Type | Description | |:--------------|:-------------------------------|:-------------| | 3 | IMX214 [M0025-2](/M0025/) | Hi-res | | 3 | IMX412 [M0107](/M0107/) | Hi-res | | 3 | PMD TOF [M0040](/M0040/) | ToF | | HW Sensor ID | Sensor Type | Description | |:--------------|:--------------------------|:-------------| | 4 | OV7251 [M0015](/M0015/) | CV,BW, | | 4 | OV9782 [M0113](/M0113/) | Stereo | | 4 | PMD TOF [M0040](/M0040/) | ToF | | HW Sensor ID | Sensor Type | Description | |:--------------|:--------------------------|:-------------| | 5 | OV7251 [M0015](/M0015/) | Stereo | | 5 | OV9782 [M0113](/M0113/) | Stereo | | 5 | PMD TOF [M0040](/M0040/) | ToF | #### 1.4.1 Supported Sensor Settings | Sensor | Sensor Type | Resolution @ FPS | |:-------------------------------|:---------------------|:---------------------------------------------------------------------------------------------------------| | IMX214 [M0025-2](/M0025/) | Hi-res | 4096 x 2160 @ 30
3840x2160 @ 30
2048x1536 @ 30
1920 x 1080 @ 30
1280 x 720 @ 30
1024 x 768 @ 30
640 x 480 @ 30 | | IMX412/577 [M0107](/M0107/) | Hi-resConfig | 1920x1080 @ 30 | | PMD TOF [M0040](/M0040/) | ToF | 224 x 1557 @ 5 | | OV7251 [M0014](/M0014/) | Tracking Config | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Left | 640x480 @ 30 | | OV7251 [M0015](/M0015/) | Stereo Config Right | 640x480 @ 30 | | ov9782 | Tracking Config | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Left | 1280x800 @ 30 | | OV9782 [M0113](/M0113/) | Stereo Config Right | 1280x800 @ 30 | ### Image Sensor Configurations - SDK 0.9.5 #### C3 - Front Stereo, Hires, and Tracking ![m0054-front-stereo-hires-tracking](/images/voxl2/m0054-front-stereo-hires-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) |Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) |Fsync out0| Front stereo | | 2 (J7L) | ov7251 | | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | #### C4 - Tracking and Hires Only ![m0054-hires-tracking](/images/voxl2/m0054-hires-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 2 (J7L) | ov7251 | | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | #### C6 - Hires + ToF + Tracking Available starting with [Platform Release 0.9, sys img 1.4.1](/voxl2-system-image/). **HW Setup** ![M0054-pmdtof-imx214-tracking](/images/voxl2/M0054-pmdtof-imx214-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | PMD TOF [M0040](/M0040/) | | Depth 0 | | 2 (J7L) | imx214, imx412 | | Hi-res | | 3 (J7U) | ov7251 | | Tracking | #### C10 - Front Stereo Only ![m0054-front-stereo](/images/voxl2/m0054-front-stereo.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) |Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) |Fsync out0| Front stereo | #### C11 - Front Stereo, Rear Stereo, Hires, and Tracking ![m0054-dual-stereo-hires-tracking](/images/voxl2/m0054-dual-stereo-hires-tracking.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 (J6L) | OV7251 [M0015](/M0015/) | Fsync in0 | Front stereo | | 1 (J6L) | OV7251 [M0015](/M0015/) | Fsync out0 | Front stereo | | 2 (J7L) | ov7251 | | Tracking | | 3 (J7U) | imx214, imx412 | | Hi-res | | 4 (J8L) | OV7251 [M0015](/M0015/) | Fsync in1 | Rear stereo | | 5 (J8L) | OV7251 [M0015](/M0015/) | Fsync out1 | Rear stereo | #### C8 - Hires Only Available starting with [Platform Release 0.9.5, sys img 1.5.3](/voxl2-system-image/). [M0061-2](/M0061/) based IMX678, on M0054 J8 (no other camera location for IMX678 is supported in 1.5.3, must be J8). Shown here, the [M0076](/m0076/) interposer plugs into M0054 J8. The [M0074](/M0074/) flex then connects to the [M0061-2](/m0062/) backpack for the IMX678 module. ![m0054-imx678-m0061-2](/images/voxl2/m0054-imx678-m0061-2.JPG) [M0025-2](/M0025/) based IMX214, on M0054 J8. ![m0054-imx214-m0025-2](/images/voxl2/m0054-imx214-m0025-2.JPG) **SW Setup** ```bash voxl2:/$ voxl-configure-cameras 8 ``` #### C9 - Time of Flight (ToF) Only Available starting with [Platform Release 0.9, sys img 1.4.1](/voxl2-system-image/). **HW Setup** ![m0054-single-tof-m0076](/images/voxl2/m0054-single-tof-m0076.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 | PMD TOF [M0040](/M0040/) | | Depth 0 | **SW Setup** ```bash voxl2:/$ voxl-configure-cameras 9 ``` #### CX - Two Time of Flights (ToF) Available starting with [Platform Release 0.9, sys img 1.4.1](/voxl2-system-image/). **HW Setup** Using the [M0076-1](https://www.modalai.com/products/mdk-m0076-1) interposers on `J6` and `J8` as examples: ![m0054-dual-tof-m0076](/images/voxl2/m0054-dual-tof-m0076.jpg) Using the [M0084-1](https://www.modalai.com/products/msu-m0084) dual camera adapter ("y-flex") on `J8` as example: ![m0054-dual-tof-m0084](/images/voxl2/m0054-dual-tof-m0084.jpg) | Sensor ID | Sensor Type | Notes | Usage | | --- | --- | --- |--- | | 0 | PMD TOF [M0040](/M0040/) | | Depth 0 | | 1 | PMD TOF [M0040](/M0040/) | | Depth 1 | **SW Setup** NA --- Source: https://docs.modalai.com/voxl2-onboard-sensors/ # VOXL 2 Onboard Sensors --- ## IMUs Note the XYZ axis as drawn respresent the IMU data as reported by the voxl-imu-server MPA service, not the physical orientation of the IMU on the PCB. This aligns with the FRD reference frame when mounted on a drone in the typical orientation such as on the Sentinel reference drone. ![voxl2-imu-locations](/images/voxl2/m0054_voxl2_imu_locations_with_axis.png) | Name / Designator | Description | Interface | MPA Pipe | |--- |--- |--- |--- | | PX4 IMU / IMU0 / U16 | TDK ICM42688p | SSC_QUP5, SPI, SLPI (sDSP) | /run/mpa/imu_px4 | | Apps Proc IMU / IMU1 / U17 | TDK ICM42688p | /dev/spidev3.0, SPI | /run/mpa/imu_apps | ## Barometers ![m0054-onboard-sensors-baro](/images/voxl2/m0054-onboard-sensors-baro.png) | Name / Designator | Description | Interface | |--- |--- |--- | | PX4 Baro 0 / BARO0 / U18 | BMP388 | SSC_QUP4, I2C, SLPI (sDSP), Addr: 0x76h | | PX4 Baro 0 / BARO1 / U19 | TDK ICP-10100 | SSC_QUP4, I2C, SLPI (sDSP), Addr: 0x63h | Related video: --- Source: https://docs.modalai.com/voxl2-offboard-sensors/ # VOXL 2 Offboard Sensors --- ## VOXL2 IO / RC Input [VOXL 2 IO](/voxl2-io/) provides the ability to extend VOXL 2 with PWM outputs and additional supported RC inputs and can connect here. ![m0054-offboard-sensors-rc](/images/voxl2/m0054-offboard-sensors-rc-2.jpg) **J19:** Full pinouts for all the connects are [available here](/voxl2-connectors/). | Pin # | Signal Name | Notes | |-------|-----------------|-------------------------------------| | 1 | | Not used for RC | | 2 | | Not used for RC | | 3 | | Not used for RC | | 4 | | Not used for RC | | 5 | | Not used for RC | | 6 | | Not used for RC | | 7 | | Not used for RC | | 8 | | Not used for RC | | 9 | VREG_3P3V_RC | RC power *, controllable via GPIO 159 | | 10 | RCIO_UART_TX (Output) | SSC_QUP7, 3.3V signal levels | | 11 | RCIO_UART_RX (Input) | SSC_QUP7, 3.3V signal levels | | 12 | GND | | ## GPS (GNSS/Mag) An external GPS (GNSS/Mag) can be connected to VOXL 2's J19 connector. ![m0054-offboard-sensors-gnss-mag](/images/voxl2/m0054-offboard-sensors-gnss-mag.png) | Name / Designator | Description | Interface | |--- |--- |--- | | GNSS UART / exposed via J19 | PX4 GNSS | SSC_QUP6, 2W UART, SLPI (sDSP) | | Mag I2C / exposed via J19 | PX4 Mag | SSC_QUP0, I2C, SLPI (sDSP) | **J19:** Full pinouts for all the connects are [available here](/voxl2-connectors/). | Pin # | Signal Name | Notes | |-------|-----------------|-------------------------------------| | 1 | VDC_5V_LOCAL | GNSS/Mag power * | | 2 | GNSS TX 3P3V | slpi_proc, SSC_QUP7 | | 3 | GNSS RX 3P3V | slpi_proc, SSC_QUP7 | | 4 | MAG SCL 3P3V | slpi_proc, SSC_QUP1 | | 5 | MAG SDA 3P3V | slpi_proc, SSC_QUP1 | | 6 | GND | | | 7 | | Not used for GNSS/Mag | | 8 | | Not used for GNSS/Mag | | 9 | | Not used for GNSS/Mag | | 10 | | Not used for GNSS/Mag | | 11 | | Not used for GNSS/Mag | | 12 | | Not used for GNSS/Mag | ## Power Monitoring ![m0054-offboard-sensors-pm](/images/voxl2/m0054-offboard-sensors-pm.png) Although not technically onboard VOXL 2, using the VOXL Power Module v3 provides the ability to monitor battery voltage and regulated 5VDC voltage from the power module. | Name / Designator | Description | Interface | Driver | |--- |--- |--- |--- | | PX4 Power Monitoring (J4) | QTY2 INA231 | SSC_QUP2, I2C, SLPI (sDSP), Addrs: 0x44h and 0x45h | [voxlpm](https://docs.px4.io/main/en/modules/modules_driver.html#voxlpm) | **J4:** Full pinouts for all the connects are [available here](/voxl2-connectors/). | Pin# | Signal | Notes/Usage | |------|----------|------------------------------------------------------| | 1 | VDCIN_5V | DC from Power Module, “unprotected” | | 2 | GND | Power Module Return | | 3 | I2C_CLK | SSC_QUP_1, 5V signal levels, Pullups on Power Module | | 4 | I2C_SDA | SSC_QUP_1, 5V signal levels, Pullups on Power Module | Full pinouts for all the connects are [available here](/voxl2-connectors/). ## External SPIs The following SPI busses are available from the applications processor. ![m0054-offboard-sensors-spi](/images/voxl2/m0054-offboard-sensors-spi-2.jpg) | Name / Designator | Description | Interface | |--- |--- |--- | | SPI0 / exposed via J6 | camera group 0 SPI | /dev/spidev0.0 | | SPI1 / exposed via J7 | camera group 1 SPI | /dev/spidev1.0 | | SPI14 / exposed via J10 | external SPI | /dev/spidev14.0 | Full pinouts for all the connects are [available here](/voxl2-connectors/). Related video: --- Source: https://docs.modalai.com/voxl2-leds/ # VOXL 2 LEDs --- ## Summary ![m0054-leds](/images/voxl2/m0054-leds.jpg) ## D1 - Power Good LED (Green) | State | Description | |--- |--- | | Green | indicates 3P3 VREG and (emulated) VBAT are good (using AND logic) | | Off | indicates either 3P3 VREG or emulated VBAT are not good | Green ## DS1 - EFuse Status LED (RBG) | State | Description | |--- |--- | | Green | Power is good AND no faults | | Red | Fault condition present (Over/Under Voltage, Thermal) | | Off | No power to board | > The blue channel is exposed via TP3 (which is the test point nearest to DS1, encircled in the graphic above). ## DS2 - User Controllable RGB LED All 3 colors of the DS2 LED are active high ON. | State | Description | |--- |--- | | Red | GPIO_82 set high, 2.1Vf @5mA | | Green | GPIO_83 set high, 3.1Vf @5mA | | Blue | GPIO_84 set high, 3.0Vf @5mA | | Off | GPIO_82, GPIO_83 and GPIO_84 set low | ## DS4 - PM8150L RGB LED Driver The PM8150L can drive this RGB LED. To control: ``` # Green off/on voxl2:~$ echo 0 > /sys/class/leds/green/brightness voxl2:~$ echo 255 > /sys/class/leds/green/brightness # Red off/on voxl2:~$ echo 255 > /sys/class/leds/red/brightness voxl2:~$ echo 0 > /sys/class/leds/red/brightness # Blue off/on voxl2:~$ echo 0 > /sys/class/leds/blue/brightness voxl2:~$ echo 255 > /sys/class/leds/blue/brightness ``` --- Source: https://docs.modalai.com/m0054-versions/ # VOXL 2 HW Versions --- ## M0054-1 and M0054-2 Two variants of VOXL2 M0054 hardware have shipped, which each require: - a unique kernel - a unique trustzone config The SDK installer should detect and load the correct version. If not, the user is given a link to this page for help to decide which hardware they have! ### Hardware Differences You can distinguish between `M0054-1` and `M0054-2` hardware based upon the SIP package text. | HW Version | VOXL SDK Requirement | Notes | |------------|----------------------|---------| | M0054-1 | Any | "QRB5165M" printed on SIP cover (see below) | | M0054-2 | SDK 1.1.3+ | "QSM8250" printed on SIP cover (see below) | ![VOXL 2 hardware version differences](/images/voxl2/m0054-versions.jpg) ### Software Differences The `voxl-version` utility will report the `machine` and `variant`. M0054-1 will show: ``` hw_platform: M0054 mach.var: 1.0 ``` M0054-2 will show: ``` hw_platform: M0054 mach.var: 1.2 ``` This is populated by the [voxl-platform-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-platform-mod) kernel driver. | Machine | Variant | Description | modalai,platform-id (machine, variant, pad)| |----------|-----------|-------------------------------------|---------------------| | m0054 | | VOXL2 | 1 0 0 | | m0054 | var01 | VOXL2 - no combo mode J6/J8 | 1 1 0 | | m0054 | var02 | VOXL2 - 8250 | 1 2 0 | See `/sys/module/voxl_platform_mod/parameters/machine` and `/sys/module/voxl_platform_mod/parameters/variant` See [Release Notes](/voxl2-voxl2-mini-system-image/). --- Source: https://docs.modalai.com/voxl2-system-image/ # VOXL 2 System Image The system image is the operating system that runs on VOXL 2 and VOXL 2 Mini: the kernel, root file system, and firmware for the other onboard processors. It ships inside [VOXL SDK releases](/voxl-suite/) and is installed by [flashing the SDK](/flash-system-image/). --- Source: https://docs.modalai.com/voxl2-voxl2-mini-system-image/ # VOXL 2 and VOXL 2 Mini System Image --- ## Overview The system image is essentially "the operating system" of VOXL: the kernel, the root file system, and firmware for the other processors on board. It applies to VOXL 2 (M0054) and VOXL 2 Mini (M0104 and M0204), which share a common image. > Every VOXL 2 Mini is flashed with the same `voxl2-mini` SDK release, whether the board is an M0104 or an M0204 and whether it carries a QRB5165 or a QSM8250 SoC. Do not use the `voxl2` (M0054) release on a VOXL 2 Mini. Get the VOXL 2 Mini release from the [Downloads](/downloads/) page. The system image ships inside VOXL SDK releases and is flashed as part of the SDK install — see the [SDK flashing instructions](/flash-system-image/#flash-the-sdk). It is not distributed separately. ## System Image Changelog ### 1.8.08 Ships with: SDK 1.6.4, 1.6.5, 1.6.6, 1.6.8 (June - October 2026; 1.6.8 is VOXL 2 only) *Changelog for this image has not been published yet.* ### 1.8.06 Ships with: SDK 1.6.0 - 1.6.3 | Released: 2025-11-05 **CVE fixes:** - Full CVE and OVAL security report - USN-7783-1 LibTIFF vulnerabilities **Changes:** - Updated OV9782 stereo configuration - Increased `maxRAWSizes` parameter to improve RAW image handling performance - Added Boson 14-bit sensor modules - Updated rtl8812au-vtx to support configuring efuse **Packages / tools added:** - `rsync`, `screen`, `tcpdump`, `libsystemd-dev`, and `rtwpriv` utilities ### 1.8.02 Ships with: SDK 1.4.x | Released: 2024-11-12 **BSP:** - Increase I2C write buffer - M0104 (VOXL 2 Mini): add `config 2` for M0188 - `m0104-1-var00.2-kernel.img` **Camera (camx/chi-cdk):** - Add imx664 bins - Add ov64b40 bins - Add 10/12-bit AR0144 bins - Add Boson320+ support (needs [USB config](/M0153/) setup) - Set `maxRAWSizes=5` for MISP ### 1.7.10 Ships with: SDK 1.3.5 | Released: 2024-10-10 **BSP:** - SPI: enable RT flag for realtime priority message pump **Camera (camx/chi-cdk):** - Add Boson slot IDs 0-5 ### 1.7.8 Ships with: SDK 1.3.0 - 1.3.3 **BSP:** - M0104: fix issue with hires sensors on slots 0-2 - Change GPIO 110-114 to default inputs to leave floating (fixes ov7251 stereo sync issue) - Add var00.1 and var02.1 for M0173 support - Default gpio109 for fsync for M0173 supported kernels - Use 88XXau_ohd instead of 88XXau_wfb **Camera (camx/chi-cdk):** - Backport fix to select multiple tuning files - imx412_fpv resolution updates - add 4056x3040 30fps - ov9782 tuning updates - C26-C28: add cameraId 6 in prep for M0173 - C27: add slave mode enabled AR0144 for M0173 (slots combo 0, 2, combo 6) - C28: add IMX412 slot 6 ### 1.7.6 Ships with: SDK 1.2.0 (no VOXL 2 Mini release) | Released: 2024-04-15 **BSP:** - Add support for M0104-2 via `var02` variant **Camera (camx/chi-cdk):** - `imx412_fpv` low latency binaries - `imx678` latency reduction - Ship royale-5-8-spectre-6-10 - `irs2975` binaries (beta level support) - `boson_2` binary (alpha level support) **Ubuntu:** - Added neofetch, libsdl2-dev ### 1.7.4 Ships with: SDK 1.1.3 (no VOXL 2 Mini release) | Released: 2024-02-26 **BSP:** - Add `voxl-fysnc-mod` kernel module - Add `voxl-gpio-mod` kernel module - GPIO now exporting to `/sys/class/gpio` - Convert SE13 from 4W to 2W UART, freeing GPIO36/37 - Add `voxl-platform-mod` kernel module - see `/sys/module/voxl_platform_mod/parameters` - Add new target M0054-2 support (same rootfs as M0054-1), new kernel, new devcfg.mbn **Camera (camx/chi-cdk):** - Update `ar0144` binaries ### 1.7.1 Ships with: SDK 1.1.0 - 1.1.2 | Released: 2023-11-13 **BSP:** - Disable usb-autosuspend via karg - Enable CONFIG_HIDRAW - M0104: convert SPI14 to UART (`/dev/ttyHS0`) - M0104: remove non-existing peripherals located on B2Bs/camera group 2 - Enable `/dev/i2c-5`, J5 pins 98/99 (SDA/SCL) (GPIO 8/9) - Disable pcie2 in favor of enabling GPIO 85/86/87/88 on J5 - Refactor camera-dtsi for readability **Camera (camx/chi-cdk):** - Ship `ov7251-fsin` and `ov7251-fsout` binaries - Ship `imx335` binaries - Ship `irs1645_2` and `irs1645_3` bins - Ship `imx412_flip` and `imx678_flip` bins - Update `imx412` timing to support M0107 based sensor - Add 4056x3040 and 4208x3120 to camx supported resolutions - Update ov7251 max gain/exposure settings - Ship tuned.imx214_m0024 at `/usr/share/modalai/chi-cdk/tuned/` - Ship `ar0144` at `/usr/share/modalai/chi-cdk/ar0144` **NON-HLOS:** - Update SLPI to 1.1.10 - fix potential buffer overflow bug, increase pass-through UART buffer ### 1.6.2 Ships with: SDK 1.0.0 | Released: 2023-07 (build 2023-05-19) **BSP:** - Now using refactored `meta-voxl2-bsp` supporting M0054/M0104 - Add VOXL 2 Mini (M0104) support **Camera:** - Use `/usr/share/modalai/chi-cdk` to ship camera sensormodule binaries **HLOS:** - Add 8821cu.ko - Update libfc_sensor 1.0.2 to 1.0.4 **NHLOS:** - ModalAI SLPI upgraded to 1.1-7 ### 1.5.5 Ships with: SDK 0.9.5 | Released: 2023-03-30 (build 2023-03-22) **Camera:** - Update IMX678 config: 3840x2160@30 use 4 lane mode at 891 Mbps; 1920x1080@30 use 4 lane mode at 720 Mbps - Enable more camera configs (see [camera configs](/voxl2-camera-configs/)) - Revert defaultFpsMax backend flag (use case selection is broken when enabled) ### 1.5.4 (internal only) Build date: 2023-02-16 **HLOS:** - Increase SLPI memory - Install `voxl-esc` python depends (pip3, pyserial, numpy) - Add nano **NHLOS:** - ModalAI SLPI upgraded to 1.1-6 - Increase SLPI memory - Added 420k baud rate UART for SLPI (native ELRS baud rate) ### 1.5.3 (internal only) Build date: 2023-02-03 **BSP** (see [Linux User Guide](/voxl2-linux-user-guide/) for details): - M0054: configure GPIO 152 as output, default high, on J5 pin 44 for M0130 (along with GPIO 153, 154, 155) - M0054: configure SE1 for I2C `/dev/i2c-4` J7 (camera group 1) - M0054: enable new GPIO 110/114 pins on J6, GPIO 6/7 pins on J7, GPIO 12/13 pins on J8 - M0054: enable SE2 (I2C) on J5 pins 8, 9 as `/dev/i2c-0` - M0054: enable SE11 (SPI) on J5 pins 53, 56 as `/dev/spidev11.0` - Update TZ to devcfg ver8 - see [voxl2-qups](/voxl2-qups/) for details **Camera:** - Added IMX678 support (M0054-J8, HW sensor ID 4/5 (addresses 0x34/0x20)): 1920x1080 @ 30 FPS, 3840x2160 @ 30 FPS - ov7251 60/90/120 FPS configs added as dormant (need to add camx proper support) **HLOS:** - Added service file that changes SLPI restart level to avoid board crash when SLPI crashes **NHLOS:** - ModalAI SLPI upgraded to 1.1-4 ### 1.4.1 Ships with: Platform Release 0.9 | Released: 2022-11-11 **Ubuntu:** - Add `i2c-tools` - Journalctl system max use limit now set to 1000M **Camera:** - Add A65 TOF Module (irs10x0c sensor) support on all 6 camera interfaces - ov7251 drivers are now 8-bit **XBL (secondary bootloader):** - Fix occasional error showing "battery's capacity is very low" during flashing **NHLOS:** - ModalAI SLPI upgraded to 1.1-2 **Flashing script:** - Made system image flash script compatible with bash 4 and older versions ### 1.3.1 (internal) Released: 2022-08-11 **Meta:** - Included missing fastrpc binaries for adsp and cdsp in dspso partition **Camera:** - Update IMX214 drivers to support resolutions other than 640x480 - Added ALPHA LEVEL support for 5 concurrent ov9782 (needs tuning) **BSP:** - M0054/M0052: enable 2W UART on J3 pins 3/5 (legacy B2B) for apps proc usage - M0052 breaking change: change qup5 from SPI to UART (exposed on J8; `/dev/spidev5.0` is gone) - M0054 mappings: `/dev/ttyHS0` J8 camera connector; `/dev/ttyHS1` J3 B2B pins 3/5; `/dev/ttyHS2` J5 HS B2B pins 48/49 - M0052 mappings: `/dev/ttyHS0` internal SOM WiFi; `/dev/ttyHS1` J2 RC input for PX4; `/dev/ttyHS2` J19 GNSS input for PX4; `/dev/ttyHS3` J8 camera connector; `/dev/ttyHS4` J3 B2B pins 3/5; `/dev/ttyHS5` J5 HS B2B pins 48/49 **Trustzone:** - M0054, version 6: update devcfg for UART on qup7 (md5sum: 3698389194c899953c4e337a7b48cb97) - M0052, version 6: update devcfg for UART on qup7 (md5sum: cf613de37db6e7d2bb245f4d17cab79e) ### 1.2.3 (internal) **Ubuntu:** - Added jq, pciutils, aircrack-ng packages **Kernel:** - Add dormant 88XXau_wfb.ko driver at `/etc/` - users who choose to use it can install it manually and use voxl-wifi-broadcast - Regulatory domain tweaks to support wifibroadcast options - Update spidev buffer size to 16K ### 1.2.2 (internal) **System:** - Bash environment executed during ssh session start - ModalAI partitions now include MACHINE type prefix - ModalAI SLPI 1.1-0 now flashed in system image via DSP and Firmware partitions **Kernel:** - Fix for hal3 timestamp drift error - Enable LAN95XX driver **chi-cdk:** - ov9782: add front/rear and tracking support - ov7251: fix for missing gain in hal3 metadata ### 1.2.1 (internal) Released: 2022-04-18 - ROS sources and key included in root filesystem - XBL now flashed during system image install - Binaries can now be executed in the data partition ### 1.2.0 Released: 2022-04-15 - Update chi-cdk - ov7251 FSYNC registers from mm-camera - Add rndis host driver to kernel - Enable SPI: `/dev/spidev3.0` internal IMU; `/dev/spidev14.0` external SPI; `/dev/spidev0.0`, `/dev/spidev1.0`, `/dev/spidev5.0` camera groups 0, 1, 2 - Updated device HLOS partitions: userdata (`/data`) to 64GB; added 64KB modalai_conf (`/etc/modalai`) and 64KB modalai_cal (`/data/modalai`) partitions; reduced system (`/`) partition to 47.875GB - System image flash: devcfg.mbn, NHLOS, and LUN0 GPT can now be flashed during system image flash - Rootfs additions: px4-support and libfc now included; ModalAI metabuild info now in `/firmware/verinfo/ver_info.txt`; removed `/etc/voxl-platform-info.json` meta file creation (metabuild info includes this now); removed old incompatible tdk binaries; added stable ModalAI sources list, library search paths, and qrb5165-bind; included docker sources list and key ### 1.1.4 (internal) Released: 2022-03-09 - Add rtl8188eus driver for tp-link support - Remove all opencv 3.2 packages - apt autoremove and clean, removing 400MB of cached debs - Permit root ssh login - Add platform_name file for bash formatting - Remove ldconfig warning about wayland sink not being a symlink ### 1.1.3 (internal) Released: 2022-02-18 - Modified mv-voxl 32-bit shared object file permissions as they were set incorrectly - Added `/etc/voxl-platform-info.json` file which includes build and platform metadata ### 1.1.2 Released: 2022-02-09 - Initial release ## Force VOXL 2 into Fastboot Use this procedure if the normal update procedure is not working. - Unplug VOXL 2 from power - Unplug VOXL 2 from USBC - Using something soft like a BBQ skewer or toothpick, press and hold the momentary button `SW1` down, as shown in this image: ![m0054-fastboot](/images/voxl2/m0054-fastboot.jpg) - While holding `SW1` down, power on VOXL 2 - Keep holding `SW1` down for about 5 seconds and then let go - Attach VOXL 2 to USBC connected to host computer - Run the `fastboot devices` command and verify the device is showing up ```bash fastboot devices f8bb8d44 fastboot ``` - Now you can proceed with the `./install.sh` command from the SDK installer. ## Missing ADB? See [Setting up ADB](/setting-up-adb/). --- Source: https://docs.modalai.com/voxl2-linux-user-guide/ # VOXL 2 Linux User Guide --- Connecting your own hardware? The task-oriented walkthrough is [Connecting External Devices to VOXL 2](/voxl2-external-devices/) — this page is the underlying bus-by-bus reference. ## UARTs The following is accurate as of [System Image 1.6]( /voxl2-system-image/). ### Overview ![m0054-linux-user-guide-uart](/images/voxl2/m0054-linux-user-guide-uart-v1.5-rev0.png) ### Apps Proc #### /dev/ttyHS0 - Camera Group 2 UART | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/ttyHS0` | | Pins | J8 Pins 38/40 (Tx/Rx) | | Voltage | 1.8V, directly connected to QRB5165, likely need to level shift | | Code Sample | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) — see the `qrb5165io-uart-test` example | | Add-Ons | NA | #### /dev/ttyHS1 - B2B Connector UART | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/ttyHS1` | | Pins | J3 Pins 3/5 (Rx/Tx) | | Voltage | 1.8V, directly connected to QRB5165, likely need to level shift | | Code Sample | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) — see the `qrb5165io-uart-test` example | | Add-Ons | M0125 J3 Pins 2/3 (Rx/Tx)
M0144 JP1 pins 9/11 (Tx/Rx)
M0130 J5 Pnis 2/3 (Tx/Rx) | #### /dev/ttyHS2 - HSB2B Connector UART | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/ttyHS2` | | Pins | J5 HS B2B pins 48/49 (Rx/Tx) | | Voltage | 1.8V, directly connected to QRB5165, likely need to level shift | | Code Sample | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) — see the `qrb5165io-uart-test` example | | | [M0090 - 5G Add-On Board](https://www.modalai.com/products/mdk-m0090) J9 Pins 2/3 (Tx/Rx)
M0144 J14 pins 17/19 | #### /dev/ttyHS3 - HSB2B Connector UART | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/ttyHS3` | | Pins | J5 HS B2B pins 97/98 (Rx/Tx) | | Voltage | 1.8V, directly connected to QRB5165, likely need to level shift | | Code Sample | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) — see the `qrb5165io-uart-test` example | | | M0130 J8 Pins 10/11 (Tx/Rx) - Level Shifted to 3.3V, M0144 J15 pins 7/9 | ### SLPI Proc #### Overview ![m0054-ext-fc-dsp.jpg](/images/voxl2/m0054-ext-fc-dsp.jpg) #### QUP2 - ESC UART | | | |-------------|----------------------------------------------------------------------------------------------------| | Device | `QUP2` | | Pins | J18 Pins 2/3 (Tx/Rx) | | Voltage | 3.3V, via directional level shifters | | Code Sample | [PX4 ESC Driver](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) | | Add-Ons | [VOXL ESC](https://www.modalai.com/collections/electronic-speed-controls) | #### QUP6 - GNSS UART | | | |-------------|----------------------------------------------------------------------------------------| | Device | `QUP6` | | Pins | J19 Pins 2/3 (Tx/Rx) | | Voltage | 3.3V, via directional level shifters | | Code Sample | [PX4 GPS](https://github.com/modalai/px4-firmware/tree/voxl-master/src/drivers/gps) | | Add-Ons | VOXL 2 GPS Mag Assembly | #### QUP7 - RCIO UART | | | |-------------|------------------------------------------------------------------------------------------------| | Device | `QUP7` | | Pins | J19 Pins 10/11 (Tx/Rx) | | Voltage | 3.3V, via directional level shifters | | Code Sample | [PX4 px4io Driver](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/px4io) | | | [PX4 RC Driver](https://github.com/modalai/px4-firmware/tree/voxl-master/src/drivers/rc_input) | | Add-Ons | [VOXL 2 IO](/voxl2-io) | | | VOXL 2 GPS Mag Assembly | ## SPI The following is accurate as of [System Image 1.3]( /voxl2-system-image/). ### Overview ![m0054-linux-user-guide-spi](/images/voxl2/m0054-linux-user-guide-spi-v1.5-rev0.png) - Note: not shown is spidev11 on HS B2B J5 ``` /dev/spidev0.0 --> camera group 0 (J6) /dev/spidev3.0 --> internal IMU (TDK ICM-42688p) /dev/spidev11.0 --> HS B2B connector (J5) /dev/spidev14.0 --> external SPI (J10) ``` ### Apps Proc #### SPI0 - Camera Group 0 SPI | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/spidev0.0` | | Code Sample | [VOXL SDK IMU Server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | | Voltage | 1.8V, directly connected to QRB5165, likely need to level shift | | Pins | J6 - 34 MISO | | | J6 - 36 MOSI | | | J6 - 38 SCLK | | | J6 - 40 CS_N | #### SPI3 - IMU1 | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/spidev3.0`, exposed in MPA as `/run/mpa/imu_apps` | | Code Sample | [VOXL SDK IMU Server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | | Voltage | Internal | | Pins | U17 - 1 MISO | | | U17 - 14 MOSI | | | U17 - 13 SCLK | | | U17 - 12 CS_N | #### SPI11 - J5 B2B SPI Available in system image 1.5+ | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/spidev11.0` | | Code Sample | [VOXL SDK IMU Server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | | Voltage | 3.3VDC | | Pins | J5 - 53 MISO | | | J5 - 54 MOSI | | | J5 - 55 SCLK | | | J5 - 56 CS_N | Available from M0130 addon - J8 pin 2-5 #### SPI14 - J10 External SPI | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/spidev14.0` | | Code Sample | [VOXL SDK IMU Server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | | Voltage | 3.3VDC | | Pins | J10 - 2 MISO | | | J10 - 3 MOSI | | | J10 - 4 SCLK | | | J10 - 5 CS_N | Available from J10 pins 2-5 ### SLPI Proc #### QUP5 - IMU0 | | | |-------------|-----------------------------------------------------------------| | Device | exposed via MAP at `/run/mpa/imu_px4` | | Code Sample | [VOXL SDK IMU Server](https://gitlab.com/voxl-public/voxl-sdk/services/qrb5165-imu-server) | | Voltage | Internal | | Pins | U16 - 1 MISO | | | U16 - 14 MOSI | | | U16 - 13 SCLK | | | U16 - 12 CS_N | ## I2Cs The following is accurate as of [System Image 1.3]( /voxl2-system-image/). ### Overview ![m0054-linux-user-guide-i2c](/images/voxl2/m0054-linux-user-guide-i2c-v1.5-rev0.png) ### Apps Proc #### i2c-0 - I2C2 - HS B2B I2C `/dev/i2c-0` is exposed on the HS B2B connector (J5) pins 8/9. | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-0` (new as of system image 1.5) | | Code Sample | | | Voltage | 3.3VDC | | Pins | J5 Pin 8/9 (SDA/SCL) (GPIO 115/116) | | Add-Ons | M0130 J8 Pins 8/9 (SDA/SCL) | #### i2c-1 - I2C9 - B2B I2C - GPIO 125-126 `/dev/i2c-1` | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-1` (as of system image 1.5, was `i2c-0` before) | | Code Sample | | | Voltage | 3.3VDC | | Pins | J3 Pin 13/15 (SCL/SDA) (GPIO 126/125) | #### i2c-2 - I2C10 - B2B I2C - GPIO 129-130 `/dev/i2c-2` is exposed on the Legacy B2B connector's pins 23 and 25, and available on add-on boards via a JST connector. | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-2` (as of system image 1.5, was `i2c-1` before) | | Code Sample | | | Voltage | 3.3VDC | | Connector | M0054 J3 Pins 23/25 (SCL/SDA) (GPIO 130/129) | | Add-Ons | M0062 J9 Pins 4/5 (SDA/SCL) | | | M0090 J9 Pins 4/5 (SDA/SCL) | #### i2c-3 - I2C15 - USB Redriver (internal, don't use) Status: dmesg shows some errors, need to investigate | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-3` (as of system image 1.5, was `i2c-2` before) | | Hardware | PN `NB7VPQ904MMUTWG` [datasheet](https://www.mouser.com/datasheet/2/308/NB7VPQ904M-1551455.pdf) | | | Address: 0x1C | #### i2c-4 - I2C1 - Camera Group 1 I2C `/dev/i2c-4` is exposed on the J7 camera group connector | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-4` | | Code Sample | | | Voltage | 1.8VDC | | Connector | M0054 J7 Pins 34/36 (SCL/SDA) (GPIO 4/5) | #### i2c-5 - I2C4 - HS B2B I2C **system image 1.7.2+** `/dev/i2c-5` is exposed on the high speed board to board connector J5. | | | |-------------|-----------------------------------------------------------------| | Device | `/dev/i2c-5` | | Code Sample | | | Voltage | 1.8VDC | | Connector | M0054 J5 Pins 98/99 (SDA/SCL) (GPIO 8/9) | #### i2cdetect Usage For example, detecting devices on `/dev/i2c-0` ``` i2cdetect -r -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- ``` ### SLPI Proc #### QUP0 - External Sensor (Magnetometer) Typically used for magnetometer I2C connection. | | | |-------------|-----------------------------------------------------------------| | ID | QUP0 | | Code Sample | | | Voltage | 3.3VDC | | Pins | J19 Pins 4/5 (SCL/SDA) | | Add-Ons | VOXL 2 GPS Mag Assembly | #### QUP2 - External Sensor (Power Monitoring) Typically used for battery power monitoring I2C connection. | | | |-------------|-----------------------------------------------------------------| | ID | QUP2 | | Code Sample | | | Voltage | 5.0VDC | | Pins | J4 Pins 3/4 (SCL/SDA) | | Add-Ons | [VOXL PMv3](https://www.modalai.com/products/mdk-m0041-1) | #### QUP3 Future use. | | | |-------------|-----------------------------------------------------------------| | ID | QUP3 | | Code Sample | | | Voltage | 3.3VDC | | Pins | J19 Pins 7/8 (SCL/SDA) | | Add-Ons | NA | #### QUP4 - Internal Sensors (Barometers) Connected to onboard barometers. | | | |-------------|-----------------------------------------------------------------| | ID | QUP4 | | Code Sample | | | Hardware | TDK-ICP10100 @ 0x63h | | | bmp388 @ 0x76h | ## GPIOs ### Apps Proc Example code: [voxl-gpio.c](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io/-/blob/master/apps/examples/voxl-gpio.c) ### voxl-gpio-mod Kernel Driver To help with GPIO initialization and exporting to user space, see [meta-voxl2/recipes-kernel/voxl-gpio-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-gpio-mod) Starting SDK 1.2.X/System Image 1.7.3, GPIOs are exported by default in `/sys/class/gpio`, the GPIO have an offest of 1100 (e.g. GPIO 84 = 1184). #### J3 - B2B See [changelog](/voxl2-system-image/) for version info. | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------------| | 52 | In | J3 Pin 7, pulldown - exposed by M0090, M0062 - J8 pin 2 at 3P3V | | 53 | Out | J3 Pin 9, default high, 1P8V - exposed by M0090, M0062 - J8 pin 3 at 3P3V (for M0048 pDDL_EN_N) | | 54 | Out | J3 Pin 19, default low, 1P8V - exposed by M0090, M0062 - J8 pin 4 at 3P3V | | 55 | Out | J3 Pin 17, default low, 1P8V - exposed by M0090, M0062 - J8 pin 5 at 3P3V | | 131 | Out | J3 Pin 38 - default low, 1P8V | | 124 | Out | J3 Pin 40 - default high,1P8V | #### J5 - HS B2B See [changelog](/voxl2-system-image/) for version info. | GPIO | Direction | Description | |----- |-----------|------------------------------------------------------------------------------------| | 0 | In/Out | J5 Pin 46, default high, 1P8V | | 1 | In/Out | J5 Pin 47, default high, 1P8V | | 36 | In/Out | J5 Pin 97, default high, 1P8V (system image 1.7.3+) | | 37 | In/Out | J5 Pin 98, default high, 1P8V (system image 1.7.3+) | | 56 | In/Out | J5 Pin 50, default high, 1P8V | | 57 | In/Out | J5 Pin 51, default high, 1P8V | | 85 | In/Out | J5 Pin 82, default high, 1P8V | | 86 | In/Out | J5 Pin 81, default high, 1P8V | | 87 | In/Out | J5 Pin 80, default high, 1P8V | | 88 | In/Out | J5 Pin 78, default high, 1P8V | | 89 | In/Out | J5 Pin 79, default high, 1P8V - for M0130, controls whether interface on J8 is SPI (default) or UART (DT change needed to convert) | | 152 | In/Out | J5 Pin 44, default high, 1P8V | | 153 | In/Out | J5 Pin 43, default low, 1P8V | | 154 | In/Out | J5 Pin 42, default low, 1P8V | | 155 | In/Out | J5 Pin 41, default low, 1P8V | #### J6 > As of system image 1.5, when using the `var00.1` kernel these are not available for use — they are used in reset signaling. | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 113 | In/Out | J6 - 16, exposed though interposer M0076 TP2, Warning: used in camera HW reset signaling | | 110 | In/Out | J6 - 18, exposed though interposer M0076 TP3. Warning: used in camera HW reset signaling | #### J7 > As of system image 1.5: | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 6 | In/Out | J7 - 38, exposed though interposer M0076 TP7 | | 7 | In/Out | J7 - 40, exposed though interposer M0076 TP8 | #### J8 > As of system image 1.5: | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 12 | In/Out | J8 - 34, exposed though interposer M0076 TP5 | | 13 | In/Out | J8 - 36, exposed though interposer M0076 TP6 | #### J10 | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 46 | Out | J10 Pin 6 (SPI4 CS1, used for Spektrum bind) | #### LEDs | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 82 | Out | DS2 LED, Red | | 83 | Out | DS2 LED, Green | | 84 | Out | DS2 LED, Blue | #### Regulators | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------| | 157 | Out | Controls U41, the 5V/2A switchable power supply for USB | | 159 | Out | Controls U24, the 3.3VDC supply for RC / VOXL2 IO, J19 pin 9 | #### HW ID > As of system image 1.7.3: | GPIO | Direction | Description | |-----|-----------|------------------------------------------------------------------------------------------| | 48 | In | SOM detect, id_som_1 | | 49 | In | SOM detect, id_som_2 | | 50 | In | SOM detect, id_mai_4 | | 51 | In | SOM detect, id_mai_4 | | Machine | 48 | 49 | 50 | 51 | |---------|----|----|----|----| | M0054 | X | X | 0 | 0 | | M0104 | X | X | 1 | 1 | | M0154 | 1 | 0 | 1 | 0 | #### UART/SPI select (VOXL2 Mini) > As of system image 1.7.3: On VOXL 2 Mini, J10 can expose a UART or SPI based on this GPIO (default UART). Not kernel rebuild required to change from UART to SPI. | GPIO | Direction | Description | |-----|------------|------------------------------------------------------------------------------------------| | 67 | Out | J10 level shift control, default low (selects UART) | #### Camera Sync Util GPIOs > As of system image 1.7.7: See [meta-voxl2/recipes-kernel/voxl-fsync-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fsync-mod) | GPIO | Direction | Description | |------|-----------|-----------------------------------------------------------------------------------------| | 109 | Out | Default low | #### Camera Use | GPIO | Direction | Description | |-----|------------|------------------------------------------------------------------------------------------| | 110 | In | Will be used by M0173 config, camera ID 6 reset | | 111 | In | Used by stereo sync with ov7251/ov9782, J8 pin 18, D0006 config | | 112 | In | Used by future camera config | | 113 | In | Used by stereo sync with ov7251/ov9782, J6 pin 18, D0006 config | | 114 | In | used by fugure camera config | ## PCIe ### PCIe2 Starting system image 1.7, we've disabled the PCIe interface in favor of exposing GPIOs. ## Serial Debug Console This is enabled in DEBUG builds of the system image and not enabled by default. You can access via: - M0017 `APQ Console`. ![m0054-debug-console-m0017](/images/voxl2/m0054-with-m0017.png) - M0062 J6. ![m0054-debug-console](/images/voxl2/m0054-debug-console.png) Running the following after power on, for example: ``` screen /dev/tty.usbserial-AU03BMG9 115200 ``` Watch the booting progress: ``` [ OK ] Stopped Modem Init Service. [ OK ] Started Modem Init Service. [ OK ] Stopped Modem Init Service. [FAILED] Failed to start Modem Init Service. See 'systemctl status init_sys_mss.service' for details. [ OK ] Started depends update. Ubuntu 18.04.5 LTS qrb5165-rb5 ttyMSM0 qrb5165-rb5 login: ``` ## Kernel Modules ### voxl-fsync-mod Used to generate image sensor sync pulses. [Source](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fysnc-mod) ### voxl-gpio-mod Used to export GPIO to user space. [Source](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-gpio-mod) ### voxl-platform-mod Used to export machine specific to user space for operational ease. [Source](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-platform-mod) --- Source: https://docs.modalai.com/voxl2-kernel-build-guide/ # VOXL 2 Kernel Build Guide --- ## Overview The VOXL 2 kernel comes from here: https://git.codelinaro.org/clo/la/kernel/msm-4.19 We started with the RB5 development kit and slowly updated the device tree and kernel to work on VOXL2 and VOXL2 Mini. The aim of this guide is to show you how to build a new kernel for VOXL 2 and VOXL 2 mini and modify it. ## Build Components We're trying to adhere to bitbake standards, but likely have some inconsistencies with our recipes... Feel free to offer suggestions if things are bugging you or submit PRs! | Component | Repo | | ----------- |--- | | qrb5165-kernel-build-docker | [repo](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel-build-docker/-/tree/qrb5165-ubun1.0-14.1a)| | qrb5165-kernel | [repo](https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/tree/qrb5165-ubun1.0-14.1a) | | meta-voxl2 | [repo](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a) | | meta-voxl2-bsp | [repo](https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/tree/qrb5165-ubun1.0-14.1a) | ## Get the Correct Tags! SDK 1.3.3 is using System Image 1.7.8, so clone from the `v1.7.8` tags to build a kernel for SDK 1.1.3 system image. https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/tags/v1.7.8
https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/tags/v1.7.8
https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tags/v1.7.8
See [Release Notes](/voxl2-voxl2-mini-system-image/) for SDK/System Image version info. ## Setup Guide ### Requirements - git - Docker - the more cores the better if you want to build quickly... ### Clone Build Docker We use "build dockers" all over the place to easily share build environments and use in our CI pipelines. This step is optional, with the alternative being you look at the `Dockerfile` for the requirements for the build machine. ```bash git clone -b qrb5165-ubun1.0-14.1a https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel-build-docker cd qrb5165-kernel-build-docker ``` ### Update Tag to use in qrb5165-common.sh - Edit `MODAL_REPO_BRANCH` in `bin/qrb5165-common.sh` - Using example above, set `MODAL_REPO_BRANCH=v1.7.8` to target the v1.7.8 system image/kernel for SDK 1.3.3 as described above, which will sync these: ``` https://gitlab.com/voxl-public/system-image-build/qrb5165-kernel/-/tags/v1.7.8 https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/tags/v1.7.8 https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tags/v1.7.8 ``` ### Build Docker Container ``` ./docker-build-image.sh ... Step 28/28 : RUN export PATH=$PATH:/usr/local/go/bin ---> Running in 865ac9837af2 Removing intermediate container 865ac9837af2 ---> 83b19199b7b5 Successfully built 83b19199b7b5 Successfully tagged qrb5165-kernel-build:qrb5165-ubun1.0-14.1a ``` ### Run Build Docker Now that we have the docker image created (use `docker image ls` to see), we can run an instance of this using a helper script: ```bash ./docker-run-image.sh To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. user@f3c06dd0167d:~$ ``` Now you are in the chroot'd environment, and you don't need to muddy your system with tools. ## Build Guide ### First Time Use (Part 1: Sync) We have to synchronize with the https://git.codelinaro.org/clo as well as the various ModalAI open source components: > This sync command takes some time (10 minutes?) before progressing... ```bash ./qrb5165-sync.sh ... repo has been initialized in /home/user/build_mount/lu.um.1.2.1/apps_proc ``` Now we have the source code needed. ### First Time Use (Part 1: Patch) Apply patches found in the `patches` directory. This is done to pull in VOXL 2 customizations and fix errors that are outside the scope of the product but needed to complete the build (e.g. build system fixes). To apply the patches, run the following: ```bash ./qrb5165-patch.sh ``` ### Build Now, you can build for VOXL 2, which is the `M0054` machine. If building for RB5 Flight, you will use the `M0052` machine. ```bash ./qrb5165-build.sh -m M0054 ``` ### Artifacts The kernel image is `qti-ubuntu-robotics-image-m0054-boot.img` and lives inside the build docker at: ``` /home/user/build_mount/lu.um.1.2.1/apps_proc/build-qti-distro-ubuntu-fullstack-debug/tmp-glibc/deploy/images/m0054/qti-ubuntu-robotics-image-m0054-boot.img ``` After you exit the build docker, it will be in your current directory in `workspace`, for example: ```bash -la workspace/lu.um.1.2.1/apps_proc/build-qti-distro-ubuntu-fullstack-debug/tmp-glibc/deploy/images/m0054/ total 414500 drwxr-xr-x 2 modalai modalai 4096 May 3 15:18 . drwxr-xr-x 3 modalai modalai 4096 May 3 15:09 .. -rw-r--r-- 2 modalai modalai 21387346 May 3 15:09 Image.gz -rw-r--r-- 1 modalai modalai 21393408 May 3 15:18 qti-ubuntu-robotics-image-m0054-boot.img -rw-r--r-- 2 modalai modalai 5859250 May 3 15:09 System.map -rw-r--r-- 2 modalai modalai 375915296 May 3 15:09 vmlinux ``` ## Flashing Guide ### Test You can boot the new kernel without flashing it. First, check out the current version: ```bash adb shell uname -a Linux qrb5165-rb5 4.19.125 #1 SMP PREEMPT Fri Apr 15 16:54:55 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux ``` ```bash adb reboot bootloader fastboot boot qti-ubuntu-robotics-image-m0054-boot.img adb wait-for-device ``` Now, check the new version: ```bash adb shell uname -a Linux qrb5165-rb5 4.19.125 #1 SMP PREEMPT Tue May 3 22:06:09 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux ``` ### Flash If testing worked above, you can now flash it: ```bash adb reboot bootloader fastboot flash boot_a qti-ubuntu-robotics-image-m0054-boot.img fastboot flash boot_b qti-ubuntu-robotics-image-m0054-boot.img fastboot reboot adb wait-for-device ``` ## Developer Topics ### How to Rebuild You don't need to re-sync and patch, just run and build. For example, starting back on the host machine (outside docker): ```bash ./docker-run-image.sh To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. user@11dbde7bdab7:~$ user@11dbde7bdab7:~$ ls build_mount/lu.um.1.2.1/apps_proc/poky/ bitbake meta-openembedded meta-qti-audio meta-qti-core meta-qti-ml meta-qti-sepolicy meta-selftest meta-voxl2-bsp qti-conf README.qemu documentation meta-poky meta-qti-bsp meta-qti-data meta-qti-qmmf meta-qti-ss-mgr meta-selinux meta-webkit README.hardware scripts LICENSE meta-qti-adk meta-qti-bt meta-qti-display meta-qti-robotics meta-qti-ubuntu meta-skeleton meta-yocto-bsp README.LSB meta meta-qti-aosphal-adaptation meta-qti-camera meta-qti-gst meta-qti-security meta-qti-video meta-voxl2 oe-init-build-env README.poky ``` Shown above, all the source is still there. You can edit files, and the build again! ``` ./qrb5165-build.sh ``` ### How to Enable In Tree Driver (Example) See: https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/linux-msm For example, for M0054 (VOXL 2): Enable `smsc95xx` using `CONFIG_USB_NET_SMSC95XX` In: ```bash apps_proc/poky/meta-voxl2-bsp/recipes-kernel/linux-msm/files/m005x.cfg ``` We can enable by adding `CONFIG_USB_NET_SMSC95XX=y` to the `m005x.cfg` file. Now, you can build again: ```bash ./qrb5165-build.sh -m M0054 ``` > to rebuild, clean out the existing build: ``` ./qrb5165-clean.sh # this time, for M0104, as example ./qrb5165-build.sh -m M0104 ``` Flash following procedures above. We can check for the flag before the update: ```bash voxl2:/$ zcat /proc/config.gz | grep CONFIG_USB_NET_SMSC95XX # CONFIG_USB_NET_SMSC95XX is not set ``` And then after updating: ```bash voxl2:/$ zcat /proc/config.gz | grep CONFIG_USB_NET_SMSC95XX CONFIG_USB_NET_SMSC95XX=y ``` --- Source: https://docs.modalai.com/voxl2-qups/ # VOXL 2 QUPs --- ## Overview Together, the Qualcomm Universal Peripheral v3 and the TrustZone provide access to various protocols on various hardware interfaces. Trustzone is a necessary component that requires updates to in order to change protocol/interfaces. Trusztone images are flashed during the system image installation (`devcfg.mbn`). The toolchain and source code to build the Trustzone image are unfortunately not open source. ## devcfg > changing TZ configuration can brick the hardware.
> this is available in System Image 1.7+ for M0104 and will ship in SDK 1.1 and is available as preview here. To use with SDK 1.0, please contact devops @ modalai .com . - [v0104.0, VOXL 2 Mini](https://storage.googleapis.com/modalai_public/865-tz-public/M0104/v0104.0-2023-07-27.tar.gz)(md5sum: ccb6dedc4731aec6d80b4ef6db52fbd6) - convert SE14 from SPI to UART for VOXL 2 Mini | QUP | Protocol | QRB5165 GPIO | Connector/Routing | Device | Notes | |----------------|----------|--------------|-------------------|-------------------|------------------------------------------------------| | QUP0 0x980000 | SPI | 28-31 | J6 - 34,36,38,40 | `/dev/spidev0.0` | sys image 1.7+, Camera Group 0 SPI | | QUP1 0x984000 | I2C | 4-5 | J7 - 34,36 | `/dev/i2c-0` | sys image 1.7+ Camera Group 1 I2C | | QUP2 0x988000 | I2C | 115-116 | | | No J3 (B2B connector) | | QUP3 0x98c000 | SPI | 119-122 | U7, | `/dev/spidev3.0` | sys image 1.7+, Onboard IMU1, 42688p | | QUP4 0x990000 | | | | | | | QUP5 0x994000 | UART | 12-15 | | | No J8 (Camera Group 2) | | QUP6 0x998000 | HS UART | | | | | | QUP7 0x99c000 | HS UART | 22-23 | | | No J3 (B2B connector) | | QUP8 0xa80000 | NA | | | | | | QUP9 0xa84000 | I2C | 125-126 | | | No J3 (B2B connector) | | QUP10 0xa88000 | I2C | 129-130 | | | No J3 (B2B connector) | | QUP11 0xa8c000 | SPI | 60-63 | | | No J5 (B2B connector) | | QUP12 0xa90000 | debug | 34-35 | | Not in perf build | sys image 1.7+, Debug Console (2W UART, 115200 baud) | | QUP13 0xa94000 | UART | | | | No J5 (B2B connector) | | QUP14 0x880000 | SPI | 40-43 | J10, apps proc | `/dev/ttyHS0` | sys image 1.3+, External SPI J10 | | QUP15 0x884000 | I2C | 44-45 | | | | | QUP16 0x888000 | NA | | | | | | QUP17 0x88c000 | NA | | | | | | QUP18 0x890000 | NA | | | | | | QUP19 0x894000 | HS UART | 2-3 | | | No J5 (B2B connector) |
**Current Version (0008)** > this version works with M0104 SDK 1.0 - [M0054 v0008, VOXL 2](https://storage.googleapis.com/modalai_public/865-tz-public/M0054/v0008.tar.gz)(md5sum: ccb6dedc4731aec6d80b4ef6db52fbd6) - used in VOXL2 system image 1.5+ - convert qup1 from SPI to I2C to expose apps_proc I2C on camera group | QUP | Protocol | QRB5165 GPIO | Connector/Routing | Device | Notes | |----------------|----------|--------------|-------------------|-------------------|------------------------------------------------------| | QUP0 0x980000 | SPI | 28-31 | J6 - 34,36,38,40 | `/dev/spidev0.0` | sys image 1.3+, Camera Group 0 SPI | | QUP1 0x984000 | I2C | 4-5 | J7 - 34,36 | `/dev/i2c-4` | sys image 1.5+ Camera Group 1 I2C | | QUP2 0x988000 | I2C | 115-116 | J5 - 8,9 | `/dev/i2c-0` | HS B2B I2C2 | | QUP3 0x98c000 | SPI | 119-122 | U7, J5 | `/dev/spidev3.0` | sys image 1.3+, Onboard IMU1, 42688p. Shared with the IMU, see note below | | QUP4 0x990000 | I2C | 8-9 | J5 - 98,99 | `/dev/i2c-5` | sys image 1.7+, HS B2B I2C | | QUP5 0x994000 | UART | 12-15 | J8 - 34,36,38,40 | `/dev/ttyHS0` | sys image 1.4+, Camera Group 2 UART | | QUP6 0x998000 | HS UART | | | | | | QUP7 0x99c000 | HS UART | 22-23 | J3 - 3,5 | `/dev/ttyHS1` | sys image 1.3+, B2B 2W UART | | QUP8 0xa80000 | NA | | | | | | QUP9 0xa84000 | I2C | 125-126 | J3 - 13,15 | `/dev/i2c-1` | sys image 1.3+, B2B I2C9 | | QUP10 0xa88000 | I2C | 129-130 | J3 - 23,25 | `/dev/i2c-2` | sys image 1.3+, B2B I2C10 | | QUP11 0xa8c000 | SPI | 60-63 | J5 - 53,56 | `/dev/spidev11.0` | sys image 1.5+, HS B2B SPI | | QUP12 0xa90000 | debug | 34-35 | J3 - 27,29 | Not in perf build | sys image 1.3+, Debug Console (2W UART, 115200 baud) | | QUP13 0xa94000 | UART | 38-39 | J5 - 97-98 | `/dev/ttyHS3` | sys image 1.5+, HS B2B UART | | QUP14 0x880000 | SPI | 40-43 | J10, apps proc, | `/dev/spidev14.0` | sys image 1.3+, External SPI J10 | | QUP15 0x884000 | I2C | 44-45 | | `/dev/i2c-3` | (internal use) | | QUP16 0x888000 | NA | | | | | | QUP17 0x88c000 | NA | | | | | | QUP18 0x890000 | NA | | | | | | QUP19 0x894000 | HS UART | 2-3 | J5 - 48,49 | `/dev/ttyHS2` | sys image 1.3+, HS B2B 2W UART | > **SPI3 (QUP3) is shared with the onboard ICM-42688 IMU.** The bus is routed both to the IMU and to J5 (GPIO_119 to GPIO_122). The controller exposes a single native chip select, wired to the IMU, and asserts it on every transfer, so any transfer to a second device on SPI3 also selects the IMU. The `SPI_NO_CS` mode flag is rejected by the kernel on this platform, so the native chip select cannot be suppressed from user space. Do not plan on sharing SPI3 with a second SPI device. Use a different bus instead; enabling SPI11 (QUP11) on J5 is the recommended option. Contact ModalAI on the forum before committing to a design that depends on SPI3. **Version 0007** - M0054 VOXL2 - md5sum: 77366973052c03ce3eab57c1e92b490a - used in system image 1.5+ - enable qup2: I2C, for HS B2B J5 pins 8/9, support for M0130 add-on I2C on J8 - enable qup11: SPI, for HS B2B J5 pins 53/56, support for M0130 add-on SPI on J8 - enable qup13: UART, for HS B2B J5 pins 36-39 **Version 0006** - version 6, M0054-VOXL2 - md5sum: 3698389194c899953c4e337a7b48cb97 - used in system image 1.3+ - enable qup7: 2W UART, for B2B J3 pins 3/5, support for M0125 add-on UART
- M0052-RB5-FLIGHT md5sum: cf613de37db6e7d2bb245f4d17cab79e Deltas from M0054 version 6 above: | QUP | Protocol | QRB5165 GPIO | Notes | Connector/Routing | Device | |--- |--- |--- |--- |--- |--- | | QUP5 0x994000 | UART | 12-15 | Camera Group 2 UART | J8 - 34,36,38,40 | `/dev/ttyHS3` | | QUP6 0x998000 | HS UART | | SOM WiFi | internal | `/dev/ttyHS0` | | QUP7 0x99c000 | HS UART | 22-23 | B2B 2W UART | J3 - 3,5 | `/dev/ttyHS4` | | QUP13 0xa94000 | UART | 38-39 | PX4 RC input | apps_proc, M0052-J12 | `/dev/ttyHS1` | | QUP18 0x890000 | UART | 58-59 | PX4 GNSS | apps_proc, M0052-J10 | `/dev/ttyHS2` | | QUP19 0x894000 | HS UART | 2-3 | HS B2B 2W UART | J5 - 48,49 | `/dev/ttyHS5` |
--- Source: https://docs.modalai.com/voxl2-d0005/ # VOXL 2 - D0005 Architecture (Starling) --- # VOXL2 - D0005-4-V2-C6-M22 --- ## Hardware ### Summary The `D0005-4-V2-C6-M22` configuration is used in the base Starling reference drone model. - `D0005-4-V2` - Starling Family - `C6` - Image Sensor Config 6, PMD Time Of Flight, ov7251 tracking sensor, imx214 hires sensor - `M22` - WiFi modem config - ELRS RX by default (900MHz)
### HW Block Diagram Below describes the compute HW block diagram for the `D0006-C11-M13-T1` configuration. [![D0005-V2-compute-wiring](/images/starling-v2/D0005-compute-wiring-e.jpg)](/images/starling-v2/D0005-compute-wiring-e.jpg) [Diagram draw.io Source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0005/D0005-compute-wiring.drawio) --- Source: https://docs.modalai.com/voxl2-d0006/ # VOXL 2 - D0006 Architecture (Sentinel) --- # VOXL2 - D0006-C11-M13-T1 --- ## Hardware ### Summary The `D0006-C11-M13-T1` configuration is used in the base Sentinel reference drone model. - `D0006` - Sentinel Family - `C11` - Image Sensor Config 11, QTY2 pair of ov7251 stereo sensors, ov7251 tracking sensor, imx214 hires sensor - `M13` - WiFi modem config - `T1` - DSMX receiver config
### Components The following core hardware is used for that configuration (note in this guide we are excluding the motor, battery, transmitter): | Part Number | Kit Contents | |--------------------|-------------------------------------------------------------------------| | MDK-M0054-1--1-C11 | M0054 - VOXL2 | | | M0084/M0025-2/M0014 - Hires (IMX214)/Tracking (ov7251) sensors and flex | | | QTY2 M0076/M0074/M0010/M0015 - Stereo pair (ov7251) and flex | | MDK-M0041-1-B-01 | VOXL Power Module v3 and cable | | MDK-M0117-1-01 | VOXL ESC | | MDK-M0094-2-01 | GPS / Mag / RC Module | | MDK-M0078-2-02 | Wi-Fi Modem Add-On |
### HW Block Diagram Below describes the compute HW block diagram for the `D0006-C11-M13-T1` configuration. - view this drawing in [fullsize](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1.jpg), view drawing [source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0006/D0006-C11-M13-T1.drawio) (using [this tool](https://github.com/jgraph/drawio-desktop/releases)) - for more information on connecting the image sensors, see [video here](https://www.youtube.com/watch?v=J7iYorzm5rs) and or [image here](/voxl2-camera-configs/#c11---front-stereo-rear-stereo-hires-and-tracking) ![D0006-C11-M13-T1](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1.jpg)
### HW Theory of Operation **Power** The VOXL Power Module (`MDK-M0041`) accepts 2S-6S batteries as input, and passes this straight through to the VOXL ESC (`MDK-M0117`) and also regulates the voltage down to 5VDC. Output form the power module (`M0041-J1`), the 5V/6A rated regulator powers VOXL2 (`MDK-M0054`) and provides power monitoring information over I2C (to `voxl-px4` over DSP, not apps_proc) through the power connector (`M0054-J4`). **Debug Connections** Once powered, a user can connect to a linux based terminal though the USBC connector (`M0054-J9`) using Android Debug bridge (adb). Additionally, once initially setup over adb, a user can interact with VOXL2 over a network (ssh, `voxl-portal`) using the Wi-Fi add-on kit (`MDK-M0078`). **Image Sensors** Two stereo pairs (ov7521, VGA, black and white, 30FPS) connect to VOXL2 (`M0054-J6` and `M0054-J8`) using interposers `M0076`, `M0074` and `M0010`. A tracking sensor (ov7521, VGA, black and white, 30FPS) and hires (imx214, 4K, 30FPS) connect to VOXL2 `M0054-J7` using the `M0084` dual camera flex. **Flight Controller** The VOXL ESC (`MDK-M0117`) communicates over UART to `voxl-px4` between `M0117-J2` and `M0054-J18`. The VOXL2 GPS/Mag/RC bind assembly (`MDK-M0094`) is a possible solution for GPS (UART) Mag (I2C) and RC (UART). Both communicate to `voxl-px4` over a UART and I2C (exposed from DSP, not apps_proc) This kit uses Ublox Neo-M8N/IST8310 from Holybro. The RC is Spektrum DSMX (mainly for legacy reasons, as a bunch of past product has used it. For this reason, we continued to use it. The snapdragon processors can't make a UART RX into an TX at run time. For this reason, we have to use a GPIO to handle binding the RC, hench the little `M0094` binding board you see in this assembly.) ---
## Software The following VOXL2 Platform Releases have been validated with the hardware above ### VOXL2 SDK 1.1.3 #### Summary | | | |-------|-------| | Release Date | 2023-Mar-30 | | Download location | [VOXL 2 Platform Releases](https://modalai.filecloudonline.com/ui/core/index.html#expl-tabl./SHARED/downloads/VOXL%202%20Platform%20Releases), see `VOXL2 SDK 1.1.3`. | | File name| `voxl2_SDK_1.1.3.tar.gz`| | System Image / VOXL SDK | 1.7.4 / 1.1.3 | | PX4 | [VOXL PX4 1.14 based branch](https://github.com/modalai/px4-firmware/tree/voxl-dev) | #### MPA Configuration Command To setup the VOXL SDK to use the above hardware configuration, run the MPA command listed below. |-------|-------| | MPA command | `voxl-configure-mpa -p --family MRB-D0006-4-V1-C11` | #### SW Block Diagrams Below are two block diagrams covering |-------|-------| | `voxl-camera-server` | ![D0006-C11-M13-T1-SW-voxl-camera-server](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1-SW-voxl-camera-server.jpg)
- view this drawing in [fullsize](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1-SW-voxl-camera-server.jpg), view drawing [source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0006/D0006-C11-M13-T1-SW.drawio) (using [this tool](https://github.com/jgraph/drawio-desktop/releases)) | | `voxl-px4` | ![D0006-C11-M13-T1-SW-voxl-px4](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1-SW-voxl-px4.jpg)
- view this drawing in [fullsize](https://gitlab.com/voxl-public/support/drawings/-/raw/master/D0006/D0006-C11-M13-T1-SW-voxl-px4.jpg), view drawing [source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0006/D0006-C11-M13-T1-SW.drawio) (using [this tool](https://github.com/jgraph/drawio-desktop/releases)) |
#### SW Theory of Operation **Summary** VOXL2 runs Linux (Ubuntu 18). A collection of user space applications run on bootup as systemd services to facilitate the various requirements of the architecture. These applications ([open source](https://gitlab.com/voxl-public/voxl-sdk), mainly C/C++) communicate between each other using linux named pipes using the light weight [Modal Pipe Architecture](/mpa/). To facilitate installation and setup, ModalAI ships the [VOXL SDK](/voxl-sdk/) that allows a simple setup. **SDK** The VOXL2 SDK is a a zip file that contains an install script, the [VOXL2 System Image](/voxl2-system-image/) (kernel, root file system) and the [VOXL SDK](/voxl-sdk/), which is a collection of open source software packages. The VOXL SDK comes with a `voxl-configure-sku` tool that can be used to configure the software to work out of the box on a given hardware architecture, such as this `D0006`. **voxl-px4** In SDK 1.1.3, `voxl-px4` is based off of PX4 1.14 and located in this [branch](https://github.com/modalai/px4-firmware/tree/voxl-dev). More developer information is available in the [VOXL2 PX4 Developer Guide](/voxl-px4-dev-build-guide/). More user information is available in the [VOXL2 PX4 User Guide](/voxl-user-guides/). All communications to ground control stations from `voxl-px4` are facilitated through `voxl-mavlink-server` and `voxl-vision-px4` over an IP link. See [quick start video](https://www.youtube.com/watch?v=aVHBWbwp488). Below are links to some of the drivers that are called out above. |--------|-------|------| | Use | Driver | Interface | |--- |--- |--- | | Power Monitoring |[src/drivers/power_monitor/voxlpm](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/power_monitor/voxlpm) | `M0054-J4` | | ESC | [src/drivers/uart_esc/modalai_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/uart_esc/modalai_esc) | `M0054-J18`| | IMU | [src/drivers/imu/invensense/icm42688p](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/imu/invensense/icm42688p) | internal IMU | | BARO | [src/drivers/barometer/icp10100](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/barometer/icp10100) | internal BARO | | RC | [src/drivers/spektrum_rc](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/spektrum_rc) | `M0054-J19 pins 10/11` | | GPS | [src/drivers/gps](https://github.com/modalai/px4-firmware/tree/voxl-dev-1.12/src/drivers/gps) | `M0054-J19`, GNSS `pins 2/2`, Mag `pins 4/5` | **Other Services** Below are links and summaries of the other services that are expected to be running by default: |--------|-------|------| | Service | Summary | Interface | |--- |--- |--- | | [voxl-camera-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server) | HAL3 based application used to serve up MIPI camera frames to multiple MPA clients, such as `voxl-portal` | `M0054 J6/J7/J8`, MPA | | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | provides an MPA interface to perform MAVLink communication to/from a PX4 flight controller over UART or UDP | IP/UART/MPA | | [voxl-vision-hub](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | Acts as the main hub managing communication between VOXL MPA services and autopilots such as PX4 and Ardupilot | IP/MPA | | [voxl-imu-server](https://gitlab.com/voxl-public/Deprecated/apq8096-imu-server) | For computer vision use cases, this application serves up IMU data to be fused with vision data (different IMU than PX4) | SPI/MPA | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | embedded web server with ever expanding feature set | MPA/HTTP/REST | | [voxl-qvio-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | QVIO processing server | MPA | | [voxl-cpu-monitor](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-cpu-monitor) | Tool used to monitor CPU usage and account for Snapdragon scaling, etc. | MPA | | [voxl-wait-for-fs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/scripts/voxl-wait-for-fs) | Helper service to flush files to disk on cycle | NA | --- Source: https://docs.modalai.com/voxl2-d0014/ # VOXL 2 - D0014 Architecture (Starling 2) --- # Hardware --- ## VOXL2 - D0014-4-CXX-M22-TX ### Summary The Starling 2 `D0014-4-CXX-M22-TX` configuration consists of: - `D0014-4` - Starling 2 Family - VOXL ESC Mini with built in power management - 120mm Folding Propellers, 1504 Brushless Motors, Single 2S battery - `CXX` - `C26` - Dual AR0144, IMX412, LIOW2 TOF - `C27` - Triple AR0144, IMX412, LIOW2 TOF - `M22` - WiFi modem config - `TX` - `T7` - ELRS - `T9` - Ghost ### Block Diagram Below describes the compute HW block diagram for the `D0014-4-CXX-M22-TX` configuration. [![CWD-D0014-4-CXX-M22-TX](/images/d0014/CWD-D0014-4-CXX-M22-TX-REV4.jpg)](/images/d0014/CWD-D0014-4-CXX-M22-TX-REV4.jpg) [View in fullsize](/images/d0014/CWD-D0014-4-CXX-M22-TX-REV4.jpg){:target="_blank"} [Diagram draw.io Source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0014/CWD-D0014-4-CXX-M22-TX-REV4.drawio) Additional camera configs: [![CWD-D0014-4-CXX-M22-TX](/images/d0014/D0014-C29.jpg)](/images/d0014/D0014-C29.jpg) ## VOXL2 - D0012-4-CXX-M22-TX ### Summary The Starling 2 Max `D0012-4-CXX-M22-TX` configuration consists of: - `D0012-4` - Starling 2 Family - VOXL ESC Mini with built in power management - 180mm Tri-Blade Propellers, 2203.5 Brushless Motors, Dual 2S battery - `CXX` - `C28` - Dual AR0144, Dual IMX412 - `M22` - WiFi modem config - `TX` - `T7` - ELRS - `T9` - Ghost ### Block Diagram See above # Software - Supported VOXL SDK: 1.3+ - Supported Kernels (config 1): `m0054-1-var00.1-kernel.img`, `m0054-2-var02.1-kernel.img` # Platform Features ## VOXL2 Driven Image Sensor Synchronization In the D0014/D0012 architecture using the M0173 breakout, the following occurs for the tracking sensors: - The [voxl-fysnc-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fysnc-mod) ships in SDK 1.3+ and defaults to use GPIO 109, 30Hz, and disabled. - When a C26/C27/C8 image sensor configurations is setup using `voxl-configure-cameras`, the config file at `/etc/modalai/voxl-camera-server.conf` is setup with: ``` ... "fsync_en": true, "fsync_gpio": 109, ... ``` - When camera server runs, it will use the `voxl-fsync-mod` params exposed to the file system at `/sys/module/voxl_fsync_mod/parameters`, for example `enabled`, `gpio_num`, and enable the sync pulse at the default 30Hz. - When a C26/C27/C8 image sensor configurations is setup using `voxl-configure-cameras`, the `AR0144` drivers are copied into `/usr/lib/camera` that are setup for slave mode and will capture sychronized frames at the rate defined (note: the FPS should also be configured in `/etc/modalai/voxl-camera-server.conf` accordinly to ensure proper register settings are loaded) [![D0014-M0173.jpg](/images/d0014/D0014-M0173.jpg)](/images/d0014/D0014-M0173.jpg) ## Downward Range Finder and FLIR Lepton In the D0014/D0012 architecture using the M0173 breakout: - VL53L1CX Range Finder is accesible over `/dev/i2c-4`, see `/etc/modalai/voxl-rangefinder-server.conf` and `voxl-rangefinder` - FLIR Lepton is accessible over `/dev/i2c-4` and `/dev/spidev0.0`. Supported in VOXL SDK 1.3.1 and newer, see `/etc/modalai/voxl-lepton-server.conf` and [voxl-lepton-server](/voxl-lepton-server/) [![D0014-M0157.jpg](/images/d0014/D0014-M0157.jpg)](/images/d0014/D0014-M0157.jpg) ## New Kernel Configuration for M0173 The `D0014/D0012` drone family uses the new kernel `config 1` (as opposed to `config 0`). See `/sys/module/voxl_platform_mod/parameters/config` to verify proper kernel config. --- Source: https://docs.modalai.com/voxl2-D0015/ # VOXL 2 - D0015 Architecture (SoloGood Delta Fixed Wing) --- # VOXL 2 - D0015 --- ## Hardware ### Summary The `D0015` configuration is used in the base SoloGood Delta Wing reference drone model. - `SoloGood Delta Wing` - Fixed Wing Family - `M0054` - VOXL 2 Board - `M0048` - Microhard Modem - `M0065` - VOXL 2 IO Board - `M0022` - PWM Breakout Board - `UBEC` - 5V Battery Elimination Circuit (servo and ESC power) - `mRo I2C Airspeed Sensor` - Airspeed Sensor - `MAX-M10S GPS Module` - GPS Module - `Lightware SF000` - Distance Sensor (via UART) - `Ghost Atto` - RC Controller - `M10000011` - VOXL Cooling Fan - `AuviPal 90 degree USB C Adapter` - 90 degree USB-C Male to USB-C Female adapter
### Components The following core hardware is used for that configuration (note in this list we are excluding the motor, Air Speed Sensor, battery, and transmitter): | Part Number | Kit Contents | |--------------------|-------------------------------------------------------------------------| | MDK-M0054-1--1-C11 | M0054 - VOXL 2 | | MDK-M0041-1-B-01 | VOXL Power Module v3 and cable | | MDK-M0065-1-00 | VOXL IO | | MDK-M0022-1-01 | PWM Breakout Board | | MDK-M0048-3-01 | VOXL 2 Microhard Addon | | OEM-M0048-1 | Microhard Modem | | M10-5883 | GNSS GPS Module & Compass | | MCBL-00089* | 12-pin JST to ESC, GPS JST + RC 4-pin | | MCBL-00031 | Passthrough Wires | | UBEC (COTS) | 5V battery elimination circuit for servo/ESC power | * You will need to splice the MCBL-0089 to connect the 5V power from J19 to the air speed sensor. ### HW Block Diagram Below describes the compute HW block diagram for the `D0015` configuration. [![D0015-V1-compute-wiring](/images/outside-drone/fixed-wings/d0015.jpg)](/images/outside-drone/fixed-wings/d0015.jpg) # HW Theory of Operation ## Power The VOXL Power Module (MDK-M0041) accepts 2S-6S batteries as input, and passes this straight through to the ESC and also regulates the voltage down to 5VDC. Output form the power module (M0041-J1), the 5V/6A rated regulator powers VOXL 2 (MDK-M0054) and provides power monitoring information over I2C (to voxl-px4 over DSP, not apps_proc) through the power connector (M0054-J4). ### Servo and ESC Power As shown in the HW block diagram above, the servos and the ESC are powered from an external UBEC (5V battery elimination circuit). The UBEC's 5V output is injected into the 5V rail of the M0022 PWM breakout board through the 5V pin of Channel 8, powering the servo rail. The channel fed from the VOXL 2 IO board has its 5V pin not connected. > The VOXL 2 IO board's own 5V output is a low-power reference only and must NOT be used to power servos or the ESC. ## Flight Controller The VOXL 2 IO Board (MDK-M0065) communicates over UART to `voxl-px4` between `M0065-J4` and `M0054-J18`. The RC is Ghost Atto, which can use GHST protocol or SBUS protocol. The Atto is connected to the VOXL 2 IO Board (MDK-M0065) on port J3. Setting Ghost to SBUS will be covered in the SW Setup section below. The VOXL 2 GPS/Mag/Airspeed bind assembly is a possible solution for GPS (UART) Mag (I2C), and Air Speed Sensor (I2C). Both communicate to `voxl-px4` over a UART and two I2C ports (exposed from DSP, not apps_proc) This kit uses Ublox MAX-M10S and I2C Airspeed Sensor form mRo. Optionally: A LightWare SF000 can be attached using UART, this will require modifying the fixed wing's frame to allow for the Lidar to see out. If the lidar is being used, a connection to the VOXL 2 (M0054-J19) can be made. ## SW Setup - SDK 1.1.3-1 or later ### VOXL Software #### voxl-modem Documentation on configuring the RC can be found [here](/voxl2-rc-configs/). Documentation on the Hardware setup for the Microhard setup can be found [here](/microhard-add-on-manual/). Communication between the fixed wing and ground station should be done through the Microhard Modem Hat. Which needs to be configured on the VOXL 2 using the command `voxl-configure-modem`. ``` VOXL 2:/$ voxl-configure-modem Starting interactive mode What type of modem are you using? 1) v2 3) dtc 5) quectel 2) microhard 4) doodle 6) em9191 #? 2 Enter the IP address you would like to the VOXL to use on the Microhard network: Note: The chosen IP address must be of the form: 192.168.168.XXX Default - 192.168.168.100 1) default 2) custom #? 1 ``` This will set the IP of the VOXL 2 to the default IP which is `192.168.168.100`. #### voxl-px4 Using the VOXL 2 IO board is necessary to control the ESC and the Servo Motors for the fixed wing. This requires voxl-px4 to be configured differently then ModalAI drones like the Starling, Sentinel, etc. Documentation on how to setup the VOXL 2 IO board can be found [here](/voxl2-io-user-guide/). ### PX4 Software #### px4-Parameters At the time of writing this, `voxl-px4` does't have a pre-configure command for fixed-wings. so we will have to change some of the specific parameters on `voxl-px4` through QGC. *At this point, it is assumed that the drone is connected accessible from QGC.* *If you are not using a lidar then you can skip steps 5 & 6.* 1. Open QGC and connect to the Drone. 2. Go into the Airframe Tab. 3. Select the Flying Wing option. 4. Click the drop-down arrow and select `Generic Flying Wing` 5. Go in to Parameters Tab. 6. Using the Search Bar, search and change the following parameters: - `SENS_EN_SF0X` to `LW20/c` #### ESC/ Servos Setup 1. Open QGC and connect to the drone. 2. Go into the Actuator Tab. 3. Under Actuator Outputs, select VOXL 2 IO Output 4. Assign the PWM channels to the respective motors. ### ArduPlane Software **Check out the demo flight [here](https://www.youtube.com/watch?v=U4OCpGAxG-A&embeds_referring_euri=https%3A%2F%2Fmail.google.com%2F&embeds_referring_origin=https%3A%2F%2Fmail.google.com&source_ve_path=Mjg2NjY)!** Refer [here](/voxl-ardupilot/) for installing ArduPlane on the VOXL #### ArduPlane Parameters #### Servos Setup 1. Open QGC or Mission Planner and connect to the drone 2. For the corresponding pin # set the SERVO[PIN#]_FUNCTION to ElevonLeft or ElevonRight corresponding with which servo is connected to which side 3. For the most range set the SERVO[PIN #]_MIN to 500, SERVO[PIN#]_MAX to 2200, and SERVO[PIN#]_TRIM to 1350 4. Make sure to adjust the flaps by hand so that they're centered [![D0015-V1-servo-params](/images/outside-drone/fixed-wings/servo1_parameters_arduplane.jpg)](/images/outside-drone/fixed-wings/servo1_parameters_arduplane.jpg) #### ESC Calibration 1. Power on the VOXL but have your ESC unpowered 2. Open QGC or Mission Planner and connect to the drone 3. Follow the official documentation for calibrating the ESC [here](https://ardupilot.org/copter/docs/esc-calibration.html) Download the parameters from our setup here: [D0015_ardplane_params](https://drive.google.com/file/d/1IXQ4VDwUX9Zjx62jpNYuaKelobNLUURd/view?usp=sharing) ***Note:*** If the ESC is beeping at boot indicating the PWM signal coming from the VOXL is below the ESC's minimum PWM range you can tune the SERVO[PIN #]_TRIM and SERVO[PIN #]_MIN to be above that ### Calibrations #### AirSpeed Sensor 1. Open QGC and connect to the Drone 2. Go into the Sensors Tab 3. Select the Airspeed option. 4. Follow the instructions on the screen. 5. Avoid the Airspeed Sensor getting any wind until prompted to. 6. when prompted blow into the airspeed sensor to create wind readings. #### GPS/Mag 1. Open QGC and connect to the Drone 2. Go into the Sensors Tab 3. Select the Compass option. 4. Follow the instructions on the screen yawing the drone in each of the orientations. ## HW Attachments ### 3D Prints [VOXL2 + VOXL IO Case](https://drive.google.com/file/d/1H6nyrZQ95JarNN_wWGAufKtjUk5KJ4D1/view?usp=drive_link) [Microhard Case & Cooling Fan Opening](https://drive.google.com/file/d/1ucxUPVfuZFlROTWHx6ykuSoPocT0sP3X/view?usp=drive_link) [GPS Case Top](https://drive.google.com/file/d/1HsXlcIEaXDYtWaAIoqoOmGXXgJfEEv-g/view?usp=drive_link) [GPS Case Bottom](https://drive.google.com/file/d/19gAELj2NLQW5XTEOD4io0HXxTpXH6PAR/view?usp=drive_link) ### FPV Camera 1. Download and print the [top nose cone](https://drive.google.com/file/d/1EKQKMJkeSPBC0C9xfJcffPzd_4MJ-Zxl/view?usp=drive_link) and [bottom nose cone](https://drive.google.com/file/d/10256Y4rUHRf4GcxBjdPQXJSyYuzy4qGx/view?usp=drive_link) for the delta wing nose cone. 2. Connect the Interposer onto the bottom of the VOXL2 to port J7. 3. Place the IMX412 into the center opening of the nose cone's bottom. 4. Connect the MIPI extender to the back of the IMX412. 5. Remove the Styrofoam piece for the FPV port on the Delta Wing 6. Route the MIPI cable through the FPV port. 7. Place the airspeed sensor's Pitot tube into the groves on the nose cone. 8. Place the nose cone top onto the top of the nose cone bottom. 9. To secure it down the top of the nose cone to the bottom you can use hot glue along the sides or tape them together. 10. Finally attach the nose cone to the front of the Delta wing, using VBS tape or Duct Tape. **Other Services** Below are links and summaries of the other services that are expected to be running by default: | Service | Summary | Interface | |--------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|---------------| | [voxl-mavlink-server](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-mavlink-server) | provides an MPA interface to perform MAVLink communication to/from a PX4 flight controller over UART or UDP | IP/UART/MPA | | [voxl-modem](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub) | Acts as the main hub managing communication between VOXL MPA services and autopilots such as PX4 and Ardupilot | IP/MPA | | [voxl-portal](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-portal) | embedded web server with ever expanding feature set | MPA/HTTP/REST | | [voxl-px4](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-qvio-server) | QVIO processing server | MPA | | [voxl-wait-for-fs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/-/blob/master/scripts/voxl-wait-for-fs) | Helper service to flush files to disk on cycle | NA | --- Source: https://docs.modalai.com/voxl2-supported-architectures/ # VOXL 2 Supported Architectures --- Source: https://docs.modalai.com/voxl2-mini/ # VOXL 2 Mini VOXL 2 Mini is ModalAI's smallest version of its [Blue UAS Framework](https://www.diu.mil/blue-uas) AI Autopilot which is a powerful companion computer with integrated flight controller and is built around the Qualcomm Flight RB5 5G Platform using the QRB5165 processor. Also see: [VOXL 2](/voxl-2/) — the full-size board with more connectors and expansion · [VOXL 2 Dev Bundles](/voxl2-development-kits/) — complete development kits. ![m0104-hand-hero](/images/voxl2-mini/m0104-hand-hero.jpg) --- Source: https://docs.modalai.com/voxl2-mini-user-guides/ # VOXL 2 Mini User Guides ![m0104-hero-bottom](/images/voxl2-mini/m0104-hero-bottom.png) ## Table of contents 1. TOC {:toc} --- Source: https://docs.modalai.com/voxl2-mini-power/ # VOXL 2 Mini Power --- ## Hardware Options ### VOXL Power Module The main power input is `J1` and can be paired with a [VOXL Power Module](/power-module-v3-datasheet/), which provides the up to 6A momentary inrush current and provides two I2C based power monitoring ICs, providing PX4 the battery status. Note, for VOXL 2 Mini, the `MDK-M0041-4` (note the `-4`) version is required, that has a 3.8VDC output instead of 5VDC. ![m0104-user-guides-power.jpg](/images/voxl2-mini/m0104-user-guides-power.jpg) M0104 J1: - Connector on board: Molex 2059-72-0041 - Mating connector: 2059792041 ![m0104-j1-m0041](/images/voxl2-mini/m0104-j1-m0041.jpg) ### VOXL Mini ESC - 4-in-1 The main power input is `J1` and the 3.8V and GND pins can be paired with the output of the VOXL Mini ESC's regulated output. The battery status information is sent over UART to either the [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) (SDK 1.1.1+) or [modal_io](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) through J19 instead of the I2C bus on J1. For bi-direction UART communications, connect VOXL 2's `J19` connector to the VOXL Mini ESC's (M0129) `J1` using [MCBL-00015](/cable-datasheets/#mcbl-00015) or building your own following this. ![m0104-m0129](/images/voxl2-mini/m0104-m0129.jpg) ## LEDs The `D1` LED illuminates green when the 3.3V regulator is reporting "good". The `D2` LED illuminates green when the 5.0V USB bus regulator is reporting "good". More info about the other LEDs can be located [here](/voxl2-mini-leds/) ## Software ### Checking Battery Status With the VOXL PM attached, you check the battery using `px4-listener battery_status` command after getting a shell to VOXL 2. Here's an example from a 2S battery: ``` px4-listener battery_status TOPIC: battery_status battery_status_s timestamp: 1080175258 (0.059704 seconds ago) voltage_v: 7.2224 voltage_filtered_v: 7.2224 current_a: 0.1758 current_filtered_a: 0.1791 average_current_a: 0.0000 discharged_mah: 51.6742 remaining: 1.0000 scale: 1.0000 temperature: nan cell_count: 2 voltage_cell_v: [3.6662, 3.6662, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000] max_cell_voltage_delta: 0.0000 capacity: 0 cycle_count: 0 run_time_to_empty: 0 average_time_to_empty: 0 serial_number: 0 manufacture_date: 0 state_of_health: 0 max_error: 0 interface_error: 0 connected: True source: 0 priority: 0 id: 1 is_powering_off: False warning: 0 ``` ### voxlpm PX4 Driver The [voxlpm](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/power_monitor/voxlpm) PX4 driver monitors both battery and companion computer regulated voltage. The driver runs in PX4 on the DSP, and interfaces through SSC QUP2. You can't get to this I2C bus through Ubuntu at this time. ### voxl_esc PX4 Driver The [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) PX4 driver monitors both battery via the VOXL Mini ESC. The driver runs in PX4 on the DSP, and interfaces through SSC QUP2. ### modal_io PX4 Driver The [modal_io](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) PX4 driver monitors both battery via the VOXL Mini ESC. The driver runs in PX4 on the DSP, and interfaces through SSC QUP2. --- Source: https://docs.modalai.com/voxl2-mini-usb-connections/ # VOXL 2 Mini USB Connections --- ## Summary There are two USB interfaces. |--- |--- | | J3 | a 10-pin JST-GH USB3 interface. Note: you can use the lower 4 pins only for a USB2 interface and reduce wire count. For USB3, see [MCBL-00022-2](/cable-datasheets/#mcbl-00022) | | J9 | a USBC interface, typically used to access the ADB shell. Note: this can also be used as a USB Host for adding debug peripherals like ethernet adapters for benchtop use | ![m0104-user-guides-usb](/images/voxl2-mini/m0104-user-guides-usb.jpg) ## J3 - USB3 10-Pin JST [MCBL-00022-2](/cable-datasheets/#mcbl-00022) is recommended. Example using a wired ethernet adapter connected to J3 ([Cable Creation USB to Ethernet](https://www.amazon.com/Network-Adapter-CableCreation-Ethernet-Supporting/dp/B013G4C8RE)) ![m0104-mcbl-00022-2-J3-0.jpg](/images/voxl2-mini/m0104-mcbl-00022-2-J3-0.jpg) Example using a wireless ethernet adapter connected to J3 (Alfa Network AWUS036ACS 802.11ac AC600) ![m0104-mcbl-00022-2-J3-1.jpg](/images/voxl2-mini/m0104-mcbl-00022-2-J3-1.jpg) ## J9 - Debug USB ### J9 - Primary - ADB Inteface The primary use case for 'J9' is for gaining shell access using ADB. See [VOXL 2 Mini Shell Access](/voxl2-mini-shell-access/) for more information. It is recommended to use a USBC to USB type A cable, and we like flexible cables to prevent too much torque on the J9 connector introduced by thicker, inflexible cables. ![m0104-j9-usbc-to-usba](/images/voxl2-mini/m0104-j9-usbc-to-usba.jpg) ### J9 - Secondary - USBC Host Mode > we recommend using this for debug purposes, and don't recommend using this port in final product as it prevents you from access to perform system updates. > shown is a USBC to USBA (as these were the peripherals available to serve as an example, but direct USBC also are OK) ![m0104-mcbl-00022-2-J9-0.jpg](/images/voxl2-mini/m0104-mcbl-00022-2-J9-0.jpg) ![m0104-mcbl-00022-2-J9-1.jpg](/images/voxl2-mini/m0104-mcbl-00022-2-J9-1.jpg) --- Source: https://docs.modalai.com/voxl2-mini-shell-access/ # VOXL 2 Mini Shell Access --- ## Summary There are two primary ways to access the VOXL 2 Mini shell: |--- |--- | | J9 | using the USBC connection, you can connect to a host computer running Android Debug Bridge | | J3 | using the USB3 interface, you can connect ethernet/wireless adapters and connect via SSH | ![m0104-user-guides-usb](/images/voxl2-mini/m0104-user-guides-usb.jpg) ## ADB See [setup ADB page](/setting-up-adb/) if you have not setup ADB on your host PC. We recommend using a USBC to USBA flexible type cable to prevent too much torque on the J9 connector. ![m0104-j9-usbc-to-usba](/images/voxl2-mini/m0104-j9-usbc-to-usba.jpg) Here is an example screen shot that shows: - running the `adb devices` command to list connected VOXL 2 Mini device to the host PC - running the `adb shell` command to open a terminal running on VOXL 2 Mini ![m0104-adb-terminal](/images/voxl2-mini/m0104-adb-terminal.jpg) ## SSH To setup the hardware, see the [VOXL 2 Mini USB Connection](/voxl2-mini-usb-connections/) page. First you need to use the ADB method to get to a shell ;) If using wireless, run the `voxl-wifi` utility to setup either in station mode or SoftAP mode. If using wired ethernet, set up a static IP address. Once this is done, you can disconnect the adb connection and add the network connection. --- Source: https://docs.modalai.com/voxl2-mini-image-sensors/ # VOXL 2 Mini Image Sensors --- # Overview ## Summary In general, the process for selecting image sensors and interposers are use case specific, but there are some common use cases that the VOXL ecosystem supports out of the box. The following describe two configurations that are available as development kits. Lower on this page, general information about the interposers and image sensors will be listed that provide customization options. ## Please, Don't Hot Swap! When playing with the hardware, please ensure you unplug VOXL 2 Mini from the power supply and USB when changing image sensors. If you have the system powered on, you can damage things! ## Stereo Flex not Currently Supported The [stereo sensor flex](/M0010) is not currently supported in the VOXL 2 Mini camera configurations. # Development Kit Configurations ## MDK-M0104-1-C4 - Hires, Tracking ### Hardware Setup | M0104 Connector | Interposer | Sensor | HW ID | |--- |--- |--- |--- | | J6 | | | | | - | | | | | J7 | M0135 JL | Tracking ([M0014](/M0014/) ) | 2 | | - | M0135 JU | Hires ([M0025-2](/M0025/) ) | 3 | ![MDK-M0104-C4-a](/images/voxl2-mini/MDK-M0104-1-C4-a.jpg) ![MDK-M0104-C4-b](/images/voxl2-mini/MDK-M0104-1-C4-b.jpg) ### Software Setup Run the following command on target to configure. ```bash voxl-configure-cameras 04 ``` To check the camera streams, run `voxl-inspect-cam -a`: ![MDK-M0104-C4-inspect-cam](/images/voxl2-mini/MDK-M0104-1-C4-inspect-cam.jpg) ## MDK-M0104-1-C6 - ToF, Hires, Trackings ### Hardware Setup | M0104 Connector | Interposer | Sensor | HW ID | |--- |--- |--- |--- | | J6 | M0076 | ToF([M0040](/M0040/) ) | 0 | | - | | | | | J7 | M0135 JL | Hires ([M0025-2](/M0025/) ) | 2 | | - | M0135 JU | Tracking ([M0014](/M0014/) ) | 3 | ![MDK-M0104-1-C6-a](/images/voxl2-mini/MDK-M0104-1-C6-a.jpg) ![MDK-M0104-1-C6-b](/images/voxl2-mini/MDK-M0104-1-C6-b.jpg) ### Software Setup Run the following command on target to configure. ```bash voxl-configure-cameras 06 ``` You can check the image sensor status using `voxl-inspect-cam -a`: ![MDK-M0104-C6-inspect-cam](/images/voxl2-mini/MDK-M0104-1-C6-inspect-cam.jpg) # Hardware Information ## Camera Configuration Summary There are four 4-lane CSI and four CCI interfaces exposed on two connectors, J6 and J7. - J6 - CCI0/CSI0 and CCI1/CSI1, representing HW IDs 0/1 respectively - J7 - CCI2/CSI2 and CCI3/CSI3, representing HW IDs 2/3 respectively ![m0104-image-sensors-config](/images/voxl2-mini/m0104-image-sensors-config.jpg) Custom flexes can be made to interface to J6/J7, or the following interposers can be used. ## Interposers The VOXL 2 Mini (board ID `M0104`) ecosystem consists of "interposers" to provide image sensor connections to the board. These interposers route the image sensor contral and data, and also interfaces like SPI/UART/I2C/GPIO in some cases. The focus of this document is just image sensor connections. ### M0135 - Dual Sensor Interposer - QTY 2 Sensors - [M0135 Datasheet](/M0135) - M0104 connectors: J6 or J7 ![m0104-m0135-overview-0](/images/voxl2-mini/m0104-m0135-overview-0.jpg) ![m0104-m0135-overview-1](/images/voxl2-mini/m0104-m0135-overview-1.jpg) ### M0076 - Single Sensor Interposer - QTY 1 Sensor - [M0076 Datasheet](/m0076) - M0104 connectors: J6 or J7 ![m0104-m0076-overview-0](/images/voxl2-mini/m0104-m0076-overview-0.jpg) ![m0104-m0076-overview-1](/images/voxl2-mini/m0104-m0076-overview-1.jpg) ### M0084 - Dual Sensor Flex - QTY 2 Sensors - [M0084 Datasheet](/M0084) - M0104 connectors: J6 or J7 ![m0104-m0084-overview-0](/images/voxl2-mini/m0104-m0084-overview-0.jpg) ![m0104-m0084-overview-1](/images/voxl2-mini/m0104-m0084-overview-1.jpg) ## Image Sensors ### Tracking - Limitations: total 4 concurrent Tracking Sensors at once on VOXL 2 Mini | Image Sensor Type | Part Number | VOXL 2 Mini Connector | Interposer | Interpose Connector | Sensor HW ID | |-------------------|------------- |----------------------- |------------|--- |--- | | Tracking | [M0014](/M0014) | M0104 J6 | M0135 | JL | 0 | | Tracking | [M0014](/M0014) | M0104 J6 | M0135 | JU | 1 | | Tracking | [M0014](/M0014) | M0104 J7 | M0135 | JL | 2 | | Tracking | [M0014](/M0014) | M0104 J7 | M0135 | JU | 3 | | Tracking | [M0014](/M0014) | M0104 J6 | M0076 | J1 | 1 | | Tracking | [M0014](/M0014) | M0104 J7 | M0076 | J1 | 2 | | Tracking | [M0014](/M0014) | M0104 J6 | M0084 | JL | 0 | | Tracking | [M0014](/M0014) | M0104 J6 | M0084 | JU | 1 | | Tracking | [M0014](/M0014) | M0104 J7 | M0084 | JL | 2 | | Tracking | [M0014](/M0014) | M0104 J7 | M0084 | JU | 3 | ### ToF - Limitations: **total 2 concurrent ToF Sensors at once on VOXL 2 Mini** | Image Sensor Type | Part Number | VOXL 2 Mini Connector | Interposer | Interpose Connector | Sensor HW ID | |-------------------|------------- |----------------------- |------------|--- |--- | | ToF | [M0040](/M0040) | M0104 J6 | M0135 | JL | 0 | | ToF | [M0040](/M0040) | M0104 J6 | M0135 | JU | 1 | | ToF | [M0040](/M0040) | M0104 J7 | M0135 | JL | 2 | | ToF | [M0040](/M0040) | M0104 J7 | M0135 | JU | 3 | | ToF | [M0040](/M0040) | M0104 J6 | M0076 | J1 | 1 | | ToF | [M0040](/M0040) | M0104 J7 | M0076 | J1 | 2 | | ToF | [M0040](/M0040) | M0104 J6 | M0084 | JL | 0 | | ToF | [M0040](/M0040) | M0104 J6 | M0084 | JU | 1 | | ToF | [M0040](/M0040) | M0104 J7 | M0084 | JL | 2 | | ToF | [M0040](/M0040) | M0104 J7 | M0084 | JU | 3 | ### Hires - Limitations: **total 2 concurrent Hires Sensors at once on VOXL 2 Mini** | Image Sensor Type | Part Number | VOXL 2 Mini Connector | Interposer | Interpose Connector | Sensor HW ID | |-------------------|------------- |----------------------- |------------|--- |--- | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J6 | M0135 | JL | 0 | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J6 | M0135 | JU | 1 | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J7 | M0135 | JL | 2 | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J7 | M0135 | JU | 3 | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J6 | M0076 | J1 | 1 | | ToF | [M0025](/M0025), [M0061](/M0061) + flex | M0104 J7 | M0076 | J1 | 2 | | ToF | [M0025](/M0025), [M0061](/M0061) | M0104 J6 | M0084 | JL | 0 | | ToF | [M0025](/M0025), [M0061](/M0061) | M0104 J6 | M0084 | JU | 1 | | ToF | [M0025](/M0025), [M0061](/M0061) | M0104 J7 | M0084 | JL | 2 | | ToF | [M0025](/M0025), [M0061](/M0061) | M0104 J7 | M0084 | JU | 3 | ## Beta Configurations The following are not supported by the `voxl-configure-mpa` setup and are considered beta level. ### Dual ToF, Dual Tracking #### Hardware Setup ![m0104-dual-tof-dual-tracking](/images/voxl2-mini/m0104-dual-tof-dual-tracking.jpg) #### Software Setup ``` camera-server-config-helper tof0:pmd-tof:0 tracking0:ov7251:1 tof2:pmd-tof:2 tracking1:ov7251:2 ``` ### Quad Tracking > QVIO currently only supports a single input. #### Hardware Setup ![m0104-quad-tracking](/images/voxl2-mini/m0104-quad-tracking.jpg) #### Software Setup ``` camera-server-config-helper tracking0:ov7251:0 tracking1:ov7251:1 tracking2:ov7251:2 tracking3:ov7251:3 ``` --- Source: https://docs.modalai.com/voxl2-mini-rc-configs/ # VOXL 2 Mini Remote Controller Configurations --- ## Summary We are working to expand the capabilities of VOXL 2 every day. The built-in PX4 flight controller enables industry leading SWAP for an autonomous flight controller, but not every interface and flight controller are supported yet. This page provides an overview of available connectivity. If this connectivity is insufficient for your application, VOXL 2 is a world-class companion computer for autonomous navigation and AI when paired with an [external flight controller](/voxl2-external-flight-controller/). ## Remote Controller Options for Built-in Flight Controller | Interface | Protocol | Includes Telemetry | Instructions | Adapter | Example Hardware | |-------------------|--------------|--------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------|------------------| | ELRS | CRSF/UART | Yes | CRSF raw | | Beta FPV | | TBS Crossfire | UART | Yes | MAVLink and CRSF raw | | Nano | | WiFi | IP / Mavlink | No | [VOXL 2 Wifi Dongle User Guide](/wifi-setup/) [Connect QGC over WiFi](/qgc-wifi/) | | | | Microhard | IP / Mavlink | No | [Microhard Add-on Manual](/microhard-add-on-manual/) | | | | Doodle Labs | IP / Mavlink | No | [Doodle Labs User Guide](/doodle-labs-user-guide/) | | | | Cellular | IP / Mavlink | No | [4G](/lte-v2-modem-user-guide/) or [5G](/5G-Modem-user-guide) with voxl-vpn | | | | Spektrum (DSMX) | UART | No | Not yet supported | | | | Graupner | | No | Not yet supported | | | | FrSky | | No | Not yet supported | | | | Futaba | | No | Not yet supported | | | ## CRSF ### Hardware **PLEASE NOTE**: default CRSF baud rate used by `voxl-px4` is 420k. - [CRSF baud](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4-start#L197) - [MAVLink baud](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4-start#L200) Tested hardware: - TBS Crossfire Nano Rx (in both CRSF and MAVLink mode) - Beta FPV 900 Nano ![m0104-user-guides-rc](/images/voxl2-mini/m0104-user-guides-rc.jpg) M0104 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S ### Software #### Setting PX4 to Use CRSF See file at `/etc/modalai/voxl-px4.conf`. This file is loaded from [boards/modalai/voxl2/target/voxl-px4](https://github.com/PX4/PX4-Autopilot/blob/main/boards/modalai/voxl2/target/voxl-px4). The previous script calls this script with command line args to start CRSF, [boards/modalai/voxl2/target/voxl-px4-start](https://github.com/PX4/PX4-Autopilot/blob/main/boards/modalai/voxl2/target/voxl-px4-start). #### Checking Status The `px4-listener input_rc` or `px4-listener rc_channels` command can be used to trouble shoot, if neither have been published it's likely the receiver has yet to get RC data or the serial link isn't working. #### PX4 Driver [src/drivers/rc/crsf_rc](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/rc/crsf_rc) ## Troubleshooting Binding procedures, the UART/processor rules, and the RC troubleshooting ladder are documented on the [VOXL 2 RC Configs](/voxl2-rc-configs/#troubleshooting) page and apply to VOXL 2 Mini as well. --- Source: https://docs.modalai.com/voxl2-mini-esc-configs/ # VOXL 2 Mini ESC Configurations --- ## Summary We are working to expand the capabilities of VOXL 2 every day. The built-in PX4 flight controller enables industry leading SWAP for an autonomous flight controller, but not every interface and flight controller are supported yet. This page provides an overview of available connectivity. If this connectivity is insufficient for your application, VOXL 2 is a world-class companion computer for autonomous navigation and AI when paired with an [external flight controller](/voxl2-external-flight-controller/). ## ESC Options for Built-in Flight Controller | Protocol | Driver | Instructions | Max Number of Channels | Example Hardware | |----------|--------------------------------------------------------------------------------------------------|------------------------------------------------------------|------------------------|---------------------------------------------------| | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL 4-in-1 ESC](/voxl-esc-datasheet/) | | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL Mini 4-in-1 ESC](/voxl-mini-esc-datasheet/) | | UART | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | Below | 4 | [VOXL FPV 4-in-1 ESC](/voxl-fpv-esc-datasheet/) | | PWM | [voxl2_io](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/voxl2_io) | [VOXL 2 IO](/voxl2-io-user-guide/) | 8 | [VOXL 2 IO](/voxl2-io/) | | DSHOT | voxl2_io in development | Not yet supported | 8 | | > The modal_io driver was renamed to voxl_esc in SDK 1.1.1+, more information can be found in the VOXL ESCs section. ## VOXL ESC - 4-in-1 ### Hardware Setup For bi-direction UART communications, connect VOXL 2's `J19` connector to the VOXL ESC's (M0049 or M0117) `J2` using [MCBL-00081](/cable-datasheets/#mcbl-00081) or building your own following this. ![m0104-user-guides-esc.jpg](/images/voxl2-mini/m0104-user-guides-esc.jpg) > J2 pin 1 is the end nearest the J3 connector and is marked with a dot on the board silkscreen — count pins from there. Pin 1 is a 3.3V reference output (VREF_OUT), not a no-connect; leave it unwired. M0049/M0117 J2: - Connector on board : Hirose DF13A-6P-1.25H - Mating connector : DF13-6S-1.25C M0104 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S #### VBAT Power and Motors Use standard installation processes following the [datasheet](/voxl-esc-datasheet/) pinouts. ### Software Setup #### Checking Status If your voxl2 mini has SDK 1.1.1+ or newer, you can use the `px4-qshell voxl_esc status` command to access the driver which has debug info and tools. If you are on an older SDK, the `px4-qshell modal_io status` command can be used. The `px4-listener esc_status` can be used to check status of published topics. #### PX4 Driver The PX4 parameters that are used by the system are [here](/modal-esc-px4-user-guide/#px4-params) For example, if you need to change the motor ordering or min/max RPMs, these are params you will want to tweak. The driver source code for voxl_esc [is here](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) for reference. The driver source code for modal_io [is here](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc). When PX4 runs on VOXL2, [this is where voxl_esc is started](https://github.com/modalai/px4-firmware/blob/voxl-dev/boards/modalai/voxl2/target/voxl-px4-start#L115) using SDK 1.1.1+ and [this is where modal_io is started](https://github.com/PX4/PX4-Autopilot/blob/main/boards/modalai/voxl2/target/voxl-px4-start#L94) on older SDKs. #### How to Spin Motors - Use the `actuator_test` command, for example `actuator_test set -m 1 -v 0.05 -t 10`, which spins PX4 motor 1 for 10 seconds - Use the motor test feature in QGC. ## VOXL Mini ESC - 4-in-1 ### Hardware Setup For bi-direction UART communications, connect VOXL 2's `J19` connector to the VOXL Mini ESC's (M0129) `J1` using [MCBL-00082](/cable-datasheets/#mcbl-00082) or building your own following this. ![m0104-m0129](/images/voxl2-mini/m0104-m0129.jpg) M0129 J1: - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S M0104 J19: - Connector on board : SM12B-GHS-TB(LF)(SN) - Mating connector : GHR-12V-S ## PWM ESC Option PWM ESCs can be used with VOXL 2 and VOXL 2 Mini's built in flight controller. Due to the lack of PWM output on the Qualcomm QRB5165 chipset, an external PWM generator is required. The VOXL 2 ecosystem supports the [VOXL 2 IO](/voxl2-io/). To use the VOXL 2 IO to control PWM ESCs follow the [VOXL 2 IO User's Guide](/voxl2-io-user-guide/) --- Source: https://docs.modalai.com/voxl2-mini-onboard-sensors/ # VOXL 2 Mini Onboard Sensors --- ## Summary Below describes the VOXL 2 Mini onboard sensors. ![m0104-datasheets-onboard](/images/voxl2-mini/m0104-datasheets-onboard.jpg) ## IMUs Note the XYZ axis as drawn respresent the IMU data as reported by the voxl-imu-server MPA service, not the physical orientation of the IMU on the PCB. This aligns with the FRD reference frame when mounted on a drone in the typical orientation such as on the Sentinel reference drone. ![voxl2-mini-imu-locations](/images/voxl2-mini/m0104-2d-imu-diagram.png) IMU Orientation Image Downloadable File Link [Here](https://storage.googleapis.com/modalai_public/modal_drawings/M0104_VOXL2_MINI_2D_PUBLIC_DWG_03-30-23.PDF) | Name / Designator | Description | Interface | MPA Pipe | |--- |--- |--- |--- | | PX4 IMU / IMU0 / U16 | TDK ICM42688p | SSC_QUP5, SPI, SLPI (sDSP) | /run/mpa/imu_px4 | | Apps Proc IMU / IMU1 / U17 | TDK ICM42688p | /dev/spidev3.0, SPI | /run/mpa/imu_apps | ## Barometers | Name / Designator | Description | Interface | |--- |--- |--- | | PX4 Baro 0 / BARO1 / U19 | TDK ICP-10100 | SSC_QUP4, I2C, SLPI (sDSP), Addr: 0x63h | --- Source: https://docs.modalai.com/voxl2-mini-offboard-sensors/ # VOXL 2 Mini Offboard Sensors --- ## GPS (GNSS/Mag) An external GPS (GNSS/Mag) can be connected to VOXL 2's J19 connector. ![m0104-user-guides-external-sensors-gps.jpg](/images/voxl2-mini/m0104-user-guides-external-sensors-gps.jpg) | Name / Designator | Description | Interface | |--- |--- |--- | | GNSS UART / exposed via J19 | PX4 GNSS | SSC_QUP6, 2W UART, SLPI (sDSP) | | Mag I2C / exposed via J19 | PX4 Mag | SSC_QUP0, I2C, SLPI (sDSP) | **J19:** Full pinouts for all the connects are [available here](/voxl2-connectors/). | Pin # | Signal Name | Notes | |-------|-----------------|-------------------------------------| | 1 | VDC_5V_LOCAL | GNSS/Mag power * | | 2 | GNSS TX 3P3V | slpi_proc, SSC_QUP7 | | 3 | GNSS RX 3P3V | slpi_proc, SSC_QUP7 | | 4 | MAG SCL 3P3V | slpi_proc, SSC_QUP1 | | 5 | MAG SDA 3P3V | slpi_proc, SSC_QUP1 | | 6 | GND | | | 7 | | Not used for GNSS/Mag | | 8 | | Not used for GNSS/Mag | | 9 | | Not used for GNSS/Mag | | 10 | | Not used for GNSS/Mag | | 11 | | Not used for GNSS/Mag | | 12 | | Not used for GNSS/Mag | ## Power Monitoring ### VOXL Mini ESC The VOXL ESC Mini provides power monitoring through either the [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) (SDK 1.1.1+) or [modal_io](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) driver. The same UART interface used to control the ESC provides feedback including the battery voltage being regulated by the VOXL Mini ESC. ![m0104-m0129](/images/voxl2-mini/m0104-m0129.jpg) ### VOXL Power Module ![m0104-user-guides-external-sensors-pm](/images/voxl2-mini/m0104-user-guides-external-sensors-pm.jpg) Using the VOXL Power Module provides the ability to monitor battery voltage and regulated 3.8VDC voltage from the power module. | Name / Designator | Description | Interface | Driver | |--- |--- |--- |--- | | PX4 Power Monitoring (J1) | QTY2 INA231 | SSC_QUP2, I2C, SLPI (sDSP), Addrs: 0x44h and 0x45h | [voxlpm](https://docs.px4.io/main/en/modules/modules_driver.html#voxlpm) | **J1:** Full pinouts for all the connects are [available here](/voxl2-mini-connectors/). | Pin# | Signal | Notes/Usage | |------|----------|--------------------------------------------------------| | 1 | VDCIN_3P8V | DC from Power Module, “unprotected” | | 2 | GND | Power Module Return | | 3 | I2C_CLK | SSC_QUP_1, 3.8V signal levels, Pullups on Power Module | | 4 | I2C_SDA | SSC_QUP_1, 3.8V signal levels, Pullups on Power Module | Full pinouts for all the connects are [available here](/voxl2-mini-connectors/). ## External Interfaces The following interfaces are available from the Applications Processor and Sensors DSP. ![m0014-offboard-sensors-linux](/images/voxl2-mini/m0104-offboard-sensors-linux-v2.jpg) | Name / Designator | Description | Interface | |--- |--- |--- | | SPI0 / exposed via J6 | camera group 0 SPI | /dev/spidev0.0 | | UART / exposed via J10 | external UART | /dev/ttyHS0 | Full pinouts for all the connects are [available here](/voxl2-mini-connectors/). --- Source: https://docs.modalai.com/voxl2-mini-external-flight-controller/ # VOXL 2 Mini External Flight Controller --- Please refer to [VOXL2 External Flight Controller](/voxl2-external-flight-controller/). Using VOXL 2 Mini as a companion computer to an external flight controller works exactly like VOXL 2 — the same `voxl-mavlink-server` configuration applies. Follow [VOXL 2 External Flight Controller](/voxl2-external-flight-controller/), and find the Mini's available UARTs and pinouts in the [VOXL 2 Mini Connectors datasheet](/voxl2-mini-connectors/). --- Source: https://docs.modalai.com/voxl2-mini-leds/ # VOXL 2 Mini LEDs --- ## Summary Below describes the VOXL 2 Mini LEDs. ![m0104-datasheets-leds](/images/voxl2-mini/m0104-datasheets-leds.jpg) ## D1 - Power Good LED (Green) | State | Description | |--- |--- | | Green | indicates 3P3 VREG and (emulated) VBAT are good (using AND logic) | | Off | indicates either 3P3 VREG or emulated VBAT are not good | ## D2 - 5VDC USB Local Power Good | State | Description | |--- |--- | | Green | indicates 5VDC output for USB is good (U9)| | Off | indicates output of U9 is not good | Green ## DS2 - User Controllable RGB LED All 3 colors of the DS2 LED are active high ON. | State | Description | |--- |--- | | Red | GPIO_82 set high, 2.1Vf @5mA | | Green | GPIO_83 set high, 3.1Vf @5mA | | Blue | GPIO_84 set high, 3.0Vf @5mA | | Off | GPIO_82, GPIO_83 and GPIO_84 set low | ## DS4 - PM8150L RGB LED Driver Future use. The PM8150L can drive this RGB LED. --- Source: https://docs.modalai.com/voxl2-mini-linux-user-guide/ # VOXL 2 Mini Linux User Guide --- # Interfaces ## System Image 1.7+ - VOXL SDK 1.1 and newer. VOXL 2 Mini runs the same [VOXL SDK](/voxl-suite/) releases as VOXL 2. ![m0104-linux-user-guide-V1.7](/images/voxl2-mini/m0104-linux-user-guide-V1.7.jpg) ### apps_proc Interfaces | Protocol | Connector | Device | Processor | Example | |----------|-------------------------------------------------------------------|----------------|-----------|---------| | UART | [J10](/voxl2-mini-connectors/#j10---external-uart) | /dev/ttyHS0 | apps_proc | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | | SPI | [J6](/voxl2-mini-connectors/#j6---camera-group-0-specific-pinout) | /dev/spidev0.0 | apps_proc | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | | SPI | [IMU1](/voxl2-mini-onboard-sensors/), ICM-42688p | /dev/spidev3.0 | apps_proc | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | | I2C | [J7](/voxl2-mini-connectors/#j7---camera-group-1-specific-pinout) | /dev/i2c-0 | apps_proc | [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) | ## System Image 1.6 - VOXL2 Mini SDK 1.0.0 (`voxl2-mini_SDK_1.0.0.tar.gz`) ![m0104-linux-user-guide-all](/images/voxl2-mini/m0104-linux-user-guide-all.jpg) --- Source: https://docs.modalai.com/voxl2-mini-switches/ # VOXL 2 Mini Switches --- ## Summary Below describes the VOXL 2 Mini switches. ![m0104-datasheets-switches](/images/voxl2-mini/m0104-datasheets-switches.jpg) ### SW1 - Force Fastboot Button Force Fastboot momentary button. To force device into fastboot mode: - power off device, remove USB cable to completely power down - press and hold SW1 button down - power on device, attach USB cable - release SW1 button - from host computer, run `fastboot devices` and verify the device shows up. If not, restart this procedure To reboot device to fastboot: - device is powered on - press and hold SW1 for 30 seconds until the device reboots into fastboot mode
### SW2 - EDL Switch Emergency Download switch, used for factory flashing. Should be left `OFF`. See [user guide for QDL](/voxl2-unbricking/) if interested in more information. --- Source: https://docs.modalai.com/voxl2-mini-debug-console/ # VOXL 2 Mini Debug Console --- ## Summary This is NOT enabled by default as it slows the bootup time down dramatically. The 2 wire UART console exposed by J4 provides the kernel output (dmesg) and provides a root login to Ubuntu (password `oelinux`). To enable this, you need to build the debug kernel, see [the guide here](/voxl2-kernel-build-guide/). Shown below is an example hardware setup. ![m0104-j4-debug-console.jpg](/images/voxl2-mini/m0104-j4-debug-console.jpg) --- Source: https://docs.modalai.com/voxl2-mini-datasheets/ # VOXL 2 Mini Datasheets ![m0104-hero-top](/images/voxl2-mini/m0104-hero-top.png) # Mechanical Drawings ## 2D Drawings ![voxl2-mini-imu-locations](/images/voxl2-mini/m0104-2d-imu-diagram.png) IMU Orientation Image Downloadable File Link [Here](https://storage.googleapis.com/modalai_public/modal_drawings/M0104_VOXL2_MINI_2D_PUBLIC_DWG_03-30-23.PDF) ## 3D Drawings [3D STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/M0104_VOXL2_MINI_V1_REVA.step) --- Source: https://docs.modalai.com/voxl2-mini-feature-matrix/ # VOXL 2 Mini Feature Matrix --- ## Summary ## Specifications | Feature | VOXL 2 Mini | VOXL 2 | |-------------------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------| | Dimensions | 42mm x 42mm | 70mm x 36mm | | Weight | 11g | 16g | | MIPI Image Sensors | [4 Concurrent](/voxl2-mini-image-sensors/) | [6 Concurrent](/voxl2-camera-configs/) | | CPU | QRB5165
8 cores up to 3.091GHz
8GB LPDDR5
128GB Flash | QRB5165
8 cores up to 3.091GHz
8GB LPDDR5
128GB Flash | | OS | Ubuntu 18.04 - Linux Kernel v4.19 | Ubuntu 18.04 - Linux Kernel v4.19 | | GPU | Adreno 650 GPU – 1024 ALU | Adreno 650 GPU – 1024 ALU | | NPU | 15 TOPS | 15 TOPS | | Flight Controller Embedded | Yes (PX4 or Ardupilot on Sensors DSP) | Yes (PX4 on Sensors DSP) | | Integrated Sensors | QTY. 2 ICM-42688P IMU, QTY. 1 ICP-10100 | QTY. 2 ICM-42688P IMU, QTY. 1 ICP-10100 | | Power Consumption | 0.5 - 8W | 0.5 - 8W | | Built in WiFi | No | No | | Add-on Connectivity | via USB3 port, WiFi, 5G, 4G/LTE, Microhard | Via Add-on board, WiFi, 5G, 4G/LTE, Microhard | | Video Encoding | 8K30 h.264/h.265 64MP still images | 8K30 h.264/h.265 64MP still images | | VOXL SDK: GPS-denied navigation, SLAM, obstacle avoidance, object recognition | Yes | Yes | | ROS | ROS 1 & 2 | ROS 1 & 2 | | QGroundControl | Yes | Yes | | ATAK | Yes | Yes | | NDAA ’20 Section 848 Compliant | Yes, Assembled in USA | Yes, Assembled in USA | | PMD TOF | Yes | Yes | | FLIR Boson | USB | USB | | FLIR Lepton | USB, SPI in development | USB, SPI in development | ## Platform Release VOXL 2 Mini requires Platform Release 1.0 and newer. See [VOXL SDK](/voxl-sdk/). For additional details regarding compatibility see the following resources: * [VOXL 2 RC Configs](/voxl2-mini-rc-configs/) * [VOXL 2 ESC Configs](/voxl2-mini-esc-configs/) --- Source: https://docs.modalai.com/voxl2-mini-connectors/ # VOXL 2 Mini Connectors --- ## Summary Below describes the VOXL 2 Mini connectors. Hover a connector to identify it — click to jump to its pinout.
All single ended signals on B2B connectors J6 and J7 are 1.8V CMOS unless explicitly noted. All single ended signals on cable-to-board connectors J10, J19 are 3.3V CMOS unless explicitly noted. | Connector | Description | MPN (Board Side) | Mating MPN (Board/Cable Side) | Type | Signal Feature Summary | |-----------|-------------------------------|-------------------------|-------------------------------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | J1 | Prime Power In, 3.8V | Molex 2059-72-0041 | 2059792041 | Cable Connector, 4-pin R/A | +3.8V main DC power in + GND, I2C@3.8V for power monitors | | J2 | Fan | SM02B-SRSS-TB(LF)(SN) | SHR-02V-S | Cable Header, 2-pin R/A | 5V DC output for FAN + PWM Controlled FAN-Return (GND) | | J3 | USB3 | BM10B-GHS-TB(LF)(SN) | GHR-10V-S | Cable Header, 10-pin vertical | | | J4 | Debug console | BM04B-SRSS-TB(LF)(SN) | SHR-04V-S | Cable Header, 4-pin vertical | Linux debug console enabled in debug kernel builds only | | J6 | Camera Group 0 | DF40C-60DP-0.4V(51) | DF40C-60DS-0.4V | B2B Plug, 60-pin | Qty-2 4L MIPI CSI ports, CCI and camera control signals, 8 power rails (from 1.05V up to 5V) for cameras and other sensors, dedicated SPI, GPIO | | J7 | Camera Group 1 | DF40C-60DP-0.4V(51) | DF40C-60DS-0.4V | B2B Plug, 60-pin | Qty-2 4L MIPI CSI ports, CCI and camera control signals, 8 power rails (from 1.05V up to 5V) for cameras and other sensors, dedicated I2c, GPIO | | J9 | USB-C (ADB) | 12401610E4#2A | USB Type-C | Cable Receptacle, 24-pin R/A | ADB USB-C with OTG/Host mode support (no Display Port) (USB0) | | J10 | UART/SPI Expansion | SM08B-GHS-TB(LF)(SN) | GHR-08V-S | Cable Header, 8-pin R/A | UART (or SPI with 2 CS_N pins), 32kHz CLK_OUT (resistor option), all 3.3V CMOS signal levels. NOTE: SPI option requires building your own kernel | | J19 | ESC/GNSS/MAG/RC | SM12B-GHS-TB(LF)(SN) | GHR-12V-S | Cable Header, 12-pin R/A | RC UART@3.3V, ESC UART@3.3V, GNSS UART@3.3V, Magnetometer I2C@3.3V, 5V, 3P3V_RC (SW controllable) |
## Pinouts
### J1 - Power Connector / I2C Battery Monitoring > For use with ModalAI Power Module V3 in the "-4" config, set to 3.8V. | Pin# | Signal | Notes/Usage | |------|--------------|------------------------------------------------------| | 1 | VBAT_IN_3P8V | DC from Power Module, 3.8V nominal/fixed or 1S ranges (3.3V to 4.25V) | | 2 | GND | Power Module Return | | 3 | I2C_CLK_3P8V | SSC_QUP_1, 3.8V signal levels, Pullups on Power Module | | 4 | I2C_SDA_3P8V | SSC_QUP_1, 3.8V signal levels, Pullups on Power Module |
### J2 - 5VDC Fan Control | Pin # | Signal Name | Notes | | --- | --- | --- | | 1 | VDC_5V_LOCAL | 5V power output ** | | 2 | FAN RETURN (GND) | Return limited to ~400mA |
### J3 USB 3 10-pin This format is identical to M0090, M0130 | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5VDC | 5V VBUS power output, 900mA total when VBAT_IN = 3.8V ** | | 2 | USB1_HS_HUB3_CON_D_N | EMI/ESD filters on-board | | 3 | USB1_HS_HUB3_CON_D_P | EMI/ESD filters on-board | | 4 | GND | | | 5 | USB1_HUB3_SS_RX_N | EMI/ESD filters on-board | | 6 | USB1_HUB3_SS_RX_P | EMI/ESD filters on-board | | 7 | GND | | | 8 | USB1_HUB3_SS_TX_N | EMI/ESD filters on-board | | 9 | USB1_HUB3_SS_TX_P | EMI/ESD filters on-board | | 10 | GND | | __Note:__ There is a known HW issue on the USB3 Super-speed TX lines where the AC caps are not included. Please include AC caps on any mating HW, both RX and TX, or your link may be limited to USB2 speeds. We plan to fix this on a future spin of Voxl2 Mini. Our MCBL-00022 host port adapter can be manually modified to insert serial caps on the TX lines using radial components as a work-around if using a COTS USB3 device. [Here are some instructions and guidance](/cable-userguides/#how-to-modify-mcbl-00022-2-for-use-with-voxl-2-mini-usb-3-speeds) on how to perform this modification on your own. There has been a report of an Ethernet device which enumerates as USB3, but gets USB Fast Speeds (~8-12Mbps). If this happens to you, simply remove the USB3 wires from MCBL-00022-2 [check here for help](/cable-userguides/) and the pinout of MCBL-00022-2 [here](/cable-datasheets/#mcbl-00022), or use another USB cable we offer without USB3 lines, such as MCBL-00080 [click here](/cable-datasheets/#mcbl-00080) and that should at least bring back USB HighSpeed (480Mbps) rates. __Note2:__ VOXL 2 Mini FIx is in the works!! Stay Tuned for this AC cap issue update and some other exciting upgrades.
### J4 - Serial Debug Port This format is identical to other ModalAI debug ports | Pin# | Signal | Notes/Usage | |------|---------------------|------------------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | DEBUG_UART_RX_3P3V | QUP_12 UART Receive (input), 3.3V signal levels | | 3 | DEBUG_UART_TX_3P3V | QUP_12 UART Transmit (output), 3.3V signal levels | | 4 | GND | |
### Camera Group J6, J7 #### General Pin-out Generic camera group pinout, please work with ModalAI for any mating designs to guarantee proper operation | Pin# | Signal | |------|---------------------| | 1 | GND | | 2 | GND | | 3 | Lower CCI_I2C_SDA | | 4 | DVDD 1.2V | | 5 | Lower CCI_I2C_SCL | | 6 | DOVDD 1.8V | | 7 | GND | | 8 | DVDD 1.05V | | 9 | Lower CSI_CLK_P | | 10 | Lower RST_N | | 11 | Lower CSI_CLK_M | | 12 | Lower MCLK | | 13 | Lower CSI_DAT0_P | | 14 | GND | | 15 | Lower CSI_DAT0_M | | 16 | Lower CCI Timer | | 17 | GND | | 18 | Upper CCI Timer | | 19 | Lower CSI_DATA1_P | | 20 | Upper MCLK | | 21 | Lower CSI_DATA1_M | | 22 | AVDD 2.8V | | 23 | Lower CSI_DATA2_P | | 24 | GND | | 25 | Lower CSI_DATA2_M | | 26 | Upper RST_N (Unique on M0104, Shared on M0204) | | 27 | GND | | 28 | Upper CCI_I2C_SDA | | 29 | Lower CSI_DATA3_P | | 30 | Upper CCI_I2C_SCL | | 31 | Lower CSI_DATA3_M | | 32 | Spare MCLK/GPIO | | 33 | GND | | 34 | Group SPI MISO (groups 0/1) | | 35 | Upper CSI_CLK_P | | 36 | Group SPI MOSI (groups 0/1) | | 37 | Upper CSI_CLK_M | | 38 | Group SPI SCLK (groups 0/1) | | 39 | Upper CSI_DATA0_P | | 40 | Group SPI CS_N (groups 0/1) | | 41 | Upper CSI_DATA0_M | | 42 | VREG_S4A_1P8 | | 43 | GND | | 44 | GND | | 45 | Upper CSI_DATA1_P | | 46 | VPH_PWR 3.8V | | 47 | Upper CSI_DATA1_M | | 48 | VPH_PWR 3.8V | | 49 | Upper CSI_DATA2_P | | 50 | GND | | 51 | Upper CSI_DATA2_M | | 52 | 3.3V | | 53 | GND | | 54 | GND | | 55 | Upper CSI_DATA3_P | | 56 | 5V | | 57 | Upper CSI_DATA3_M | | 58 | 5V | | 59 | GND | | 60 | GND | #### J6 - Camera Group 0 Specific Pinout VOXL 2 Mini supports Camera Group 0 and 1 from the [VOXL 2 Camera Configs](/voxl2-camera-configs/). Connector: `DF40C-60DP-0.4V(51)` Device Tree: - `qcom,cam-sensor0` - `qcom,cam-sensor1` ##### J6 Pin-out | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | GND | | | 2 | GND | | | 3 | CCI_I2C0_SDA | CAM0_CCI0_SDA, gpio101 | | 4 | VREG_PM8009_L2_1P2 | DVDD 1.2V | | 5 | CCI_I2C0_SCL | CAM0_CCI0_SCL, gpio102 | | 6 | VREG_PM8009_L7_1P8 | CAM0_VIO_1P8, CAM0_VIO_1P8 | | 7 | GND | | | 8 | VREG_PM8009_L1_1P05 | CAM0_VDD_1P05, NOTE: current this is ~1.13VDC | | 9 | CSI0_CLK_CON_P | | | 10 | GPIO_93_CAM0_RST_N | CAM0_RST_N, gpio93 | | 11 | CSI0_CLK_CON_N | | | 12 | GPIO_94_CAM_MCLK0_CON | CAM_MCLK0_CON, gpio94 | | 13 | CSI0_LANE0_CON_P | LEFT | | 14 | GND | | | 15 | CSI0_LANE0_CON_N | LEFT | | 16 | GPIO_110_CCI_TIMER1 | (unused in version 0) | | 17 | GND | | | 18 | GPIO_113_CCI_TIMER4 | CAM_FSYNC_1_OUT, CAM_FSYNC0_IN | | 19 | CSI0_LANE1_CON_P | RIGHT | | 20 | CAM_MCLK1_CON | CAM_MCLK1_CON, gpio95 | | 21 | CSI0_LANE1_CON_N | RIGHT | | 22 | VREG_PM8009_L5_2P8 | CAM0_AVDD_2P8, CAM1_AVDD_2P8 | | 23 | CSI0_LANE2_CON_P | | | 24 | GND | | | 25 | CSI0_LANE2_CON_N | | | 26 | GPIO_109_CAM3_RST_N | (shared, CAM3_RST_N) | | 27 | GND | | | 28 | CCI_I2C1_SDA | CAM1_CCI1_SDA, CAM4_CCI1_SDA | | 29 | CSI0_LANE3_CON_P | | | 30 | CCI_I2C1_SCL | CAM1_CCI1_SCL, CAM4_CCI1_SCL | | Pin # | Signal Name | Notes | | --- | --- | --- | | 31 | CSI0_LANE3_CON_N | | | 32 | MCLK6_G0_CON | (shared) CAM1_RST_N, gpio100, | | 33 | GND | | | 34 | GPIO_28_CAM0_SPI0_MISO| `/dev/spidev0.0` | | 35 | CSI1_CLK_CON_P | | | 36 | GPIO_29_CAM0_SPI0_MOSI| `/dev/spidev0.0` | | 37 | CSI1_CLK_CON_N | | | 38 | GPIO_30_CAM0_SPI0_CLK | `/dev/spidev0.0` | | 39 | CSI1_LANE0_CON_P | | | 40 | GPIO_31_CAM0_SPI0_CS | `/dev/spidev0.0` | | 41 | CSI1_LANE0_CON_N | | | 42 | VREG_S4A_1P8 | | | 43 | GND | | | 44 | GND | | | 45 | CSI1_LANE1_CON_P | | | 46 | VPH_PWR | | | 47 | CSI1_LANE1_CON_N | | | 48 | VPH_PWR | | | 49 | CSI1_LANE2_CON_P | | | 50 | GND | | | 51 | CSI1_LANE2_CON_N | | | 52 | VREG_3P3V_LOCAL | | | 53 | GND | | | 54 | GND | | | 55 | CSI1_LANE3_CON_P | | | 56 | VDC_5V_LOCAL | | | 57 | CSI1_LANE3_CON_N | | | 58 | VDC_5V_LOCAL | | | 59 | GND | | | 60 | GND | |
#### J7 - Camera Group 1 Specific Pinout VOXL 2 Mini supports Camera Group 0 and 1 from the [VOXL 2 Camera Configs](/voxl2-camera-configs/). Connector: `DF40C-60DP-0.4V(51)` Device Tree: - `qcom,cam-sensor2` - `qcom,cam-sensor3` ##### J7 Pin-out | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | GND | | | 2 | GND | | | 3 | CCI_I2C2_SDA | CAM2_CCI1_SDA, gpio105 | | 4 | VREG_PM8009_L2_1P2 | (M0084, R1 not stuffed, not routed) | | 5 | CCI_I2C2_SCL | CAM2_CCI1_SCL, gpio106 | | 6 | VREG_PM8009_L7_1P8 | CAM2_DOVDD_1P8, CAM3_DOVDD_1P8 | | 7 | GND | | | 8 | VREG_PM8009_L1_1P05 | (M0084, R2 stuffed) CAM2_VDD_1P05,CAM3_VDD_1P05 (NOTE: current this is ~1.13VDC) | | 9 | CSI2_CLK_CON_P | | | 10 | GPIO_92_CAM1_RST_N | RST_LOWER_N, gpio92 | | 11 | CSI2_CLK_CON_N | | | 12 | GPIO_96_CAM_MCLK2 | MCLK_LOW, gpio96 | | 13 | CSI2_LANE0_CON_P | | | 14 | GND | | | 15 | CSI2_LANE0_CON_N | | | 16 | GPIO_111_CCI_TIMER2 | CCI_TIMER_LOWER | | 17 | GND | | | 18 | GPIO_114_CCI_ASYNC_IN | CCI_TIMER_UPPER | | 19 | CSI2_LANE1_CON_P | | | 20 | GPIO97_CAM_MCLK3_CON | MCLK_UPPER, gpio97 | | 21 | CSI2_LANE1_CON_N | | | 22 | VREG_PM8009_L6_2P8 | AVDD_2P8, CAM2_DOVDD_2P8, CAM3_DOVDD_2P8 | | 23 | CSI2_LANE2_CON_P | | | 24 | GND | | | 25 | CSI2_LANE2_CON_N | | | 26 | GPIO_78_CAM2_RST_N (M0104), GPIO_109_CAM3_RST_N (M0204) | RST_UPPER, Unique on M0104, SHARED on M0204 for Global Sync | | 27 | GND | | | 28 | CCI_I2C3_SDA | CAM3_CCI3_SDA, CAM5_CCI3_SDA, gpio107 | | 29 | CSI2_LANE3_CON_P | | | 30 | CCI_I2C3_SCL | CAM3_CCI3_SCL, CAM5_CCI3_SCL, gpio108 | | Pin # | Signal Name | Notes | | --- | --- | --- | | 31 | CSI2_LANE3_CON_N | | | 32 | MCLK6_G1_CON | (shared) GPIO_MCLK6_SHARED, gpio100 | | 33 | GND | | | 34 | GPIO_4_CAM1_SPI1_MISO | GPIO_4, `/dev/i2c-0 SDA` | | 35 | CSI3_CLK_CON_P | | | 36 | GPIO_5_CAM1_SPI1_MOSI | GPIO_5, `/dev/i2c-0 SCL` | | 37 | CSI3_CLK_CON_N | | | 38 | GPIO_6_CAM1_SPI1_CLK | GPIO_6, | | 39 | CSI3_LANE0_CON_P | | | 40 | GPIO_7_CAM1_SPI1_CS | GPIO_7, | | 41 | CSI3_LANE0_CON_N | | | 42 | VREG_S4A_1P8 | | | 43 | GND | | | 44 | GND | | | 45 | CSI3_LANE1_CON_P | | | 46 | VPH_PWR | | | 47 | CSI3_LANE1_CON_N | | | 48 | VPH_PWR | | | 49 | CSI3_LANE2_CON_P | | | 50 | GND | | | 51 | CSI3_LANE2_CON_N | | | 52 | VREG_3P3V_LOCAL | | | 53 | GND | | | 54 | GND | | | 55 | CSI3_LANE3_CON_P | | | 56 | VDC_5V_LOCAL | | | 57 | CSI3_LANE3_CON_N | | | 58 | VDC_5V_LOCAL | | | 59 | GND | | | 60 | GND | |
### J10 - External UART #### J10 Pin-out, UART Mode, Default (GPIO_67 = LOW) SDK 1.1.2 required. Available from apps proc as `/dev/ttyHS0`. For loopback test, you can connect pins 4/5 on J10 and use the following to verify: ``` voxl2-mini:/$ qrb5165io-uart-test -d /dev/ttyHS0 [INFO]: success! ``` | Pin# | Signal | Notes/Usage | |------|------------------------|------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | GPI_40 (Input) | 3.3V signal levels | | 3 | GPO_41 (Output) | 3.3V signal levels | | 4 | UART_TX (Output) | APPS_QUP_14, 3.3V signal levels | | 5 | UART_RX (Input) | APPS_QUP_14, 3.3V signal levels | | 6 | GPI_46 (Input) | 3.3V signal levels | | 7 | GPI_64_INT_N (Input) | Interrupt Input, 3.3V signal levels | | 8 | GND | GND | #### J10 Pin-out, SPI Mode (GPIO_67 = High), Kernel Rebuild Required to Use > to use SPI, you need to rebuild the kernel, see: https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/blob/qrb5165-ubun1.0-14.1a/recipes-kernel/linux-msm/files/dts/m0104/m0104-modalai-qupv3.dtsi?ref_type=heads#L93 https://gitlab.com/voxl-public/system-image-build/meta-voxl2-bsp/-/blob/qrb5165-ubun1.0-14.1a/recipes-kernel/linux-msm/files/dts/m0104/m0104-modalai-qupv3.dtsi?ref_type=heads#L98 Available from apps proc as `/dev/spidev14.0`. To use, set GPIO_67 high (to set direction of directional level shifter internally...) ```bash voxl-gpio -w 67 1 ``` | Pin# | Signal | Notes/Usage | |------|------------------------|------------------------------------------| | 1 | VREG_3P3V_LOCAL | 3.3V Power Output * | | 2 | MISO (Input) | APPS_QUP_14, 3.3V signal levels | | 3 | MOSI (Output) | APPS_QUP_14, 3.3V signal levels | | 4 | SCLK (Output) | APPS_QUP_14, 3.3V signal levels | | 5 | CS0_N (Output) | APPS_QUP_14, 3.3V signal levels | | 6 | CS1_N/GPIO_46 (Output) | Second SPI CS_N or GPIO | | 7 | GPIO_64_INT_N (Input) | Interrupt Input, 3.3V signal levels | | 8 | GND | GND |
### J19 - External Sensors (2x UART/ 2x I2C) #### J19 Pin-out | Pin # | Signal Name | Notes | |-------|---------------------|-----------------------------------------| | 1 | VDC_5V_LOCAL | GNSS/Mag 5V power output, 900mA total when VBAT_IN = 3.8V ** | | 2 | GNSS TX 3P3V | slpi_proc, SSC_QUP6, GPIO_176, 3.3V signal levels | | 3 | GNSS RX 3P3V | slpi_proc, SSC_QUP6, GPIO_177, 3.3V signal levels | | 4 | MAG SCL 3P3V | slpi_proc, SSC_QUP0, GPIO_161, 3.3V signal levels | | 5 | MAG SDA 3P3V | slpi_proc, SSC_QUP0, GPIO_160, 3.3V signal levels | | 6 | GND | | | 7 | ESC_UART_TX 3P3V | slpi_proc, SSC_QUP2, GPIO_166, 3.3V signal levels | | 8 | ESC_UART_RX 3P3V | slpi_proc, SSC_QUP2, GPIO_167, 3.3V signal levels | | 9 | VREG_3P3V_RC | RC power *, controllable via GPIO 159 | | 10 | RC_UART_TX (Output) | slpi_proc, SSC_QUP7, GPIO_178, 3.3V signal levels | | 11 | RC_UART_RX (Input) | slpi_proc, SSC_QUP7, GPIO_179, 3.3V signal levels | | 12 | GND | | #### SW Summary All connected to the DSP, and in the factory configuration are used as follows: - `QUP0` - I2C for external magnetometer - `QUP2` - PX4 communicates to the VOXL ESC through this UART. - `QUP6` - UART for external GNSS (GPS) - `QUP7` - UART for external RC input
### Power Input/Output Important Note * All power outputs on cable connectors are rated for 1A, however, the system cannot provide 1A simultaneously on all connectors. Contact ModalAI for design assistance. ** VBUS and all 5V power outputs are limited to 900mA TOTAL for all loads (Fan, VBUS, and external GNSS/Mag) --- Source: https://docs.modalai.com/voxl2-mini-system-image/ # VOXL 2 Mini System Image VOXL 2 Mini (M0104) shares its system image with VOXL 2 (M0054). See the [VOXL 2 / VOXL 2 Mini System Image](/voxl2-voxl2-mini-system-image/) page for the changelog and details. --- Source: https://docs.modalai.com/voxl2-mini-d0013/ # VOXL 2 Mini - D0013 Architecture (Stinger) --- # Hardware --- ## VOXL2 Mini ### Summary The Stinger `D0013-6-C33-M26-X8` configuration consists of: - `D0013-6` - Stinger Family (VOXL2 Mini Compute) - `M0129-63` VOXL ESC Mini with built in power management - `M0187` FLIR Lepton 3.5 thermal sensor using [M0188](/M0188/) - `Cxx` - Camera Config - `C33` - Single IMX664 using [M0186](/M0186/), Dual AR0144 using [M0188](/M0188/) - `Tx` - Recevier Config - `T8` - ELRS - `Xx` - `X8` - Lepton for Tracking ### Block Diagram Below describes the compute HW block diagram for the `D0013-6-C33-M26-X8` configuration. [![D0013-6-C33-M26-X8](/images/d0013/CWD-D0013-6-C33-M26-X8-REV7.jpg)](/images/d0013/CWD-D0013-6-C33-M26-X8-REV7.jpg) [View in fullsize](/images/d0013/CWD-D0013-6-C33-M26-X8-REV7.jpg){:target="_blank"} [Diagram draw.io Source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0013/CWD-D0013-6-C33-M26-X8-REV7.drawio) # Software - Supported VOXL SDK: 1.4+ - Supported Kernels (config 2): `m0104-1-var00.2-kernel.img` # Platform Features ## MSP_DP OSD Support for Non-ModalAI VTX (HD-zero or Walksnail) - MSP Display Port OSD support for HDZero ([PX4 driver](https://github.com/modalai/px4-firmware/tree/voxl-fpv-dev/src/drivers/osd/msp_dp)) - PX4 OSD Params for FrSky Skyvision ([here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/dev/params/v1.14/other_helpers/msp_dp_osd_skyvision.params)) ## VOXL2 Driven Image Sensor Synchronization In the D0013 architecture using the M0188 breakout, the following occurs for the tracking sensors: - The [voxl-fysnc-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fysnc-mod) ships in SDK 1.3+ and defaults to use GPIO 109, 30Hz, and disabled. - When a C22 image sensor configurations is setup using `voxl-configure-cameras`, the config file at `/etc/modalai/voxl-camera-server.conf` is setup with: ``` ... "fsync_en": true, "fsync_gpio": 109, ... ``` - When camera server runs, it will use the `voxl-fsync-mod` params exposed to the file system at `/sys/module/voxl_fsync_mod/parameters`, for example `enabled`, `gpio_num`, and enable the sync pulse at the default 30Hz. - When a C22 image sensor configurations is setup using `voxl-configure-cameras`, the `AR0144` drivers are copied into `/usr/lib/camera` that are setup for slave mode and will capture sychronized frames at the rate defined (note: the FPS should also be configured in `/etc/modalai/voxl-camera-server.conf` accordinly to ensure proper register settings are loaded) > the following shows M0173 which has similar architecture as M0188. [![D0014-M0173.jpg](/images/d0014/D0014-M0173.jpg)](/images/d0014/D0014-M0173.jpg) ## FLIR Lepton In the D0013 architecture using the M0188 breakout: (NOTE: in SDK 1.4.0, only one can be used at a time) - VL53L1CX Range Finder is accesible over `/dev/i2c-0`, see `/etc/modalai/voxl-rangefinder-server.conf` and `voxl-rangefinder` - FLIR Lepton is accesible over `/dev/i2c-0` and `/dev/spidev0.0`, see `/etc/modalai/voxl-lepton-server.conf` and `voxl-lepton-server` - note see ([M0188](/M0188/)) docs for details as I2C channel selector is also in use here ![FLIR Lepton on the M0188 adapter](/images/m0188/m0188-lepton-single.png) ## New Kernel Configuration for M0188 The `D0013` drone family uses the new kernel `config 2` (as opposed to `config 0`). See `/sys/module/voxl_platform_mod/parameters/config` to verify proper kernel config. --- Source: https://docs.modalai.com/voxl2-mini-supported-architectures/ # VOXL 2 Mini Supported Architectures --- Source: https://docs.modalai.com/voxl-flight/ # VOXL-Flight VOXL Flight is an all-in-one board solution that combines a VOXL onboard computer and a Flight Core PX4 flight controller. ![voxl-flight](/images/voxl-flight/voxlflighttop.jpg) --- Source: https://docs.modalai.com/voxl-flight-quickstart/ # VOXL Flight Quickstart --- ![voxl-flight-dk](/images/voxl-flight/voxl-flight-dk.jpg) ## Quickstart Video ## Helpful Links - [VOXL Flight Support Forum](https://forum.modalai.com/category/8/voxl-flight) - [User Guide - VOXL Features](/voxl-quickstarts/) - [User Guide - Flight Core Features](/flight-core-getting-started/) - [Data Sheet](/voxl-flight-datasheet/) - [PWM ESC Calibration](/flight-core-pwm-esc-calibration/) ## Connectors - Top ![VOXL-Flight Top](/images/voxl-flight/voxl-flight/voxl-flight-overlay-top-144-2.png) *Note: 1000 Series connectors accessible from the STM32/PX4* | Connector | Summary | Used By | | --- | --- | --- | | J2 | Hires 4k Image Sensor (CSI0) | Snapdragon - Linux | | J3 | Stereo Image Sensor (CSI1) | Snapdragon - Linux | | J6 | Cooling Fan Connector | Snapdragon - Linux | | J7 | BLSP6 (GPIO) and BLSP9 (UART) | Snapdragon - Linux | | J13 | Expansion B2B | Snapdragon - Linux | | J14 | Integrated GNSS Antenna Connection | Snapdragon - Linux | | J1001 | Programming and Debug/UART3 | STM32 - PX4 | | J1002 | UART ESC, UART2/TELEM3 | STM32 - PX4 | | J1003 | PPM RC In | STM32 - PX4 | | J1004 | RC Input, Spektrum/SBus/UART6 | STM32 - PX4 | | J1006 | USB 2.0 Connector (PX4/QGroundControl only) | STM32 - PX4 | | J1007 | 8-Channel PWM / 4-Channel DShot Output | STM32 - PX4 | | J1008 | CAN Bus | STM32 - PX4 | | J1009 | I2C3, UART4 | STM32 - PX4 | | J1010 | Telemetry (TELEM1) | STM32 - PX4 | | J1011 | I2C2, Safety Button Input | STM32 - PX4 | | J1012 | External GPS & Mag, UART1, I2C1 | STM32 - PX4 | | J1013 | Power Input, I2C3 | STM32 - PX4 (powers whole system) | ## Connectors - Bottom ![VOXL-Flight Bottom](/images/voxl-flight/voxl-flight/voxl-flight-overlay-bottom-144.png) *Note: 1000 Series connectors accessible from the STM32/PX4* | Connector | Summary | Used By | | --- | --- | --- | | J4 | Tracking/Optic Flow Image Sensor (CSI2) | Snapdragon - Linux | | J8 | USB 3.0 OTG | Snapdragon - Linux, **adb** | | J10 | BLSP7 UART and I2C off-board | Snapdragon - Linux | | J11 | BLSP12 UART and I2C off-board | Snapdragon - Linux | | VOXL microSD | | Snapdragon - Linux | | PX4 microSD | 32Gb Max | STM32 - PX4 | | Wi-Fi Antennas | Included | Snapdragon - Linux | --- Source: https://docs.modalai.com/voxl-flight-user-guide/ # VOXL Flight User Guide VOXL Flight combines a VOXL companion computer and a Flight Core flight controller on one board. The VOXL side runs Linux, the cameras, and the VOXL SDK; the Flight Core side runs PX4. Most tasks are documented once, on the VOXL or Flight Core pages, and apply to VOXL Flight unchanged. This page maps them out. ## First power-up - [VOXL Flight Quickstart](/voxl-flight-quickstart/) covers unboxing, power, and the first connection. - [VOXL Quickstart](/voxl-quickstarts/) and [Flight Core Quickstarts](/flight-core-getting-started/) cover each half in more depth. ## The board - [Functional Description](/voxl-flight-functional-description/) for the block diagram and what is on each side. - [Connectors](/voxl-flight-datasheet-connectors/) for every connector and pinout. - [LEDs](/voxl-flight-datasheet-leds/) and [IMUs](/voxl-flight-datasheet-imus/). - [Configuration](/voxl-flight-datasheet-configuration/) for the board's hardware configuration. - [Kits](/voxl-flight-kits/) for the available development kits. ## Working with the VOXL side - [Setting Up ADB](/setting-up-adb/) and [VOXL WiFi](/voxl-wifi-setup/) to get a shell and a network connection. - [VOXL User Guides](/voxl-user-guides/) for GPIO, I2C, serial, cameras, and the other Linux-side topics. - [VOXL Camera Configurations](/voxl-camera-config/) for which cameras plug into which port. ## Working with the Flight Core side - [Flight Core Firmware](/flight-core-firmware/) to update PX4. - [Flight Core Radios](/flight-core-radios/) and [PWM ESC Calibration](/flight-core-pwm-esc-calibration/). - [How to connect VOXL to Flight Core](/how-to-connect-voxl-to-flight-core/) explains the link between the two halves, which on VOXL Flight is already wired on the board. --- Source: https://docs.modalai.com/voxl-flight-datasheet/ # VOXL Flight Datasheets VOXL Flight combines VOXL and Flight Core into one package. This is one of the first computing platforms to combine the power and sophistication of Snapdragon with the flexibility and ease of use of a STM32F7. You can purchase VOXL Flight here VOXL Flight's specifications are almost identical to [VOXL](/voxl-datasheets/) and [Flight Core](/flight-core-datasheet-connectors/) combined. The specific differences are: * VOXL J1 and J12 are directly connected into the Flight Core portion of the board, so are not there on VOXL-Flight. * The IMU0 ICM20948 on VOXL is replaced on VOXL-Flight with ICM42688. IMU1 on both platforms is ICM20948. ![VOXL-Flight compared with VOXL and Flight Core](/images/voxl-flight/voxl-flight/voxl-flight-cropped.png) --- Source: https://docs.modalai.com/voxl-flight-functional-description/ # VOXL Flight Functional Description --- ## Overview VOXL Flight combines [VOXL](/voxl-datasheets/) and [Flight Core](/flight-core-datasheet) into one package. This the first open computing platform designed specifically for drones (sUAS) to combine the power and sophistication of Snapdragon with the flexibility and ease of use of a STM32F7 in a single PCB. VOXL Flight is 100% software compatible with VOXL and Flight Core, but in a single PCB to reduce cabling, cost and increase reliability. The VOXL advances the [Snapdragon Flight and Qualcomm Flight Pro](https://www.modalai.com/pages/qualcomm-flight-pro) architectures for: - PX4 Avoidance and Navigation - ROS / ROS2 - Open source Linux kernel, cross-compilers, PX4, ROS, OpenCV - Docker build environment for CPU, GPU (OpenCL) and DSP (Hexagon SDK) heterogeneous computer vision and deep learning processing. - Run Docker on VOXL target for improved portability and maintenance. - Add cellular LTE connectivity for beyond visual line of sight (add-on). Specs Overview: - Snapdragon 821: Quad-core up to 2.15GHz, GPU, 2xDSP, Linux - 216MHz, 32-bit ARM M7 [STM32F765II](https://www.st.com/en/microcontrollers-microprocessors/stm32f765ii.html), [PX4](https://github.com/PX4/PX4-Autopilot) - Video support: 3x MIPI cameras, UVC - Machine vision support: time synchronized IMU and cameras - Additional I/O: WiFi, SPI, I2C, UART, GPIO - Light weight, powerful, SWAP-optimized computing: - Weight 24g - Power Adapter weight 13g - Cameras (6g) - Power consumption 3-10W > VOXL Flight combines VOXL and Flight Core exactly. Except for mechanical specifications, the datasheets for [VOXL](/voxl-datasheets/) and [Flight Core](/flight-core-datasheet/) can be used for their respective functionalities on VOXL Flight. ## Mechanical Specs ### 3D Dimensions [3D STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/M0019_VOXL-Flight.zip) > This was updated on 10/7/22 to fix the height of the CPU/Snapdragon part from 0.69mm to 1.3mm ### 2D Dimensions ![VOXL-Flight Dimensions](/images/voxl-flight/voxl-flight/voxl-flight-dimensions.png) [Next: VOXL Flight Connectors](/voxl-flight-datasheet-connectors/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-flight-datasheet-connectors/ # VOXL Flight Connectors
![VOXL-Flight Top](/images/voxl-flight/voxl-flight/voxl-flight-overlay-top-144-2.png) ![VOXL-Flight Bottom](/images/voxl-flight/voxl-flight/voxl-flight-overlay-bottom-144.png) > Due to supply chain issues, the colors of the connectors on VOXL Flight are subject to change. If the colors of the connectors are different, please disregard. --- ## Board Connections and Pin-out Specifications ### VOXL Flight Board Top ![VOXL-Flight Top](/images/voxl-flight/voxl-flight/voxl-flight-overlay-top-144-2.png) *Note: 1000 Series connectors accessible from the STM32/PX4* | Connector | Summary | | --- | --- | | J2 | Hires 4k Image Sensor (CSI0) | | J3 | Stereo Image Sensor (CSI1) | | J6 | Cooling Fan Connector | | J7 | BLSP6 (GPIO) and BLSP9 (UART) | | J13 | Expansion B2B | | J14 | Integrated GNSS Antenna Connection | | J1001 | Programming and Debug/UART3 | | J1002 | UART ESC, UART2/TELEM3 | | J1003 | PPM RC In | | J1004 | RC Input, Spektrum/SBus/UART6 | | J1006 | USB 2.0 Connector (PX4/QGroundControl) | | J1007 | 8-Channel PWM/DShot ESC Output | | J1008 | CAN Bus | | J1009 | I2C3, UART4 | | J1010 | Telemetry (TELEM1) | | J1011 | I2C2, Safety Button Input | | J1012 | External GPS & Mag, UART1, I2C1 | | J1013 | Power Input, I2C3 | ## J2 - Hires 4k Image Sensor (CSI0) | J2 Board Connector | Image Sensor (Flex) Mating Connector | | --- | --- | | Panasonic, MPN: AXT336124 | Panasonic MPN: AXT436124 | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | | --- | --- | --- | --- | | 1 | GND | 2 | GND | | 3 | VREG_L17A_2P8 (AFVDD) | 4 | CAM0_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | CAM0_MCLK3 | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | ##### Supported Sensors The following sensors are supported on J2 (CSI0): - IMX214 - IMX230 - IMX377 - IMX378 - OV16825 Supported modules: | Description | MPN | Link | Datasheet | | --- | --- | --- | --- | | ModalAI Sony IMX214 wide angle | MCAM-00024 | EOL | [Datasheet](/M0025/) | | ModalAI Sony IMX214 | MCAM-00024 | EOL | [Datasheet](/M0025/#m0025-1-85cm-imx214-100-fov-eol) | | ModalAI Sony IMX377 | MCAM-00026 | EOL | [Datasheet](/M0025/) | [Top](#table-of-contents) --- ## J3 - Stereo or Time-of-flight Image Sensor (CSI1) | J3 Board Connector | Image Sensor (Flex) Mating Connector | | --- | --- | | Panasonic, MPN: AXT336124 | Panasonic MPN: AXT436124 | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | | --- | --- | --- | --- | | 1 | GND | 2 | GND | | 3 | VREG_L18A_2P8 (AFVDD) | 4 | CAM1_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_S4A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM1_RST0_N | 10 | CAM_MCLK1_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI1_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI1_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI1_LANE0_CONN_P | 18 | CAM1_MCLK3 | | 19 | MIPI_CSI1_LANE0_CONN_M | 20 | VREG_L23A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI1_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI1_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI1_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI1_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI1_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI1_LANE3_CONN_M | 36 | GND | ##### Supported Image Sensors The following sensors are supported on J3 (CSI1): - OV7251 - PMD (Infineon) Supported modules: | Description | MPN | Link | Datasheet | | --- | --- | --- | --- | | Stereo Camera Pair for Obstacle Avoidance Kit | MSU-M0015-1-01 | EOL | [Datasheet](/M0015/)| | PMD Time of Flight | MKIT-00017-3 | [Buy](https://www.modalai.com/products/m0178) | [Datasheet](/M0040/) | [Top](#table-of-contents) --- ## J6 - Cooling Fan Connector ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | EXT_FAN_5V | | 2 | EXT_FAN_RET | ##### Connector - J.S.T. Corporation, SM02B-SRSS- TB(LF)(SN) ##### Mating Connector VOXL Side: - J.S.T. Corporation, MPN: SM02B- SRSS-TB(LF)(SN) Fan Side: - J.S.T. Corporation - Connector, MPN: SHR-02V-S - Connector Contact Pins, MPN: SSH-003T-P0.2-H ##### Notes Supported Fan Module: - DDH Enterprise, Inc, MPN: DDH-2016-013 MCN: 420-59855-0001 [Top](#table-of-contents) --- ## J7 BLSP6 (I2C) and BLSP9 (UART / SPI): External GPS/MAG ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V | | | 2 | BLSP9_UART_TX_3P3 | GPIO 49 / BLSP9_SPI_MOSI | | 3 | BLSP9_UART_RX_3P3 | GPIO 50 / BLSP9_SPI_MISO | | 4 | BLSP6_I2C_SDA_3P3 | GPIO 27 | | 5 | GND | | | 6 | BLSP6_I2C_SCL_3P3 | GPIO 28 | | 7 | BLSP6_AUX2_3P3 | (original docs show GPIO 26, however not functional) | | 8 | BLSP6_AUX1_3P3 | (original docs show GPIO 25, however not functional) | | 9 | BLSP9_UART_CTS_N_3P3 | GPIO 51 / BLSP9_SPI_CS_N | | 10 | BLSP9_UART_RFR_N_3P3 | GPIO 52 / BLSP9_SPI_CLK | ##### Connector - HIROSE Electric, MPN: DF13-10P-1.25H ##### Mating Connector VOXL Side: - HIROSE Electric, MPN: DF13- 10P-1.25H GPS/MAG Side: - HIROSE Electric, MPN: DF13- 10S-1.25C ##### Notes Supported GPS Module: - MCN: 20-CE766-H1 = CCA, H13931V2, SIRFSTARV CREST BOARD REV2 The above uses antenna: - TAOGLAS LTD, MPN: CGGBP.25.4.A.02 [Top](#table-of-contents) --- ## J13 - Expansion B2B connection ##### Pin Configuration | Pin # | Signal Name | Pin # | Signal Name | | --- | --- | --- | --- | | 1 | GND | 2 | VDCIN_5V_CONN | | 3 | APQ_GPIO_96 | 4 | VDCIN_5V_CONN | | 5 | APQ_GPIO_95 | 6 | VDCIN_5V_CONN | | 7 | APQ_GPIO_94 | 8 | USB2_HS_ID | | 9 | APQ_GPIO_92 | 10 | GND | | 11 | GND | 12 | USB2_HS_D_M | | 13 | BLSP11_0_SCL_GPIO61 | 14 | USB2_HS_D_P | | 15 | BLSP11_1_SDA_GPIO60 | 16 | USB2_HS_VBUS_CONN | | 17 | BLSP11_2_RX_GPIO59 | 18 | GND | | 19 | BLSP11_3_TX_GPIO58 | 20 | APQ_GPIO_64 | | 21 | GND | 22 | APQ_GPIO_127 | | 23 | BLSP8_0_SCL_GPIO7 | 24 | APQ_GPIO_126 | | 25 | BLSP8_1_SDA_GPIO6 | 26 | APQ_GPIO_70 | | 27 | BLSP8_2_RX_GPIO5 | 28 | APQ_GPIO_71 | | 29 | BLSP8_3_TX_GPIO4 | 30 | APQ_GPIO_72 | | 31 | GND | 32 | APQ_GPIO_93 | | 33 | JTAG_TDO | 34 | APQ_GPIO_91 | | 35 | JTAG_SRST_N | 36 | GND | | 37 | JTAG_TCK | 38 | APQ_GPIO_106 | | 39 | JTAG_TDI | 40 | APQ_GPIO_107 | | 41 | JTAG_TMS | 42 | APQ_GPIO_108 | | 43 | JTAG_TRST_N | 44 | GND | | 45 | JTAG_PS_HOLD | 46 | APQ_GPIO_114 | | 47 | VREG_S4A_1P8 | 48 | APQ_GPIO_104 | | 49 | PMIC_RESIN_N | 50 | APQ_GPIO_103 | | 51 | APQ_RESOUT_N | 52 | APQ_GPIO_102 | | 53 | VREG_3P3V | 54 | APQ_GPIO_101 | | 55 | KYPDPWR_N | 56 | APQ_GPIO_57 | | 57 | VPH_PWR | 58 | GND | | 59 | GND | 60 | PM8996_GPIOC15 | ##### Connector - Samtec Inc., MPN: QSH-030-01-L-D-A-K ##### Mating Connector VOXL Side: - Samtec Inc., MPN: QSH-030-01-L-D-A-K Debug Board Side: - Samtec Inc, MPN: QTH-030-02- L-D-A-K ##### Notes Supported Debug B2B Module: - Eagle Nest, MCN: 20-H9420-1 - Serial Feather PRO Edition, MCN: 30-H9916-1 More details are available [here](#j13---expansion-b2b-connection). [Top](#table-of-contents) --- ## J14 - Integrated GNSS Antenna Connection ##### Pin Configuration - Center Conductor ##### Connector - HIROSE Electric, MPN: U.FL-R- SMT-1(10) ##### Mating Connector VOXL Side: - HIROSE Electric, MPN: U.FL-R- SMT-1(10) GNSS Antenna Side: - HIROSE Electric, MPN: U.FL-LP ##### Notes Supported Module: - CABLE ASSY, U.FL TO SMA-F BHD, 1.32 MM COAX MCN: CV90-N5175-A4 - Passive antenna configuration (no DC bias) [Top](#table-of-contents) --- ## J1001 - Programming and Debug Console (USART3) Connector: 8 Position, Vertical, BM08B-SRSS-TB(LF)(SN) *Note: used for PX4 debug console, can be used for STM32 FW update* | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 | | 2 | USART3_2W_DEBUG_TX | | 3 | USART3_2W_DEBUG_RX | | 4 | SWDIO | | 5 | SWCLK | | 6 | GND | | 7 | !RESET | | 8 | VPP_STM | [Top](#table-of-contents) ## J1002 - UART ESC, UART2/TELEM3 Interface Connector Connector: 6 Position DF13, Vertical, DF13-6P-1.25V(50) *Note: 2 wire UART is OK here* | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins are 3.3V, input or output if supplied at another pin) | | 2 | UART2_4W_RX_3V3 | | 3 | UART2_4W_TX_3V3 | | 4 | UART2_4W_RTS_3V3 | | 5 | GND | | 6 | UART2_4W_CTS_3V3 | [Top](#table-of-contents) ## J1003 - PPM RC In Connector: 3 Position JST GH, Vertical, BM03B-GHS-TBT **Note: This JST connector is reversed when compared to Flight Core, pinouts are still the same** | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | PPM_IN | | 3 | GND | [Top](#table-of-contents) ## J1004 - RC input / Spektrum/SBus/USART6 Connector Connector: 4 Position JST GH, Vertical, BM04B-GHS-TBT *Note: For SBus receievers (e.g. FrSky X8R), power off 5VDC from another port* | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 (Spektrum Power) | | 2 | USART6_TX | | 3 | SPEKTRUM RX (3.3V), SBus RX (3.3V), USART6_RX | | 4 | GND | [Top](#table-of-contents) ## J1006 - USB Connector USB connection for PX4 only (doesn't not connect to VOXL/Linux). > This connector does not provide system power! The system pulls more that 500mA and thus can't be powered from USB! Connector: BLUE 4 Position JST GH, Vertical, BM04B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | VBUS_IN | | 2 | DATA_M | | 3 | DATA_P | | 4 | GND | [Top](#table-of-contents) ## J1007 - 8-Channel PWM / 4-Channel DShot ESC Output Connector Connector: 10 Position JST GH, Vertical, BM10B-GHS-TBT > 5V is for Ref Only | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins are 3.3V, input or output if supplied at another pin) | | 2 | PWM_CH1 | | 3 | PWM_CH2 | | 4 | PWM_CH3 | | 5 | PWM_CH4 | | 6 | PWM_CH5 | | 7 | PWM_CH6 | | 8 | PWM_CH7 | | 9 | PWM_CH8 | | 10 | GND | [Top](#table-of-contents) ## J1008 - CAN Bus Connector Connector: 4 Position JST GH, Vertical, BM04B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC | | 2 | CANH* | | 3 | CANL* | | 4 | GND | *CAN signals are compliant with ISO 11898-2:2016 and SAE J2284-1 to SAE J2284-5 [Top](#table-of-contents) ## J1009 - I2C3, UART4 Connector: 6 Position JST GH, Vertical, BM06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | UART4_2W_TX_3V3 | | 3 | UART4_2W_RX_3V3 | | 4 | EXP_I2C3_SCL | | 5 | EXP_I2C3_SDA | | 6 | GND | [Top](#table-of-contents) ## J1010 - Telemetry Connector (TELEM1) Connector: 6 Position JST GH, Vertical, MB06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | UART_4W_TX_3V3 | | 3 | UART_4W_RX_3V3 | | 4 | UART_4W_CTS_3V3 | | 5 | UART_4W_RTS_3V3 | | 6 | GND | [Top](#table-of-contents) ## J1011 - I2C2, Safety Button Input Connector: 5 Position, Vertical, BM05B-SRSS-TB(LF)(SN) | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 | | 2 | GND | | 3 | I2C2_SDA | | 4 | I2C2_SCL | | 5 | Safety Switch In (switch should pull high to 3.3V to enable) | [Top](#table-of-contents) ## J1012 - External GPS & Mag, USART1, I2C1 Connector Connector: 6 Positiom JST GH, Vertical, BM06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | EXT_GPS_USART1_2W_TX | | 3 | EXT_GPS_USART1_2W_RX | | 4 | EXT_GPS_I2C1_SCL | | 5 | EXT_GPS_I2C1_SDA | | 6 | GND | [Top](#table-of-contents) ## J1013 - 5V DC Power Input, I2C3 to power cable “APM” *Note: This is the main power input and power monitoring connector. See [Power Modules](/power-module-v3-datasheet/)* ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | 5V DC | | 2 | GND | | 3 | I2C3_SCL | | 4 | I2C3_SDA | ##### Connector - Molex Inc, MPN: 22-05-7045 ##### Mating Connector - 50-37-5043 based cables ##### Notes - I2C3 is at 5V CMOS with 10K pull-ups. - Connect to provided power cable for proper operation and current handling. ##### Supported Modules - mRo GPS u-Blox Neo-M8N Dual Compass LIS3MDL+ IST8310 - [Pixhawk 4 2nd GPS Module](https://holybro.com/products/m8n-gps) [Top](#table-of-contents) --- ### VOXL Flight Board Bottom ![VOXL-Flight Bottom](/images/voxl-flight/voxl-flight/voxl-flight-overlay-bottom-144.png) *Note: 1000 Series connectors accessible from the STM32/PX4* | Connector | Summary | | --- | --- | | J4 | Tracking/Optic Flow Image Sensor (CSI2) | | J8 | USB 3.0 OTG (ADB) | | J10 | BLSP7 UART and I2C off-board | | J11 | BLSP12 UART and I2C off-board | | VOXL microSD | | | PX4 microSD | 32Gb Max | | Wi-Fi Antennas | Included in Kit [Molex 1461531100](https://www.digikey.com/en/products/detail/molex/1461531100/8543422) | [Top](#table-of-contents) ## J4 - Tracking/Optic Flow Image Sensor (CSI2) | J4 Board Connector | Image Sensor (Flex) Mating Connector | | --- | --- | | Panasonic, MPN: AXT336124 | Panasonic MPN: AXT436124 | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | | --- | --- | --- | --- | | 1 | GND | 2 | GND | | 3 | VREG_L29A_2P8 (AFVDD) | 4 | CAM2_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM2_RST0_N | 10 | CAM_MCLK2_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI2_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI2_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI2_LANE0_CONN_P | 18 | CAM2_MCLK3 | | 19 | MIPI_CSI2_LANE0_CONN_M | 20 | VREG_L23A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI2_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI2_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI2_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI2_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI2_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI2_LANE3_CONN_M | 36 | GND | ##### Supported Image Sensors The following sensors are supported on J4 (CSI2): - OV7251 Supported modules: | Description | MPN | Link | Datasheet | | --- | --- | --- | --- | | Sunny MD102A w/ MSU-M0008-1-01 Adapter | MSU-M0072-1-01 | EOL | | | ModalAI 166-degree OV7251 B&W VGA Global Shutter | MSU-M0014-1-01 | EOL | | [Top](#table-of-contents) --- ## J8 - USB 3.0 OTG ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | VBUS | | 2 | D- | | 3 | D+ | | 4 | ID | | 5 | GND | | 6 | MICA_SSTX- | | 7 | MICA_SSTX+ | | 8 | GND_DRAIN | | 9 | MICA_SSRX- | | 10 | MICA_SSRX+ | ##### Connector - KYCON, MPN: KMMX- AB10- SMT1SB30 ##### Mating Connector - Micro A/B Plug ##### Notes - Host mode (e.g. connect a supported USB 3.0 device) requires Micro-A Plug to STD-A in order to get 3.0 SS Functionality. Example cable: Amphenol RUB30-0075 (contact ModalAI for details, available as MCBL-00019-1) - Host mode USB 2.0 - [example cable](https://www.amazon.com/CableCreation-Micro-Compatible-Android-Tablet/dp/B01M5GZ3N0) [Top](#table-of-contents) --- ## J10 - UART or I2C off-board (external Sonar or IMU sensor) ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V | | | 2 | SONAR_UART_TX_3P3 | GPIO 53 | | 3 | SONAR_UART_RX_3P3 | GPIO 54 | | 4 | EXT_IMU_I2C_SDA_3P3 | GPIO 55 | | 5 | GND | | | 6 | EXT_IMU_I2C_SCL_3P3 | GPIO 56 | ##### Connector - HIROSE Electric, MPN: DF13-6P-1.25H(50) ##### Mating Connector - DF13-6S-1.25C cable assemblies ##### Notes - UART and I2C are at 3.3V CMOS levels. - Connect TX to target device’s RX, and vice-versa. - I2C has 10K pull-ups. [Top](#table-of-contents) --- ## J11 - BLSP12 off-board (SPEKTRUM) ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V_SPEKTRUM | | | 2 | BLSP12_UART_TX_3P3 | GPIO 85 | | 3 | BLSP12_UART_RX_3P3 | GPIO 86 | | 4 | BLSP12_I2C_SDA_3P3 | GPIO 87 | | 5 | GND | | | 6 | BLSP12_I2C_SCL_3P3 | GPIO 88 | ##### Connector - Hirose Electric, MPN: DF13-6P-1.25H(50) ##### Mating Connector - DF13-6S-1.25C cable assemblies ##### Notes - UART and I2C are at 3.3V CMOS levels. - Connect TX to target device’s RX, and vice-versa. - I2C has 10K pull-ups. [Top](#table-of-contents) --- #### Wi-Fi Antenna Connectors (2) ##### Function - External Wi-Fi antenna connections ##### Pin Configuration - Center Conductor ##### Connector - IPEX, MPN: 20449-001E (MHF-4) ##### Mating Connector ##### Supported Antennas - [Molex 1461531100](https://www.digikey.com/en/products/detail/molex/1461531100/8543422) ##### Notes - ANT #1 is for WLAN/BT - ANT #2 is for WLAN only [Top](#table-of-contents) --- [Next: VOXL Flight LEDs](/voxl-flight-datasheet-leds/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-flight-datasheet-leds/ # VOXL Flight LEDs --- ![VOXL-Flight LEDs](/images/voxl-flight/voxl-flight/voxl-flight-leds.png) ## LED1 LED1 is marked on silkscreen as "DS1000". It's tri-color RGB LED. ### Bootloader Mode Upon power up, while attached to USB, the device will stay in the bootloader mode for 5 seconds. | Color | Pattern | Status | | --- | --- | --- | | Green | Fast Flashing (~10 Hz) | In bootloader, waiting | | Yellow/Red | Alternating | Serial FW update in progress | ### Normal Mode | Color | Pattern | Status | | --- | --- | --- | | Green | Solid | Powered | | Blue | Flashing (~2 Hz)| Disarmed | | Blue | Solid | Armed | | Red | Solid | Error, hard fault | ### Sensor Calibration Mode | Color | Pattern | Status | | --- | --- | --- | | Green | Solid | Powered | | Blue | Flashing (~20 Hz)| Calibration in progress | ## LED2 LED2 is marked on silkscreen as "DS1001". It's tri-color RGB LED. **For future use**. ## LED3 LED3 is marked on silkscreen as "DS1". It's tri-color RGB LED. **For future use**. [Next: VOXL Flight IMUs](/voxl-flight-datasheet-imus/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-flight-datasheet-imus/ # VOXL Flight IMUs --- ## VOXL Flight IMU Hardare Configuration VOXL Flight has two IMUs connected to the snapdragon and three connected to the PX4 flight controller MCU. In the VOXL-SDK, both snadragon IMUs are enabled and provide data through MPA, however IMU0 should be preferentially used since it is a newer and better performing part. Note this differs from the VOXL board which contains two of the same IMU. Configuring MPA services with voxl-configure-mpa will select the correct IMU based on board part number. ### Summary #### VOXL Flight M0019 | Configuration | Part Number | Interface | |---------------------------------|-------------|------------| | VOXL IMU0 (recommended) | ICM-42688-P | VOXL SPI10 | | VOXL IMU1 | ICM-20948 | VOXL SPI1 | | Flight Core IMU1 | ICM-20602 | PX4 SPI1 | | Flight Core IMU2 | ICM-42688 | PX4 SPI2 | | Flight Core IMU3 (likely DNI'd) | BMI-088 | PX4 SPI6 | #### VOXL Flight M0069 | Configuration | Part Number | Interface | |------------------|-------------|------------| | VOXL IMU0 | ICM-42688-P | VOXL SPI10 | | VOXL IMU1 | ICM-42688-P | VOXL SPI1 | | Flight Core IMU1 | ICM-20602 | PX4 SPI1 | | Flight Core IMU2 | ICM-42688 | PX4 SPI2 | ### VOXL Flight IMUs Top ![VOXL-Flight IMUs Top](/images/voxl-flight/voxl-flight/voxl-flight-imus-top.png) ### VOXL Flight IMUs Bottom ![VOXL-Flight IMUs Bottom](/images/voxl-flight/voxl-flight/voxl-flight-imus-bottom.png) [Next: VOXL Flight Configuration](/voxl-flight-datasheet-configuration/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-flight-datasheet-configuration/ # VOXL Flight Configuration --- ## QGroundControl Configuration of the VOXL Flight is fully supported by QGroundControl 4.0. ## PX4 Parameter Files Parameter files are available for reference: - ## PX4 System Defaults The following describe the system defaults, as specified by `boards/modalai/fc-v1/init/rc.board_defaults` ### MAVLink Instance 0 - configured by default as TELEM1 (exposed at`J1010`) at 57600 baud in Normal mode - this is configurable by the user ### MAVLink Instance 1 - hard coded to TELEM2 as it's routed in the PCB, defaulted at 921600 baud in Normal mode - this is the primary serial interface to communicate with VOXL - the baud rate and mode are configurable by the user, but recommended to use the defaults ### Safety Switch Disabled The saftety switch can be 'pressed' by pulling `J1011` pin 5 up to 3.3V (which is provided by J13 pin 1). By default, we have the safety switch disabled, but it can be enabled via QGroundControl by setting `CBRK_IO_SAFETY` to 0. [Next: VOXL Flight Kits](/voxl-flight-kits/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-flight-kits/ # VOXL Flight Kits --- ## VOXL Flight Development Kits ![voxl-flight-dk](/images/voxl-flight/voxl-flight-dk.jpg) Available for purchase here Kits available: - MDK-M0019-2-00 - VOXL Flight Board Only - MDK-M0019-2-01 - VOXL FLight Power Module v3 (M0041-1-B), cables (MCK-M0019) and antennas (MRF-M0019) - MRF-M0019-1 - Wi-Fi antennas - MCK-M0019-1 - VOXL Flight Cable Kit PWM breakout (M0022), and cables (USB-to-JST MCBL-00010, RC input MCBL-00005) --- Source: https://docs.modalai.com/voxl/ # VOXL VOXL is ModalAI's autonomous computing platform built around the Snapdragon 821. The VOXL architecture combines a single board computer with a depth camera, flight controller and cellular modem to create fully autonomous, connected drones and robots! ![voxl](/images/voxl/voxl-whiteb.jpg) ## Why VOXL? The VOXL technology builds on the Qualcomm® Flight Pro™ architecture by adding comprehensive software development support with a build-able Linux kernel, cross-compile SDKs, LTE, time of flight cameras, [Docker images](https://gitlab.com/voxl-public/support/voxl-docker) for development and more. --- Source: https://docs.modalai.com/voxl-user-guides/ # VOXL User Guides --- Source: https://docs.modalai.com/thermal-and-performance/ # Thermal and Performance Resources for debugging thermal performance on VOXL platform VOXL, and all Snapdragon platforms, use frequency scaling to control thermal and try to maximize performance. The VOXL will limit maximum frequency if the SoC becomes too hot. Therefore it is important to manage resources carefully, like in all embedded platforms. A good article on thermal frequnecy scaling can be found [here](https://www.androidauthority.com/what-is-cpu-frequency-scaling-672253/). This page is dedicated to some of the tools available on VOXL to manage performance. Mechanical solutions, such as a [fan](https://www.modalai.com/products/voxl-cooling-fan) or a heatsink, help maximize performance. We have found this 5g [cooling fan](https://www.modalai.com/products/voxl-cooling-fan) to have a good tradeoff in performance and weight. --- ## voxl-inspect-cpu [voxl-inspect-cpu](/voxl-inspect-cpu/) is a useful tool for monitoring CPU and GPU utilization and core temperatures. ## voxl-perfmon (deprecated in favor of [voxl-inspect-cpu](/voxl-inspect-cpu/)) A Python script to monitor CPU and GPU usage as well as individual core temperatures called `voxl-perfmon` is bundled in the `voxl-utils` package that is installed by default on the target. [Usage can be found here](/voxl-utils/) [Source code can be found here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-utils/tree/master/src/voxl-perfmon) ## Commands ### Governor Set CPU 0 to performance mode ```$ echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor``` View CPU 0's governor mode ```$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor``` Set GPU to performance mode ```$ echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor``` View GPU's governor mode ```$ cat /sys/class/kgsl/kgsl-3d0/devfreq/governor``` #### Other CPU Governor Options | Governor | Description | | --- | --- | | performance | Run the CPU at the maximum frequency. | | powersave | Run the CPU at the minimum frequency. | | userspace | Run the CPU at user specified frequencies. | | ondemand | Scales the frequency dynamically according to current load. Jumps to the highest frequency and then possibly back off as the idle time increases. | | conservative | Scales the frequency dynamically according to current load. Scales the frequency more gradually than ondemand. | ### Frequency View CPU 0's current frequency ```$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq``` View CPU 0's minimum frequency ```$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq``` View CPU 0's maximum frequency ```$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq``` View CPU 3's available frequencies for scaling ``` $ cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_available_frequencies $ 307200 403200 480000 556800 652800 729600 806400 883200 940800 1036800 1113600 1190400 1248000 1324800 1401600 1478400 1555200 1632000 1708800 1785600 1824000 1920000 1996800 2073600 2150400 ``` Set CPU 3's maximum frequency to 1785600 in the governor ```$ echo 1785600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq``` View GPU's current frequency ```cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq\``` View GPU's minimum frequency ```$ cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq``` View GPU's maximum frequency ``` cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq``` View GPU's available frequencies ``` $ cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies $ 3133000000 214000000 315000000 401800000 510000000 560000000 624000000 ``` Set GPU's maximum frequency to 560000000 in the governor ```$ echo 560000000 > /sys/class/kgsl/kgsl-3d0/devfreq/max_freq``` ### Online See which CPU's are online ```$ cat /sys/devices/system/cpu/online``` Set CPU 2 offline ```$ echo 0 > /sys/devices/system/cpu/cpu2/online``` [Next: USB to Ethernet with VOXL](/usb-to-ethernet-with-voxl/){: .btn .btn-green } --- Source: https://docs.modalai.com/usb-to-ethernet-with-voxl/ # Using USB to Ethernet with VOXL ## Summary Resources for using Ethernet on VOXL platform. Allows VOXL to communicate with other devices via Ethernet. There are two different hardware configurations below to choose from. ## Setup using VOXL USB Expander Board ![voxl-dk](/images/voxl/usb-to-ethernet-1.png) ![voxl-dk](/images/voxl/usb-to-ethernet-closeup.png) ### Required Hardware - VOXL - VOXL USB Expander Board (Usage info can be found [here](/m0151/)) - USB Type-A Female to JST Cable (`MCBL-00009-1`) - USB to Ethernet Adapter ([Here](https://www.amazon.com/Apple-MC704LL-A-Ethernet-Adapter/dp/B00W7W9FK0/ref=sr_1_3?keywords=usb+to+ethernet+apple&qid=1575492214&s=electronics&sr=1-3) is one that is known to work) - Ethernet Cable ### Hardware Setup - Disconnect power from the VOXL - Attach the daughter board’s `J1` connector to VOXL’s `J13` connector - Attach the `MCBL-00009-1` cable to the `USB2 Host` connector on the daughter board - Attach the USB male side of the USB to Ethernet adapter to the USB female side of the `MCBL-00009-1` cable - Connect the Ethernet cable to other side of the USB to Ethernet adapter - Connect other side of the Ethernet cable to the device you would like to communicate with - Reconnect power to the VOXL [Next: VOXL GPIO](/voxl-gpio-io/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-gpio-io/ # VOXL GPIO --- ## Overview All non-PMIC GPIO pins that are broken out on VOXL's headers can be accessed by the Sensors DSP (SDSP) and the CPU. For accessing GPIO via the SDSP, we provide a simple library, libapq8096-io (formerly libvoxl-io) to enable communication with GPIO functionality from the applications processor (Linux userspace). This layer hides the SDSP RPC calls and allows compiling programs that use GPIO without the need of Hexagon DSP toolchain or build environment. Accessing the GPIO from linux space can also be done using standard commands, as is documented below. The libapq8096-io library header and API description can be found here: [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/-/blob/master/lib/include/voxl_io.h](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/-/blob/master/lib/include/voxl_io.h) The library is included with the [VOXL Software Bundle](/voxl-supporting-software/). ## GPIO Pin Numbers Any IO pin exposed on J7, J10, J11 and J12 can be used as GPIO pin (not concurrently with any other functionality, such as UART, I2C, or SPI) More details on the above ports and their pinouts can be seen on the [datasheet page](/voxl-datasheets/). ## Manipulating GPIO using Linux Commands ### Output ``` #gpio number GPIO=52 #do this once echo $GPIO > /sys/class/gpio/export echo out > /sys/class/gpio/gpio${GPIO}/direction #set output value (1 or 0) echo 1 > /sys/class/gpio/gpio${GPIO}/value ``` ### Input ``` #gpio number GPIO=52 #do this once echo $GPIO > /sys/class/gpio/export echo in > /sys/class/gpio/gpio${GPIO}/direction #read gpio state cat /sys/class/gpio/gpio${GPIO}/value ``` ## Examples using libapq8096_io ### voxl-gpio This tool allows you to read or write GPIO state from linux command line. Upon executing ```voxl-gpio```, the GPIO pin will be initialized to the desired function (read or write). [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-gpio.c](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-gpio.c) ``` / # voxl-gpio Usage: voxl-gpio read voxl-gpio write <0,1> ``` - ```voxl-gpio write``` will not print anything to command line, unless there is an error (printed to stderr). Return value is 0 if success, otherwise -1. - ```voxl-gpio read``` will print the state of the pin to cmd line (0 or 1), unless there is an error (printed to stderr). Return value is 0 if success, otherwise -1. ### voxl-gpio-loopback Another simple GPIO example is GPIO loopback tester. [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-gpio-loopback.c](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-gpio-loopback.c) ``` / # voxl-gpio-loopback GPIO Loopback Test Usage: voxl-gpio-loopback Output pin will be toggled high / low while reading input pin state. If the two pins are externally connected, their state should match. ``` ## Performance (using libapq8096_io) - GPIO state is persistent after exiting libvoxl_io functions or calls to voxl-gpio - Opening the GPIO Pin (```voxl_gpio_init```) can take around 20 ms (if ```libvoxl_io``` is already loaded in SDSP) or up to 100ms (if ```libvoxl_io``` is not loaded on SDSP). - Once GPIO Pin is open, reading / writing (```voxl_gpio_read``` and ```voxl_gpio_write```) should take 1-2ms (assuming ```libvoxl_io``` is already loaded in SDSP). However, since ```voxl-gpio``` tool opens and closes the pin every time, the minimum call time for ```voxl-gpio``` read or write is 20ms and can be higher depending on CPU load. - Actual GPIO read and write calls on SDSP are much quicker (100us or less), but CPU<->SDSP communication introduces additional delay, resulting in 1-2ms as seen on the CPU side. - "Loaded on SDSP" means there is another process currently using ```libvoxl_io``` on SDSP. SDSP will clean up and unload any library which is not used. - For example, calling ```voxl-gpio``` multiple times (one after another) will result in loading and unloading ```libvoxl_io``` each time, unless another process is continuously using ```libvoxl_io```. ## Warnings and Limitations - A GPIO pin should not be open concurrently by several processes, otherwise undesired behavior may occur (such as one process closing the pin while another is still using it - would result in second process unable to continue using the pin). - Concurrent usage of the same pin by multiple processes is not prohibited by ```libapq8096-io```, but has to be handled carefully, especially setting pin direction and closing the pin. [Next: Software Packaging on VOXL](/packaging-on-voxl/){: .btn .btn-green } --- Source: https://docs.modalai.com/docker-on-voxl/ # How to run Ubuntu on VOXL using Docker ## Overview This document provides an overview of how to run docker containers on your VOXL developer board! ## Requirements The [latest platform image](/downloads/) installed ## Configuration ### VOXL 2 VOXL 2 has a Debian operating system and does not need any special treatment to use Docker beyond a normal `apt` style install. For VOXL 2, please ignore the rest of this document and do not run any of the commands listed here. Instead, follow the [official Docker installation instructions](https://docs.docker.com/engine/install/ubuntu/). ### VOXL and VOXL Flight The [latest platform image](/downloads/) has Docker support built in. After installing the [latest platform image](/downloads/), run the configuration script **voxl-configure-docker-support**. Instructions below: ``` / # voxl-configure-docker-support detected APQ8096 Starting Wizard Do you want to wipe the /etc/modalai/docker-autorun-script.sh file back to factory default? 1) yes 2) no #? 1 Copying default docker-autorun-script.sh to /etc/modalai/ Do you want to enable the modalai docker-daemon systemctl service? This service is the same as the original docker systemctl service but with customizations for VOXL. The original service will be disabled and must remain disabled 1) yes 2) no #? 1 disabling original docker service Removed symlink /etc/systemd/system/multi-user.target.wants/docker.service. enabling modalai docker-daemon service Created symlink from /etc/systemd/system/default.target.wants/docker-daemon.service to /etc/systemd/system/docker-daemon.service. Do you want to enable the modalai docker-autorun systemctl service? this will let you configure a docker image to load on boot using the user-configurable /etc/modalai/docker-autorun.sh file 1) yes 2) no #? 1 disabling original docker service enabling modalai docker-daemon service loading hello-world docker image successfully loaded hello-world before REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 47bdf2e73073 15 months ago 13.26 kB efc161607398 6 years ago 2.088 kB tagging image as hello-image:latest after REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 47bdf2e73073 15 months ago 13.26 kB hello-image latest efc161607398 6 years ago 2.088 kB hello-world docker image successfully loaded enabling docker-autorun Created symlink from /etc/systemd/system/default.target.wants/docker-autorun.service to /etc/systemd/system/docker-autorun.service. done configuring voxl-docker-support ``` Now you can list the available images. ```bash yocto:/# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest efc161607398 Less than a second ago 2.088 kB ``` Install the roskinetic Docker to test ## Download & Push a Docker Image to VOXL Download the pre-built docker image roskinetic-xenial_v1_0.tgz from [ModalAI Downloads](https://downloads.modalai.com). To build this image yourself from docker files, follow the instructions [here](https://gitlab.com/voxl-public/voxl-docker-images/roskinetic-docker). For the remainder of these instructions, it's easier to use the pre-built image for now. VOXL's flash memory is broken up into partitions, the largest of which is /data/ which is 16GB. voxl-docker-support already configures docker to use this partition for storage. When pushing a large docker image to VOXL you should also push to this directory. The following steps push an image and load it on VOXL. This will be slow so we suggest using a USB3.0 cable if you have one. ```bash me@mylaptop:~$ adb push roskinetic-xenial_v1_0.tgz /data/ me@mylaptop:~$ adb shell / # bash yocto:/# cd /data/ yocto:/data# docker load -i roskinetic-xenial_v1_0.tgz ``` Now look to make sure the image is loaded ```bash yocto:/data# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest efc161607398 3 years ago 2.088 kB roskinetic-xenial v1.0 ef8f2f502423 About a minute ago 1.633 GB ``` ## Running a Docker Image When running an image, we suggest telling docker to mount the home directory in Yocto to a directory inside the docker image to facilitate transferring data in and out. Here, we mount /home/root/ in Yocto to /root/yoctohome/ in docker. We also suggest using the --net=host option so processes such as ROS running inside Docker can transparently communicate with processes outside of the Docker. With this method ROS nodes can run and communicate both inside and outside of a Docker image seamlessly. ```bash docker run -it --rm --privileged --net=host --name roskinetic -v /home/root:/root/yoctohome/:rw -w /root/ roskinetic-xenial:v1.0 /bin/bash ``` For a complete list of arguments, see the [Official Docker Documentation](https://docs.docker.com/reference/cli/docker/container/run/). However, for the purposes of running docker images on VOXL, here are the arguments you will likely wish to use: | Argument | Description | |:-------------------------|:-------------------------------------------------------------------------------------| | -it | Interactive mode, usually used when you wish to open a bash shell inside the docker. | | --rm | Automatically remove the container when it exits to prevent containers stacking up. | | --privileged | Gives the docker container access to /dev/ | | --net=host | Lets network interfaces appear the same inside and outside of the docker container. | | --name {name} | Give a name to the running instance so you can identify and attach to it by name. | | -v {outside}:{inside}:rw | Mounts a directory outside the container to a directory inside the container. | | -w {working_dir} | Set the working directory inside the container. | ## Running a Docker Image with the voxl-docker tool If you are using voxl-docker-support >= v1.1 as included with voxl-software-bundle 3.0 you can launch the docker image with voxl-docker which is faster to type and will mount your Yocto home directory inside the docker image at ~/yoctohome/ ```bash yocto:/home/root# voxl-docker -i roskinetic-xenial:v1.0 roskinetic:~$ ls ros_catkin_ws yoctohome roskinetic:~$ ``` ## optional: give the image your own tag To save time, you can tag the docker image you just loaded with a shorter name. ```bash yocto:/home/root# docker tag roskinetic-xenial:v1.0 kinetic yocto:/home/root# voxl-docker -i kinetic roskinetic:~$ ls ros_catkin_ws yoctohome roskinetic:~$ ``` ## Making Changes and Archive the image Most of the time, you should be working in the shared directory /root/yoctohome/ inside the docker image so that changes you make in this directory are saved when you close the docker instance. However. if you wish you make changes to the docker image itself such as installing a new package, you need to commit these changes. In one terminal, start the docker image and make the changes you want. ```bash yocto:/home/root# voxl-docker -i roskinetic-xenial:v1.0 roskinetic:~$ sudo apt install htop ``` Now, leave this session running and in a second terminal use docker ps to see the running container instance. ```bash yocto:/# docker ps CONTAINER ID IMAGE COMMAND CREATED 616362e8cdb1 roskinetic-xenial:v1.0 "/bin/bash" About a minute ago ``` Then copy the container id of the instance you want to commit and use docker commit to save the changes. You can see a new image has been made right away. ```bash yocto:/# docker commit 616362e8cdb1 roskinetic-xenial:htop 40869821b17f1b49196b354a3bbdf9fab70bdb4310b0b20d8470a361fa19ac59 yocto:/# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE roskinetic-xenial htop 40869821b17f 29 seconds ago 1.635 GB roskinetic-xenial v1.0 0e12749bdc00 2 hours ago 1.633 GB ``` To back up your newly modified image and transfer to other devices you can save it in an archive. The output of the following will match the prebuilt image we distribute at downloads.modalai.com ```bash yocto:/# docker save roskinetic-xenial:v1.0 | gzip > /data/roskinetic-xenial_v1_0.tgz ``` ## Configuring a program to run automatically inside a docker on boot The voxl-docker-support package includes a systemd service called docker-autorun which, once enabled, will execute the /etc/modalai/docker-autorun.sh script. Put whatever you like in that autorun script, but it's intended for things running inside docker containers. The docker_autorun.sh script contains two examples: #### hello world This example just starts the hello-world docker image which does nothing except print to the screen and exit. Note that we run in non-interactive mode with the -n argument and set the entrypoint as an empty string with the -e argument as we don't want it executing anything ```bash voxl-docker -n -i hello-world -e "" ``` #### mavros Assuming you have following the [mavros instructions](/mavros/), this example runs mavros automatically on boot. Note we use the -w argument to set the working directory to where the run_mavros.sh script is located. ```bash voxl-docker -n -i roskinetic-xenial:v1.0 -w /root/yoctohome/mavros_test/ -e "/bin/bash run_mavros.sh" ``` ## Building Your Own Docker Image for VOXL To build this image from docker files, follow the instructions [here](https://gitlab.com/voxl-public/voxl-docker-images/roskinetic-docker). ## Troubleshooting If you have issues, check the two systemd services provided by [voxl-docker-support](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-docker-support). Most likely you just need to reboot. ```bash yocto:/# systemctl status docker-start ● docker-start.service Loaded: loaded (/etc/systemd/system/docker-start.service; enabled; vendor preset: enabled) Active: active (running) since Thu 1970-01-01 00:00:06 UTC; 11min ago yocto:/# systemctl status docker-prepare ● docker-prepare.service Loaded: loaded (/etc/systemd/system/docker-prepare.service; enabled; vendor preset: enabled) Active: inactive (dead) since Thu 1970-01-01 00:00:36 UTC; 11min ago Process: 3691 ExecStart=/usr/bin/docker-prepare.sh (code=exited, status=0/SUCCESS) Main PID: 3691 (code=exited, status=0/SUCCESS) ``` ## Access to MIPI cameras The MIPI cameras are accessed using Qualcomm proprietary 32-bit libraries and services that are not available in the Docker environment. There are a few workarounds to this. ### voxl-camera-server [voxl-camera-server](/voxl-camera-server/) will publish camera frames using [libmodal_pipe](/libmodal-pipe/). These frames are available to a Docker if the /run/mpa directories are shared into the Docker ### ROS Use a ROS node outside of the Docker to publish camera frames and put ROS node(s) inside of the Docker that subscribe to the camera frames. ## Access to the DSPs The sensors DSP (sDSP) and applications DSP (aDSP) communicate to the CPUs via an RPC mechanism that has not yet been ported to the Docker environment. ## Access to the GPU on VOXL 1 OpenCL is used to access the GPU. For example, OpenCV can be built with OpenCL support to accelerate certain operations using the GPU hardware. To get OpenCL working in Docker use the example project located [here](https://gitlab.com/voxl-public/voxl-docker-images/voxl-docker-opencl) to get started. ## Move Docker image from /data to /mnt/sdcard In order to change where the root of the docker runtime points to in the docker service go to ```/etc/systemd/system/docker-daemon.service``` and change the following line so that it uses the sd card(ext4 format) in the voxl ```ExecStart=/usr/bin/docker daemon -g /mnt/sdcard``` restart the service for the changes to take effect: ```systemctl restart docker-daemon.service``` Delete the directories that docker uses in the data partition:```cd /data; rm -rf containers linkgraph.db overlay tmp volumes graph network repositories-overlay trust``` [NOTE] The previous commands will delete any images that were previously available. You can now run ```voxl-configure-docker-support.sh``` and a hello world image will be created and the directories that were deleted from the ```/data``` partition will be in the ```/mnt/sdcard``` directory. You can verify that you have freed up the ```/data``` partition via ```df -h``` [Special Note] Not all SD cards can be used for Docker. In our lab tests a SanDisk Ultra 16GB card worked fine but a SanDisk Extreme 32GB card failed. [Next: VOXL Serial IO](/voxl-serial-io/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-i2c-io/ # VOXL I2C --- ## Overview All I2C ports that are broken out on VOXL's headers are internally mapped to the Sensors DSP (SDSP). This also means that you cannot use I2C ports via /dev/i2c* as other embedded Linux systems may allow. We provide a simple library, libvoxl-io to enable communication with I2C functionality from the applications processor (Linux userspace). This layer hides the SDSP RPC calls and allows compiling programs that use I2C without the need of Hexagon DSP toolchain or build environment. The libvoxl-io library header and API description can be found here: [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h) The library is included with the [VOXL Software Bundle](/voxl-supporting-software/). ## I2C Port Numbers I2C port numbers correspond directly with the BLSP numbers. Please see [datasheet page](/voxl-datasheets/) for more details. - J1 : I2C8 (5V levels) - J7 : I2C6 - J10 : I2C7 - N/A : I2C3 is used to connect to on-board pressure sensor BMP-280 - there are additional I2C ports, used for communication with cameras, and are not available to VOXL users. - J11 : I2C12 (*WARNING* I2C12 is not functioning. It is disabled in ```libvoxl_io```) ## Examples and Tools ### voxl-i2c This tool allows you to scan, read or write data from/to devices on I2C port from linux command line. [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-i2c.c](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-i2c.c) ``` ~ # voxl-i2c Description: Command line tool for using i2c functionality via SDSP Usage: voxl-i2c scan [register_address=0] Scan all i2c addresses (0-126) Print the value of specified register for detected devices voxl-i2c read Read data from i2c slave starting from start_register and print their values voxl-i2c write Write data to i2c slave starting from start_register Data should be provided as space-delimited array of uint8's ``` Usage Examples: Read example (read some calibration data from on-board pressure sensor BMP-280 ) ``` ~ # voxl-i2c read 3 400000 118 0x88 10 7 110 144 104 24 252 222 148 40 214 ``` Read and write example in a bash script (set up MPU6050 IMU and read raw data (assume sensor connected externally to I2C6)) ``` set -e #set mpu6050 to run mode voxl-i2c write 6 400000 0x68 107 0 sleep 0.1 #set up sampling rates, gyro and accel ranges voxl-i2c write 6 400000 0x68 26 0 0x18 0x18 #read 14 bytes (3 gyro, 3 accel, 1 temperature values.. 2 bytes each) while : do voxl-i2c read 6 400000 0x68 59 14 done ``` The output should be something like this.. ``` 0 25 1 101 8 51 243 16 255 188 0 2 0 2 0 21 1 83 8 55 243 32 255 218 255 242 0 1 0 19 1 84 8 38 243 48 255 191 0 2 0 4 ... ... ``` ### 16-bit and 32-bit Register Access Accessing 16-bit (and 32-bit) registers is supported by ```libvoxl_io```. However, please note that the register address is sent Least Significant Byte (LSB) first. So, if you are accessing a 16-bit register and the i2c device is expecting MSB first, then you need to byte swap order of byte0 and byte1 in the 4-byte register address before providing it to the i2c read/write calls. In case of 32-bit registers, the order of all 4 bytes needs to be reversed if i2c device expects MSB first. ## Performance - Initializing I2C port (```voxl_i2c_init```) can take around 15-20 ms (if ```libvoxl_io``` is already loaded in SDSP) or up to 100+ms (if ```libvoxl_io``` is not loaded on SDSP). - Once I2C port is open, reading / writing (```voxl_i2c_read``` and ```voxl_i2c_write```) should take 1-2ms (assuming ```libvoxl_io``` is already loaded in SDSP). However, since ```voxl-i2c``` tool opens and closes the port every time, the minimum call time for ```voxl-i2c``` read or write is 20ms and can be higher depending on CPU load. - Actual I2C read and write calls on SDSP are much quicker (about 250us to execute one-byte read or write transaction), but CPU<->SDSP communication introduces additional delay, resulting in 1-2ms as seen on the CPU side. - "Loaded on SDSP" means there is another process currently using ```libvoxl_io``` on SDSP. SDSP will clean up and unload any library which is not used. - For example, calling ```voxl-i2c``` multiple times (one after another) will result in loading and unloading ```libvoxl_io``` each time, unless another process is continuously using ```libvoxl_io```. ## Warnings and Limitations - An I2C port should not be open concurrently by several processes, otherwise undesired behavior may occur (such as one process closing the port while another is still using it - would result in second process unable to continue using the process). - Concurrent usage of the same port by multiple processes is not prohibited by ```libvoxl_io```, but has to be handled carefully, especially opening and closing the port. TODO: need to check what happens if you read / write at the same time from different threads / processes. [Next: VOXL Fan Control](/voxl-fan-control/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-fan-control/ # How to Control Fan on VOXL --- ## Connect the Fan Connect the cooling fan rated for 5V to J6 (see [VOXL Connectors](/voxl-datasheets-connectors/)) ## Control the Fan with the voxl-fan utility voxl-cpu-monitor monitors the CPU temperature and adjust the fan control accordingly. The voxl-utils package (>= v0.5.8) includes a utility `voxl-fan` to control the fan speed. ``` yocto:/# voxl-fan --help General Usage: voxl-fan on voxl-fan slow voxl-fan off ``` The fan is on at full speed when voxl boots. It can be slowed down to half speed with `voxl-fan slow` or turned off completely with `voxl-fan off`. ## Control the Fan PWM driver directly ``` # Spin the fan using 25kHz PWM, 50% duty cycle PWM_DEVICE=/sys/class/pwm/pwmchip0 echo 0 > ${PWM_DEVICE}/export echo 40000 > ${PWM_DEVICE}/pwm0/period echo 20000 > ${PWM_DEVICE}/pwm0/duty_cycle echo 1 > ${PWM_DEVICE}/pwm0/enable ``` Notes - The fan turns on at full power when the board is turned on - The ```period``` and ```duty_cycle``` numbers are in microseconds - PWM Switching Frequency (kHz) = 1000000 / ```period``` - PWM ```duty_cycle``` should be in the range of [0..```period```] - Only several discrete frequencies are possible : 12.5khz, 15.00khz 18.75khz, 25khz, 30.00khz, 37.5khz, 50khz - The requested period gets rounded off or truncated to pick one of these frequencies [Next: Access Camera Data](/access-camera-data/){: .btn .btn-green } --- Source: https://docs.modalai.com/access-camera-data/ # How to Access Camera Data The offical supported method for accessing camera data on VOXL is through MPA and voxl-camera-server. This page covers lower level methods for accessing camera data and should not be used unless you really know what you are doing and are okay breaking voxl-camera-servera nd other MPA services. --- ## Overview There are multiple ways to access camera data on VOXL. The following table enumerates those ways in increasing order of abstraction. This information is applicable to the [high-resolution](/M0025/), [tracking](/M0014/) and [stereo](/M0015/) sensors. | Method | Information | Notes | | --- | --- | --- | | v4l2 | TBD | Lowest level access, currently not documented for VOXL. [Kernel Docs](https://www.kernel.org/doc/html/v4.15/media/v4l-drivers/qcom_camss.html) | | HAL3 | (source not public) | Lowest level currently documented. Supports image quality adjusted images through ISP as well as raw. | | QMMF | Example | QMMF is Qualcomm Multi-media Framework. Has interesting video recording and streaming features, not well documented publicly. | | libcamera | [Example in ROS Code](https://gitlab.com/voxl-public/Deprecated/voxl-cam-manager/blob/master/src/SnapdragonCameraManager.cpp) | Supports image quality adjusted images through ISP as well as raw. | | ROS | [Docs](/voxl-cam-ros/)
[Source](https://gitlab.com/voxl-public/Deprecated/voxl-cam-ros) | Integrate camera processing in a standard ROS format | | ROS2 | Coming soon | | ## Time of Flight Camera The ToF camera pipeline is treated slightly differently. The following table contains multiple references for how to utilize ToF on VOXL. | Method | Information | Notes | | --- | --- | --- | | ROS | [Docs](/tof-cam-ros/)
[Source](https://gitlab.com/voxl-public/Deprecated/tof_cam_ros) | | | HAL3 | (source not public) | | ## Video Encoding VOXL supports up to 250Mbps of video encoding through hardware acceleration. Examples of how to use the video encoder can be found at the following resources. | Method | Information | Notes | | --- | --- | --- | | OpenMax | Example Code. | Standard embedded video encoding acceleration | [Next: Unbrick VOXL](/unbrick-voxl/){: .btn .btn-green } --- Source: https://docs.modalai.com/unbrick-voxl/ # Unbricking Procedure for VOXL and VOXL Flight --- ## Overview The System Image flashing process requires the device to be in `fastboot` mode. The typical process uses `adb` to put the VOXL into `fastboot` mode over USB. If the device is bricked and one cannot get the VOXL into `fastboot` using USB, then you'd follow this process before running the `install.sh` script as described in the [Flash System Image](/flash-system-image/) process. The following VOXL add-on boards support the force fastboot mode switch: * USB and Serial Debug Expander ([datasheet](/m0078/)) ### Video Tutorial ### Force VOXL into fastboot To force the VOXL to boot into `fastboot` mode: - Power off the VOXL - Detach VOXL USB cable (to ensure USB is not supplying any power VOXL) - Attach the USB Expander and Debug Add-On board - Ensure the `FASTBOOT` labeled switch is set to **on** - Ensure the `EMERG BOOT` labeled switch is set to **off** - NOTE: if your board is missing the `EMERG BOOT` switch, this is OK as its default un-populated state is OFF - Power on the VOXL - Reattach VOXL USB cable - After VOXL boots up (about 5 seconds), set the `FASTBOOT` back to **off** You can verify you are in `FASTBOOT` with the following command: ```bash sudo fastboot devices ``` You should see an output like: ```bash a0259b4a fastboot ``` ### Reflashing System Image after Forcing the VOXL into Fastboot To reflash the System Image, run the following while in Fastboot mode: ``` $ sudo ./install.sh -f ``` Flashing the System Image using `install.sh` is [covered in this section](/flash-system-image/). ## Prevent Flash Corruption (i.e., Bricking) With flash, like what is used on VOXL, removing power while the kernel is writing will result in corruption and bricking of the board. It can happen during development when a lot of changes are being made on the board and then power is removed. Use the /data partition for file storage to avoid this issue. Linux has a setting for how often the flash is committed to reduce the risk, but of course there could be different side effects. You can see a writeup on the topic [here](https://superuser.com/questions/1057007/adjust-linux-disk-flush-intervals-to-avoid-blocking-user-processes), as it is common in all of this type of single board computers Your smartphone fixes this by making you press the poweroff button before shutting off power. To prevent flash data corruption, run poweroff before removing power: ``` $ poweroff -f ``` [Next: Onboard LED Control](/voxl-onboard-led-control/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-onboard-led-control/ # How to Control the On-board RGB LEDs on VOXL --- VOXL has a small surface mount RGB LED located next to the fan connector J6. LEDs can be accessible using the following devices: ``` /sys/class/leds/red /sys/class/leds/green /sys/class/leds/blue ``` Query maximum brightness setting.. Should be 255 (optional): ``` cat /sys/class/leds/red/max_brightness 255 ``` Set PWM period (microseconds) for LED PWM control (optional.. default 1khz) ``` #set to 1kHz echo 1000 > /sys/class/leds/red/pwm_us ``` Set brightness of 127 (out of 255) for red LED: ```bash echo 127 > /sys/class/leds/red/brightness ``` Turn red LED off: ```bash echo 0 > /sys/class/leds/red/brightness ``` [Next: VOXL as a USB host](/voxl-as-usb-host/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-as-usb-host/ # How to use VOXL as USB Host --- ## Overview Using VOXL or VOXL Flight's USB 3.0 OTG Port (J8), the system can be used as a USB3.0 Host provided you use a non-standard USB3.0 cable. It can be used as a USB2.0 host with a standard micro-USB2.0 cable. One or more additional USB2.0 host ports are available on VOXL Add-ons ([USB Expander and Debug](/usb-expander-and-debug-datasheet/), [LTE v2](/lte-modem-and-usb-add-on-v2-datasheet/), [Microhard v2](/microhard-add-on-datasheet/)) ### Background Because the USB3.0 SS pins on the VOXL cannot support TX/RX swapping, they were set to peripheral mode since the Snapdragon 821 is used mainly in phones and peripheral mode is way more commonly used in a phone configuration. In order for systems to use the standard micro-b to type A female OTG cables, they need to do TX/RX swapping. Since VOXL can't do this, it needs to use a non-standard pinout as it's default configuration is peripheral mode. A non-standard USB3.0 Female A Plug to Micro-B cable (formerly MCBL-00019) is required. ### Procedure 1. Plug in your USB device via a compatible USB3.0 Female A Plug to Mirco-B cable - in our case, we have a USB3.0 Female A Plug to Micro-B plug in the VOXL's J8 port. _Note: Some customers report success using USB3 with a USB3 OTG adapter like [this](https://www.amazon.de/deleyCON-Super-Speed-Adapter-Buchse-mehrfarbig/dp/B00WHZASVM/)._ 1. Run ``lsusb -v`` * Check ``bcdUSB`` field for USB Version ![USB3.0 Female A Plug to Micro-B](/images/voxl/usb3cable.jpg) Here's an example of a USB3 device: ```bash Bus 004 Device 003: ID 0781:5581 SanDisk Corp. Ultra Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.20 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 9 idVendor 0x0781 SanDisk Corp. idProduct 0x5581 Ultra bcdDevice 1.00 iManufacturer 1 USB iProduct 2 SanDisk 3.2Gen1 ``` Here's an example of a USB2 device: ```bash Bus 003 Device 003: ID 045e:00f8 Microsoft Corp. LifeCam NX-6000 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x045e Microsoft Corp. idProduct 0x00f8 LifeCam NX-6000 bcdDevice 1.00 iManufacturer 1 Microsoft iProduct 2 Microsoft? LifeCam NX-6000 iSerial 0 bNumConfigurations 1 ``` [Next: VOXL Tracking Sensor Guide](/voxl-tracking-sensor-user-guide/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-tracking-sensor-user-guide/ # VOXL Tracking Sensor User Guide --- ## Overview The tracking sensor is a monochrome, global-shutter OV7251 camera with a 166° fisheye lens. On VOXL and VOXL Flight it plugs into connector J4, the tracking camera port (CSI2). It is the camera that visual-inertial odometry (VIO) uses for GPS-denied navigation, so it is part of most standard camera configurations. Two modules fit this port: the [M0014](/M0014/) tracking module on a 9 cm flex and the [M0072](/M0072/) fisheye module. Both are end of life; the datasheets name the current replacements. ## Requirements - VOXL or VOXL Flight running [VOXL System Image](/voxl-system-image/) 2.0 or newer. - An [M0014](/M0014/) or [M0072](/M0072/) tracking module. - A host PC with ADB, see [Setting Up ADB](/setting-up-adb/). ## Hardware 1. Power off VOXL or VOXL Flight. 2. Seat the module's flex in connector J4 with the contacts facing the board, then close the connector latch. 3. Power the board back on. The [VOXL Camera Configurations](/voxl-camera-config/) page shows which port each camera type uses and which configurations include a tracking camera. ## Configure the camera server Open a shell on the board, then run the camera configuration tool and pick a configuration that includes a tracking camera (configurations 1 through 7 do): ```bash adb shell voxl-configure-cameras ``` Restart the camera server so the new configuration takes effect: ```bash systemctl restart voxl-camera-server ``` ## Verify the camera Check that frames are arriving on the tracking pipe: ```bash voxl-inspect-cam tracking ``` The output shows frame rate, resolution, and exposure. See [VOXL Inspect Camera](/voxl-inspect-cam/) for the other options. To view the image, open [VOXL Portal](/voxl-portal/) in a browser on a device on the same network as the board and pick the tracking camera from the camera dropdown. ## Next steps - VIO depends on an accurate camera calibration. Run the procedure on the [Calibrate Cameras](/calibrate-cameras/) page after mounting the camera. - [VOXL Inspect qVIO](/voxl-inspect-qvio/) shows the VIO output that the tracking camera feeds. - [Next: VOXL Hi-Res Sensor Guide](/voxl-hi-res-sensor-user-guide/) --- Source: https://docs.modalai.com/voxl-hi-res-sensor-user-guide/ # VOXL Hi-res Sensor User Guide --- ## Streaming High-resolution Camera See [voxl-streamer](/voxl-streamer) ### Accessing Two High-resolution Cameras Simultaneously The following are _very_ technical notes on how to enable dual high-resolution imager streaming. In short, the two sensors need different i2c addresses. That means either two different imagers need to be used, like IMX214 and IMX377, or their i2c selection addresses need to be modified. ### Using two hi-res cameras at the same time - two hi-res cameras need to be plugged into connectors J2 (CAM0) and J3 (CAM1) (see connectors datasheet). - the hi-res cameras need to have different I2C addresses, otherwise I2C communication will collide and cause unpredictable behavior - IMX412 sensor module has a resistor pair which can be used to change the default I2C address of the camera. R11 and R12 on M0061 - see M0061_i2c_selection_R11_R12.png - R12 is installed by default, so I2C ID is 0x1a (7bit) 0x34 (8bit) - Removing R12 and installing R11 results in I2C ID 0x10 (7bit) 0x20 (8bit) -- this will be referred to as IMX412(alt) : alternate i2c address - when updating i2c addres in camera_confi.xml, use 8-bit address : `0x20` - default camera_config.xml already looks for IMX412 with default i2c ID on J2 (CAM0) and alternate i2c ID on J3 (CAM1) - only two non-raw streams are possible total (third camera would need to use RAW format) ### Supported Concurrent Output Formats and FPS - all formats are supported in dual hires camera configuration - h264/h265 encoder has a maximum throughput limitation - concurrent dual RAW10 - any raw resolution / FPS supported by each camera (no additional limitations) - concurrent YUV - any processed resolution / FPS supported by each camera (no additional limitations) - concurrent h264 / h265 : - 4K20 + 4K20 - 4K30 + 1080p30 - 1080p60 + 1080p60 - 1080p90 + 1080p60 ### I2C addressing - camera_config.xml expect 8-bit I2C id - e.g. `0x20` - dmesg will print debug statements using 7-bit I2C id - use dmesg to dump kernel messages.. ``` # IMX412 on J2 (CAM0) [ 6.771738] msm_camera_cci_i2c_read: CDBG: READ dev addr 0x1a reg addr = 0x16 [ 6.771949] msm_cci_i2c_read_bytes: Trying to read address 0x16 [ 6.771954] msm_camera_cci_i2c_read: CDBG: SUCCESS data: 0x577 [ 6.771958] msm_camera_cci_i2c_read addr = 0x16 data: 0x577 [ 6.771964] imx412 probe succeeded ``` ``` # IMX412 on J3 (CAM1) (alternate I2C address) [ 8.432678] msm_camera_cci_i2c_read: CDBG: READ dev addr 0x10 reg addr = 0x16 [ 8.433288] msm_cci_i2c_read_bytes: Trying to read address 0x16 [ 8.433301] msm_camera_cci_i2c_read: CDBG: SUCCESS data: 0x577 [ 8.433314] msm_camera_cci_i2c_read addr = 0x16 data: 0x577 [ 8.433328] imx412 probe succeeded ``` ``` # IMX377 on J2 (CAM0) [ 8.149673] msm_camera_cci_i2c_read: CDBG: READ dev addr 0x1a reg addr = 0x3044 [ 8.149948] msm_cci_i2c_read_bytes: Trying to read address 0x3044 [ 8.149959] msm_camera_cci_i2c_read: CDBG: SUCCESS data: 0x32 [ 8.149969] msm_camera_cci_i2c_read addr = 0x3044 data: 0x32 [ 8.149979] imx377 probe succeeded ``` ``` OV7251 Tracking on J4 (CAM2) [ 6.586116] msm_camera_cci_i2c_read: CDBG: READ dev addr 0x70 reg addr = 0x300a [ 6.586857] msm_cci_i2c_read_bytes: Trying to read address 0x300a [ 6.586880] msm_camera_cci_i2c_read: CDBG: SUCCESS data: 0x7750 [ 6.586902] msm_camera_cci_i2c_read addr = 0x300a data: 0x7750 [ 6.586922] ov7251 probe succeeded ``` - IC2 Addresses of ModalAI cameras: - IMX214 : 0x10 (7-bit) 0x20 (8-bit) - IMX230 : 0x10 (7-bit) 0x20 (8-bit) - IMX377 : 0x1a (7-bit) 0x34 (8-bit) - IMX412 : 0x1a (7-bit) 0x34 (8-bit) - IMX412 (alt) : 0x10 (7-bit) 0x20 (8-bit) - ov7251 : 0x70 (7-bit) 0xE0 (8-bit) - ov7251 stereo : 0x60 (7-bit) 0xC0 (8-bit) (both cameras) - ov9782 stereo : 0x60 (7-bit) 0xC0 (8-bit) (both cameras) - ov9281 : 0x10 (7-bit) 0x20 (8-bit) - ov9282 : 0x10 (7-bit) 0x20 (8-bit) ### Possible Dual Hires Combinations - Since IMX412 allows to change the I2C address in hardware (resistor), the following combinations are possible - IMX412 + IMX412 (alt) - IMX377 + IMX412 (alt) - IMX214 + IMX412 - IMX377 + IMX214 - it does not matter which camera slot they are plugged into : CAM0 (J2), CAM1 (J3), CAM2 (J4) - make sure camera_config.xml has an entry for each camera in correct slot : `` entry corresponds to camera slot 0,1, or 2 - default camera_config.xml (as of platform version 3.2.0) supports the following dual hires camera configurations: - IMX412: CAM0=J2, CAM1=J3, IMX412(alt) : CAM1=J3 - IMX377: CAM0=J2, CAM1=J3 - IMX214: CAM0=J2, CAM1=J3 - CAM2 slot (J4) can also be used for a hires camera, but camera_config.xml would need to be modified to reflect the camera slot 2 ### Camera Start Order - if camera with RAW stream is present, it needs to be started first (ov7251 raw or TOF) - it does not matter which hires camera is started first - it seems if one hires camera stops streaming (process stopped), the other camera process my also die as well ### Synchronization - currently synchronization between dual hires camera setup is not implemented - it is possible to do in hardware (primary hires camera will generate sync signal for secondary) or in software (adjust fps to align incoming SOF) [Next: VOXL Stereo Sensor Guide](/voxl-stereo-sensor-user-guide/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-stereo-sensor-user-guide/ # VOXL Stereo Sensor User Guide --- ## Overview The stereo sensor is a pair of monochrome, global-shutter OV7251 cameras with 85° lenses on a shared flex, synchronized so both frames are captured at the same instant. On VOXL and VOXL Flight it plugs into connector J3, the stereo camera port (CSI1). Its output feeds depth-from-stereo processing. The module is the [M0015](/M0015/) stereo sensor kit. It is end of life; the datasheet names the current replacements. ## Requirements - VOXL or VOXL Flight running [VOXL System Image](/voxl-system-image/) 2.0 or newer. - An [M0015](/M0015/) stereo module. - A host PC with ADB, see [Setting Up ADB](/setting-up-adb/). ## Hardware 1. Power off VOXL or VOXL Flight. 2. Seat the module's flex in connector J3 with the contacts facing the board, then close the connector latch. 3. Mount the two cameras rigidly. Any flex between them after calibration degrades the depth output. 4. Power the board back on. The [VOXL Camera Configurations](/voxl-camera-config/) page shows which port each camera type uses and which configurations include the stereo pair. ## Configure the camera server Open a shell on the board, then run the camera configuration tool and pick a configuration that includes stereo cameras (configurations 1, 3, 7, and 10): ```bash adb shell voxl-configure-cameras ``` Restart the camera server so the new configuration takes effect: ```bash systemctl restart voxl-camera-server ``` ## Verify the cameras Check that frames are arriving on the stereo pipe: ```bash voxl-inspect-cam stereo ``` The output shows frame rate, resolution, and exposure. See [VOXL Inspect Camera](/voxl-inspect-cam/) for the other options. To view the images, open [VOXL Portal](/voxl-portal/) in a browser on a device on the same network as the board and pick the stereo camera from the camera dropdown. ## Next steps - Depth from stereo needs a stereo calibration. Run the procedure on the [Calibrate Cameras](/calibrate-cameras/) page after mounting the cameras. - The [VOXL DFS Server](/voxl-dfs-server/) page describes the depth-from-stereo service that consumes the stereo pipe. - [Next: VOXL ToF Sensor Guide](/voxl-tof-sensor-user-guide/) --- Source: https://docs.modalai.com/voxl-serial-io/ # VOXL Serial IO --- ## Overview All serial ports (UART & I2C) and GPIO pins that are broken out on VOXL's headers are internally mapped to the Sensors DSP (SDSP). The main benefit of this is that low-level and time-sensitive interaction to sensors and telemetry communications can be handled by the SDSP's real-time operating system. This may also free up CPU cycles on the applications processor. This does, however, mean that you cannot talk to the serial ports with reads and writes to /dev/i2cX or /dev/ttyOX as you would on other embedded Linux systems. We provide a simple library, libvoxl-io to enable communication with serial ports from the applications processor (Linux userspace). This layer hides the SDSP RPC calls and allows compiling programs that use the serial ports without needed the Hexagon DSP toolchain or build environment. The libvoxl-io library header and API description can be found here: [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h) The library is included with the [VOXL Software Bundle](/voxl-supporting-software/). ## Port Numbers A look inside the libvoxl-io API header, voxl-io.h, shows the VOXL port numbers have pre-defined macros for easy of use. [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/include/voxl_io.h) ```C #define UART_J7 9 // BLSP 9 on physical port J7 pins 2&3 #define UART_J10 7 // BLSP 7 on physical port J10 pins 2&3 #define UART_J11 12 // BLSP 12 on physical port J11 pins 2&3 #define UART_J12 5 // BLSP 5 on physical port J12 pins 2&3 ``` More details on the above ports and their pinouts can be seen on the [datasheet page](/voxl-datasheets/). ## RPC Shared Memory To speed up communication between the applications processor and SDSP, we recommend the user to use RPC shared memory for read and write buffers so as to avoid the system needing to copy memory back and forth between the two processors. This can be done easily with the following libvoxl-io functions: ```C uint8_t* voxl_rpc_shared_mem_alloc(size_t bytes); void voxl_rpc_shared_mem_free(uint8_t* ptr); void voxl_rpc_shared_mem_deinit(); ``` See the examples section for more information: ## Examples A very simple UART example is the uart loopback tester that's built into libvoxl-io. This performs reads and writes as well as shows some of the configuration options available. [https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-uart-loopback.c](https://gitlab.com/voxl-public/Deprecated/libapq8096-io/blob/master/lib/apps/voxl-uart-loopback.c) A more advanced example on how to use the UART interface is the voxl-vision-px4 program which uses UART to communicate with a PX4 flight controller via the MAVlink protocol. This example performs both read and writes to a UART port as well as utilizes RPC shared memory buffers. [https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/blob/master/src/uart_mavlink.c](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-vision-hub/blob/master/src/uart_mavlink.c) ## I2C Coming soon! [Next: VOXL System Image](/voxl-system-image/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-tof-sensor-user-guide/ # VOXL ToF Sensor User Guide --- ![VOXL ToF](/images/voxl/voxl-tof-sensor/voxl-tof.png) ## Requirements - VOXL or VOXL-Flight with [VOXL System Image](/voxl-system-image/) 3.2.0 or newer - VOXL ToF Sensor ([available here](https://www.modalai.com/products/m0178)) - If trying to visualize with ROS: - Linux with Rviz - [Setup ROS on Host PC]() - [Setup ROS on VOXL]() ## Hardware - Ensure VOXL/VOXL-Flight is powered off - Connect to VOXL/VOXL-Flight connector `J3` as shown (or `J2` if using concurrently with stereo cameras) ![VOXL ToF Install](/images/voxl/voxl-tof-sensor/voxl-tof-install-0.png) ## Connect to VOXL ### Over ADB ``` bash adb shell ``` ### Over Wifi - Setup and [connect](/wifi-setup/) VOXL/VOXL-Flight - SSH onto the target: - VOXL IP will be 192.168.8.1 if in softap mode - If in station mode, you will have to run `ifconfig` on voxl to see what IP your network has assigned the voxl ```bash ssh root@IP-ADDR-OF-VOXL oelinux123 ``` ## Configure Cameras on VOXL On VOXL: - Ensure the voxl is set up by running the following commands on voxl: ```bash voxl-configure-cameras ``` - Select the option that best fits your setup - Restart the camera server ```bash systemctl restart voxl-camera-server ``` ## Viewing the Data with voxl-portal Ensure that voxl-camera-server and voxl-portal are running with: ```bash voxl-inspect-services ``` If either are not, start them with ```bash systemctl start voxl-camera-server ``` or ```bash systemctl start voxl-portal ``` Once they're both running, open a web browser on a device connected to the same network as the drone, type in the drone's IP, click on the camera dropdown, and select one of the tof images to be shown a page like this: ![VOXL ToF Install](/images/voxl/voxl-tof-sensor/TOF-Sensor-Portal.png) voxl-portal does not currently support viewing the 3d pointcloud, but this is in the works and should be available in the coming weeks! ## Viewing the Data with ROS ### Configure ROS on voxl On VOXL: ```bash # view network information ifconfig ``` - This will give you the IP address of the VOXL, configure ROS by modifying the `/home/root/my_ros_env.sh` file: ```bash vi /home/root/my_ros_env.sh exec bash ``` ### Configure ROS On Desktop On Linux desktop: - Find IP address ```bash # view network information ifconfig ``` - Configure ROS environment variables, where the ROS_MASTER_URI is what you saw on the VOXL ```bash export ROS_IP=IP-ADDR-OF-PC export ROS_MASTER_URI=http://AAA.BBB.CCC.DDD:XYZUV/ ``` - source variables, where xxxxxx is the ROS version you have installed ```bash source /opt/ros/xxxxx/setup.bash ``` ### Launch Node on VOXL ```bash roslaunch /opt/ros/indigo/share/voxl_mpa_to_ros/launch/voxl_mpa_to_ros.launch ``` ### Launch RViz on Desktop - On the host computer, run RViz ```bash rviz ``` - On the leftmost column click on the "Add" button - In the pop-up options click on "Image" - Change Display Name to "IR-Image" - In the left column under "IR-Image" tab select type in Image Topic as the TOF IR Image - Click on the "Add" button again - In the pop-up options click on "Image" - Change Display Name to "Depth-Image" - In the left column under "Depth-Image" tab select type in Image Topic as the TOF Depth Image - "Add" PointCloud2 with TOF pointcloud topic ![ToF Visualized](/images/voxl/voxl-tof-sensor/voxl-tof-visualized.png) [Next: UVC Streaming](/uvc-streaming/){: .btn .btn-green } --- Source: https://docs.modalai.com/uvc-streaming/ # UVC Video Streaming (RTSP) --- ## Overview This user guide provides the necessary steps to get video streaming over RTSP network using a UVC (e.g. USB webcam like a Logitech C270) and the VOXL system. In short, we'll be doing the following: - Connect an HD USB webcam to the VOXL's USB Hub - Use `ffmpeg` on the VOXL to stream the video to the host computer - Use either VLC or QGC on a host computer to view the video stream ## Requirements ### Hardware | Part Number | Description | Link | | --- | --- | --- | | Host Computer | Ground Control Station (Ubuntu 18.04) | | VOXL-DK | VOXL Development Kit | EOL | MPS-00001-1 | 5V/6A Power Supply | EOL, replaced by [PS-XT60](https://www.modalai.com/products/ps-xt60) | MCBL-00009-1 | USB Cable (Host, 4-pin JST to USB 2.0 Type A Female) | [Purchase](https://www.modalai.com/products/mcbl-00009) | Camera USB Cable | USB Cable included with camera (Mini USB) | One of the following VOXL Add-on boards is required. | Part Number | Description | Link | | --- | --- | --- | | MDK-M0048-1-01 | VOXL Microhard Modem Add-on | [Purchase](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) | MDK-M0017-1-01| VOXL USB Expansion Board with Fastboot and Emergency Boot | EOL | MDK-M0030-1-01 | VOXL Cellular LTE and USB hub add-on | [Purchase](https://www.modalai.com/products/m0130-3) ### Target Software TODO check isn't this part of the base system image now?? `ffmpeg` is no longer included as part of the [VOXL-Suite](https://gitlab.com/voxl-public/voxl-sdk/voxl-suite). ### Host Software - On the host computer, install [VLC media player](https://www.videolan.org/vlc/index.html), which we'll used to display the RTSP video: ```bash sudo apt-get install vlc ``` ## Setup Hardware - Disconnect power from the VOXL - Attach the USB Hub accessory to VOXL J13 - Attach the JST cable to the JST USB connector (J16 or J17) - Attach the Logitech C270 (or equivalent) UVC camera to the USB connector on the JST to USB Female A cable - Connect power to the VOXL ![jst-connection](/images/voxl/jst-connection.png) ## Network Configuration - Configure the VOXL as an Access Point (or connect it to a network) - instructions on how to do this are [here](/wifi-setup/) - the default IP address of the device will be `192.168.8.1` - Connect the host computer to the VOXL's Access Point (default password is 1234567890) or to the same network you connected the VOXL to ## Run Software on Target ### Starting FFmpeg - SSH onto the target (see here for details) or ADB in using a micro-usb to USB cable - First, validate the the USB device is found using the `lsusb` command: ``` root@apq8096:~# lsusb Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ``` - Start ffmpeg with the following default command ``` ffmpeg -i /dev/video2 -f mpegts udp://QCS_IP:4242 ``` Replace `GCS_IP` with the IP address of your host computer acting as the Ground Control Station. FFmpeg has a large variety of flags that can be set in order to change the encoder settings and modify the resolution, framerate, bitrate, etc. of the video stream. The documentation can be found on the [FFmpeg website](https://ffmpeg.org/ffmpeg.html). ## Viewing Stream ### VLC - On the host system, run the VLC software - Go to `Media > Open Network Stream` - Enter the following URL: `udp://@:4242` - Click `Play` to view the video stream ### QGroundControl Before attempting to view the video stream, follow these instructions on connecting to QGC: [How to Connect QGroundControl to VOXL using WiFi](/qgc-wifi/) - After your connection has been established to QGC, press the purple QGC logo in the top left corner in order to access the `Application Settings` menu. - Under the `General` tab, scroll down until you find the `Video` section. - Under the `Video Source` dropdown, choose `MPEG-TS (h.264) Video Stream`. - In the `UDP Port` field enter the default: `4242` - You will now be able to view the video stream under QGC's `Fly` view. ## Recommended UVC Cameras The Arducam is the recommended UVC camera for the m500. There are many different Arducams to choose from depending on your requirements. You can find the Arducam Specs and Selection guide by going [here](https://docs.arducam.com/uvc-camera-module/specs-and-selection-guide/). The Arducam `B0229` is an excellent choice: * Field of View (FOV)D=105°, H= 90°, V= 65° * Supports MJPG 15fps@ 3264x2448, 30fps@1080P, and YUY2 30fps@ 640x480 formats. [How to mount Arducam on the m500 Gimbal](/voxl-m500-gimbal-user-guide/#arducam-gimbal-mounting) [Next: Streaming FLIR Video](/voxl-uvc-flir/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-uvc-flir/ # VOXL Flir UVC Video Streaming (RTSP) --- ## Overview This user guide provides the necessary steps to stream Flir Boson or Lepton over RTSP network using the USB UVC interface and the VOXL system. In short, we'll be doing the following: - Connect a Flir USB camera to the VOXL's V2 Debug Board - Use [voxl-streamer](/voxl-streamer/) on the VOXL to stream the video to the host computer - Use either VLC or QGC on a host computer to view the video stream ## Requirements ### Hardware | Part Number | Description | Link | | --- | --- | --- | | Host Computer | Ground Control Station (Ubuntu 18.04) | | VOXL-DK | VOXL Development Kit | [Purchase](https://www.modalai.com/pages/voxl) | MPS-00001-1 | 5V/6A Power Supply | EOL, replaced by [PS-XT60](https://www.modalai.com/products/ps-xt60) | MCBL-00009-1 | USB Cable (Host, 4-pin JST to USB 2.0 Type A Female) | [Purchase](https://www.modalai.com/products/mcbl-00009) | Flir Boson or Flir Lepton | | #### Boson The Boson requires more current than the USB 2.0 standard supports. To achieve this current, the power and ground can be connected separately in a "y-cable" to an alternate 5V power source. Alternatively, ModalAI has a debug board with a direct connection to the core 5V supply on VOXL which provides enough current. This Debug Board V2 can be found below. | Part Number | Description | Link | | --- | --- | --- | | MDK-M0078-2 | VOXL Debug Expansion V2 Add-on | EOL #### Lepton One of the following VOXL Add-on boards is required. | Part Number | Description | Link | | --- | --- | --- | | MDK-M0048-1-01 | VOXL Microhard Modem Add-on | [Purchase](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) | MDK-M0017-1-01| VOXL USB Expansion Board with Fastboot and Emergency Boot | EOL | MDK-M0030-1-01 | VOXL Cellular LTE and USB hub add-on | [Purchase](https://www.modalai.com/products/m0130-3) ### Target Software [VOXL-SDK](/voxl-sdk) version XXX or greater. ### Host Software - On the host computer, install [VLC media player](https://www.videolan.org/vlc/index.html), which we'll used to display the RTSP video: ```bash sudo apt-get install vlc ``` ## Setup Hardware - Disconnect power from the VOXL - Attach the Debug Board to VOXL J13 - Attach the JST cable to the JST USB connector - Set the jumper to 5V APM setting - Attach the Flir camera to the USB connector on the JST to USB Female A cable - Connect power to the VOXL ![voxl-boson-setup](/images/voxl-sdk/flir/voxl-boson-setup.jpg) ## Network Configuration - Configure the VOXL as an Access Point (or connect it to a network) - instructions on how to do this are [here](/wifi-setup/) - the default IP address of the device will be `192.168.8.1` - Connect the host computer to the VOXL's Access Point (default password is 1234567890) or to the same network you connected the VOXL to ## Run Software on Target ### voxl-uvc-server - SSH onto the target (see here for details) or ADB in using a micro-usb to USB cable - First, validate the the USB device is found using the `lsusb` command: ``` root@apq8096:~# lsusb ``` #### Configure voxl-uvc-server Start [voxl-uvc-server](/voxl-uvc-server/) with the following command Boson: ```bash voxl-uvc-server -r 640x512 ``` Lepton: ```bash voxl-uvc-server -r 160x120 -f 9 ``` More details in the [voxl-uvc-server](/voxl-uvc-server/) documentation. #### Configure voxl-streamer Start [voxl-streamer](/voxl-streamer/) with the following command Boson: ```bash voxl-streamer -c uvc-flir-boson ``` Lepton: ```bash voxl-streamer -c uvc-flir-lepton ``` More details in the [voxl-streamer](/voxl-streamer/) documentation. ## Viewing Stream ### VLC - On the host system, run the VLC software - Go to `Media > Open Network Stream` - Enter the following URL: `udp://@:4242` - Click `Play` to view the video stream ### QGroundControl Before attempting to view the video stream, follow these instructions on connecting to QGC: [How to Connect QGroundControl to VOXL using WiFi](/qgc-wifi/) - After your connection has been established to QGC, press the purple QGC logo in the top left corner in order to access the `Application Settings` menu. - Under the `General` tab, scroll down until you find the `Video` section. - Under the `Video Source` dropdown, choose `RTSP (h.264) Video Stream`. - In the `UDP Port` field enter the default: `4242` - You will now be able to view the video stream under QGC's `Fly` view. [Next: Connecting VOXL to Flight Core](/how-to-connect-voxl-to-flight-core/){: .btn .btn-green } --- Source: https://docs.modalai.com/i2c-display/ # How to connect an I2C display to VOXL --- ## Overview Here at ModalAI, Inc. we like to use a small I2C display on our robot to give us some visual feedback on what is happening in, for example, the boot up sequence. We are use a 0.96" 128x64 ssd1306 OLED display. Here is a link to the one we use: [Amazon page](https://www.amazon.com/DIYmall-Serial-128x64-Display-Arduino/dp/B00O2KDQBE/ref=sr_1_2?keywords=DIYmall+0.96%22+Inch+I2c+IIC+Serial+128x64+Oled+LCD+LED+White+Display+Module+for+Arduino+51+Msp420+Stim32+SCR&qid=1568326764&s=gateway&sr=8-2) ![voxl-dk](/images/voxl/i2c-display.jpg) ## Hardware - Custom cable with the following pinout: | VOXL - J10, DF13-6S-1.25C connector | I2C Display | |--- | --- | | Pin 1 - 3.3V | VCC | | Pin 2 - TX| NC | | Pin 3 - RX | NC | | Pin 4 - SDA | SDA | | Pin 5 - GND | GND | | Pin 6 - SCL | SCL | ## Target Software - I2C Display Example Application: [Download](https://storage.googleapis.com/modalai_public/modal_packages/latest/i2c_display_0.0.2_8x96.ipk) - Install the package to the target: ```bash adb push i2c_display_x.x.x.ipk /home/root/ipk adb shell "opkg install /home/root/ipk/i2c_display_x.x.x.ipk" ``` ## Usage Once the software package has been installed you use the command `i2c_display`. If you do not supply an argument it will display the ModalAI, Inc. splash screen. Otherwise you can give it a one or two word phrase to put on the display. For example: `i2c_display "TIME INIT"` ## Hardware Setup - Disconnect power from the VOXL - Connect the VOXL's J10 to the i2c display using the custom cable described above - Reconnect power [Next: Thermal and Performance](/thermal-and-performance/){: .btn .btn-green } --- Source: https://docs.modalai.com/how-to-connect-voxl-to-flight-core/ # How to connect Flight Core to VOXL ## Board Connections ![voxl-usb-expander-and-debug.png](/images/flight-core/flight-core-to-voxl-serial-connection.png) - The `MCBL-00007` cable can be used. The following pinout describes the cable: | Pin # | VOXL - J12, DF13-6S-1.25C connector | Flight Core - J1, DF13-6S-1.25C connector| |:--- |:--- | :--- | | 1 | NC | NC | | 2 | UART_TX_5V | UART_RX_5V | | 3 | UART_RX_5V | UART_TX_5V | | 4 | NC | NC | | 5 | GND | GND | | 6 | NC | NC | ## Hardware Setup - Disconnect power from VOXL and Flight Core - Connect the VOXL's `J12` to the Flight Core's `J1` using the `MCBL-00007` cable - Reconnect power to VOXL and Flight Core ## Software Setup - Flight Core by default is configured to communicate with VOXL using the MAVLINK_1 instance at 916.2kHz in normal mode using the TELEM2 serial port - Detailed usage is provided in the [voxl-vision-hub](/voxl-vision-hub/) section [Next: Connecting VOXL to Pixhawk](/how-to-connect-voxl-to-pixhawk/){: .btn .btn-green } --- Source: https://docs.modalai.com/how-to-connect-voxl-to-pixhawk/ # How to Connect VOXL to Pixhawk VOXL can be connected to any Pixhawk via a telemetry port, not just the ModalAI Flight Core! VOXL talks to the Pixhawk via UART at 912600 baud at 5V logic level. You can use [MCBL-00008](/cable-datasheets/#mcbl-00008) for this connection. Alternatively you can make a cable that connects VOXL [Port J12](/voxl-datasheets-connectors/#j12-blsp5-off-board-uart-esc) to one of Pixhawk's "telem" or "UART/I2C" ports. Make sure to configure the appropriate port in PX4's Mavlink parameters. | VOXL J12 Header | Pixhawk "telem" or "UART/I2C" Port | |:----------------|:-----------------------------------| | Pin 2 (TX) | Pin 3 (RX) | | Pin 3 (RX) | Pin 2 (TX) | | Pin 5 (GND) | Pin 6 (GND) | For more details on Header J12 see the [voxl-datasheet](/voxl-datasheets/) page. Note this is the only header that runs at 5V logic level which matches the Pixhawk. Pixhawk is a trademark of Lorenz Meier --- Source: https://docs.modalai.com/voxl-datasheets/ # VOXL Datasheets --- Source: https://docs.modalai.com/voxl-datasheets-functional-description/ # VOXL Functional Description --- ## Overview ### High level specifications of the platform - Base Operation System: Linux Yocto Jethro with 3.18 kernel. Additional Linux Operating Systems can be used by running Docker on VOXL, details [here](/docker-on-voxl/) - Qualcomm Snapdragon 821 w/ 4GB LPDDR4 1866MHz - [Snapdragon 821 Datasheet](https://developer.qualcomm.com/download/sd820e/qualcomm-snapdragon-820e-processor-apq8096sge-device-specification.pdf) - [Snapdragon 821 docs](https://developer.qualcomm.com/hardware/apq-8096sg/tools) - Quad-core CPU up to 2.15GHz - Adreno 530 GPU at 624MHz - Hexagon compute DSP (cDSP) 825MHz - Hexagon sensor DSP (sDSP) 700MHz - 4k30 Video Capture h.264/5 w/ 720p FPV - PCB 36mm x 75mm, 12-layer, 1mm thick ### Camera VOXL supports the following camera interfaces: * MIPI-CSI2 * USB UVC * HDMI Please see the [Camera and Video Guides](/camera-video-guides/) for more detailed information. ### Connectivity and Location - Embedded pre-certified Wi-Fi module QCNFA324 - QCA6174A modem - 802.11ac 2x2 Dual-band - [US FCC ID:PPD-QCNFA324](https://fccid.io/PPD-QCNFA324) - [Japan MIC ID: 003-140224](https://gitekidb.com/003-140224) - 4G LTE as optional add-on module - Microhard pDDL as an optional add-on module - WGR7640 GNSS 10Hz - I/O: - 1x USB3.0 OTG (ADB port) - 1x USB2.0 (expansion port) - 2x UART - 3x I2C - Additional GPIO and SPI can be configured ### Storage - 32GB (UFS 2.0) - Micro SD Card [SDXC](https://en.wikipedia.org/w/index.php?title=SD_card&action=edit§ion=11) Version 3.0 up to 2TB ### Software - Docker with Ubuntu, Debian or Alpine - OpenCV 2.4.11, 3.4.6, 4.2 - ROS Indigo - Qualcomm Navigator 1.0 Flight Control - Qualcomm Machine Vision SDK [Top](#table-of-contents) --- ## Power Specifications The VOXL should be powered by a supply rated at 6A and 5VDC. A recomended power supply is defined [here](/voxl-hardware-setup/). - **Caution**: although the VOXL may power up from USB power, it is not recommended to operate this way. [Top](#table-of-contents) --- ## Mechanical Specifications ### 3D STEP File [3D STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/M0006_PCB_3D_STEP.zip) ### Board Dimensions Note the XYZ axis as drawn respresent the IMU data as reported by the voxl-imu-server MPA service, not the physical orientation of the IMU on the PCB. This aligns with the FRD reference frame when mounted on a drone in the typical orientation such as on the M500 reference drone. ![voxl1-imu-locations](/images/voxl/voxl/voxl1_imu_locations_with_axis_large.png) [Top](#table-of-contents) --- ## On board sensors | Configuration | VOXL (M0006) | VOXL Legacy aka Qualcomm Flight Pro (HA942) | Interface | | --- | --- | --- | --- | | IMU0 | ICM20948 | MPU9250 | SPI10 | | IMU1 (recommended) | ICM20948 | MPU9250 | SPI1 | | Barometer | Bosch BMP280 | Bosch BMP280 | i2c3 | | GNSS | Internal Snapdragon | Internal Snapdragon | TBD | ### IMU Notes *Note:* IMU1 consistently performs better than IMU0. IMU1 is **strongly recommended** for flight and VIO use. This differs from the VOXL Flight board where IMU0 should be used instead. Configuring MPA services with voxl-configure-mpa will select the correct IMU based on board part number. [Top](#table-of-contents) [Next: VOXL Connectors](/voxl-datasheets-connectors/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-datasheets-connectors/ # VOXL Connectors --- ## Board Connections and Pin-out Specifications ### VOXL Board Top ![VOXL Core Top](/images/voxl/voxl/voxl-core-top.png) | Connector | Summary | | | --- | --- | --- | | J2 | Hires 4k Image Sensor (CSI0) | [Details](#j2-4k-camera-csi0) | | J3 | Stereo Image Sensor (CSI1) | [Details](#j3-stereo-or-time-of-flight-camera-csi1) | | J6 | Cooling Fan Connector | [Details](#j6-cooling-fan-connector) | | J7 | BLSP6 (GPIO) and BLSP9 (UART): External GPS/MAG | [Details](#j7-blsp6-i2c-and-blsp9-uart--spi-external-gpsmag) | | J13 | Expansion B2B | [Details](#j13-expansion-b2b-connection) | | J14 | Integrated GNSS Antenna Connection | [Details](#j14-integrated-gnss-antenna-connection) | ### VOXL Board Bottom ![VOXL Core Top](/images/voxl/voxl/voxl-core-bottom.png) | Connector | Summary | | | --- | --- | --- | | J1 | 5V DC IN, I2C to power cable “APM” | [Details](#j1-5v-dc-in-i2c-to-power-cable-apm) | | J4 | Tracking/Optic Flow Image Sensor (CSI2) | [Details](#j4-trackingoptic-flow-camera-csi2) | | J8 | USB 3.0 OTG | [Details](#j8-usb-30-otg) | | J9 | Micro-SD Slot | [Details](#j9-micro-sd-slot) | | J10 | BLSP7 UART and I2C off-board | [Details](#j10-uart-or-i2c-off-board-external-sonar-or-imu-sensor) | | J11 | BLSP12 UART and I2C off-board (SPEKTRUM) | [Details](#j11-blsp12-off-board-spektrum) | | J12 | BLSP5 UART and GPIO off-board (ESC) | [Details](#j12-blsp5-off-board-uart-esc) | | Wi-Fi | External Wi-Fi antenna connections | [Details](#wi-fi-antenna-connectors-2) | [Top](#table-of-contents) --- ### Connector Pin-outs and Specifications #### J1 5V DC IN, I2C to power cable “APM” ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | 5V DC | | | 2 | GND | | | 3 | I2C8_SCL | GPIO 7 | | 4 | I2C8_SDA | GPIO 6 | ##### Connector - Molex Inc, [MPN: 22-05-7045](https://www.molex.com/en-us/products/part-detail/0022057045) ##### Mating Connector - 50-37-5043 based cables ##### Notes - I2C8 is at 5V CMOS with 10K pull-ups. - Connect to provided power cable for proper operation and current handling. [Top](#table-of-contents) --- #### J2 4k Camera (CSI0) Please see Camera Connections page for details on supported configurations. | J2 Board Connector | Camera (Flex) Mating Connector | | --- | --- | | Panasonic, [MPN: AXT336124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | [Panasonic MPN: AXT436124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L17A_2P8 (AFVDD) | 4 | CAM0_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | CAM0_MCLK3 | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | [Top](#table-of-contents) --- #### J3 Stereo or Time-of-flight Camera (CSI1) Please see Camera Connections page for details on supported configurations. | J3 Board Connector | Camera (Flex) Mating Connector | | --- | --- | | Panasonic [MPN: AXT336124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | Panasonic [MPN: AXT436124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|----------------------| | 1 | GND | 2 | GND | | 3 | VREG_L18A_2P8 (AFVDD) | 4 | CAM1_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_S4A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM1_RST0_N | 10 | CAM_MCLK1_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI1_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI1_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI1_LANE0_CONN_P | 18 | CAM1_MCLK3 | | 19 | MIPI_CSI1_LANE0_CONN_M | 20 | VREG_L23A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI1_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI1_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI1_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI1_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI1_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI1_LANE3_CONN_M | 36 | GND | --- #### J4 Tracking/Optic Flow Camera (CSI2) Please see Camera Connections page for details on supported configurations. | J4 Board Connector | Camera (Flex) Mating Connector | | --- | --- | | Panasonic, [MPN: AXT336124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | Panasonic [MPN: AXT436124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | Pin-out: | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L29A_2P8 (AFVDD) | 4 | CAM2_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM2_RST0_N | 10 | CAM_MCLK2_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI2_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI2_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI2_LANE0_CONN_P | 18 | CAM2_MCLK3 | | 19 | MIPI_CSI2_LANE0_CONN_M | 20 | VREG_L23A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI2_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI2_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI2_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI2_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI2_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI2_LANE3_CONN_M | 36 | GND | [Top](#table-of-contents) --- #### J6 Cooling Fan Connector ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | EXT_FAN_5V | | 2 | EXT_FAN_RET | ##### Connector - J.S.T. Corporation, [SM02B-SRSS- TB(LF)(SN)](https://www.digikey.com/en/products/detail/jst-sales-america-inc/SM02B-SRSS-TB-LF-SN/926708) ##### Mating Connector VOXL Side: - J.S.T. Corporation, MPN: [SM02B-SRSS- TB(LF)(SN)](https://www.digikey.com/en/products/detail/jst-sales-america-inc/SM02B-SRSS-TB-LF-SN/926708) Fan Side: - J.S.T. Corporation - Connector, [MPN: SHR-02V-S](https://www.digikey.com/en/products/detail/jst-sales-america-inc/SHR-02V-S/759881) - Connector Contact Pins, [MPN: SSH-003T-P0.2-H](https://www.jst-mfg.com/product/pdf/eng/eSH.pdf) ##### Notes Supported Fan Module: - DDH Enterprise, Inc, MPN: DDH-2016-013 MCN: 420-59855-0001 [Top](#table-of-contents) --- #### J7 BLSP6 (I2C) and BLSP9 (UART / SPI): External GPS/MAG ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V | | | 2 | BLSP9_UART_TX_3P3 | GPIO 49 / BLSP9_SPI_MOSI | | 3 | BLSP9_UART_RX_3P3 | GPIO 50 / BLSP9_SPI_MISO | | 4 | BLSP6_I2C_SDA_3P3 | GPIO 27 | | 5 | GND | | | 6 | BLSP6_I2C_SCL_3P3 | GPIO 28 | | 7 | BLSP6_AUX2_3P3 | (original docs show GPIO 26, however not functional) | | 8 | BLSP6_AUX1_3P3 | (original docs show GPIO 25, however not functional) | | 9 | BLSP9_UART_CTS_N_3P3 | GPIO 51 / BLSP9_SPI_CS_N | | 10 | BLSP9_UART_RFR_N_3P3 | GPIO 52 / BLSP9_SPI_CLK | ##### Connector - HIROSE Electric, MPN: [DF13-10P-1.25H](https://www.hirose.com/en/product/p/CL0536-0259-3-75). ##### Mating Connector VOXL Side: - HIROSE Electric, MPN: [DF13-10P-1.25H](https://www.hirose.com/en/product/p/CL0536-0259-3-75). GPS/MAG Side: - HIROSE Electric, MPN: [DF13- 10S-1.25C](https://www.hirose.com/en/product/p/CL0536-0009-6-00). ##### Notes Supported GPS Module: - MCN: 20-CE766-H1 = CCA, H13931V2, SIRFSTARV CREST BOARD REV2 The above uses antenna: - TAOGLAS LTD, MPN: [CGGBP.25.4.A.02](https://www.taoglas.com/product/cggbp-25-4-a-02-gpsglonassbeidou-patch-antenna-25mm-2/) [Top](#table-of-contents) --- #### J8 USB 3.0 OTG ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | VBUS | | 2 | D- | | 3 | D+ | | 4 | ID | | 5 | GND | | 6 | MICA_SSTX- | | 7 | MICA_SSTX+ | | 8 | GND_DRAIN | | 9 | MICA_SSRX- | | 10 | MICA_SSRX+ | ##### Connector - KYCON, MPN: [KMMX- AB10- SMT1SB30](https://www.digikey.com/en/products/detail/kycon-inc/KMMX-AB10-SMT1SB30TR/9990130) ##### Mating Connector - Micro A/B Plug ##### Notes - Host mode USB 3.0 (e.g. connect a supported USB 3.0 device) requires Micro-A Plug to STD-A in order to get 3.0 SS Functionality. Example cable: Amphenol RUB30-0075 (contact ModalAI for details, available as MCBL-00019-1) - Host mode USB 2.0 - [example cable](https://www.amazon.com/CableCreation-Micro-Compatible-Android-Tablet/dp/B01M5GZ3N0) [Top](#table-of-contents) --- #### J9 Micro-SD Slot ##### Pin Configuration | Pin # | Signal Name | | --- | --- | | 1 | DAT2 | | 2 | CD/DAT3 | | 3 | CMD | | 4 | VDD | | 5 | CLK | | 6 | VSS (GND) | | 7 | DAT0 | | 8 | DAT1 | ##### Connector - Molex, MPN: [503398-0891](https://www.molex.com/en-us/products/part-detail/5033980891) ##### Mating Connector - Micro-SD Cards [Top](#table-of-contents) --- #### J10 UART or I2C off-board (external Sonar or IMU sensor) ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V | | | 2 | SONAR_UART_TX_3P3 | GPIO 53 | | 3 | SONAR_UART_RX_3P3 | GPIO 54 | | 4 | EXT_IMU_I2C_SDA_3P3 | GPIO 55 | | 5 | GND | | | 6 | EXT_IMU_I2C_SCL_3P3 | GPIO 56 | ##### Connector - HIROSE Electric, MPN: [DF13-6P-1.25H(50)](https://www.hirose.com/product/series/DF13#) ##### Mating Connector - DF13-6S-1.25C cable assemblies ##### Notes - UART and I2C are at 3.3V CMOS levels. - Connect TX to target device’s RX, and vice-versa. - I2C has 10K pull-ups. [Top](#table-of-contents) --- #### J11 BLSP12 off-board (SPEKTRUM) ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VREG_3P3V_SPEKTRUM | | | 2 | BLSP12_UART_TX_3P3 | GPIO 85 | | 3 | BLSP12_UART_RX_3P3 | GPIO 86 | | 4 | BLSP12_I2C_SDA_3P3 | GPIO 87 | | 5 | GND | | | 6 | BLSP12_I2C_SCL_3P3 | GPIO 88 | ##### Connector - HIROSE Electric, MPN:[DF13-6P-1.25H(50)](https://www.hirose.com/product/series/DF13#) ##### Mating Connector - DF13-6S-1.25C cable assemblies ##### Notes - UART and I2C are at 3.3V CMOS levels. - Connect TX to target device’s RX, and vice-versa. - I2C has 10K pull-ups. [Top](#table-of-contents) --- #### J12 BLSP5 off-board (UART ESC) ##### Pin Configuration | Pin # | Signal Name | Alt Function | | --- | --- | --- | | 1 | VDCIN_5V | | | 2 | ESC_UART_TX_5V | GPIO 81 | | 3 | ESC_UART_RX_5V | GPIO 82 | | 4 | BLSP5_GPIO_83_5V | GPIO 83 | | 5 | GND | | | 6 | BLSP5_GPIO_84_5V | GPIO 84 | ##### Connector - HIROSE Electric, MPN: [DF13-6P-1.25H(50)](https://www.hirose.com/product/series/DF13#) ##### Mating Connector - DF13-6S-1.25C cable assemblies ##### Notes - UART and GPIOs are at 5V CMOS levels - Connect TX to target device’s RX, and vice-versa. - GPIO’s are not set for I2C (no pull-ups, push-pull driver). [Top](#table-of-contents) --- #### J13 Expansion B2B connection ##### Pin Configuration | Pin # | Signal Name | Pin # | Signal Name | | --- | --- | --- | --- | | 1 | GND | 2 | VDCIN_5V_CONN | | 3 | APQ_GPIO_96 | 4 | VDCIN_5V_CONN | | 5 | APQ_GPIO_95 | 6 | VDCIN_5V_CONN | | 7 | APQ_GPIO_94 | 8 | USB2_HS_ID | | 9 | APQ_GPIO_92 | 10 | GND | | 11 | GND | 12 | USB2_HS_D_M | | 13 | BLSP11_0_SCL_GPIO61 | 14 | USB2_HS_D_P | | 15 | BLSP11_1_SDA_GPIO60 | 16 | USB2_HS_VBUS_CONN | | 17 | BLSP11_2_RX_GPIO59 | 18 | GND | | 19 | BLSP11_3_TX_GPIO58 | 20 | APQ_GPIO_64 | | 21 | GND | 22 | APQ_GPIO_127 | | 23 | BLSP8_0_SCL_GPIO7 | 24 | APQ_GPIO_126 | | 25 | BLSP8_1_SDA_GPIO6 | 26 | APQ_GPIO_70 | | 27 | BLSP8_2_RX_GPIO5 | 28 | APQ_GPIO_71 | | 29 | BLSP8_3_TX_GPIO4 | 30 | APQ_GPIO_72 | | 31 | GND | 32 | APQ_GPIO_93 | | 33 | JTAG_TDO | 34 | APQ_GPIO_91 | | 35 | JTAG_SRST_N | 36 | GND | | 37 | JTAG_TCK | 38 | APQ_GPIO_106 | | 39 | JTAG_TDI | 40 | APQ_GPIO_107 | | 41 | JTAG_TMS | 42 | APQ_GPIO_108 | | 43 | JTAG_TRST_N | 44 | GND | | 45 | JTAG_PS_HOLD | 46 | APQ_GPIO_114 | | 47 | VREG_S4A_1P8 | 48 | APQ_GPIO_104 | | 49 | PMIC_RESIN_N | 50 | APQ_GPIO_103 | | 51 | APQ_RESOUT_N | 52 | APQ_GPIO_102 | | 53 | VREG_3P3V | 54 | APQ_GPIO_101 | | 55 | KYPDPWR_N | 56 | APQ_GPIO_57 | | 57 | VPH_PWR | 58 | GND | | 59 | GND | 60 | PM8996_GPIOC15 | ##### Connector - Samtec Inc., [MPN: QSH-030-01-L-D-A-K](https://www.samtec.com/products/qsh-030-01-l-d-a-k) ##### Mating Connector VOXL Side: - Samtec Inc., [MPN: QSH-030-01-L-D-A-K](https://www.samtec.com/products/qsh-030-01-l-d-a-k) Debug Board Side: - Samtec Inc, [MPN: QTH-030-02- L-D-A-K](https://www.samtec.com/products/qth-030-02-l-d-a-k) ##### Notes Supported Debug B2B Module: - Eagle Nest, MCN: 20-H9420-1 - Serial Feather PRO Edition, MCN: 30-H9916-1 More details are available [here](#expansion-board-details). [Top](#table-of-contents) --- #### J14 Integrated GNSS Antenna Connection ##### Pin Configuration - Center Conductor ##### Connector - HIROSE Electric, [MPN: U.FL-R- SMT-1(10)](https://www.digikey.com/en/products/detail/hirose-electric-co-ltd/U-FL-R-SMT-1-10/2391570) ##### Mating Connector VOXL Side: - HIROSE Electric, [MPN: U.FL-R- SMT-1(10)](https://www.digikey.com/en/products/detail/hirose-electric-co-ltd/U-FL-R-SMT-1-10/2391570) GNSS Antenna Side: - HIROSE Electric, [MPN: U.FL-LP](https://www.hirose.com/product/series/U.FL) ##### Notes Supported Module: - CABLE ASSY, U.FL TO SMA-F BHD, 1.32 MM COAX MCN: CV90-N5175-A4 - Passive antenna configuration (no DC bias) [Top](#table-of-contents) --- #### Wi-Fi Antenna Connectors (2) ##### Function - External Wi-Fi antenna connections ##### Pin Configuration - Center Conductor ##### Connector - IPEX, [MPN: 20449-001E (MHF-4)](http://www.i-pex.com/product/mhf-4) ##### Mating Connector ##### Supported Antennas - [Molex 1461531100](https://www.digikey.com/en/products/detail/molex/1461531100/8543422) ##### Notes - ANT #1 is for WLAN/BT - ANT #2 is for WLAN only [Top](#table-of-contents) --- #### RGB LED ##### Function - Fixed functionality, momentarily flashes `green` on normal system boot up [Top](#table-of-contents) --- ## Expansion Board Details The following apply to the expansion board connector J13. ### Voltage Independently, each power rail can provide 1A to circuitry on the B2B mating designs, however, the total current consumed by all power rails should not exceed 1.5A as this ultimately impacts VDCIN_5V_CONN. The signals are listed here: | Signal | Description and Use | | --- | --- | | GND | Main board ground (DC 0V and signal return path). | | VDCIN_5V_CONN | This is the same 5V that is present on the Excelsior Flight controller board input power connector (J14) when powered by the provided 5V DC power supply and the APM board. This is primarily used to provide power up to circuitry on the expansion connector’s mating board, up to 1A. | | VPH_PWR | Main power node input of all the on-board PMIC regulators. This is in the range of 4.15V to 4.25V nominally. This can be used to provide power up to circuitry on the expansion connector’s mating board, up to 1A.| | VREG_3P3V | Primary 3.3V on the main board. This can be used to provide power up to circuitry on the expansion connector’s mating board, up to 1A. This is useful for voltage translators for the many 1.8V signals. | | VREG_S4A_1P8 | Primary 1.8V I/O rail on the main board. This can be used to provide power up to circuitry on the expansion connector’s mating board, up to 1A. This is useful for voltage translators for the many 1.8V signals. | | USB2_HS_VBUS_CONN | USB Port 2 host power. The main board provides a 500mA power switch from VDCIN_5V to provide host-mode support to USB 2.0 peripherals. This is most commonly used to provide the 5V to a USB2.0 HOST connector (Type A) on any mating circuit board. | ### USB 2.0 A standard USB 2.0 host port is available on the debug connector. A peripheral can be hard-wired to this port (hub or WLAN application) or a USB compliant Type-A connector can be made available on any mating design for other peripheral types. The signals are listed here: | Signal | Description and Use | | --- | --- | | USB2_HS_VBUS_CONN | USB Port 2 host power. The main board provides a 500mA power switch from VDCIN_5V to provide host-mode support to USB 2.0 peripherals. | | USB2_HS_D_P | USB high-speed 2 data – plus | | USB2_HS_D_M | USB high-speed 2 data – minus | | USB2_HS_ID | USB-OTG ID pin. This signal is grounded on the main board through a 0- ohm resistor. This is provided only for the application where a Type-A/B (OTG) connector is provided and the ID pin is required to identify the port as a HOST. | ### BLSP Signals Two complete BLSP ports are available on the debug connector. Software, with certain trust-zone limitations, has the ability to configure these ports as a 4-wire UART, 2-wire UART + I2C, I2C + 2 GPIO, SPI, or as four GPIOs. All signals are 1.8V CMOS, and when configured as digital outputs, the drive strength can be set between 2mA – 16mA in 2mA steps. The signals are listed here: It is advised not to change the configuration of BLSP8 2-wire UART as this is configured as the debug console by default. | Signal | Description and Use | | --- | --- | | BLSP11_0_SCL_GPIO61 | BLSP port 11, bit 0. RFR when configured for 4-wire UART, SCL when configured as I2C, SPI_CLK when configured as SPI, or GPIO84 when set as GPIO. | | BLSP11_1_SDA_GPIO60 | BLSP port 11, bit 1. CTS when configured for 4-wire UART, SDA when configured as I2C, SPI_CS_N when configured as SPI, or GPIO83 when set as GPIO. | | BLSP11_2_RX_GPIO59 | BLSP port 11, bit 2. UART_RX (input) when configured as UART, SPI_MISO when configured as SPI, or GPIO82 when set as GPIO. | | BLSP11_3_TX_GPIO58 | BLSP port 11, bit 3. UART_TX (output) when configured as UART, SPI_MOSI when configured as SPI, or GPIO81 when set as GPIO. | | BLSP8_0_SCL_GPIO7 | BLSP port 12, bit 0. RFR when configured for 4-wire UART, SCL when configured as I2C, SPI_CLK when configured as SPI, or GPIO88 when set as GPIO. | | BLSP8_1_SDA_GPIO6 | BLSP port 12, bit 1. CTS when configured for 4-wire UART, SDA when configured as I2C, SPI_CS_N when configured as SPI, or GPIO87 when set as GPIO. | | BLSP8_2_RX_GPIO5 | BLSP port 12, bit 2. UART_RX (input) when configured as UART, SPI_MISO when configured as SPI, or GPIO86 when set as GPIO. Note: This is the default debug serial console RX pin | | BLSP8_3_TX_GPIO4 | BLSP port 12, bit 3. UART_TX (output) when configured as UART, SPI_MOSI when configured as SPI, or GPIO85 when set as GPIO. Note: This is the default debug serial console TX pin. | ### Configuration and JTAG Signals Several configuration and JTAG signals are available on the debug connector. These signals are critical to proper boot-up and system operation, and as such, the end user is advised to not use these signals in any capacity unless they are very securely aware of the boot modes and processes of the VOXL chipset architecture, or with JTAG. Failure to do so could result in a bricked board. The signals are here: | Signal | Description and Use | | --- | --- | | APQ_GPIO_114 | Advised to ignore signal on any external mating designs. | | APQ_GPIO_104 | Advised to ignore signal on any external mating designs. | | APQ_GPIO_103 | Advised to ignore signal on any external mating designs. | | APQ_GPIO_102 | Advised to ignore signal on any external mating designs. | | APQ_GPIO_101 | Watchdog disable boot control. Connect to VREG_S3A via 10k-Ohm resistor to disable the watchdog. | | APQ_GPIO_57 | FORCE_USB_BOOT signal. Connect to VREG_S3A via 10k-Ohm resistor to have the boot loader ignore the programmed image and enter “QDOWNLOAD Mode” to re-image a bricked board. Remove pull-up connection when completed. | | JTAG_SRST_N | Advised to ignore signal on any external mating designs. | | JTAG_TCK | Advised to ignore signal on any external mating designs. | | JTAG_TDI | Advised to ignore signal on any external mating designs. | | JTAG_TDO | Advised to ignore signal on any external mating designs. | | JTAG_TMS | Advised to ignore signal on any external mating designs. | | JTAG_TRST_N | Advised to ignore signal on any external mating designs. | | JTAG_PS_HOLD | Advised to ignore signal on any external mating designs. | | PMIC_RESIN_N | PMIC GPIO2 for Reset. Advised to ignore signal on any external mating designs. | | APQ_RESOUT_N | Advised to ignore signal on any external mating designs. | | KYPDPWR_N | Advised to ignore signal on any external mating designs. | ### Using Configuration GPIOs As mentioned above, several APQ_GPIOs are reserved for configuration purposes and advised to ignore. However, if these signals must be used, there is a way to utilize them with some added isolation circuitry. Upon boot up, the applications processor is brought into the correct mode by settings on the Excelsior Flight main board. This boot mode is determined by pin strapping of the boot mode signals upon reset; GPIO_103, and GPIO_[112:116]. After reset, these signals can be reclaimed for general purpose, but it is imperative to keep them tri-stated prior to reset to not interfere with the settings on the Excelsior Flight main board or the applications processor can fail to boot, or boot into an unknown state. The most effective way to reclaim these signals is to use a bidirectional signal translator with auto-direction sensing and signal isolation with an active high enable pin. This will allow the user to not only voltage translate to the desired level they need, but also allows for either direction usage. An example schematic of how this can be achieved is shown here: ![VOXL Core Top](/images/voxl/voxl/voxl-gpio-use.png) If the exact circuit is not followed, here are the key things to note: - The translator MUST tri-state the PORT_1 side I/O’s if either VCC_PORT_1 or OE is LOW/GND. - APQ_RESOUT_N going HIGH is the indicator of when the signals are no longer being sampled for boot mode configuration. - Be sure the translator can accept 1.8V on VCC_PORT_1, and OE input is referenced to VCC_PORT_1. - If the direction is known ahead of time, other devices can be used to achieve the desired purpose, such as discrete FETs, but ensure they are logic-level and can operate at VGS of 1V-1.8V. - DO NOT place any shunt resistors, capacitors, or other circuit elements in-between the GPIOs from the debug connector to the isolation circuits. - ESD protection is already provided on the Excelsior Flight main board. [Top](#table-of-contents) [Next: VOXL Kits](/voxl-kits/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-camera-config/ # VOXL Camera Configurations --- ## Camera Ports VOXL has 3 camera connectors Labeled J2, J3, J4 in the two images below. ![VOXL Core Connected](/images/voxl/voxl/voxl-core-bottom.png) *Image 1 - VOXL Bottom View* ![VOXL Core USB](/images/voxl/voxl/voxl-core-top.png) *Image 2 - VOXL Top View* The connectors are attached to the following Camera Subsystem ports and have the following colloquial names. Note that the ports can be used in other configurations as described bellow, not just the purpose described by the port's colloquial name. | Port | Camera SS Port | Colloquial Name | |------ |---------------- |------------------------------ | | J2 | CSI0 | High-Resolution 4k RGB Port | | J3 | CSI1 | Stereo Camera Port | | J4 | CSI2 | Tracking Camera Port | ## Configurations ### 1 Tracking + Stereo | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | Empty | N/A | | J3 | Stereo Cameras | 1 | | J4 | Tracking Camera | 0 | ### 2 Tracking Only | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | Empty | N/A | | J3 | Empty | N/A | | J4 | Tracking Camera | 0 | ### 3 High-Resolution + Stereo + Tracking This is the default configuration for the M500 Drone | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | High-Resolution 4k RGB | 0 | | J3 | Stereo Cameras | 2 | | J4 | Tracking Camera | 1 | ### 4 High-Resolution + Tracking | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | High-Resolution 4k RGB | 0 | | J3 | Empty | N/A | | J4 | Tracking Camera | 1 | ### 5 TOF + Tracking | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | empty | N/A | | J3 | TOF time-of-flight | 0 | | J4 | Tracking Camera | 1 | ### 6 High-Resolution + TOF + Tracking | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | High-Resolution 4k RGB | 0 | | J3 | TOF time-of-flight | 1 | | J4 | Tracking Camera | 2 | ### 7 TOF + Stereo + Tracking This is the default configuration for the Seeker Drone | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | TOF time-of-flight | 2 | | J3 | Stereo Cameras | 1 | | J4 | Tracking Camera | 0 | ### 8 High-Resolution Only | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | High-Resolution 4k RGB | 0 | | J3 | Empty | N/A | | J4 | Empty | N/A | ### 9 TOF Only | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | Empty | N/A | | J3 | TOF time-of-flight | 0 | | J4 | Empty | N/A | ### 10 Stereo Only | Port | Camera | Camera ID | |------ |---------------------------|-----------| | J2 | Empty | N/A | | J3 | Stereo Cameras | 0 | | J4 | Empty | N/A | ## Configuration Files Rarely, if ever, will you need to touch these configuration files manually. In most cases you can use the [voxl-configure-cameras](/configure-cameras/) script as described above. ## Compatible Image Sensors | Sensor Module | Sensor | Resolution / FOV | Description | Minimum System Image | |--:----------------------------------------------------------------------------------------|-------------|--:----------------------|--:-------------------|--:-------------------| | ModalAI MSU-M0024 | Sony IMX214 | 4k | High-Resolution | 2.0 | | ModalAI MSU-M0025 | Sony IMX214 | 4k | High-Resolution | 2.0 | | ModalAI MSU-M0026 | Sony IMX377 | 4k | High-Resolution | 2.0 | | ModalAI MDK-M0061-1 | Sony IMX412 | 4k | High-Resolution | 2.5.1 | | ModalAI Stereo Sensor | OV7251 | 640x480 85.6º diagonal | Stereo | 2.0 | | ModalAI MSU-M0014-1-01 | OV7251 | 640x480 166º diagonal | Tracking | 2.0 | | Sunny GP161C | OV7251 | 640x480 85.6º diagonal | Stereo | 2.0 | | ModalAI MSU-M0072-1-00 equivalent to Sunny MD102A | OV7251 | 640x480 166º diagonal | Tracking | 2.0 | | [ModalAI MSU-M0040-1-01](https://www.modalai.com/products/m0178) PMD TOF LiteOn A65 | irs10x0c | 224x172 110º horizontal | TOF (Time of Flight) | 2.3 | [Next: Docker on VOXL](/docker-on-voxl/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-system-image/ # VOXL 1 (APQ8096) System Image Changelog ## Overview This page describes the Yocto System Image that runs on VOXL. In the [VOXL Quickstarts](/voxl-quickstarts/), you can find details on [how to flash the VOXL system image](/flash-system-image/). Yocto Jethro Linux kernel 3.18 [Source](https://gitlab.com/voxl-public/system-image-build/voxl-build), [Build Instructions](https://gitlab.com/voxl-public/system-image-build/voxl-build/blob/master/README.md) Yocto Jethro Linux Userspace: [Source to add new userspace packages](https://gitlab.com/voxl-public/system-image-build/poky/tree/modalai-sd820-jethro). Many new packages can be added using bitbake. We have a bitbake project that enables building new IPK packages for install on target here: [Source](https://gitlab.com/voxl-public/system-image-build/poky/tree/modalai-sd820-jethro) ### Do I need to install it? If you have a `VOXL 2`, it comes pre-installed so there's nothing to do unless you are looking to install a newer version. If you are having problems with your system, **please** ask questions on the [forum](https://forum.modalai.com/category/9/voxl) before reflashing the system image. ### Download Location You can [download the system image](https://downloads.modalai.com) from our protected downloads page. Although this is usually not necessary since the system image is bundled in our [VOXL SDK](/voxl-sdk/). ## Changelog | VOXL Release | Release Notes | |:---------------|:----------------------------------------------------------------------------------------------------------------------| | modalai-4.0.0 | * CCI direct support | | modalai-3.8.0 | * Added RNDIS host driver to the kernel
* Add arm64 to opkg arch.conf
* Remove docker-support and libgphoto2 packages (No longer needed) | | modalai-3.6.0 | * Add CONFIG_USB_NET_CDC_EEM=y to support Trellisware TW-650 radio
* imx214 60fps
* Fix voltage on CAM0 2.5v to 2.8v | | modalai-3.3.0 | * change inodes to 3m on data partition
* add quectel modem support
* add aarch64 opencl
* v1.0.2 camera repo with multiple ov7251 drivers for 8 bit, vflip, hflip, vhflip(180 rotation) | | modalai-3.2.0 | **Camera Pipeline:**
* add TOF in camera slot 0 to camera_config.xml
* remove IMX214GP and IMX378 entries in camera_config.xml
* set default imx214 driver to imx214_rot in camera_config.xml
* comment out annying log messages about focus set to infinity and mIsDepthCamera == false
* disable analysis stream regardless of persist parameters persist.camera.analysis.enable and persist.stereo.analysis.enable
* updates to support TOF mode 5 and 9, selectable at run-time
* enable raw mode for all native resolutions
* enable support for two concurrent hi-res cameras
* imx214: add driver with inverse readout (rot180) (additional .so)
* ov7251: update maximum gain and exposure settings per spec sheet
* ov7251: add driver with raw8 output (additional .so)
* imx477: fix lens roll-off correction

**TOF-Bridge / libtof-interface:**
* update dep royale-spectre to 0.0.3
* change library and ipk name to libtof-interface (from libtof_interface)
* disable using reset pin by default, since camera pipeline already resets the sensor during start-up
* updates to support TOF mode 5 and 9, selectable at run-time, add checks and cleanup
* change the lib and package name to libtof_interface, add ipk dependency on libroyale-331-spectre-4-7
* add persist param for selecting camera port used for TOF, which is used to determine the gpio pin for device reset

**Royale Spectre**
* modify the lib install process to make yocto happy (install to /usr/lib/royale first then copy to /usr/lib/ in postinst)
* export common royale headers to ipk, will be installed to /usr/include/royale
* disable toggling of GPIO0 in order to enable concurrency with Stereo
* install royale and spectre libs directly to /usr/lib/

**VOXL HAL3 TOF**
* update library dependency to libtof-interface, since the lib was renamed
* removed proprietary PMD headers (they will be coming from royale-331-spectre-4-7)
* changes to support selecting tof mode and fps
* remove libtofbridge.a and royale and spectre .so libs, since they are part of platform build
* add autodetection of TOF camera port
* enable tof processing by default if persist.camera.modalai.tof param is not set | | modalai-3.1.0 | Added rsync, screen, and libgphoto2 packages | | modalai-3.0.0 | Added factory bundle 1.0.1 into the system image. Added gstreamer OMX and extra plugins to the system image. Bumped Avahi version to 0.6.32-r12.0. | | modalai-2-5-3 (beta) | Adds support for:
*IMX412 image sensors
* imx412: enable full range of gains and exposures | | modalai-2-5-2 | Adds support for:
* VOXL HDMI Input Accessory (Auvidea B102)
* Microchip lan75xx Ethernet devices (VOXL Microhard Add-On v2)
| | modalai-2-3-0 | Updated to new PMD libraries for latest Time-of-Flight modules (A65) module | | modalai-2-2-0 | Added kernel driver support for FTDI Serial IO devices | | modalai-2-1-0 | Updated to new build architecture (Docker, meta-voxl, meta-voxl-prop)
Adds support for:
* WP760x Sierra modems
* Microchip lan78xx Ethernet devices
* /bin/ar fix | | modalai-1-10-0 | Removed CONFIG_ANDROID_PARANOID_NETWORK config from kernel to fix ping permissions problem when running docker images | | modalai-1-9-0 | Adds support for:
* SCTP sockets
* IM214 image sensors | | modalai-1-7-0 | Increase /data/ parition to 16GB | | modalai-1-6-0 | Fix for DNS issue, adds virtualization support for Docker | | modalai-1-5-0 | Uses open source kernel | | modalai-1-3-0 | Adds support for:
* external cellular modems
* PMD Time of Flight cameras over MIPI
* UVC (webcams) | --- Source: https://docs.modalai.com/voxl-quickstarts/ # VOXL Quickstart This section contains simple topics geared towards helping you get up and running with your VOXL Core for the first time. They are in a logical order that guides you through tasks a normal developer would typically go through to get started. ## Quickstart Video This Quickstart video walks through a simple VOXL Flight hardware and software installation # VOXL Quickstart Requirements Before you start, you'll need to gather up the following: ## VOXL-DK The VOXL Development Kit is available for purchase from [here](https://www.modalai.com/collections/voxl-development-kits) and contains the following: ![voxl-dk](/images/voxl/voxl-dk.jpg) | Component | Part Number | Description | |:--- |:--- |:--- | | VOXL Core Board | MCCA-M0006 | Development board | | [VOXL Power Module v3](/power-module-v3-datasheet/) | NA | Provides regulated power to the board | | Power Cable | MCBL-00001 | Connects development board to regulator board, also available [here](https://www.robotis.us/robot-cables/) | | Wi-Fi Antennas (QTY2) | MANT-00001 | also available [here](https://www.digikey.com/product-detail/en/molex/1461531100/WM17824-ND/8543422) | ## Power Supply A 5V/6A rated power supply is required: | Component | Part Number | Description | |:------------------|:------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | VOXL Power Supply | MPS-00001-1 | Recommended: GlobTek, Inc. WR9QA6000LCP-N(R6B) with Q-NA(R) plug, [here](https://www.digikey.com/products/en?keywords=wr9qa6000lcp) and [here](https://www.digikey.com/product-detail/en/globtek-inc/Q-NA-R/1939-1106-ND/8597909) | > You **CANNOT USE** common 12v power supplies even though their connectors may fit the Power Module's barrel jack. The APM's barrel jack bypasses the regulator and can accept **5V ONLY**. ## USB cable and Computer The following will be required to interact with the VOXL: * USB 2.0 A-Male to Micro B Cable * Host computer running Linux flavour of your choice [Next: Basic Hardware Setup](/voxl-hardware-setup/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-hardware-setup/ # VOXL Hardware Setup ![VOXL HW Setup](/images/voxl/voxl-dk-hw-setup.png) - Connect the power cable to J1 as shown - Connect the other side of the power cable to the VOXL Power Module as shown - Connect one side of the USB cable to the host computer and connect the other side to J8 as shown. - **Note:** the Micro USB connector will consume only a portion of the USB 3.0 port. A USB 3.0 cable can be used as well. - Now plug in the power supply (**5V/6A DC output**) to the wall, and plug it in to the VOXL Power Module barrel jack as shown > If your Power Module has a barrel jack, **DO NOT** plug anything other than 5V into the barrel jack or you **WILL DAMAGE THE BOARD**. The barrel jack bypasses the regulator and feeds VOXL directly. --- Source: https://docs.modalai.com/flight-core/ # Flight Core Flight Core is a PX4 and ArduPilot [Blue UAS Framework](https://www.modalai.com/pages/blue-uas-framework) Flight Controller - Assembled in the USA. Flight Core can be paired with [VOXL](/voxl/) or [VOXL 2](/voxl-2/) for obstacle avoidance and indoor or outdoor GPS-denied navigation. Flight Core can also be used independently as a standalone, high-performance, secure flight controller. Flight Core is a part of the [Blue UAS Framework](https://www.modalai.com/pages/blue-uas-framework) and is NDAA '20 Section 848 compliant. ![flight-core-img](/images/flight-core/flight-core.jpg) --- Source: https://docs.modalai.com/flight-core-getting-started/ # Flight Core Getting Started How to get started with ModalAI Flight Core --- Source: https://docs.modalai.com/flight-core-mounting-and-connections/ # Flight Core Mounting and Connections ## Summary Before configuring the Flight Core's software, we suggested mounting it to your airframe and make sure the airframe is physically ready to fly. You should connect at least the following items to proceed through this getting-started manual. - Motors/ESCs - Flight Core Power Module - RC Receiver (e.g. Spektrum Satellite) - Wireless Telemetry Link, either: - VOXL running voxl-vision-hub - or SiK 915mhz point-to-point telemetry link If you wish to use a GPS/magnetometer you should attach it now as we will reach the calibration step shortly. If you intend to use a VOXL as the primary wireless telemetry connection, you should make sure it's software is up to date has [voxl-vision-hub installed and configured](/voxl-vision-hub/) with the IP address of your ground control computer already set. ## Connections The [Flight Core Connections](/flight-core-connections/) are described here, which will show you how to connect everything in detailed documentation. [Next: Flight Core Firmware](/update-flight-core-firmware/){: .btn .btn-green } --- Source: https://docs.modalai.com/update-flight-core-firmware/ # Update Flight Core and VOXL Flight Firmware > The Flight Core and VOXL Flight ship with the latest firmware available at the time of shipment. The following may be unnecessary if you've already checked the firmware version through QGroundControl and it meets your needs — if so, skip to [Upload PX4 Parameters](/upload-px4-parameters/). ## Summary VOXL Flight and Flight Core run PX4, which can be field updated over USB. ## Hardware Requirements - [Flight Core](/flight-core-datasheet/) or [VOXL Flight](/voxl-flight-datasheet/) - [Power Module](/power-module-v3-datasheet/) and [MCBL-00003](/cable-datasheets/#mcbl-00003) or [MCBL-00001](/cable-datasheets/#mcbl-00001) - USB-to-JST cable [MCBL-00010](/cable-datasheets/#mcbl-00010)) - Host computer with available USB port - QGroundControl 4.0+ ## Update Procedure Firmware update of the Flight Core or VOXL Flight is supported starting in QGC v4.0. ### Update Using QGroundControl - Mainline Builds Applicable if using PX4 v1.11+ - Obtain MCBL-00010](/cable-datasheets/#mcbl-00010) (JST to microUSB female) + microUSB cable - Connect calbe to Flight Core `J3` or VOXL Flight `J1006` (the blue connector) to Host PC with QGC 4.0+ - In QGC, go to the Firmware tab - **Power cycle** the Flight Core or VOXL Flight (the bootloader runs and the green LED flashes quickly) - NOTE: you must power cycle with USB attached in order for the bootloader to activate - When the `Firmware Setup` screen shows, select the `PX4 Flight Stack v1.11 - Stable Release` option - Click `OK` - During the FW update, the LEDs will flash red/green - The board will reboot at the end of the process ### Update Using QGroundControl - ModalAI Build Applicable if using PX4 v1.10. - Download the ModalAI release `.px4` file from the [Flight Core Firmware page](/flight-core-firmware/) - Obtain [MCBL-00010](/cable-datasheets/#mcbl-00010) (JST to microUSB female) + microUSB cable - Connect cable to Flight Core `J3` or VOXL Flight `J1006` (the blue connector) to Host PC with QGC 4.0+ - In QGC, go to the Firmware tab - **Power cycle** the Flight Core or VOXL Flight (the bootloader runs and the green LED flashes quickly) - NOTE: you must power cycle with USB attached in order for the bootloader to activate - When the `Firmware Setup` screen shows, click on the `Advanced settings` button - Select `Custom firmware file` - Click `OK` - Select the `.px4` file you downloaded in the first step - During the FW update, the LEDs will flash red/green - The board will reboot at the end of the process ## Update Using USB and Utility Script ### Additional Software Requirements - Install requirements: - python 2.7, pip, pyserial - Clone the PX4 firmware: - Locate the utility script at `Tools/upload.sh` ### Download Firmware File - Download the ModalAI release `.px4` file from the [Flight Core Firmware page](/flight-core-firmware/) ### Perform Update - Obtain [MCBL-00010](/cable-datasheets/#mcbl-00010) (JST to microUSB female) + microUSB cable - Connect calbe to Flight Core `J3` or VOXL Flight `J1006` (the blue connector) to Host PC - Power on the Flight Core board - Perform the FW update by running the following command, where the argument is the path to the `.px4` file ```bash ./Tools/upload.sh ./build/modalai_fc-v1_default/modalai_fc-v1_default.px4 ``` If attemping to use the wrong firmware file, you will get a warning: ```bash WARNING: Firmware not suitable for this board (board_type=41775 board_id=XXX) ``` [Next: Upload PX4 Parameters](/upload-px4-parameters/){: .btn .btn-green } --- Source: https://docs.modalai.com/upload-px4-parameters/ # Upload PX4 Parameters ## 1. Connect to PX4 via USB and Open QGroundControl After flashing the PX4 firmware, leave the USB cable connected and open QGroundControl. It should connect and show red icons for airframe, sensors, radio, flight modes, and power. We will go through and set up these sections one by one! ![1-everything_wiped_to_defaults.png](/images/voxl-sdk/qgc/1-everything_wiped_to_defaults.png) ## 2. Wipe parameters back to default If the 5 items listed in the last step are not all red, or you just want to be thorough, reset all px4 parameters back to default with the reset button pictured below. If the "tools" button does not show up, you will first need to enter the parameters menu. Note, this will wipe any and all calibration data if you have calibrated this board before!! ![2-reset-to-defaults.png](/images/voxl-sdk/qgc/2-reset-to-defaults.png) ## 3. Download PX4 Parameters File We suggest starting with our default set of PX4 parameters. Since we build from the PX4 firmware master branch, new parameters are added very frequently and we will update the parameters in this repository accordingly. [px4-parameters](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) Currently this project is tested on a ModalAI M500 platform with a VOXL and Flight Core flight controller. The flight controller orientation is taken into consideration in this parameter file. ## 4. Upload Parameters file The parameter files available from the above repository are trimmed of any sensor or radio calibration parameters so they can be uploaded via QGroundControl without recalibrating. You can use the trim_cal_params.sh script to trim your own parameter files if you have customizations that you wish to share between airframes without overwriting calibration. This trimming also means you can come back to this step and upload new parameter files without having to repeat the following calibration steps. The presence of many PX4 parameters are contingent upon other parameters. As a result it's necessary to upload parameter files TWICE. That process looks like this: Upload parameters once: ![4.1-upload-parameters.png](/images/voxl-sdk/qgc/4.1-upload-parameters.png) Many warnings will likely appear saying some parameters don't exist yet. We know, don't worry!! Close the warnings and reboot PX4. ![4.2-warning-about-missing-params.png](/images/voxl-sdk/qgc/4.2-warning-about-missing-params.png) Now load the same params file a second time. ![4.3-load-from-file-a-second-time.png](/images/voxl-sdk/qgc/4.3-load-from-file-a-second-time.png) All of the parameters should have taken this time through. A quick sanity check is to look for the PWM_MIN parameter and check that its value is set to 1075. ![4.4-check-pwm-min.png](/images/voxl-sdk/qgc/4.4-check-pwm.png) ## Parameter Reference As you continue to work with PX4 on the Flight Core, you will want to refer to the official [PX4 parameters reference](https://docs.px4.io/main/en/advanced_config/parameter_reference.html). We build PX4 firmware from master branch so make sure you are using the master-branch of the documentation page. [Next: Calibrate Sensors](/px4-calibrate-sensors/){: .btn .btn-green } --- Source: https://docs.modalai.com/px4-calibrate-sensors/ # Calibrate Sensors ## 5. Unplug USB and Switch to Wireless Telemetry If you have already [installed and configured voxl-vision-hub](/voxl-vision-hub/), then wireless telemetry should now be working between PX4 and QGroundControl. If not, make sure VOXL and your Ground Control Station are on the same network and the /etc/modalai/voxl-vision-hub.conf file on VOXL is configured for the right IP address of your Ground Control Station. ## 6. Enter Sensor Calibrate Section Now click the sensor calibration section. All sensor icons should be red at this point. ![6.1-sensor-calibration.png](/images/voxl-sdk/qgc/6.1-sensor-calibration.png) When you click on the Compass or Accelerometer calibration buttons, QGroundControl rightly asks you to confirm the board orientation. If using the PX4 master branch or the [ModalAI build 1.10](https://storage.googleapis.com/flight-core-firmware-1-10/latest/modalai_fc-v1_default.px4) then use `ROTATION_NONE`. The default orientation in the parameters file you uploaded before takes this into account. **NOTE:** the 1.10 release from PX4 for Flight Core is not recommended as there have been fixes including a orientation change. During the calibration process QGroundControl will ask you to place the airframe in multiple orientations with pictures. If at any point the indicated orientation does not match how you are holding the airframe, you should recheck this orientation parameter. ![6.2-check-rotation.png](/images/voxl-sdk/qgc/6.2-check-rotation.png) Now complete calibration for all sensors following QGroundControl's instructions. ### 6.1 Skipping Compass Calibration and Disabling GPS The following requires the use of the VOXL companion computer. Please ensure you have [voxl-vision-hub installed and configured](/voxl-vision-hub/) on VOXL. > For PX4 1.10, the following currently requires a custom branch utilizing a modified [ECL library](https://github.com/PX4/PX4-ECL) with changes captured in [this commit](https://github.com/modalai/ecl/commit/bbfc7a877b6a344ec6b3d57d164d160e22436495). The `modalai-1.10-ekf2-init-vio` branch was in [modalai/px4-firmware](https://github.com/modalai/px4-firmware) but has since been removed. This should be considered for use with testing only and is not fully validated. If not using a magnetometer and GPS, you can skip the compass calibration and disable GPS with the following parameter changes: - `SYS_HAS_MAG` set to `Disabled` - `GPS_1_CONFIG` set to `Disabled` Reboot the Flight Core and VOXL. Check that you are getting VIO data in QGroundControl's MAVLink shell running the following command: ```bash nsh> listener vehicle_visual_odometry TOPIC: vehicle_visual_odometry vehicle_odometry_s timestamp: 196688354 (0.028220 seconds ago) x: 0.0156 y: -0.0666 z: -0.0208 q: [0.9990, 0.0254, -0.0094, -0.0355] q_offset: [0.0000, 0.0000, 0.0000, 0.0000] pose_covariance: [0.0000, 0.0000, -0.0000, -0.0000, -0.0000, 0.0000, 0.0000, 0.0000, 0.0000, -0.0000, -0.0000, -0.0000, -0.0000, 0.0000, 0.0000, 0.0000, 0.0000, -0.0000, 0.0000, -0.0000, -0.0000] vx: nan vy: nan vz: nan rollspeed: nan pitchspeed: nan yawspeed: nan velocity_covariance: [nan, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000] local_frame: 0 ``` Verify that EKF2 has valid `local position` data. If not, ensure you have updated ECL with changes captured in [this commit](https://github.com/modalai/ecl/commit/bbfc7a877b6a344ec6b3d57d164d160e22436495). ```bash nsh> ekf2 status INFO [ekf2] local position: valid INFO [ekf2] global position: invalid INFO [ekf2] time slip: 0 us ekf2: update: 32585 events, 5217128us elapsed, 160.11us avg, min 2us max 1498us 225.559us rms ``` [Next: Configure RC Radio and Flight Modes](/configure-rc-radio/){: .btn .btn-green } --- Source: https://docs.modalai.com/configure-rc-radio/ # Configure RC Radio You are welcome to use any radio you like. For testing we use a Spektrum DX6e or DX8 radio (e.g. SPM8000/SPMR8000, but any Spektrum transmitter with DSMX/DSM2 compatibility will likely work) with a CLEAN model, e.g. no mixing, no trimming, default limits. By default, the Spektrum DX8 exposes channels 6 and 7 on the two 3-position toggle switches to the left and right of the "DX8" logo respectively. These are easy to reach switches which we assign to flight mode and motor-kill respectively. Addtional R/C configurations can be found [here](/flight-core-radios/). ## 7. Bind Radio to Receiver Instructions on how to bind a Spektrum radio can be found [here](https://docs.px4.io/main/en/config/radio.html). **NOTE: After binding the radio, you will need to reset PX4 (or power cycle the unit) before proceeding with calibration** ## 8. Calibrate Radio Channels Now follow the on-screen instructions to calibrate the range and trims of your radio. ![8-calibrate-radio.png](/images/voxl-sdk/qgc/8-calibrate-radio.png) Note that the radio calibration values are saved as PX4 parameters which will NOT be overwritten if you load any of our "trimmed" PX4 parameter files as described in the [Upload PX4 Parameters](/upload-px4-parameters/) page. ## 9. Set Flight Modes Obviously every user will want to use different flight modes and different switch assignments, but for getting started with VOXL and and Flight Core we suggest starting with something similar to this configuration and working from there. * "Flap Gyro" switch left of Spektrum Logo * Channel 6 * Up position: Manual Flight Mode * Middle Position: Position Flight Mode * Down Position: Offboard Flight mode * "Aux2 Gov" switch right of Spektrum Logo * Channel 7 * Up position: Motor Kill Switch Engaged * Down Position: Motor Kill Switch Disengaged (required to fly) Since we have a manual kill switch on the radio there is no need for the "safety switch" on the Pixhawk GPS module as so it is disabled in our params file in favor of the kill switch. ![9-flight-mode-config.png](/images/voxl-sdk/qgc/9-flight-mode-config.png) [Next: miscellaneous PX4 configurations](/fc-configure-misc/){: .btn .btn-green } --- Source: https://docs.modalai.com/fc-configure-misc/ # Miscellaneous PX4 Configuration ## 10. ESC Calibration If you have ESCs that support the D-Shot protocol we highly recommend enabling D-Shot mode in PX4 parameters to avoid needing to calibrate the ESCS. This can be done by setting the DSHOT_CONFIG to 600 or 1200, whichever the highest speed is that your ESC supports. Set to 0 to use normal ESC pulse signaling. The ESCs currently used on the ModalAI M500 NO NOT support D-Shot. You can follow the standard PX4 ESC calibration instructions [here](https://docs.px4.io/main/en/advanced_config/esc_calibration.html). This MUST be performed before first flight if you aren't using DShot ESCs. You must use a 5V Power supply connected to the Power Module to power the Flight Core and VOXL (if being used) but NOT the ESCS so you can proceed with ESC calibration. For non-USB powered devices like ours, you can calibrate PWM based ESCs without QGroundControl's requirement to remove the battery upon power up of the VOXL Flight or Flight Core using this [guide](/flight-core-pwm-esc-calibration/). ![10-esc-cal.png](/images/voxl-sdk/qgc/10-esc-cal.png) ## 11. Battery Configuration The PX4 battery documentation is very detailed, and perhaps a bit overwhelming: [https://docs.px4.io/main/en/config/battery.html](https://docs.px4.io/main/en/config/battery.html). The battery parameters we suggest using with the ModalAI Flight Core are as follows: ### BAT_V_DIV & BAT_A_PER_V These are not applicable and can be ignored since the Flight Core uses a digital voltage and current sensor instead of an ADC. ### BAT_N_CELLS This should be set to the number of series cells in your pack. For the ModalAI M500 we suggest using 3S packs and setting this parameter to match. ### BAT_V_CHARGED BAT_V_EMPTY We suggest setting to 4.15 and 3.4 respectively for LiPo cells. For LiHV cells these values should be increased to 4.25 and 3.5 ### BAT_V_LOAD_DROP & BAT_R_INTERANAL We suggest ignoring BAT_V_LOAD_DROP and setting the internal resistance of the battery (BAT_R_INTERNAL) directly. If you do not have a charger or meter capable of measuring the internal resistance then you can use 0.015 (15 mOhm) as a reasonable starting point for a typical 3500mAh 3S LiPo. ### BAT_CAPACITY This is an optional setting if you have an accurate measurement of your battery's actual capacity in mAh as measured on a discharger. Don't attempt to use the advertised capacity, it will be wrong. If you are unsure, leave this set to -1. Also if you frequently restart PX4 throughout the use of a battery pack or frequently start flights with partially discharged packs we suggest leaving this parameter set to -1 as PX4 makes the assumption that the pack is fully charged when starting up if it is given a capacity. ![11-battery-config.png](/images/voxl-sdk/qgc/11-battery-config.png) ## 12. Set System ID We highly recommend each drone have its own unique system ID. QGroundControl supports incoming telemetry from multiple drones as long as they have different system IDs. It will be very unhappy if multiple drones have the same system ID! ![12-set-system-id.png](/images/voxl-sdk/qgc/12-set-system-id.png) [Next: First Flight](/fc-first-flight/){: .btn .btn-green } --- Source: https://docs.modalai.com/fc-first-flight/ # First Flight ## Take Off in Manual Mode First take off in Manual Flight Mode just to confirm the basic functionality of the quadcopter (motor rotation directions, sensor calibration, radio stick directions). If you configured your radio switches according to the [radio configuration page](/configure-rc-radio/), the following instructions should match exactly: * Flip the motor Kill switch DOWN * Flip the Flight Mode switch UP (manual mode) * Hold the right stick centered and left stick down and right to ARM * Move left stick to bottom-middle position. * Slowly raise left stick up to spool up the motors and take off. ## To Land in Manual Mode * Slowly drop throttle until the quadcopter touches the ground. * Hold the throttle stick all the way down until the system DISARMS * If connected, QGroundControl will verbally confirm that the system is DISARMED * The motors will keep spinning slowly (idling) for a few seconds even after disarming. * Flip the motor kill switch UP to kill the motors. ## Next Steps Now it's time to experiment with [voxl-vision-hub](/voxl-vision-hub/) and try flying in VIO mode! --- Source: https://docs.modalai.com/flight-core-user-guides/ # Flight Core User Guides --- ![flight-core](/images/flight-core/flight-core.jpg) [First Step: Connections](/flight-core-connections/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-connections/ # Flight Core Connections ## Setting up the Connections Before configuring the Flight Core's software, we suggested mounting it to your airframe and make sure the airframe is physically ready to fly. You should connect at least the following items to proceed through this getting-started manual. > Due to supply chain issues, the colors of the connectors on Flight Core are subject to change. If the colors of the connectors on your flight core are different, please disregard. ### USB - Using the MCBL-00010](/cable-datasheets/#mcbl-00010) (JST to microUSB female) included in the `FC-R1` kit + a micro USB cable, you can connect to a host computer running QGroundControl over USB. - **NOTE** - it's possible to inadvertently plug the USB cable into the wrong port which can lead to issues. Please be cautious here! ![flight-core-usb.png](/images/flight-core/flight-core-usb.png) ### ESCs/Motors - Using the [MCBL-00004](/cable-datasheets/#mcbl-00004) cable included in the `FC-R1` kit, connect the Flight Core board's `J7` to the PWM Breakout Board - From the PWM Breakout Board, you can connect to your ESCs/Motors ![flight-core-pwm.png](/images/flight-core/flight-core-pwm.png) ### Power Supply - Using the [MCBL-00003](/cable-datasheets/#mcbl-00003) cable included in the `FC-PWR` kit, connect the Power Module to the Flight Core's `J6` connector - Connect the Power Modules's output to your power distribution method (e.g. for an s500 airframe, you'd connect to the PCB Center plate) ![flight-core-power.png](/images/flight-core/flight-core-power.png) ### RC Receiver #### Spektrum Receiver (Default) Using the [MCBL-00005](/cable-datasheets/#mcbl-00005) cable included in the `FC-R1` kit, connect to an RC Receiver (e.g. a Spektrum Satellite) to Flight Core's `J12`. ![flight-core-rc.png](/images/flight-core/flight-core-rc.png) #### FrSky Receiver (Optional) To connect a FrSky receiver, like the X8R, you can use MCBL-00018 ([Datasheet](/cable-datasheets/#mcbl-00018) | Order). ![flight-core-frsky.png](/images/flight-core/flight-core-frsky.png) #### Graupner Receiver (Optional) MZ 12 Pro, Setup Guide [Video](https://youtu.be/fqQ1ET4Kn9w) GR-16 with MCBL-00018 ([Datasheet](/cable-datasheets/#mcbl-00018) | Order). ### GPS If you wish to use a GPS/magnetometer you should attach it now as we will reach the calibration step shortly. A DroneCode standard 6-pin GPS can be used and connected to Flight Core's `J10`. For example, the mRo GPS u-Blox Neo-M8N Dual Compass LIS3MDL+ IST8310 or [Pixhawk4 2nd GPS Module](https://holybro.com/products/m8n-gps) ![flight-core-gps.png](/images/flight-core/flight-core-gps.png) ### Wireless Telemetry Link #### VOXL We recommend using a VOXL as your wireless telemetry link, which supports both WiFi and LTE. If you intend to use a VOXL as the primary wireless telemetry connection, you should make sure it's software is up to date has [voxl-vision-hub installed and configured](/voxl-vision-hub/) with the IP address of your ground control computer already set. Captured in the [how to connect VOXL to Flight Core](/how-to-connect-voxl-to-flight-core/) section, you can see how to use the [MCBL-00007](/cable-datasheets/#mcbl-00007) cable to connect the Flight Core's `J1` to VOXL's `J12` #### SiK Based Telemetry Radio Alternatively, you can use a SiK point-to-point telemetry link like the [Transceiver Telemetry Radio V3](https://holybro.com/products/sik-telemetry-radio-v3) using the included cables in that kit and connect to Flight Core's DroneCode standard `J5` connector ![flight-core-sik.png](/images/flight-core/flight-core-sik.png) [Next: Flight Core Radios](/flight-core-radios/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-radios/ # Flight Core Radios ## Summary This section covers different radio options for Flight Core and VOXL Flight, and subsequently, the VOXL m500 reference drone. ## Spektrum ### Spektrum Tested Receivers Spektrum receiver connection instructions [here](/flight-core-connections/#spektrum-receiver-default) Non-exclusive list: - SPM9645 with [MCBL-00005](/cable-datasheets/#mcbl-00005) - SPM9745 with [MCBL-00005](/cable-datasheets/#mcbl-00005) ## FrSky FrSky receiver connection instructions [here](/flight-core-connections/#frsky-receiver-optional) Video tutorial on how to pair an FrSky X8R [(Youtube)](https://www.youtube.com/watch?v=1IYg5mQdLVI) ### FrSky Tested Receivers Non-exclusive list: - X8R with [MCBL-00018](/cable-datasheets/#mcbl-00018) - R-XSR with [MCBL-00021](/cable-datasheets/#mcbl-00021) ### FrSky Telemetry Output To use FrSky Telemetry output, you use the spare telemetry input (`J5` on Flight Core, `J1010` on VOXL Flight) and configure the `TEL_FRSKY_CONFIG` setting. For example, power the receiver with 5VDC using the spare PPM input (`J9` and`J1003` on Flight Core VOXL Flight respectively) pins 1 and 3 (5VDC and GND). Then, route the telemetry cable to telemetry input (`J5` on Flight Core, `J1010` on VOXL Flight). Using QGroundControl, go to `Parameters > Telemetry > TEL_FRSKY_CONFIG` and set to `TELEM1`. ## Graupner Graupner receiver connection instructions [here](/flight-core-connections/#graupner-receiver-optional) ### Graupner Tested Receivers Non-exclusive list: - [MZ 12 Pro, Setup Guide Video](https://youtu.be/fqQ1ET4Kn9w) - GR-16 with [MCBL-00018](/cable-datasheets/#mcbl-00018) [Next: Flight Core ESC Calibration](/flight-core-pwm-esc-calibration/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-pwm-esc-calibration/ # Flight Core PWM ESC Calibration The following describes an alternative way to calibrate PWM based ESCs without the using QGroundControl, which requires you to remove the battery upon power up of the VOXL Flight or Flight Core, which isn't an option for a non-USB powered device like ours. > Alternatively, you can avoid calibration if your ESCs support DShot. Checkout the `DSHOT_CONFIG` parameter in the PX4 settings using QGroundControl. > **PLEASE MAKE SURE YOU HAVE THE PROPS REMOVED** ## px4-esc-cal-tool Clone the following repo to proceed: ```bash git clone https://gitlab.com/voxl-public/flight-core-px4/px4-esc-cal-tool cd px4-esc-cal-tool ``` This tool uses python3, so depending on your environment, you may need to run `python3` or `python`. Dependencies: ```bash pip install pymavlink pyserial ``` or ```bash pip3 install pymavlink pyserial ``` ## Procedure ### USB Required: - Host PC (OSX or Ubuntu) - Python 3 - VOXL-Flight or Flight Core - USB to JST Cable (`MCBL-00010` + MicroUSB cable) Instructions: 1. Remove the PWM output cable from the board (`J1007` on VOXL Flight or `J7` on Flight Core) 2. Connect host PC to VOXL-Flight or Flight Core using USB to JST cable 3. Power vehicle with battery 4. Run the following command from the root of the `px4-esc-cal-tool` project: ```bash # For v1.10 python px4-esc-cal-tool.py # For v1.11+ python px4-esc-cal-tool-v1-11.py ``` or ```bash # For v1.10 python3 px4-esc-cal-tool.py # For v1.11+ python3 px4-esc-cal-tool-v1-11.py ``` 5. Follow the instructions on screen ### UDP Required: - Host PC (OSX or Ubuntu) - Python 3 - VOXL-Flight or VOXL + Flight Core, where [voxl-vision-hub](/voxl-vision-hub/) is configured Instructions: 1. Remove the PWM output cable from the board (`J1007` on VOXL Flight or `J7` on Flight Core) 2. Power vehicle with battery 3. Connect host PC to VOXL-Flight or Flight Core over local network using [voxl-vision-hub](/voxl-vision-hub/) ```bash python px4-esc-cal-tool.py 0.0.0.0:14550 ``` or ```bash python3 px4-esc-cal-tool.py 0.0.0.0:14550 ``` 5. Follow the instructions on screen [Next: Flight Core Firmware](/flight-core-firmware/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-firmware/ # Flight Core Firmware - PX4 Flight Controller Firmware ## Summary The PX4 firmware discussed here applies to both Flight Core and VOXL Flight. We are currently shipping a minor fork of PX4 v1.14.0 ArduPilot / ArduCopter support is progressing through the ArduPilot community, more details below. Note, [Flight Core v2](/flight-core-v2/) firmware can be found [here](/flight-core-v2-firmware/) ## PX4 v1.14 Starting with PX4 1.14, our flight core and VOXL2-SDSP PX4 firmwares and now built from the same repo. The flight Core V1 firmware can be found here: [http://voxl-packages.modalai.com/dists/fc-v1/](http://voxl-packages.modalai.com/dists/fc-v1/) The SDK-1.1 folder contains the PX4 firmware that's tested with SDK-1.1 running on VOXL. Make sure you upgrade your flight core firmware with the file included in the voxl_SDK_1.1.0.tar.gz SDK installer. The SDK instaLL script will only flash VOXL, you will beed to follow the instructions below to flash the flight core. ## PX4 v1.11 PX4 v1.11.3 has been tested and is included in Flight Core and VOXL Flight production releases starting 2022-01-27 using a slightly modified fork as `v1.11.3-0.2.3`. ### Firmware Files - PX4 Stable Release With PX4 v1.11, you can update Flight Core or VOXL Flight using **QGroundControl** by selecting the current stable release. ### Firmware Files - ModalAI Builds We're constantly testing new stuff, and we've taken v1.11 and added some tweaks (see changelog below). You can get the ModalAI v1.11 files here: - [Update using QGroundControl](https://storage.googleapis.com/modalai_public/flightcore-releases/v1.11.3-0.2.3-modalai_fc-v1_default.px4) ([commit](https://github.com/modalai/px4-firmware/commit/f40863b2a72a3cf1c8d85b364a25a5dff3e87898)) - [Update using Binary (not common, e.g. STLink)](https://storage.googleapis.com/modalai_public/flightcore-releases/v1.11.3-0.2.3-modalai_fc-v1.bin) ([commit](https://github.com/modalai/px4-firmware/commit/f40863b2a72a3cf1c8d85b364a25a5dff3e87898)) ### Update Procedure The firmware update procedure [can be found here](/update-flight-core-firmware/) ### v1.11 Change Log The goal is to have PX4 mainline support for Flight Core, although occasionally fixes or enhancements are introduced and released by ModalAI faster than PX4 releases. ModalAI's v1.11 development branch is found [here](https://github.com/modalai/px4-firmware/tree/modalai-1.11) | Version | Type | Change Description | Commit | Status | |--- |--- |--- |--- |--- | | [FCv1 - v1.11.3-0.2.3](https://storage.googleapis.com/modalai_public/flightcore-releases/v1.11.3-0.2.3-modalai_fc-v1_default.px4) | ModalAI Enhancement | - Add alternate GPS LED i2c address
- Add support for:
- GPS-to-VIO fusion
- Automatic Data Fusion Selection
- VIO airspaces
- FCv2 Board Support added
- Mainline Cherry Pick: icm42688p: properly disable anti-aliasing and notch filter [info here](https://github.com/modalai/px4-firmware/commit/ff53393d0082eb3b7fce66be68d0ceea710adb63)| [Tag](https://github.com/modalai/px4-firmware/releases/tag/v1.11.3-0.2.3) | Released | | [v1.11.3-0.0.5](https://storage.googleapis.com/modalai_public/flightcore-releases/1.11.3-0.0.5.modalai_fc-v1_default.px4) | ModalAI Enhancement | - Integrate v1.11.3 patches from PX4 mainline | [Tag](https://github.com/modalai/px4-firmware/releases/tag/v1.11.3-0.0.5) | Released | | v1.11.2-0.0.4 | ModalAI Enhancement | - Add support for MDK-M0051-1-00 test device
- Add modalai system command for factory testing | [Releases](https://github.com/modalai/px4-firmware/releases) | | | v1.11.2-0.0.3 | ModalAI Enhancement | - [Make ICM42688 default](https://github.com/modalai/px4-firmware/commit/9b5bad6e19cf806d5e822a77bf348e392f126876)
- [Add support for M0051](https://github.com/modalai/px4-firmware/commit/6e33449f4d5b172f0deb90191758f6bf8d5d629b) | [Releases](https://github.com/modalai/px4-firmware/releases) | | | v1.11.2-0.0.2 | ModalAI Enhancement | - [Allow EKF to init without VIO](https://github.com/modalai/px4-firmware/commit/a317030af9b33b32078e756e05e5a49213b1a49c) | [Releases](https://github.com/modalai/px4-firmware/releases) | | | v1.11.2-0.0.1 | ModalAI Enhancement | - [UART ESC Support](https://github.com/modalai/px4-firmware/commit/1dfa9feba729a243d60bbaa8fa9f8fcb226404ac)
- [EKF init w/o mag](https://github.com/modalai/px4-firmware/commit/65c59f1af7b3d077b186fecb088ba554efd178d9) | [Releases](https://github.com/modalai/px4-firmware/releases) | |
## PX4 v1.10 When using PX4 v1.10, it is recommended that you use the [ModalAI v1.10 build](https://github.com/modalai/px4-firmware/tree/modalai-1.10), which fixes some bugs present in the PX4 v1.10 release affecting this hardware (see changelog below for details). ### Firmware Files You can get the v1.10 files here: - [Update using QGroundControl](https://storage.googleapis.com/flight-core-firmware-1-10/latest/modalai_fc-v1_default.px4)(git hash: 782a54bfd6ec2bd0a82cd43ce8c5dc9cd3de6ff0) - [Update using Binary (not common, e.g. SEGGER)](https://storage.googleapis.com/flight-core-firmware-1-10/latest/modalai_fc-v1.bin)(git hash: 782a54bfd6ec2bd0a82cd43ce8c5dc9cd3de6ff0) ### Update Procedure The firmware update procedure [can be found here](/update-flight-core-firmware/) ### v1.10 Change Log The goal is to have PX4 mainline support for Flight Core, although occasionally fixes or enhancements are introduced and released by ModalAI faster than PX4 releases. *NOTE: in v1.10, to find the version, run `ver all` from nsh and find the fw-hash* | Version (fw-hash) | Type | Change Description | PR / Commit | Status | |--- |--- |--- |--- | --- | | Latest, [782a54bf](https://github.com/modalai/px4-firmware/commit/782a54bfd6ec2bd0a82cd43ce8c5dc9cd3de6ff0) | Enchancement | Add support for VOXL PM v3 (INA231) | [782a54bf](https://github.com/modalai/px4-firmware/commit/782a54bfd6ec2bd0a82cd43ce8c5dc9cd3de6ff0) | [Merged into Master](https://github.com/PX4/PX4-Autopilot/pull/15577), likely in v1.12 or v1.11 maintenance | | | Bug Fix | Fix for timer config bug resulting in chan5 output being overwritten | [65c2b4d7](https://github.com/modalai/px4-firmware/commit/65c2b4d76c51a078b760cdff94d8ff18bd2347ca) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Enchancement | Support velocity odometry with MAV_FRAM_LOCAL_FRD | [1cbbfffc](https://github.com/modalai/px4-firmware/commit/1cbbfffc91a5a520b9b9bb189e82c79b57b0ab18) | stale - no longer required by voxl-vision-px4 | | | Enchancement | Allow EKF2 to intialize without mag if VIO valid | [2d7ff3c6](https://github.com/modalai/px4-firmware/commit/2d7ff3c6ac517162f96ee8764b6cf3b9458662ec) | **Not mainlined, PR rejected** | | | Enchancement | HW detection of Flight Core vs VOXL Flight | [589c4a46](https://github.com/modalai/px4-firmware/commit/589c4a4657c45a1a69cb5af4b0d9c95c6c6c5315) and [0f6ffc53](https://github.com/modalai/px4-firmware/commit/0f6ffc53b9000f8f276dbbbef2a2d10fe5849d11) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Bug Fix | Fixes issue with Flight Core HW rev detection | [589c4a46](https://github.com/modalai/px4-firmware/commit/589c4a4657c45a1a69cb5af4b0d9c95c6c6c5315) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Bug Fix | Fix for SD card writing failures | [ea1e5b72](https://github.com/modalai/px4-firmware/commit/ea1e5b72be5c76bf14b7c1145ad16f7a811502ff) and [dbd065ab](https://github.com/modalai/px4-firmware/commit/dbd065abb38f1bfe3a2dc3e548a98f68d514437d) and [fd0a00f9](https://github.com/modalai/px4-firmware/commit/fd0a00f92af24409e6c262899107c3a2d1a4e5c6) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Bug Fix | Fix for timer config bug resulting in chan5 output being overwritten | [65c2b4d7](https://github.com/modalai/px4-firmware/commit/65c2b4d76c51a078b760cdff94d8ff18bd2347ca) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Enchancmeent | Add Support for VOXL-Flight | [5ffab958](https://github.com/modalai/px4-firmware/commit/5ffab958d3dffcbfab68ca341fc6089a54b35e70) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Bug Fix | rotate default orientation 180° yaw | [dc816a5c](https://github.com/modalai/px4-firmware/commit/dc816a5c8ad5f1bff861a0ae709028905137f1d5) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | Bug Fix | Various stack size and defconfig bug fixes | [a37c028a](https://github.com/modalai/px4-firmware/commit/a37c028a49e5b300b808b358fd53bec33fff081f) and [5dd4c0dc](https://github.com/modalai/px4-firmware/commit/5dd4c0dc0d09b318287528fdca3c3d18a364f90b) and [ff994390](https://github.com/modalai/px4-firmware/commit/ff99439084aab39dda6892047e2c3bd16dfdb20a) | Fixed in ModalAI v1.10, Mainlined in v1.11 | | | **PX4 Release** |**PX4 v1.10.0 production release** | [4f6faac2](https://github.com/modalai/px4-firmware/commit/4f6faac2c86daa14417b33bfbf9c4e44bf17492a) | | ## How to Build the Firwmare This example uses the PX4 mainline repository. ```bash git clone https://github.com/PX4/PX4-Autopilot.git cd Firmware make modalai_fc-v1 ``` ## Flashing Using SEGGER JLink You can use `JFlash` with a `.jlink` file with command like so, where `deadbeef.bin` is the name of the binary file: ```bash loadbin modalai_fc-v1.bin,0x08008000 ``` ## ArduPilot ModalAI's Flight Core is integrated into ArduPilot by the great ArduPilot community. The engineers at ModalAI do not have experience with ArduPilot, so can not offer significant support. It is recommended to find support through the normal ArduPilot channels ([boards](https://discuss.ardupilot.org/) & [Discord](https://ardupilot.org/dev/docs/ardupilot-discord-server.html)). Hopefully ModalAI will gain experience with ArduPilot in the future. ArduPilot pull request for ModalAI Flight Core v1 base hardware support [Github](https://github.com/ArduPilot/ardupilot/pull/16255/) ArduPilot pull request for VOXL-compatible Visual Inertial Odometry support [Github](https://github.com/ArduPilot/ardupilot/pull/26277) [Next: Flight Core Bootloader](/flight-core-bootloader/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-bootloader/ # Flight Core Bootloader ## Changelog | Release | Build Commit | Description | Link | |--- |--- |--- | --- | | 1 | N/A | Alpha Release | N/A | | 2 | [GitLab CI](https://gitlab.com/voxl-public/flight-core-px4/px4-bootloader-ci/commit/7bc2734a091650522789b9ab3c3b86d7a8a01022) | QGC FW Update Support ([bug fix](https://github.com/PX4/PX4-Bootloader/commit/d83169d50c333ab33d8206a8a29f6efc9605c39b)) | no longer hosted | ## Bootloader Binary Location A prebuilt binary of the latest bootloader can be [downloaded from here](https://storage.googleapis.com/flight-core-firmware-bootloader/latest/modalai_fc_v1_bl.bin) ## How to Build the Bootloader You can build (and customize) the bootloader as needed. Flight Core is supported in the PX4 Bootloader mainline repository. ```bash git clone https://github.com/PX4/PX4-Bootloader cd Bootloader make modalai_fc_v1_bl ``` ## In Field Bootloader Update Procedure > You should know what you're doing before proceeding — this can brick the device. - Download the bootloader binary - Copy the file to the root of a MicroSD card - Power off the Flight Core - Insert the MicroSD card into the Flight Core's MicroSD card slot - Power on the Flight Core - Connect Flight Core to QGroundControl using the USB cable - Note: alternatively you can use the debug serial console - If using USB, in QGC, go to the MAVLink Console terminal - Verify the `modalai_fc_v1_bl.bin` is on the MicroSD card by running the following command: ```bash ls /fs/microsd ``` The following should (roughly) display: ```bash /fs/microsd: dataman log/ modalai_fc_v1_bl.bin ``` - To update the bootloader, run the following command: ```bash bl_update /fs/microsd/modalai_fc_v1_bl.bin ``` The following should display: ```bash INFO [bl_update] image validated, erasing bootloader... ERROR [bl_update] erase error at 0x8000100 INFO [bl_update] flashing... INFO [bl_update] verifying... INFO [bl_update] bootloader update complete ``` - Reboot the device and verify it boots up ```bash reboot ``` ## Flashing Using SEGGER JLink You can use `JFlash` with a `.jlink` file with command like so: ```bash loadbin modalai_fc_v1_bl.bin,0x08000000 ``` --- Source: https://docs.modalai.com/flight-core-datasheet/ # Flight Core Datasheets The ModalAI Flight Core is an STM32F7-based flight controller for PX4 and ArduPilot, assembled in the USA. The Flight Core can be paired with [VOXL](/voxl/) or [VOXL 2](/voxl-2/) for obstacle avoidance and GPS-denied navigation, or used independently as a standalone flight controller. ![fc-top-with-quarter](/images/flight-core/modalai-fc-v1-quarter.jpg) --- Source: https://docs.modalai.com/flight-core-datasheet-functional-description/ # Flight Core Functional Description --- ## Overview ModalAI Flight Core is a PX4 flight controller that uses a very similar architecture to FMUv5x. It's design goal is to be software compatible with the FMUv5x architecture in a smaller Pixracer-style form factor. ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0018_122721.stp) ### 2D Drawings ![flight-core-dims.png](/images/flight-core/flight-core-dims.png) ![flight_core_v1_imu_locations.png](/images/flight-core/flight_core_v1_imu_locations.png) ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | 6 g | | MCU | 216MHz, 32-bit ARM M7 [STM32F765II](https://www.st.com/en/microcontrollers-microprocessors/stm32f765ii.html) | | Memory | 256Kb FRAM | | | 2Mbit Flash | | | 512Kbit SRAM | | Firmware | [PX4](https://github.com/PX4/PX4-Autopilot/tree/main/boards/modalai/fc-v1) | | IMUs | [ICM-20602](https://www.invensense.tdk.com/en-us/products/motion-tracking/6-axis/icm-20602) (SPI1) | | | [ICM-42688-P](https://www.invensense.tdk.com/en-us/products/6-axis/icm-42688-p) (SPI2) | | | [BMI088](https://www.bosch-sensortec.com/en/products/motion-sensors/imus/bmi088) (SPI6) | | Barometer | [BMP388](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp388-ds001.pdf) (I2C4) | | Secure Element | A71CH (I2C4) | | microSD Card | [PX4 Supported SD Cards](https://docs.px4.io/main/en/dev_log/logging.html#sd-cards) SDHC version 2 up to 32GB | | Inputs | GPS/Mag | | | Spektrum | | | Telemetry | | | CAN bus | | | PPM | | Outputs | 6 LEDs (2xRGB) | | | 8 PWM Channels | | Extra Interfaces | 3 serial ports | | | I2C | | | GPIO | [Top](#table-of-contents) ## Block Diagram ![fc-dk-preliminary-datasheet.png](/images/flight-core/fc-dk-preliminary-datasheet.png) *Figure 1* [Top](#table-of-contents) ## Orientation The following is a 'top down' view of the Flight Core depicting the orientation. Starting in PX4 v1.11, the orientation is updated to better align with the usage of the VOXL-Flight. The following is a 'top down' view of the Flight Core depicting a `ROTATION_NONE` setup. | PX4 Version | Orientation to Achieve Forward | Branch | Notes | | --- | --- | --- | | 1.10 | `ROTATION_YAW_180` | [relesase/1.10](https://github.com/PX4/PX4-Autopilot/tree/release/1.10) | Not Recommended | | modalai_1.10 | `ROTATION_NONE` | [modalai_1.10](https://github.com/modalai/px4-firmware/tree/modalai-1.10) | Recommended | | master | `ROTATION_NONE` | [master](https://github.com/PX4/PX4-Autopilot) | In Development | ![Flight Core Orientation](/images/flight-core/fc-orientation-144-dpi.png) ## Power Supply ### Recommended A 5VDC supply is required to power the Flight Core. The `FC-PM` Power Module board is recommended, which provides battery voltage and amperage monitoring through an I2C interface when connected to `J6` using the `MCBL-00003` cable. Other connectors also allow a 5VDC supply to be connected (see [connectors page](/flight-core-datasheet-connectors/) ) - J6 - recommended, provides I2C interace for monitoring - J1/J4/J5 ### Power Usage > The following is preliminary data. Test configuration: - Using a 5VDC supply - Using a development build of [modalai/px4-firmware](https://github.com/modalai/px4-firmware) (the exact commit is no longer available) | Use Case | Typical Usage (Peak) | | --- | --- | | Idle | 180 mA | | Idle, with GPS (HolyBro Pixhawk 4, Second GPS)| 260 mA | | Idle, with Spektrum DSMX | 200 mA | | Idle, with Holybro Telemetry | 230 mA | | Idle, with GPS/Spektrum/Telemetry | 330 mA | [Top](#table-of-contents) Pixhawk is a registered trademark of Lorenz Meier. [Next: Flight Core Connectors](/flight-core-datasheet-connectors/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-datasheet-connectors/ # Flight Core Connectors --- ## Board Connections and Pin-out Specifications > Due to supply chain issues, the colors of the connectors on Flight Core are subject to change. If the colors of the connectors on your flight core are different, please disregard. ### Flight Core Board Top ![Flight Core Top](/images/flight-core/fc-overlay-top-144-dpi.png) | Connector | Summary | | --- | --- | | J1 | VOXL Communications Interface Connector (TELEM2, /dev/ttyS4, UART5) | | J2 | Programming and Debug Connector | | J3 | USB Connector | | J4 | UART ESC, (UART2, /dev/ttyS1, TELEM3 | | J5 | Telemetry Connector (TELEM1, /dev/ttyS6, UART7) | | J6 | VOXL-Power Management Input / Expansion | | J7 | 8-Channel PWM Output Connector (PWM or DShot ESCs) | | J8 | CAN Bus Connector | | J9 | PPM RC In | | J10 | External GPS & Magnetometer Connector (/dev/ttyS0, UART1) | | J12 | RC Input, Spektrum/SBus/UART Connector | | J13 | I2C Display (Spare Sensor Connector) / Safety Button Input | ### Flight Core Board Bottom ![Flight Core Core Bottom](/images/flight-core/fc-overlay-bot-144-dpi.png) [Top](#table-of-contents) --- ## J1 - VOXL Communications Interface Connector Connector: 6 Position HIROSE DF13, Vertical, DF13-6P-1.25V(50) > UART lines are 5V inputs (level shifted to 3.3V by the Flight Core) | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (input or output if supplied at another pin)| | 2 | UART_4W_RX_5V | | 3 | UART_4W_TX_5V | | 4 | UART_4W_RTS_5V | | 5 | GND | | 6 | UART_4W_CTS_5V | [Top](#table-of-contents) ## J2 - Programming and Debug Console Connector: 8 Position, Vertical, BM08B-SRSS-TB(LF)(SN) *Note: used for PX4 debug console, can be used for STM32 FW update* | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 | | 2 | UART_2W_DEBUG_TX | | 3 | UART_2W_DEBUG_RX | | 4 | SWDIO | | 5 | SWCLK | | 6 | GND | | 7 | !RESET | | 8 | VPP_STM | [Top](#table-of-contents) ## J3 - USB Connector > This connector does not provide system power Connector: 4 Position JST GH, Vertical, BM04B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | VBUS_IN | | 2 | DATA_M | | 3 | DATA_P | | 4 | GND | [Top](#table-of-contents) ## J4 - UART ESC, UART2/TELEM3 Connector: 8 Position HIROSE DF13, Vertical, DF13-8P-1.25V(50) | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins are 3.3V, input or output if supplied at another pin) | | 2 | UART_4W_RX_3V3 | | 3 | UART_4W_TX_3V3 | | 4 | UART_4W_RTS_3V3 | | 5 | GND | | 6 | UART_4W_CTS_3V3 | | 7 | GPIO (MSS Status Output) | | 8 | GPIO (MSS Status Input) | [Top](#table-of-contents) ## J5 - Telemetry Connector Connector: 6 Position JST GH, Vertical, MB06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | UART_4W_TX_3V3 | | 3 | UART_4W_RX_3V3 | | 4 | UART_4W_CTS_3V3 | | 5 | UART_4W_RTS_3V3 | | 6 | GND | [Top](#table-of-contents) ## J6 - VOXL-Power Management Input / Expansion Connector: 6 Position JST GH, Vertical, BM06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | UART_2W_TX_3V3 | | 3 | UART_2W_RX_3V3 | | 4 | EXP_I2C_SCL | | 5 | EXP_I2C_SDA | | 6 | GND | [Top](#table-of-contents) ## J7 - 8-Channel PWM Output Connector for PWM or DShot ESCs Connector: 10 Position JST GH, Vertical, BM10B-GHS-TBT > 5V is for Ref Only | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins are 3.3V, input or output if supplied at another pin) | | 2 | PWM_CH1 | | 3 | PWM_CH2 | | 4 | PWM_CH3 | | 5 | PWM_CH4 | | 6 | PWM_CH5 | | 7 | PWM_CH6 | | 8 | PWM_CH7 | | 9 | PWM_CH8 | | 10 | GND | ## J8 - CAN Bus Connector Connector: 4 Position JST GH, Vertical, BM04B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC | | 2 | CANH* | | 3 | CANL* | | 4 | GND | *CAN signals are compliant with ISO 11898-2:2016 and SAE J2284-1 to SAE J2284-5 [Top](#table-of-contents) ## J9 - PPM RC In Connector: 3 Position JST GH, Vertical, BM03B-GHS-TBT **Note: This JST connector is reversed when compared to VOXL Flight, pinouts are still the same** | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | PPM_IN | | 3 | GND | [Top](#table-of-contents) ## J10 - External GPS & Magnetometer Connector Connector: 6 Position JST GH, Vertical, BM06B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | EXT_GPS_UART_2W_TX | | 3 | EXT_GPS_UART_2W_RX | | 4 | EXT_GPS_I2C_SCL | | 5 | EXT_GPS_I2C_SDA | | 6 | GND | ### Supported GPS Modules - mRo GPS u-Blox Neo-M8N Dual Compass LIS3MDL+ IST8310 - [Pixhawk 4 2nd GPS Module](https://holybro.com/products/m8n-gps) [Top](#table-of-contents) ## J11 - MicroSD MicroSD slot. Information about supported cards is here: https://docs.px4.io/main/en/dev_log/logging.html#sd-cards [Top](#table-of-contents) ## J12 - RC input / USART6 Connector Connector: 4 Position JST GH, Vertical, BM04B-GHS-TBT | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 (Spektrum Power) | | 2 | USART6_TX | | 3 | SPEKTRUM RX (3.3V), SBus RX (3.3V), USART6_RX | | 4 | GND | For additional RC configurations, please see [Flight Core Radios](/flight-core-radios/) [Top](#table-of-contents) ## J13 - I2C Display / I2C2 Bus / Safety Switch Connector Connector: 5 Position, Vertical, BM05B-SRSS-TB(LF)(SN) | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 | | 2 | GND | | 3 | I2C2_SDA | | 4 | I2C2_SCL | | 5 | Safety Switch In (switch should pull high to 3.3V to enable) | [Top](#table-of-contents) [Next: Flight Core LEDs](/flight-core-datasheet-leds/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-kits/ # Flight Core Kits --- ## Flight Core Development Kit ![fc-dk](/images/flight-core/fc-dk.jpg) Available for purchase here ## Kits available - MDK-M0018-2-00 - Flight Core Board only - MDK-M0018-2-01 - Flight Core with Dev kit - PWM breakout (M0022), and cables (USB-to-JST MCBL-00010, VOXL Serial MCBL-00007, RC input MCBL-00005) - MDK-M0018-1 - Flight core Cable Kit Only - PWM breakout (M0022), and cables (USB-to-JST MCBL-00010, VOXL Serial MCBL-00007, RC input MCBL-00005) --- Source: https://docs.modalai.com/flight-core-datasheet-leds/ # Flight Core LEDs --- ![FC LEDs](/images/flight-core/fc-overlay-led-144-dpi.png) ### LED1 LED1 is marked on silkscreen as "DS1". It's tri-color RGB LED. #### Bootloader Mode Upon power up, while attached to USB, the device will stay in the bootloader mode for 5 seconds. | Color | Pattern | Status | | --- | --- | --- | | Green | Fast Flashing (~10 Hz) | In bootloader, waiting | | Yellow/Red | Alternating | Serial FW update in progress | #### Normal Mode | Color | Pattern | Status | | --- | --- | --- | | Green | Solid | Powered | | Blue | Flashing (~2 Hz)| Disarmed | | Blue | Solid | Armed | | Red | Solid | Error, hard fault | #### Sensor Calibration Mode | Color | Pattern | Status | | --- | --- | --- | | Green | Solid | Powered | | Blue | Flashing (~20 Hz)| Calibration in progress | ### LED2 LED2 is marked on silkscreen as "DS2". It's tri-color RGB LED. **For future use**. [Next: Flight Core Configurations](/flight-core-datasheet-configuration/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-datasheet-configuration/ # Flight Core Configuration --- ## QGroundControl Configuration of the VOXL Flight is fully supported by QGroundControl 4.0. ## PX4 Parameter Files Parameter files are available for reference: - ## System Defaults The following describe the system defaults, as specified by `boards/modalai/fc-v1/init/rc.board_defaults` ### Safety Switch Disabled The saftety switch can be 'pressed' by pulling `J13` pin 5 up to 3.3V (which is provided by J13 pin 1). By default, we have the safety switch disabled, but it can be enabled via QGroundControl by setting `CBRK_IO_SAFETY` to 0. ### MAVLink Instance 1 - configured by default at TELEM2 (exposed at `J1`) at 921600 baud in Normal mode - this is intended as the primary serial interface to communicate with VOXL - this is configurable by the user, except on VOXL Flight, since it's in the PCB [Next: Flight Core Kits](/flight-core-kits/){: .btn .btn-green } --- Source: https://docs.modalai.com/flight-core-v2/ # Flight Core v2 ![Flight Core v2 board](/images/flight-core-v2/m0087-hero.png) Flight Core v2 is a [Blue UAS Framework](https://www.diu.mil/blue-uas) PX4 Drone Flight Controller (STM32**H7**-based) - Assembled in the USA. Flight Core v2 can be paired with VOXL for obstacle avoidance and indoor or outdoor GPS-denied navigation. Flight Core v2 can also be used independently as a standalone, high-performance, secure flight controller. Flight Core v2 is a part of the Blue UAS Framework and is NDAA '20 Section 848 compliant. Still have questions? Check out the forum [Here](https://forum.modalai.com/category/36/flight-core-v2) --- Source: https://docs.modalai.com/flight-core-v2-user-guides/ # Flight Core User Guides ![Flight Core v2 board](/images/flight-core-v2/m0087-hero.png) The ModalAI Flight Core v2 is an STM32**H7**-based flight controller for PX4, made in the USA. The Flight Core v2 can be paired with VOXL for obstacle avoidance and GPS-denied navigation, or used independently as a standalone flight controller. --- Source: https://docs.modalai.com/flight-core-v2-usb-to-qgc/ # Flight Core v2 USB to QGC --- ## Hardware ### J3 - USB / QGroundControl To make a connection to QGroundControl (and power the Flight Core v2), use `J3` with the recommended is [MCBL-00010](/cable-datasheets/#mcbl-00010) (JST-to-micro-USB) for this interface, when adding your own micro USB cable. ![Flight Core v2](/images/flight-core-v2/m0087-power-usb.png) ## QGC Software Notes ### All Host OS QGC 4.3.0 and later supports firmware upgrade over USB. To update FW using older QGC, please see [work around](/flight-core-v2-firmware/). ### Windows Users Please note, QGroundControl does **not** automatically make a connection to Flight Core v2 when running on Windows. To make a connection: - have FCv2 connected over USB - go to **Application Settings** > **Comms Links** - click on **Add** - enter a name like "FCv2" - set baud rate **115200** - click on the "Automatically Connect on Start" if you want - confirm the "Serial Port" is correctly listed - click **OK** Select it from the list above, and click **Connect**. --- Source: https://docs.modalai.com/flight-core-v2-power/ # Flight Core v2 Power --- ## Hardware ### J13 - VOXL Power Module v3 Input The main power input is `J13` and is typically paired with a [VOXL Power Module v3](/power-module-v3-datasheet/), which provides two I2C based power monitoring ICs, providing PX4 the battery status. Recommended is [MCBL-00062](/cable-datasheets/#mcbl-00062) (Flight Core v2 to Power Module Cable) for this interface. ![Flight Core v2](/images/flight-core-v2/m0087-power.png) ### J3 - USB Power Input New to v2 of Flight Core, is the ability to power the system off USB power (note that the main power input at `J13` takes precedence when both are present). Note there is no power monitoring via this interface. Recommended is [MCBL-00010](/cable-datasheets/#mcbl-00010) (JST-to-micro-USB) for this interface, when adding your own micro USB cable. ![Flight Core v2](/images/flight-core-v2/m0087-power-usb.png) ## Software ### PX4 Driver Source An open source PX4 driver is available at [/src/drivers/power_monitor/voxlpm](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/power_monitor/voxlpm) ### PX4 Driver Overview (Reused from the header file, DRY!) ``` * - VOXLPM v3 (QTY2 INA231) - * * +~~~~~~~~~~~~~~+ * VBATT -----| RSENSE_VBATT | ----------+---------------------> VBATT TO ESCS * | +~~~~~~~~~~~~~~+ | * | | +--------+------+ * +----+ +----+ | 5/12V REGULATOR | * | | +--------+------+ * | | | +~~~~~~~~~~~~~~+ * | | +---| RSENSE_5VOUT |---> 5/12VDC TO COMPUTE/PERIPHERAL * | | | +~~~~~~~~~~~~~~+ * | | | | * V| |A V| |A * ################# ################# * # INA231, 0x44 # # INA231, 0x45 # * ################# ################# * * * Publishes: Publishes: * - ORB_ID(battery_status) * - ORB_ID(power_monitor) - ORB_ID(power_monitor) * ``` The driver periodically queries two INA231 devices, and calculates the battery voltage and amperage draw (e.g. ESC power + compute power), along with the regulated 5VDC output and amperage draw (e.g. compute power). There are parameters that can adjust shunt resistance values if rework is done to the power module to change the fullscale range. --- Source: https://docs.modalai.com/flight-core-v2-rc-options/ # Flight Core v2 RC Options --- ## Spektrum RC ### Hardware ![Flight Core v2](/images/flight-core-v2/m0087-rc-spektrum.png) You can connect a Spektrum RC like DSMX-SPM9645 or DSMX-SPM9745 using `J13` and [MCBL-00005](/cable-datasheets/#mcbl-00005)) or by following this pinout: | J13 Pin # | Signal Name | |-------|-----------------------------------------------| | 1 | VREG_3V3 (Spektrum Power) | | 2 | USART6_TX | | 3 | SPEKTRUM RX (3.3V), SBus RX (3.3V), USART6_RX | | 4 | GND | ### Software An open source PX4 driver is available at [src/drivers/rc_input](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/rc_input). ## SBUS RC ### Hardware ![Flight Core v2](/images/flight-core-v2/m0087-rc-sbus.png) To connect a FrSky receiver, like the X8R, follow this pinout: | J13 Pin # | Signal Name | |-------|-----------------------------------------------| | 1 | NC | | 2 | NC | | 3 | RX | | 4 | GND | | J8 Pin # | Signal Name | |-------|-----------------------------------------------| | 1 | 5P0V | | 2 | NC | | 3 | NC | | 4 | NC | ### Software An open source PX4 driver is available at [src/drivers/rc_input](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/rc_input). --- Source: https://docs.modalai.com/flight-core-v2-actuators/ # Flight Core v2 Actuators --- ## Hardware ### ModalAI UART ESC UART5 is exposed on `J5`, which is mapped to `TELEM2` in PX4 and available to Nuttx as `/dev/ttyS4`. This is the default port used by the ModalAI UART ESC Driver when enabled. **PLEASE NOTE** in `1.13.2-0.1.1` and older, the recommended port is J1. It was changed to J5 starting `1.13.2-0.1.2` and newer. Recommended is [MCBL-00063](/cable-datasheets/#mcbl-00063) (6p JST ModalAI UART ESC Cable) for this interface. ![Flight Core v2](/images/flight-core-v2/m0087-modalai-esc-v2.png) **Flight Core v2 J5** | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | NC | | 2 | Flight Core v2 Tx, 3P3V (connect to ESC Rx) | | 2 | Flight Core v2 Rx, 3P3V (connect to ESC Tx) | | 4 | NC | | 5 | NC | | 6 | GND | **ModalAI ESC J2** M0049 based hardware `J2`: | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | NC | | 2 | ESC Rx | | 2 | ESC Tx | | 4 | NC | | 5 | GND | | 6 | NC | ### PWM/DShot 8 PWM channels exposed on `J7`: | Pin # | Signal Name | |-------|------------------------------------------------------------------------| | 1 | 5VDC (other pins are 3.3V, input or output if supplied at another pin) | | 2 | PWM_CH1 | | 3 | PWM_CH2 | | 4 | PWM_CH3 | | 5 | PWM_CH4 | | 6 | PWM_CH5 | | 7 | PWM_CH6 | | 8 | PWM_CH7 | | 9 | PWM_CH8 | | 10 | GND | ## Software ### ModalAI UART ESC Driver Source An open source PX4 driver is available at [src/drivers/actuators/voxl_esc](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc). ### PWM/DShot Standard PX4 drivers used. --- Source: https://docs.modalai.com/flight-core-v2-onboard-sensors/ # Flight Core v2 Onboard Sensors --- ## Summary ![Flight Core v2](/images/flight-core-v2/m0087-onboard-sensors.png) ## How to Configure Locate `boards/modalai/fc-v2/init/rc.board_sensors`, modify and rebuild. ## IMUs ### Hardware - IMU1 - ICM-42688p (U14, SPI1) - IMU2 - ICM-42688p (U11, SPI2) ### Software See [src/drivers/imu/invensense/icm42688p](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/imu/invensense/icm42688p) ## Barometers ### Hardware - BARO1 - BMP388 (U5, I2C4, 0x76) - disabled by default - BARO2 - ICP-20100 (U17, I2C4, 0x63) - default ### Software See [src/drivers/barometer/invensense/icp201xx](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/barometer/invensense/icp201xx) ## Magnetometer ### Hardware - MAG1 - BMM150 (U13, I2C4, 0x10) - disabled by default and not expected to be usable. Will be removed in future builds. ### Software See [src/drivers/magnetometer/bosch/bmm150](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/magnetometer/bosch/bmm150) ### How to Enable to Run on Bootup The `v1.13.2-0.1.1` release was optimized for m500 use case and has the magnetometer disabled by default. To enable on bootup, create a file on the SD Card at `/etc/extras.txt` with `bmm150 -I start` as contents. As an example, here's using an SD Card reader on Ubuntu: ``` travis@travis-18 > / > cd media/travis travis@travis-18 > /media/travis > ls 3266-3639 travis@travis-18 > /media/travis > cd 3266-3639 travis@travis-18 > /media/travis/3266-3639 > ls dataman log uavcan.db ufw travis@travis-18 > /media/travis/3266-3639 > mkdir etc travis@travis-18 > /media/travis/3266-3639 > cd etc travis@travis-18 > /media/travis/3266-3639/etc > echo "bmm150 -I start" > extras.txt ``` --- Source: https://docs.modalai.com/flight-core-v2-telemetry/ # Flight Core v2 Telemetry --- ## Hardware ### J1 - TELEM1 UART7 is exposed on `J1`, which is mapped to `TELEM1` in PX4 and available to Nuttx as `/dev/ttyS6`. This is the default port used by the ModalAI UART ESC Driver when enabled. When the UART ESC is not enabled, this can be used to interface with as a typical telemetry port. **PLEASE NOTE** in `1.13.2-0.1.1` and older, the default ESC port was J5. | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | NC | | 2 | Flight Core v2 TELEM1 Rx, 5P0V | | 2 | Flight Core v2 TELEM1 Tx, 5P0V | | 4 | NC | | 5 | NC | | 6 | GND | ### J5 - TELEM2 UART5 is exposed on `J5`, which is mapped to `TELEM2` in PX4 and available to Nuttx as `/dev/ttyS4`. Recommended is [MCBL-00066](/cable-datasheets/#mcbl-00066) (6p to 4p JST UART Cable) for this interface. **PLEASE NOTE** in `1.13.2-0.1.1` and older, this port was used as default ModalAI ESC, which changed to J1. ![Flight Core v2](/images/flight-core-v2/m0087-telem1-v2.png) *Flight Core v2 J1* | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | NC | | 2 | Flight Core v2 Rx, ESC Tx, 3P3V | | 2 | Flight Core v2 Tx, ESC Rx, 3P3V | | 4 | NC | | 5 | NC | | 6 | GND | *VOXL 2 UART Add-On J3* | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | NC | | 2 | RX, VOXL 2 `/dev/ttyHS1` | | 2 | TX, VOXL 2 `/dev/ttyHS1` | | 4 | GND | --- Source: https://docs.modalai.com/flight-core-v2-external-sensors/ # Flight Core v2 External Sensors --- ## GPS/Compass ### Hardware Use `J10` for standard 6pin style GPS/compass assemblies. | Pin # | Signal Name | |-------|--------------------------------------------------------------------| | 1 | 5VDC (other pins 3.3V, input or output if supplied at another pin) | | 2 | EXT_GPS_UART_2W_TX | | 3 | EXT_GPS_UART_2W_RX | | 4 | EXT_GPS_I2C_SCL | | 5 | EXT_GPS_I2C_SDA | | 6 | GND | ### Software See standard PX4 GPS/compass drivers. ## External SPI Based Sensors ### Hardware An external SPI bus connected to `SPI6` is available on `J14` ![Flight Core v2](/images/flight-core-v2/M0087-external-spi.png) | Pin # | Signal Name | |-------|----------------------------| | 1 | VREG_3V3 | | 2 | SPI6_MISO_EXPANSION (3P3V) | | 3 | SPI6_MOSI_EXPANSION (3P3V) | | 4 | SPI6_SCK_EXPANSION (3P3V) | | 5 | SPI6_CS_EXPANSION_N (3P3V) | | 6 | | | 7 | | | 8 | | | 9 | | | 10 | | | 11 | | | 12 | GND | ### Software You can enable the external SPI device to run on startup here as required: [boards/modalai/fc-v2/init/rc.board_sensors](https://github.com/PX4/PX4-Autopilot/blob/main/boards/modalai/fc-v2/init/rc.board_sensors). For example, and note the `-S` is capital to denote external IMU, also not specifying bus with `-b X` which causes the probe to fail: ```bash # External SPI6 ICM-42688 icm42688p -S -R 12 start ``` --- Source: https://docs.modalai.com/flight-core-v2-firmware/ # Flight Core v2 Firmware --- # Release Notes ## PX4 v1.14 Starting with PX4 1.14, our flight core and VOXL2-SDSP PX4 firmwares are now built from the same repo. The flight Core V2 firmware can be found here: [http://voxl-packages.modalai.com/dists/fc-v2/](http://voxl-packages.modalai.com/dists/fc-v2/) The SDK-* folder contains the PX4 firmware that's tested with SDK-* running on VOXL. Make sure you upgrade your flight core firmware with the file included in the voxl_SDK_*1.1.0.tar.gz SDK installer. The SDK install script will only flash VOXL, you will need to follow the instructions below to flash the flight core. # General User Guide ## QGroundControl FW Update The FW update feature in QGC via USB requires QGC 4.3.0 and later. ## How to Upgrade using `px_uploader` Tool Alternatively, to update the firmware, you can use the [px_uploader](https://github.com/PX4/PX4-Autopilot/blob/main/Tools/px4_uploader.py) tool. This has been tested on OSX 13.1, Ubuntu 18.04, and Ubuntu 22.04 with success to update firmware over USB. - Ensure you have Python 3 and `pyserial` module installed (`pip3 install pyserial`) - Follow build guide below, or download the firmware from links above in release notes (e.g. modalai_fc-v2_default.px4) - Obtain the PX4 open source community tool (not a ModalAI tool): ```bash git clone -b voxl-dev https://github.com/modalai/px4-firmware.git --recursive cd px4-firmware ``` - Exit QGC if running - Disconnect Flight Core v2 from USB - Run the following (note: your USB device name may be different and your path may be different, Linux default is `/dev/ttyACM1`, OSX default is `/dev/cu.usbmodem01`) ``` ./Tools/px_uploader.py --port /dev/ttyACM1 modalai_fc-v2_default.px4 --baud-bootloader 1152000 ``` - Connect Flight Core v2 over USB (note, no external power needed) - Flight Core v2 boots into bootloader mode - The update should now begin # Developer Guide ## v1.14+ PX4 Support ModalAI makes some mods to mainline and maintains a branch [here](https://github.com/modalai/px4-firmware/tree/voxl-dev) that is shipped on the product by default. ## Mainline PX4 Support - PX4 mainline Board Support is available at [boards/modalai/fc-v2](https://github.com/PX4/PX4-Autopilot/tree/main/boards/modalai/fc-v2) ## ArduPilot Support ModalAI's Flight Core 2 is integrated into ArduPilot by the great ArduPilot community. The engineers at ModalAI do not have experience with ArduPilot, so can not offer significant support. It is recommended to find support through the normal ArduPilot channels ([boards](https://discuss.ardupilot.org/) & [Discord](https://ardupilot.org/dev/docs/ardupilot-discord-server.html)). Hopefully ModalAI will gain experience with ArduPilot in the future. ArduPilot pull request for ModalAI Flight Core v2 base hardware support [Github](https://github.com/hendjoshsr71/ardupilot/tree/pr/add_modalai_fcv2) ArduPilot pull request for VOXL-compatible Visual Inertial Odometry support [Github](https://github.com/ArduPilot/ardupilot/pull/26277) ## Tools for Flashing Recommended hardware: similar to [STLink v2](https://www.st.com/en/development-tools/st-link-v2.html) or equivalent. Please install [STM32CubeProgrammer](https://www.st.com/en/development-tools/stm32cubeprog.html) to get the `STM32_Programmer_CLI` binary. ## How to Build PX4 Application It is recommended to install `voxl-docker` on your host machine before building, instructions can be found [here](/voxl-docker-and-cross-installation/#how-to-setup-voxl-docker-and-voxl-cross). ```bash git clone -b voxl-dev https://github.com/modalai/px4-firmware.git --recursive cd px4-firmware voxl-docker -i px4io/px4-dev-nuttx-focal:2022-08-12 make modalai_fc-v2 ``` After building, the bootloader binary is located at: ``` build/modalai_fc-v2_default/modalai_fc-v2_default.bin ``` ### How to Flash PX4 Bootloader with ST32CubeProgrammer The application is flashed at `0x08020000`: ``` echo "programming application..." STM32_Programmer_CLI -c port=SWD -w modalai_fc-v2_default.bin 0x08020000 -v ``` ## Bootloader The bootloader is flashed at the factor and generally you do not need to build or flash it. But, if you want to customize the bootloader, the following can be used. ### How to Build PX4 Bootloader ```bash git clone -b voxl-dev https://github.com/modalai/px4-firmware.git --recursive cd px4-firmware voxl-docker -i px4io/px4-dev-nuttx-focal:2022-08-12 make modalai_fc-v2_bootloader ``` After building, the bootloader binary is located at: ``` build/modalai_fc-v2_bootloader/modalai_fc-v2_bootloader.bin ``` ### How to Flash PX4 Bootloader with ST32CubeProgrammer The bootloader is flashed at `0x08000000`: ``` echo "erasing..." STM32_Programmer_CLI -c port=SWD -e all echo "programming bootloader..." STM32_Programmer_CLI -c port=SWD -w modalai_fc-v2_bootloader.bin 0x08000000 -v ``` --- Source: https://docs.modalai.com/flight-core-v2-datasheets/ # Flight Core Datasheets ![Flight Core v2 board](/images/flight-core-v2/m0087-hero.png) The ModalAI Flight Core v2 is an STM32**H7**-based flight controller for PX4, made in the USA. The Flight Core v2 can be paired with VOXL for obstacle avoidance and GPS-denied navigation, or used independently as a standalone flight controller. --- Source: https://docs.modalai.com/flight-core-datasheet-v2-functional-description/ # Flight Core v2 Functional Description --- ## Overview ModalAI Flight Core v2 is a PX4 flight controller that uses a very similar architecture to FMUv6x. It's design goal is to be software compatible with the FMUv6x architecture in a smaller Pixracer-style form factor, with an H7 processor. ## Changes vs Flight Core v1 - Update to STM32H7 processor (480 MHz vs 216 MHz on v1) - QTY2 ICM-42688p IMUs - Added External SPI port, ADC channels - Added onboard magnetometer (BMM150) - Additional ICP-20100 baro - Better alignment with DroneCode connector standards (refer to the connector page) with no more DF13's (all connectors are JST) - Dedicated power input -- Can now be powered off USB input (see details and limitations below in Power Mux section) - More robust design -- RC input connector is reverse voltage protected (prevents the MCU fusing issue on FCv1 when USB is plugged into Spektrum) -- All components are 0402 or larger improving shock resistance and solderability -- Sense ADC now includes HW filtering to minimize spurius glitches with Avionics Power monitoring in PX4 ## Development Kits | PN | Description | |--- |--- | | MDK-M0087-00 | Flight Core v2 board only | | MDK-M0087-01 | Flight Core v2 plus:
Power Module + Cable (MDK-M0041-1)
PWM Breakout Board + Cable (MDK-M0022-1)
RC input cable, JST-to-USB-Micro cable, 2x 6pin-JST-to-pigtail break cables | ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0087-050922.zip) ### 2D Drawings TODO ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | 6g | | MCU | 480MHz, 32-bit ARM M7 [STM32H753IIK6](https://www.st.com/en/microcontrollers-microprocessors/stm32h753ii.html) | | Memory | 256Kb FRAM | | | 2MB Flash | | | 1MB RAM | | Firmware | [PX4](https://github.com/PX4/PX4-Autopilot/tree/main/boards/modalai/fc-v2) | | IMUs | [ICM-42688-P](https://www.invensense.tdk.com/en-us/products/6-axis/icm-42688-p) (SPI1) | | | [ICM-42688-P](https://www.invensense.tdk.com/en-us/products/6-axis/icm-42688-p) (SPI2) | | | External option via SPI6 | | Magnetometer | [BMM150](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmm150-ds001.pdf) (I2C4) | | Barometers | [BMP388](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp388-ds001.pdf) (I2C4) | | | [ICP-20100](https://www.invensense.tdk.com/en-us/products/smartpressure/icp-20100) (I2C4) | | Secure Element | A71CH (I2C4) | | microSD Card | [PX4 Supported SD Cards](https://docs.px4.io/main/en/dev_log/logging.html#sd-cards) SDHC version 2 up to 32GB | | Inputs | GPS/Mag | | | Spektrum | | | Telemetry | | | CAN bus | | Outputs | 3 LEDs (1xRGB) | | | 8 PWM Channels | | Extra Interfaces | 2 serial ports | | | I2C | | | 4CH ADC | [Top](#table-of-contents) ## Block Diagram ![Flight Core v2](/images/flight-core-v2/m0087-block-diagram.jpg) [Top](#table-of-contents) ## Orientation The following is a 'top down' view of the Flight Core v2 depicting the orientation. ![Flight Core v2 Orientation](/images/flight-core-v2/m0087-orientation-2.png) ## Power Supply and Power Source Mux Details A 5VDC supply is required to power the Flight Core v2. The [VOXL Power Module v3](/power-module-v3-datasheet/) is recommended, which provides battery voltage and amperage monitoring through an I2C interface when connected to `J13` using the `TODO` cable. The Flight Core V2 provides a new very convenient powering option for all users. This design incorporates a "Priority Power Mux" as shown here: ![Flight Core v2](/images/flight-core-v2/m0087-zoom-power-mux.jpg) Here is how that mux works: 1. 5V Power-in can be applied to either J13 (4-position RED "APM" power in connector) or through the USB host port J3 from a PC (typically running QGC) 2. Both power source inputs are validated for 5V present and not over-voltage before being selected as the board power source 3. Output power source is set by priority: * 3a) If the +5V_DCIN is present on J13, this will be selected as the power source no matter what (with or without VBUS present). LED1 will be illuminated GREEN * 3b) If +5V_DCIN is NOT present, and if VBUS on J3 is valid, the 5V source will be provided by the USB VBUS from the host PC. LED1 will be OFF. * 3bi) Since VBUS from most PCs is limited to 500mA, it is not recommended to always operate in this mode. When multiple peripherals are installed, like GNSS/MAG + R/C Receivers, etc. it is easy to over-current your USB source and some stuff may start failing or resetting (hence why the LED is OFF in USB mode to maximize ICC availability) * 3bii) This mode is intended for simple QGC operations like programming, IMU calibration, and limited peripheral connectivity checks without needing to remove your drone's flight battery and power module. This is not intended to be a flight-mode scenario. 4. Power Source switchover: * 4a) The priority mux has "glitchless" switchover but only in one direction, from VBUS to +5V_DCIN. That is, when powering on the bench via USB, if +5V_DCIN is then applied to J13, the power mux will automatically switch the power source over to J13, and the MCU should not reset. * 4b) However, if both VBUS and +5V_DCIN are present, and +5V_DCIN is removed, the power mux will revert to VBUS, but it is most likely the MCU will be reset during this switchover event ## Thermal Considerations The STM32H7 family MCU can get hot while running PX4 code since no sleep or low power modes are employed. ModalAI does not provide a default thermal solution for this. We do this because of the following: - Some customers may not run PX4 - We do not know all customer's size and weight restrictions/constraints where this board will be installed. - We would not rather provide a heatsink that you need to remove potentially damaging the MCU or PCB - If a customer could remove our heatsink without damage, residue on the MCU would likely interfere with your needed thermal pad's/tape efficacy. Therefore, we caution every customer to pay attention to the MCU's thermal output and determine what heatsink/thermal option works best for your aplication. A simple adhesive based passive heatsink or a lightweight low-power fan, much like one we sell, may be the ideal option in most cases. Our 5V output pins on the connectors can easily power such a fan. --- Source: https://docs.modalai.com/flight-core-v2-datasheets-connectors/ # Flight Core v2 Connectors Hover a connector to identify it — click to jump to its pinout. --- ## J1 - TELEM1 / UART7 / VOXL Mavlink Default Port Board Connector: BM06B-GHS-TBT Mating Connector: GHR-06V-S Notes: - Default port for VOXL to talk to PX4 - connected to STM32 UART7 through level shifters (74LVCH2T45), in Nuttx it's `/dev/ttyS6` - Follows DroneCode Telemetry Port signal format | Pin # | Signal Name | |-------|------------------------------------------------------------------------------| | 1 | 5P0V (from power-in source) | | 2 | MSS_UART_4W_FSS_TX, UART TX, 3.3V levels | | 3 | MSS_UART_4W_FSS_RX, UART RX, 3.3V levels | | 4 | MSS_UART_4W_FSS_RTS, UART CTS, 3.3V levels, not used by ModalAI generally... | | 5 | MSS_UART_4W_FSS_CTS, UART RTS, 3.3V levels, not used by ModalAI generally... | | 6 | GND | [Top](#table-of-contents) ## J2 - Programming and Debug Console [Top](#table-of-contents) Connector: BM08B-SRSS-TB(LF)(SN) Mating Connector: SHR-08V-S Notes: - connected to STM32 USART3 - used for PX4 debug console, can be used for STM32 FW update - Follows DroneCode Pixhawk Debug Mini connector format on pins 1-6. Pins 7&8 added are extensions. | Pin # | Signal Name | |-------|------------------| | 1 | VREG_3V3 | | 2 | UART_2W_DEBUG_TX | | 3 | UART_2W_DEBUG_RX | | 4 | SWDIO | | 5 | SWCLK | | 6 | GND | | 7 | !RESET | | 8 | VPP_STM | [Top](#table-of-contents) ## J3 - USB Connector Connector: BM04B-GHS-TBT: BLUE colored connector for easy identification of USB (pending supply chain availability) Mating Connector: GHR-04V-S Notes: - On Flight Core v2, this connector **DOES** allow for system power for QGC v4.3.0+ programming modes without a battery. More explanations and limitations are described [here](/flight-core-v2-usb-to-qgc/). | Pin # | Signal Name | |-------|-------------| | 1 | USB_VBUS_IN | | 2 | USB_D_M | | 3 | USB_D_P | | 4 | GND | [Top](#table-of-contents) ## J5 - TELEM2 / UART5 / ESC Port Default port to talk to ModalAI UART ESCs Board Connector: BM06B-GHS-TBT Mating Connector: GHR-06V-S Notes: - connected to STM32 UART5 (ttyS4) directly - Follows DroneCode Telemetry Port signal format | Pin # | Signal Name | |-------|---------------------------------------------------------------------------------| | 1 | 5P0V (from power-in source) | | 2 | TELEM2_FSS_4W_UART_TX, UART TX, 3.3V levels | | 3 | TELEM2_FSS_4W_UART_RX, UART RX, 3.3V levels | | 4 | TELEM2_FSS_4W_UART_CTS, UART CTS, 3.3V levels, not used by ModalAI generally... | | 5 | TELEM2_FSS_4W_UART_RTS, UART RTS, 3.3V levels, not used by ModalAI generally... | | 6 | GND | [Top](#table-of-contents) ## J7 - 8-Channel PWM Output Connector for PWM or DShot ESCs Connector: BM10B-GHS-TBT Connector: GHR-10V-S Notes: - 5P0V on pin1 is a low power (~100-200ma) reference voltage only, not to provide external power to servoes. | Pin # | Signal Name | |-------|------------------------------------------------------------------------| | 1 | 5P0V (from power-in source) | | 2 | PWM_CH1 | | 3 | PWM_CH2 | | 4 | PWM_CH3 | | 5 | PWM_CH4 | | 6 | PWM_CH5 | | 7 | PWM_CH6 | | 8 | PWM_CH7 | | 9 | PWM_CH8 | | 10 | GND | [Top](#table-of-contents) ## J8 - CAN Bus Connector Connector: BM04B-GHS-TBT Mating Connector: GHR-04V-S Notes: - CAN Transceiver is optimzed for CAN FD at 2, 5, and 8Mbps operation - CAN "Silent" pin (STBY) is controlled by STM32 PD15 pin (default pulled-LOW in hardware) - Follows DroneCode CAN Port signal format | Pin # | Signal Name | |-------|-------------| | 1 | 5P0V (from power-in source) | | 2 | CANH* | | 3 | CANL* | | 4 | GND | *CAN signals are compliant with ISO 11898-2:2016 and SAE J2284-1 to SAE J2284-5 [Top](#table-of-contents) ## J10 - External GPS & Magnetometer Connector Connector: BM06B-GHS-TBT Mating Connector: GHR-06V-S Notes: - UART connected to STM32 USART1 directly, I2C connected to STM32 I2C1 - I2C pullups provided to 3.3V - Follows DroneCode Basic GPS Port signal format | Pin # | Signal Name | |-------|--------------------------------------------------------------------| | 1 | 5P0V (from power-in source) | | 2 | EXT_GPS_UART_2W_TX, 3.3V levels | | 3 | EXT_GPS_UART_2W_RX, 3.3V levels | | 4 | EXT_GPS_I2C_SCL, 3.3V levels | | 5 | EXT_GPS_I2C_SDA, 3.3V levels | | 6 | GND | [Top](#table-of-contents) ## J11 - Micro SD Card Slot MicroSD slot. Information about supported cards is here: https://docs.px4.io/main/en/dev_log/logging.html#sd-cards This socket is a "PUSH-PUSH" format, operates only at 3.3V, and includes PX4 compatible pullups on the SDAT and CMD lines. [Top](#table-of-contents) ## J12 - RC input Connector: BM04B-GHS-TBT: YELLOW colored connector for easy identification of R/C port (pending supply chain availability) Mating Connector: GHR-04V-S Notes: - connected to STM32 USART6 directly - Pin 1 3.3V controlled by STM32 PH2 output. Power pin is reverse power protected so if a voltage is applied to the output connector, it will not damage the STM. | Pin # | Signal Name | |-------|-----------------------------------------------| | 1 | VREG_3V3_SPEKTRUM (reverse voltage protected) | | 2 | USART6_TX | | 3 | SPEKTRUM RX (3.3V), SBus RX (3.3V), USART6_RX | | 4 | GND | ## J13 - Power Input and VOXL PM Monitoring Connector: BM04B-GHS-TBT: RED colored connector for easy identification of Power In (pending supply chain availability) Mating Connector: GHR-04V-S Notes: - connected to STM32 I2C3 through level shifter TCA9517DGKR - ModalAI power module includes 5V pullups on I2C bus, 5V pullups on M0087 not installed by default - Power MUX default input source, even is USBVBUS is present. Refer to functional description page for more info | Pin # | Signal Name | | --- | --- | | 1 | VDCIN_5V Input | | 2 | GND | | 3 | APM_I2C3_SCL_5V | | 4 | APM_I2C3_SDA_5V | ## J14 - External SPI/I2C/ADC Connector: BM12B-GHS-TBT Mating Connector: GHR-12V-S Notes: - connected to STM32 SPI6, I2C2, ADC1_CH6, ADC1_CH9, ADC1_CH16, ADC1_CH18 - **Not** Dronecode SPI Port format compliant | Pin # | Signal Name | | --- | --- | | 1 | VREG_3V3 | | 2 | SPI6_MISO_EXPANSION (3P3V) | | 3 | SPI6_MOSI_EXPANSION (3P3V) | | 4 | SPI6_SCK_EXPANSION (3P3V) | | 5 | SPI6_CS_EXPANSION_N (3P3V) | | 6 | I2C2_SDA (3P3V) | | 7 | I2C2_SCL (3P3V) | | 8 | ADC1_CH6 (w/inline 10K//10K 50% voltage divider) | | 9 | ADC1_CH9 (w/inline 10K//10K 50% voltage divider) | | 10 | ADC1_CH16 (w/inline 10K//10K 50% voltage divider) | | 11 | ADC1_CH18 (w/inline 10K//10K 50% voltage divider) | | 12 | GND | --- Source: https://docs.modalai.com/voxl-dev-kits/ # VOXL Development Kits Documentation for ModalAI's range of dev bundles, pre assembled flight decks, and all-in-one perception systems for drones and robots. --- Source: https://docs.modalai.com/voxl2-development-kits/ # VOXL 2 Dev Bundles --- ### Summary A variety of development bundles are available for testing VOXL 2 and camera modules. --- Source: https://docs.modalai.com/voxl2-standalone-bundles/ # VOXL 2 Standalone Bundles | Part Number | Description | Purchase Link | |--- |--- |--- | | `MDK-M0054-1-00` | VOXL 2 Dev Kit, Board Only | [Buy Here](https://www.modalai.com/collections/voxl-development-kits/products/voxl-2?variant=39914779836467) | | `MDK-M0054-1-01` | VOXL 2 Dev Kit, Power Module and Supply, No Cameras | [Buy Here](https://www.modalai.com/collections/voxl-development-kits/products/voxl-2?variant=39914779869235) | ### MDK-M0054-1-00 This kit contains the VOXL2 board only, and nothing else. Volume users or users looking for a replacement would likely choose this development kit. ### MDK-M0054-1-01 This kit contains the VOXL2 board, along with the VOXL Power Module v3, power supply, and supporting cable. Users looking to start out with development but don't need cameras are likely to choose this development kit. --- Source: https://docs.modalai.com/voxl2-coax-camera-bundles/ # VOXL 2 Coax Camera Bundles --- | Part Number |Description |Purchase Link | |:--- |:--- |:-- | | `MDK-M0173-1-01 (C26 Camera Config)` | Dual Tracking, Hires, PMD TOF | [Buy Here](https://www.modalai.com/products/m0173?variant=48528274424112) | | `MDK-M0173-1-02 (C27 Camera Config)` | Triple Tracking, Hires, PMD TOF | [Buy Here](https://www.modalai.com/products/m0173?variant=48528274456880) | | `MDK-M0173-1-03 (C28 Camera Config)` | Dual Tracking, Dual Hires | [Buy Here](https://www.modalai.com/products/m0173?variant=48528274489648) | [M0173 VOXL 2 Link](/M0173/) ## Kit Pictures and Descriptions ### MDK-M0173-1-01 - (1) Starling 2 Image Sensor Front-end Adapter ([M0173-01](/M0173/)) - (1) IMX412 High Resolution sensor ([M0161-01](/M0161/)) module - (2) AR0144 tracking sensor ([M0166-01](/M0166/)) modules - (1) PMD LIOW2 TOF on ([M0178](/M0178/)) adapter board - (1) Flex cable for TOF (M0177) - (3) 80mm coax cables for image sensors Use Camera Config C26 for this Kit ![MDK-M0173-1-01 C26 Config Kit Config](/images/dev-kits/M0173_C26_Config_updated.png) ### MDK-M0173-1-02 - (1) Starling 2 Image Sensor Front-end Adapter ([M0173-01](/M0173/)) - (1) IMX412 High Resolution sensor ([M0161-01](/M0161/)) module - (3) AR0144 tracking sensor ([M0166-01](/M0166/)) modules - (1) PMD LIOW2 TOF on ([M0178](/M0178/)) adapter board - (1) Flex cable for TOF (M0177) - (4) 80mm coax cables for image sensors Use Camera Config C27 for this Kit ![MDK-M0173-1-02 C27 Config Kit Config](/images/dev-kits/M0173_C27_Config_updated.png) ### MDK-M0173-1-03 - (1) Starling 2 Image Sensor Front-end Adapter ([M0173-01](/M0173/)) - (2) IMX412 High Resolution sensor ([M0161-01](/M0161/)) modules - (2) AR0144 tracking sensor ([M0166-01](/M0166/)) modules - (4) 80mm coax cables for image sensors Use Camera Config C28 for this Kit ![MDK-M0173-1-03 C28 Config Kit Config](/images/dev-kits/M0173_C28_Config_updated.png) ## Hardware Setup Please exercise ESD safety precautions and have electronics knowledge when interfacing with the hardware. We recommend always using grounding wrist straps and ESD mats. ![m0054-esd-warning](/images/voxl-developer-bootcamp/m0054-esd-warning.png) Users should note that the connectors for coaxial cables are less rugged than flex cable connectors, and are only rated for 20 insertions. We recommend only disconnecting and reconnecting coaxial cables when absolutely necessary, and only with the appropriate tool ([Hirose DF-SD3/RE-MD](https://www.mouser.com/ProductDetail/Hirose-Connector/DF-SD3-RE-MD?qs=cbprxTG2Yq8BLNmyfKF1vw%3D%3D)). For more information on proper handling of ModalAI coaxial cables, please refer to the [Micro-Coaxial User Guide](/micro-coax-user-guide/). ### Assemble Heat Sink and TOF/Adapter The TOF adapter module will rapidly overheat when used without a heatsink attached, causing errors. Users who wish to evaluate the TOF without having custom solutions available may use the heatsink and thermal pads provided by ModalAI in their kit. These are found in a small bag under the foam at the bottom of the box. **1** Carefully disconnect the TOF module from the flex cable connecting it to the M0173 board. **2** Apply a thermal pad to both front of heat sink centered between the two heat sink holes. ![TOF Heatsink Step 1](/images/dev-kits/TOF_heatsink_step1.png) **3** Stick the TOF module to the thermal pad on front of heat sink, being CAREFUL to line up the TOF module such that the plastic housing is centered between the two heat sink holes. The flex cable connecting the two sides of the module should also be centered in the slot on the side of the heat sink. ![TOF Heatsink Step 2](/images/dev-kits/TOF_heatsink_step2.png) **4** Apply a thermal pad to back of heat sink centered between the two heat sink holes. ![TOF Heatsink Step 3](/images/dev-kits/TOF_heatsink_step3.png) **5** Wrap the TOF adapter and flex cable around and stick the PCB to the back of the heatsink. The Mounting hole in the PCB should be centered in the top heatsink mounting hole. The bottom the the PCB should be centered left/right relative to the mounting hole. ![TOF Heatsink Step 4](/images/dev-kits/TOF_heatsink_step4.png) **6** Carefully reconnect the TOF module to the flex cable connecting it to the M0173 board, being careful to check connector orientation. ![TOF Heatsink Step 5](/images/dev-kits/TOF_heatsink_step5.png) ## Software Setup To configure your VOXL 2 SDK to run these camera combinations, we need to ADB or SSH into your VOXL 2 and configure its SKU number to include the correct `C` number. ```Bash voxl2:/$ voxl-configure-sku ```` Then you are going to configure the SKU for a VOXL 2 'board only' setup so that MPA does not think any other hardware is attached such as ESCs or other sensors that are included in the drone dev kits. ``` ------------------------------------------------------------------ Welcome to the voxl-configure-sku Wizard! VOXL is not yet configured for a particular SKU. Please select the new desired product family: 1) accept and continue 12) voxlcam 2) starling-2 13) seeker 3) starling-2-max 14) rb5-flight 4) starling 15) flight-deck 5) px4-autonomy-dev-kit 16) voxl-deck 6) sentinel 17) voxl2-flight-deck 7) fpv 18) voxl2-test-fixture 8) D0010 19) voxl2-mini-test-fixture 9) stinger 20) voxl2-board-only 10) D0015 21) voxl2-mini-board-only 11) m500 22) quit #? 20 ``` Select the correct 'C' number for your kit. ``` If you would like to select a special camera config that differs from the default for your product family, please select an option. Simply hit ENTER to use the default 26 - M0173 with Tof imx412 and dual AR0144 27 - M0173 with Tof imx412 and triple AR0144 28 - M0173 with Dual IMX412 and Dual AR0144 29 - M0173 with TOF Dual IMX412 and Dual AR0144 30 - M0173 with dual TOF Dual IMX412 and Dual AR0144 C - use user-defined custom camera config in (/data/modalai/custom_camera_config.txt) q - Quit The Wizard Simply hit ENTER to use the default selection: 28 ``` Then run voxl-configure-mpa and reboot. This will load the appropritate camera driver binaries and configure voxl-camera-server to start the sensors on boot. ``` voxl2:/$ voxl-configure-mpa ``` After a reboot, all camera sensors should slow up when running voxl-inspect-cam -a ``` voxl2:/$ voxl-inspect-cam -a ``` ``` | Pipe Name | bytes | wide | hgt |exp(ms)| gain | frame id |latency(ms)| fps | mbps | format | hires_down_large_color |18495360 | 4056 | 3040 | 33.23 | 806 | 54 | 339.0 | 29.4 | 4346.9 | NV12 | hires_down_large_encoded | 379 | 4056 | 3040 | 33.23 | 806 | 55 | 350.9 | 28.9 | 0.5 | H265 (P) | hires_down_large_grey |12330240 | 4056 | 3040 | 33.23 | 806 | 56 | 310.7 | 29.4 | 2900.1 | RAW8 | hires_down_small_color | 1179648 | 1024 | 768 | 33.23 | 806 | 57 | 298.9 | 30.0 | 282.7 | NV12 | hires_down_small_encoded | 72 | 1024 | 768 | 33.23 | 806 | 57 | 292.0 | 29.4 | 0.1 | H265 (P) | hires_down_small_grey | 786432 | 1024 | 768 | 33.23 | 806 | 57 | 295.7 | 30.0 | 188.5 | RAW8 | hires_down_snapshot | | hires_front_large_color |18495360 | 4056 | 3040 | 18.06 | 788 | 58 | 322.0 | 29.2 | 4326.4 | NV12 | hires_front_large_encoded | 472 | 4056 | 3040 | 18.06 | 788 | 59 | 340.9 | 28.8 | 0.9 | H265 (P) | hires_front_large_grey |12330240 | 4056 | 3040 | 18.06 | 788 | 60 | 298.1 | 29.3 | 2886.9 | RAW8 | hires_front_small_color | 1179648 | 1024 | 768 | 18.06 | 788 | 60 | 280.9 | 30.3 | 285.9 | NV12 | hires_front_small_encoded | 99 | 1024 | 768 | 18.06 | 788 | 60 | 279.8 | 29.8 | 0.5 | H265 (P) | hires_front_small_grey | 786432 | 1024 | 768 | 18.06 | 788 | 61 | 278.7 | 30.3 | 190.6 | RAW8 | hires_front_snapshot | | qvio_overlay | 1146880 | 1280 | 896 | 5.45 | 266 | 137368 | 26.8 | 30.0 | 275.3 | RAW8 | tracking_down | 1024000 | 1280 | 800 | 5.75 | 363 | 137347 | 23.1 | 30.0 | 245.8 | RAW8 | tracking_front | 1024000 | 1280 | 800 | 5.45 | 266 | 137368 | 24.7 | 30.0 | 245.8 | RAW8 ``` --- Source: https://docs.modalai.com/flight-deck/ # VOXL Flight Deck A fully assembled and calibrated flight kit. Pre-configured for GPS-denied navigation using Visual Inertial Odometry (VIO). ![voxl-flight-deck](/images/voxl-flight-deck/flight-deck.jpg) | Part Number | Description | |--- |--- | | `MDK-F0006-1-01` | VOXL 2 Flight Deck with Microhard Modem Carrier Board and USB Hub | | `MDK-F0006-1-02` | VOXL 2 Flight Deck with Microhard Modem Carrier Board and USB Hub | | `MDK-F0006-1-03` | VOXL 2 Flight Deck with Microhard Modem Carrier Board and USB Hub | --- Source: https://docs.modalai.com/flight-deck-datasheet/ # VOXL Flight Deck Datasheet --- ## Overview The VOXL Flight Deck Platform is a fully assembled and calibrated flight kit, ready to mount to a vehicle and attach a battery! It consists of the following core components: - [VOXL Flight](/voxl-flight-datasheet/) computing platform mounted in VOXL-TRAY with: - [Stereo Sensors](/M0015/) - [Tracking Sensor](/M0014/) - [Hires Sensor](/M0025/) - Wi-Fi Antennas, Cooling Fan, [RC inpout cable](/cable-datasheets/#mcbl-00005) - [VOXL Power Module Kit v2](/power-module-v2-datasheet/) - PWM Breakout Kit (M0022 board and [MCBL-00004 cable](/cable-datasheets/#mcbl-00004)) To see an example of the VOXL Fight Deck in use, check out the [VOXL-m500](/m500/)! ## High-Level Specs | Specicifcation | VOXL-FLIGHT-DECK-R2-1 | | --- | --- | | Take-off Weight | TBD | | Computing | [VOXL Flight](/voxl-flight-datasheet/) | | Flight Control | PX4 on [VOXL Flight](/voxl-flight-datasheet/) | | Image Sensors | [Stereo](/M0015/), [Tracking](/M0014/), [4k High-resolution](/M0025/) | | Communication | WiFi built-in, [LTE](/lte-modem-and-usb-add-on-datasheet/) or [Microhard](/microhard-add-on-datasheet/) optional | | Power Module | [Power Module v2](/power-module-v2-datasheet/) | | Battery | Up to 5S (not included, [recommended](https://www.thunderpowerrc.com/products/tp3400-4spx25)) | ## 2D/3D Drawings * [VOXL_FLIGHT_DECK_R1-NO_PCB.STEP](https://storage.googleapis.com/modalai_public/modal_drawings/VOXL_FLIGHT_DECK_R1-NO_PCB.STEP) * [Barometer Cap 3D STL](https://storage.googleapis.com/modalai_public/modal_drawings/voxl-flight-deck-baro-cap-v5.STL) ![voxl-flight-deck-cad](/images/voxl-flight-deck/voxl-flight-deck/flight-deck-cad.png) ## Primary Flight Deck Connections Below describes the primary connections needed to get the Flight Deck configured on a vehicle and flying. ![voxl-flight-deck-connectors](/images/voxl-flight-deck/voxl-flight-deck/voxl-flight-deck-connectors.png) | | Name | Description | |--- |--- |--- | | A | GPS Input | Dronecode Compliant GPS connection, 9optional when using [ModalAI's PX4 branch)(/flight-core-firmware/), GPS not included | | B | USB to QGroundControl | Connect VOXL Flight to QGroundControl for configuring PX4 using included cable | | C | RC Input | Connect to RC receiver using included cable, RC receiver not included | | D | USB to VOXL (under) | Connect to companion computer using adb over USB using Micro USB cable, cable not included | | E | PX4 MicroSD Card Slot (under) | For PX4 logging, [information on supported cards](https://docs.px4.io/main/en/dev_log/logging.html#sd-cards), SD card not included | | F | Power Input | Connects included [VOXL Power Module v3](/power-module-v3-datasheet/) using included cable | | G | PWM Output | Connects included PWM Breakout Board using included cable | ## VOXL Flight Connections The VOXL Flight Deck consists of a VOXL Flight, with [the detailed pinouts described here](/voxl-flight-datasheet-connectors/) --- Source: https://docs.modalai.com/flight-deck-userguide/ # VOXL Flight Deck User Guide This guide walks you through the main connections of the VOXL Flight Deck in effort to assist you getting it setup for a vehicle. For technical details, see the [datasheet](/flight-deck-datasheet/). --- ## Primary Flight Deck Connections Below describes the primary connections needed to get the Flight Deck configured on a vehicle and flying. [Datasheet here](/flight-deck-datasheet/) ![voxl-flight-deck-connectors](/images/voxl-flight-deck/voxl-flight-deck/voxl-flight-deck-connectors.png) ## Setup ### A. GPS A standard Dronecode Compliant GPS/Mag connector is available. The following have been validated, but in general if PX4 supports it, it should work. See the [pinout here](/voxl-flight-datasheet-connectors/#j1012---external-gps--mag-usart1-i2c1-connector). - mRo GPS u-Blox Neo-M8N Dual Compass LIS3MDL+ IST8310 - [Pixhawk4 2nd GPS Module](https://holybro.com/products/m8n-gps) *Note: PX4 requires a magnetometer to initialize. If you want to fly without a mag and instead use VIO, check out [Flightcore Firmware](/flight-core-firmware/) for a modified version that allows initialization* ![voxl-flight-deck-gps-input](/images/voxl-flight-deck/voxl-flight-deck-gps-input.png) ### B. USB to QGroundControl The VOXL Flight Deck system provides the ability to connect to QGroundControl (or other MAVLink based Ground Control Stations) over UDP, which allows you to connect wirelessly over LTE, Microhard, Wi-Fi, etc. Out of the box, the system is configured for this using [voxl-vision-hub](/voxl-vision-hub/) Sometimes, you need to connect using USB. You can connect to the **BLUE** connector using [MCBL-00010](/cable-datasheets/#mcbl-00010), a USB cable, and a host computer running QGC. ![voxl-flight-deck-usb-qgc](/images/voxl-flight-deck/voxl-flight-deck-usb-qgc.png) ### C. RC Input We generally use the Spektrum DX6e or DX8 radio transmitter (e.g. SPM8000/SPMR8000) using [MCBL-00005](/cable-datasheets/#mcbl-00005), but the system can support FrSky as well (cable coming soon). Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work. See the [pinout here](/voxl-flight-datasheet-connectors/#j1004---rc-input--spektrumsbususart6-connector). ![voxl-flight-deck-rc-input](/images/voxl-flight-deck/voxl-flight-deck-rc-input.png) ### D. USB to VOXL (adb) To access VOXL's shell over adb, you'll want to use this USB port and a typical micro-B USB cable. **Note:** the cable will only consume the micro-B portion of the connector (not the whole USB 3.0 port) ![voxl-flight-deck-usb-adb](/images/voxl-flight-deck/voxl-flight-deck-usb-adb.png) ### E. PX4 MicroSD Card Slot In order to log and fly missions, you'll need a [MicroSD card](https://docs.px4.io/main/en/dev_log/logging.html#sd-cards). > there's also a MicroSD card slot for VOXL. This can be used to give more 'disk space', but is not required. ![voxl-flight-deck-px4-sd](/images/voxl-flight-deck/voxl-flight-deck-px4-sd.png) ### F. Power Input The VOXL Flight Deck kit comes with a VOXL Power Module, which accepts a battery input and outputs a regulated 5VDC/6A, along with an I2C signal for power monitoring via PX4. ![voxl-flight-deck-power-input](/images/voxl-flight-deck/voxl-flight-deck-power-input.png) ### G. PWM/DShot Output The VOXL Flight/Flight Core supports PWM or DShot output. See [PWM ESC Calibration](/flight-core-pwm-esc-calibration/) for more information on calibration. ![voxl-flight-deck-pwm-output](/images/voxl-flight-deck/voxl-flight-deck-pwm-output.png) ## Image Sensors The VOXL Flight Deck comes with pre-calibrated stereo and tracking sensors and a Hi-res FPV image sensor. These are mounted and read to use. Here's some helpful links: - [voxl-vision-hub](/voxl-vision-hub/) - a wonderful service, see the link for details ;) - [RTSP Streaming](/voxl-rtsp) - simple way to stream to QQC and also validate the image sensors ![voxl-flight-deck-image-sensors](/images/voxl-flight-deck/voxl-flight-deck-image-sensors.png) --- Source: https://docs.modalai.com/voxl2-flight-deck/ # VOXL 2 Flight Deck ModalAI's most advanced fully assembled and calibrated flight kit to date. Powered by VOXL 2, it combines the smallest single-board autopilot with 8 core processing from the Qualcomm QRB5165, as well a PX4 flight controller, advanced onboard AI and 5G connectivity. It comes pre-configured with Tracking, Stereo and Hi-Res optical sensors for GPS-Denied Navigation and Obstacle Avoidance. ![voxl2-flight-deck](/images/voxl2-flight-deck/voxl2-deck-hero.png) --- Source: https://docs.modalai.com/voxl2-flight-deck-datasheet/ # VOXL 2 Flight Deck Datasheet --- ## VOXL 2 Flight Deck Configurations | Part Number | Description | |--- |--- | | MDK-F0006-1-01 | VOXL 2 Flight Deck with Microhard Modem Carrier Board and USB Hub | | MDK-F0006-1-02 | VOXL 2 Flight Deck with 5G LTE Modem and USB Hub | | MDK-F0006-1-03 | VOXL 2 Flight Deck with 2.4/5ghz WiFi Modem | ## High-Level Specs | Specicifcation | VOXL-2-FLIGHT-DECK | | --- | --- | | Take-off Weight | Microhard: 144.4g
5G LTE: 165.3g
WiFi: 148.2g | | Computing | [VOXL 2 Flight](/voxl-2/) | | Flight Control | PX4 on DSP | | Image Sensors | [Stereo](/M0015/), [Tracking](/M0014/), [4k High-resolution](/M0025/) | | Wireless Communication | Add-ons: Microhard, WiFi, or 5G LTE | | Power Module | [Power Module v3](/power-module-v3-datasheet/) | | Battery | Up to 6S (sold separately), EOL | ## Mechanical Drawings The VOXL 2 Flight Deck 3D model can be found as a component of the Sentinel Drone [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/Sentinel_Drone_STEP.zip) model. --- Source: https://docs.modalai.com/voxl2-flight-deck-userguide/ # VOXL 2 Flight Deck User Guide This guide walks you through the main connections of the VOXL 2 Flight Deck in effort to assist you getting it setup for a vehicle. For technical details, see the [datasheet](/voxl2-flight-deck-datasheet/). ![voxl2-flight-deck](/images/voxl2-flight-deck/voxl2-deck-hero.png) --- Source: https://docs.modalai.com/voxl2-flight-deck-userguide-unboxing/ # VOXL 2 Flight Deck Unboxing ![sentinel-flight-deck](/images/voxl2-flight-deck/sentinel-flight-deck.png) --- ## Required Materials To follow this user guide, you'll need the following: - Spektrum Transmitter - e.g. SPMR6655, SPM8000 or SPMR8000 - Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work - Buy Here - Wall Power Supply or Battery with XT60 connector - e.g. Gens Ace 3300mAh, or any 4S battery with XT60 connector - Buy Battery Here - Buy Wall Power Supply [Here](https://www.modalai.com/products/ps-xt60?_pos=1&_sid=f5b241f03&_ss=r) - Host computer with: - QGroundControl 3.5.6+ - Ubuntu 22.04 or newer - Wi-Fi
## Whats in the Box ### 5G LTE Modem ![voxl2-5g](/images/voxl2-flight-deck/flight-deck-5g-lte.jpg) ### 2.4/5ghz WiFi ![voxl2-wifi](/images/voxl2-flight-deck/flight-deck-wifi.jpg) ### Microhard (Microhard Modem is sold Separately) ![voxl2-microhard](/images/voxl2-flight-deck/flight-deck-microhard.jpg) [Next: Connections](/voxl2-flight-deck-userguide-connections/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl2-flight-deck-userguide-software/ # VOXL 2 Flight Deck Software --- ## VOXL 2 Flight Deck Software Overview ### ADB To Set up ADB, see [Here](/setting-up-adb/) Once adb is installed, a USB cable is plugged in, and your Flight Deck is powered on, open your terminal and run the following: ```bash adb shell ``` You are now running a shell inside the VOXL 2's Ubuntu OS!
### Software VOXL 2 Flight Deck runs VOXL SDK. For more information on configurations, calibrations, etc, see [Here](/voxl-sdk) For information about using obstacle avoidance or VIO, see [Here](/voa/) and [Here](/flying-with-vio/)
### Connectivity **5G LTE:** To install a SIM card and to connect your VOXL 2 Flight Deck to the internet, see [Here](/voxl2-linux-user-guide/) for an overview and [Here](/sentinel-user-guide-connect-network/) for info on setting up a VPN service **2.4/5ghz WiFi:** To set up WiFi on your VOXL 2 Flight Deck, see [Here](/voxl2-linux-user-guide/) for an overview and [Here](/wifi-setup/) for instructions **Microhard:** To set up a Microhard wireless connection, see [Here](/microhard-modems) for information and instructions
### Spektrum and RC settings For Spektrum Binding and RC Instructions, see [Here](/sentinel-user-guide-pre-flight-setup/#rc-radio-setup)
--- Source: https://docs.modalai.com/voxl2-flight-deck-userguide-connections/ # VOXL 2 Flight Deck Hardware Overview This guide walks you through the main connections of the VOXL 2 Flight Deck in effort to assist you getting it setup for a vehicle. For technical details, see the [datasheet](/voxl2-flight-deck-datasheet/). --- ## Hardware Overview ### Image Sensors [View in fullsize](/images/voxl2-flight-deck/voxl2-deck-labeled3.jpg){:target="_blank"} ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/voxl2-deck-labeled3.jpg) | Camera IDs | Description | |--- |--- | | 0-1 | ov7251, synchronized stereo pair, 640x480 85.6º diagonal, 30 FPS | | 2 | ov7251, 640x480 166º diagonal, 30 FPS | | 3 | imx214, 4k, 30 FPS | | 4-5 | ov7251, synchronized stereo pair, 640x480 85.6º diagonal, 30 FPS | ### Connectors [View in fullsize](/images/voxl2-flight-deck/voxl2-deck-labeled1.jpg){:target="_blank"} ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/voxl2-deck-labeled1.jpg) [View in fullsize](/images/voxl2-flight-deck/voxl2-deck-labeled2.jpg){:target="_blank"} ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/voxl2-deck-labeled2.jpg) | Connector | Description | MPN (Board Side) | Mating MPN (Board/Cable Side) | Type | Signal Feature Summary | |-----------|---------------------|--------------------------|-------------------------------|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | J3 | Legacy B2B | QSH-030-01-L-D-K-TR | QTH-030-01-L-D-A-K-TR | B2B Receptacle, 60-pin | 5V/3.8V/3.3V/1.8V power for plug-in boards, JTAG and Debug Signals, QUP expansion, GPIOs, USB3.1 Gen 2 (USB1) | | J4 | Prime Power In | 22057045 | 0050375043 | Cable Connector, 4-pin R/A | +5V main DC power in + GND, I2C@5V for power monitors | | J5 | High Speed B2B | ADF6-30-03.5-L-4-2-A-TR | ADM6-30-01.5-L-4-2-A-TR | B2B Socket, 120-pin | More 3.8V/3.3V/1.8V power for plug-in boards, 5V power in for “SOM Mode”, QUP expansion, GPIOS (including I2S), SDCC (SD Card V3.0), UFS1 (secondary UFS Flash), 2L PCIe Gen 3, AMUX and SPMI PMIC signals | | J9 | USB-C (ADB) | UJ31-CH-3-SMT-TR | USB Type-C | Cable Receptacle, 24-pin R/A | ADB USB-C with re-driver and display port alternate mode (USB0) | | J10 | SPI Expansion | SM08B-GHS-TB(LF)(SN) | GHR-08V-S | Cable Header, 8-pin R/A | SPI@3.3V with 2 CS_N pins, 32kHz CLK_OUT@3.3V | | J12 | Fan | SM02B-SRSS-TB(LF)(SN) | SHR-02V-S | Cable Header, 2-pin R/A | 5V DC for FAN + PWM Controlled FAN-Return (GND) | | J18 | ESC | SM04B-GHS-TB(LF)(SN) | GHR-04V-S | Cable Header, 4-pin R/A | ESC UART@3.3V, 3.3V reference voltage | | J19 | GNSS/MAG/RC/I2C | SM12B-GHS-TB(LF)(SN) | GHR-12V-S | Cable Header, 6-pin R/A | GNSS UART@3.3V, Magnetometer I2C@3.3V, 5V, RC UART, Spare I2C | ## Buttons ### SW1 - Force Fastboot Button Force Fastboot momentary button. To force device into fastboot mode: - power off device, remove USB cable to completely power down - press and hold SW1 button down - power on device, attach USB cable - release SW1 button - from host computer, run `fastboot devices` and verify the device shows up. If not, restart this procedure To reboot device to fastboot: - device is powered on - press and hold SW1 for 30 seconds until the device reboots into fastboot mode
### SW2 - EDL Switch Emergency Download switch, used for factory flashing. Should be left `OFF`. See [user guide for QDL](/Qualcomm-Flight-RB5-QDL/) if interested in more information.
### VOXL 2 Overview VOXL 2 Flight Deck is powered by VOXL2. For more information, see [Here](/voxl-2/) [View in fullsize](/images/voxl2/m0054-exploded-v1.3-rev0.jpg){:target="_blank"} ![m0054-exploded](/images/voxl2/m0054-exploded-v1.3-rev0.jpg)
[Next: Setup](/voxl2-flight-deck-userguide-setup){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl2-flight-deck-userguide-setup/ # VOXL 2 Flight Deck Setup ### Setup Instructions **GPS/Spektrum** Connect your GPS/Mag and your Spektrum receiver to **J19 and J10** The following have been validated, but in general if PX4 supports it, it should work. - mRo GPS u-Blox Neo-M8N Dual Compass LIS3MDL+ IST8310 - Pixhawk4 2nd GPS Module ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/flight-deck-gps.jpg)
Then Connect MCBL-00005 (JST 3 pin) to your Spektrum Receiver (Sold Separately, EOL) ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/flight-deck-spektrum.png)
**USB** Conect a USB type C cable to VOXL 2's **J9** port. ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/flight-deck-usb.jpg)
**ESC's** Conect your ESC to **J18**. Currently, VOXL 2 only supports UART. If you don't already have an ESC, we recommend using ours: [Buy Here](https://www.modalai.com/collections/electronic-speed-controls) An additional board will soon be available to support PWM output. For now, only UART is available. ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/flight-deck-esc.jpg)
**Power** Connect MCBL-00001 (Molex 4 pin) to **J4** VOXL 2 Flight Deck comes with a VOXL Power Module. The module requires either a 4S battery with XT60 Connector (6S with expanded battery standoffs), or you can use Wall Power Supply for benchtop development. - Buy Battery Here - Buy Wall Power Supply [Here](https://www.modalai.com/products/ps-xt60?_pos=1&_sid=f5b241f03&_ss=r) ![voxl2-flight-deck-connections.png](/images/voxl2-flight-deck/flight-deck-power.jpg)
[Next: Software](/voxl2-flight-deck-userguide-software){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-cam/ # VOXL-CAM VOXL CAM is a state-of-the art, fully integrated robot perception system ![voxl-cam-r1-c1-index.png](/images/voxl-cam/voxlcam.jpg) 1. [VOXL-CAM Quickstart](/voxl-cam-quickstart/) 2. [VOXL-CAM User Guide](/voxl-cam-user-guide/) 3. [VOXL-CAM Datasheet](/voxl-cam-datasheet/) ## VOXL CAM V1 Versions and Options | Options | Description | Status | SKU Configuration | |--- |-- |--- | --- | | VOXL CAM Core Dev Kit | [VOXL](/voxl-datasheets/), Hi-res, Tracking | Available | C3 | | VOXL CAM Core Dev Kit + TOF | [VOXL](/voxl-datasheets/), ToF, Hires Tracking | Available | C7 | | VOXL CAM Core Dev Kit + Flight Core | [Flight Core](/flight-core-datasheet/), Hi-res, Tracking | Available | C3-FC1-D1 | | VOXL CAM Core Dev Kit + TOF + Flight Core | [Flight Core](/flight-core-datasheet/), ToF, Tracking | Available | C7-FC1-D1 | | VOXL CAM Core Dev Kit + Flight Core + 4G Modem (NA) | [Flight Core](/flight-core-datasheet/), Hi-res, Tracking [LTE v2, WP7611](/lte-modem-and-usb-add-on-v2-datasheet/) | Available | C3-FC1-M8 | | VOXL CAM Core Dev Kit + TOF + Flight Core + 4G Modem (NA) | [Flight Core](/flight-core-datasheet/), ToF, Tracking [LTE v2, WP7611](/lte-modem-and-usb-add-on-v2-datasheet/) | Available | C7-FC1-M8 | |--- |-- |--- |--- | |VOXL CAM Core Dev Kit + Flight Core + 4G Modem (EU) | [Flight Core](/flight-core-datasheet/), Hi-res, Tracking [LTE v2, WP7607](/lte-modem-and-usb-add-on-v2-datasheet/) | Available | C3-FC1-M5 | | VOXL CAM Core Dev Kit + TOF + Flight Core + 4G Modem (EU) |[Flight Core](/flight-core-datasheet/), Hi-res, Tracking [LTE v2, WP7607](/lte-modem-and-usb-add-on-v2-datasheet/) | Available | C7-FC1-M5 | --- Source: https://docs.modalai.com/voxl-cam-quickstart/ # VOXL CAM Quickstart VOXL CAM is a VOXL companion computer, a set of cameras, and optionally a Flight Core and a modem, assembled in one enclosure. Each part is set up the way it is on the standalone products, so the quickstart is a short sequence of existing guides. 1. **Set up the VOXL side.** Follow [VOXL CAM Setup](/voxl-cam-user-guide-core/) for power, ADB, and Wi-Fi, then the [VOXL Quickstart](/voxl-quickstarts/) for the first tools to run. 2. **Set up the Flight Core**, if your unit has one. Follow [VOXL CAM Flight Core Setup](/voxl-cam-user-guide-flight/), then the [Flight Core Quickstarts](/flight-core-getting-started/) for firmware and radio setup. 3. **Set up the modem**, if your unit has one. Follow [VOXL CAM Modem Setup](/voxl-cam-user-guide-modem/). 4. **Check the cameras.** Open [VOXL Portal](/voxl-portal/) from a device on the same network and confirm each camera streams. The [VOXL CAM Datasheet](/voxl-cam-datasheet/) lists the configurations, connectors, and dimensions. --- Source: https://docs.modalai.com/voxl-cam-user-guide/ # VOXL-CAM v1 User Guide [![VOXL CAM, front view; opens the setup guide](/images/voxl-cam/voxl-cam-front.png)](/voxl-cam-user-guide-core/) ![VOXL CAM, back view](/images/voxl-cam/voxl-cam-back.png) ### If you have VOXL CAM with Flight Core or Modem, start by following the VOXL CAM Setup --- [VOXL CAM Setup](/voxl-cam-user-guide-core/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-cam-user-guide-flight/ # **VOXL-CAM v1 Flight Core Setup** ![Voxl-cam-flightcore](/images/voxl-cam/voxl-cam-flightcore.png)

This guide is for VOXL-CAM with Flight Core
(SKU C3-FC1-D1, C7-FC1-D1, C3-FC1-M8, C7-FC1-M8, C3-FC1-M5, C7-FC1-M5)

--- VOXL-CAM contains a Flight Core. Check out the flight core docs [Here](/flight-core-getting-started/) for more details. ---
Table of Contents {: .text-echo } 1. [Datasheet, v1](/voxl-cam-v1-datasheet/) 2. Second Step
## Connectors See [Here](/flight-core-datasheet-connectors/) and [Here](/flight-core-connections/) ## Integrating with ESC's See [here](/flight-core-pwm-esc-calibration/) and [here](/modal-esc-v2-manual/) ## RC Setup See [Here](/flight-core-radios/) ## Preflight Checks See [Here](/voxl-m500-user-guide-first-flight/#preflight-checks) ## First Flights See [Here](/fc-first-flight/) [Next Step: Modem](/voxl-cam-user-guide-modem/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-cam-user-guide-core/ # VOXL-CAM Setup ![voxl-cam-corekit](/images/voxl-cam/voxl-cam-corekit.png)

If you have VOXL CAM with Flight Contoller or Modem, start by following this guide

---
Table of Contents {: .text-echo } 1. [Datasheet, v1](/voxl-cam-v1-datasheet/) 2. Second Step
--- # VOXL CAM Core ### Kit Includes - VOXL-CAM - [VOXL Power Module v3](/power-module-v3-datasheet/) - [PS-XT60 Wall Power Supply](https://www.modalai.com/collections/accessories/products/ps-xt60) - Caddy with Fan for Desktop Development - USB Cable - Right Angle Micro B ## Out of Box Setup ### Connect Micro USB to VOXL CAM If you intend to use `adb` later, connect right angled USB cable into the VOXL-CAM as shown shown below and connect the other end of the cable to your host computer. Otherwise continue on. ![VOXL-CAM-Power](/images/voxl-cam/usb-gif.gif) --- ### Plug in Power Module Attach the VOXL Power Module to the power cable as shown below. ![VOXL-CAM-Powered](/images/voxl-cam/power-gif.gif) --- > Keep a fan on the back aluminum plate when the device is powered on in a static state to avoid the unit from overheating. ### Place in Caddy for Desktop Development When doing desktop development, place in the Caddy: ![VOXL-CAM-In-Caddy](/images/voxl-cam/caddy-gif.gif) Once VOXL-CAM is in the caddy, plug the VOXL Power Module to a wall outlet using included power supply with XT60 connector. Make sure the fan turns on properly. --- ## Connect to VOXL-CAM ## Connect to VOXL-CAM using WiFi ### Connect to VOXL-CAM Access Point From the factory, VOXL-CAM will power up as a WiFi Access Point with a name like `VOXL:XX:XX:XX:XX:XX`). You can connect to it with a password of `1234567890`. ![voxl-ap-list.png](/images/m500/voxl-ap-list.png) ![voxl-ap-password.png](/images/m500/voxl-ap-password.png) Once connected to the VOXL AP, you'll get an IP address from VOXL via DHCP, locate the address, in my case it's `192.168.8.51`. ![voxl-ap-ip-address.png](/images/m500/voxl-ap-ip-address.png) *Note: you can connect VOXL-CAM to your wireless network using the `voxl-wifi station ` command to have allow your host computer to have internet while also connected to VOXL-CAM. You will need to locate the IP address, which is easily done with `adb` and the USB connection.* More details can be found at the [VOXL WiFi quickstart page](/wifi-setup/).
### SSH into VOXL The VOXL's IP address by default is `192.168.8.1`. SSH into VOXL using the `root` user with password `oelinux123`. More details available at the VOXL SSH quickstart page. ![voxl-ssh.png](/images/m500/voxl-ssh.png) --- ## Connect to VOXL-CAM with ADB Alternatively, you can use a usb cable to ADB directly in. ### Setup ADB See [here](/setting-up-adb/) ### Connect to VOXL-CAM with ADB After installing adb, plug a USB cable into Seeker. ![voxlcam-usb-gif](/images/voxl-cam/usb-gif.gif) Then, run the following: ```bash adb shell ``` Now you are running a shell inside Seeker's Ubuntu OS! --- ## SD Cards VOXL-CAM has two SD card slots. One slot is for VOXL and the other is for the Flight Core (If you have it). To add or remove storage, slide the SD card in. To remove it, push on it, and it will pop out. ![VOXL-CAM-SD-CARD](/images/voxl-cam/sdcard-gif.gif) --- ## Viewing Image Sensor Data In order to best visualize the point cloud, we recommend [voxl-portal](/voxl-portal/). The camera viewing guide can be found [here](/voxl-portal/) ## View Visual Inertial Odometry Data The Visual Intertial Odometry (VIO) feature uses the tracking image sensor with fisheye lens and an onboard IMU to provide localization data. At a high level, this provides you a realtime "X, Y, Z" in space. The visual voxl-qvio-server debugging tool, ov-overlay, is available on [voxl-portal cameras](/voxl-portal/) page. To see the output of the voxl-qvio-server on the command line, simply run the following command: ```bash voxl-inspect-vins ``` The output displayed updates as you move the VOXL-CAM around in space: ![VOXL-CAM-QVIO](/images/voxl-cam/voxl-cam-qvio-output.png) You can move VOXL-CAM around and see the data update. Hit `CTRL+c` to stop the program ## Viewing Point Cloud (and Stereo Tracking Images) In order to best visualize the point cloud, we recommend [voxl-portal](/voxl-portal/). ### Viewing Point Cloud using RViz and ROS #### Software Requirements - Ubuntu 18.04 or newer - [Setup ROS on PC]() - [Setup ROS on VOXL](/) (already done on shipped VOXL-CAMs) - RViz (`apt-get install rviz`) #### Configuration Please ensure you've setup ROS on PC The unit's software is shipped already configured and ready to use. *Note: If needed, you can follow the [Software Setup](#software-setup-only-needed-if-you-mess-with-things) section below to fully reconfigure the VOXL-CAM.* #### SSH into VOXL-CAM If not already done, SSH into VOXL-CAM and change the shell to bash: ```bash ssh root@192.168.8.1 ~# bash yocto:~# ``` Setup the environment (this assumes VOXL-CAM is in SoftAP with IP Address of 192.168.8.1 which is the default): ```bash yocto:~# source /opt/ros/indigo/setup.bash yocto:~# source ~/my_ros_env.sh ``` Run the following command to run the MPA ROS Node: ```bash yocto:~# roslaunch voxl_mpa_to_ros voxl_mpa_to_ros.launch ``` The exepected output is shown: ```bash yocto:~# roslaunch voxl_mpa_to_ros voxl_mpa_to_ros.launch ... logging to /home/root/.ros/log/790d372a-a45e-11eb-ade8-ec5c68cd1ad7/roslaunch-apq8096-4239.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://192.168.1.188:36869/ SUMMARY ======== PARAMETERS * /mpa/voxl_mpa_to_ros_node/image0_pipe: tracking * /mpa/voxl_mpa_to_ros_node/image0_publish: True * /mpa/voxl_mpa_to_ros_node/image1_pipe: hires_preview * /mpa/voxl_mpa_to_ros_node/image1_publish: True * /mpa/voxl_mpa_to_ros_node/image2_pipe: qvio_overlay * /mpa/voxl_mpa_to_ros_node/image2_publish: True * /mpa/voxl_mpa_to_ros_node/image3_pipe: * /mpa/voxl_mpa_to_ros_node/image3_publish: False * /mpa/voxl_mpa_to_ros_node/image4_pipe: * /mpa/voxl_mpa_to_ros_node/image4_publish: False * /mpa/voxl_mpa_to_ros_node/image5_pipe: * /mpa/voxl_mpa_to_ros_node/image5_publish: False * /mpa/voxl_mpa_to_ros_node/imu0_pipe: imu0 * /mpa/voxl_mpa_to_ros_node/imu0_publish: True * /mpa/voxl_mpa_to_ros_node/imu1_pipe: imu1 * /mpa/voxl_mpa_to_ros_node/imu1_publish: True * /mpa/voxl_mpa_to_ros_node/stereo_pipe: stereo * /mpa/voxl_mpa_to_ros_node/stereo_publish: True * /mpa/voxl_mpa_to_ros_node/tof_cutoff: 100 * /mpa/voxl_mpa_to_ros_node/tof_pipe: tof * /mpa/voxl_mpa_to_ros_node/tof_publish: True * /mpa/voxl_mpa_to_ros_node/vio0_pipe: qvio * /mpa/voxl_mpa_to_ros_node/vio0_publish: True * /mpa/voxl_mpa_to_ros_node/vio1_pipe: * /mpa/voxl_mpa_to_ros_node/vio1_publish: False * /rosdistro: indigo * /rosversion: 1.11.21 NODES /mpa/ voxl_mpa_to_ros_node (voxl_mpa_to_ros/voxl_mpa_to_ros_node) ROS_MASTER_URI=http://192.168.1.188:11311/ core service [/rosout] found process[mpa/voxl_mpa_to_ros_node-1]: started with pid [4257] Param: "image3_publish" set to false, not publishing associated interface Param: "image4_publish" set to false, not publishing associated interface Param: "image5_publish" set to false, not publishing associated interface Param: "vio1_publish" set to false, not publishing associated interface MPA to ROS app is now running Starting Manager Thread with 8 interfaces Found pipe for interface: tracking, now advertising Did not find pipe for interface: hires_preview, interface will be idle until its pipe appears Did not find pipe for interface: qvio_overlay, interface will be idle until its pipe appears Found pipe for interface: stereo, now advertising Found pipe for interface: tof, now advertising Found pipe for interface: imu0, now advertising Found pipe for interface: imu1, now advertising Found pipe for interface: qvio, now advertising ``` #### Launch RVIZ on Desktop On the host computer, run RVIZ ```bash rviz ``` **To view the Point Cloud from ToF sensor:** 1. On the leftmost column click on the “Add” button 2. In the pop-up options click on “PointCloud2” 3. Change Display Name to “tof” 4. In the left column under "tof" tab select type in Image Topic as /tof/point_cloud 5. If needed, set the "Global Options" "Fixed Frame" to "map" 6. If needed, Under the "tof" node, set Style to "Points" **To View the Tracking image sensors:** 1. On the leftmost column click on the “Add” button 2. In the pop-up options click on “Image” 3. Change Display Name to “tracking” and click "OK" 4. In the left column, expand the “tracking” node and select type in Image Topic as /tracking/image_raw **To View the Stereo image sensors:** 1. On the leftmost column click on the “Add” button 2. In the pop-up options click on “Image” 3. Change Display Name to “stereo_left” 4. In the left column under “stereo_left” tab select type in Image Topic as /stereo/left/image_raw 5. On the leftmost column click on the “Add” button 6. In the pop-up options click on “Image” 7. Change Display Name to “stereo_right” 8. In the left column under “stereo_right” tab select type in Image Topic as /stereo/right/image_raw ![voxl cam RVIZ](/images/voxl-cam/voxl-cam-rviz.png)

Software Setup (Only need if you mess with things) {: .text-echo } ## Software Setup (only needed if you mess with things) Out of the box, the VOXL-CAM will already be pre-configured to be able to visualize and publish via ROS. In the situation where the device needs to be configured manually, the steps below demonstrate how to do so. ### Setup ADB On the host computer install the Android debug Bridge (ABD): ``` me@mylaptop:~$ sudo apt install android-tools-adb android-tools-fastboot ``` Make sure the VOXL-CAM is connected via Micro-USB to the host PC. If ADB is set up properly you can check ADB detects your device using ```adb devices```. If a device shows up then you have configured it properly. ``` me@mylaptop:~$ adb devices List of devices attached 73a05d48 device ``` ### Installing Required Packages The latest VOXL Platform Release is all that is needed, and can be downloaded from [here](https://downloads.modalai.com). This is already installed on units shipped, but if needed, you can follow instructions [here](/flash-system-image/) to reflash. Begin by entering the VOXL-CAM's bash shell from the host computer using `adb shell` and starting `bash`. ```bash me@mylaptop:~$ adb shell / # bash yocto:/# ``` Setup the environment (this assumes VOXL-CAM is in SoftAP with IP Address of 192.168.8.1 which is the default): ### Configure Cameras ```bash yocto:~# voxl-configure-cameras ``` This should allow you to select different camera configurations. After running the command the following prompt will appear, you'll select option 7. ```bash Which camera configuration are you using? 0 None 1 Tracking + Stereo 2 Tracking Only 3 Hires + Stereo + Tracking (default) 4 Hires + Tracking 5 TOF + Tracking 6 Hires + TOF + Tracking 7 TOF + Stereo + Tracking 8 Hires Only 9 TOF Only ``` Again, we have camera configuration 7. Enter 7 into the command line and press enter. Update the environment for ROS usage: ```bash yocto:~# exec bash yocto:~# source /opt/ros/indigo/setup.bash yocto:~# source ~/my_ros_env.sh ``` ### Enable Core Services Enable the required services: ``` yocto:~# systemctl enable voxl-camera-server yocto:~# systemctl enable voxl-qvio-server yocto:~# systemctl enable voxl-imu-server ``` Start the required services: ``` yocto:~# systemctl start voxl-camera-server yocto:~# systemctl start voxl-qvio-server yocto:~# systemctl start voxl-imu-server ``` *Note: You can use `voxl-inspect-services` from the `mpa-tools` library to see a list of available services.* You can run any of these servers in an ssh or adb window by typing their executable name, e.g.: ```bash yocto:~# voxl-camera-server ``` Manually running these will require an open shell window, but will often have the ability to more easily see logged data from the servers.
[Next Step: Flight Core](/voxl-cam-user-guide-flight/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-cam-user-guide-modem/ # VOXL CAM Modem Setup ![Voxl-cam-modem](/images/voxl-cam/voxl-cam-modem.png) This guide applies to VOXL CAM units built with a modem: SKUs C3-FC1-M8, C7-FC1-M8, C3-FC1-M5, and C7-FC1-M5. The modem in VOXL CAM is the VOXL LTE modem add-on, so its setup is the same as on a standalone VOXL. The [V2 LTE Add-On User Guide](/lte-v2-modem-user-guide/) covers both steps below in full; the [4G LTE Modems](/4G-LTE-Modems/) section has the datasheets. ## Install the SIM card Power the unit off, insert a nano SIM in the modem's SIM slot, and power back on. See the SIM section of the [V2 LTE Add-On User Guide](/lte-v2-modem-user-guide/). ## Configure the modem Configure the carrier profile and bring the connection up with voxl-modem, as described in the [V2 LTE Add-On User Guide](/lte-v2-modem-user-guide/). --- Source: https://docs.modalai.com/voxl-cam-datasheet/ # VOXL-CAM v1 Datasheet --- ## Helpful Links - [User Manual, v1](/voxl-cam-user-guide/) ## Hardware Overview ![voxl-cam-labeled](/images/voxl-cam/voxl-cam-labeled.jpg) ## Dimensions [3D STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/VOXL_CAM_STEP.zip) ![voxl-cam](/images/voxl-cam/voxl-cam-dimensions.jpg) [View in fullsize](/images/voxl-cam/voxl-cam-labeled.pdf){:target="_blank"} ## Specifications | Feature | Details | |-----------------------|---------------------------------------------------------------------------------------| | Dimensions | 100.32mm x 39.57mm x 17.47mm | | Weight | 57.5g - 87g (depending on configuration) | | Compute | [VOXL (M0006)](/voxl-datasheets/) | | Flight Controller | Integrated PX4 coming soon on DSP
External FlightCore via UART, not included) | | Communications | USB, WiFi, support for [VOXL Add-Ons](/expansion-boards/) including LTE and Microhard | | Time of Flight Sensor | [PMD (ToF)](/M0040/) | | Tracking Image Sensor | [OV7251 - MSU-M0014](/M0014/) | | Stereo Image Sensors | [OV7251 - OEM-M0015-1-00](/M0015/) | | Connectors | UART (MAVLink) [VOXL J12](/voxl-datasheets-connectors/) | | | UART/I2C/GPIO [VOXL J7](/voxl-datasheets-connectors/) | | | UART [VOXL J11](/voxl-datasheets-connectors/) | --- Source: https://docs.modalai.com/voxl-kits/ # VOXL Dev Bundles ![voxl-dk](/images/voxl/voxl-dk.jpg) [Available for purchase here](https://www.modalai.com/pages/voxl) - MDK-M0006-2-00 - VOXL Core Board Kit - MDK-M0006-2-01 - VOXL Core Board Kit with Power Module (M0041-1-B), power cable (MCBL-00001), and antennas (MRF-M0006) - MRF-M0006 - VOXL Wi-Fi Antenna Kit --- Source: https://docs.modalai.com/voxl-dev-drones/ # Development Drones Documentation for ModalAI's ready-to-fly development drones. --- Source: https://docs.modalai.com/starling-2/ # Starling 2 ## Overview ![Starling 2](/images/d0014/D0014_front_1920x800.png) Starling 2 is our flagship development drone for indoor flight. --- Source: https://docs.modalai.com/starling-2-hardware-overview/ # Starling Hardware Overview This section contains an overview of the hardware components of the Starling Development Drone. ## Table of Contents 1. TOC --- For technical details, see the [datasheet](/starling-2-datasheet/) page. > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* ## Hardware Overview Video ## Development Kit Contents Starling is available in a variety of kits depending on what you have and need. ## Components For the full component list, specifications, and part numbers, see the [Starling 2 datasheet](/starling-2-datasheet/).
[Next: Starling Datasheet](/starling-2-datasheet/){: .btn .btn-green } --- Source: https://docs.modalai.com/starling-2-datasheet/ # Starling Datasheet ## Specifications | Component | Specification | |-----------------|----------------------------------------------------------------------------------------| | Autopilot | [VOXL2](/voxl-2/) | | Image Sensors | C26 Config - IMX412, TOF, Dual AR0144
C27 Config - IMX412, TOF, Triple AR0144 | | Take-off Weight | 285g (182g without battery) | | Diagonal Size | 230mm | | Flight Time | >35 minutes | | Motors | 1504 3000kv | | Propellers | 120mm | | Frame | 3mm Carbon Fiber | | ESC | [ModalAI 4-in-1 Mini ESC](/voxl-mini-esc-datasheet/) | | GPS | UBlox M10 | | RC Receiver | 915mhz ELRS or 2.4GHz Ghost Atto | | Datalink | WiFi: AlfaNetworks AWUS036EACS, FCC ID: 2AB878811 | | Power Module | Integrated with ModalAI 4-in-1 Mini ESC | | Battery | Sony VTC6 3000mah 2S, or any 2S 18650 battery with XT30 connector | | Height | | | Width | | | Length | | ## Hardware Wiring Diagram D0014-V1-compute-wiring Diagram draw.io Source ## 3D STEP * [Starling 2 C26 3D STEP](https://downloads.modalai.com) * [Starling 2 C27 3D STEP](https://downloads.modalai.com) ## Add-On Board The add-on board used on this vehicle has an I2C, UART and GPIOs along with the USB interface. See [datasheet](/usb2-type-a-breakout-add-on/) for pinouts. --- Source: https://docs.modalai.com/starling-2-max/ # Starling 2 Max ![Starling 2 Max](/images/d0012/D0012_front_1920x800.png) ## Overview Starling 2 Max is our flagship development drone for both indoor and outdoor flight. --- Source: https://docs.modalai.com/starling-2-max-hardware-overview/ # Starling 2 Max Hardware Overview This section contains an overview of the hardware components of the Starling 2 Max Development Drone. ## Table of Contents 1. TOC --- For technical details, see the [datasheet](/starling-2-max-datasheet/) page. > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* ## Development Kit Contents Starling 2 Max is available in a variety of [kits](https://www.modalai.com/products/starling-2-max) depending on what you have and need: | Kit | Contents | |-----|----------| | K0 | Drone only | | K1 | Drone and battery pack | | K2 | Drone with battery pack and controller | | K3 | Drone with case, battery pack, wall power supply, and controller | ## Components Starling 2 Max shares its entire compute stack with [Starling 2](/starling-2-hardware-overview/) — the same VOXL 2-based autopilot, cameras, and software experience. The differences are the airframe and power system: - **Larger airframe** — 322mm diagonal carbon fiber airframe (512mm propeller to propeller) with 180mm folding propellers; 500g take-off weight, 500g additional payload capacity, 55+ minutes flight time - **Dual-battery power** — two 2S 18650 packs (e.g. Sony VTC6 3000mAh) with XT30 connectors, connected in series for an effective 4S (16.8V max). Both batteries must be installed to fly. - **Power module** integrated into the ModalAI VOXL ESC Mini 4-in-1 - **Cameras** — dual Sony IMX412 12MP color + dual OnSemi AR0144 tracking sensors (camera config C28), optionally with ToF (C29) - **RC receiver** — 915MHz ELRS (M0184) or 2.4GHz Ghost Atto For the complete specifications and part numbers, see the [Starling 2 Max datasheet](/starling-2-max-datasheet/). [Next: Starling Datasheet](/starling-2-max-datasheet/){: .btn .btn-green } --- Source: https://docs.modalai.com/starling-2-max-datasheet/ # Starling 2 Max Datasheet ## Specifications | Component | Specification | |-----------------|----------------------------------------------------------------------------------------| | Autopilot | [VOXL2](/voxl-2/) | | Image Sensors | C28 Config - Dual IMX412, Dual AR0144 or C29 Config - Dual IMX412, Dual AR0144, TOF | | Take-off Weight | 566g | | Payload Capacity| 500g - will affect flight time with total takeoff weight ~930g | | Max Speed | Cruise 15m/s, Dash (or burst) 20m/s | | Wind Gusts | Tolerant to 15m/s | | Service Ceiling | 4,000m MSL | | Flight Time | ~55 minutes (with Amprius cells, ~40 min with LiIon) | | Motors | 2203.5 1500kv | | Propellers | 180mm Tri-Blade | | Frame | 3mm Carbon Fiber | | ESC | [ModalAI 4-in-1 Mini ESC](/voxl-mini-esc-datasheet/) | | GPS | UBlox M10 | | RC Receiver | 915mhz ELRS or 2.4GHz Ghost Atto | | Datalink | WiFi: AlfaNetworks AWUS036EACS, FCC ID: 2AB878811 | | Power Module | Integrated with ModalAI 4-in-1 Mini ESC | | Battery | Sony VTC6 3000mah 2S, or any 2S 18650 Li-Ion battery with XT30 connector.
- Two 2S batteries required to fly and are used in series to make a 4S battery
- Max Voltage: 16.8V (two 2S batteries at 8.4V ) | | Diagonal | 512mm (propeller to propeller) | | Height | 120mm (propeller to propeller) | | Width | 450mm (propeller to propeller) 260mm (motor to motor) | | Length | 380mm (propeller to propeller) 190mm (motor to motor) | ## Critical Components | Critical Electronic Component (CEC) | Encryption Type | Make | Model | Location of HQ | Country of Manufacture | |------------------------------------------------------|-------------------------------------|--------------------------------------------------|------------------|----------------------------|----------------------------| | Flight controller/autopilot | AES-256 Capable / Developer Enabled | VOXL 2 | M0154 | San Diego, CA | USA | | Additional computers/companion computers | AES-256 Capable / Developer Enabled | VOXL 2 | M0154 | San Diego, CA | USA | | Radios | | -T8 [M0184](/M0184/)
-T9 Ghost Atto Rx | | -T8 USA
-T9 Croatia | -T8 USA
-T9 Croatia | | Data transmission devices | Developer Enabled | Alfa Network | AWUS036EACS | Taiwan | Taiwan | | Camera(s) | N/A | ModalAI | M0161
M0166 | San Diego, CA | USA | | Gimbals | N/A | N/A | | | | | GCS hardware | N/A | | | | | | GCS software | | QGC / MAVLink Compatible | | | | | C2 device/handset | | -T8 iFlight Commando 8 Rx
-T9 Ghost Atto Rx | | -T8 China
-T9 Croatia | -T8 China
-T9 Croatia | | Secondary tracking hardware (Remote ID, ADS-B, etc.) | N/A | | | | | | Payload(s) | N/A | | | | | ## Hardware Wiring Diagram [D0012-V1-compute-wiring](/voxl2-d0014/) ## 3D STEP * [Starling 2 Max 3D STEP R2](https://downloads.modalai.com) (October 2024 onwards) * [Starling 2 Max 3D STEP R1](https://downloads.modalai.com) (April through September 2024) ## Add-On Board The add-on board used on this vehicle has an I2C, UART and GPIOs along with the USB interface. See [datasheet](/usb2-type-a-breakout-add-on/) for pinouts. --- Source: https://docs.modalai.com/sentinel/ # Sentinel A comprehensive drone reference design with low-power, high-performance heterogenous computing, artificial intelligence engine that is designed to deliver 15 TOPS deep learning capability, GPS-denied navigation, obvstacle avoidance and 5G connectivity, support for 7 image sensor concurrency, computer vision, and vault-like security. ![Sentinel](/images/sentinel/sentinel-front-clear.png) | Part Number | Description | |--- |--- | | `MRB-D0006-4-V1-C11-M7-T1-K0` | Sentinel Development Drone Kit, with 5G Modem Add-On | | `MRB-D0006-4-V1-C11-M13-T1-K0` | Sentinel Development Drone Kit, with Wi-Fi Modem Add-On | | `MRB-D0006-4-V1-C11-M3-T1-K0` | Sentinel Development Drone Kit, with Microhard Modem Add-On | | `MRB-D0006-4-V1-C11` | Sentinel Development Drone, Stand Alone | --- Source: https://docs.modalai.com/sentinel-quickstart/ # Sentinel Reference Drone Quickstart ## Overview The [User's Guide](/sentinel-user-guides/) walks through taking Sentinel out of the box and up into the air! For technical details, see the [datasheet](/sentinel-datasheet/).
> *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* --- ## Overview ### What's in the Box ![sentinel-drone-only](/images/sentinel/sentinel-kit.jpg) - Sentinel Drone - 10" props - Two sets of Propellor ring adapters - 5G Modem or Microhard Modem or Wifi (Optional) ![sentinel-connectivity-options](/images/sentinel/sentinel-connectivity.png) ### Required Materials To follow this user guide, you'll need the following: - Spektrum Transmitter - e.g. SPMR6655, SPM8000 or SPMR8000 - Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work - Buy Here - Power Supply or Battery with XT60 connector - e.g. Gens Ace 5000mAh, or any 3S battery with XT60 connector - Buy Battery Here - Buy Power Supply [Here](https://www.modalai.com/products/ps-xt60?_pos=1&_sid=f5b241f03&_ss=r) - Host computer with: - QGroundControl 3.5.6+ - Ubuntu 22.04 or newer - Wi-Fi - USB Type C Cable ## Sentinel Vehicle Components ### Overview The following images give an overview of the vehicle components. #### Front [View in fullsize](/images/sentinel/sentinel-labeled-1.png){:target="_blank"} ![Sentinel-Labeled-1](/images/sentinel/sentinel-labeled-1.png) #### Side [View in fullsize](/images/sentinel/sentinel-labeled-2.png){:target="_blank"} ![Sentinel-Labeled-2](/images/sentinel/sentinel-labeled-2.png) #### Top [View in fullsize](/images/sentinel/sentinel-labeled-3.png){:target="_blank"} ![Sentinel-Labeled-3](/images/sentinel/sentinel-labeled-3.png) #### Bottom [View in fullsize](/images/sentinel/sentinel-labeled-4.png){:target="_blank"} ![Sentinel-Labeled-4](/images/sentinel/sentinel-labeled-4.png) [Next Step: Power and Battery](/sentinel-user-guide-power/){: .btn .btn-green } ## Sentinel Power Supply and Battery ### Safety First! For setup and configuration of your Sentinel you must **Remove the Propellers** for safety. ### Battery Information Sentinel requires a Gens Ace 5000mAh, or any 3S battery with XT60 connector. Buy Battery Here ![vehicle-battery-connected](/images/sentinel/sentinel-unplugged.jpg) To install a 3s battery, slide into the body as shown. There is a stop at the front of the vehicle that will prevent the battery from sliding too far forward. The battery should be pressed all the way in until it hits the stop for a consistent center of mass. ![vehicle-battery-connected](/images/sentinel/sentinel-powered.jpg) Power on Sentinel by connecting the battery to the XT60 connector. ## Benchtop Power Supply For desktop use, a 12VDC wall power supply can be used and is [available here](https://www.modalai.com/products/ps-xt60). This is convenient when doing development. --- Source: https://docs.modalai.com/sentinel-user-guides/ # Sentinel Reference Drone User Guide This guide will walk you from taking Sentinel out of the box and up into the air! For technical details, see the [datasheets](/sentinel-datasheet/). ![Sentinel](/images/sentinel/sentinel-front-clear.png) [First Step: Unboxing](/sentinel-user-guide-unboxing/){: .btn .btn-green} --- Source: https://docs.modalai.com/sentinel-user-guide-unboxing/ # Sentinel Unboxing 1. TOC This guide will walk you from taking Sentinel out of the box and up into the air! For technical details, see the [datasheet](/sentinel-datasheet/). > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* --- ## Overview ### What's in the Box ![sentinel-drone-only](/images/sentinel/sentinel-kit.jpg) - Sentinel Drone - 10" props - Two sets of Propellor ring adapters - 5G Modem or Microhard Modem or Wifi (Optional) ![sentinel-connectivity-options](/images/sentinel/sentinel-connectivity.png) ### Required Materials To follow this user guide, you'll need the following: - Spektrum Transmitter - e.g. SPMR6655, SPM8000 or SPMR8000 - Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work - Buy Here - Power Supply or Battery with XT60 connector - e.g. Gens Ace 5000mAh, or any 3S battery with XT60 connector - Buy Battery Here - Buy Power Supply [Here](https://www.modalai.com/products/ps-xt60?_pos=1&_sid=f5b241f03&_ss=r) - Host computer with: - QGroundControl 3.5.6+ - Ubuntu 22.04 or newer - Wi-Fi - USB Type C Cable [Next Step: Vehicle Components](/sentinel-user-guide-components/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-components/ # Sentinel Vehicle Components 1. TOC ## Overview The following images give an overview of the vehicle components. ### Front [View in fullsize](/images/sentinel/sentinel-labeled-1.png){:target="_blank"} ![Sentinel-Labeled-1](/images/sentinel/sentinel-labeled-1.png) ### Side [View in fullsize](/images/sentinel/sentinel-labeled-2.png){:target="_blank"} ![Sentinel-Labeled-2](/images/sentinel/sentinel-labeled-2.png) ### Top [View in fullsize](/images/sentinel/sentinel-labeled-3.png){:target="_blank"} ![Sentinel-Labeled-3](/images/sentinel/sentinel-labeled-3.png) ### Bottom [View in fullsize](/images/sentinel/sentinel-labeled-4.png){:target="_blank"} ![Sentinel-Labeled-4](/images/sentinel/sentinel-labeled-4.png) [Next Step: Power and Battery](/sentinel-user-guide-power/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-power/ # Sentinel Power Supply and Battery 1. TOC ## Safety First! For setup and configuration of your Sentinel you must **Remove the Propellers** for safety. ## Battery Information Sentinel requires a Gens Ace 5000mAh, or any 3S battery with XT60 connector. Buy Battery Here ![vehicle-battery-connected](/images/sentinel/sentinel-unplugged.jpg) To install a 3s battery, slide into the body as shown. There is a stop at the front of the vehicle that will prevent the battery from sliding too far forward. The battery should be pressed all the way in until it hits the stop for a consistent center of mass. ![vehicle-battery-connected](/images/sentinel/sentinel-powered.jpg) Power on Sentinel by connecting the battery to the XT60 connector. ## Benchtop Power Supply For desktop use, a 12VDC wall power supply can be used and is [available here](https://www.modalai.com/products/ps-xt60). this is convenient when doing development. [Next Step: Connect over ADB](/sentinel-user-guide-connect-adb/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-connect-adb/ # Sentinel Connect Over ADB 1. TOC ## How to Setup ADB See [here](/setting-up-adb/) ## How to Connect to Sentinel Over ADB After installing adb, connect your host PC to Sentinel using a USB type C cable. Then, open your terminal, and run the following: ```bash adb shell ``` Now you are running a shell inside the Sentinel's Ubuntu OS! ``` voxl2:/ ``` [Next Step: Connect to Network](/sentinel-user-guide-connect-network/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-connect-network/ # Sentinel Connect Network --- ## Connect Using WiFi ### Related Video The following video shows how to connect using a development kit: ### voxl-wifi First, ADB onto your device if you haven't already done so: ```bash adb shell ``` In order to connect your Sentinel to a Wi-Fi access point, run the following: ```bash voxl-wifi station [SSID] [PSK] ``` where `SSID` and `psk` are the credentials for your WiFi network. In order to connect using SoftAP mode, run the following: ```bash voxl-wifi softap [SSID] ``` > if you use SoftAP mode, you will need to reboot: ```bash # exit from adb exit # reboot adb reboot ``` ### Check IP Address Get the Sentinel shell over adb again: ```bash adb shell ``` Run the following to find the IP of the Sentinel: ```bash ifconfig wlan0 ``` You'll see something like: ``` wlan0: flags=4163 mtu 1500 inet 192.168.1.188 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::7970:262b:29b8:37e9 prefixlen 64 scopeid 0x20 ether 00:03:7f:12:33:6e txqueuelen 3000 (Ethernet) RX packets 51 bytes 7204 (7.2 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18 bytes 1889 (1.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` In this case, Sentinel's IP address on the network is `192.168.1.188` ### SSH onto Sentinel Now, from you host machine, we can SSH on target using the following instead of adb: ``` ssh root@192.168.1.188 ``` The default SSH password is `oelinux123` If the SSH connection is successful, you should see the following: ``` Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.19.125-perf aarch64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro * Super-optimized for small spaces - read how we shrank the memory footprint of MicroK8s to make it the smallest full K8s around. https://ubuntu.com/blog/microk8s-memory-optimisation This system has been minimized by removing packages and content that are not required on a system that users do not log into. To restore this content, you can run the 'unminimize' command. The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. ``` If you are having issues SSHing into the system as root, check [here](/voxl-quickstarts/). ## Connecting to 5G network ### Install SIM Card To install a SIM into Sentinel, start by disconnecting the battery. ![RB5-SIM-4](/images/rb5/rb5-sim-install-4.jpg) Then, remove the two screws holding in the flight deck lid.
![RB5-SIM-2](/images/rb5/rb5-sim-install-2.jpg) Next, remove the 4 screws holding in the chirp sensor. You may need to hold the bolts in place from the inside while unscrewing from the outside.
![RB5-SIM-1](/images/rb5/rb5-sim-install-1.jpg) The SIM slot is located under the top PCB as shown above. Slide the SIM into the slot until you hear the click. You might find this process easier using forceps.
![RB5-SIM-3](/images/rb5/rb5-sim-install-3.jpg) Make sure the SIM is fully inserted. If you ever want to swap the SIM, just push on it, and it will pop out.
![RB5-SIM-4](/images/rb5/rb5-sim-install-4.jpg) Screw the chirp sensor back in place. Then, screw the flight deck lid back on the same way you took it off.
### Configuring Service In order to establish a connection to the 5G network, `voxl-modem` is required. The `voxl-modem` service can be configured by running the following: ```bash voxl-configure-modem ``` The user will be prompted to select their modem hardware and APN (Access Point Name) for their chosen SIM card. This will enable the `voxl-modem` service in the background and it will be started at boot. ### Disabling / enabling service The `voxl-modem` service can be disabled by running the following: ```bash systemctl disable voxl-modem ``` It can be re-enabled using: ```bash systemctl enable voxl-modem ``` The status of the service can be viewed by running: ```bash systemctl status -l voxl-modem ``` ### Next Steps There are roughly three paths you could take: - Check out PX4 and Fly [Next Step: PX4](/sentinel-user-guide-px4/){: .btn .btn-green} - For developers, check out our Developer and Build Guides [Next Step: Developer Guide](/voxl-px4-dev-build-guide/){: .btn .btn-green} [Next Step: Build Guide](/voxl-px4-dev-build-guide/){: .btn .btn-blue .float-left} - Skip to Machine Vision features to mess around at your desktop [Next Step: Use VIO](/sentinel-user-guide-using-vio/){: .btn .btn-green} --- Source: https://docs.modalai.com/sentinel-user-guide-px4/ 1. TOC # Sentinel PX4 ## System Bootup Behavior PX4 starts automatically after Sentinel boots via the `voxl-px4` service. ## Checking PX4 Status ```bash voxl-inspect-services ``` The following services are required to be running: - `voxl-mavlink-server` - `voxl-vision-hub` - `voxl-px4` ``` Service Name | Enabled | Running | CPU Usage --------------------------------------------------------------- docker-autorun | Disabled | Not Running | docker-daemon | Disabled | Not Running | modallink-relink | Disabled | Not Running | voxl-camera-server | Enabled | Running | 30.0 voxl-cpu-monitor | Disabled | Not Running | voxl-dfs-server | Disabled | Not Running | voxl-imu-server | Disabled | Not Running | voxl-mavlink-server | Enabled | Running | 0.0 voxl-modem | Disabled | Not Running | voxl-portal | Disabled | Not Running | voxl-px4-imu-server | Disabled | Not Running | voxl-px4 | Enabled | Running | 0.0 voxl-qvio-server | Disabled | Not Running | voxl-static-ip | Disabled | Not Running | voxl-streamer | Disabled | Not Running | voxl-tag-detector | Disabled | Not Running | voxl-tflite-server | Disabled | Not Running | voxl-time-sync | Disabled | Not Running | voxl-vision-hub | Enabled | Running | 0.0 voxl-wait-for-fs | Enabled | Completed | ``` If it is not running, the following wizards can be used: ```bash voxl-configure-mavlink-server ``` ```bash voxl-configure-vision-px4 ``` ## PX4 Startup Configuration The startup configuration is specified here: ```bash /etc/modalai/voxl.config ``` The service that starts PX4 up on bootup is here: ```bash /etc/systemd/system/voxl-px4.service ``` [Next Step: Connect to Ground Station](/sentinel-user-guide-connect-network/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-pre-flight-setup/ # Sentinel Pre-Flight Setup 1. TOC ## Using QGroundControl for QGC We will be using QGroundControl as a means to perform the pre-flight setups and checks as needed. ## Sensor Calibration Sentinel flight sensors are delivered pre-calibrated from the factory. PX4 will warn you if your compass needs to be re-calibrated depending on your location and environmental conditions. If so, or if you'd like re-calibrate all sensors, follow the [px4 sensor calibration procedure](/px4-calibrate-sensors/). ## RC Radio Setup ### Bind Receiver to Transmitter Sentinel has a Spektrum receiver that must be paired (or "bound") with a transmitter. Follow these instructions to pair your Spektrum transmitter to Sentinel. First, make sure your Sentinel is powered on. Next, connect via ADB by plugging the USB-C into Sentinel's flight deck. Then, open up the terminal and type: ```bash adb shell ``` To use the binding utility, use ```bash qrb5165-bind ``` Follow the on-screen prompts. Select your bind type. ```bash Tool used for binding Spektrum receiver. In order to use, select ONLY 1 bind type. -d, --debug enable debug messages -h, --help print this help messag -t, --DSM2_22 3 pulses (DSM2 1024/22ms) -f, --DSM2_11 5 pulses (DSM2 2048/11ms) -s, --DSMX_22 7 pulses (DSMX 22ms) ``` Once you select your type, you will see the message: ```bash An orange light should now be flashing on your receiver. If so, your receiver is successfully in binding mode ``` Check that the receiver is in binding mode. The light should flash. ![binding-1](/images/rb5/rb5-bind-1.gif) Once in binding mode, pair your transmitter to the receiver. The exact instructions for pairing depend on your transmitter. Check with your transmitter's manufacturer for up to date information. ![binding-3](/images/rb5/rb5-bind-3.jpg) Once the transmitter is paired, make sure the receiver light is solid orange. ![binding-2](/images/rb5/rb5-bind-2.gif)

Make sure to power cycle your Sentinel before continuing

## Calibrate Radio Once bound, power cycle the vehicle and restart QGroundControl, otherwise the radio channels will fail to show up. Now follow the on-screen instructions to calibrate the range and trims of your radio. ![8-calibrate-radio.png](/images/voxl-sdk/qgc/8-calibrate-radio.png) ## Confirm RC Settings Every user will want to use different flight modes and different switch assignments, but for getting started with Sentinel we suggest starting with something similar to this configuration and working from there. - "Flap Gyro" switch left of Spektrum Logo - Channel 6 - Up position: Manual Flight Mode - Middle Position: Position Flight Mode - Down Position: Offboard Flight mode - "Aux2 Gov" switch right of Spektrum Logo - Channel 7 - Up position: Motor Kill Switch Engaged - Down Position: Motor Kill Switch Disengaged (required to fly) Since we have a manual kill switch on the radio there is no need for the "safety switch" on the Pixhawk GPS module as so it is disabled in our params file in favor of the kill switch. ![9-flight-mode-config.png](/images/voxl-sdk/qgc/9-flight-mode-config.png) If you have a Spektrum DX6e or DX8 radio with a clean acro-mode model you can accomplish the above channel mapping by loading the following config file [https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/spektrum_dx8_config.params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/spektrum_dx8_config.params) Still confirm the mapping in QGroundControl before flight! [Next Step: First Flight](/sentinel-user-guide-first-flight/){: .btn .btn-green } --- Source: https://docs.modalai.com/sentinel-user-guide-using-vio/ # Sentinel VIO 1. TOC ## Enabling VIO for GPS-denied Navigation VIO on Sentinel is disabled by default. The service file for VIO can be started by configuring the qvio server: ```bash voxl-qvio-server-configure ``` It will show the following prompt: ```bash Would you like to enable the qvio service? This will start qvio as a background process Selecting yes will start the service, no will disable the service 1) yes 2) no ``` Enter ```1 (yes)``` to enable the service. This will immediately start VIO and enable it on boot. ## Using VIO In order to check if VIO is running you can check with the following command: ```bash systemctl status voxl-qvio-server ``` This will show you the status of the voxl-qvio-server. If the status displays ```active(runnning)``` then VIO is running and the VIO data is being sent to PX4. If the status displays ```failed``` then VIO failed to run. Make sure that camera index 2(downward facing tracking camera) and PX4 are running. To restart VIO, you can simply restart the service file: ```bash systemctl restart voxl-qvio-server ``` VIO should be restarted and the drone should be idle before any flight where VIO will be used. ## Viewing VIO Data VIO data can be viewed by manually running the voxl-inspect-qvio command: ```bash voxl-inspect-qvio ``` > A library path was set for this command, if you're command doesn't execute, inside your adb shell run ```ldconfig``` This will print out position data in the following format: ``` T_imu_wrt_vio (m) |Roll Pitch Yaw (deg)| state| error_code -0.11 -0.12 -0.06| -14.6 -30.1 -2.6| OKAY | ``` T_imu_wrt_vio represents your drones XYZ position in meters from your starting position. To validate this data, you can move the drone forwards and observe as the X value increases. ## Flying with VIO ### Confirm PX4 is Getting VIO Data Once voxl-qvio-server is running, confirm quality data before flight by opening the mavlink inspector and checking that X&Y values are non-zero in the ODOMETRY mavlink telemetry packets. ![voxl-vio-mavlink-inspector.png](/images/voxl-sdk/voxl-vio-mavlink-inspector.png) Alternatively, if your computer running QGroundControl has its volume turned up you should hear it announce the swap from "manual" to "position" mode when you flip the flight mode switch from up to middle. If VIO data is not being transmitted, the system will fall back to altitude mode and you will hear "position mode rejected, altitude flight mode". In this case, go back to manual flight mode (switch up) and wait a few more seconds for voxl-qvio-server to finish initializating. If this doesn't work, go back to "Viewing VIO Data" and reconfirm VIO is working with voxl-inspect-qvio. You can also check the voxl-qvio-server systemd service for indications of what might have gone wrong. We have a VIO parameters file helper [located here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/tree/master/helpers/rb5) to help easily configure into VIO or GPS mode. Specifically the **_EKF2_AID_MASK_** is often overlooked as an important parameter for VIO flight. Troubleshooting VIO Guide is [here](/flying-with-vio/#troubleshooting-vio) Some relevant PX4 parameters for VIO flight ``` # enable vision for height, position, and velocity, no GPS or barometer 1 1 EKF2_AID_MASK 280 6 1 1 EKF2_HGT_MODE 3 6 ## set MD to 0 to allow covarience from VIO to be used 1 1 EKF2_EV_NOISE_MD 0 6 ## Turn off EV Delay, VOXL will do proper timesyncing 1 1 EKF2_EV_DELAY 5.00 9 ## increase bias limit to prevent preflight check failure 1 1 COM_ARM_EKF_AB 0.01 9 ## Allow arming without GPS indoors 1 1 COM_ARM_WO_GPS 1 9 ``` ### Confirm Data is in the Right Coordinate Frame While looking at the ODOMETRY data in QGroundControl's Mavlink Inspector, observe the xyz data as you move the quadcopter around. Make sure it aligns with NED coordinate frame. If there is a coordinate system mismatch PX4 will initially take off then very quickly run away out of control. ### Take off in Position Mode It is safer to take off in Position Flight Mode than it is to flip to this mode mid-flight from Manual Flight Mode. Take off and land with the same instructions as listed above but this time with the Flight Mode switch in the middle position. The quadcopter should take off straight up and be much easier to control than in manual mode. Be ready to flip back to manual mode should anything go wrong. It is safer to flip to manual mode and land than to kill the motors mid-flight. Killing the motors mid-flight may result in the propellers loosening from the reverse-torque and flying straight up off the quadcopter. Only kill the motors after landing and spooling down the motors OR in a serious emergency. --- Source: https://docs.modalai.com/sentinel-factory-reset/ # Sentinel Factory Reset Guide --- ## System Image Flash If you are having problems with your system, **please** ask questions on the [forum](https://forum.modalai.com/category/33/sentinel) before reflashing the system image. ### Download Location You can [download the system image](https://downloads.modalai.com) from our protected downloads page. Although this is usually not necessary since the system image is bundled in our [VOXL SDK](/voxl-suite/). ### USB Cables It is recommended to use a USBC to USBA cable. We have seen issues with USBC to USBC cables on some host machines. ### Backup Files > Backup any special calibration files not saved in `/data/modalai` - Please backup the following manually prior to updating ```bash ❯ adb pull /etc/modalai . ❯ adb pull /data/misc . ``` ### Flash Procedure It is recommended to install the entire SDK release at once (System Image + voxl-suite) as to avoid version mismatches. Download the latest VOXL2 SDK release from [here](https://downloads.modalai.com) - Unzip the download, in this example we'll assume the download name was `voxl2_SDK_M.m.b.tar.gz` where M.m.b is the version. ```bash ❯ tar -xzvf voxl2_SDK_M.m.b.tar.gz ``` - Get ready to run the script by going into the directory you just unzipped ```bash ❯ cd voxl2_SDK_M.m.b ``` - Now, attach the VOXL 2 via USBC and ensure the unit is powered on - Make sure that adb see's your by running `adb devices` from the host computer ```bash ❯ adb devices List of devices attached f8bb8d44 device ``` **If no devices show up:** see 'Force VOXL 2 into fastboot' in [VOXL2 System Image](/voxl2-system-image/) - Check that the `fastboot` command works by running `fastboot devices` ```bash ❯ fastboot devices ``` **If command fails** see `Missing ADB?` below - Run the following: ```bash ./install.sh ``` ### Missing ADB? Install the Android Debug Bridge (ADB): ```bash me@mylaptop:~$ sudo apt install android-tools-adb android-tools-fastboot ``` Once the flash has started, you will be prompted to answer a couple questions. It is recommended to preserve userdata partitions as opposed to conducting a full wipe in which you would have to recalibrate the cameras and sensors. ```bash Would you like to preserve userdata partitions or conduct a full wipe? 1) Preserve(recommended) 2) Wipe 3) Cancel and Exit #? 1 [INFO] Found all required files ``` If full wipe is conducted view ```Full-wipe calibration``` below. ## Software Configuration ### Factory Reset MPA VOXL Boards that were shipped as part of a kit (Starling 2](/starling-2/), [Sentinel](/sentinel/), etc) were configured at the factory with kit-specific MPA configuration starting around June 2021 with the introduction of MPA. In these cases, the kit part number is saved to `/data/modalai/factory_mode.txt` and can be used to put your VOXL MPA services back to their kit-specific factory defaults by running: ```bash voxl-configure-mpa --factory-reset ``` Note this file will be wiped along with factory calibration files if you elect to wipe your /data/ partition while flashing a system image (which is not a recommended procedure). ## Full-wipe calibration If you conduct a full wipe, all data partitions will be erased, and you will have to calibrate all sensors and cameras and re-configure all softwares. ### Sensor Calibration Sentinel flight sensors are delivered pre-calibrated from the factory. If conducting, full wipe, you will need to re-calibrate by following the [px4 sensor calibration procedure](/px4-calibrate-sensors/). ### Camera Calibration To calibrate cameras, follow the [camera calibration guide](/calibrate-cameras/). ## Pre-flight setup ### Connect Network The following video shows how to connect using a development kit: Then follow the [pre-flight setup guide](/sentinel-user-guide-pre-flight-setup/) to connect to RC Radio Setup and calibrate radio. ### Connect to QGC Ensure QGC IP address is the correct one. ``` bash cat /etc/modalai/voxl-mavlink-server.conf | grep qgc_ip ``` The IP address in the `qgc_ip` field should match the one of your computer. If it doesn't match, you can use `vi` to modify the file and enter the correct IP address ```bash vi /etc/modalai/voxl-mavlink-server.conf ``` ## First Flight Follow First Flight guide [here](/sentinel-user-guide-first-flight/) --- Source: https://docs.modalai.com/sentinel-datasheet/ # Sentinel Datasheets ![Sentinel](/images/sentinel/sentinel-front-clear.png) --- Source: https://docs.modalai.com/sentinel-functional-description/ # Sentinel Drone Functional Description [Buy Here](https://www.modalai.com/products/starling-2-max) --- ![Sentinel](/images/sentinel/sentinel-front-clear.png) ## Sentinel High-Level Specs ### Flight Specs | Component | Specification | |--------------------------|----------------------------------------------------------------------------------------| | Take-off Weight | 1347g (1011g without battery) | | Diagonal Size | 480mm | | Flight Time | > 20 minutes | | Payload Capacity | 1kg | | Motors | Holybro 2216-880kv Motors | | Propellers | QTY. 4, 10 inch / 254mm | | Frame | Holybro S500 V2 Frame Kit | | ESCs | [ModalAI VOXL 4-in-1 ESC V2](/voxl-esc-datasheet/) | | Maximum Speed | 5m/s per PX4 setting | | Maximum Height | 122m per PX4 setting | | Geographic Limits System | [PX4 Geo Fencing](https://docs.px4.io/v1.12/en/flying/geofence.html) | | GPS | Ublox Neo-M8N module | | Power Module | [ModalAI Power Module v3 - 5V/6A](/power-module-v3-datasheet/) | | Fail Safe | [PX4 Safety Configuration](https://docs.px4.io/v1.12/en/config/safety.html) | | Battery | Gens Ace 5000mAh, or any 3S battery with XT60 connector | ### Processing Specs | Component | Specification | |----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | CPU | Qualcomm QRB5165 | | Sensors | TDK ICM-42688-P IMU
TDK ICP-10100 Barometer
GPS/Magnetometer (Holybro) | | Image Sensors | Tracking Sensor - Global Shutter VGA
High-resolution 4k30
Front and Rear Stereo - Global Shutter VGA
6x 4-lane MIPI-CSI2 (Up to 7 image sensors) | | Connections | USB 3.1 Hub
USB-C OTG | | Additional I/O | 2 GPIO
I2C, 4 SPI | | Video Transmission | Wi-Fi (2.4GHz or 5GHz) or Cellular (multi-band, carrier dependent) | | Expansions | ModalAI Legacy B2B connector for backwards compatibility with 4G add-on, Microhard add-on, USB debug board.
High speed B2B connector for PCIe2, I2C, SPI, UART, GPIO
TDK Chirp Sensor breakout PCBAs for object avoidance capabilities | | Optional Expansion Add-Ons | 5G modem add-on with USB 3.1 Hub
SD Card add-on
Gigabit Ethernet add-on with USB 3.1 Hub | | Open Software Packages | Ubuntu 18.04
Linux Kernel 4.19
OpenCV
TensorFlow Lite
ROS 1 / ROS 2
RB5 Flight SDK hosted by ModalAI | | Developer Connectivity | QGroundControl
RViz
ADB (Android Debug Bridge) | ### Radio Specifications | Radio | Frequency | Power | Regulatory | |--------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|--------------|--------------------------------------------------| | Remote Control | Spektrum DSMX Receiver (2.4GHz) | | | | Wi-Fi6 (Wi-Fi 802.11 a/b/g/n/ac/ax) | 2.4GHz / 5.8GHz | 175mW / 83mW | [FCC](https://fccid.io/2AOHHTURBOXC865) | | 5G Cellular (Optional) Quectel RM502Q-AE | 5G NR bands worldwide (n1/n2/n3/n5/n7/n8/n12/n20/n25/ n28/n38/n40/n41/n48/n66/n71/n77/n78/n79) | | [FCC](https://fccid.io/XMR2020RM502QAE) | | 5G Cellular (Optional) [Sierra Wireless EM9291](https://www.sierrawireless.com/iot-modules/5g-modules/em9291/)) | 5G NR Sub-6 (n1,n2,n3,n5,n7,n8,n12,n13,n14,n18,n20,n25,n26,n28,n29,n30,n38,n39,n40,n41,n46,n48,n66,n70,n71,n75,n76,n77,n78,n79) | | [FCC](https://fccid.io/N7NEM91) | ### Drone Dimensions | Component | Specification | |---------------------------|-----------------------| | Motor to Motor | 334mm x 334mm x 133mm | | Fully Extended Propellers | 591mm x 591mm x 187mm | ### Vehicle Components The following images give an overview of the vehicle components. ### Front [View in fullsize](/images/sentinel/sentinel-labeled-1.png){:target="_blank"} ![Sentinel-Labeled-1](/images/sentinel/sentinel-labeled-1.png) ### Side [View in fullsize](/images/sentinel/sentinel-labeled-2.png){:target="_blank"} ![Sentinel-Labeled-2](/images/sentinel/sentinel-labeled-2.png) ### Top [View in fullsize](/images/sentinel/sentinel-labeled-3.png){:target="_blank"} ![Sentinel-Labeled-3](/images/sentinel/sentinel-labeled-3.png) ### Bottom [View in fullsize](/images/sentinel/sentinel-labeled-4.png){:target="_blank"} ![Sentinel-Labeled-4](/images/sentinel/sentinel-labeled-4.png) ### Sentinel Mechanical Drawings #### Sentinel 2D Drone Dimension Drawings ![rb5-drone-2D-dims.png](/images/rb5/rb5-drone-2D-dims.png) #### Sentinel 3D STEP [3D STEP Sentinel](https://storage.googleapis.com/modalai_public/modal_drawings/Sentinel_Drone_STEP.zip) ### Sub-component Dimensions | PCB | H x W x D | Weight | Drawings | |-------------------------------------------------|------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | VOXL 2 Autopilot (M0054) | 70mm x 36mm | 16g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0054_VOXL2_PVT_SIP_REVA.step) | | ModalAI 5G Modem Carrier Board (M0067 or M0090) | 67.5 x 36 x 10mm | 12.8g | [2D Drawing](https://storage.googleapis.com/modalai_public/modal_drawings/M0067-mechanical-drawing%20v1.pdf)
[3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0067_VOXL2_5G_MODEM_DEBUG_REVA_S1_P9.step) | | Quectel RM502Q-AE | 52× 30 × 2.3mm | 8.7g | [Mechanical Drawing](https://storage.googleapis.com/modalai_public/modal_drawings/Quectel_RM500Q-AERM502Q-AE_Hardware_Design_V1.0.pdf) | | Landing Skids | | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/RB5_landing_gear_skid_v3.STEP) | | Landing Skid Mount | | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/RB5_landing_gear_mount.STEP) | ### Core Components Part Numbers #### Reference Drone Part Numbers | ModalAI Part Number | Description | |------------------------|-------------------------------------------------------| | MRB-D0006-4-V1-C11-M3 | Sentinel Reference drone with Microhard Carrier Board | | MRB-D0006-4-V1-C11-M7 | Sentinel Reference drone with 5G Modem (Quectel) | | MRB-D0006-4-V1-C11-M13 | Sentinel Reference drone with 2.4/5ghz WiFi Dongle | ## Sentinel PX4 Tuning Parameters Our engineers have spent a lot of time finely tuning this vehicle, and the [parameters are available here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) ## Sentinel Motor Configuration The propellers have arrows on them as to which way they should turn. Motor configuration in the image below. ![voxl-m500-motor-configuration.png](/images/m500/voxl-m500-motor-configuration.png) ## Sentinel Connectivity for Remote Operation | Connectivity Option | Use Case | Details | |---------------------|------------------------------------------------------------------|-----------------------------------------------------------| | Spektrum R/C | Manual remote control of the vehicle | [Configure](/configure-rc-radio/) | | WiFi | Short range (~100m) IP connectivity for debug and nearby flights | [Setup](/wifi-setup/) | | 5G LTE | Long Range, BVLOS operation | [Setup](/5G-Modem-user-guide/) | --- Source: https://docs.modalai.com/sentinel-connectors/ # Sentinel Board Connectors Sentinel's flight deck is built on VOXL 2 — see the [VOXL 2 Connectors datasheet](/voxl2-connectors/) for all board-level connector pinouts. --- Source: https://docs.modalai.com/sentinel-spektrum-bind-board/ # Sentinel Spektrum Bind Board ## Overview The Sentinel Spektrum Bind Board is a hardware solution that allows software binding of a Spektrum radio receiver directly to your RB5 Flight or Voxl2 (Sentinel) based drone solution. It creates a seamless software experience for binding without all the hassle of a binding plug or other plug removal/insertion methods. This accesory is specific to Spektrum and will not work with other R/C receivers. ## Block Diagram This diagram shows both options for RB5 Flight and Sentinel installation options. ![M0094-BD](/images/other-products/cables/m0094-diagram.png) ## Pin Tables In both options, the 3-position JST SHR connector matches the Spektrum pinout as follows: | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | VREG_3V3_RC | Spektrum Power | | 2 | GND | Spektrum GND | | 3 | RC_UART_RX | Spektrum UART TX | The reason for the different configurations with M0094 illustrated here is that the RB5 Flight platform has a dedicated GNSS/Mag connector (J19), whereas Voxl2 (Sentinel) has a multi-purpose connector J19 that has GNSS/Mag + R/C added, so the cable assembly is a little more complicated. # RB5 Configuration The RB5 configuration mates with J12 and J10 simultaneously. J10 Mate: "P3" 8-pin JST GHR plug | Pin | Net | M0094 Connection | | ----- | ------- | ------- | | 1 | VREG_3V3 | J1 Pin 4 | | 2 | NC | No Connect | | 3 | NC | No Connect | | 4 | NC | No Connect | | 5 | NC | No Connect | | 6 | GPIO_46 | J1 Pin 5 | | 7 | NC | No Connect | | 8 | NC | No Connect | J12 Mate: "P1" 4-pin JST GHR plug | Pin | Net | M0094 Connection | | ----- | ------- | ------- | | 1 | VREG_3V3_RC | J1 Pin 1 | | 2 | NC | No Connect | | 3 | RC_UART_RX | J1 Pin 3 | | 4 | GND | J1 Pin 6 | # Sentinel (Voxl2) Configuration The Sentinel configuration mates with J19 and J10 simultaneously. J10 Mate: "P3" 8-pin JST GHR plug | Pin | Net | M0094 Connection | | ----- | ------- | ------- | | 1 | VREG_3V3 | J1 Pin 4 | | 2 | NC | No Connect | | 3 | NC | No Connect | | 4 | NC | No Connect | | 5 | NC | No Connect | | 6 | GPIO_46 | J1 Pin 5 | | 7 | NC | No Connect | | 8 | NC | No Connect | J19 Mate: "P1" 12-pin JST GHR plug | Pin | Net | M0094 Connection | | ----- | ------- | ------- | | 1 | VDC_5V_LOCAL | No M0094, Pass to GNSS Module | | 2 | GNSS_UART_TX | No M0094, Pass to GNSS Module | | 3 | GNSS_UART_RX | No M0094, Pass to GNSS Module | | 4 | MAG_SCL | No M0094, Pass to GNSS Module | | 5 | MAG_SCDA | No M0094, Pass to GNSS Module | | 6 | GND | Pass to GNSS Module | | 7 | NC | No Connect | | 8 | NC | No Connect | | 9 | VREG_3V3_RC | J1 Pin 1 | | 10 | NC | No Connect | | 11 | RC_UART_RX | J1 Pin 3 | | 12 | GND | J1 Pin 6 | --- Source: https://docs.modalai.com/sentinel-skids/ # Sentinel Landing Skid Removal/Installation 1. TOC ## Landing Skid Removal If you wish to remove or replace Sentinel's landing skids due to damage or to simply use a different solution, follow these steps: 1. Use a PH0 bit to unscrew one of the top screws in the assembly ![sentinel-skids-1](/images/sentinel/sentinel-skids-7.jpg) 2. Pull the screw out of the hole once the nut has been removed and leave the washer on the screw for safe keeping ![sentinel-skids-1](/images/sentinel/sentinel-skids-8.jpg) 3. The nut will likely fall out the back of the landing, keep track of this nut as you will need it for reinstallation ![sentinel-skids-1](/images/sentinel/sentinel-skids-4.jpg) 4. If the nut stays in the skid mount, you can leave it in (it makes reinstallation easier). If it falls out or is dislodged, set it aside for reinstallation ![sentinel-skids-1](/images/sentinel/sentinel-skids-3.jpg) 5. Unscrew the bottom screws. If you do not apply heavy pressure against the screw during removal it is possible the nut will not fall out the back of the skid mount ![sentinel-skids-1](/images/sentinel/sentinel-skids-9.jpg)\ ## Landing Skid Install To reinstall the skids, follow these steps: 1. Make sure you have: - QTY.8 M2 x 0.4mm, 8mm long screws (M10000165) - QTY.8 M2 washers (M10000166) - QTY.2 2.5in landing skids (MMP-D0004-1-09) - QTY.8 M2 x 0.4mm nuts (M10000181) ![sentinel-skids-1](/images/sentinel/sentinel-skids-1.jpg) 2. Orient the skid: The long end of the skid goes towards the back of the drone towards the battery plug and GPS ![sentinel-skids-1](/images/sentinel/sentinel-skids-6.jpg) 3. Then, put a washer on the screw, apply Loctite to the end of the screw, and put it through the Skid you are attaching ![sentinel-skids-1](/images/sentinel/sentinel-skids-11.jpg) 4. With the screw through the skid, attach it to the corresponding hole on the Skid mount - If the nut is still in the skid, simply fasten the screw into the nut - If the nut is no longer in the skid, using a PH0 driver bit, tighten the screw into the nut ![sentinel-skids-1](/images/sentinel/sentinel-skids-12.jpg) 5. As you tighten, leave some wiggle room to help align the other screws. Tighten them down once all four are in place. Use finger tight tension, no need to overtighten. ![sentinel-skids-1](/images/sentinel/sentinel-skids-13.jpg) 6. If the nut does not align with the screw, you have a few options: - While continuing to press on the nut with your finger, keep light pressure on the screw with the phillips driver and spin the driver counter clockwise one or two rotations. While doing that, you may feel the nut align itself perpendicular to the screw; if you feel this, spin the driver clockwise a few rotations in an attempt to properly mate the screw with the nut. Some times you may have to repeat that process one or two times before you have success. - If the nut has maneuvered itself out of place, you may need to take the screw out and re-seat the nut into the mount using tweezers/fingers. Re attempt to mate the screw with the nut - If you are having trouble and can recruit some help with holding the drone: try pushing the screw all the way through the hole, grab the nut with some tweezers, lower it onto the protruding screw, and fasten it into place ![sentinel-skids-1](/images/sentinel/sentinel-skids-14.jpg) --- Source: https://docs.modalai.com/delta-wing-unboxing/ # Delta Wing Unboxing The SoloGood Delta Wing is a styrafoam ABS delta wing with the following dimensions: ``` Wingspan: 69 cm Height: 8.8 cm Length: 41.5 cm ``` The body space on the delta wing includes: ``` Battery compartment: 175mm*75mm*55mm ESC compartment: 70mrn*38mm*20mm Camera: 20mm*21mm*30mm ``` Maximum flying speed is <27km/h with a endurance range of 70 minutes depending on battery/motor combination. Takeoff weight post build with all components ranges from 350g - 750g. The delta wing comes un-built in the following packaging: ![unboxed_delta_wing.jpg](/images/delta-wing/delta_wing_components.jpg) Unboxed - it has the following components: ![unboxed_delta_wing.jpg](/images/delta-wing/unboxed_delta_wing.jpg) The kit does NOT include motors, esc's, batteries, flight controllers, or servos. Furthermore the following is recommended to drive flight: ``` Recommend Power: 2205/2350kv Recommend Battery: 3-4s like 3-4S 1550 -2200MAH / 6S 1300-1550MAH Recommend :ESC: 35A 3S 6inch Biblades / 4S 5inch Biblades ``` Purchasing of the delta wing can be found here: https://www.amazon.com/Diatone-Airplane-Aircraft-Electric-Beginner/dp/B09HTNVVTC --- Source: https://docs.modalai.com/delta-wing-build-guide/ # Delta Build Guide The following is a step by step manual as to how to build the delta wing to fly with the ModalAI VOXL 2 and VOXL2-IO breakout board. Hardware required for the build is the following: ``` 1. SoloGood Delta Wing 2. VOXL 2 3. VOXL 2 IO breakout board 4. Camera Interposer 5. IMX 412 + MIPI 6. Microhard Daughter Board + Microhard + Antennas 7. Fan 8. 3D Printed holster for ModalAI Components 9. M10N GPS 10. Airspeed sensor 11. Distance Sensor (lidar) 12. 35 AMP ESC 13. Motor 14. Propellor 15. Servos 16. iFixIT Tool Kit or something similar 17. Super Glue (Fast Dry) 18. Velcro or two sided tape 19. X-ACTO/Precision Knife ``` Below is the step by step to initially assemble the delta wing. Be prepared to use a lot of super glue! Proceed to remove the wings from the box as well as the winglets that attach to the side of the wings: ![wings_pre_glue](/images/delta-wing/wings_pre_glue.jpg) Proceed to lather the ends of the wing with the super glue and attach and press firmly the winglets to adhere to the super glued wing - result should look as follows: ![wings_post_glue](/images/delta-wing/wings_post_glue.jpg) Once the wings have dried, we can move onto the fuselage - proceed to grab the top and bottom pieces of the fuselage: ![fuselage_pre_glue](/images/delta-wing/fuselage_pre_glue.jpg) At this point we can remove the support styrafoam from the top piece of the fuselage: ![fuselage_top_post_support](/images/delta-wing/fuselage_top_post_support.jpg) We can not lather the top or bottom of the fuselage with glue and then stick the two pieces together and hold till glue has dried: ![fuselage_post_glue](/images/delta-wing/fuselage_post_glue.jpg) Once the fuselage is dried, we can grab the plastic motor mount: ![fuselage_pre_motor_mount](/images/delta-wing/fuselage_pre_motor_mount.jpg) Lather the end of the fuselage with the super glue and proceed to stick the plastic motor mount on the end and hold till dry: ![fuselage_post_motor_mount](/images/delta-wing/fuselage_post_motor_mount.jpg) Now we can focus on the top piece that covers the components internally - grab the top hat and the plastic fin: ![top_pre_fin](/images/delta-wing/top_pre_fin.jpg) Proceed to place glue on the inside under belly of the top hat and then mount the fin from the bottom - result should look like this: ![top_post_fin](/images/delta-wing/top_post_fin.jpg) At this point we can start adding the required sensors, servos, motors, etc. to the fixed wing. At this point we will be adding the servos to each of the wings - top and bottom view are below: ![wings_with_servos](/images/delta-wing/wings_with_servos.jpg) Once the wings have the servos places and the wires on the bottom from the servos have been places into the thin encasing on the belly of the wings, proceed to take the 3-pin endpoint from the servo and place it through the hole on the side of the fuselge - you can do this for both wings. ![wings_fuselage_servo](/images/delta-wing/wings_fuselage_servo.jpg) At this point we can place super glue between the wings and the side of the fuselage and force the pieces all together. Hold together for a minute until there is a strong grip between the wings and fuselage. ![wings_post_glue_to_fuselage](/images/delta-wing/wings_post_glue_to_fuselage.jpg) Now place the delta wing down as we will be focusing on the VOXL 2, VOXL 2 IO, Microhard Daughter Board, Cooling Fan, Camera Interposer, PWM Breakout Board, Airspeed Sensor, and GPS. The following steps will require a 3D printer and or the pieces/holsters to be pre printed. In order to find the CAD design of the board, please follow the links here: 1. Fixed Wing VOXL 2 [Case](https://drive.google.com/file/d/1H6nyrZQ95JarNN_wWGAufKtjUk5KJ4D1/view?usp=sharing) 2. Fixed Wing Nose Case [Bottom](https://drive.google.com/file/d/10256Y4rUHRf4GcxBjdPQXJSyYuzy4qGx/view?usp=sharing) 3. Fixed Wing Nose Case [Top](https://drive.google.com/file/d/1EKQKMJkeSPBC0C9xfJcffPzd_4MJ-Zxl/view?usp=sharing) 4. Fixed Wing VOXL 2 Microhard [Case](https://drive.google.com/file/d/1ucxUPVfuZFlROTWHx6ykuSoPocT0sP3X/view?usp=sharing) 5. Fixed Wing M10N GPS Case [Bottom](https://drive.google.com/file/d/19gAELj2NLQW5XTEOD4io0HXxTpXH6PAR/view?usp=sharing) 6. Fixed Wing M10N GPS Case [Top](https://drive.google.com/file/d/1HsXlcIEaXDYtWaAIoqoOmGXXgJfEEv-g/view?usp=sharing) Once all the above have been printed, together it should look like this: ![3D_delta_wing_prints](/images/delta-wing/3D_delta_wing_prints.jpg) ![gps_and_mount](/images/delta-wing/gps_and_mount.jpg) Proceed to place the hardware to look like the following: ![pcbs_unmounted](/images/delta-wing/pcbs_unmounted.jpg) Once everything has been placed correctly, proceed to use M2 sized screws and nuts to tighten the PWM Breakout Board and the VOXL 2 IO board to the bottom of the holster. Once done you can place the top mount case over the VOXL 2 + Microhard + Cooling fan and screw that down as well (Note the fan can be screwed directly into the holes to secure it in place): ![pcbs_mounted](/images/delta-wing/pcbs_mounted.jpg) Note the above picture also shows the camera mounts - we will address that later in the instructions. At this point we can flip to the belly of the print once everything has been mounted and place a two camera interposer on J7. ![bottom_pcb_mounted](/images/delta-wing/bottom_pcb_mounted.jpg) Once secured, we can now start placing the JST wires to connect everything electronically - we will need JSTs to connect the VOXL 2 to the VOXL 2 IO, the VOXL 2 to the airspeed and gps, and then a JST to attach the VOXL 2 IO to the PWM Breakout board. JST Number 1: 12 Pin JST endpoint that plugs into J19 on the VOXL 2 that goes to a 6 pin JST for the GPS and a 4 Pin JST for the airspeed JST Number 2: 4 Pin JST endpoint that plugs into J18 on the VOXL 2 and goes into another 4 pin JST on the VOXL 2 IO JST Number 3: 10 Pin JST that goes from the VOXL 2 IO to another 10 pin JST that goes into the PWM Breakout board. The servo 3-pin leads plug into the M0022 PWM breakout board, whose 5V servo rail is supplied by the UBEC, not by the VOXL 2 IO board. You can follow the wiring guide here: [D0015](/voxl2-D0015/) Once everything is soldered up and connected, it should look like the following: ![gps_voxl2_airspeed_wired](/images/delta-wing/gps_voxl2_airspeed_wired.jpg) ![pwm_breakout_io_connection](/images/delta-wing/pwm_breakout_io_connection.jpg) We will now be focusing on the motor, esc, servos, and camera mounts. Proceed to grab you 2205 KV based motor and your 35 AMP 2-6S esc and solder the two together: ![motor_unmounted_with_esc](/images/delta-wing/motor_unmounted_with_esc.jpg) At this point, we can now force the esc and XT60 endpoint through the hole in the backside of the delta wing in order to get the motor mounted onto the backside where we originally mounted the plastic holder to the frame. ![motor_mounted_to_uav](/images/delta-wing/motor_mounted_to_uav.jpg) ![motor_mounted_with_esc](/images/delta-wing/motor_mounted_with_esc.jpg) Now that the motors and esc is mounted - we can finish up the servos which should have already been mounted into the wings. We are now going to take the fish hook looking plastic piece and place it into the flaps of the wing. We then can take the long metal wire and fish it through the holes into servo stand: ![servos_mounted_pre_felt](/images/delta-wing/servos_mounted_pre_felt.jpg) Once this is done, proceed to place the felt topper onto the wing (this will not effect flight if you do not do this part for easier access to the servos down the line): ![servos_post_mounting_with_felt](/images/delta-wing/servos_post_mounting_with_felt.jpg) Now take the two 3D printed front pieces for the camera mount and glue the two together with the IMX412 placed in the center and the FRAMOS at the top (to ensure that the camera is placed in the upright position - MIPI endpoint should be on the top!): ![camera_glued_unmounted](/images/delta-wing/camera_glued_unmounted.jpg) ![camera_pre_mounted_to_uav](/images/delta-wing/camera_pre_mounted_to_uav.jpg) We can then mount this piece onto the delta wing via some super glue: ![camera_mounted](/images/delta-wing/camera_mounted.jpg) At this point we can now start assembling the internals of the fixed wing - proceed to take the 3D printed holster with all the I/O mounted, place some double sided VBS tape on the bottom of the case where the 3D print material is exposed, and then firmly press it down into the body of the delta wing near the center. Depending on the size of your battery and where you would like to place it, you can either position the mount further towards the nozzle or back towards the motor: ![uav_interal_with_voxl2](/images/delta-wing/uav_interal_with_voxl2.jpg) ![internals_best_view](/images/delta-wing/internals_best_view.jpg) We will then glue the cover over the ESC section to ensure good airflow: ![uav_post_esc_cover](/images/delta-wing/uav_post_esc_cover.jpg) At this point now, we can finish up the top piece of the fuselage by glueing the magnets provided in the kit to the holes made: ![top_uav_with_magnets](/images/delta-wing/top_uav_with_magnets.jpg) At this point, you can place the opposite (attracted side of magnet) to the holsters inside the fuselage as well and then crown your king! ![top_uav_mounted](/images/delta-wing/top_uav_mounted.jpg) Last thing to do is mount the antennas from the microhard to the wings - proceed to clip the U.FL connectors to the microhard and using vbs tape - tape the antennas to the wings: ![microhard_antenna_mounting](/images/delta-wing/microhard_antenna_mounting.jpg) At this point you should have a built out and ready to program/configure delta wing! As for placement of the power source, please leverage a 4-Cell LiPO that can be placed in the FRONT of the fuselage. --- Source: https://docs.modalai.com/delta-wing-configuration/ # Delta Build Configuration D0015 (Delta Wing) is supported by the configurator: run `voxl-configure-sku --wizard` (select the fixed-wing family / MRB-D0015), then `voxl-configure-mpa`, and the steps below can be skipped. The manual steps remain for reference and custom setups. The following is a step by step guide as to how to update the VOXL 2 and all required IO in order to fly the delta wing using the VOXL 2 via voxl-px4 and a microhard connection. In order to setup voxl-px4 to run fixed wing - proceed to boot the VOXL 2 and either ADB shell into the board, or ssh into it via the microhard. once inside the linux environment - the user can now run the following to configure PX4: ```bash voxl-configure-px4 d0015 ``` This will configure PX4 to start the required drivers in order to fly the fixed wing in position flight with the correct airspeed sensor, distance sensor, communication methods, etc. Once voxl-px4 has been setup - we can move over to camera server where we will have both an imx412 and a tracking camera (agnostic of OV7251 vs AR0144) in J7 upper and lower - configure camera server for this combination using camera configuration 20, the D0015 default (set automatically by the configurator). Proceed to then run `voxl-configure-cameras 20` and then you should be good to go from the camera side! At this point now we can configure the other services which will not be as manual: ``` 1. voxl-cpu-monitor: proceed to run `voxl-configure-cpu-monitor enable` 2. voxl-vision-hub: proceed to run `voxl-configure-vision-hub factory_enable` 3. voxl-imu-server: proceed to run `voxl-configure-imu-server` and select imu_apps as the main reference 4. voxl-streamer: proceed to run `voxl-configure-streamer enable` 5. voxl-mavcam-manager: proceed to run `voxl-configure-mavcam-manager enable` 6. voxl-qvio-server: proceed to run `voxl-configure-qvio-server enable` - this one will be more manual as you will need to first calibrate your tracking camera 7. voxl-mavlink-server: proceed to run `voxl-configure-mavlink-server enable` ``` Once the above have been configured, proceed to do a hard reboot on your VOXL 2 and all the IO. The next time you boot the system you should then be able to connect to the VOXL 2's instance of PX4 via QGC and update the parameters with the preset delta wing parameters provided in the [voxl-px4-params repository](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/tree/master/params). Now once that is done, proceed to do one last hard reboot on the entire delta wing and on the next reboot, you should be off to the races capable of flying position based flight with the delta wing and streaming video back to QGC over the microhard! It is suggested to wire up a traditional RC controller over USB to your QGC instance so it is easier to fly as fixed wings arent traditionally flown with spring loaded controllers. --- Source: https://docs.modalai.com/legacy/ # End of Life (EOL) Development Drones This section of the documentation contains details on legacy development drone products which are End of Life, and no longer for sale --- Source: https://docs.modalai.com/starling/ # Starling ## Overview Starling is our flagship development drone for both indoor and outdoor flight. ![Starling](/images/starling-v2/starling-v2-hero-2.png) ### Video Overview ### Starling Running voxl-mapper --- Source: https://docs.modalai.com/starling-hardware-overview/ # Starling Hardware Overview This section contains an overview of the hardware components of the Starling Development Drone. ## Table of Contents 1. TOC --- For technical details, see the [datasheet](/starling-datasheet/) page. > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* ## Hardware Overview Video ## Development Kit Contents Starling is available in a variety of [kits](https://www.modalai.com/products/starling-2-max) depending on what you have and need. Shown here is the `MRB-D0005-4-V2-C6-M22-K3` (not shown is the carrying case). ![MRB-D0005-4-V2-C6-M22-K3](/images/starling-v2/MRB-D0005-4-V2-C6-M22-K3.jpg) | Callout | Description | PNs | |--- |--- |--- | | | Development kit as shown above (includes all below and case) | MRB-D0005-4-V2-C6-M22-K3 | | A | Starling Drone, WiFi | MRB-D0005-4-V2-C6-M22 | | B | Starling Propellors (4726FM) (QTY4) | M10000302 | | C | Starling Propellor Clips (QTY4) | M10000581 | | D | 2S VTC6 batteries XT30 (QTY2) | M10000538 | | E | IFlight Cammando 8 Radio Transmitter, ELRS 915MHz | M10000563 | | F | Power Supply, 12V 3A, XT60 with XT30 adapter | MPS-00005-1, M10000155 | ## Components ![MRB-D0005-4-V2-C6-M22-callouts-a](/images/starling-v2/MRB-D0005-4-V2-C6-M22-callouts-a.jpg) | Callout | Description | PN | |--- |--- |--- | | A | VOXL 2 | MDK-M0054-1 | | B | VOXL 4-in-1 ESC | MDK-M0117-1 | | C | Barometer Sheild Cap | M10000533 | | D | ToF Image Sensor (PMD) | MDK-M0040 | | E | Tracking Image Sensor (ov7251) | M0014 | | F | Hires Image Sensor (IMX214) | M0025-2 | | G | AC600 WiFi Dongle | AWUS036EACS | | H | GNSS GPS Module & Compass | M10-5883 | | I | 915MHz ELRS Receiver | BetaFPV Nano RX | | J | USB C Connector on VOXL 2(not shown) | | | K | VOXL Power Module | MCCA-M0041-5-B-T | | L | 4726FM Propellor | M10000302 | | M | Motor 1504 | | | N | XT30 Power Connector | |
[Next: Starling Datasheet](/starling-datasheet/){: .btn .btn-green } --- Source: https://docs.modalai.com/starling-datasheet/ # Starling Datasheet ## Specifications | Component | Specification | |-----------------|----------------------------------------------------------------------------------------| | Autopilot | [VOXL2](/voxl-2/) | | Take-off Weight | 275g (172g without battery) | | Diagonal Size | 211mm | | Flight Time | >30 minutes | | Motors | 1504 3000kv | | Propellers | 120mm | | Frame | 3mm Carbon Fiber | | ESC | [ModalAI VOXL 4-in-1 ESC V2](/voxl-esc-datasheet/) | | GPS | UBlox M10 | | RC Receiver | 915mhz ELRS | | Power Module | [ModalAI Power Module v3 - 5V/6A](/power-module-v3-datasheet/) | | Battery | Sony VTC6 3000mah 2S, or any 2S 18650 battery with XT30 connector | | Height | 83mm | | Width | 187mm (Props folded) | | Length | 142mm (Props folded) | ## Hardware Wiring Diagram [![D0005-V2-compute-wiring](/images/starling-v2/D0005-compute-wiring-e.jpg)](/images/starling-v2/D0005-compute-wiring-e.jpg) [Diagram draw.io Source](https://gitlab.com/voxl-public/support/drawings/-/blob/master/D0005/D0005-compute-wiring.drawio) ## 3D STEP [Starling 3D STEP](https://downloads.modalai.com) ## Add-On Board The add-on board used on this vehicle has an I2C, UART and GPIOs along with the USB interface. See [datasheet](/usb2-type-a-breakout-add-on/) for pinouts. --- Source: https://docs.modalai.com/m500/ # M500 The M500 is an A fully assembled and calibrated Development Drone for PX4 GPS-Denied Navigation and Obstacle Avoidance. It is Pre-configured for GPS-denied navigation using Visual Inertial Odometry (VIO). ![voxl-m500](/images/m500/m500-shopify.jpg) --- Source: https://docs.modalai.com/voxl-m500-quickstart/ ## M500 Quickstart How to get started with M500
## Required Materials To follow this user guide, you'll need the following: - Spektrum Transmitter - e.g. SPMR6655, SPM8000 or SPMR8000 - Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work - Buy Here - LiPo 4S battery with XT60 connector - Buy Here - Host computer with: - QGroundControl 3.5.6+ - Wi-Fi - a terminal program ### What's in the Box Included in the box are: - VOXL m500 with Spektrum receiver (note: the system supports FrSky receivers like X8R, see [RC Radio Setup](/voxl-m500-user-guide-pre-flight-setup/#rc-radio-setup)) - 10" props - USB-to-JST Cable (not used in this guide) - Spare landing gear mounting screws ![m500-out-of-box](/images/m500/m500-out-of-box.jpg) --- # M500 Demos ## M500 LTE Control Demo How to control M500 over LTE, [Instructions](/4G-LTE-Modems/)
--- ## M500 GPS to Vision Transition for GPS-denied Navigation How to transition to vision-based, GPS-denied Navigation --- ## M500 Hover While Being Pushed Around with no GPS How to hover in place in a GPS-denied environment using only Visual Inertial Odometry. --- ## M500 Camera Gimbal Demo Demo of M500's optional Camera Gimbal --- ## M500 MAVROS Demo --- Source: https://docs.modalai.com/voxl-m500-user-guide/ # M500 User Guides ![voxl-m500](/images/m500/m500-shopify.jpg) [First Step: Unboxing](/voxl-m500-getting-started/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-getting-started/ # VOXL m500 User Guide This guide will walk you from taking the VOXL m500 out of the box and up into the air! For technical details, see the [datasheet](/m500-datasheet/). > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* --- ## Overview ![m500-out-of-box](/images/m500/m500-out-of-box.jpg) ### Required Materials To follow this user guide, you'll need the following: - Spektrum Transmitter - e.g. SPMR6655, SPM8000 or SPMR8000 - Any Spektrum transmitter with DSMX/DSM2 compatibility will likely work - Buy Here - LiPo 4S battery with XT60 connector - Buy Here - Host computer with: - QGroundControl 3.5.6+ - Wi-Fi - a terminal program ### What's in the Box Included in the box are: - VOXL m500 with Spektrum receiver (note: the system supports FrSky receivers like X8R, see [RC Radio Setup](/voxl-m500-user-guide-pre-flight-setup/#rc-radio-setup)) - 10" props - USB-to-JST Cable (not used in this guide) - Spare landing gear mounting screws [Next Step: Vehicle Components](/voxl-m500-components/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-components/ --- ### Vehicle Components The following images give an overview of the vehicle components. ![vehicle-overview-front-144-1024.jpg](/images/m500/vehicle-overview-front-144-1024.jpg) ![vehicle-overview-back-zoom-144-1024.jpg](/images/m500/vehicle-overview-back-zoom-144-1024.jpg) ![vehicle-overview-right-144-1024.jpg](/images/m500/vehicle-overview-right-144-1024.jpg) ![vehicle-overview-left-144-1024.jpg](/images/m500/vehicle-overview-left-144-1024.jpg) [Next Step: Connect Network](/voxl-m500-user-guide-connect-network/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-user-guide-connect-network/ # M500 Connect Network --- ## Connecting qGroundControl over WiFi For setup and configuration of your M500 you must **Remove the Propellers** for safety. ### Power on VOXL and Flight Core Now power up the VOXL and Flight Core on the M500. This can be done by connecting a [5V Power Supply](https://www.modalai.com/products/ps-xt60) to the power module's barrel jack. Or you can plug in a 4S battery: To install a 4S battery, slide into the body as shown. There is a stop at the front of the vehicle that will prevent the battery from sliding too far forward. The battery should be pressed all the way in until it hits the stop for a consistent center of mass. Power on the vehicle by connecting the battery to the M500's XT60 connector. ![vehicle-battery-2-144-1024.jpg](/images/m500/vehicle-battery-2-144-1024.jpg) ### Connect to VOXL Access Point From the factory, the vehicle will power up as a WiFi Access Point with a name like `VOXL:XX:XX:XX:XX:XX`). You can connect to it with a password of `1234567890`. ![voxl-ap-list.png](/images/m500/voxl-ap-list.png) ![voxl-ap-password.png](/images/m500/voxl-ap-password.png) Once connected to the VOXL AP, you'll get an IP address from VOXL via DHCP, locate the address, in my case it's `192.168.8.51`. ![voxl-ap-ip-address.png](/images/m500/voxl-ap-ip-address.png) More details can be found at the [VOXL WiFi quickstart page](/wifi-setup/). ### Next Steps There are roughly two paths you could take: - Check out PX4 and Fly [Next Step: Connect to GCS](/voxl-m500-user-guide-px4/){: .btn .btn-green} - Skip to Machine Vision features to mess around at your desktop [Next Step: Use VIO](/voxl-m500-user-guide-using-vio/){: .btn .btn-green} --- Source: https://docs.modalai.com/voxl-m500-user-guide-px4/ 1. TOC ## Connect m500 to PX4 ### SSH into VOXL The VOXL's IP address by default is `192.168.8.1`. SSH into VOXL using the `root` user with password `oelinux123`. More details available at the VOXL SSH quickstart page. ![voxl-ssh.png](/images/m500/voxl-ssh.png) ### Edit voxl-mavlink-server.conf VOXL needs to know the IP address of your computer running qGroundControl. This is set in the 'qgc_ip' field of the `/etc/modalai/voxl-mavlink-server.conf` file on VOXL. This will inform the `voxl-mavlink-server` systemd service to send MAVLink data to our computer. Run the following command and update the `qgc_ip` field to match your computer's IP. ```bash yocto:/home/root# vi /etc/modalai/voxl-mavlink-server.conf ``` ![voxl-vi-cmd-line.png](/images/m500/voxl-vi-cmd-line.png) Hit `i` to enter edit mode, use arrow keys to navigate to the `qgc_ip` field and edit there. To save, hit `esc` then `:wq` to write and quit. ![voxl-vi-edit.png](/images/m500/voxl-vi-edit.png) If you put VOXL on your own WiFi or LTE network you will have to do the same procedure. For more information on this config file and the options available see the [voxl-vision-hub manual](/voxl-vision-hub/). ### Restart the voxl-mavlink-server Service To reset the `voxl-mavlink-server` service and reload the configuration, run the following command: ```bash yocto:/home/root# systemctl restart voxl-mavlink-server ``` Note this will also reset the Visual Inertial Odometry (VIO) algorithm and reset VIO's origin to wherever the drone is when you reset the service. ## Connect m500 to QGroundControl ### Confirm Connection with QGroundControl After the previous step is completed, the vehicle should automatically connect to QGroundControl ![voxl-qgc-connected.png](/images/m500/voxl-qgc-connected.png) ## Connecting LTE Modems For more information on setting up Microhard or LTE modems on your m500, follow the instructions [Here](/modems/) [Next Step: Pre Flight Setup](/voxl-m500-user-guide-pre-flight-setup/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-user-guide-pre-flight-setup/ 1. TOC # m500 Pre-Flight Setup ## Sensor Calibration VOXL-M500 flight sensors are delivered pre-calibrated from the factory. PX4 will warn you if your compass needs to be re-calibrated depending on your location and environmental conditions. If so, or if you'd like re-calibrate all sensors, follow the [px4 sensor calibration precedure](/px4-calibrate-sensors/). ## RC Radio Setup Now you need to bind and calibrate your DSM RC radio through the qGroundControl interface. These instructions focus on the default receiver using Spektrum DSMx. For other radio types see the [Flight Core Radios Page](/flight-core-radios/) and [Flight Core Connections Page](/flight-core-connections/#rc-receiver) for more details. ### Bind to Radio #### Spektrum (Default on m500) Instructions on how to bind a Spektrum radio can be found [here](https://docs.px4.io/main/en/config/radio.html). #### FrSky Video tutorial on how to pair an FrSky X8R [(Youtube)](https://www.youtube.com/watch?v=1IYg5mQdLVI) ### Calibrate Radio Now follow the on-screen instructions to calibrate the range and trims of your radio. ![8-calibrate-radio.png](/images/voxl-sdk/qgc/8-calibrate-radio.png) ### Confirm RC Settings Obviously every user will want to use different flight modes and different switch assignments, but for getting started with VOXL and and Flight Core we suggest starting with something similar to this configuration and working from there. - "Flap Gyro" switch left of Spektrum Logo - Channel 6 - Up position: Manual Flight Mode - Middle Position: Position Flight Mode - Down Position: Offboard Flight mode - "Aux2 Gov" switch right of Spektrum Logo - Channel 7 - Up position: Motor Kill Switch Engaged - Down Position: Motor Kill Switch Disengaged (required to fly) Since we have a manual kill switch on the radio there is no need for the "safety switch" on the Pixhawk GPS module as so it is disabled in our params file in favor of the kill switch. ![9-flight-mode-config.png](/images/voxl-sdk/qgc/9-flight-mode-config.png) If you have a Spektrum DX6e or DX8 radio with a clean acro-mode model you can accomplish the above channel mapping by loading the following config file [https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/spektrum_dx8_config.params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/spektrum_dx8_config.params) Still confirm the mapping in qGroundControl before flight! [Next Step: First Flight](/voxl-m500-user-guide-first-flight/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-user-guide-first-flight/ 1. TOC # Sentinel First Flight > *Unmanned Aerial Systems (drones) are sophisticated, and can be dangerous. Please use caution when using this or any other drone. Do not fly in close proximity to people and wear proper eye protection. Obey local laws and regulations.* ## Preflight Checks Now disconnect the 5V power supply or battery you used during the configuration steps. Move the M500 to a safe location where you wish to fly and connect a battery for flight while the M500 is on the ground. The position and direction VOXL powers up in will dictate the origin and orientation of the Visual Inertial Odometry (VIO) coordinate frame, also known as LOCAL_POSITION_NED in PX4 terminology. VOXL will correct for any tilt due to non-level ground. ### Attitude Check Lift the vehicle and move it around, verify that the attitude reported in QGroundControl GUI looks and responds correctly. Try not to cover the tracking camera during this process. ![qgc_attitude_gui.png](/images/voxl-sdk/qgc/qgc_attitude_gui.png) ### VIO Data Validation We recommend your first flight be in position mode. See [Here](/voxl-m500-user-guide-using-vio/) for an overview. Make sure to validate VIO data before flying in position mode. ### Arming Vehicle Without Props With the propellers **off** arm the vehicle. - Set killswitch to off ("Aux2 Gov" switch down) - **Left** stick hold **down** and to the **right** Validate the motor rotation is as expected and the vehicle responds to throttling up momentarily. Disarm the vehicle: - **Left** stick hold **down** and to the **left** Correct rotation direction of motors: ![QuadRotorX.svg](/images/voxl-sdk/qgc/QuadRotorX-small.svg) ### Install Propellers Install the propellers following this orientation. Each motor shaft has a white or black top to indicate which propeller goes where. Note that the clockwise spinning propellers are reverse threaded to prevent loosening during flight. Ensure you tighten the propellers down tightly by hand or they may spin off when engaging the kill switch. ![vehicle-overview-props-144-1024.jpg](/images/m500/vehicle-overview-props-144-1024.jpg) ### Safety Check Before flying, make sure to conduct a thorough safety check:
  • Make sure all connectors and cabling is secure and not loose
  • Make sure none of the wires are cut, frayed, or damaged
  • If you have any connectivity add-ons, make sure the antennas are secure and are not loose
  • Make sure the SD and SIM cards have not popped out
  • Make sure the reciever is properly plugged in
  • Make sure the cameras are free of any grease, dust, or debris
  • Make sure the battery you are using is fully charged
  • Make sure the props are on correctly and that they are securly attached
### First Flight (Position Mode) You should be comfortable flying before proceeding! We recommend your first flight be in position hold (vio) mode outside with a GPS lock. For more information on flying in position mode, click the green button below for a vio overview. Once confortable with position mode, now safely fly in manual mode! No instructions here, this is an advanced mode and you should know what you are doing if you're flying! [Next Step: Using VIO](/voxl-m500-user-guide-using-vio/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-user-guide-using-vio/ # m500 VIO 1. TOC ## Enabling VIO for GPS-denied Navigation VIO on m500 is disabled by default. The service file for VIO can be started by configuring the qvio server: ```bash voxl-qvio-server-configure ``` It will show the following prompt: ```bash Would you like to enable the qvio service? This will start qvio as a background process Selecting yes will start the service, no will disable the service 1) yes 2) no ``` Enter ```1 (yes)``` to enable the service. This will immediately start VIO and enable it on boot. ## Using VIO In order to check if VIO is running you can check with the following command: ```bash systemctl status voxl-qvio-server ``` This will show you the status of the voxl-qvio-server. If the status displays ```active(runnning)``` then VIO is running and the VIO data is being sent to PX4. If the status displays ```failed``` then VIO failed to run. Make sure that camera index 2(downward facing tracking camera) and PX4 are running. To restart VIO, you can simply restart the service file: ```bash systemctl restart voxl-qvio-server ``` VIO should be restarted and the drone should be idle before any flight where VIO will be used. ## Viewing VIO Data VIO data can be viewed by manually running the voxl-inspect-qvio command: ```bash voxl-inspect-qvio ``` > A library path was set for this command, if you're command doesn't execute, inside your adb shell run ```ldconfig``` This will print out position data in the following format: ``` T_imu_wrt_vio (m) |Roll Pitch Yaw (deg)| state| error_code -0.11 -0.12 -0.06| -14.6 -30.1 -2.6| OKAY | ``` T_imu_wrt_vio represents your drones XYZ position in meters from your starting position. To validate this data, you can move the drone forwards and observe as the X value increases. ## Flying with VIO ### Confirm PX4 is Getting VIO Data Once voxl-qvio-server is running, confirm quality data before flight by opening the mavlink inspector and checking that X&Y values are non-zero in the ODOMETRY mavlink telemetry packets. ![voxl-vio-mavlink-inspector.png](/images/voxl-sdk/voxl-vio-mavlink-inspector.png) Alternatively, if your computer running QGroundControl has its volume turned up you should hear it announce the swap from "manual" to "position" mode when you flip the flight mode switch from up to middle. If VIO data is not being transmitted, the system will fall back to altitude mode and you will hear "position mode rejected, altitude flight mode". In this case, go back to manual flight mode (switch up) and wait a few more seconds for voxl-qvio-server to finish initializating. If this doesn't work, go back to "Viewing VIO Data" and reconfirm VIO is working with voxl-inspect-qvio. You can also check the voxl-qvio-server systemd service for indications of what might have gone wrong. We have a VIO parameters file helper [located here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/tree/master/helpers/rb5) to help easily configure into VIO or GPS mode. Specifically the **_EKF2_AID_MASK_** is often overlooked as an important parameter for VIO flight. Troubleshooting VIO Guide is [here](/flying-with-vio/#troubleshooting-vio) Some relevant PX4 parameters for VIO flight ``` # enable vision for height, position, and velocity, no GPS or barometer 1 1 EKF2_AID_MASK 280 6 1 1 EKF2_HGT_MODE 3 6 ## set MD to 0 to allow covarience from VIO to be used 1 1 EKF2_EV_NOISE_MD 0 6 ## Turn off EV Delay, VOXL will do proper timesyncing 1 1 EKF2_EV_DELAY 5.00 9 ## increase bias limit to prevent preflight check failure 1 1 COM_ARM_EKF_AB 0.01 9 ## Allow arming without GPS indoors 1 1 COM_ARM_WO_GPS 1 9 ``` ### Confirm Data is in the Right Coordinate Frame While looking at the ODOMETRY data in QGroundControl's Mavlink Inspector, observe the xyz data as you move the quadcopter around. Make sure it aligns with NED coordinate frame. If there is a coordinate system mismatch PX4 will initially take off then very quickly run away out of control. ### Take off in Position Mode It is safer to take off in Position Flight Mode than it is to flip to this mode mid-flight from Manual Flight Mode. Take off and land with the same instructions as listed above but this time with the Flight Mode switch in the middle position. The quadcopter should take off straight up and be much easier to control than in manual mode. Be ready to flip back to manual mode should anything go wrong. It is safer to flip to manual mode and land than to kill the motors mid-flight. Killing the motors mid-flight may result in the propellers loosening from the reverse-torque and flying straight up off the quadcopter. Only kill the motors after landing and spooling down the motors OR in a serious emergency. [Next Step: Gimbal User Guide](/voxl-m500-gimbal-user-guide/){: .btn .btn-green } --- Source: https://docs.modalai.com/voxl-m500-gimbal-user-guide/ # VOXL m500 Gimbal User's Guide **Note:** Due to difficulties sourcing low cost and available gimbals, ModalAI no longer has any **officially supported** gimbal solutions at this time ## Gimbal Version Summary As a convenience, versions of the VOXL-m500 are available to test out a gimbals. Links to the off the shelf gimbal source are provided along with any configuration software used. The factory setup used is provided here as well to help others adding gimbals of their own choosing. ## Notes On Gimbal Control Limitations ### No PX4IO/AUX Outputs The m500 houses the VOXL-Flight board, which only supports 8 PWM outputs, and not the additional AUX port. For this reason, the gimbal control is limited to using the RC AUX passthrough feature of PX4, providing pitch/yaw control of the gimbal only using RC AUX passthrough. ### Camera Trigger Bug Using QGroundControl, you can enable camera triggers on PWM outputs, like channels 5 and 6. At least in PX4 FW v1.10, there's an issue that causes these channels to get overwritten and zeroed out in some cases, causing problems with camera trigger. A non-warrantied work around is as follows. You'd need to update the `ROMFS/px4fmu_common/mixers/quad_x.main.mix` mixer and rebuild the firmware such that the file contains only this content: ```bash R: 4x 10000 10000 10000 0 ``` ### MAVSDK Behavior with MAVLink MAVSDK works by sending MAVLink commands to the flight computer in order to control the drone. When the drone is being operated by MAVSDK, it is placed in "offboard" mode. During operation in "offboard" mode, the drone is still able to respond to "RC_CHANNELS_OVERRIDE" commands if configured correctly. This allows the user to manually control gimbals using RC pass-though from the RC input to PWM outputs. Though "RC_CHANNELS_OVERRIDE" commands work at the same time as MAVSDK is operating, they do not work if an RC transmitter is connected. The flight computer will only respond to the first type of input it sees. If the flight controller receives "RC_CHANNELS_OVERRIDE" MAVLink messages first, then all RC transmitter input is ignored until the flight computer is rebooted. If the flight controller sees RC transmitter data before any "RC_CHANNELS_OVERRIDE" MAVLink messages are received then all "RC_CHANNELS_OVERRIDE" messages are ignored. MAVSDK can operate regardless of which form of input is used ("RC_CHANNELS_OVERRIDE" messages or RC transmitter input) but when in offboard mode, MAVSDK will cause the flight computer to ignore flight control input for thrust, yaw, roll and pitch. All other RC channel inputs will be honored if appropriate (such as an RC channel configured to be an RC pass-through.) ## MRB-MD001-2-01-G1 ### Overview Camera not included For this gimbal, the recommended camera is something like the `Mobius Pro Mini Action Camera` based on form factor alone. We are not qualifying this camera's performance, but based on size, weight and geometry, this camera has been shown to work well in our testing wih the gimbal referenced below. The `-G1` configuration consists of: | | Details | | --- | --- | | Gimbal | [HMG MA3D](https://hobbyking.com/en_us/hmg-ma3d-3-axis-brushless-gimbal-for-mobius-camera.html) | | Regulator | [D24V22F12](https://www.pololu.com/product/2855) | It is configured with the following: - Configuration Software: [Version 2.2b](https://www.basecamelectronics.com/files/v10/SimpleBGC_GUI_2_2b2.zip) from - **WARNING: DON'T UPGRADE THE CONTROLLER FIRMWARE. THIS APPEARS TO BRICK THE GIMBAL CONTROLLER** - Useful link for tuning: [AlexMos SimpleBGC tuning guide](https://aerialpixels.com/support/alexmos-brushless-gimbal-controller-simplebgc-tuning-guide/) ### Configuration #### Wiring Guide **TODO: Diagram** Gimbal control handled through the PWM output connector on VOXL-Flight `J1007`, Flight Core `J7` | Pin # | Signal Name | Connection | | --- | --- | --- | | 1 | 5VDC | NC | | 2 | PWM_CH1 | Motor 1 | | 3 | PWM_CH2 | Motor 2 | | 4 | PWM_CH3 | Motor 3 | | 5 | PWM_CH4 | Motor 4 | | 6 | PWM_CH5 | Gimbal Pitch/Tilt Control (3.3V) | | 7 | PWM_CH6 | Gimbal Yaw Control (3.3V) | | 8 | PWM_CH7 | Not used | | 9 | PWM_CH8 | Not used | | 10 | GND | NC | #### PX4 Param File For reference, a PX4 parameter for setting up a Spektrum DX8 with this gimbal using channels 8/7 to pitch/yaw and enabling outputs on bootup [can be found here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/helpers/gimbal_dx8_config.param) #### AUX Passthrough RC Channel The AUX1/2 passthrough RC channels are configured via `RC_MAP_AUX1` and `RC_MAP_AUX2`. These two channels can be configured to control pitch/yaw control on the gimbal from the RC transmitter. In the param file referenced above these are set to 8 and 7. #### Auxillary Outputs The [Quadrotor x](https://docs.px4.io/main/en/airframes/airframe_reference.html#quadrotor-x) airframe is supported by the m500, which provides us feed-through of RC AUX1 and AUX2 channels to `PWM_CH5` and `PWM_CH6` (pins 6 and 7 above) respectively. The AUX ouptut signals may be disarmed on bootup and only enabled after arming the vehicle which may not be desirable debugging. Setting the `COM_PREARM_MODE` mode to `2` (Always) enables the outputs on bootup (this is shown in the param file referenced above). #### PWM Signals The PWM signals `PWM_CH5` and `PWM_CH6` (pins 6 and 7 above) have a range of 1000 to 2000 us and are controlled by the `PWM_AUX_MIN5`/`PWM_AUX_MIN6` and `PWM_AUX_MAX5`/`PWM_AUX_MAX6` parameters. These are left as the PX4 default. Also by default, the output is 1500 us when disarmed, which is configured by `PWM_AUX_DISARMED`. ### Usage #### Power Up The gimbal receives power via the battery (not through the DC plug available on the power module). Upon attaching the battery, the gimbal will self stabilize in roughly 6 seconds. You can hold the camera in position during this time to stabilize into a starting point of your desire. #### Pitch / Yaw Control Using the DX4 transmitter with the params setup as above: | Channel # | Switch Type | Control | Notes | | :-: | --- | --- | --- | | 8 | Dial | Pitch | rotate to middle to have 0 degrees, rotate left/right to pitch up/down | | 7 | 3-Position | Yaw | middle position no movement, up yaw left, down yaw right | ### Streaming to QGroundControl #### Hardware Setup Streaming a video feed from a Mobius Pro Mini Action Camera to QGroundControl requires the use of a Flight Core or VOXL Flight. The following additional hardware is required to stream video from the camera through VOXL to QGroundControl. | Part Number | Description | Link | | --- | --- | --- | | MCBL-00009-1 | USB Cable (Host, 4-pin JST to USB 2.0 Type A Female) | [Purchase](https://www.modalai.com/products/mcbl-00009) | Camera USB Cable | USB Cable included with camera (Mini USB) | One of the following VOXL Add-on boards is required. | Part Number | Description | Link | | --- | --- | --- | | MDK-M0048-1 | VOXL Microhard Modem Add-on | [Purchase](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) | MDK-M0078-1 | VOXL USB Expansion Board with Fastboot and Emergency Boot | EOL | MDK-M0030-1 | VOXL Cellular LTE and USB hub add-on | [Purchase](https://www.modalai.com/products/m0130-3) - Before beginning setup, make sure the VOXL is disconnected from both it's power source and it's USB to host PC cable - Attach the add-on board to the VOXL and make sure that the boot switch(es) are turned off or to the left - Plug the jst side of the MCBL-00009-1 USB Cable into the add-on board - Plug the camera's USB cable into both the camera and the USB female side of the MCBL-00009-1 USB cable - Power the VOXL - Switch the Mobius camera into webcam mode by pressing the `Shutter` button. (Button with picture of camera) #### Software Setup Before starting the camera stream, make sure your vehicle is connected to QGroundControl. Instructions on how to do so over WiFi can be found here: [How to Connect QGroundControl to VOXL using WiFi](/qgc-wifi/) If `ffmpeg` is not currently installed on your VOXL it can be built and installed by following the instructions here: [voxl-ffmpeg](https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-ffmpeg#build) - On VOXL, start the video stream by using the following command: ``` ffmpeg -i /dev/video2 -f mpegts udp://GCS_IP:4242 ``` Replace `GCS_IP` with the IP Address of your Ground Control Station that is connected to the VOXL. FFmpeg has a large variety of flags that can be set in order to change the encoder settings and modify the resolution, framerate, bitrate, etc. of the video stream. The documentation can be found on the [FFmpeg Website](https://ffmpeg.org/ffmpeg.html). - In QGC, press the purple QGC logo in the top left corner in order to access the `Application Settings` menu. - Under the `General` tab, scroll down until you find the `Video` section. - Under the `Video Source` dropdown, choose `MPEG-TS (h.264) Video Stream`. - In the `UDP Port` field enter the default: `4242` - You will now be able to view the video stream under QGC's `Fly` view. ### PID Tuning - Download SimpleBGC **v2.2b2** from [here](https://www.basecamelectronics.com/files/v10/SimpleBGC_GUI_2_2b2.zip) - The User Guide can be downloaded at the same site [here](https://www.basecamelectronics.com/files/v10/SimpleBGC_manual_2_2_eng.pdf) To compliment the user guide above, here's a high level walkthrough: - Open the SimpleBGC GUI - Connect to the gimbal using a micro usb - On the GUI, under Connection, click the dropdown and select the COM port. Should connect automatically - On the top there are several tabs to select from: Basic Tab, Advanced Tab, RC Settings Tab, Follow mode Tab, Menu Button Tab, Realtime Data Tab, Firmware upgrade Tab **NOTE: Avoid flashing the newest firmware. Will brick the device. Would suggest avoiding the Firmware Upgrade tab altogether.** - Before altering any values, would recommend saving the values to reference back if needed. - The **Basic Tab**, allows to set the PID’s, Motor configuration, Sensor configuration and External FC Gain - Highly recommend calibrating the ACC. and GYRO - The PID’s work well in default settings, but for more custom settings, change the values to your liking. Too high values and the gimbal becomes very twitchy and too low values make the gimbal sluggish, in general: - P - is like the power/resistance to change - I - the speed to which the gimbal will return to center - D - stabilizes the bumps - Power is the amount of power each motor is receiving. Can be set anywhere from 0-250. Recommend starting out anywhere from 80-120 to start. Too high a value and the motors start getting hot, too low and there’s not enough power to combat the wind and motions of the camera. - Invert should be defaulted after plugging in the gimbal, if not select Auto - NUM Poles should be 14, unless different motors are used then this should be changed to match the poles of the motor - External FC Gain is left alone - Sensor Axis should’ve been recorded correctly after connection to usb. If not, use -Z, -Y for Axis Top and Right respectively - **Advanced Tab**, leave AHRS alone, good as is. - In Timings, Serial port speed is left alone - PWM Frequency is altered to High(silent) - **RC Settings Tab**, under RC Input mapping, Source: PWM - ROLL: RC_ROLL - PITCH: RC_PITCH - YAW: EXT_PITCH - CMD: no_input - Command Assignment is left alone - Adjust settings here for angle of gimbal and speed: | | MIN.ANGLE | MAX.ANGLE | ANGLE MODE | LPF | SPEED MODE | SPEED | FOLLOW.% | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | ROLL | -45 | 45 | X | 3 | | 50 | 0 | | PITCH | -60 | 60 | X | 3 | | 50 | 0 | | YAW | -100 | 100 | | 3 | X | 50 | 0 | - Use **Realtime Data Tab**, simultaneously as tuning the PID’s. The goal is to get a smooth slope with the least bit of oscillations with the fastest return to center ### Arducam UVC Camera The Arducam is the recommended UVC camera for the m500. There are many different Arducams to choose from depending on your requirements. You can find the Arducam Specs and Selection guide by going [here](https://docs.arducam.com/uvc-camera-module/specs-and-selection-guide/). The Arducam `B0229` is an excellent choice: * Field of View (FOV): D=105°, H= 90°, V= 65° * Supports MJPG 15fps@ 3264x2448, 30fps@1080P, and YUY2 30fps@ 640x480 formats. #### Arducam Gimbal Mounting * Gimbal SimpleBGC PID profile settings can be found [here (right-click then Save link as...)](/images/m500/arducam_ub0229.profile). * SimpleBGC PID settings screenshot: ![Arducam SimpleBGC](/images/m500/simplebgc_arducam_gimbal_ub0229_settings.jpg) * We created a mount that you can print on a 3D printer. Download the STEP file [here](https://storage.googleapis.com/modalai_public/modal_drawings/M500_ARDUCAM_HMG_MA3D_MOUNT.STEP). * Front and Bottom views of Arducam Gimbal Mount: ![Front](/images/m500/m500-hmg-ma3d-gimbal-arducam-mount-front.jpg) ![Bottom](/images/m500/m500-hmg-ma3d-gimbal-arducam-mount-bottom.jpg) --- Source: https://docs.modalai.com/m500-datasheet/ # M500 Reference Drone Datasheet --- ![voxl-m500](/images/m500/m500-shopify.jpg) ## High-Level Specs | Specicifcation | MRB-D0001-2-V1.1-F1-B1-C3 | |----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Take-off Weight | 1075g with battery (820g w/o battery) | | Size | Length: 15.5"
Width: 15.5"
Height to:
- Bottom Plate: 2.25"
- Top of Flight Deck: 4.5"
- Top of GPS: 8" | | Flight Time | >20 minutes | | Payload Capacity (Impacts Flight Time) | 1kg | | Motors | 2216 880KV | | Propellers | 10" (1045)
Replacement | | Frame | s500
Replacement | | ESCs* | BLHeli 20A | | Computing | [VOXL Flight](/voxl-flight-datasheet/) | | Flight Control | PX4 on [VOXL Flight](/voxl-flight-datasheet/) | | Image Sensors | [Stereo](/M0015/), [Tracking](/M0014/), [4k High-resolution](/M0025/) | | IP Communication | WiFi built-in, [LTE](/lte-modem-and-usb-add-on-datasheet/) or [Microhard](/microhard-add-on-datasheet/) optional | | R/C (Remote Control) | Configured for Spektrum DSMX (either DSMX-SPM9645 or DSMX-SPM9745), compatible with most DIY R/C systems through expansion I/O on [Flight Core](/flight-core-datasheet/) | | Power Module | [Power Module v3](/power-module-v3-datasheet/) | | Battery | Up to 5S (not included, recommended: [Thunderpower TP3400-4SPX25 - select XT60 connector](https://www.thunderpowerrc.com/products/tp3400-4spx25?variant=31080855339072)) or GensAce 3300mAh 11.1V 50C 3S1P Lipo Battery Pack With XT60 Plug | | Additional Components | N/A | | Landing Gear | [Polycarbonate Round Tube 1/2" OD, 3/8" ID, Clear](https://www.mcmaster.com/2044T42/) | | Battery Standoffs | Screws: Black-Oxide Alloy Steel Socket Head Screw, M2.5 x 0.45 mm Thread, 20 mm Long [91290A108](https://www.mcmaster.com/catalog/126/3290/)
Spacers: Aluminum Unthreaded Spacer, 4.500 mm OD, 14 mm Long, for M2.5 Screw Size [94669A108](https://www.mcmaster.com/catalog/126/3464) | ## System Overview [View in fullsize](/images/m500/VOXL-m500-R2-architecture.png){:target="_blank"} ![m500-.png](/images/m500/VOXL-m500-R2-architecture.png) ## m500 Labeled [View in fullsize](/images/m500/labeled_m500.png){:target="_blank"} ![m500-labeled.png](/images/m500/labeled_m500.png) ## PX4 Tuning Parameters Our engineers have spent a lot of time finely tuning this vehicle, and the [parameters are available here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params) ## Motor Configuration The propellers have arrows on them as to which way they should turn. Motor configuration in the image below. ![voxl-m500-motor-configuration.png](/images/m500/voxl-m500-motor-configuration.png) ## Connectivity for Remote Operation | Connectivity Option | Use Case | Details | | --- | --- | --- | | Spektrum R/C | Manual remote control of the vehicle | [Configure](/configure-rc-radio/) | | WiFi | Short range (~100m) IP connectivity for debug and nearby flights | [Setup](/wifi-setup/) | | LTE | Long Range, BVLOS operation | [User Manual](/lte-v2-modem-user-guide/)
[Datasheet](/lte-modem-and-usb-add-on-v2-datasheet/) | | Microhard | Medium Range (1-3km) IP connectivity for control, telemetry and video | | --- Source: https://docs.modalai.com/qualcommflightrb5/ # Qualcomm Flight RB5 **Update 2022-07-20: the Qualcomm Flight RB5 vehicle is now supported by the VOXL SDK! Please [see here](/Qualcomm-Flight-RB5-voxl-sdk-upgrade-guide/) from more information** A comprehensive drone reference design with low-power, high-performance heterogenous computing, artificial intelligence engine that is designed to deliver 15 TOPS, long-range Wi-Fi 6 and 5G (Optional) connectivity, support for 7 image sensor concurrency, computer vision, and vault-like security. ![RB5](/images/rb5/rb5-hero-final.jpg) --- Source: https://docs.modalai.com/fpv/ # First Person View (FPV) ModalAI's NDAA-compliant digital FPV ecosystem: ready-to-fly FPV drones and the standalone digital video link that powers them, all running the same [VOXL SDK](/voxl-sdk/).
![Stinger Vision FPV](/images/d0013/D0013-hero-front.png)

Blue UAS Cleared

Stinger Vision FPV

Long-range, NDAA-compliant digital FPV with onboard VIO-assisted flight. Stinger shares its core hardware and software with ModalAI's cleared government platforms — the same digital video link, autonomy services, and VOXL SDK, available to everyone.

## The Digital Video Link The VTX Air Unit and VRX Ground Unit are the standalone building blocks of ModalAI's low-latency digital FPV link — the same link flown on Stinger.
![VTX Air Unit](/images/t0001/t0001-nobg.png)

VTX Air Unit

Digital video transmitter for VOXL-based aircraft — encodes the camera feed, composites the OSD, and ships it to the ground.

![VRX Ground Unit](/images/r0001/R0001-nobg.png)

VRX Ground Unit

Ground-side receiver that feeds your goggles or ground station — pairs with the VTX for the full digital link.

## AI Detection The VTX/VRX link supports onboard [AI detection](/ai-detection/) — objects detected in the video feed are highlighted live in your goggles. See the [AI Detection Setup Guide](/ai-detection-setup-guide/) to enable it. ## Under the Hood FPV drones run the standard VOXL SDK — video flows through [voxl-vtx](/vtx-air-unit-software-guide/#voxl-vtx-service) and [voxl-osd](/voxl-osd/), ELRS RC feeds PX4 onboard, and voxl-rc-server on the VRX bridges your transmitter or a joystick over IP. See [how the SDK fits together](/voxl-sdk/#how-the-sdk-fits-together) for the full interactive service diagram. > Seeker Vision (D0008 / D0020) are Blue UAS cleared platforms available to government customers. Their technical documentation is not publicly hosted — request access through the [Blue UAS Cleared FPV customer intake form](https://www.modalai.com/pages/blue-uas-cleared-fpv-customer-intake-form). --- Source: https://docs.modalai.com/ai-detection-setup-guide/ # AI Detection Setup Guide --- ## Overview The VTX/VRX system supports a real-time AI overlay on the video stream: an onboard service detects or tracks objects in the camera feed, `voxl-vtx` transmits the bounding box data alongside the video, and `voxl-vrx` renders the boxes (with optional labels) on the display or goggles. ### How It Works 1. **Drone/VTX**: an onboard AI service publishes detection results (bounding boxes, labels, confidence scores) to an MPA pipe. Two sources are supported: - [`voxl-tflite-server`](/voxl-tflite-server/) — object *detection*: box every object a deep-learning model recognizes. Display-only. Publishes on `tflite_data`. - [`voxl-nano-tracker`](/aoi-yaw-tracking/) — object *tracking*: follow one target selected via RC or voxl-portal. Can also command vehicle yaw via VFC. Publishes on `object_tracker_meta` (the shipped config default on current SKUs). 2. **Transmission**: `voxl-vtx` subscribes to the pipe named by `ai_detection_source` in the active video profile and transmits the detection data to the VRX 3. **VRX (Ground Unit)**: `voxl-vrx` receives the detection data and renders bounding boxes with optional labels on the video display ### Prerequisites - Drone/VTX/VRX on SDK 1.6.0+ (SDK 1.6.3+ for voxl-nano-tracker; the `object_tracker_meta` default requires SDK 1.6.6+) - AI detection enabled in voxl-vtx and voxl-vrx configuration files --- ## VTX Configuration On the drone/VTX, edit `/etc/modalai/voxl-vtx.conf` to enable AI detection transmission. The configuration is done per video profile, edit the following parameters in the profile you want the detection to be on: ```json { ... "profiles": [ { "name": "Object Detection", "source": "hires_default_misp_encoded", // Should be the encoded version of the camera pipe used for object detection in voxl-tflite-server ... "ai_detection_enable": true, // Enable/Disable AI detection for this profile "ai_detection_source": "object_tracker_meta", // Pipe to read detections from: object_tracker_meta (nano-tracker) or tflite_data (tflite-server) "ai_detection_qty": 3, // The maximum number of object detections to transmit to the VRX "ai_detection_threshold": 0.5 // The confidence threshold for an object to be considered for transmission } ] ... } ``` ### Configuration Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `ai_detection_enable` | bool | true | Enable transmission of AI detection data for this profile | | `ai_detection_source` | string | `object_tracker_meta` | MPA pipe to read detections from (`object_tracker_meta` or `tflite_data`) | | `ai_detection_qty` | int | 3 | Maximum number of detection boxes to transmit | | `ai_detection_threshold` | float | 0.5 | Minimum confidence threshold for detections (0.0 - 1.0) | ### Parameter Notes - **ai_detection_qty**: Higher values transmit more detected objects but increase bandwidth usage. Typically 2-5 objects is sufficient. - **ai_detection_threshold**: Only detections with confidence greater than this value are transmitted. Range: 0.0 (all detections) to 1.0 (only very confident detections). A value of 0.75 means 75% confidence or higher. --- ## VRX Configuration On the VRX, edit `/etc/modalai/voxl-vrx.conf` to enable AI detection rendering: ```json { ... "ai_detection_enable": true, // Enable/Disable AI detection "ai_detection_show_labels": false // Enable/Disable object class labels ... } ``` ### Configuration Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `ai_detection_enable` | bool | true | Enable rendering of AI detection boxes on display | | `ai_detection_show_labels` | bool | true | Show object class labels and confidence scores with boxes | --- ## Object Detection with voxl-tflite-server `voxl-tflite-server` boxes every object its model recognizes. It is **display-only** — it never influences flight. Point `ai_detection_source` at `tflite_data` in the active VTX profile, then configure `voxl-tflite-server` on the drone/VTX: 1. Ensure `voxl-tflite-server` is installed on the drone/VTX. 2. Configure the service using `voxl-configure-tflite`. - Set the input pipe to match your camera source for the video feed (e.g., `hires_default_misp_color` if `hires_default_misp_encoded` is used as video source) 3. It is recommended to skip a few frames (set `skip_n_frames` in `/etc/modalai/voxl-tflite-server.conf` to 2, 3, or 4) to reduce the CPU usage, the `voxl-tflite-server` process can be quite CPU intensive. 4. Set the `allow_multiple` field to `false`. This is necessary so that the MPA pipe enumerates as `tflite_data`, which is what voxl-vtx expects. 5. Restart and verify the service is running: `systemctl restart voxl-tflite-server` then `systemctl status voxl-tflite-server`. 6. Check that detection data is being published: `voxl-inspect-detections tflite_data`. Refer to the [voxl-tflite-server documentation](/voxl-tflite-server/) for complete setup instructions. --- ## Object Tracking with voxl-nano-tracker `object_tracker_meta` is the shipped config default on current SKUs. `voxl-nano-tracker` tracks a single target selected from an RC channel (default: channel 12) or [voxl-portal](/voxl-portal/); its configuration lives at `/etc/modalai/voxl-nano-tracker.conf`. Enable it with: ```bash voxl-configure-nano-tracker factory_enable ``` > voxl-nano-tracker is more than a display overlay. Paired with VFC position mode, AOI yaw tracking **commands the drone's yaw** to keep the tracked target centered. Understand the [AOI Yaw Tracking guide](/aoi-yaw-tracking/) and its warnings before enabling tracking in flight, and be ready to take manual control. ## Verifying Operation ### On the VTX (Drone) Check that detection data is being generated on your configured source pipe: ```bash voxl-inspect-detections tflite_data # tflite-server voxl-inspect-detections object_tracker_meta # nano-tracker ``` ### On the VRX (Ground Unit) You should see bounding boxes rendered on the video display. If `ai_detection_show_labels` is enabled, you'll also see class names. --- ## Troubleshooting ### No bounding boxes visible on VRX 1. Verify `ai_detection_enable: true` in both VTX and VRX config files 2. Check the source service is running on the drone/VTX: `systemctl status voxl-tflite-server` (or `voxl-nano-tracker`) 3. Verify detections are being published: `voxl-inspect-detections tflite_data` (or `object_tracker_meta`) on the drone/VTX 4. Confirm the VTX profile's `ai_detection_source` matches the pipe your source service publishes 5. Ensure VTX/VRX link is working (video streaming properly) 6. Check `ai_detection_threshold` isn't too high (try lowering the configured threshold) ### Poor detection performance 1. Lower `ai_detection_threshold` to see more detections (may increase false positives) 2. Verify TFLite model is appropriate for your use case ### Bandwidth concerns 1. Reduce `ai_detection_qty` to transmit fewer objects 2. Increase `ai_detection_threshold` to only send high-confidence detections --- Source: https://docs.modalai.com/stinger-vision-datasheet/ # Stinger Vision FPV Datasheet ![Stinger Vision FPV drone](/images/d0013/D0013-hero-front.png) --- ## Overview ### Features - Autonomous Navigation in GPS-denied environments with Multi-Cam VIO - Backtrack Mode to autonomously retrace steps if video signal is lost - MVX FPV Streaming with U.S.-made, encrypted, low-latency video - Multiple FPV Views: EO, downward, and thermal for enhanced awareness - VOXL 2 Mini Onboard: 8-core Qualcomm QRB5165 processor, 8GB RAM - Blue UAS Framework Architecture and full NDAA compliance - Lightweight Design: 575g with 12+ minutes of flight time - Pill LED (Overt and IR) ### High-Level Specs | Specification | | |:---------------------------------------|:-----------------------------------------------------| | Weight | 365g w/o battery, 575g w/ battery | | Size | 7.8” x 9.0” x 3.4” (198mm x 228mm x 85mm) | | Flight Time | 12 minutes (4S1P 18650 LiIon - Stock), 17 minutes (4S1P 21700 LiIon) | | Motors | ModalAI Custom 2204 Motor Size, 2450 kV, ModalAI Part Number M10001353 | | Propellers | GemFan D90 3.5" 5 Blade Prop | | Frame | Custom | | ESCs | [ModalAI M0129-63](/voxl-mini-esc-datasheet/) | | Video Transmitter (MVX) | Tunable to 2.412–2.484 GHz & 5.16–5.885 GHz | | Battery | 4S1P to 6S1P.
Upgrade Energy 3000mAh 4S 14.4V P30B Lithium-Ion Battery - XT60 | | Computing | [ModalAI M0204-1 - VOXL 2 Mini](/voxl2-mini/) | | Flight Control | PX4 on [VOXL 2 Mini](/voxl2-mini/) | | Thermal Config X8 | FLIR Lepton 3.5 option | | Image Sensor Config C22 | QTY2 ModalAI [M0166](/M0166/) AR0144 Tracking (Front, Down) | | Image Sensor Config C33 | QTY2 ModalAI [M0166](/M0166/) AR0144 (Front, Down), QTY1 ModalAI [M0186](/M0186/) IMX664 (Front) | | VTX Config M26 | ModalAI MVX (M0185-1 VTX) | | Receiver Config T8 | [ModalAI M0184 ELRS 915MHz](/M0184/). Default 915MHz, configurable to 868MHz | ### Critical Components | Critical Electronic Component (CEC) | Encryption Type | Make | Model | Location of HQ | Country of Manufacture | |------------------------------------------------------|-------------------------------------|----------------------------|------------------------------------------|----------------|------------------------| | Flight controller/autopilot | AES-256 Capable / Developer Enabled | VOXL 2 Mini | M0204 | San Diego, CA | USA | | Additional computers/companion computers | AES-256 Capable / Developer Enabled | VOXL 2 Mini | M0204 | San Diego, CA | USA | | Radios | | ModalAI Gemini ELRS 915MHz | M0184-1 | San Diego, CA | USA | | Data transmission devices | ChaCha256 | ModalAI MVX | M0185 | San Diego, CA | USA | | Camera(s) | N/A | ModalAI | EO M0186-1
CV M0166-1 & Flir Lepton | San Diego, CA | USA | | Gimbals | N/A | N/A | | | | | GCS hardware | ChaCha256 | ModalAI MVX | MVX-R0001 | San Diego, CA | USA | | GCS software | ChaCha256 | ModalAI MVX | MVX-R0001 | San Diego, CA | USA | | C2 device/handset | | ModalAI Zorro Blue | MRC-Z0001-1 | San Diego, CA | USA | | Secondary tracking hardware (Remote ID, ADS-B, etc.) | N/A | | | | | | Payload(s) | N/A | | | | | ### VOXL SDK Support Stinger Vision FPV is supported in VOXL SDK 1.4.5+. See [Stinger Software Guide](/stinger-vision-software-guide/) for more details. ### Supported VRX See [ModalAI VRX Ground Unit](/vrx-ground-unit/) ### SKUs | Stinger Vision FPV UAS | Description | |:---------------------------------------|:------------------------------------------------------------------------| | MRB-D0013-6-C33-M26-T8-X8 | Stinger, M0185 VTX, [M0184](/M0184/) ELRS 915MHz | ## Wiring Diagram ### MRB-D0013-6-C33-M26-T8-X8 - `MRB-D0013-6` - Stinger Family, VOXL 2 Mini Compute - `C33` - QTY2 ModalAI [M0166](/M0166/) AR0144 (Front, Down), QTY1 ModalAI [M0186](/M0186/) IMX664 (Front) - `M26` - ModalAI MVX (M0185-1 VTX) - `T8` - ModalAI ELRS 915MHz - `X8` - Flir Lepton 3.5 ![MRB-D0013-6-C33-M26-T8-X8 wiring diagram](/images/d0013/CWD-D0013-6-C33-M26-X8-REV7.jpg) --- Source: https://docs.modalai.com/stinger-vision-user-manual/ # Stinger Vision FPV User Manual --- # Overview Stinger Vision FPV is a [Blue UAS-cleared](https://www.diu.mil/blue-uas-cleared-list), NDAA-compliant digital FPV drone with onboard VIO-assisted flight, built on VOXL 2 Mini. It streams encrypted, low-latency video to the [VRX Ground Unit](/vrx-ground-unit/) and offers multiple FPV views — EO, downward, and thermal — plus assisted flight modes and Backtrack. New to Stinger? Start with the [Quick Start Guide](/stinger-vision-quick-start-guide/), which walks first-time setup with videos. This manual is the ongoing operating reference. # Safety > Never power on the vehicle without VTX antennas attached — transmitting without antennas permanently damages the video transmitter. > Remove propellers before bench work, configuration, or firmware updates whenever possible, and always treat an armed vehicle as live. # Hardware Overview ## Sensors and Interfaces FPV sensors: ![Stinger FPV sensors, labeled](/images/d0013/quick-start/fpv-sensors-v1.jpg) Computer vision sensors: ![Stinger computer vision sensors, labeled](/images/d0013/quick-start/computer-vision-sensors.jpg) Actuators: ![Stinger actuators, labeled](/images/d0013/quick-start/actuators.jpg) Utility port (USB-C — encryption key updates, ADB access): ![Stinger utility port location](/images/d0013/quick-start/utility-port.jpg) For connector-level details, see the [Stinger Datasheet](/stinger-vision-datasheet/). ## Battery and Propellers Recommended: - `M10001000` - Upgrade Energy 3000mAh 4S 14.4V P30B Lithium-Ion Battery - XT60 - `M10000999` - GemFan D90 3.5" 5 Blade Prop Set Prop and battery install videos are in the [Quick Start Guide](/stinger-vision-quick-start-guide/#quick-start-guide). # RC Controller Stinger uses an ELRS 915 MHz control link. The controller layout below is for the Zorro Blue: ![Zorro Blue controller control layout](/images/d0013/Stinger_Zorro_Blue_Controls.png) ## Arming Ensure all switches are away from you, then flip the arm switch (top left) toward you to arm. Disarm by flipping it back. ## Binding Bind a new transmitter using the physical bind button on the underside of the frame — see [Stinger Binding Details](/stinger-vision-binding-details/) for the button location and procedure, plus a video walkthrough. # Flight Modes The flight mode switch selects between three assisted modes (provided by the onboard VFC — see the [Software Guide](/stinger-vision-software-guide/#flight-modes) for what runs under the hood): - **Altitude** — the most responsive mode: altitude is held, position is up to you. - **Position** — VIO position hold using the tracking cameras; no GPS required. Best in well-lit areas; watch for the VIO indicator in the top left of the OSD to be green. - **Thermal Flow** — position hold backed by thermal optical flow; use it in dark environments where VIO struggles. ## Turtle Mode If the drone flips upside down: disarm, flip the recovery switch toward you to enter crash-flip (turtle) mode, arm, then use the right stick to flip the drone upright. To fly again: disarm, disengage the recovery switch, re-arm. ## Backtrack Backtrack autonomously retraces the drone's recent motion — useful for recovering a lost video link. Flip the recovery switch while in the air to trigger it; disengage the switch at any time to regain manual control. # On-Screen Display Video appears in your goggles or on the VRX display when the drone powers on. If it doesn't, scan channels from the VRX ([buttons guide](/vrx-ground-unit-quick-start-guide/#buttons)). ![On-screen display elements, labeled](/images/d0013/163OSD_Labeled.png) To change flight modes, channel, video profile, and more, open the OSD menu **while disarmed** by pushing both sticks down and inward, then navigate with the right stick. See the [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/#osd-menu) for everything the menu can do. # Video Link and Encryption - VTX and VRX pair automatically out of the box (default frequency 5.805 GHz, shared default encryption key). - To use your own encryption key: generate one on the VRX (see [Generating New Encryption Keys](/vrx-ground-unit-quick-start-guide/#generating-new-encryption-key)), then insert the provisioned USB flash drive into Stinger's utility port and power cycle. - Channel changes, video profiles, and TX power are managed from the OSD menu or `voxl-vtx` configuration — see the [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/). # Software Stinger runs the standard VOXL SDK. The [Stinger Software Guide](/stinger-vision-software-guide/) covers which services run, how to update the SDK, ADB access, AI detection, and how to reset the configuration to factory state. # Troubleshooting - **No video in goggles** — confirm the VRX is on the same channel (scan with the VRX buttons) and both units share an encryption key. - **Position mode drifts or refuses to engage** — check the VIO indicator in the OSD; improve lighting or switch to Thermal Flow / Altitude mode. - **Transmitter won't connect** — re-bind following [Stinger Binding Details](/stinger-vision-binding-details/). - **Services misbehaving after experimentation** — reset to factory configuration with `voxl-configure-mpa` (see the [Software Guide](/stinger-vision-software-guide/#reconfiguring)). - Still stuck? Ask in the [Stinger forum category](https://forum.modalai.com/category/53/stinger-vision-fpv). --- Source: https://docs.modalai.com/stinger-vision-quick-start-guide/ # Stinger Vision FPV Quick Start Guide --- # Quick Start Guide ## Propeller Install ## Battery Install ## How to Bind ELRS ## VTX/VRX Out of Box Experience ## VTX/VRX Changing Encryption Keys ## Zorro Blue Controls ![Zorro Blue controller control layout](/images/d0013/Stinger_Zorro_Blue_Controls.png) This control layout shows how switches are mapped when using Stinger Vision FPV with the Zorro Blue controller. To arm the drone, start by ensuring all switches are away. Once they are, switch the arm switch on the top left towards you. That will arm the drone and then you are ready to fly. ### Flight Modes The flight modes on Zorro Blue are mapped to be Altitude, Position, and Thermal Flow mode. Altitude mode will be the most responsive flight mode, and gives the user a responsive and easy to fly flight option. Position hold mode uses the camera sensors to stabilize the drone, allowing it to hold its position without the need for a GPS. This mode is best used in well lit areas. Look for the VIO indicator in the top left of the OSD to be green for best results. Thermal flow mode acts like position hold mode but is best used in dark environments. Position hold flight can be seen below. > Although flight characteristics in these videos are consistent, button mapping for Zorro Blue is different than what you will see. ### Turtle Mode When the drone is upside down, turtle mode can be used to flip the drone upright. To enter turtle mode start by disarming the drone. Once the drone is disarmed, you can flip the recovery switch towards you, entering crash flip (turtle) mode. Once the recovery switch is engaged, arm the drone and use the right control stick to flip the drone upright. To take off and fly, disarm, disengage the recovery switch, re-arm and fly. ### Backtrack Mode Backtrack mode can be used to have Stinger Vision replay its motion for a short period of time. To enter backtrack mode flip the recovery switch while in the air. This will trigger backtrack mode and you will see the drone begin to replay its motion. You can disengage the recovery switch and regain manual control at any time. > Although flight characteristics in these videos are consistent, button mapping for Zorro Blue is different than what you will see. # On Screen Display (OSD) When the drone is turned on you should see the video pop up in the goggles/on the VRX display. If it does not come up, perform a scan to find the correct frequency. Below is the OSD as it looks in SDK release 1.6.3. Other releases should look similar and the information should be displayed similarly. ![On-screen display elements, labeled](/images/d0013/163OSD_Labeled.png) If you need to make any changes, such as flight modes, frequency, etc., enter the OSD menu by pushing both sticks down and in. Use the right stick to navigate the menu and make any changes. See the [VRX Ground Unit Quick Start Guide](/vrx-ground-unit-quick-start-guide/) for more information. # Hardware Overview ## FPV Sensors ![Stinger FPV sensors, labeled](/images/d0013/quick-start/fpv-sensors-v1.jpg) ## Computer Vision Sensors ![Stinger computer vision sensors, labeled](/images/d0013/quick-start/computer-vision-sensors.jpg) ## Actuators ![Stinger actuators, labeled](/images/d0013/quick-start/actuators.jpg) ## RC Bind Button ![RC bind button location](/images/d0013/quick-start/rc-bind.jpg) ![Pressing the RC bind button](/images/d0013/quick-start/D0013-bind-button.jpg) ## Utility Port ![Stinger utility port location](/images/d0013/quick-start/utility-port.jpg) ## Battery / Props Recommended: - `M10001000` - Upgrade Energy 3000mAh 4S 14.4V P30B Lithium-Ion Battery - XT60 - `M10000999` - GemFan D90 3.5" 5 Blade Prop Set # Integrated VTX ## Updating Encryption Keys - To update keys, insert provisioned USB flash drive into the Utility Port and power cycle the UAS. ## Supported VRX See [VRX Ground Unit](/vrx-ground-unit/). # Supported Transmitters ELRS 915MHz --- Source: https://docs.modalai.com/stinger-vision-software-guide/ # Stinger Vision FPV Software Guide --- # VOXL SDK Support Stinger runs the standard [VOXL SDK](/voxl-sdk/) on its VOXL 2 Mini — supported in SDK 1.4.5+. Stinger ships with SDK 1.6.4 preinstalled. Flash the most recent release flight-tested on Stinger per the [Which SDK Should I Flash?](/voxl-suite/#which-sdk-should-i-flash) table, using the [flash instructions](/flash-system-image/). # What Runs on Stinger Which services boot is decided per-SKU by [voxl-configure-mpa](/voxl-configure-mpa/). On Stinger the flight stack looks like this: | Service | Role on Stinger | |:--------|:----------------| | [voxl-camera-server](/voxl-camera-server/) | Publishes the tracking cameras, hires EO camera, and thermal sensor | | [voxl-imu-server](/voxl-imu-server/) | IMU samples for state estimation | | voxl-open-vins-server | Visual-inertial odometry (FPV profile, front + down tracking cameras) — powers Position mode | | voxl-state-estimator | Backup state estimation from IMU + optical flow — powers Thermal Flow mode in low light | | voxl-lepton-tracker | Thermal optical flow from the FLIR Lepton | | [voxl-vision-hub](/voxl-vision-hub/) | VFC assisted-flight modes (Altitude, Position, Thermal Flow), Backtrack, and position backup | | [voxl-mavlink-server](/voxl-mavlink-server/) | Telemetry routing between PX4, onboard services, and the ground | | [voxl-px4](/voxl-px4/) | PX4 flight controller (FPV build) with Stinger parameters | | voxl-vtx | Digital video transmission — see the [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/) | | [voxl-osd](/voxl-osd/) | On-screen display composited into the FPV video | | [voxl-portal](/voxl-portal/) | Browser UI for inspection and configuration | `voxl-streamer` and `voxl-mavcam-manager` are intentionally **disabled** — video leaves through the VTX, not RTSP. # RC (ELRS) The onboard ELRS receiver speaks **CRSF directly to PX4** — RC does not pass through an intermediate service. Binding is done with the physical bind button ([Stinger Binding Details](/stinger-vision-binding-details/)); receiver flashing and configuration uses [voxl-elrs](/voxl-elrs/). # Flight Modes The Zorro Blue switch positions map to VFC assisted-flight modes provided by voxl-vision-hub (configured in `/etc/modalai/vfc.conf`): - **Altitude** — most responsive; altitude hold only. - **Position** — VIO position hold from voxl-open-vins-server; best in well-lit areas. Watch the VIO indicator in the OSD. - **Thermal Flow** — position hold backed by thermal optical flow from the Lepton; for dark environments. - **Backtrack** — retraces recent motion, e.g. to recover a lost video link (flip the recovery switch in flight). See the [Quick Start Guide](/stinger-vision-quick-start-guide/#flight-modes) for the stick-and-switch walkthrough. # Video, OSD, and Encryption The integrated VTX is the same software as the stand-alone VTX Air Unit — frequencies, video profiles, TX power, encryption keys, and the OSD are all covered in the [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/). Highlights: - Change channel, video profile, or PIT mode from the OSD menu (sticks: yaw up + throttle down + roll down + pitch down while disarmed). - Config files on target: `/etc/modalai/voxl-vtx.conf` and `/etc/modalai/voxl-osd.conf`. - New encryption keys are installed by inserting a provisioned USB drive into the utility port and power cycling. # AI Detection Stinger supports the VTX/VRX AI overlay — deep-learning object detection via voxl-tflite-server (display-only), or single-target tracking via voxl-nano-tracker (note the flight-control warnings in the guide). See the [AI Detection Setup Guide](/ai-detection-setup-guide/). # ADB Access Connect USB-C at the utility port for standard `adb shell` access to the VOXL 2 Mini. From there all the usual SDK tooling applies — `voxl-inspect-services`, `voxl-portal` over WiFi, and the [Command Index](/voxl-commands/). # Reconfiguring The vehicle's SKU determines its factory configuration: ```bash voxl-inspect-sku # show this vehicle's SKU breakdown voxl-configure-mpa # re-apply the factory service configuration ``` > `voxl-configure-mpa` resets service configuration files to the factory state for the SKU — back up any custom tuning first. --- Source: https://docs.modalai.com/stinger-vision-list-of-certifications/ # Stinger Vision FPV List of Certifications | Certification | Description | Status | |----------------------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------| | FCC | US radio compliance | For evaluation only; not FCC approved for resale | | FY 2020 NDAA, Section 848 | Prohibition on operation or procurement of foreign-made unmanned aircraft systems. | Compliant | | FY 2023 NDAA, Sec 817 | Modification to prohibition on operation or procurement of foreign-made unmanned aircraft systems. | Compliant | | FY 2024 NDAA, Sections 1823-1833 | aka, American Security Drone Act of 2023 (ASDA) | Compliant | --- Source: https://docs.modalai.com/stinger-vision-binding-details/ # Stinger Vision FPV Quick Start Guide --- # Stinger Binding Details ## Locating the Bind Button On the bottom side of the drone, locate the hole in the frame that allows access to the button ![Bind button location on the Stinger](/images/d0013/d0013-locate-bind-button.jpg) The center of the bind button is the black dot, that’s what you’ll want to aim to press ![Close-up of the bind button location](/images/d0013/d0013-locate-bind-button2.jpg) ## Entering Bind Mode Power the drone on and within 30 seconds: 1. Hold the receiver board against the frame with one finger 1. Press the center of the button with your tool and hold for 5 seconds. There will not be any distinguishable haptic feedback from the button being pressed, but don’t worry, it doesn’t take much pressure to properly engage 1. Enter bind mode on your RC controller and you should be good to go! ![Pressing the bind button to enter bind mode](/images/d0013/d0013-press-bind-button.jpg) ## Video Tutorial Video tutorial for binding your Stinger to an ELRS Transmitter --- Source: https://docs.modalai.com/d0017-datasheet/ # Shikra FPV Datasheet --- ## Overview ### Features ### High-Level Specs | Specicifcation | | |-:------------------|-:------------------------------------------------------------| | Weight | 451g w/ battery | | Size | | | Flight Time | 18 minutes | | Motors | | | Propellers | | | Frame | Lumenier QAV-R 2C Frame Kit - 5" | | ESCs | | | VTX Antennas | | | Battery | 6S LiIon | | Computing | [ModalAI M0204-1 - VOXL 2 Mini](/voxl2-mini/) | | Flight Control | Brave F7 BetaFlight | | Image Sensor | QTY 1 ModalAI [M0186](/M0186/) IMX664 (Front) | | VTX | ModalAI MVX (M0185-1 VTX) | | Receiver Config T8 | [ModalAI M0184 ELRS 915mHz](/M0184/) | ## Critical Components | Critical Electronic Component (CEC) | Encryption Type | Make | Model | Location of HQ | Country of Manufacture | |------------------------------------------------------|-------------------------------------|----------------------------|-------------|----------------|------------------------| | Flight controller/autopilot | | RotorRiot | Brave F7 | Puerto Rico | USA | | Additional computers/companion computers | AES-256 Capable / Developer Enabled | VOXL 2 Mini | M0204 | San Diego, CA | USA | | Radios | | ModalAI Gemini ELRS 915MHz | M0184-1 | San Diego, CA | USA | | Data transmission devices | ChaCha256 | ModalAI MVX | M0185 | San Diego, CA | USA | | Camera(s) | N/A | ModalAI | M0186-1 | San Diego, CA | USA | | Gimbals | N/A | N/A | | | | | GCS hardware | ChaCha256 | ModalAI MVX | MVX-R0001 | San Diego, CA | USA | | GCS software | ChaCha256 | ModalAI MVX | MVX-R0001 | San Diego, CA | USA | | C2 device/handset | | ModalAI Zorro Blue | MRC-Z0001-1 | San Diego, CA | USA | | Secondary tracking hardware (Remote ID, ADS-B, etc.) | N/A | | | | | | Payload(s) | N/A | | | | | ### VOXL SDK Support Shikra FPV is supported in VOXL SDK 1.4.5+. See [Stinger Software Guide](/stinger-vision-software-guide/) for more details. ### Supported VRX See [ModalAI VRX Ground Unit](/vrx-ground-unit/) ### SKUs | Shikra FPV UAS | Description | |:--------------------------|:------------------------------------------------| | MRB-D0017-8-C50-M26-T8 | Shikra, M0185 VTX, [M0184](/M0184/) ELRS 915MHz | ## Wiring Diagram ### MRB-D0017-8-C50-M26-T8 - `MRB-D00017-8` - Shikra Family, VOXL2 Mini Compute with Brave F7 flight controller - `C50` - QTY. 1 ModalAI [M0186](/M0186/) IMX664 (Front) - `M26` - ModalAI MVX (M0185-1 VTX) - `T8` - MoadlAI ELRS 915MHz ![MRB-D0017-8-C50-M26-T8 wiring diagram](/images/d0017/CWD-MRB-D0017-8-C50-M26-T8.jpg) --- Source: https://docs.modalai.com/vrx-ground-unit-datasheet/ # VRX Ground Unit Datasheet ![VRX Ground Unit with RA01 antenna](/images/r0001/R0001-hero-RA01.png) --- ## Overview ### Supported VTX Air Units - [Stinger Vision FPV](/stinger-vision-fpv/) (`MRB-D0013-6-C33-M26-T8-X8`) ### High-Level Specs | | | |:---------------------------------------|:------------------------------------------------------| | Range | 10km+ 5GHz or 2.4Ghz (LOS) | | Video Performance | 1280*720@60fps, 40ms glass-to-glass min, 50ms avg | | Frequencies Supported | 2.412-2.484GHz or 5.160-5.885GHz | | Video Output | DisplayPort over USB-C | | Computing | ModalAI M0205-1 - VOXL 2 Mini VRX | | Weight | 120g w/o battery | | Size | Size (L x W x H): 4” x 2” x 1” | | Battery/Power | 2S-6S, XT30 connector, ~7W | | Antennas | QTY3 SMA | | RF Link Payload (SDK 1.6.x) | Video plus MAVLink telemetry, air to ground only. See [What the link carries](/vrx-ground-unit-developer-guide/#what-the-rf-link-carries) | | Ground to Air Control | Separate ELRS 915 MHz RC link (not through the VRX) | ### VOXL SDK Support The VRX Grount Unit is supported in VOXL **VRX** SDK 1.4.5+ (`ubun2.0-multi_SDK_1.4.5.tar.gz`). See [VRX Ground Unit Developer Guide](/vrx-ground-unit-quick-start-guide/) for more details. ### SKUs #### Summary | ModalAI VRX | Description | |:---------------------------------------|:------------------------------------------------------------------------| | MVX-R0001-7-V1-M31-K0 | VRX, Gen1.5, VRX Only | | MVX-R0001-7-V1-M31-K1 | VRX, Gen1.5, RA01 Antenna, Cables, No Goggles | | MVX-R0001-7-V1-M31-K2 | VRX, Gen1.5, RA01 Antenna, Cables, Orqa FPV.One Goggles | | MVX-R0001-7-V1-M31-K3 | Ground Kit - Stinger Vision VRX with Display and Spare Parts | #### MVX-R0001-7-V1-M31-K0 VRX by itself ![MVX-R0001-7-V1-M31-K0 configuration](/images/r0001/R0001-hero.png) #### MVX-R0001-7-V1-M31-K1 Includes `RA01` antenna config - 5GHz QTY2 Patch Directional, QTY1 Omni Whip - `M10001129` - Antenna, X2-AIR 5.8 MKII, RHCP, RG316 cable, SMA, 300mm - `M10001130` - Antenna, X2-AIR 5.8 MKII, RHCP, RG316 cable, SMA, 400mm - `M10001136` - Antenna, 4.9-5.9Ghz, 5dBi, Linear, Whip, SMA, 44mm ![MVX-R0001-7-V1-M31-K1 configuration](/images/r0001/MVX-R0001-7-V1-M31-K1.png) #### MVX-R0001-7-V1-M31-K2 Integrated with Orqa FPV.One goggles for an immersive digital HD experience. > This configuration is in full production and shipping. ![MVX-R0001-7-V1-M31-K2 configuration](/images/r0001/MVX-R0001-7-V1-M31-K2.jpg) --- Source: https://docs.modalai.com/vrx-ground-unit-quick-start-guide/ # VRX Ground Unit Quick Start Guide --- # Quick Start Videos ## VTX/VRX Out of Box Experience ## VTX/VRX Changing Encryption Keys ## Example Video Stream Using Orqa FPV.One to pilot a [Stinger Vision FPV](/stinger-vision-fpv/) using `RA01` antenna option, eg. X2-AIR 5.8 MKII. # Hardware Overview ## Interfaces | Interface | Description | |:---------------------------------------|:------------------------------------------------------------------------| | SMA Antennas | 2.412-2.484GHz or 5.180-5.865GHz, RHCP recommended | | USB | Video Recordings, Encryption Key Generation/Updates | | DisplayPort Out | Use USBC to HDMI adapter listed below to get HDMI output | | HDMI (not active) | Note: the HDMI port is not active in this hardware version. Instead, use USBC to HDMI adapter like below | ![VRX interfaces, labeled](/images/r0001/quick-start/r0001-hardware-v1.jpg) ## Buttons | Button | Primary Use | Secondary Function (when also pressed with Function Key) | |:----------|:----------------------|:------------------------------------------------------------------------| | 1 | Channel Up | | | 2 | Record Start/Stop | Generate Encryption Key (save to attached USB Flash Drive...) | | 3 | Function Key | | | 4 | Channel Down | | ![VRX buttons, labeled](/images/r0001/quick-start/r0001-hardware2-v1.jpg) ## USBC-to-HDMI Adapters The following has been successful in our testing: - [201388-GRY](https://www.amazon.com/Cable-Matters-48Gbps-Adapter-Supporting/dp/B08MSWMXT4) (included in K1 kit) ## Battery/Power Supply 2S-6S supported, ~7W max usage ![VRX Ground Unit](/images/r0001/R0001-hero.png) ## Antennas - `M10001129` - Antenna, X2-AIR 5.8 MKII, RHCP, RG316 cable, SMA, 300mm - `M10001130` - Antenna, X2-AIR 5.8 MKII, RHCP, RG316 cable, SMA, 400mm - `M10001136` - Antenna, 4.9-5.9Ghz, 5dBi, Linear, Whip, SMA, 44mm Drone Side: - `M10001112` - 5.8 Core: RHCP 160mm RG137 U.FL Antenna - `M10001114` - 2.4 Singularity: RHCP 160mm RG137 U.FL Antenna # System Overview ## Pairing/Binding with VTX VTX and VRX should "pair" when both powered up by default as shipped from the factory. Cool use cases (and things to be aware of when powering on multiple units at a time): - Multiple VRXs can be "paired" with a single VTX, allowing for multi view drop from a VTX - Multiple VTXs can be configured on different channels, and a single VRX can swap between channels to stream from multiple VTXs. - VRX can be configured to receive IP from the UAS over VPN offering low latency stream ## Changing Channels Use buttons 1 and 4 shown above to scan through channels to locate streams from VTX systems using the same encryption key. ## Generating New Encryption Key If you want to change the encryption keys from the default, you can generate new ones and then use them on VTX systems to "pair/bind". To generate a new key, have: - the VRX powered on - a USB flash drive inserted into the USB port Press and hold **buttons 2/3 together for 2 seconds** to provision the USB flash drive with a new key. ## Using New Encryption Key Power cycle the VRX with a provisioned USB flash drive inserted into the USB port. # Software Overview The VRX Ground Unit is supported in the VRX SDK 1.5.0+ (`ubun2.0-multi_SDK_1.5.0.tar.gz`). See [VRX Ground Unit Developer Guide](/vrx-ground-unit-developer-guide/) for more details. ## Default Settings VTX and VRX ship with default: - frequency set to 5.805 GHz - encryption key, to generate new ones (recommended) see above ## OSD To access the OSD menu: ![Stick command to access the OSD menu](/images/r0001/quick-start/accessing-osd-sticks.jpg) Example of the current OSD menu: ![On-screen display elements, labeled](/images/d0013/163OSD_Labeled.png) --- Source: https://docs.modalai.com/vrx-ground-unit-developer-guide/ # VRX Ground Unit Developer Guide --- # VOXL SDK Support ## SDK Versions The VRX uses a different SDK than the drones at this time (5.4 kernel, Ubuntu20 rootfs): | SDK Version | File Name | Link | |:---------------|:-----------------------------------|:------| | VRX 1.6.6 | `ubun2.0-multi_SDK_1.6.6.tar.gz` | [Downloads](https://downloads.modalai.com/) | | VRX 1.5.0 | `ubun2.0-multi_SDK_1.5.0.tar.gz` | [Downloads](https://downloads.modalai.com/) | > this version won't work on drones yet. # VRX Software Reference ## voxl-vrx Service `voxl-vrx` receives the RF (or UDP) stream, FEC-decodes it, decodes the video, and renders it to the DisplayPort output with the OSD overlay. It runs as the systemd service `voxl-vrx.service` and restarts automatically. Enable/configure it with `voxl-configure-vrx`: ```bash voxl-configure-vrx --enable # enable the service and load kernel modules voxl-configure-vrx --list # show the current configuration voxl-configure-vrx --wizard # interactive settings editor voxl-configure-vrx --frequency 5805 ``` Factory presets restore a known-good configuration for each radio option, e.g. `--factory_enable_spark_lan`, `--factory_enable_mini_pini`, `--factory_enable_lte`, `--factory_enable_doodle`, `--factory_enable_dtc`. ## Configuration File Reference `/etc/modalai/voxl-vrx.conf` (JSON), created with defaults on first run. `frequency`, `bandwidth`, and FEC settings must match the VTX. ### Wireless Reception | Field | Default | Meaning | |:----------------|:----------|:----------------------------------------------------| | `frequency` | `5805` | Center frequency in MHz (must match VTX) | | `bandwidth` | `20` | 20 or 40 MHz (must match VTX) | | `card` | `"wlan0"` | Radio interface (`wlan0` SparkLAN, `ath0` Mini Pini) | | `enable_pcap` | `true` | Receive via RF | | `enable_fec` | `true` | Forward error correction (must match VTX) | | `enable_stbc` | `true` | Space-Time Block Coding | ### Video Display | Field | Default | Meaning | |:----------------------|:--------|:-----------------------------------------------------------------------------| | `encoding` | `"h265"`| `"h264"` or `"h265"` | | `stretch_to_screen` | `false` | Fill the screen (may distort aspect ratio) | | `splash_on_lost_link` | `false` | Show the splash screen when the link is lost | | `blackout_mode` | `false` | Show a black screen instead of splash/last frame when video is not live | | `osd_on_link_loss` | `1` | `0` = no OSD on link loss, `1` = full OSD, `2` = minimal (loss %, RSSI, FPS, channel, temp) | | `link_loss_indicator` | `true` | Proof-of-life indicator when the OSD is suppressed during link loss | | `stream_timeout_ms` | `100` | Time before declaring the stream lost | ### Sharpening Filter An unsharp mask applied to the video before display: | Field | Default | Meaning | |:--------------------|:--------|:--------------------------------------------------------------------------| | `sharpen_amount` | `1.5` | Strength: `0.0` off, `0.5` subtle, `1.0-2.0` moderate, `3.0+` aggressive | | `sharpen_threshold` | `0.0` | Noise gate: minimum edge contrast before sharpening applies | ### OSD (VRX side) | Field | Default | Meaning | |:---------------------------|:--------|:-----------------------------------------------| | `debug_osd` | `false` | Show debug info on the OSD | | `osd_font_size` | `16` | OSD font size | | `ai_detection_enable` | `true` | Draw AI detection boxes received from the VTX | | `ai_detection_show_labels` | `true` | Show labels on detected objects | ### Recording | Field | Default | Meaning | |:---------------------|:--------|:----------------------------------------------------------------------------------| | `record_video` | `false` | Start recording at startup | | `allow_record_local` | `false` | Allow recording to internal storage when no USB drive is present | Recordings go to `/media/usb/vrx_videos/` when a USB drive is inserted (drives auto-mount at `/media/usb`), otherwise to `/data/video/vrx_videos/` — but only if `allow_record_local` is `true`. ### Telemetry & Network | Field | Default | Meaning | |:--------------------------|:-------------|:------------------------------------------------------------| | `gcs_ip` | `"10.0.0.1"` | GCS/ATAK device IP to forward MAVLink to | | `telem_tx_ip` | `"10.0.0.2"` | Local IP telemetry is transmitted from | | `mavlink_gcs_port` | `14550` | MAVLink port to/from the GCS | | `en_mpeg_ts_rebroadcast` | `false` | Rebroadcast the encoded video as MPEG-TS over UDP to the GCS | | `mpeg_ts_rebroadcast_port`| `8901` | MPEG-TS rebroadcast port | ### System | Field | Default | Meaning | |:----------------------|:--------|:------------------------------------------------------| | `perf_mode` | `true` | Performance CPU governor while armed | | `enable_button_board` | `true` | Enable the physical buttons | | `battery_cell_count` | `2` | VRX battery cell count for the voltage display | | `scan_dwell_time_ms` | `500` | Dwell time per channel during a channel scan | | `debug_log` | `"off"` | CSV debug logging: `"off"`, `"on"`, `"arm"` | ## Buttons: Scan and Record - A single press of channel up/down steps one channel; a **second press in the same direction starts a continuous channel scan** (press again to stop). Scan dwell time per channel is `scan_dwell_time_ms`. - The record button toggles video recording (see Recording above for where files land). ## Inspecting the Link ```bash voxl-inspect-vrx -n ``` prints live receive stats — bitrate, frame/decode/total latency, SNR, noise floor, and packet loss. ## What the RF Link Carries The VTX to VRX RF link is a one-way broadcast from the air unit to the ground. As of SDK 1.6.x it carries: - the encoded video stream (H.264 or H.265) and its forward error correction - MAVLink telemetry forwarded from PX4 at `mavlink_telem_rate_hz`, which the VRX renders on the OSD and can forward to a GCS or ATAK device on its IP network (see [Telemetry & Network](#telemetry--network)) - AI detection metadata drawn as bounding boxes on the VRX OSD (see [AI Detection](/ai-detection-setup-guide/)) It does not carry a general-purpose data channel. There is no supported way to send custom companion-computer data (for example, application-generated observations as binary or JSON) from the drone to a ground station over the digital video link, and nothing travels from the VRX back to the drone over it. The only ground to air path today is the separate [ELRS 915 MHz RC link](/stinger-vision-binding-details/), which carries stick and switch inputs to PX4. If your application needs a bidirectional data path between the drone and a ground station, use an IP link: the VTX's SoftAP mode or an external WiFi dongle in station mode, a USB-to-Ethernet adapter, or an LTE or mesh modem, as described under [Video Streaming over IP Networks](#video-streaming-over-ip-networks). Note that the VTX radio and the built-in WiFi share the same hardware, so RF video and built-in WiFi cannot run at the same time; see the [VTX Software Guide](/vtx-air-unit-software-guide/#vtx-wifi-limitation). > This describes the capability at SDK 1.6.x. Richer bidirectional communication, including MAVLink over the ELRS link, is planned for a future release. Check the [SDK release notes](/voxl-suite/) for the version you are running rather than treating this as the final capability of the hardware. # Use Cases ## Video Streaming over RF This is how systems are configured by default and use the integrated RF path to stream video. ![One VTX streaming to one VRX over RF](/images/r0001/quick-start/r0001-use-case-1-to-1.jpg) ### Using Multiple VRX to View Single VTX Multiple VRXs can view the stream from the same VTX (assuming they share [encryption keys](/vrx-ground-unit-quick-start-guide/#vtxvrx-changing-encryption-keys)) and are on the same channel. ![One VTX viewed by multiple VRX units](/images/r0001/quick-start/r0001-use-case-1-to-many.jpg) ### Viewing Multiple VTX from Single VRX Again assuming the VTXs and VRXs share the same [encryption keys](/vrx-ground-unit-quick-start-guide/#vtxvrx-changing-encryption-keys), we can stream from multiple VTXs to a VRX (or again multiple VRXs...). For this use case, we need to first configure the VTXs to be on different channels. The procedure is as follows: Setup: - Ensure VTXs/VRXs have same encryption key (or are all using the default) - Power on one VTX at a time - Change the frequency/channel of the VTX using the OSD menu (see this [video at 223 seconds](https://youtu.be/ZaMbbN3_ycg?t=223) as to how to change frequencies/channels) - Power off the VTX - Set VRX back to default frequency/channel (5805/161) - Power on next VTX to setup (assuming its out of the box, default frequency is 5805), and change frequency again off the default. Repeat for N VTXs. Usage: - All VTXs and VRX can be powered on now - Using the [Channel Scan](/vrx-ground-unit-quick-start-guide/#buttons) buttons, you can scan through the available streams from the VTXs ![Multiple VTX units viewed from a single VRX](/images/r0001/quick-start/r0001-use-case-many-to-1.jpg) ## Video Streaming over IP Networks ### Overview Another use case the VTX/VRX system supports is streaming over IP networks. The pilot can view the low latency video via goggles connected to Display Port output of the VRX. Different modem types can be used, where we capture below USB-to-Ethernet, Doodle Labs, and LTE use cases. If using LTE, both drone and VRX can be configured with VPN clients and can stream over through a network a VPN server facilitates. Tailscale VPN client ships in VOXL2 starting SDK 1.6. Additionally, the `voxl-joystick-server` can be used to send RC over MAVLink to a drone for command and control, plugging a controller into a USB hub connected to the AUX USB port. ### Block Diagrams The block diagram below describes this architecture: - the VRX is connected to the internet via USB-to-Ethernet - the UAS/VTX is connected to the internet with LTE - both UAS/VTX are connected to the same IP network using a VPN - the VTX is configured to send UDP traffic to the VRX IP address(es) / port. - a user can view the video stream from the DisplayPort Out with an HDMI adapter to goggles/display ![VRX UDP video streaming block diagram](/images/r0001/quick-start/r0001-use-case-udp-diagram.jpg) ### VRX Software Configuration To enable receiving IP traffic (UDP really), edit the `/etc/modalai/voxl-vrx.conf` file. | Name | Type | Required | Description | | ----------------------------- | -------- | -------- | --------------------------------------------------------- | | `udp` | bool | Yes | false - don't transmit over UDP, true - transmit over UDP | | `udp_ip` | string | Yes | IP address of the local interface (the VRX) | | `udp_port` | string | Yes | the UDP port the transmitter is sending to (see `udp_receiver_configs->port`) | For example: ``` ... "udp": true, "udp_ip": "100.223.0.101", "udp_port": 50000, ... ``` ### VTX Software Configuration To enable this use case on the UAS, edit the `/etc/modalai/voxl-vtx.conf` file: | Name | Type | Required | Description | | ----------------------------- | -------- | -------- | --------------------------------------------------------- | | `udp` | bool | Yes | false - don't transmit over UDP, true - transmit over UDP | | `udp_transmitter_ip` | string | Yes | IP address of the transmitter IP (the VTX/UAS) on the interface specified | | `udp_receiver_configs` | object | Yes | List of IP/port pairs to transmit to | | └─ `ip` | string | Yes | IP address of the VRX | | └─ `port` | integer | Yes | Port the VRX software is configured to listen on | For example, set `udp_transmitter_ip` to the IP of the interface on the transmitter/VTX/UAS side, and the receiver IP/ports that you want to send data to: ``` ... "udp": true, "udp_transmitter_ip": "10.223.0.100", "udp_receiver_configs": [ { "ip": "10.223.0.101", "port": 5000 } ], ... ``` ### Interface Options ---
#### Ethernet Adapter The VRX's `AUX USB` port can be used to add an Ethernet adapter (like the [TUC-ETGH3](https://www.trendnet.com/products/usb-c-adapter-and-hub/usb-c-to-gigabit-adapter-plus-usb-hub-TUC-ETGH3)). When the VRX is connected to an IP network, we can send video over IP instead of RF. ![VRX with USB-to-Ethernet adapter](/images/r0001/quick-start/r0001-use-case-vrx-eth.jpg) When an Ethernet adapter is attached to AUX USB, it will by default get a static IP (see `Static IP from VRX with USB-to-Ethernet` below). ``` eth0: flags=4163 mtu 1500 inet 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255 ether 00:30:1a:3b:86:9e txqueuelen 1000 (Ethernet) RX packets 253 bytes 64410 (64.4 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 467 bytes 27898 (27.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` --- #### Doodle Labs
The following shows how to configure a Doodle Labs modem setup to be used with the VRX system. First follow `VRX Software Configuration` and `VTX Software Configuration` sections above. ![MVC-RH01-M18 Doodle Labs wiring diagram](/images/r0001/quick-start/CWD-MVC-RH01-M18-REV0.jpg) On the VRX, to setup the Doodle Lab modem connected over USB, you will need to: - ADB on to the VRX (see `ADB Access to VRX` below). - run `voxl-configure-modem doodle-vrx` This will setup a new interface with default IP `10.223.0.101`. In this case it's `eth1`, as we have a USB-to-Ethernet dongle on `eth0`. ``` eth1: flags=4099 mtu 1500 inet 10.223.0.101 netmask 255.0.0.0 broadcast 10.255.255.255 ether 78:2d:7e:14:f9:4d txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` You can interface with the Doodle Labs modem using the `doodl-cli` tool that ships in the SDK. On VRX, for example to get the IP address of the Doodle, ```bash voxl2:/$ doodle-cli -i 10.223.0.101 xxxx::138f:beb0:e79b:xxxx ``` For VTX/UAS side, for reference, the following could be done with a Doodle Labs enabled VOXL UAS: - ADB onto VTX/UAS - run: ```bash voxl2:/$ voxl-configure-modem doodle ``` The VTX/UAS side should get an interface like: ``` eth0: flags=4163 mtu 1500 inet 10.223.0.100 netmask 255.0.0.0 broadcast 10.255.255.255 ether 00:30:1a:3b:86:a6 txqueuelen 1000 (Ethernet) RX packets 1242 bytes 209966 (209.9 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2054 bytes 108812 (108.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` --- #### LTE
First follow `VRX Software Configuration` and `VTX Software Configuration` sections above. Then follow the information on [VOXL SDK LTE software setup](/lte-v2-modem-user-guide/#software-setup) For hardware: - On VTX side - you could use LTE hotspot with Ethernet out and plug into the Ethernet port of the USB-hub option above. - On the VTX - instead of the VTX modem, we can use an IP based modem like the [M0130](/lte-io-breakout-usb-hub-datasheet/) LTE modem/antennas/SIM card, e.g. similar to this. ## Static IP from VRX with USB-to-Ethernet Using a USB-to-Ethernet adapter (and sometimes a USB-C to USB-A adapter like in the setup below), you can easily get an IP connection with the VRX. ![VRX Ethernet adapter connection close-up](/images/r0001/quick-start/r0001-use-case-vrx-eth-zoom.jpg) Starting in SDK 1.6, the `voxl-static-ip-watcher` service will run by default on the VRX. When you plug in a USB to Ethernet dongle to the AUX port, it enumerates as `eth0`, and will be assigned static IP `10.0.0.2` with default netmask `255.255.255.0` If you want to customize this, edit `/etc/systemd/system/voxl-static-ip-watcher.service`. ``` Environment=NETWORK_INTERFACE=eth0 Environment=STATIC_IP=10.0.0.2 Environment=DEBUG=0 Environment=NETMASK=255.255.255.0 ``` ## RTSP Stream From VRX The `voxl-streamer` services runs on the VRX by default and exposes an RTSP endpoint at `rtsp://10.0.0.2:8900/live`. If the VTX is off, you should get a "black screen" for the feed. ## SSH Access to VRX After getting an IP connection following the previous setup, you can get an SSH connection. **NOTE: The static IP functionality is supported in SDK 1.6.X and newer** ``` ssh root@10.0.0.2 (password: oelinux123) ``` ## ADB Access to VRX To access the VRX via ADB, disconnect the USB-C to HDMI adapter from the VRX and connect your USB-C cable to the same USB-C port. ```bash adb shell ``` See the Interfaces section of the [VRX Ground Unit Quick Start Guide](/vrx-ground-unit-quick-start-guide) for more details. ## voxl-joystick-server Setup **NOTE: voxl-joystick-server requires SDK 1.5.0+, recommend 1.6+** ### USB Mode - Connect USB C from USB HUB in VRX to RadioMaster Zorro and hold the power button to power on ![Joystick server USB mode setup, step 1](/images/r0001/developer-guide/joystick-server-0.jpg) - Use the scroll wheel to set transmitter to "USB Joystick (HID)" mode. Press the scroll wheel to select mode ![Joystick server USB mode setup, step 2](/images/r0001/developer-guide/joystick-server-1.jpg) - Confirm that edgeTX version is v.2.10+ - Press "SYS" button, this will bring you to the "TOOLS" Page - Press "PAGE<" button to Navigate left to the "VERSION" Page - Confirm edgeTX version is >= v2.10 (ex: VERS: v2.10.6) - If you need to upgrade, instructions can be found [here](https://manual.edgetx.org/installing-and-updating-edgetx/update-from-opentx-to-edgetx-1) - How to get TX into DFU [found here](https://manual.edgetx.org/edgetx-how-to/access-dfu-and-bootloader-mode) ![Joystick server USB mode setup, step 3](/images/r0001/developer-guide/joystick-server-2.jpg) ### Joystick Configuration #### Mixes setup - Navigate to the Model Selection Menu - Navigate to the "MIXES" page - Assign CH1-4 to be axes: pitch, roll, thrust, and yaw ![Radio mixes page, axes](/images/r0001/developer-guide/joystick-server-mixes-page-axes.jpg) - Assign buttons/switches to CH9 or higher, these will be referenced in the Joystick Axes and Switches/Buttons Setup section below - Select each channel to be used and set the source as the physical button/switch you want to be linked to that channel ![Radio mixes page, buttons](/images/r0001/developer-guide/joystick-server-mixes-page-buttons.jpg) #### Joystick Axes and Switches/Buttons Setup - Navigate to the Model Selection Menu - Navigate to the "SETUP" page - Scroll all the way to the bottom until you see the "USB Joystick" section ![Joystick axes and switches setup, step 1](/images/r0001/developer-guide/joystick-server-setup-page.jpg) - In the "USB Joystick" section: - Set "Mode" to "Advanced" - Set "If.mode" to "Joystick" - Set "Circ. cut" to "None" (Pilot should verify this is what is desired) ![Joystick axes and switches setup, step 2](/images/r0001/developer-guide/joystick-server-setup-page-2.jpg) - Navigate down to "[Channel Settings]" and select enter to enter the menu - Setup X,Y,Z and rotations on channels (1-8) or whichever order you want them to be in if applicable - The channel(s) used for switches/buttons need to be on channel 9 or above - More information can be found in the [EdgeTX Manual](https://manual.edgetx.org/color-radios/model-settings/model-setup/usb-joystick) - Navigate to a channel you want to assign a button/switch on your RC to, then click edit - Set "Mode" to "Btn" - Set "Positions" to either "2POS", "3POS", or whatever type is relevant depending on the physical switch it will be attached to - Set "Button no." to be the button numbers that you want this switch to populate - For example, for a 2POS switch a user can set the button "0..1", "1..2", etc depending on which button numbers are already in use (A warning "!Button no. collision!" will appear if the range you are trying to use is already in use) ![Joystick axes and switches setup, step 3](/images/r0001/developer-guide/joystick-server-setup-page-3.jpg) ![Joystick axes and switches setup, step 4](/images/r0001/developer-guide/joystick-server-setup-page-4.jpg) - Repeat the steps above for all buttons you want to setup ### Application Configuration - ADB or SSH onto the VRX - Run `voxl-configure-joystick-server -w` and then select "3" for "Settings" ![Joystick server application configuration, step 1](/images/r0001/developer-guide/joystick-server-3.jpg) - Now assign the X, Y, Z, and R channels to roll, pitch, yaw, and throttle - Descriptions from mavlink manual_control header file: - X: X-axis, normalized to the range [-1000,1000]. Generally corresponds to forward(1000)-backward(-1000) movement on a joystick and the pitch of a vehicle. - Y: Y-axis, normalized to the range [-1000,1000]. Generally corresponds to left(-1000)-right(1000) movement on a joystick and the roll of a vehicle - Z: Z-axis, normalized to the range [-1000,1000]. Generally corresponds to a separate slider movement with maximum being 1000 and minimum being -1000 on a joystick and the thrust of a vehicle. Positive values are positive thrust, negative values are negative thrust. - R: R-axis, normalized to the range [-1000,1000]. Generally corresponds to a twisting of the joystick, with counter-clockwise being 1000 and clockwise being -1000, and the yaw of a vehicle. - Update Rate: Optionally increase the update rate ![Joystick server application configuration, step 2](/images/r0001/developer-guide/joystick-server-4.jpg) - Now decide how you want to throttle to behave: Zero throttle at center stick or full range. - Set center_zero_throttle to true if you want the center stick position to be zero throttle. Otherwise, set center_zero_throttle false - Now provide the file path to your Joystick, the default config here should work, typically on VRX this will be `/dev/input/event2`. If the defauly path doesn't work, you may need to watch this directory as you plug in your Joystick to determine which event is linked to your Joystick. - Now setup the network connection - Receiver: receiver_ip should be the IP address of the drone and receiver_port should remain as the default (14550) as this is the port that voxl-mavlink-server listens to on the drone. - Transmitter: transmitter_ip should be the IP address of this device (the VRX). transmitter_name should be the name of the network interface to be used for transmitting the data (likely wlan0, tailscale0, or wwan0) ### Troubleshooting #### Joystick to VRX interface To see if the VRX is seeing the Joytick inputs: - adb on to VRX - stop the joystick service: ```bash systemctl stop voxl-joystick-server ``` - manually run with `-d` option for debug joystick events ```bash voxl-joystick-server -d ``` Here is an example output: ``` voxl2:~$ voxl-joystick-server -d Found 1 UDP Configurations Joystick detected: OpenTX Radiomaster TX12 Joystick (/dev/input/event2) WARNING: No kill switch button provided: -1. Valid options: 0-31. PITCH: Y ROLL: X YAW: R THROTTLE: Z ARM BUTTON: 0 KILL BUTTON: -1 CENTER ZERO THROTTLE: FALSE UPDATE RATE: 200Hz INPUT DEVICE: /dev/input/event2 TX-IP: 10.223.0.101 [1] RX-IP: 10.223.0.100 [1] RX-PORT: 14550 [debug] Debug mode enabled existing instance of voxl-joystick-server found, attempting to stop it Device: OpenTX Radiomaster TX12 Joystick UDPMultiForwarder: add forwarding to: 10.223.0.100:14550 UDPForwarder::configured for 10.223.0.100:14550 via 10.223.0.101 [debug] ev { time=1718656274.505133, type=3, code=0, value=1023 } [debug] ev { time=1718656274.505133, type=3, code=1, value=825 } [debug] ev { time=1718656274.505133, type=0, code=0, value=0 } [debug] ev { time=1718656274.510144, type=3, code=0, value=1042 } [debug] ev { time=1718656274.510144, type=3, code=1, value=791 } [debug] ev { time=1718656274.510144, type=0, code=0, value=0 } ``` #### Joystick Network Connection to VTX/UAS To see if the connection is being made from the VRX to the VTX/UAS, do the following: - adb shell onto VTX/UAS - manually run the following: ```bash voxl-mavlink-server ``` When the VRX connects, you should see something like this (where these IPs may be different for your setup) ``` Added new UDP connection to 10.223.0.101 CONNECTED to GCS at 10.223.0.101 ``` #### Check For mamual control events From VRX To see the manual control events originating from the VTX, do the following: ```bash voxl-inspect-mavlink mavlink_from_gcs ``` Here is an example output: ``` | ID | Mavlink MSG Name |Counter| Hz | |-------|-----------------------------|-------|------| | 0 | heartbeat | 7 | 1.0 | | 69 | manual_control | 1414 |196.1 | ``` #### Check For manual_control_setpoint Events from PX4 ``` px4-listener manual_control_setpoint TOPIC: manual_control_setpoint manual_control_setpoint timestamp: 380219234 (0.003195 seconds ago) timestamp_sample: 380218414 (820 us before timestamp) roll: 0.99700 pitch: -0.00100 yaw: -0.00500 throttle: -0.99800 flaps: 0.00000 aux1: 0.00000 aux2: 0.00000 aux3: 1010.00000 aux4: 1000.00000 aux5: 0.00000 aux6: 0.00000 valid: True data_source: 3 sticks_moving: False ``` No events? Make sure `voxl-px4` is setup for `EXTERNAL` RC: - Check `/etc/modalai/voxl-px4.conf` - If wanting to use USB Joystick mode, set `RC=EXTERNAL` Check that the PX4 param `COM_RC_IN_MODE` is set to 1: ``` voxl2:/$ px4-param show COM_RC_IN_MODE Symbols: x = used, + = saved, * = unsaved x + COM_RC_IN_MODE [249,531] : 1 ``` If not, you can use: ``` px4 param set COM_RC_IN_MODE 1 ``` ## AI Detection For information on setting up AI object detection with real-time bounding box overlay on the video stream, see the [AI Detection Setup Guide](/ai-detection-setup-guide/). --- Source: https://docs.modalai.com/vrx-ground-unit-goggles-compatibility/ # VRX Ground Unit Goggles Compatibility --- # MVX VRX Goggles Support The **VRX (Video Receiver) Ground Unit**, with **SKU MVX-R0001 (VRX Gen1.5)** , is designed to be compatible with various goggles. For video output, the VRX utilizes a **USBC DisplayPort** running at **60 frames per second (FPS)** . Therefore, a **DisplayPort to HDMI Adapter** is generally required to connect the VRX to goggles. An example adapter is [Cable Matters 48Gbps USB C to HDMI 2.1 Adapter](https://www.amazon.com/gp/product/B08MSWMXT4). Below is a compatibility guide for tested goggles and their necessary cables and adapters, including available purchase links: ### Tested Goggles and Required Accessories for VRX * Orqa FPV.One Pilot Goggles * Goggles: [FPV.One Pilot](https://shop.orqafpv.com/products/orqa-orqa-fpv-one-pilot) * Cables/Adapters: * [Duttek 4K Mini HDMI to HDMI Coiled Cable 1FT-4FT](https://www.amazon.com/gp/product/B088BLPQSD/) * [Cable Matters 48Gbps USB C to HDMI 2.1 Adapter](https://www.amazon.com/gp/product/B08MSWMXT4) * Fatshark HDO+ FPV Goggles * Goggles: HDO+ FPV Goggles (discontinued) * Cables/Adapters: * [Duttek 4K Mini HDMI to HDMI Coiled Cable 1FT-4FT](https://www.amazon.com/gp/product/B088BLPQSD/) * [Cable Matters 48Gbps USB C to HDMI 2.1 Adapter](https://www.amazon.com/gp/product/B08MSWMXT4) See also the [VRX Ground Unit Quick Start Guide](/vrx-ground-unit-quick-start-guide/) and [Developer Guide](/vrx-ground-unit-developer-guide/). NotebookLM can be inaccurate; please double check its responses. --- Source: https://docs.modalai.com/vrx-ground-unit-list-of-certifications/ # VRX Ground Unit List of Certifications - For evaluation only; not FCC approved for resale `FY 2024 NDAA, Sections 1823-1833` - aka, American Security Drone Act of 2023 (ASDA) `FY 2023 NDAA, Sec 817` - Modification to prohibition on operation or procurement of foreign-made unmanned aircraft systems. `FY 2020 NDAA, Section 848` - Prohibition on operation or procurement of foreign-made unmanned aircraft systems. --- Source: https://docs.modalai.com/vtx-air-unit-datasheet/ # VTX Air Unit Datasheet ![VTX Air Unit kit](/images/t0001/t0001-hero-2.jpg) --- ## Overview ### Images ![VTX Air Unit](/images/t0001/t0001-hero-3.jpg)
![VTX Air Unit, alternate view](/images/t0001/t0001-hero-4.jpg) ### High-Level Specs | | | |:---------------------------------------|:------------------------------------------------------| | Range | 10km+ 5GHz or 2.4GHz (LOS) | | Video Performance | 1280*720@60fps, 40ms glass-to-glass min, 50ms avg | | Frequencies Supported | 2.412-2.484GHz or 5.160-5.885GHz | | Compute. | ModalAI M0204-1 - VOXL 2 Mini | | USB Port | Yes (USB2 Peripheral mode). | | IP Interface | Yes (USB-to-Ethernet -> RTSP) | | Weight | 86g (C51 camera config, EO + IR) w/o battery | | Size | Size (L x W x H): 45mm x 45mm x 25mm | | Battery/Power | 2S-6S (6.4-25.2V), XT60 connector, 6W max | | Antennas | QTY2 U.FL (MHF1), 5GHz (qty-1) and 2.4GHz (qty-1) | | Image Sensor Options | C50 IMX664, C51 IMX664 and Boson+ (stream switchable) | ### Supported VRX Ground Units - [VRX Ground Unit](/vrx-ground-unit/) (`MVX-R0001-7-M31`) ### VOXL SDK Support The VTX Air Unit is supported in VOXL SDK 1.6.0+ See [VTX Ground Unit Software Guide](/vtx-air-unit-software-guide/) for more details. ## Enclosure/Mount ### Version 1 - Primary Mounting Hole Pattern - 20mm x 20mm - M2 screws - use this to mount to frame - Secondary - 30.5mm x 30.5mm - VOXL2 Mini (M0204) mounts to these 'passthrough' holes ![VTX mounting, step 1](/images/t0001/t0001-quickstart-mount-v2.jpg)
![VTX mounting, step 2](/images/t0001/t0001-quickstart-mount-v3.jpg)
![VTX mounting, step 3](/images/t0001/t0001-quickstart-mount-v4.jpg)
![VTX v1 enclosure, top](/images/t0001/t0001-quickstart-enclosure-v1-top.jpg)
![VTX v1 enclosure, bottom](/images/t0001/t0001-quickstart-enclosure-v1-bottom.jpg)
## Interfaces ![VTX interfaces, labeled](/images/t0001/t0001-quickstart-interface-v1.jpg) ## Antennas - `M10001287` - SINGULARITY 2.4 V2, RHCP, 100mm tube, 190mm RG178 to U.FL - `M10001288` - CP5.1, RHCP, 100mm tube, 190mm RG178 to U.FL ## Power Connectors - `MCBL-00115-1` - XT30 (included) - `MCBL-00116-1` - XT60 (standard) ## Image Sensors - `MCCA-M0186` - IMX664 (standard) - `M10000958-C` - Boson+ (option) ## Micro Coax Cables - `MCBL-00084-140` - 140mm micro coax ## SKUs ### Stand Alone VTX | ModalAI SKU | Description | |:---------------------------------------|:------------------------------------------------------------------------| | `MVX-T0001-6-V1-C50-M26` | VTX, Gen1.5, IMX664 (EO) | | `MVX-T0001-6-V1-C51-M26` | VTX, Gen1.5, IMX664 (EO), Boson+ (IR) | ![MVX-T0001-6-V1-C50-M26 stand-alone VTX wiring diagram](/images/t0001/CWD-MVX-T0001-6-V1-C50-M26-REV1.jpg) ### Drones with VTX | ModalAI SKU | Description | |:---------------------------------------|:------------------------------------------------------------------------| | `MRB-D0013-6-V2-C33-M26-T8-X8` | Stinger | | `MRB-D0013-6-V2-C34-M26-T8-X8` | Stinger with Boson+ IR | ![D0013-6-C33-M26-X8 wiring diagram](/images/d0013/CWD-D0013-6-C33-M26-X8-REV7.jpg) ### VTX Image Sensors | ModalAI SKU | Description | |:---------------------------------------|:------------------------------------------------------------------------| | `MSA-T0001-1-03` | VTX Subassembly, Image Sensor, IMX664 EO | | `MSA-T0001-1-04` | VTX Subassembly, Image Sensor, Boson+ IR | ### VTX Antenna | ModalAI SKU | Description | |:---------------------------------------|:------------------------------------------------------------------------| | `MVX-TA01` | VTX Subassembly, Antenna Kit (2.4/5GHz) | | | `M10001287` - SINGULARITY 2.4 V2, RHCP, 100mm tube, 190mm RG178 to U.FL | | | `M10001288` - CP5.1, RHCP, 100mm tube, 190mm RG178 to U.FL | ### Other | ModalAI SKU | Description | |:---------------------------------------|:------------------------------------------------------------------------| | `MSA-T0001-1-01` | VTX Subassembly, Compute, Radio, Cables | | `MSA-T0001-1-02` | VTX Subassembly, Fasteners, 3D Printed Parts | | `MSA-T0001-1-52` | VTX Subassembly, Accessories | --- Source: https://docs.modalai.com/vtx-air-unit-quick-start-guide/ # VTX Air Unit Quick Start Guide --- # Read First **The VTX units ship with antennas attached. Never power on VTX unit without antennas attached! Powering on without antennas will permanently damage unit** # Quick Start ## Power Supply ![VTX power supply connection](/images/t0001/t0001-quickstart-power-supply-v0.jpg) ## Antennas - RHCP ![VTX antenna connections](/images/t0001/t0001-quickstart-antennas-v0.jpg) ## Image Sensor C50 ![C50 image sensor connection](/images/t0001/t0001-quickstart-image-sensor-eo0-v0.jpg) ## MSP UART ![MSP UART connection](/images/t0001/t0001-quickstart-msp-v0.jpg) # Hardware Overview ## Interfaces ![VTX interfaces, labeled](/images/t0001/t0001-quickstart-interface-v1.jpg) ## OSD MSP DP Included in the `MVX-T0001` standalone kits are cables that might work for your use case, otherwise modify using the pigtail version to what you need. - `MCBL-00083-1` - Cable, VOXL 2 & VOXL 2 Mini J10, full JST GH 8-pin breakout, 26AWG, 100mm - `MCBL-00151-2` - Cable, VOXL 2 Mini OSD UART Rotor Riot F7 DVTX, 100mm - `MCBL-00160-1` - Cable, VOXL2 Mini OSD UART, Pixhawk Style, 100mm (Want more options OSD UART cable options? Let us know!) ### Rotor Riot F7 Betaflight Here's an example of how to wire it up. See [here](/vtx-air-unit-software-guide/) for note on Beta Flight FW. ![D0017-8-V1-C50-M26-T8 MSP wiring diagram](/images/t0001/CWD-D0017-8-V1-C50-M26-T8-MSP.jpg) ## Battery/Power Supply 2S-6S supported, ~5W max usage ## Antennas - `M10001287` - Antenna, SINGULARITY 2.4 V2, RHCP, 100mm tube, 190mm RG178 to U.FL - `M10001288` - Antenna, CP5.1, RHCP, 100mm tube, 190mm RG178 to U.FL # System Overview ## Pairing/Binding with VTX VTX and VRX should "pair" when both powered up by default as shipped from the factory. Cool use cases (and things to be aware of when powering on multiple units at a time): - Multiple VTXs can be configured on different channels, and a single VRX can swap between channels to stream from multiple VTXs. - Multiple VRXs can be "paired" with a single VTX, allowing for multi view drop from a VTX - VTX can be configured to send over IP to VRX over VPN offering low latency stream # Software Overview The VTX Air Unit is supported in VOXL SDK 1.6.0+. See [VTX Air Unit Software Guide](/vtx-air-unit-software-guide/) for more details. ## Default Settings VTX and VRX ship with default: - frequency set to 5.805 GHz - encryption key, to generate new ones (recommended) see the [Software Guide](/vtx-air-unit-software-guide/#encryption-key--binding) ## OSD To access the OSD menu: ![Stick command to access the OSD menu](/images/r0001/quick-start/accessing-osd-sticks.jpg) Example of the current OSD menu: ![VRX on-screen display](/images/r0001/quick-start/r0001-current-osd.jpg) --- Source: https://docs.modalai.com/vtx-air-unit-software-guide/ # VTX Air Unit Software Guide --- # VOXL SDK Support ## SDK Versions VOXL SDK 1.6.X+ recommended ([downloads](https://downloads.modalai.com/)). ## Core Services The VTX runs the standard VOXL SDK. The services below do the video work: | Service | Config file | Role | |:---------------------|:---------------------------------------|:------------------------------------------------------------| | `voxl-camera-server` | `/etc/modalai/voxl-camera-server.conf` | Publishes camera pipes, including the encoded video streams | | [`voxl-osd`](#voxl-osd-service) | `/etc/modalai/voxl-osd.conf` | Renders the on-screen display over the video | | `voxl-vtx` | `/etc/modalai/voxl-vtx.conf` | Transmits video + telemetry over the digital link | # voxl-vtx Service `voxl-vtx` is the digital video transmitter service. It pulls encoded video from a camera pipe, applies forward error correction, and transmits it over the RF link (or UDP over an IP network). It runs as the systemd service `voxl-vtx.service` (starts after `voxl-camera-server`, restarts automatically). The service is not enabled by simply installing the package — use `voxl-configure-vtx`: ```bash voxl-configure-vtx --enable # load the VTX kernel module and enable the service voxl-configure-vtx --disable # restore the standard WiFi driver and disable the service ``` > The VTX radio and standard WiFi share the same hardware. To use WiFi, disable the VTX first — see [Using VTX as Standard WiFi Modem](#using-vtx-as-standard-wifi-modem). ## voxl-configure-vtx `voxl-configure-vtx` manages `/etc/modalai/voxl-vtx.conf` and can push settings live to a running service: ``` Usage: voxl-configure-vtx -h -l -F -m -s -p -P -t -e -d -f -w -h, --help Show this help message and exit -l, --list Show the current configuration -F, --frequency Set frequency -m, --mcs Set MCS index for the current active profile -s, --source Set pipe to get video from for the current active profile -p, --power Set power idx (not mW) for the current active profile (does not save to configuration file) -P, --power-mw Set power in milliwatts (mW) for the current active profile -t, --toggle Toggle between Wifibroadcast and SoftAP mode -e, --enable Load modified kernel module for RTL8812AU and enable voxl-vtx service -d, --disable Load default kernel module and disable voxl-vtx service -f, --factory_enable Enable and restore default configuration file -w, --wizard Start interactive wizard ``` Useful behaviors: - Running with a missing config file writes factory defaults first. - `--wizard` walks every setting interactively, including a video-profile editor. - Live changes (frequency, MCS, power, profile) are pushed to the running service via its control pipe — no restart needed. - UDP receiver endpoints can be managed with `--add_udp_receiver `, `--remove_udp_receiver `, and `--clear_udp_receivers`. - Factory presets exist for common radio setups (`--factory_enable_lte`, `--factory_enable_doodle`, `--factory_enable_dtc`) and supported vehicle SKUs. ## Configuration File Reference `/etc/modalai/voxl-vtx.conf` (JSON). Created with defaults on first run. The VRX must match `frequency`, `bandwidth`, and the FEC settings. ### Wireless | Field | Default | Meaning | |:--------------|:----------|:-----------------------------------------------------| | `frequency` | `5805` | Center frequency in MHz (VRX must match) | | `bandwidth` | `20` | Channel bandwidth in MHz: 20 or 40 (VRX must match) | | `card` | `"wlan0"` | Radio interface name | | `enable_pcap` | `true` | Enable the RF transmit path | | `enable_pit` | `true` | PIT mode: reduced TX power for bench testing | | `enable_stbc` | `1` | Space-Time Block Coding (spatial streams) | | `regulatory_mode` | `"off"` | `"off"` or `"fcc"` — when set, DFS frequencies are blocked and power is limited where required | ### Forward Error Correction | Field | Default | Meaning | |:-----------------|:--------|:---------------------------------------------------------------------| | `enable_fec` | `true` | Enable FEC (VRX must match) | | `fec_percent` | `-1` | FEC overhead %: `-1` = auto (min 75%), `0` = headers only, `>0` = explicit | | `fec_block_size` | `30` | Fragments per FEC block (larger = more compute) | ### Video Profiles `profiles` is an array of video stream profiles (e.g. Default, Thermal, Tracking, Long Range, Low Latency), selected by `active_profile_idx`, an RC switch, joystick buttons, or the OSD menu. | Field | Default | Meaning | |:---------------------|:--------|:-----------------------------------------------------------------| | `active_profile_idx` | `0` | Index of the active profile | | `rc_toggle` | `-1` | RC channel that cycles profiles (`-1` = off) | | `rc_switch_profiles` | `[]` | Profile indices reachable from the RC switch | | `osd_rc_toggle` | `-1` | RC channel for OSD on/off (LOW = on, HIGH = off) | | `osd_joystick_toggle`| `-1` | Joystick button for OSD on/off | Each profile entry: | Field | Meaning | |:-------------------------|:--------------------------------------------------------------------| | `name` | Profile name shown in the OSD menu | | `source` | MPA pipe carrying encoded video (e.g. `hires_default_misp_encoded`) | | `mcs` | Modulation/Coding Scheme 0-7 (higher = faster, less robust) | | `mtu` | Payload size in bytes (1341 max for H.265, 1342 for H.264) | | `power` | TX power in mW, 0-1000; `-1` = maximum | | `udp_camera_bitrate_bps` | Requested camera bitrate when streaming over UDP | | `invert_toggle` | RC channel for thermal color invert (`-1` = off) | | `joystick_toggle` | Joystick button that selects this profile (`-1` = none) | | `ai_detection_enable` | Send AI detections to the VRX for this profile | | `ai_detection_source` | Detection pipe (default `object_tracker_meta`) | | `ai_detection_qty` | Max detected objects sent to the VRX | | `ai_detection_threshold` | Detection confidence threshold 0.0-1.0 | ### Telemetry & Link Behavior | Field | Default | Meaning | |:--------------------------|:--------|:-------------------------------------------------------------------------| | `info_rate_hz` | `5` | Rate VTX info packets are sent to the VRX | | `mavlink_telem_rate_hz` | `30` | Rate MAVLink telemetry is forwarded to the VRX | | `rc_deadman_en` | `false` | Stop all TX when the flight controller reports RC link loss | | `rc_deadman_tx_timeout_ms`| `60000` | How long to keep transmitting after RC loss before stopping | ### UDP Mode (IP networks) For streaming over LTE, Doodle Labs, DTC, or wired IP networks instead of (or alongside) the RF link. See the [VRX Developer Guide](/vrx-ground-unit-developer-guide/#video-streaming-over-ip-networks) for the full walkthrough. | Field | Default | Meaning | |:------------------------|:--------|:------------------------------------------------| | `udp` | `false` | Use UDP instead of RF packet injection | | `udp_interface_ip` | `""` | Local IP of the interface to transmit from | | `udp_interface_rx_port` | `50001` | Local port to listen on | | `udp_receiver_configs` | `[]` | Remote receivers, each `{"ip": ..., "port": ...}` | ### RF / IP Automatic Fallback With both RF and UDP configured, the VTX can move video to IP automatically when the RF link degrades, and back when it recovers. Enable with `voxl-configure-vtx --enable_ip_fallback`. | Field | Default | Meaning | |:---------------------------|:--------|:---------------------------------------------------------------| | `enable_ip_fallback` | `false` | Enable automatic RF/IP switching | | `snr_low_threshold` | `15` | Switch RF→IP when RF SNR (dB) sustains below this | | `snr_high_threshold` | `20` | Switch IP→RF when RF SNR sustains above this (hysteresis) | | `link_switch_dwell_ms` | `1000` | How long the condition must hold before switching | | `ip_liveness_timeout_ms` | `2000` | IP counts as available only if a packet arrived this recently | | `pcap_liveness_timeout_ms` | `2000` | If RF goes silent this long and IP is up, switch immediately | The VRX shows the current RF/IP source on its OSD. ### System | Field | Default | Meaning | |:-----------------------|:--------|:----------------------------------------------------------| | `i2c_port` | `0` | I2C bus for the power/temperature sensor (`-1` disables) | | `perf_mode` | `false` | Performance CPU governor while armed (lower latency) | | `disable_transmissions`| `false` | Disable all wireless transmission (test/debug) | | `debug_log` | `"off"` | Disk logging: `"off"`, `"on"`, or `"arm"` (log when armed) | ## Supported Frequencies `voxl-configure-vtx --frequency` accepts the following center frequencies (MHz). Default is **5805 (channel 161)**; bandwidth may be 20 or 40 MHz. | Band | Frequencies | |:--------|:------------------------------------------------------------------------------------------------------------------------------| | 2.4 GHz | 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484 | | 5 GHz | 5160, 5180, 5200, 5220, 5240, 5260, 5280, 5300, 5320, 5340, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680, 5700, 5720, 5745, 5765, 5785, 5805, 5825, 5845, 5865, 5885 | ## TX Power - Per-profile `power` is set in **milliwatts (0-1000)**; `-1` means maximum power. - `voxl-configure-vtx --power-mw ` changes the active profile's power live and persists it. - PIT mode (`enable_pit`) keeps TX power at a bench-safe minimum; toggle it from the OSD menu when ready to fly. ## Encryption Key / Binding VTX and VRX bind by sharing an encryption key file — there is no over-the-air pairing. - Units ship with a default key and will link out of the box. - Generate a new key with `voxl-vtx-keygen` (on target, or any Linux host): `-b ` makes the key deterministic from the phrase; without `-b` a random key is generated. Output is `vtx.key`. - To install a key, copy `vtx.key` onto a USB flash drive and plug it into the unit — it is detected and installed to `/data/modalai/vtx.key` automatically. Do this on **both** the VTX and VRX. - The VRX can also generate and provision a new key from its buttons — see the [VRX Quick Start Guide](/vrx-ground-unit-quick-start-guide/#generating-new-encryption-key). ## Live Control & Inspection A running `voxl-vtx` accepts commands on its control pipe: ```bash voxl-send-command vtx_latency set_frequency 5805 voxl-send-command vtx_latency set_mcs 3 voxl-send-command vtx_latency set_mw_power 500 voxl-send-command vtx_latency set_profile_idx 1 voxl-send-command vtx_latency set_pit_mode 0 ``` To watch link stats live (latency, throughput, temperature, TX power, FEC): ```bash voxl-inspect-vtx -n ``` # voxl-osd Service `voxl-osd` renders the on-screen display: telemetry, flight mode, VIO state, warnings, and more, composited over the FPV video. It never touches pixels directly — it draws a character-cell text canvas and streams it as **MSP DisplayPort** commands, which `voxl-vtx` composites into the transmitted video. The full pipe, config, and menu reference is on the [voxl-osd](/voxl-osd/) page; source is at [voxl-public/voxl-sdk/services/voxl-osd](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-osd). By default it consumes PX4 telemetry over MPA (`mavlink_onboard`), plus VIO quality, VFC state, VTX temperature/power, and CPU stats pipes. ## voxl-configure-osd ```bash voxl-configure-osd factory_enable # reset config to defaults and enable voxl-configure-osd factory_enable_no_compass # defaults without the compass tape voxl-configure-osd external_fc # OSD for an external (MSP) flight controller voxl-configure-osd hdzero # output MSP DisplayPort over UART to an HDZero VTX voxl-configure-osd enable | disable ``` ## Configuration File Reference `/etc/modalai/voxl-osd.conf` (JSON), created with defaults on first run. **Positioning:** every screen element has a `*_col` / `*_row` pair — a character cell on the OSD canvas, origin top-left. Set either to `-1` to hide that element. Elements include RSSI, armed/disarmed status, flight mode, lat/lon, MGRS grid, velocity, altitude, distance-to-home, crosshair, compass, craft name, VTX temperature/power, and CPU warnings. Battery voltage, per-cell voltage, and current draw are fixed positions. Key toggles and behavior fields: | Field | Default | Meaning | |:-----------------------|:---------|:---------------------------------------------------------------------| | `show_compass_tape` | `true` | Scrolling compass tape at the top of the OSD | | `show_compass_degrees` | `true` | Numeric heading in degrees | | `show_mgrs` | `true` | MGRS grid reference line | | `mgrs_precision` | `5` | MGRS digits (0-5) | | `compass_fov_deg` | `120` | Compass tape field of view | | `craft_name` | `""` | Free-text craft name shown on screen | | `show_vtx_cpu_mem_usage` | `false` | VTX CPU/memory usage lines | | `input_protocol` | `1` | 1 = MAVLink, 2 = MSP | | `input_type` | `1` | 1 = MPA pipes, 2 = UART | | `input_port` | `""` | UART device when `input_type` is 2 (e.g. `/dev/ttyHS1`) | | `output_type` | `1` | 0 = none, 1 = MPA (to voxl-vtx), 2 = UART (HDZero), 3 = both | | `output_port` | `""` | UART device when output includes UART | | `resolution` | `1` | OSD canvas: 0 = SD 30x16, 1 = HD 50x18, 2 = HD 30x16, 3 = HD 53x20 | ## OSD Menu With the vehicle **disarmed**, open the on-screen menu with the RC sticks: **yaw up + throttle down + roll down + pitch down**. The menu adjusts flight modes, OSD debug options, RC channel view, compass, and failsafe behavior, and can change VTX channel/profile/PIT mode directly. When flying over IP with `voxl-joystick-server` instead of RC, the menu responds to the joystick as well. # Using External Flight Controller (MSP DisplayPort) The VTX can serve as the digital video system for a non-VOXL flight controller speaking **MSP** over UART: ```bash voxl-configure-osd external_fc ``` This switches `voxl-osd` to poll the external FC over the OSD UART (arm state, RC, status) and render the OSD from it — no MAVLink link required. See the [VTX Quick Start Guide](/vtx-air-unit-quick-start-guide/#osd-msp-dp) for wiring and cable options. ### Betaflight Note (Rotor Riot F7) The UART for DVTX had a bug in the 4.5 Betaflight firmware that we tested against, so we fixed it using the 4.5 maintenance branch. Here's a docker project that can build the FW like we did: # ADB Access The USB-C port is a standard VOXL 2 Mini USB-C port, with ADB access as needed. # Using VTX as Standard WiFi Modem The following procedure applies to VTX-enabled sUAS (e.g. D0013 Stinger) or the stand-alone (MVX-T0001). The VTX radio and standard WiFi are the same hardware. To switch to SoftAP or Station mode, first disable the VTX (this restores the standard WiFi driver), then configure WiFi with `voxl-wifi`: ```bash voxl-configure-vtx --disable voxl-wifi softap5 # or your desired voxl-wifi mode ``` When you are done using WiFi, re-enable the VTX: ```bash voxl-configure-vtx --enable ``` ## WiFi Dongle Modes When using an external USB WiFi dongle, two operation modes are supported: - **Station Mode**: The drone connects to a nearby WiFi access point (such as a router or mobile hotspot). This allows the drone to access the internet through the connected network. - **SoftAP Mode**: The drone creates its own WiFi access point (hotspot). Other devices (such as laptops, tablets, or ground control stations) can connect directly to the drone's hotspot for communication. ## VTX WiFi Limitation If no external WiFi dongle is used and the VTX's built-in radio is relied upon, there is an important limitation currently: - **Station Mode is not available.** The VTX cannot directly connect to an external WiFi network for internet access. - **SoftAP Mode remains available.** By running `voxl-wifi` and selecting the `softap5` option, the VTX can still create its own hotspot. This allows ground devices to connect directly to the drone's WiFi network for data transfer, but does not provide internet connectivity. ## Practical Implications - Use a **WiFi dongle** if your application requires the drone to join an existing WiFi network and gain internet access. - Use the **built-in VTX SoftAP mode** (`softap5`) when you only need a direct peer-to-peer WiFi link between the drone and a controller device, without internet access. --- Source: https://docs.modalai.com/vtx-air-unit-list-of-certifications/ # VTX Air Unit List of Certifications - For evaluation only; not FCC approved for resale `FY 2024 NDAA, Sections 1823-1833` - aka, American Security Drone Act of 2023 (ASDA) `FY 2023 NDAA, Sec 817` - Modification to prohibition on operation or procurement of foreign-made unmanned aircraft systems. `FY 2020 NDAA, Section 848` - Prohibition on operation or procurement of foreign-made unmanned aircraft systems. --- Source: https://docs.modalai.com/ai-detection/ # AI Detection The VTX/VRX digital link supports a real-time AI overlay: objects detected or tracked onboard the drone are transmitted alongside the video and rendered live in your goggles as bounding boxes (with optional labels). Two onboard sources can drive the overlay: - **Object detection** — [voxl-tflite-server](/voxl-tflite-server/) runs a deep-learning model (e.g. YOLO) on the NPU and boxes every detected object class in view. Display-only: it never influences flight. - **Object tracking** — [voxl-nano-tracker](/aoi-yaw-tracking/) follows one target selected via an RC switch or [voxl-portal](/voxl-portal/) (SDK 1.6.3+). > Object tracking is more than a display overlay: combined with VFC AOI yaw tracking, it **commands the drone's yaw** to keep the target centered. Read the warnings in the [AOI Yaw Tracking guide](/aoi-yaw-tracking/) before enabling it in flight. The [AI Detection Setup Guide](/ai-detection-setup-guide/) covers enabling either source and tuning what gets transmitted and rendered. --- Source: https://docs.modalai.com/stinger-vision-fpv/ # Stinger Vision FPV [Blue UAS-cleared](https://www.diu.mil/blue-uas-cleared-list), NDAA compliant, Long range, Digital FPV ![Stinger Vision FPV drone](/images/d0013/D0013-hero-front.png) --- Source: https://docs.modalai.com/vrx-ground-unit/ # VRX Ground Unit NDAA compliant, Digital FPV ![VRX Ground Unit](/images/r0001/R0001-hero.png) --- Source: https://docs.modalai.com/vtx-air-unit/ # VTX Air Unit NDAA compliant, Digital FPV ![VTX Air Unit](/images/t0001/t0001-nobg.png) --- Source: https://docs.modalai.com/modems/ # Modems Documentation for ModalAI's add-on connectivity options for VOXL and VOXL 2 products. --- Source: https://docs.modalai.com/ELRS-Modems/ # ModalAI ELRS Modems Documentation for ModalAI's range of ELRS Modems. [M0184](/M0184/) is a 50mW ELRS Gemini Dual 868/915MHz radio targeted for UAS use. M0193 is a 1W ELRS Gemini Dual 868/915MHz radio targeted for ground side transmitter use. ## VOXL Usage For managing ELRS firmware while connected to a VOXL, please see [voxl-elrs](/voxl-elrs/). ## ELRS Configurator and Building Code Details on ELRS Configurator and Firmware Builds can be found [here](/elrs-configurator/) --- Source: https://docs.modalai.com/elrs-configurator/ # M0184 and M0193 ELRS Configurator and Firmware Build ## Overview To use ELRS configurator with [M0184](/M0184/) and M0193, install [ExpressLRS-Configurator 1.7.8+](https://github.com/ExpressLRS/ExpressLRS-Configurator/releases) ### Downloading Firmware To build and flash custom ExpressLRS firmware for the [M0184](/M0184/) or M0193, first download the firmware repository. Open a terminal in your desired directory and run: ```bash git clone https://github.com/modalai/ExpressLRS ``` To get a specific version of the ModalAI firmware, check out the desired tag from [the tags list](https://github.com/modalai/ExpressLRS/tags). Tags with a fourth version number include ModalAI's patches for M0184 and M0193. ### Hardware Setup The ELRS configurator requires a direct connection to your modem in order to flash it. For receiver firmware: either use a USB-UART adapter connected to the `TX`, `RX` and `GND` pins on the modem or connect to a Betaflight FC over USB. For transmitter firmware: connect to the edgeTX USB and select `USB Serial (VCP)` ### Setting Up the Configurator First, 'Expert Mode' must be enabled in the ELRS Configurator's settings menu. ![ELRS Configurator settings with Expert Mode enabled](/images/expansion-boards/30-elrs-v1/elrs-configurator1.png) Next, in the flashing menu, go to the 'Local' tab and choose the `src` directory of the firmware repository you downloaded earlier as the 'Local path'. ![ELRS Configurator flashing menu, Local tab](/images/expansion-boards/30-elrs-v1/elrs-configurator2.png) Then, choose `ModalAI 900 MHz` as the 'Device Category' and your modem as the device (`ModalAI M0184 RX` in this example). ![ELRS Configurator device category and target selection](/images/expansion-boards/30-elrs-v1/elrs-configurator3.png) At this point you should configure your firmware options like any other ELRS modem, in either standard or manual mode. Please see the [ExpressLRS Configurator Documentation](https://www.expresslrs.org/quick-start/firmware-options/) for more information on firmware options. You should also select the correct flashing option for your hardware setup, either `UART (serial)` for receivers connected directly to your device with a USB-UART bridge, `Betaflight Passthrough` for a receiver connected to a Betaflight FC, or `EdgeTX Passthrough` for an internal transmitter modem. After selecting the correct serial port, press the `Flash` button and the Configurator will build and flash your modem. --- Source: https://docs.modalai.com/M0184/ # ModalAI M0184 Gemini 915MHz ELRS ![M0184 ELRS Gemini receiver](/images/expansion-boards/30-elrs-v1/m0184-hero.png) # Summary ## Transmitter Compatibility In general, follow [Express LRS guidance](https://www.expresslrs.org/hardware/hardware-selection/) selecting 900MHz compatible transmitters. The M0184 runs ELRS 3.x receiver firmware bundled with [voxl-elrs](/voxl-elrs/). A transmitter must meet all of the following to bind: - **ELRS v3 firmware on the transmitter module.** Receiver and transmitter must be on the same major ELRS version. ELRS 4.x transmitters are not supported with the M0184 and must be downgraded to the latest ELRS 3.x release using the standard [ExpressLRS transmitter update process](https://www.expresslrs.org/quick-start/transmitters/updating/). - **A 900 MHz or dual-band module, operating in the low band.** - **Not a 2.4 GHz-only module.** 2.4 GHz-only transmitters, for example the internal ELRS module of the Radiomaster Boxer, cannot bind to the M0184. > The ELRS v3 requirement applies to the M0184. The [M0220](/M0220/) transceiver is compatible with ELRS v4+ devices by default. ## VOXL SDK Support SDK 1.4.1 or newer required. For VOXL SDK usage, please see [voxl-elrs](/voxl-elrs/). ## Dimensions ### 3D Drawings TODO ### 2D Drawings TODO ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | TODO g | | HxW | 33mm x 22mm | | Frequency Bands | 915MHz (default), configurable to 868MHz | | Input Voltage | 5VDC, 350mA max (TX/RX) | | Serial Output | CRSF, 420k default | | RF Chip | Dual SX1276 | | Antenna | IPEX MHF | | Firmware | [ELRS 3.5.3.x](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/tree/master/data/firmware) | | MCU | 72MHz, 32-bit ARM M3 [STM32F103C8T6](https://www.st.com/en/microcontrollers-microprocessors/stm32f103c8.html) | | Memory | 20Kb RAM | | | 64Kbit Flash | | Inputs | UART, push button | | Outputs | QTY PWM, UART, R/G LED | # Hardware ## Hardware Block Diagram ![M0184 hardware block diagram](/images/expansion-boards/30-elrs-v1/M0184-block-diagram.png) ## Connectors ### Summary *BETA release: prototype hardware shown here* Hover a connector to identify it — click to jump to its details. | Connector | Description | | --- | --- | | J1 | Antenna 1 | | J2 | Antenna 2 | | J4 | PWM, RC UART | | S1 | Bind button | | D1 | Green LED | | D2 | Red LED | ### J4 - Header Solder Pads | Pin | Name | Notes | | --- | ---- | --- | | 1 | GND | | | 2 | P0 | PWM Channel 0, 3P3V | | 3 | P1 | PWM Channel 1, 3P3V | | 4 | P2 | PWM Channel 2, 3P3V | | 5 | P3 | PWM Channel 3, 3P3V | | 6 | GND | | | 7 | TX | ELRS TX (to VOXL2), 3P3V, 420k CRSF | | 8 | RX | ELRS RX (from VOXL2), 3P3V, 420k CRSF | | 9 | 5V | Input Power, 5P0V | | 10 | GND | | ### J1 - ANT1 RF ANT1 path (915MHz). ### J2 - ANT2 RF ANT2 path (915MHz). ![M0184 with dual 915MHz dipole antennas attached](/images/expansion-boards/30-elrs-v1/m0184-antennas.png) ### S1 - Bind button Used to put receiver in bind mode. To enter binding mode, press and hold the Bind button while powering on. ### D1 - Green LED Solid when bound. ### D2 - Red LED Status LED, follows [ELRS standards](https://www.expresslrs.org/quick-start/led-status/?h=led#receiver-led-status) A constant slow blink means the receiver is not connected to a transmitter. The LED turns solid once a link is established. On a vehicle, this is the red light that keeps blinking until the transmitter is powered on and connected. ## Recommended Antennas IPEX MHF + T antenna. ## Programming Test Points TODO # User Guides ## VOXL SDK For VOXL SDK usage, please see [voxl-elrs](/voxl-elrs/). Also see the [M0184 Software User Guide](/M0184-software-guide/). ## VOXL 2 Wiring Guide (M0054) ![M0184 to VOXL 2 (M0054) wiring diagram](/images/expansion-boards/30-elrs-v1/M0184-wiring-diagram-M0054.png) # List of Certifications FCC US radio compliance: For evaluation only; not FCC approved for resale --- Source: https://docs.modalai.com/M0184-software-guide/ # M0184 Software Guide # Summary ## Components | Component/Repo | Notes | | --- | --- | | elrs-build-docker | Docker container that can clone/build FW with ease | | [VOXL SDK](/voxl-sdk/) | Used to deploy all required software/firmware components to VOXL / ELRS hardware | | [ExpressLRS](https://github.com/modalai/ExpressLRS) | Fork of Express LRS supporting ELRSv1 (goal is to mainline) that runs on ELRS v1 (M0184) | | [crsf_rc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/rc/crsf_rc) | PX4 driver running in voxl-px4 that communicates over CRSF to ELRS v1 hardware | | [voxl-elrs](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs) | VOXL2 command line utility, used to update FW/config on ELRS v1 from VOXL2, part of the SDK | | FW bootloader | Open source ExpressLRS bootloader | ## Software Block Diagram ![M0184 software block diagram](/images/expansion-boards/30-elrs-v1/M0184-sw-block-diagram-v2.jpg) # Use Cases ## The voxl-elrs Utility `voxl-elrs` is the on-target command line tool for talking to the receiver over CRSF. It ships with VOXL SDK (1.4.1 or newer) as part of the `voxl-elrs` package. With no arguments it picks the transport automatically: the `crsf_raw` MPA pipe when `voxl-px4` is running, otherwise the `qup7` serial backend. A serial device path (`/dev/ttyUSB0`), `qup*`, or `mpa:*` value can be passed explicitly with `-p`, and `-b` overrides the default 420000 baud. ```bash voxl-elrs ping # verify the receiver responds voxl-elrs enumerate # list every CRSF parameter voxl-elrs get-param 0 # read a parameter by index voxl-elrs set-param 1 1 # write a parameter voxl-elrs get-rc # current RC channel values voxl-elrs get-link-stats # live RSSI / link quality / SNR voxl-elrs failsafe # report failsafe state voxl-elrs bind # put the receiver in bind mode voxl-elrs version # build info ``` Command names that aren't built in are matched against the receiver's own CRSF `COMMAND` parameters, so commands like `bind` and `unbind` execute whatever the connected firmware exposes. `save-json` / `load-json` export and import the full receiver configuration as JSON (live, read-only, and command parameters are skipped). Tab completion for all commands and flags is available by sourcing `bash_completions/voxl-elrs` from the repo (or dropping it into `/etc/bash_completion.d`). ## Firmware Updates Firmware binaries ship on the VOXL under `/usr/share/modalai/libelrs/firmware` (override with the `ELRS_FIRMWARE_DIR` environment variable); the same catalog lives in the repo under [data/firmware](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/tree/master/data/firmware). ```bash voxl-elrs list-firmware # every binary in the local catalog voxl-elrs list-firmware modalai_m0184 # filter by target (case-insensitive) voxl-elrs update # auto-detect receiver, flash if newer voxl-elrs upload-firmware fw.bin # flash a specific file, even an older one (XMODEM) voxl-elrs upload-firmware fw.bin esp # ...or via ESPTool ``` `update` auto-detects the connected receiver, compares its installed version against the newest catalog binary, and flashes over XMODEM for MODALAI targets (ESPTool for others). From a host PC, the `-B` (Betaflight) and `-E` (EdgeTX) flags run a serial passthrough first — for example, updating a ModalAI TX module through an EdgeTX radio connected over USB: ```bash voxl-elrs -E -p /dev/ttyACM0 -b 921600 update --target MODALAI_M0193_TX ``` ## Presets and SKU Configuration Receiver settings are managed as JSON presets under `/usr/share/modalai/voxl-elrs/config` on target (`ELRS_CONFIG_ROOT` overrides; sources in [data/config](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/tree/master/data/config)). Each preset declares which vehicles it applies to (a `supported_skus` regex list) and a `priority`; every preset matching the vehicle's SKU with a priority above 0 is merged in priority order before being applied. Priority 0 presets are only loaded by hand with `load-preset`. ```bash voxl-elrs list-presets # every preset in the catalog voxl-elrs list-presets-for-sku $(cat /data/modalai/sku.txt) # presets matching this vehicle's SKU voxl-elrs configure-sku # apply the merged preset for this SKU voxl-elrs configure # firmware update + preset apply in one step ``` `configure` is the one-stop provisioning command: it upgrades the receiver firmware from the local catalog if needed (waiting for the receiver to reboot), then applies the merged preset for the SKU in `/data/modalai/sku.txt` (or one passed explicitly). ## Setting Up PWM Pins The receiver's four PWM pins (J4 pads P0-P3) are driven by per-pin mapping curves that translate an RC channel's value into a PWM output. Pins are normally configured through the SKU presets above — for example [stinger_leds.json](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/blob/master/data/config/stinger_leds.json) drives Stinger's LED bar from RC channel 7 — but the maps can also be inspected and tuned directly: ```bash voxl-elrs pwm-map 0 # decode pin 0's map and plot it voxl-elrs pwm-map-set 0 2 0 1500 --mode interp --yes # move one control point voxl-elrs pwm-map-tune 1 # interactive tuning shell ``` `pwm-map` prints the control points plus an ASCII plot honoring the pin's map mode (`off`, `step`, or `interp`); `pwm-map-set` edits a single point with a confirmation preview; `pwm-map-tune` opens an interactive shell to adjust, plot, and save or discard changes. ## Driving PWM Over IP The PWM pins can also be driven with no RC transmitter at all: a ground station sends button states over IP as MAVLink `MANUAL_CONTROL`, voxl-mavlink-server forwards them to PX4, and the `crsf_rc` driver translates configured buttons into RC channel values sent to the receiver — where the PWM maps above turn them into outputs. ### Transmitter setup If using a normal RC transmitter as a USB Joystick such as a RadioMaster Zorro there is a little bit of manual setup required in order for QGC and other applications to recognize the buttons correctly. If using a Logitech USB controller or other where buttons enumerate automatically this section can be skipped. The following instructions were compiled using a RadioMaster Zorro connected via USB-C to the host PC. edgeTX v2.10+ is required, in order to validate FW version: - Press the `SYS` button, which will bring you to the `TOOLS` page - Press the `PAGE <` button to navigate to the `VERSION` page - Confirm edgeTX version is >= v2.10 In order to upgrade FW version, follow the instructions here: https://manual.edgetx.org/installing-and-updating-edgetx/update-from-opentx-to-edgetx-1 https://manual.edgetx.org/edgetx-how-to/access-dfu-and-bootloader-mode In order to translate the RadioMaster Zorro's channel mappings to buttons. do the following: - Press the `MDL` button - Press the `PAGE >` button once to navigate to the `SETUP` page - Scroll all the way to the bottom until you see the `USB Joystick` section - In the `USB Joystick` section, set `Mode` to `Advanced` - Set `If.mode` to `Joystick` - Set `Circ. cut` to `None` - Navigate to `[Channel Settings]` and press enter - Set `CH1` - `CH4` to `X`, `Y`, `Z`, `rotX` (NOTE: The channels used for switches/buttons need to be on channel 9 or above for them to populate in QGC) - In the `[Channel Settings]` menu, navigate to the channel you'd like to setup, i.e. `CH9` - Set `Mode` to `Btn` - Set `Positions` to either `2POS` or `3POS` depending on the physical switch - Set `Button no.` to be the button numbers in QGC that you'd like this switch to populate (NOTE: A 2POS switch requires two buttons (0,1), whereas a 3POS switch requires 3 buttons (0,1,2)) - Return to the home screen - Press the `MDL` button - Press the `PAGE >` button 5 times to navigate to the `MIXES` page - Scroll down to the corresponding channel which was setup, i.e. `CH9` - Select each channel to be used (hold down button) and set the source as the physical switch you'd like to link to the channel - In order to finalize changes you may need to disconnect and reconnect the joystick or restart QGC ### Example Usage Let's say a LED bar was soldered to PWM pin P0, and configured for RC channel 7 (for example [Stinger Vision FPV](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs/-/tree/master/data/config)). A PWM value of 1000 turns it off, a value of 1500 turns it to IR, and a value of 2000 turns it to visible light. On an RC transmitter, we configure a 3-pos switch to map to buttons 1, 2 and 3. In voxl-px4, we set PX4 params using `params/v1.14/radio_helpers/pwm_via_elrs.params`: - RC_CRSF_BUTTON1 to 1, RC_CRSF_PWMCHN1 to 7, RC_CRSF_PWMVAL1 to 191* (This maps to 1000) - RC_CRSF_BUTTON2 to 2, RC_CRSF_PWMCHN2 to 7, RC_CRSF_PWMVAL2 to 992* (This maps to 1500) - RC_CRSF_BUTTON3 to 3, RC_CRSF_PWMCHN3 to 7, RC_CRSF_PWMVAL3 to 1792* (This maps to 2000) *See [PWM value mappings here](https://github.com/ExpressLRS/ExpressLRS/blob/master/src/include/crsf_protocol.h) ### Failsafe RC failsafe behavior is ultimately the autopilot's own (e.g. PX4's RC-loss failsafe parameters) — the VOXL services never synthesize or zero out RC toward the flight controller. What the RC mux in voxl-mavlink-server (`en_elrs_rc_mux` in `/etc/modalai/voxl-mavlink-server.conf`, enabled on FPV SKUs via `voxl-configure-mavlink-server factory_enable_rc_mux`) decides is which source is published on the `rc_active` MPA pipe for onboard consumers: - **A live ELRS link always wins.** While the receiver is delivering RC frames, `rc_active` carries the receiver's channels — even if RC-over-IP (`MANUAL_CONTROL` from a ground station) is also arriving. - **ELRS lost while IP RC is connected**: the receiver is considered failsafed after 500 ms without an RC frame, and `rc_active` switches to the IP stream on the next message. - **ELRS regained**: switches back to the receiver as soon as live frames resume. - **Both lost**: IP RC times out after 5 seconds without a `MANUAL_CONTROL` message. With the ELRS link also down, `rc_active` deliberately goes silent rather than publishing stale values — consumers see no RC data, and the autopilot's own RC-loss failsafe governs the vehicle. Note that `MANUAL_CONTROL` from a ground station is always forwarded to the flight controller regardless of the mux — the mux only selects what onboard services see on `rc_active`. --- Source: https://docs.modalai.com/M0220/ # ModalAI M0220 Gemini X-Band ELRS Transceiver The latest version of the unified firmware is v0.1.4, for instructions on updating see [firmware management](#updating-and-fw-management) below. # Summary ## Transmitter Compatibility In general, follow [Express LRS guidance](https://www.expresslrs.org/hardware/hardware-selection/), most other devices should be compatible. ## VOXL SDK Support SDK 1.4.1 or newer required. For VOXL SDK usage, please see [voxl-elrs](/voxl-elrs/). ## Dimensions ### 3D Drawings TODO ### 2D Drawings TODO ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | TODO g | | HxW | H x W | | Frequency Bands | 915Mhz, 2.4 GHz | | Input Voltage | 5VDC, 2A max (TX/RX) | | Serial Output | CRSF, MAVLink, Custom | | RF Chip | Dual LR1121, nRF7002 | | Antenna | | | Firmware | [v0.1.4](https://storage.googleapis.com/modalai-elrs-firmware/mrc/releases/v0.1.4/mrc-v0.1.4-m0220-standard.mrcb) | | MCU | 64 MHz, 32-bit ARM M33 [nRF5340](https://www.nordicsemi.com/Products/nRF5340) | | Memory | 512 KB RAM | | | 1MB Flash | | | 8MB External Flash | | Inputs | UART, USB, GPIO, WiFi | | Outputs | QTY 4 PWM, UART, USB, WiFi, LED | # Hardware The M0220 is a flexible ELRS transceiver module, meant to be integrated into any hardware project through the inclusion of a single b2b connector, providing a large variety of optional interfaces. Integrators may choose to use or expose any combination of features or interfaces exposed on the board. ## Connector pinout | Pin | In/Out | Usage | Pin | In/Out | Usage | | --- | ------ | ----- | --- | ------ | ----- | | 2 | In | 5V | 1 | In | 5V | | 4 | In | 5V | 3 | In | 5V | | 6 | In | 5V | 5 | In | 5V | | 8 | In | 5V | 7 | In | 5V | | 10 | In | 5V | 9 | In | 5V | | 12 | In | 5V | 11 | In | 5V | | 14 | In | 5V | 13 | In | 5V | | 16 | In | 5V | 15 | In | 5V | | 18 | In | 5V | 17 | Out | 3V3 Out | | 20 | In | GND | 19 | In | GND | | 22 | Out | PWM 1 / FAN CTRL | 21 | Out | V_TEMP | | 24 | In | GND | 23 | In | GND | | 26 | Out | PWM 2 / HDPLX DIR | 25 | In | GND | | 28 | In | GND | 27 | In | GND | | 30 | Out | PWM 3 | 29 | In | GND | | 32 | In | GND | 31 | In | GND | | 34 | Out | PWM 4 | 33 | In | GND | | 36 | In | GND | 35 | In | SWD IO | | 38 | Out | UART 1 TX | 37 | In | N RESET | | 40 | In | UART 1 RX | 39 | In | SWD CLK | | 42 | In | GND | 41 | In | GND | | 44 | Out | UART 2 TX | 43 | In | GND | | 46 | In | UART 2 RX | 45 | In | GND | | 48 | In | GND | 47 | In | GND | | 50 | In | GPIO 1 | 49 | In | GND | | 52 | In | GPIO 2 | 51 | In | GND | | 54 | In | GPIO 3 | 53 | In | GND | | 56 | I/O | USB P | 55 | In | VBUS | | 58 | I/O | USB N | 57 | In | GND | | 60 | In | GND | 59 | In | GND | ## GPIO Configuration The M0220 configuration GPIOs will be pulled down by default. Use external pullups to configure the desired mode of operation. The configuration below is subject to change. The M0220 Program and Debug board has jumpers exposed to configure these pins. | Mode | 1 | 2 | 3 | UART 1 Config | UART 2 Config | USB Mode | PWM/GPIO Usage | ELRS Mode | | --------------------- | - | - | - | ---------------------- | ------------------- | ----------------- | ------------------------- | ----------- | | Production/Test | 0 | 0 | 0 | MAVLink 8N1@921600 | MAVLink 8N1@921600 | CDC-ECM | PWM | Off | | Transmitter | 0 | 1 | 0 | CRSF 8N1@921600 | Serial 8N1@9600 | CDC-ECM | FAN CTRL | TX | | Backpack Transmitter | 0 | 1 | 1 | CRSF HDPLX 8N1@921600 | Serial 8N1@9600 | CDC-ECM | FAN CTRL + HDPLX COM_DIR | TX | | Receiver | 0 | 0 | 1 | CRSF 8N1@420000 | Serial 8N1@9600 | CDC-ECM | PWM | RX | | Repeater | 1 | 0 | 0 | MAVLink 8N1@921600 | CRSF 8N1@420000 | CDC-ECM | PWM | Repeater | | Reserved | 1 | 0 | 1 | Off | Off | CDC-ECM | Off | Off | | Reserved | 1 | 1 | 0 | Off | Off | CDC-ECM | Off | Off | | Reserved | 1 | 1 | 1 | Off | Off | CDC-ECM | Off | Off | These configurations can be changed manually during operation, but on boot the GPIO-determined configuration will be re-applied. In the future an "override" option may be added to allow the user's configuration changes to persist. ## Antenna Arrangement ![M0220 antenna arrangement](/images/expansion-boards/30-elrs-v2/M0220-antenna.jpg) - J10 Antenna 1 - 915 MHz - J11 Antenna 1 - 2.4 GHz - J8 Antenna 2 - 915 MHz - J9 Antenna 2 - 2.4 GHz # ExpressLRS The main function of the M0220 is as an ExpressLRS-compatible transceiver. The firmware is flexible and allows the user to change all critical configuration on the fly such as receiver/transmitter, v3/v4 compatibility, domain selection, and standard runtime options like ELRS rate, telemetry ratio, antenna mode, and power output. By default, the transceiver is compatible with all ELRS v4+ devices, use with ELRS v3 devices is still experimental and will likely result in degraded performance. > The ELRS v4+ compatibility above applies to the M0220 only. The [M0184](/M0184/) receiver runs ELRS 3.x firmware and requires an ELRS v3 transmitter; see [M0184 transmitter compatibility](/M0184/#transmitter-compatibility). ## Binding The binding procedure is identical to/compatible with upstream ExpressLRS devices. Using the 'Bind' option on a reciever will put it into "binding" mode (the 'state' display on the dashboard will show this) until a nearby transmitter uses the 'Bind' option to send a brief burst of binding packets to all nearby receivers. After binding, the modems may take a minute to connect to eachother as the receiver must search through all available 'Rate' options for the transmitter. ## Configuration ### Rate The 'Rate' parameter controls the update rate of the sticks and maximum bandwidth for data passthrough, as well as the receive sensitivy and noise resistance of the link. Increasing the 'Rate' will decrease the effective range of the link, but increase the data link's maximum bitrate. Rates marked as "Full" send more data per packet, so the bit depth of each channel is increased, but these have lower effective ranges than their standard counterparts. ### Power The transmit power (telemetry power for RX) can be controlled through the `ELRS_POWER` parameter, and allows setting a precise power output in dBm. Higher transmit powers will result in more range, at the cost of increased heat and power usage. ### Telemetry Ratio The telemetry ratio parameter controls how often a receiver will send data back to the transmitter. These telemetry slots take the place of RC transmissions to the receiver, and therefore cause very brief increases in latency. However, higher telemetry rates will result in more bandwidth for data passthrough (CRSF TLM/MAVLink/Serial Passthrough) as this requires a bidirectional reliable link. ### Antenna Mode The antenna mode parameter controls which modems on the dual-modem board are used. If set to a single modem (Ant 1, Ant 2), only modem 1 or modem 2 will be used, just as if it was a single-modem board. For dual-modem operation, the available options are "Switch" and "Gemini". "Switch" alternates transmissions on the TX between the two modems, and on the RX both modems listen for the same packet on the same channel. "Gemini" puts each modem on a different channel and transmits on both simultaneously. > Enabling Gemini mode currently will cause a degradation in data passthrough (CRSF TLM/MAVLink/Serial Passthrough) support, particularly at higher rates (200 Hz+). > This includes all X-Band rates, which require Gemini. > Because of this, the default antenna mode is "Switch" at the moment. For more information on ExpressLRS see the [official documentation](https://www.expresslrs.org/quick-start/getting-started/). # Web UI The Web UI provides the most complete set of parameters and configuration options. It also provides a live view of the status of the device. There are multiple interfaces available to reach the Web UI. The web page is completely self-contained on the device's firmware, so it can be accessed and fully functional without a connection to the internet. ## USB Networking > The CDC-ECM USB interface will only work automatically on Linux or Mac hosts, an upgrade to the CDC-NCM class is planned to provide easier integration with Windows hosts Connecting a host to the USB port of the device will automatically create a network interface connected to the device. As of version 0.1.1, the device will always assign itself the IPv4 address **192.168.7.1** on the USB interface. It will also start a DHCP server and assign the host the address **192.168.7.2**. Simply navigate a browser on your host to `http://192.168.7.1` to connect to the web UI. ## WiFi The WiFi modem can be used to view the Web UI or create a MAVLink connection to the device. As of version 0.1.1, the device will always assign itself the IPv4 address **192.168.8.1** on the WiFi interface in AP mode. It will also host its own DHCP server on the AP interface. In STA mode, the WiFi interface will start a DHCP client and wait for an IP lease. Currently, the only place the view the address assigned to the device in STA mode is through the Web UI (probably through the USB interface). Future updates will display this address on the CRSF interface as well, along with supporting mDNS discovery. The default SSID for the AP is `ModalAI M0220` and the default password is `ModalAiRobots`. Simply navigate a browser on your host to `http://192.168.8.1` to connect to the web UI when connected through the AP. The Web UI is the only place to set an alternate SSID and/or password for the wifi interface. Use the I/O page and click on the WiFi node in the I/O graph to apply new WiFi configurations. Note that there are a few concerns with using WiFi and ELRS features simultaneously. Firstly, there is no frequency deconfliction between the two systems; while they will not have huge effects on the performance of the other, there may be a slight increase in received noise on the 2.4 GHz band on both interfaces. Secondly, when WiFi turns on or off, there may be a brief pause in UART output. ![M0220 web UI WiFi settings](/images/expansion-boards/30-elrs-v2/M0220-io_wifi.png) ## Web UI Features ### Dashboard The 'Dashboard' is the main user-facing interface with all the controls and status user may need on a constant basis. ![M0220 web UI dashboard](/images/expansion-boards/30-elrs-v2/M0220-dashboard.png) ### I/O The I/O page allows the user to monitor the flow of RC and Telemetry data, as well as configure the different I/O interfaces. The features on the I/O page are likely to change in future updates. ### Firmware The firmware page allows you to manage the firmware on the device. For instructions on updating the device, see [the firmware managment instructions below](#updating-and-fw-management). ### Settings The 'Settings' page has all of the parameters available to control the link and I/O. Almost all of the options available will take effect immediately upon a change. When you click on a parmeter, there will be a description of the parmamter and an editable field with the value. After changing the value, press enter or click elsewhere on the page and the new value will be applied. The name of all parameters shown is the MAVLink parameter name, so you can view and edit the same set of parameters through a MAVLink-capable GCS. ![M0220 web UI settings page](/images/expansion-boards/30-elrs-v2/M0220-settings.png) # UART Interfaces The M0220 has two independent UART interfaces, which can each be configured to use a custom protocol and baud rate. All protocol selections have a default baud rate associated with them, which can be overridden by the corresponding `_BAUD` parameter. Note that the maximimum baud rate supported is 1 Mbps, with standard baud rates (115200, 921600) being more likely to match precisely, due to limitations of the nRF5340 hardware. The protocols currently available are CRSF, MAVLink, and Serial. You can configure multiple UARTs to use the same protocol if desired. ## CRSF Interface / ELRS LUA Script The CRSF interface uses a default baud rate of 921600 in TX mode, and 420000 in RX mode. Note that the CRSF interface presents as an RX or TX depending on the `HOST_ROLE` parameter, not the `ELRS_MODE`. The CRSF interface presents a slightly simplified set of parameters compared to the web interface. The full list of controls available on TX modules is below: - Domain - RF Band - Rate - Telemetry Ratio - Switch Mode - Antenna Mode - Link Mode - Model Match - TX Power - Bind - WiFi Connectivity - Enable WiFi - Enable RX WiFi (not yet functional) - Encryption - Enable Encryption - Clear Encryption - Encryption Status - Version ID ### Backpack mode When the UART protocol is set to "CRSF HDPLX", this modifies the operation of the UART to be compatible with EdgeTX as an external module, through the half-duplex SPort interface. This mode does require an external adapter since the UART on the nRF5340 is not capable of half-duplex or inverted operation. This mode takes over the pin "PWM 2" and uses it to signal if the board is transmitting on the UART, so a simple multiplexer and inverter circuit can be used to connect the M0220 to the external module port. Note that this mode is only necessary when functioning as an external module, the standard CRSF TX interface works out of the box for an internal module. ## MAVLink The MAVLink interface uses a default baud rate of 921600. ## Serial Passthrough > This feature only works between ModalAI Modal-RC products (M0220). > v3 Compatability mode must also be disabled for this feature to function. The 'Serial' protocol is special, in that the actual protocol is entirely up to the user. The default baud rate for this protocol is 9600. The 'Serial' protocol is used to emulate a serial bridge across an ELRS connection, messages received on a 'Serial' interface are sent as a special package through the ELRS link, and then an identical message is sent on the tx output of any 'Serial' protocols on the receiving side of the link. A message is defined as up to 64 bytes, and is delineated by an 'IDLE' condition on the UART interface before the beginning and after the end of the packet. If there is an 'IDLE' condition in the middle of the packet, it will be sent as two packets on the receiving interface. The 'Serial Viewer' in the Web UI allows you to view and send these messages manually. You can also send a 'SERIAL_CONTROL' MAVLink message to the desired end transceiver and its payload will be sent on the 'Serial' UART interface (further documentation on external serial data injection TODO). ![M0220 web UI serial passthrough settings](/images/expansion-boards/30-elrs-v2/M0220-io_serial.png) # Misc. Features ## Encryption > This feature only works between ModalAI Modal-RC products (M0220). > v3 Compatability mode must also be disabled for this feature to function. The M0220 features an optional encrypted mode. Using the encrypted mode is very simple, once a link has been established between two M0220 devices, the user only needs to select 'Enable Encryption' on either the Web UI or the CRSF Interface. This will begin an encrypted handshake, key derivation, exchange, and handoff procedure. At the end of this process, the handoff will cause the link to disconnect. After it reconnects (and holds the connection for a few seconds, there may be some additional dropouts during the handover sequence) you should see "Encryption=Active" in the Web UI, or if you refresh the CRSF interface (press 'RTN' in the LUA script) you should see "Encryption Status = On" in the "Encryption" menu. Currently after rebooting the encrypted mode will disable, and the encryption state will show as "Configured", using the 'Enable Encryption' button will start the handoff to encrypted mode immediately, it will not generate new keys. ### Encryption Internals The encrypted link is based on the AES-CTR stream cipher mode. When the encrypted mode is activated, both transceivers generate unique, random values used in an ECDH key derivation sequence to securely exchange an epehemeral key for that connection pair. The key used to protect the link is unique and it is not possible for multiple nodes to connect to a transmitter with the encrypted mode active. A secondary AES keystream (based on a different securely-derived key) is generated in parallel to the main keystream and is used to seed an infinitely-long secure frequency hopping sequence. In order to retain the strongest resistance to cryptanalysis by reducing the probability of repeated keystreams, it is suggested to rotate encryption keys within ~100 flight hours of usage, or weekly. Any bind action automatically clears stored keys and new keys will be generated on the next 'Enable Encryption'. ## PWM The M0220 supports up to 4 PWM outputs when configured as a receiver. Each PWM output can be independently assigned to track the value of a particular channel using the corresponding `PWM_PIN_X_CH` parameter. When active, the PWM output pin will assert high for the number of microseconds corresponding to the value of the channel as shown on the dashboard (1000..2000), and then stay low for the remainder of the 50 Hz frame. If the parameter is set to '-1', then the pin is considered disabled. If the parameter is set to any other value, then the output PWM value of that pin will track the channel set by the parameter. The selected channel will be highlighted in the dashboard of the web interface. ![M0220 web UI PWM settings](/images/expansion-boards/30-elrs-v2/M0220-dash_pwm.png) Future development will include more options for PWM output modes, currently on 50 Hz servo control is supported. ## TeamRace The ExpressLRS TeamRace feature allows a user to connect multiple receivers to a transmitter at once, and let the value of an RC channel determine which receiver is under control. See the [ExpressLRS Team Racing documentation](https://www.expresslrs.org/software/teamracing/) for more information on the feature. The parameter `TEAM_RACE_CH` controls the channel used for TeamRace (a value of `0` disables the feature), and the `TEAM_RACE_VALUE` parameter sets the value (in servo control units 1000..2000) at which the receiver will be considered active. If TeamRace is active and the channel is not equal to the specified value, UART RC output will stop and telemetry transmission to the transmitter will cease. The selected channel will be highlighted in the dashboard of the web interface. ## Repeater > The ExpressLRS Repeater mode is in an early alpha stage. The Repeater feature allows any M0220 device to connect to both a receiver and transmitter simultaneously, allowing RC control and telemetry to be repeated through the M0220. This can be used to increase operational range or copy telemetry/control across multiple transmitters. ## Custom Domain > The M0220 is provided as a development platform, it is your responsibility to ensure the operation of the modems is compliant with all relevant rules and regulations for your jurisdiction. Currently the default configuration of the M0220 is only compatible with the regulatory jurisdiction of the FCC, particularly for 915 MHz operation. The custom domain feature lets you customize the center frequencies of the lowest and highest frequency channels for each supported band. Currently the number of channels used is calculated based on the optimal spacing between channels in each frequency band. The parameters used to control the custom domain are: - `CUST_P_END` The high frequency of the primary (sub-gig) band. - `CUST_P_START` The low frequency of the primary (sub-gig) band. - `CUST_S_END` The high frequency of the secondary (2.4 GHz) band. - `CUST_S_START` The low frequency of the secondary (2.4 GHz) band. Also, `ELRS_DOMAIN` should be set to `custom` to activate this feature. If your regulatory environment requires listen-before-talk (LBT) or a set number of FHSS channels, you will need to modify the firmware. ## RF Testing You may note the 'RF Lab' page is disabled in the Web UI by default. In order to use this page you must flash the rf-lab firmware, which does not include support for ELRS. Instructions for managing firmware can be found [below](#updating-and-fw-management). The 'RF Lab' page allows you to independently control test signals out of each modem, or send and receive test packets on each modem. When using the 'RF Lab', select the desired RF parameters for your test signal, and then select a signal type to start transmitting. Press 'Stop' to cease the transmission. The available RF parameters are: | Parameter | Min | Max | | ----------- | ---- | ----- | | Frequency | | | | Bandwidth | | | | Power | | 30dBm | | SF | 5 | 12 | | CR | 4/5 | 4/8 | | Preamble | 6 | | | Sync length | | | The output signals available are: - CW - Modulated carrier - Continuous packet (packets are sent one after the other, there will be a small gap in between packets) - Single Packet You can use the payload interface to send and receive single packets. Set up the rx parameters on the receiving modem, then press 'Arm RX', which will wait for a single packet to be received, then display it on the modem card. Enter identical parameters on the transmitting modem, and your desired hexadecimal payload, then press 'Send' to see your packet received on the other modem. Each modem will display its reported temperature, and the VDET measurement from the 900 MHz FEM, along with a temperature measurement from the board thermistor. The modem temperatures will not start to log until a signal has been transmitted from that modem. > Disabling the 'Power Limit' feature allows you to increase the maximum allowed INPUT power into the external PA. > Increasing the power beyond this limit will NOT increase the conducted output power. It will only decrease the signal quality and damage the RF hardware. # Updating and FW Management There are a few options for flashing firmware onto the device. All function through the same mechanism, which is using MAVFTP to stage new firmware binaries to special psuedo-files on the device, then on reboot the bootloader will detect the staged firmware and safely attempt to swap and test the new firmware. If any part of this process fails, the M0220 will remain on the old version unharmed. The A/B firmware manager does mark new firmware as good, and erases the old firmware, as soon as the first boot finishes successfully on the new version, so do not flash untested firmware if you do not have access to the debug hardware necessary to recover the device on failure. > Due to hardware limitations, the update process can take a long time, approximately 10 minutes total (6-8 minutes for staging and a 1-2 minute reboot). > Make sure the connection to the device is stable and avoid rebooting the device during the process. > Failures during update process will not brick the device but if it fails for any reason you will need to start over. When selecting a firmware image to update, there are two properties which matter. Firstly the board defines hardware the firmware bundle is compatible with, this must match your current firmware or the update will be rejected. Secondly there is the profile, most users will want the 'Standard' profile which includes all relevant ELRS features; however, you can flash bundles with a different profile at any time if you want a different feature set. ## Web UI Manual Updates The easiest way to update if you have access to firmware bundle file you want to update to ("*.mrcb") is to use the 'Firmware' page on the web interface. Simply select your firmware file using the 'Choose Bundle' button, then 'Start Flashing' if everything looks correct. You will be able to compare the new and old firmware side-by-side. The progress bar will show the status the flashing operation. This will take a while. Once the flashing operation completes, the device will check the firmware and, if acceptable, it will reboot and swap the running firmware. You will lose connection for 1-3 minutes as this process completes. Once you can connect to your device again the update is complete, and you should see the details of the newly-flashed firmware in the 'Current Firmware' column of the 'Firmware' page. ![M0220 web UI firmware update page](/images/expansion-boards/30-elrs-v2/M0220-firmware.png) ## Automatic Updates ModalAI firmware release will be automatically published and available for and M0220 to download. If you are connected the WebUI and also have an internet connection available, you can use the 'Check Online' button to show available firmware releases that are newer than the firmware running on the device. If updates are available, compatible firmware releases will be listed below the firmware comparision card. You can use the 'Download' button to grab the new firmware and prepare it for upload. The downloaded firmware will then be shown in the 'Uploaded Bundle' column of the comparison, and if everything looks good press 'Start Update' to begin the update process. ![M0220 automatic firmware update prompt](/images/expansion-boards/30-elrs-v2/M0220-auto_firmware.png) ## UART updates with voxl-elrs In order to update a M0220 externally through a CRSF UART connection, the `voxl-elrs` utility can be used to stage firmware over CRSF interfaces. This will be most useful for M0220 transceivers integrated into larger systems as standard CRSF-based ELRS devices (e.g. EdgeTX, VOXL). This will only work over UARTs configured with the CRSF protocol. The `voxl-elrs` utility comes pre-installed with the VOXL SDK, but if you would like to run the UART-based update procedure from a linux host machine, you can build the package natively. This requires a local installation of CMake (v3.22 or newer), PkgConfig, cJSON, and a C/C++ compilation toolchain. Currently M0220 update support is only available on the 'dev' branch. Building `voxl-elrs` natively: ```bash $ ❯ git clone https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-elrs.git Cloning into 'voxl-elrs'... remote: Enumerating objects: 3479, done. remote: Counting objects: 100% (485/485), done. remote: Compressing objects: 100% (476/476), done. remote: Total 3479 (delta 239), reused 0 (delta 0), pack-reused 2994 (from 1) Receiving objects: 100% (3479/3479), 22.78 MiB | 33.09 MiB/s, done. Resolving deltas: 100% (1445/1445), done. $ ❯ cd voxl-elrs/ $ ❯ git checkout dev branch 'dev' set up to track 'origin/dev'. Switched to a new branch 'dev' $ ❯ cmake --workflow native Executing workflow step 1 of 2: configure preset "native" -- The C compiler identification is Clang 21.1.2 -- The CXX compiler identification is Clang 21.1.2 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /nix/store/al7l1c2nwk9c9cicp3l7jfjxi1vilp93-clang-wrapper-21.1.2/bin/clang - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /nix/store/al7l1c2nwk9c9cicp3l7jfjxi1vilp93-clang-wrapper-21.1.2/bin/clang++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Building natively -- Found PkgConfig: /nix/store/0skggkamysbh0ksc3582lb69wzrpabcg-pkg-config-wrapper-0.29.2/bin/pkg-config (found version "0.29.2") -- Checking for module 'libcjson' -- Found libcjson, version 1.7.19 -- Found cJSON: 1.7.19 -- Building with serial backend -- Building with JSON API support -- Building with ARM API support -- Building library libelrs -- Building executable voxl-elrs -- Configuring done (2.0s) -- Generating done (0.0s) -- Build files have been written to: /home/Documents/voxl-elrs/build Executing workflow step 2 of 2: build preset "native" [ 25%] Building C object src/CMakeFiles/elrs.dir/mrc_mavlink_min.c.o [ 25%] Building C object src/CMakeFiles/elrs.dir/elrs_serial.c.o [ 25%] Building C object src/CMakeFiles/elrs.dir/elrs.c.o [ 33%] Building C object src/CMakeFiles/elrs.dir/crsf_protocol.c.o [ 41%] Building C object src/CMakeFiles/elrs.dir/xmodem_proto.c.o [ 50%] Building C object src/CMakeFiles/elrs.dir/elrs_uid.c.o [ 58%] Building C object src/CMakeFiles/elrs.dir/elrs_json.c.o [ 66%] Building C object src/CMakeFiles/elrs.dir/elrs_arm.c.o [ 75%] Building C object src/CMakeFiles/elrs.dir/mrc_update.c.o [ 83%] Linking C shared library libelrs.so [ 83%] Built target elrs [ 91%] Building C object src/CMakeFiles/voxl-elrs.dir/voxl-crsf.c.o [100%] Linking C executable voxl-elrs [100%] Built target voxl-elrs ``` The update process only requires one command, but running a 'ping' command first is suggested to verify that your device is ready and reachable. Receiver update: ```bash $ ❯ ./build/src/voxl-elrs -p /dev/ttyUSB0 ping # This is just to verify a connection to your device elrs_serial: configured for 420000 baud, 8N1 elrs_serial: initialized on /dev/ttyUSB0 Device Information: Name: M0220 RX Serial Number: 0x53524C45 Hardware ID: 0x00000000 Firmware ID: 0x00000400 Parameters Total: 10 Parameter Version: 2 elrs_serial: closed $ ❯ ./build/src/voxl-elrs -p /dev/ttyUSB0 update-mrc # Note that this can take up to 5-10 minutes elrs_serial: configured for 420000 baud, 8N1 elrs_serial: initialized on /dev/ttyUSB0 MRC bundle: board=m0220 target=both version=708400e total=2478709 bytes Opening /ota/v1/app_secondary (699051 bytes) app: 65608/699051 bytes (total 65608/2478709) app: 131216/699051 bytes (total 131216/2478709) app: 196824/699051 bytes (total 196824/2478709) app: 262432/699051 bytes (total 262432/2478709) app: 328040/699051 bytes (total 328040/2478709) app: 393648/699051 bytes (total 393648/2478709) app: 459256/699051 bytes (total 459256/2478709) app: 524864/699051 bytes (total 524864/2478709) app: 590472/699051 bytes (total 590472/2478709) app: 656080/699051 bytes (total 656080/2478709) app: 699051/699051 bytes (total 699051/2478709) Finalized app Opening /ota/v1/xip_secondary (1779658 bytes) xip: 65608/1779658 bytes (total 764659/2478709) xip: 131216/1779658 bytes (total 830267/2478709) xip: 196824/1779658 bytes (total 895875/2478709) xip: 262432/1779658 bytes (total 961483/2478709) xip: 328040/1779658 bytes (total 1027091/2478709) xip: 393648/1779658 bytes (total 1092699/2478709) xip: 459256/1779658 bytes (total 1158307/2478709) xip: 524864/1779658 bytes (total 1223915/2478709) xip: 590472/1779658 bytes (total 1289523/2478709) xip: 656080/1779658 bytes (total 1355131/2478709) xip: 721688/1779658 bytes (total 1420739/2478709) xip: 787296/1779658 bytes (total 1486347/2478709) xip: 852904/1779658 bytes (total 1551955/2478709) xip: 918512/1779658 bytes (total 1617563/2478709) xip: 984120/1779658 bytes (total 1683171/2478709) xip: 1049728/1779658 bytes (total 1748779/2478709) xip: 1115336/1779658 bytes (total 1814387/2478709) xip: 1180944/1779658 bytes (total 1879995/2478709) xip: 1246552/1779658 bytes (total 1945603/2478709) xip: 1312160/1779658 bytes (total 2011211/2478709) xip: 1377768/1779658 bytes (total 2076819/2478709) xip: 1443376/1779658 bytes (total 2142427/2478709) xip: 1508984/1779658 bytes (total 2208035/2478709) xip: 1574592/1779658 bytes (total 2273643/2478709) xip: 1640200/1779658 bytes (total 2339251/2478709) xip: 1705808/1779658 bytes (total 2404859/2478709) xip: 1771416/1779658 bytes (total 2470467/2478709) xip: 1779658/1779658 bytes (total 2478709/2478709) Finalized xip Requesting reboot into staged update Reboot command accepted (result=5 progress=5 stage=1) elrs_serial: closed MRC bundle update completed successfully and reboot was requested ``` Once the update process is complete, reboot will take 1-2 minutes until the device will be running the new firmware. Connecting to a internal transmitter (not an externally mounted backpack) through an EdgeTX handset requires selecting the 'USB Serial' option on your handset when connecting the USB adapter, and passing the '-E' flag to the same `voxl-elrs` update commands as above. Also, if you are connecting to a transmitter directly but not through EdgeTX, pass the '-T' flag to `voxl-elrs`. ```bash ./build/src/voxl-elrs -p /dev/ttyUSB0 -E ping ./build/src/voxl-elrs -p /dev/ttyUSB0 -E update-mrc ``` --- Source: https://docs.modalai.com/wifi-modems/ # ModalAI Wi-Fi Modems Documentation for ModalAI's range of Wi-Fi Modems. [M0213](/m0213/) is a 500mW dual-band WiFi radio targeted for UAS use. ## VOXL Usage For managing Wi-Fi while connected to a VOXL, please see [voxl-wifi](/voxl-2-wifi-setup/). --- Source: https://docs.modalai.com/m0213/ # M0213 VOXL 2 Wifi Addon --- ## Overview The M0213 VOXL 2 Wifi Addon is a Wi-Fi/Bluetooth expansion board for VOXL 2 and VOXL 2 Mini built around the **Bots Unlimited SP-01-100 "Sparrow" LGA module**. It mounts to the VOXL 2 legacy expansion (B2B) connector and provides: - Dual-band 802.11ac Wi-Fi (2.4 GHz / 5 GHz), 2x2 MIMO - Bluetooth 5.3 (Not supported in current SDK) - Voltage level shifting between the VOXL 2's 1.8 V GPIO domain and the board's 3.3 V legacy peripheral domain - A 12-pin legacy connector exposing SPI, I2C, UART, and two spare GPIOs at 3.3 V - Three U.FL antenna connectors (Wi-Fi Path A, Wi-Fi Path B, Bluetooth) - A fast-boot switch for forcing VOXL 2 into fastboot/USB boot mode ## Key Specifications | Parameter | Value | |---|---| | Wi-Fi module | Bots Unlimited SP-01-100 "Sparrow", 22 x 22 mm LGA. [Sparrow Product Page](https://botsunlimited.com/product/sparrow-lga/) | | Wi-Fi standard | Dual-band 802.11ac, 2x2 MIMO, up to 866 Mbps | | Bluetooth | Bluetooth 5.3 | | RF output power | Up to 30 dBm (2.4 GHz), up to 26.6 dBm (5 GHz) | | RF kill switch | Hardware RF kill, FAA-compliant | | Host interfaces (module) | PCIe, USB 2.0/3.0, SDIO (CONFIG_HOST-selectable) | | Operating temperature (module) | -40 °C to +85 °C | | Compliance | NDAA-compliant; FCC and Wi-Fi CERTIFIED® pending | | Board input power | VDC_5V_LOCAL (fused 5 A) and VREG_3P3V_LOCAL | | Sparrow module max draw, 5 V rail | ~1.7 A | | Sparrow module max draw, 3.3 V rail | ~1 A | | Host connector | J1, QTH-030-01-X-D-A, 60-pin legacy B2B | | Legacy peripheral connector | J3, SM12B-GHS-TB, 12-pin | | Antenna connectors | J2 (Bluetooth), J4 (Wi-Fi Path A), J5 (Wi-Fi Path B) — all U.FL (U.FL-R-SMT-1(10)) | | I2C level translator | TI TCA9517DGKR | | GPIO/UART/SPI level shifters | 5x TI SN74LVC2T45YZPR (dual-bit, auto-direction) | | ESD protection | 10x PTVS3V3D1BALYL TVS diode array (D1-D10) on level-shifted lines | ## Board Architecture The board is organized into three functional sections (matching the three schematic sheets): 1. **VOXL Interface** — the 60-pin legacy B2B connector (J1) to VOXL 2 / VOXL 2 Mini, 5 V and 1.8 V/3.3 V rail inputs, and the fastboot switch. 2. **Level Shifting & GPIO** — five SN74LVC2T45 auto-direction-sensing translators moving SPI, UART, and spare GPIO signals between the VOXL 2's 1.8 V domain and the board's 3.3 V legacy domain, plus a TCA9517 I2C level translator, TVS protection, and the 12-pin legacy peripheral connector (J3). 3. **Sparrow Module** — the SP-01-100 Wi-Fi/BT module (U2A/U2B footprint), its power decoupling, CONFIG_HOST interface-select straps, and the three U.FL antenna connectors. ### 1. VOXL Interface (J1, Legacy B2B Connector) J1 is a 60-pin QTH-030-01-X-D-A board-to-board connector. Key nets carried across it: | Net | Direction (VOXL 2 → board unless noted) | Notes | |---|---|---| | `VDC_5V_LOCAL` | Power in | Fused at 5 A on this board; Sparrow module max draw is ~10 W at 5 V | | `VREG_S4A_1P8` | Power in | 1.8 V rail, VOXL 2 GPIO domain reference | | `VREG_3P3V_LOCAL` | Power in | 3.3 V rail, legacy peripheral domain | | `GPIO_54_SPI17_SCLK`, `GPIO_55_SPI17_CS`, `GPIO_52_SPI17_MISO`, `GPIO_53_SPI17_MOSI` | Bidirectional | SPI17 bus, level-shifted to legacy 3.3 V SPI on J3 | | `GPIO_125_I2C9_SDA`, `GPIO_126_I2C9_SCL` | Bidirectional | I2C9 bus, level-translated to legacy 3.3 V I2C on J3 | | `GPIO_22_UART7_TXD`, `GPIO_23_UART7_RXD` | Bidirectional | UART7, level-shifted to legacy 3.3 V UART on J3 | | `V2_GPIO_32`, `V2_GPIO_33` | Bidirectional | Spare GPIOs, level-shifted and exposed as `GPIO_A` / `GPIO_B` on J3 | | `GPIO_131_USB_RESET` | VOXL 2 → board | Drives `PMIC_DISABLE_N` on the Sparrow module directly (1.8 V VIO, no level shift needed) — used to reset/power down the Wi-Fi module | | `GPIO_35_DBG_UART12_RX`, `GPIO_34_DBG_UART12_TX` | — | Present on connector, not populated/routed further on this board (marked unused on sheet 1) | | `SDM_FORCE_USB_BOOT` | — | Present on connector, not populated/routed further on this board | | USB1 SS TX+/TX-, RX+/RX-, HS D+/D-, `USB1_SS_TX_N/P`, etc. | Bidirectional | Routed to the Sparrow module's muxed USB3/PCIe SerDes lanes (see CONFIG_HOST section below) | | `USB_HS_ID` | — | Present on connector, not populated/routed further on this board | | `PM_RESIN_N` | Bidirectional | Also routed to the fastboot switch, S1 | **Fastboot switch (S1):** a momentary switch (EVP-BB2A9B000) pulls `PM_RESIN_N` low through R13 (100 Ω) to force VOXL 2 into its reset/fastboot sequence. ### 2. Level Shifting & GPIO Five SN74LVC2T45YZPR dual-channel, auto-direction-sensing level translators (IC1-IC5) bridge the VOXL 2's 1.8 V GPIO rail (`VREG_S4A_1P8`, VCCA side) to the board's 3.3 V legacy rail (`VREG_3P3V_LOCAL`, VCCB side): | Device | 1.8 V side (VCCA) | 3.3 V side (VCCB) | |---|---|---| | IC1 | `V2_GPIO_32`, `V2_GPIO_33` | `GPIO_A`, `GPIO_B` | | IC2 | `V2_GPIO_32`, `V2_GPIO_33` | `GPIO_A`, `GPIO_B` | | IC3 | `GPIO_23_UART7_RXD`, `GPIO_52_SPI17_MISO` | `LEG_UART_RX_3P3V`, `LEG_SPI_CONN_MISO_3P3V` | | IC4 | `GPIO_22_UART7_TXD`, `GPIO_53_SPI17_MOSI` | `LEG_UART_TX_3P3V`, `LEG_SPI_CONN_MOSI_3P3V` | | IC5 | `GPIO_54_SPI17_SCLK`, `GPIO_55_SPI17_CS` | `LEG_SPI_CONN_SCLK_3P3V`, `LEG_SPI_CONN_CS_3P3V` | Each level-shifted line is protected by a PTVS3V3D1BALYL TVS diode (D1-D10, one per line) referenced to ground. **I2C level translation:** U1 (TCA9517DGKR) translates `GPIO_125_I2C9_SDA` / `GPIO_126_I2C9_SCL` (1.8 V side, VCCA) to `LEG_I2C_SDA_3P3V` / `LEG_I2C_SCL_3P3V` (3.3 V side, VCCB). Pull-ups: R1/R6 (2.2 kΩ) on the 1.8 V side, R11/R12 (2.2 kΩ) on the 3.3 V side. The TCA9517 is a fixed-direction (VCCA → VCCB step-up) I2C bus voltage-level translator, not a general bidirectional buffer — if this board is used with multiple downstream I2C devices sharing the translated bus, standard I2C address-sequencing/addressing rules still apply on the 3.3 V side. **Legacy peripheral connector (J3, SM12B-GHS-TB, 12-pin):** | Pin | Signal | |---|---| | 1 | `LEG_SPI_CONN_MISO_3P3V` | | 2 | `LEG_SPI_CONN_MOSI_3P3V` | | 3 | `LEG_SPI_CONN_SCLK_3P3V` | | 4 | `LEG_SPI_CONN_CS_3P3V` | | 5 | `GPIO_A` | | 6 | `GPIO_B` | | 7 | `LEG_I2C_SDA_3P3V` | | 8 | `LEG_I2C_SCL_3P3V` | | 9 | `LEG_UART_TX_3P3V` | | 10 | `LEG_UART_RX_3P3V` | | 11 | (shield/mechanical, tied GND) | | 12 | (shield/mechanical, tied GND) | ### 3. Sparrow Module (U2A/U2B, SP-01-100) The Sparrow module footprint is split across two schematic symbols, U2A and U2B, both `SP-01-100` (Bots Unlimited). **Power:** - `VREG_3P3V_LOCAL` → module 3.3 V pins, decoupled with C17-C20 (2x 47 µF, 2x 0.1 µF); max draw ~1 A - `VDC_5V_LOCAL` → module 5 V pins, decoupled with C21-C24 (2x 47 µF, 2x 0.1 µF); max draw ~1.7 A - The module's internal boost converter option is **not used**: `V_BOOST_IN` is left connected to a test point only, and `5V_BOOST_DISABLE_N` is tied low to disable it. **Reset/power control:** `GPIO_131_USB_RESET` from the VOXL 2 connects directly to `PMIC_DISABLE_N` on the module — no level shifting is required since the module's `VIO` is 1.8 V, matching the VOXL 2 GPIO. This line is used to reset and power down the Sparrow module. **Host interface mux (CONFIG_HOST[2:0]):** The module's USB3.0 TX/RX SerDes lanes are muxed with PCIe, and the WLAN/Bluetooth host interfaces are jointly selected by three strapping pins, `CONFIG_HOST_0/1/2`, each with an optional 51 kΩ pull-down (R25/R26/R27, all marked DNP in this design) to an internal pull-up: | CONFIG_HOST[2:0] | WLAN interface | Bluetooth interface | |---|---|---| | 000 | SDIO | UART | | 001 | SDIO | SDIO | | 010 | PCIe | USB 2.0 | | 011 | PCIe | UART | | 100 | USB 3.0/2.0 | UART | | 101 | USB 3.0/2.0 | USB 2.0 | | 110 | USB 3.0/2.0 | USB 3.0/2.0 | | 111 | USB 3.0 | USB 3.0 | **RF paths and antenna connectors:** | Connector | Path | Series component | Notes | |---|---|---|---| | J2 | Bluetooth (`RF_BT`) | R16 (0 Ω) | U.FL (U.FL-R-SMT-1(10)) | | J4 | Wi-Fi Path A (`RF_A`) | R17 (0 Ω) | U.FL | | J5 | Wi-Fi Path B (`RF_B`) | R18 (0 Ω) | U.FL | Each path also has DNP component footprints (e.g., C26/C28/C30, R25-style pads) provided for optional matching/filtering — not populated in this revision. ## Mechanical - Two mounting holes, H1 and H2 (plated, tied to GND). - Board outline/keep-outs: TODO — not present in the ECAD schematic export; needs the mechanical/fab drawing. ## References - [Sparrow LGA Long Range Wi-Fi Module (SP-01-100) product page](https://botsunlimited.com/product/sparrow-lga/) — Bots Unlimited --- Source: https://docs.modalai.com/4G-LTE-Modems/ # ModalAI 4G LTE Modems Documentation for ModalAI's range of 4G LTE Modems. ![LTE](/images/modems/LTE/lte-v2-hero.jpg) --- Source: https://docs.modalai.com/lte-v2-modem-user-guide/ # V2 LTE Modem and USB Add-On Board User Guide --- ## Overview The VOXL system provides the ability to easily and quickly add an LTE connection. The following guide provides you the necessary details on doing so with an LTE v2 Modem. [Datasheet](/lte-modem-and-usb-add-on-v2-datasheet/) ## Requirements ### Hardware In order to connect the VOXL to an LTE network using the v2 Modem, you have two choices of modem types: | Part Number | Description | |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------| | [MDK-M0030-1-01](https://www.modalai.com/products/m0130-3?variant=32449203601459) | VOXL Add-on board for North American LTE Carriers [WP7610 module](https://www.sierrawireless.com/iot-modules/smart-modules/) | | [MDK-M0030-1-04](https://www.modalai.com/products/m0130-3?variant=40230581895219) | VOXL Add-on board for Europe, Middle East, Africa LTE Carriers [RC7620 module](https://www.sierrawireless.com/iot-modules/smart-modules/rc7620/) | | [MDK-M0030-1-00](https://www.modalai.com/products/m0130-3?variant=39300535681075) | VOXL Add-on as USB hub only, no modem | | [MDK-M0030-1-03](https://www.modalai.com/products/m0130-3?variant=39537955962931) | VOXL Add-on board for North American LTE Carriers [RC7611 module](https://www.sierrawireless.com/iot-modules/smart-modules/rc7611/) | ![v2 Modem](/images/voxl/voxl-lteh/m0030-1-top.png) Each kit conveniently comes with two LTE antennas, purchase more [here](https://www.modalai.com/products/mrf-m0030-1) ### Software The following software is required and should already be pre-installed: - [System Image 2.5.2 +](/voxl-system-image/) - voxl-modem 1.x ## SIM Card Installation - The SIM card needs to be installed in the orientation pictured below. ![SIM card installation on the LTE v2 add-on, step 1](/images/voxl/voxl-lteh/sim-card-v2-1.jpg) - Slide the SIM card into the SIM card slot on the bottom of the LTE board. ![SIM card installation on the LTE v2 add-on, step 2](/images/voxl/voxl-lteh/sim-card-v2-2.jpg) - Push the SIM card in until you feel the card click into place. ![SIM card installation on the LTE v2 add-on, step 3](/images/voxl/voxl-lteh/sim-card-v2-3.jpg) To remove the SIM card, push the card slightly further into the slot until you feel a click, the card will then be able to slide out. ## Hardware Setup - Remove power and USB from the VOXL - Insert your SIM card into the modem's SIM card slot - Attach antennas to the modem - Attach LTE modem to VOXL using VOXL's J13 connector - Reconnect USB and power to VOXL ## Software Setup VOXL ships with a simple utility to assist with setting up a modem. (voxl-modem 1.x) `voxl-configure-modem` allows you to quickly and easy bring up a network connection using an LTE modem. ```bash # On VOXL voxl-configure-modem ``` You will first be asked which modem type you are setting up: ```bash What type of modem are you using? 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9X91 ``` Choose `1` for v2 modem. (On the original VOXL, the menu also lists `v1` first, so choose `2` for the v2 modem there.) You will then be asked if you are attempting to connect to ModalLink: ```bash Are you attempting to connect to ModalLink? (not common) 1) yes 2) no ``` If you are using a SIM from a cellular network (AT&T, Verizon, T-Mobile, etc.) select `2` for no. You will then be asked to select the correct APN for your SIM card: ```bash Which APN is correct for your SIM card? AT&T - IoT device - APN: m2m.com.attz AT&T - Laptop or Tablet - APN: broadband AT&T - Smartphone - APN: phone T-Mobile - APN: fast.t-mobile.com Verizon - APN: vzwinternet Google Fi - APN: h2g2 US Mobile (Dark Star/Verizon) - APN: ereseller 1) m2m.com.attz 4) fast.t-mobile.com 7) ereseller 2) broadband 5) vzwinternet 8) Custom 3) phone 6) googlefi ``` If you do not see your APN on the list, you can choose `Custom` and enter your SIM card's APN. You will then be asked which region your SIM card will be used in: ```bash Select modem region: 1) Americas 2) Europe/Middle-East/Asia ``` Your VOXL is now finished configuring and will setup and start the required background services. ```bash Setting APN: m2m.com.attz reloading systemd services enabling voxl-modem systemd service starting voxl-modem systemd service DONE configuring voxl-modem ``` After a short time your VOXL will be connected to the LTE network. You will now be able to reboot your VOXL and have it connect to the LTE network automatically. For information on how to get connected to your Ground Control Station over LTE, checkout our page on [the LTE Modem User Guide](/lte-v2-modem-user-guide/).. --- Source: https://docs.modalai.com/lte-modem-and-usb-add-on-v2-datasheet/ # LTE Modem and USB Add-on v2 Datasheet [Manual](/lte-v2-modem-user-guide/) ## Board Connections and I/O ![m0030-1-top.png](/images/voxl/voxl-lteh/m0030-1-top.png) ![m0030-1-bottom.png](/images/voxl/voxl-lteh/m0030-1-bottom.png) ## Specifications ### Physical Specification | Specicifcation | Value | |---------------------------------|--------------------------------------------------------------------------------------------------------------| | Weight (with modem and lid) | 14g | | Dimensions | 37.0 x 43.3mm | | Downstream USB ports | 2 | | Cellular 3GPP Bands Supported | See `Radio Specifications` below | | WWAN Antenna Connectors (MIMO) | UFL-R-SMT-110 | | Recommend Antennas | [W3907B0100](https://www.digikey.com/product-detail/en/pulselarsen-antennas/W3907B0100/1837-1003-ND/7667474) | | Downstream USB Connectors | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | Downstream USB Mating Connector | JST GHR-04V-S | | Debug Console Connector | BM04B-SRSS-TB | | Debug Console Mating Connector | SHR-04V-S-B | | J1 Connector (bottom of board) | Samtec Inc, MPN: QTH-030-01-F-D-K | | J1 Mating Connector | Samtec Inc., MPN: QSH-030-01-L-D-A-K | ![m0030-1-dim.png](/images/voxl/voxl-lteh/m0030-1-dim.png) ### Radio Options Specification #### MDK-M0030-1-00 (No Modem - Carrier Board Only) #### MDK-M0030-1-01 (North America - WP7610) - [WP7610 Modem](https://www.sierrawireless.com/products-and-solutions/embedded-solutions/products/wp7610/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | |--------------------------|-------------------------------------| | 4G LTE, Cat-4 | B2, B4, B5, B12, B13, B14, B17, B66 | | 3G Fallback, HSPA+, UMTS | B2, B4, B5 | | Bandwidth | up to 150/50 Mbps Download/Upload | #### MDK-M0030-1-02 (EMEA - WP7607) - [WP7607 Modem](https://www.sierrawireless.com/iot-modules/smart-modules/wp7607/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | | --- | --- | | 4G LTE, Cat-4 | B1, B3, B7, B8, B20, B28 | | 3G Fallback, HSPA+, UMTS | B1, B8 | | 2G Fallback, EDGE, GSM, GPRS | 900, 1800 | | Bandwidth | up to 150/50 Mbps Download/Upload | #### MDK-M0030-1-03 (North America - RC7611) - [RC7611 Modem](https://www.sierrawireless.com/iot-modules/smart-modules/rc7611/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | |--------------------------|-----------------------------------------------| | 4G LTE, Cat-4 | B2, B4, B5, B12, B13, B14, B25, B26, B66, B71 | | 3G Fallback, HSPA+, UMTS | None | | Bandwidth | up to 150/50 Mbps Download/Upload | #### MDK-M0030-1-04 (EMEA - RC7620) - [RC7620 Modem](https://www.sierrawireless.com/iot-modules/smart-modules/rc7620/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | |--------------------------|-----------------------------------------------| | 4G LTE, Cat-4 | B1, B3, B7, B8, B20, B28 | | 3G Fallback, HSPA+, UMTS | B1, B8 | | Bandwidth | up to 150/50 Mbps Download/Upload | ### SIM Cards and Supported Networks The modem card requires the use of a Nano SIM card. AT&T (FirstNet), Verizon and Sierra Wireless are supported by `MDK-M0030-1-03`. ### Power Consumption | Configuration | 5V Power Consumption (mA) | |----------------------------------------------------|---------------------------| | Baseline (USB Hub, Glue Logic, All LEDs ON) | 150 | | Baseline plus Qty-2 USB Peripherals at Max 500mA* | 1180 | | Baseline + Qty-2 DS USB* + WP Series^ HSDPA Band 1 | 2010 | | Baseline + Qty-2 DS USB* + WP Series^ HSDPA Band 8 | 1930 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 1 | 2240 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 7 | 2150 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 25 | 2265 | **For each of the two downstream peripherals removed from the hub, subtract 500mA plus ~30mA logic from the power requirement.* *^ Band power consumption information is limited to WP7502, WP7504, and WP8548 (max of these three, at listed mode & band). For other module power consumptions or alternate bands, please contact your local Sierra Wireless FAE, or ModalAI.* ## LEDs ### Status LEDs | LED | Description | | --- | --- | | `5VDC IN` | Illuminates `GREEN` when the board is powered | | `WWAN STAT` | Illuminates `GREEN` when the modem is initialized | | `PWR GOOD` | Illuminates solid `GREEN` when all local power is good | ### USB LEDs The `USB PORT2 PWR` and `USB PORT3 PWR` LEDs illuminate green to indicate the USB device is powered when plugged in ## Connector Pinouts ### J2 - Serial Debug Port - Connector - BM04B-SRSS-TB - Mating Connector - SHR-04V-S-B | Pin | Description | | --- | --- | | 1 | 3.3 VDC | 2 | UART_RX_3P3V | | 3 | UART_TX_3P3V | | 4 | GND | ### J5 - USB Port 2 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ### J6 - USB Port 3 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ## Environmental ### Operating Temperature TODO ## 2D/3D Drawings [M0030_REVA_WP_Socket_with_lid.stp](https://storage.googleapis.com/modalai_public/modal_drawings/M0030_REVA_WP_Socket_with_lid.stp) ## Emergency Boot Switch Typically left in the `OFF` state, this switch can be used to enable `emergency boot` mode. --- Source: https://docs.modalai.com/lte-v1-modem-user-guide/ # LTE v1 Modem and USB Add-On Board User Guide --- ## Overview The VOXL system provides the ability to easily and quickly add an LTE connection. The following guide provides you the necessary details on doing so with an LTE v1 Modem. [Datasheet](/lte-modem-and-usb-add-on-datasheet/) ## Requirements ### Hardware In order to connect the VOXL to an LTE network using the v1 Modem, you will be using the following hardware: | Part Number | Description | | --- | --- | | VOXL-ACC-LTEH-NA | Add-on board for VOXL which enables North American carrier LTE as well as adds a USB hub to integrate more peripherals CAT4 LTE Bands 2,4,5,12 | ![v1 Modem](/images/modems/LTE/voxl-acc-lteh-na-144.png) Each kit conveniently comes with two LTE antennas (which are also available [here](https://www.modalai.com/products/mrf-m0030-1)) ### Software The following software is required and should already be pre-installed: - [System Image 2.5.2 +](/voxl-system-image/) - voxl-modem_0.10.0 + ## SIM Cards and Supported Networks The LTE modems require a Nano SIM card, most major cellular network carriers are supported. For Band 3 support, the `VOXL-ACC-LTEH-DOD` modem is required and Band 3 SIM cards need to be requested through ModalAI. ## SIM Card Installation - The SIM card needs to be installed in the orientation pictured below. ![SIM card installation on the LTE v1 add-on, step 1](/images/voxl/voxl-lteh/sim-card-v1-1.jpg) - Slide the SIM card into the SIM card slot on the bottom of the LTE board. ![SIM card installation on the LTE v1 add-on, step 2](/images/voxl/voxl-lteh/sim-card-v1-2.jpg) - Push the SIM card in until you feel the card click into place. ![SIM card installation on the LTE v1 add-on, step 3](/images/voxl/voxl-lteh/sim-card-v1-3.jpg) To remove the SIM card, push the card slightly further into the slot until you feel a click, the card will then be able to slide out. ## Hardware Setup - Remove power and USB from the VOXL - Insert your SIM card into the modem's SIM card slot - Attach antennas to the modem - Attach LTE modem to VOXL using VOXL's J13 connector - **Note:** The switch near the antenna connectors should be in the **'off'** position. When 'on', it will force the main board to into USB boot mode - Reconnect USB and power to VOXL ## Software Setup VOXL ships with a simple utility to assist with setting up a modem. (voxl-modem_0.10 + required) `voxl-configure-modem` allows you to quickly and easy bring up a network connection using an LTE modem. ```bash # On VOXL voxl-configure-modem ``` You will first be asked which modem type you are setting up: ```bash What type of modem are you using? If you are unsure of which modem you have, take a look at the following datasheets: v1 LTE Modem: https://docs.modalai.com/lte-modem-and-usb-add-on-datasheet/ v2 LTE Modem: https://docs.modalai.com/lte-modem-and-usb-add-on-v2-datasheet/ Microhard Modem: https://docs.modalai.com/microhard-add-on-datasheet/ 1) v1 2) v2 3) microhard ``` Choose `1` for v1 modem. You will then be asked if you are attempting to connect to ModalLink: ```bash Are you attempting to connect to ModalLink? (not common) 1) yes 2) no ``` If you are using a SIM from a cellular network (AT&T, Verizon, T-Mobile, etc.) select `2` for no. You will then be asked to select the correct APN for your SIM card: ```bash Which APN is correct for your SIM card? AT&T - IoT device - APN: m2m.com.attz AT&T - Laptop or Tablet - APN: broadband AT&T - Smartphone - APN: phone T-Mobile - APN: fast.t-mobile.com Version - APN: vzwinternet 1) m2m.com.attz 3) phone 5) vzwinternet 2) broadband 4) fast.t-mobile.com 6) Custom ``` If you do not see your APN on the list, you can choose `Custom` and enter your SIM card's APN. You will then be asked which region your SIM card will be used in: ```bash Select modem region: 1) Americas 2) Europe/Middle-East/Asia ``` Your VOXL is now finished configuring and will setup and start the required background services. ```bash Setting APN: m2m.com.attz reloading systemd services enabling voxl-modem systemd service starting voxl-modem systemd service DONE configuring voxl-modem ``` After a short time your VOXL will be connected to the LTE network. You will now be able to reboot your VOXL and have it connect to the LTE network automatically. For information on how to get connected to your Ground Control Station over LTE, checkout our page on [the LTE Modem User Guide](/lte-v2-modem-user-guide/). --- Source: https://docs.modalai.com/lte-modem-and-usb-add-on-datasheet/ # LTE Modem and USB Add-on v1 Datasheet [Manual](/lte-v1-modem-user-guide/) ## Board Connections and I/O ![voxl-acc-lteh-na-144.png](/images/modems/LTE/voxl-acc-lteh-na-144.png) ## Specifications ### Physical Specification | Specicifcation | Value | | --- | --- | | Weight | 12g | | Dimensions | 37.1 x 43.18mm | | Downstream USB ports | 2 | | Cellular 3GPP Bands Supported | LTE 2, 4, 5, 12 WCDMA 2, 5 | | WWAN Antenna Connectors (MIMO) | UFL-R-SMT-110 | | Recommend Antennas | [W3907B0100](https://www.digikey.com/product-detail/en/pulselarsen-antennas/W3907B0100/1837-1003-ND/7667474) | | Debug Console Connector | SM04B-SRSS-TBLFSN | | Debug Console Mating Connector | SHR-04V-S-B | | USB2 Host Connectors | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | USB2 Host Mating Connector | JST GHR-04V-S | | J7 Connector (bottom of board) | Samtec Inc, MPN: QTH-030-01-F-D-K | | J7 Mating Connector | Samtec Inc., MPN: QSH-030-01-L-D-A-K | ![M0020-WNC.PNG](/images/modems/LTE/M0020-WNC.PNG) ### Radio Specification #### VOXL-ACC-LTEH-NA | Specicifcation | Value | | --- | --- | | North America CAT4 LTE Bands | 2, 4, 5, 12, 3GPP release 10 | | Bandwidth | up to 150/50 Mbps Download/Upload | | 3G Fallback | UMTS/WCDMA bands 2/5, 3GPP release 8 | #### VOXL-ACC-LTEH-DOD / World The ModalLink system uses Band 3 modems to operate in the DOD's 1800MHz spectrum. The same add-on board can be used for international use. | Specicifcation | Value | | --- | --- | | CAT4 LTE Band | 1,2,3,5,7,8,20,28,38,40 | | Bandwidth | up to 150/50 Mbps Download/Upload | ### SIM Cards and Supported Networks The modem card requires the use of a Nano SIM card. AT&T, Verizon and T-Mobile are supported. For Band 3 support, the `VOXL-ACC-LTEH-DOD` modem is requiered and Band 3 SIM cards need to be requested through ModalAI. ## LEDs ### Status LEDs | LED | Description | | --- | --- | | `PWR` | Illuminates `GREEN` when the board is powered | | `MODEM` | Illuminates `GREEN` when the modem is powered | | `WWAN` | Illuminates solid `BLUE` when connected to the network | ### USB LEDs The `Modem USB Power` and `USB Port Power` LEDs illuminate green to indicate the USB bus and ports are powered ## Connector Pinouts ### J11 - Serial Debug Port - Connector - BM04B-SRSS-TB - Mating Connector - SHR-04V-S-B | Pin | Description | | --- | --- | | 1 | 3.3 VDC | 2 | UART_RX_3P3V | | 3 | UART_TX_3P3V | | 4 | GND | ### J16 - USB Port 1 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ### J17 - USB Port 2 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ## RF Characteristics | Specicifcation | Value (3GPP) | | --- | --- | | TX Power (LTE) | 23 dBm (typical) | | TX Power (WCDMA) | 24 dBm (typical) | | RX Sensitivity (LTE) | -102 dBm (typical) | | RX Sensitivity (WCDMA) | -110 dBm (typical) | ## Environmental ### Operating Temperature | Parameter | Min | Max | Unit | | --- | --- | --- | --- | | LTE System Functional | -40 | +60 | ºC | | Module Functional | -40 | +85 | ºC | | Module 3GPP Compliant | -20 | +60 | ºC | ## Emergency Boot Switch Typically left in the `OFF` state, this switch can be used to enable `emergency boot` mode. --- Source: https://docs.modalai.com/lte-modem-v2-dongle-datasheet/ # LTE Modem v2 Dongle Datasheet ## Board Connections and I/O ![m0030-2-top.png](/images/voxl/voxl-lteh/m0030-2-top.png) ![m0030-2-bottom.png](/images/voxl/voxl-lteh/m0030-2-bottom.png) ## Specifications ### Physical Specification | Specicifcation | Value | | --- | --- | | Weight (with modem and lid) | 14g | | Dimensions | 37.0 x 43.3mm | | Upstream USB ports | 1 | | Downstream USB ports | 2 | | Cellular 3GPP Bands Supported | See `Radio Specifications` below | | WWAN Antenna Connectors (MIMO) | UFL-R-SMT-110 | | Recommend Antennas | [W3907B0100](https://www.digikey.com/product-detail/en/pulselarsen-antennas/W3907B0100/1837-1003-ND/7667474) | | Downstream USB Connectors | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | Downstream USB Mating Connector | JST GHR-04V-S | ![m0030-1-dim.png](/images/voxl/voxl-lteh/m0030-1-dim.png) ### Radio Specification #### LTEH-SA-7607 (EMEA) - [WP7607 Modem](https://www.sierrawireless.com/iot-modules/smart-modules/wp7607/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | | --- | --- | | 4G LTE, Cat-4 | B1, B3, B7, B8, B20, B28 | | 3G Fallback, HSPA+, UMTS | B1, B8 | | 2G Fallback, EDGE, GSM, GPRS | 900, 1800 | | Bandwidth | up to 150/50 Mbps Download/Upload | #### LTEH-SA-7610 (North America) - [WP7610 Modem](https://www.sierrawireless.com/products-and-solutions/embedded-solutions/products/wp7610/) - [HL SNAP-IN COVER](https://datasheet.octopart.com/HL-SNAP-IN-COVER-Sierra-Wireless-datasheet-66898230.pdf) | Specification | Details | | --- | --- | | 4G LTE, Cat-4 | B2, B4, B5, B12, B13, B14, B17, B66 | | 3G Fallback, HSPA+, UMTS | B2, B4, B5 | | Bandwidth | up to 150/50 Mbps Download/Upload | ### SIM Cards and Supported Networks The modem card requires the use of a Nano SIM card. AT&T (FirstNet), Verizon and Sierra Wireless are supported by `VOXL-ACC-LTEH-7610`. For Band 3 support, the `VOXL-ACC-LTEH-7607` modem is required and Band 3 SIM cards need to be requested through ModalAI. ### Power Consumption | Configuration | 5V Power Consumption (mA) | | --- | --- | | Baseline (USB Hub, Glue Logic, All LEDs ON) | 150 | | Baseline plus Qty-2 USB Peripherals at Max 500mA* | 1180 | | Baseline + Qty-2 DS USB* + WP Series^ HSDPA Band 1 | 2010 | | Baseline + Qty-2 DS USB* + WP Series^ HSDPA Band 8 | 1930 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 1 | 2240 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 7 | 2150 | | Baseline + Qty-2 DS USB* + WP Series^ LTE Band 25 | 2265 | **For each of the two downstream peripherals removed from the hub, subtract 500mA plus ~30mA logic from the power requirement.* *^ Band power consumption information is limited to WP7502, WP7504, and WP8548 (max of these three, at listed mode & band). For other module power consumptions or alternate bands, please contact your local Sierra Wireless FAE, or ModalAI.* ## LEDs ### Status LEDs | LED | Description | | --- | --- | | `5VDC IN` | Illuminates `GREEN` when the board is powered | | `WWAN STAT` | Illuminates `GREEN` when the modem is initialized | | `PWR GOOD` | Illuminates solid `GREEN` when all local power is good | ### USB LEDs The `USB PORT2 PWR` and `USB PORT3 PWR` LEDs illuminate green to indicate the USB device is powered when plugged in ## Connector Pinouts ### J3 - 5VDC Power In - Connector - SM02B-SFHRS-TFLFSN - Mating Connector - SFHR-02V-R | Pin | Description | | --- | --- | | 1 | 5.0 VDC (@4A max) | 2 | GND | ### J4 - Upstream USB Port - Connector - 4 Position JST GH, Horizontal, SM04B-GHS-TB - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ### J5 - Downstream USB Port 2 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ### J6 - Downstream USB Port 3 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 3 | GND | ## Environmental ### Operating Temperature TODO ## 2D/3D Drawings [M0030_REVA_WP_Socket_with_lid.stp](https://storage.googleapis.com/modalai_public/modal_drawings/M0030_REVA_WP_Socket_with_lid.stp) ## Connection to Companion Computers ### VOXL ### RaspberryPi 4 [Script](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem/-/blob/master/scripts/sierra-rpi-setup.sh) ### NVidia Jetson TX2 Requires building a new Jetson TX2 system image, see notes [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-modem/-/blob/master/docs/jetson-tx2.md) --- Source: https://docs.modalai.com/lte-io-breakout-usb-hub-datasheet/ # LTE Modem v2 Pro Datasheet ## Development Kits | PN | Description | |--- |--- | | MDK-M0130-00 | board only | ## Dimensions ### 2D Drawings Xmm x Xmm x Xmm ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | X g | [Top](#table-of-contents) ## Block Diagram
![M0130-block-diagram.jpg](/images/modems/M0130-block-diagram.jpg) ## Connector Callouts Hover a highlighted connector to identify it — click to jump to its pinout.
### J5 - apps_proc UART7 and I2C9 | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VREG_3P3V_LOCAL | | | 2 | UART_TX_3P3V | `/dev/ttyHS1` | | 3 | UART_RX_3P3V | `/dev/ttyHS1` | | 4 | I2C_SDA_3P3V | `/dev/i2c-1` | | 5 | I2C_SCL_3P3V | `/dev/i2c-1` | | 6 | GND | |
### J8 - apps_proc SPI11, UART13 I2C2 and GPIO | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VREG_3P3V_LOCAL | | | 2 | SPI_MISO_3P3V | `/dev/spidev11.0` | | 3 | SPI_MOSI_3P3V | `/dev/spidev11.0` | | 4 | SPI_SCLK_3P3V | `/dev/spidev11.0` | | 5 | SPI_CS_3P3V | `/dev/spidev11.0` | | 6 | GPIO_152 | | | 7 | GPIO_88 | input only ini SPI mode | | 8 | I2C_SDA_3P3V | `/dev/i2c-0` | | 9 | I2C_SCL_3P3V | `/dev/i2c-0` | | 10 | UART_TX_3P3V | `/dev/ttyHS3` | | 11 | UART_RX_3P3V | `/dev/ttyHS3` | | 12 | GND | |
### J9 - apps_proc UART19 and I2C10 | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VREG_3P3V_LOCAL | | | 2 | UART_TX_3P3V | `/dev/ttyHS2` | | 3 | UART_RX_3P3V | `/dev/ttyHS2` | | 4 | I2C_SDA_3P3V | `/dev/i2c-2` | | 5 | I2C_SCL_3P3V | `/dev/i2c-2` | | 6 | GND | | ### J10 - apps_proc USB2 (1A limit, port2) | Connector | MPN | | --- | --- | | Board Connector | SM04B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VDC_5V_USB1_PORT2 | D4 LED | | 2 | USB1_CON_D_N | | | 3 | USB1_CON_D_P | | | 4 | GND | | ### J11 - apps_proc USB3 (2A limit, port3) | Connector | MPN | | --- | --- | | Board Connector | SM10B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VDC_5V_USB1_PORT3 | D16 LED | | 2 | USB1_HS_HUB3_CON_D_N | | | 3 | USB1_HS_HUB3_CON_D_P | | | 4 | GND | | | 5 | USB1_HS_HUB3_SS_RX_N | | | 6 | USB1_HS_HUB3_SS_RX_P | | | 7 | GND | | | 8 | USB1_HS_HUB3_SS_TX_N | | | 9 | USB1_HS_HUB3_SS_TX_P | | | 10 | GND | | ### J12 - apps_proc USB2 (1A limit, port4) | Connector | MPN | | --- | --- | | Board Connector | SM04B-GHS-TB(LF)(SN) | | Mating Connector | | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | VDC_5V_USB1_PORT4 | D16 LED | | 2 | USB1_CON_D_N | | | 3 | USB1_CON_D_P | | | 4 | GND | | --- Source: https://docs.modalai.com/5G-Modems/ # ModalAI 5G Modems Documentation for ModalAI's range of 5G Modems. ![5G](/images/modems/5G/m0090-m0054.jpg) # Device Specifications --- Source: https://docs.modalai.com/5G-Modem-user-guide/ # How to connect with 5G (M0090) --- ![5G](/images/rb5/QC-Flight-RB5-boards-2.png) --- ## Connecting to 5G network In order to establish a connection to the 5G network, `voxl-modem` is required. ### Configuring Service The `voxl-modem` service can be configured by running the following: ```bash voxl-configure-modem ``` > **_NOTE:_** Option "V2" is the Sierra wireless modem board [V2 Modem board](/lte-modem-and-usb-add-on-v2-datasheet/#radio-options-specification). Do not select this with a Quectel modem connected The user will be prompted to select their modem hardware and APN (Access Point Name) for their chosen SIM card. This will enable the `voxl-modem` service in the background and it will be started at boot. ### Disabling / enabling service The `voxl-modem` service can be disabled by running the following: ```bash systemctl disable voxl-modem ``` The service can be re-enabled by running: ```bash systemctl enable voxl-modem ``` The status of the service can be viewed by running: ```bash systemctl status -l voxl-modem ``` ## Connecting to QGC over 5G In order to connect QGC over the LTE or 5G network, a VPN will be needed in order to complete the bridge from the cellular network to the drone. A typical use case of an LTE connection is to connect a drone to a Ground Control Station (GCS) such as [QGroundControl](http://qgroundcontrol.com/). Typically the GCS is also connected to an LTE network. In this case, both the drone and the GCS have been assigned IP addresses on the LTE network that are private to the carrier network. This prevents the drone from directly connecting to the GCS since their IP addresses are not visible to each other over the internet. There are a variety of ways to solve this issue. ModalAI uses a VPN as the preferred solution. ![LTE data flow](/images/rb5/lte-data-flow.png) This diagram shows how the VPN solution works. In this example a server is allocated with a static IP address, `35.236.55.229`. For QRB5165 based devices, we prefer to use [Tailscale](https://tailscale.com/) as our VPN provider. If you prefer to host your own server, you can do so with [Google Cloud Platform](https://cloud.google.com/), [Amazon Web Services](https://aws.amazon.com/), [Microsoft Azure](https://azure.microsoft.com/en-us/), etc. Ubuntu is our preferred OS for our servers. Our self-hosted VPN server is setup using the [OpenVPN](https://openvpn.net/) software package. In the example above, once the drone has connected to the AT&T network, it obtains the IP address `10.47.x.y` and the GCS, once connected, obtains the address `10.47.x.z`. With the VPN server software running on the cloud server and VPN client software on both the drone and the GCS, the devices can now connect and get VPN IP address assignments. In this diagram, the drone is assigned `10.8.0.6` and the GCS is assigned `10.8.0.8`. The drone can now communicate directly to the GCS using the `10.8.0.8` IP address. It is desirable for the drone and the GCS to always get the same IP address when connecting to the VPN. This is possible by assigning each separate network endpoint a unique security certificate. When each endpoint connects using it's certificate it can be configured to receive the same address every time. --- Source: https://docs.modalai.com/5G-Modem-datasheet/ # 5G Modem Add-on Datasheet (M0090) --- Hover a connector to identify it — click to jump to its pinout. --- | PCB | H x W x D | Weight | Drawings | |-------------------------------------------------|------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ModalAI 5G Modem Carrier Board (M0067 or M0090) | 67.5 x 36 x 10mm | 12.8g |
[3D STEP, M0067](https://storage.googleapis.com/modalai_public/modal_drawings/M0067_VOXL2_5G_MODEM_DEBUG_REVA_S1_P9.step)
[3D Step, M0090](https://storage.googleapis.com/modalai_public/modal_drawings/M0090_DUAL_VOXL_5G_M.2_REVA-3-01-V2-QUECTEL.step) | | Quectel RM502Q-AE | 52× 30 × 2.3mm | 8.7g | [Mechanical Drawing](https://storage.googleapis.com/modalai_public/modal_drawings/Quectel_RM500Q-AERM502Q-AE_Hardware_Design_V1.0.pdf) | ## Block Diagrams ### M0090 Block Diagram ![5G](/images/modems/5G/M0090-block-diagram.jpg) ## Drawings ### 3D Step [M0090 step file](https://storage.googleapis.com/modalai_public/modal_drawings/M0090_DUAL_VOXL_5G_M.2_REVA-3-01-V2-QUECTEL.step) ## Connectors ### J2 VOXL 2 Board to Board See J3 at [VOXL 2 Connectors](/voxl2-connectors/) ### J3 nano-SIM CARD Connector Type: SF72S006VBAR2500 ### J4 VOXL 2 Board to Board See J5 at [VOXL 2 Connectors](/voxl2-connectors/) ### J5 m.2 B-key Connector Type: 2199230-3 Description: M.2 0.5PITCH 4.2H KEY B 15U'' AU | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | | | ### J6 VOXL 2 Kernel Serial Not installed ### J8 SPI | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | VREG_3P3V | | | 2 | MISO_3P3V | | | 3 | MOSI_3P3V | | | 4 | SCLK_3P3V | | | 5 | CS0_3P3V | | | 6 | GND | | ### J9 UART / i2c | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | VREG_3P3V | | | 2 | TX_3P3V | | | 3 | RX_3P3V | | | 4 | SDA_3P3V | | | 5 | SCL_3P3V | | | 6 | GND | | ### J11 USB 3 10-pin Applies to: M0067, M0090 | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5VDC | 5V protected power output | | 2 | USB1_HS_HUB3_CON_D_N | | | 3 | USB1_HS_HUB3_CON_D_P | | | 4 | GND | | | 5 | USB1_HUB3_SS_RX_N | | | 6 | USB1_HUB3_SS_RX_P | | | 7 | GND | | | 8 | USB1_HUB3_SS_TX_N | | | 9 | USB1_HUB3_SS_TX_P | | | 10 | GND | | ### J12 USB 2 4-pin Applies to: M0067, M0090 | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5VDC | 5V protected power output | | 2 | USB1_HS_HUB4_CON_D_N | | | 3 | USB1_HS_HUB4_CON_D_P | | | 4 | GND | | ## Switches ### SW3 TBD ## Supported Modems ### Sierra Wireless EM9291 (ModalAI Default option) The M0090-3-02 PCBA supports the Sierra Wireless EM9291 modem. Official Sierra [datasheet](https://www.sierrawireless.com/iot-modules/5g-modules/em9291/). * 5G NR3GPP Release 15 NSA/SA operation, Sub-6 GHz5G NR * LTE CategoryDL Cat 20/ UL Cat 18 | Air Interface | Supported Bands | |-----------------|----------------------------------------------------------------------------------| | 5G NR Sub-6 | n1, n2, n3, n5, n7, n8, n12, n13, n14, n18, n20, n25, n26, n28, n29, n30, n38, n39, n40, n41, n46, n48, n66, n70, n71, n75, n76, n77, n78, n79 | | 4G LTE Cat-20 | B1, B2, B3, B4, B5, B7, B8, B12, B13, B14, B18, B19, B20, B21, B25, B26, B28, B29, B30, B32, B34, B38, B39, B40, B41, B42, B43, B46, B48, B66, B71 | ### Quectel RM502Q-AE (Non-standard option) The M0090-3-01 PCBA supports the Quectel RM502Q-AE modem. Official Quectel datasheet. * 5G NR3GPP Release 15 NSA/SA operation, Sub-6 GHz5G NR * LTE CategoryDL Cat 20/ UL Cat 18 | Air Interface | Supported Bands | |-----------------|----------------------------------------------------------------------------------| | 5G NSA | n38/n41/n77/n78 | | 5G SA | n1/n2/n3/n5/n7/n8/n12/n20/n25/n28/n38/n40/n41/n48/n66/n71/n77/n78 | | 5G DL 4 ×4 MIMO | n1/n2/n3/n7/n25/n38/n40/n41/n48/n66/n77/n7 | | 5G UL 2 ×2 MIMO | 41/n77/n78 | | LTE-FDD | B1/B2/B3/B4/B5/B7/B8/B12/B13/B14/B17/B18/B19/B20/B25/B26/B28/B29/B30/B32/B66/B71 | | LTE-TDD | B34/B38/B39/B40/B41/B42/B43/B48 | | LAA | B46 | | DL 4 ×4 MIMO | B1/B2/B3/B4/B7/B25/B30/B32/B34/B38/B39/B40/B41/B42/B43/B48/B66 | | UMTS WCDMA | B1/B2/B3/B4/B5/B6/B8/B19 | --- Source: https://docs.modalai.com/doodle-labs-user-guide/ # Doodle Labs User Guide ## Overview VOXL and VOXL2 support the ability to quickly and easily add a Doodle Labs wireless connection to a Ground Control Station. The following guide provides you the necessary details to do so. Below are some helpful link from Doodle Labs: [Doodle Labs Technical Library](https://kb.doodlelabs.com/) [Doodle Labs Datasheets](https://kb.doodlelabs.com/) [Doodle Labs Helix Datasheet](/images/modems/Doodle_Labs_Smart_Radio-RM-2025-2L_Datasheet.pdf) ![doodle-labs-modem](/images/modems/doodle-labs/doodle-labs-helix.png) ## Requirements ### Hardware The following ModalAI hardware is required to establish a Doodle Labs network connection between a VOXL-based product and a host device (computer, tablet, etc.). #### VOXL 2 10-pin USB Add-on Boards Compatible add-on boards for VOXL 2 (M0154 - [Purchase](https://www.modalai.com/products/voxl-2)) and [MCBL-00085](/cable-datasheets/#mcbl-00085) | Part Number | Description | |---------------------------------------------------|--------------------------------------| | [MCCA-M0090](/5G-Modem-datasheet/) | VOXL 2 5G Modem | | [MCCA-M0130](/lte-io-breakout-usb-hub-datasheet/) | VOXL 2 LTE I/O Breakout with USB Hub | | [MCCA-M0151](/m0151/) | VOXL 2 USB 3 UART Add-on | | [MCCA-M0183](/m0183/) | VOXL 2 mPCIe and USB 3 Hub Add-on | #### Legacy 4-pin USB Add-on Boards (Deprecated) | Part Number | Description | Link | |------------------------|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | MCCA-M0078 (EOL) | VOXL USB Expansion Boards | EOL | | MCCA-M0041 | Power Module v3 | [Purchase](https://www.modalai.com/products/mdk-m0041-1?variant=31984449650739) | | M0006, M0019, or M0054 | VOXL, VOXL-Flight, or VOXL 2 | Purchase links: [VOXL 2](https://www.modalai.com/products/voxl-2?variant=39914779836467), VOXL-Flight, VOXL | ### Software In order for the required drivers to be available on target, the following software is required:
- [VOXL 2 Platform Release 1.3.1-0.8+ ](https://downloads.modalai.com) - [voxl-modem_0.16.0+](http://voxl-packages.modalai.com/dists/qrb5165/)
- [VOXL Platform Release 3.8.0-0.8+ ](https://downloads.modalai.com) - [voxl-modem_0.16.0+](http://voxl-packages.modalai.com/dists/apq8096/)
## Hardware Setup Below is a list of required hardware in order to create a connection between a VOXL-based device and a ground control station via. Doodle Labs Helix modems. | QTY | Part Number | Description | Notes | |-----|------------------------|--------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 | M0090 or M0130 or M0151 or M0183 | VOXL USB Expansion Board v2 | [Purchase](https://www.modalai.com/products/m0151) | | 1 | MCCA-M0041-B | Power Module v3 | [Purchase](https://www.modalai.com/products/mdk-m0041-1?variant=31984449650739) | | 1 | M0154 | VOXL 2 | Purchase links: [VOXL 2](https://www.modalai.com/products/voxl-2?variant=39914779836467), VOXL-Flight, VOXL | | 1 | Ground station device | Computer, laptop, etc. | Device must have [smsc95XX driver](https://github.com/torvalds/linux/blob/master/drivers/net/usb/smsc95xx.c) support | | 1 | Power source | Power supply for ground station modem | 5V Operating Voltage | | 1 | USB-C cable | USB-C to USB on specified port on ground station | USB-C, A, etc. | | 2 | RM-2450-12M3 | Doodle Labs Mesh Rider Mini | [Description](https://doodlelabs.com/products/mesh-rider-radios/mini/) | | 1 | Helix breakout board | Ground station side, provide power and USB | 5V Input | | 2 | MCBL-00085-1 | Modem data / power cables | [Datasheet](/cable-datasheets/#mcbl-00085) | | 2 | Helix Antennas | Cables, antennas | Attenuators for desktop development only | Below are the pinout details to connect VOXL 2 with 10-pin USB Breakout to Doodle Labs Mesh Rider Mini: | A | VOXL 2 Host (M0130, Source) | B | Mesh Rider Mini Port4 (Power, Load) | C | Mesh Rider Mini Port1 (USB Data) | |----|-----------------------------|-------|-------------------------------------|---|----------------------------------| | 1 | 5V VBUS (Source) | 1,2,3 | 5V DC (Load) | - | - | | 2 | D- | - | - | 2 | D- | | 3 | D+ | - | - | 3 | D+ | | 4 | GND | 4 | GND | 4 | GND | | 7 | GND | 5 | GND | - | - | | 10 | GND | 6 | GND | - | - | ### VOXL Hardware Setup It is recommended to now use M0151 with MCBL-00085 #### Using M0078 (Deprecated) The [USB Expansion Board](/usb-expander-and-debug-datasheet/) exposes a USB 2.0 port on VOXL and VOXL2, and provides up to 5A to peripherals. ![m0054-helix-2](/images/voxl2/m0054-helix-2.png) ![doodle-voxl-setup](/images/modems/doodle-labs/voxl2-doodle.jpg) Pictured above for your reference is a VOXL 2 flight deck with all cameras connected and Doodle Labs Helix connected. ***IMPORTANT! Before modifying hardware setup, ensure power is off or disconnected.*** - Attach `M0078` add-on board to `J3` of `VOXL 2`. - Ensure jumper is set to `USB PWR 5V` side in order to provide sufficient power to modem. - Attach antennas to ports on Helix modem, if doing desktop development use the attenuators between cable and antenna in order to prevent RF saturation in a bench top environment. - Use modified `15-pin to 4-pin JST` cable to connect modem to `J3` of `M0078` - Attach `M0041` APM to VOXL 2 and provide power - Plug in `USB-C cable` from desktop to VOXL 2 in order to access `ADB` later on. ### Ground Station Hardware Setup ![doodle-ground-station-setup](/images/modems/doodle-labs/ground-station-doodle.jpg) Pictured above for your reference is a ground station setup showing a Doodle Labs Helix modem and breakout board. ***IMPORTANT! Before modifying hardware setup, ensure power is off or disconnected.*** - Attach antennas to ports on Helix modem, if doing desktop development use the attenuators between cable and antenna in order to prevent RF saturation in a bench top environment. - Use un-modified `15-pin to 15-pin cable` to connect the `Helix modem` to the `breakout board` - Use `USB-C cable` to `breakout board` to `host` ground station - Connect power (5V) to `green connector`, see above photo to determine +(red) and -(black) - Turn on power from power supply ## Software Setup ### VOXL 2 Software Setup - adb onto VOXL 2 ``` adb shell voxl2:/$ ``` - Run the following the begin modem setup: ``` voxl2:/$ voxl-configure-modem What type of modem are you using? 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9X91 ``` - Select `doodle` from the menu ``` #? 4 Enter the IP address you would like to the VOXL to use on the Doodle network: Note: The chosen IP address must be of the form: 10.223.0.XXX Default - 10.223.0.100 1) default 2) custom ``` - Select the static IP you would like your VOXL 2 to use on the Doodle network, either choose default or another IP on the `10.223` subnet - Next, choose the network interface the Doodle radio is connected to (default `eth1`); this is written to the `doodle_interface` field of `/etc/modalai/voxl-modem.conf`. At runtime the interface is auto-detected by driver name, with this configured value used as a fallback ``` Enter the network interface you would like to the VOXL to use on the Doodle network: Default - eth1 1) default 2) custom ``` ``` #? 1 qrb5165 based device detected reloading systemd services enabling voxl-modem systemd service starting voxl-modem systemd service DONE configuring voxl-modem ``` - The VOXL2 will now enable the `voxl-modem-doodle` service in order to enable the Helix modem connection and set the static IP on bootup - Verify that the Doodle network interface (`eth1` by default) has enumerated and that the IP has been set correctly: ``` ifconfig eth1 eth1: flags=4163 mtu 1500 inet 10.223.0.100 netmask 255.0.0.0 broadcast 10.255.255.255 ether 00:30:1a:4f:96:05 txqueuelen 1000 (Ethernet) RX packets 2930 bytes 661816 (661.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5264 bytes 290037 (290.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` ### Ground Station Software Setup - Set a static IP address for the host PC on the Doodle network, Ubuntu 18.04 shown below: ![doodle-labs-default-ip](/images/modems/doodle-labs/doodle-host-ip.png) In this case, the IP address of the host PC will be set to `10.223.0.150` ## Connecting to QGroundControl Now that both the VOXL side and ground station side software have been setup you should be able to ping one device from the other. For example, one can ping the ground station from VOXL by doing the following: ``` voxl2:/$ ping 10.223.0.150 PING 10.223.0.150 (10.223.0.150): 56 data bytes 64 bytes from 10.223.0.150: icmp_seq=0 ttl=64 time=0.126 ms 64 bytes from 10.223.0.150: icmp_seq=1 ttl=64 time=0.169 ms 64 bytes from 10.223.0.150: icmp_seq=2 ttl=64 time=0.115 ms 64 bytes from 10.223.0.150: icmp_seq=3 ttl=64 time=0.117 ms 64 bytes from 10.223.0.150: icmp_seq=4 ttl=64 time=0.121 ms ``` Since we are able to get packets from drone to ground station we can now connect our VOXL 2 / drone to QGroundControl. Check the configuration of [voxl-mavlink-server](/voxl-mavlink-server/) if it does not connect immediately. [voxl-mavlink-server](/voxl-mavlink-server/) is the main routing process for MAVLink data on VOXL 2. --- Source: https://docs.modalai.com/doodle-labs-modems/ # ModalAI Doodle Labs Modems Documentation for ModalAI's range of Doodle Labs modems. --- Source: https://docs.modalai.com/microhard-modems/ # ModalAI Microhard Modems Documentation for ModalAI's range of Microhard modems. ![microhard](/images/modems/microhard/Microhard-pMDDL2350.png) --- Source: https://docs.modalai.com/microhard-add-on-manual/ # Microhard Add-On Board User Guide ## Overview The VOXL system supports the ability to easily and quickly add a Microhard wireless connection between a vehicle and a Ground Control Station. The following guide provides you the necessary details on doing so. [Datasheet](/microhard-add-on-datasheet/) ### Supported Microhard Modem Modules * 1800MHz pDDL1800 (EOL * 2.4GHz MIMO pMDDL2450 ([Buy Here](https://www.modalai.com/products/oem-m0048-4-1) * 2.3GHz MIMO pMDDL2350 (EOL) * 2.4GHz MIMO pMDDL2400 ([Buy Here](https://www.modalai.com/collections/accessories/products/oem-m0048-4-1)) ## Requirements ### Hardware The following hardware is required to establish a Microhard connection between VOXL and a host computer. | Part Number | Description | Link | |-------------|-----------------------------------------------|----------------------------------------------------------------------------------------------------| | MDK-M0048-1 | VOXL Microhard Modem Add-on | [Purchase](https://www.modalai.com/products/voxl-microhard-modem-usb-hub) | | MDK-M0048-2 | Microhard pDDL Carrier Stand-alone USB Dongle | [Purchase](https://www.modalai.com/products/mdk-m0048-2) | | VOXL Microhard Modem Add-on | Microhard pDDL Carrier USB Dongle | |:-------------------------------------------------------------------:|:------------------------------------------------------------:| | ![MH Add-on](/images/modems/microhard/voxl-acc-mh-assembled.jpg) | ![MH Standalone](/images/modems/microhard/standalone.jpg) | ## Hardware Setup In order for the Microhard modules to communicate correctly, one module needs to be setup as a `Master` and the other needs to be setup as a `Slave`. For the best performance, it is required to connect the `Master` to the source (e.g. VOXL, Drone, Video Source) and the `Slave` to the receiver (e.g. PC). ### Hardware Setup - Master - Remove power and USB from the VOXL main board - Attach an antenna to the `ANT` connection on the Microhard Modem - Insert Microhard Modem into VOXL Microhard Modem Add-on, pin 1 should line up with the white dot on the board. - Attach VOXL Microhard Modem Add-on to VOXL2's `J3` Expansion B2B connector. - Connect VOXL2 to Host PC via VOXL2's USBC connector to get adb connection - Power on VOXL2 ### Hardware Setup - Slave - Attach an antenna to the `ANT` connection on the Microhard Modem - Insert Microhard Modem into the Microhard pDDL Carrier USB Dongle, pin 1 should line up with the white dot on the board. - Connect the Microhard USB Dongle to the host PC via the single `To USB Host` connector on the bottom of the board - Power the board. ## Software Setup In order to establish a link between the Microhard Modems in a quick and easy way, we can take advantage of the VOXL Microhard Modem Add-on and Microhard pDDL Carrier USB Dongle's `S2` buttons, which act as "reset" buttons for the Microhard Modems. Before starting, make sure both the VOXL and Microhard pDDL Carrier USB Dongle are powered by following the steps above. ### VOXL2 Add-on In order to enable the VOXL Microhard Add-on board, the following software is required and should already be pre-installed: - [System Image 1.1.2 +](/voxl2-voxl2-mini-system-image/) - voxl-modem 1.x `voxl-configure-modem` allows you to quickly and easily bring up a Microhard modem. ```bash # On VOXL voxl-configure-modem ``` You will first be asked which modem type you are setting up: ```bash What type of modem are you using? 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9X91 ``` Choose `2` for microhard. You will then be asked for the IP address that you would like to be assigned to your VOXL on the Microhard network. ```bash Enter the IP address you would like to the VOXL to use on the Microhard network: Note: The chosen IP address must be of the form: 192.168.168.XXX, where XXX is a 3 digit number Default - 192.168.168.100 1) default 2) custom ``` Once you choose your IP address, the VOXL will configure the service files that enable Microhard connection on bootup. ```bash Making new interface file /etc/network/interfaces reloading systemd services enabling voxl-modem systemd service starting voxl-modem systemd service DONE configuring voxl-modem ``` Now that you have enabled the VOXL's software to handle the Microhard modem, press and hold the `S2` button on the VOXL Microhard Add-on board for at least **10 seconds**, then release. The module will then reset all settings to the default values required for a **Master** module. This module will be assigned a default IP address of `192.168.168.1` After a short time your VOXL will be connected to the Microhard network. You will now be able to reboot your VOXL and have it connect to the Microhard network automatically. ### Standalone The process for configuring the standalone Microhard board is simple: - Press and hold the `S2` button on the Microhard pDDL Carrier USB Dongle for **5 seconds**, then release. The module will then reset all settings to the default values required for a **Slave** module. This module will be assigned a default IP address of `192.168.168.2` Once both Microhard modems have been configured, the two should now automatically connect to each other. ## Microhard Modem Command Line Interface Configuration The following (updated 2024-Aug) has been used to succesfully setup pMDDL2400 master and slave using the command line interface over SSH. For full list of AT commands, please see Microhard documentation (although Microhard;s website doesn't have this information (sigh....), we've found it [here](http://www.isnmp.com/download/pmddl2350/pMDDL.Operating%20Manual.v1.2.1.pdf)) Here are some useful commands used below: | Description | Command | | ------------------------------- | -------------------------------------- | | Get/Set radio status, On or Off | AT+MWRADIO=
0 - Off
1 - On | | Get/Set radio Wireless Distance | AT+MWDISTANCE=
100
200000 | | Get/Set radio Tx power | AT+MWTXPOWER=
7
30 | | Get/Set radio mode | AT+MWVMODE=
0 - Master
1 - Slave | | Get/Set radio frequency | AT+MWFREQ2400=
4 - 2405 Mhz
76 - 2477 MHz
78 - 2479 Mhz | | Get/Set radio Network ID | AT+MWNETWORKID= | | Edit LAN | AT+MNLAN=lan,EDIT,0,192.168.168.2,255.255.255.0,192.168.168.1 | | Get the status of LAN | AT+MNLAN? | | Get the status of RF | AT+MWSTATUS? | | Save | AT&W | | Reboot | AT+MSREB | ### Reset Modem to Master This should be done to both master and slave units at first for initial condition. 1. Pressing and holding momentary button `S2` 2. Once the CPU LED begins to fast blink on the modem carrier board, hold for ~30 seconds longer 3. Wait until all LEDs but the CPU LED turn off ### Setup Master (AT+MWVMODE=0) With the M0048-1 add-on modem connected to VOXL2, a use case like this is supported: ![M0048-1-block-diagram](/images/modems/microhard/M0048-1-block-diagram.jpg) From VOXL2, SSH onto the modem using user `admin` and paassword `admin`: ``` voxl2:/home$ ssh admin@192.168.168.1 admin@192.168.168.1's password: Connected to 127.0.0.1 Entering character mode Escape character is '^]'. Command Line Interface UserDevice> ``` Example setup for master (AT+MWVMODE=0), network id "test", frequency 2477 MHz ``` UserDevice> AT+MWNETWORKID=test OK UserDevice> AT+MWVMODE=0 OK UserDevice> AT+MWFREQ2400=76 OK UserDevice> AT+MWRADIO=1 OK UserDevice> AT&W Restarting the services to enable the configurations changed recently...... OK UserDevice> AT+MSREB Rebooting... OK Connection closed by foreign host ``` ### Setup Slave (AT+MWVMODE=1) With the M0048-2 standalong modem connected to a host PC (recommended Ubuntu) over USB using something like MCBL-00010. For example, like this: ![M0048-2-block-diagram](/images/modems/microhard/M0048-2-block-diagram.jpg) Example setup for slave (AT+MWVMODE=1): ``` UserDevice> AT+MWNETWORKID=test OK UserDevice> AT+MWVMODE=1 OK UserDevice> AT+MWRADIO=1 OK UserDevice> AT+MWFREQ2400=76 OK UserDevice> AT+MNLAN=lan,EDIT,0,192.168.168.2,255.255.255.0,192.168.168.1 OK UserDevice> AT&W Restarting the services to enable the configurations changed recently...... OK UserDevice> AT+MSREB Rebooting... OK Connection closed by foreign host ``` ## Connecting to QGroundControl The VOXL system uses the `voxl-mavlink-server` service on VOXL to establish a connection between PX4 and QGroundControl over UDP. This is supported on VOXL Flight or when using Flight Core with VOXL (using [this procedure](/how-to-connect-voxl-to-flight-core/)). Locate the IP address of the host PC that has been assigned to it by the Microhard modem. An example output is below: ```bash $ ifconfig enp1s0 Link encap:Ethernet HWaddr 48:D7:05:EA:06:36 inet addr:192.168.168.135 Bcast:192.168.168.255 Mask:255.255.255.0 inet6 addr: fe80::4ad7:5ff:feea:636/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:125 errors:0 dropped:0 overruns:0 frame:0 TX packets:247 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:13399 (13.0 KiB) TX bytes:31491 (30.7 KiB) ``` In this case, the IP address of the host PC is `192.168.168.135` If you have not yet setup `voxl-mavlink-server` on your VOXL, do the following: ```bash # On Host PC $ adb shell # On VOXL voxl2:/home/root# voxl-configure-sku -w voxl2:/home/root# voxl-configure-mpa ``` --- Source: https://docs.modalai.com/microhard-add-on-datasheet/ # Microhard Add-on Datasheet This expansion board plugs directly into VOXL and supports [pDDL modules from Microhard](https://www.microhardcorp.com/products.php) (not included). Once a module is installed and connected to VOXL, this unit can be paired with the ModalAI [Microhard USB Dongle](/microhard-usb-carrier/). [Manual](/microhard-add-on-manual/) --- ## Specification ### Block Diagram [View in fullsize](/images/modems/microhard/M0048-block-diagram.jpg){:target="_blank"} ![voxl-acc-mh-block-diagram.jpg](/images/modems/microhard/M0048-block-diagram.jpg) ### Part Numbers | Part Number | Silkscreen Marking | Description | | --- | --- | --- | | MDK-M0048-1-01 | M0048 REV A | Moved to LAN7500 ethernet controller for better compatibility with Android | | [VOXL-ACC-MH-1](https://www.modalai.com/collections/voxl-add-ons/products/voxl-microhard-modem-usb-hub)| M0012 REV A | Initial Release | ### Physical Specification | Specicifcation | Value | | --- | --- | | Weight | 12g | | Dimensions | 49 x 40mm | | Antenna Connector | ?? UFL-R-SMT-110 | | Recommend Antennas | | | Debug Console Connector | ?? SM04B-SRSS-TBLFSN | | Debug Console Matimg Connector | ?? SHR-04V-S-B | | USB2 Client Connectors | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | USB2 Client Mating Connector | JST GHR-04V-S | | J1 Connector (bottom of board) | Samtec Inc, MPN: QTH-030-01-F-D-K | | J1 Mating Connector | Samtec Inc., MPN: QSH-030-01-L-D-A-K | ### Power Consumption | M0048 Configuration | 5V Power Consumption (mA) | | --- | --- | | Baseline (USB Hub, Glue Logic, All LEDs ON) | 315 | | Baseline plus Qty-2 USB Peripherals at Max 500mA* | 1375 | | Baseline + Qty-2 DS USB* + Microhard 900MHz @ 10dBm | 2800 | | Baseline + Qty-2 DS USB* + Microhard 900MHz @ 30dBm | 3700 | | Baseline + Qty-2 DS USB* + Microhard 2400MHz @ 10dBm | 2500 | | Baseline + Qty-2 DS USB* + Microhard 2400MHz @ 30dBm | 3100 | *For each of the two downstream peripherals removed from the hub, subtract 500mA plus ~30mA logic from the power requirement. ## Board Connections and I/O ### Top of Board ![MDK-M0048-1-01-top.png](/images/modems/microhard/voxl-acc-mh-2-top.png) ### Bottom of Board ![MDK-M0048-1-01-bottom.png](/images/modems/microhard/voxl-acc-mh-2-bottom.png) ### USB Connections You can connect up to two USB-clients to the `USB2 Host` ports on the top of the board. A [MCBL-00009](/cable-datasheets/#mcbl-00009) cable can be used, this is a 4-pin JST to USB Female Type A cable. You can connect the carrier board to a host computer using the USB port on the bottom of the baord. Connect to a host comptuter with `MCBL-00010`, which is a 4-pin JST to microUSB female cable. ### LEDs | Index | LED | Description | | --- | --- | --- | | 1 | `TX` | Flashes `GREEN` indicating wireless TX traffic | | 2 | `RX` | Flashes `GREEN` indicating wireless RX traffic | | 3 | `RSSI-3` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 4 | `RSSI-2` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 5 | `RSSI-1` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 6 | `CPU` | Solid `GREEN`indicates power to module and normal operation, flashing indicates boot or FW upgrade status | | 7 | `LAN` | Can be programmed to flash `GREEN` to indicate MH Link to the Ethernet Controller on board | | 8 | `LAN/100` | Used in conjunction with 9. Can be programmed to flash `GREEN` to indicate Link and Speed or Link and Speed and Activity | | 9 | `LAN/ACT` | Used in conjunction with 8. Can be programmed to flash `GREEN` to indicate Link and Speed or Link and Speed and Activity| | 10 | `5V` | Illuminates solid `GREEN` indicating 5VDC USB bus power enabled | | 11 | `Port3` | Illuminates solid `GREEN` indicating Port 3 USB power enabled | | 12 | `Port4` | Illuminates solid `GREEN` indicating Port 4 USB power enabled | Index 8 and 9 (LED `LAN/100` and LED `LAN/ACT` ) config options. Index 8 (LAN/100) config flags | SPD_LED_FUNCTION | Speed (Mbps) | Index 8 (LAN/100) | |0| No Link | `OFF` | |0| 10 |`OFF` | |0| 100 |`Flashes` | |0| 1000 |`Flashes` | |1| No Link | `OFF` | |1| 10 | `OFF` | |1| 100 | `BLINK` | |1| 100 | `BLINK` | Index 9 (LAN/ACT) config flags | LED_2_FUNCTION | Index 9 (LAN/ACT) | |0| Link and Activity LED |1| Activity LED ### CFG Switch Can be used to reset all settings to default values required for a Slave module. ## Configuration ### Slave Configuration To reset all settings to the default values required for a Slave module, press and hold the `CFG Button`, once the `CPU LED` begins to flash, continue to hold for *5 seconds*, then release. The module will then reset all settings to the default values required for a Slave module ## Connector Pinouts ### J4 - USB Port 3 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 4 | GND | ### J5 - USB Port 4 - Connector - 4 Position JST GH, Vertical, BM04B-GHS-TBT - Mating Connector - JST GHR-04V-S | Pin | Description | | --- | --- | | 1 | 5VDC (500mA max) | | 2 | D- | | 3 | D+ | | 4 | GND | ## Mechanical Drawings ### 2D Drawings ![M0012-Microhard.PNG](/images/modems/microhard/M0012-Microhard.PNG) ### 3D Drawings [M0048_MICROHARD_WITH_SOCKET_LAN7500.stp](https://storage.googleapis.com/modalai_public/modal_drawings/M0048_MICROHARD_WITH_SOCKET_LAN7500.stp) *Note: These 3D files contain all components on them. Some board configurations do not install "DNI" certain connectors or components. Please refer to the included diagrams and design schematics for more detailed information* ## Additional Pictures ### Disassembled ![voxl-acc-mh-disassembled.jpg](/images/modems/microhard/voxl-acc-mh-disassembled.jpg) ### Assembled with VOXL ![voxl-acc-mh-assembled.jpg](/images/modems/microhard/voxl-acc-mh-assembled1.jpg) --- Source: https://docs.modalai.com/microhard-usb-carrier/ # Microhard USB Carrier Board There are two configurations for the VOXL Microhard kits. * VOXL Add-on that plugs directly into VOXL's board to board connector * Standalone USB Dongle This datasheet describes the standalone USB dongle. Microhard Add-on information can be found in this [Datasheet](/microhard-add-on-datasheet/) ### Supported Microhard Modem Modules * 1800MHz pDDL1800 (EOL * 2.4GHz MIMO pMDDL2450 ([Buy Here](https://www.modalai.com/products/oem-m0048-4-1) * 2.3GHz MIMO pMDDL2350 (EOL) --- ## Specification ### Block Diagram [View in fullsize](/images/modems/microhard/M0048-block-diagram.jpg){:target="_blank"} ![voxl-acc-mh-block-diagram.jpg](/images/modems/microhard/M0048-block-diagram.jpg) ### Part Numbers | Part Number | Silkscreen Marking | Description | |-------------------------------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------| | [MDK-M0048-2](https://www.modalai.com/products/mdk-m0048-2) | M0048 REV A | * Added proper power input connector (SM02B-SFHRS-TF)
* Moved to LAN7500 ethernet controller for better compatibility with Android | | MH-SA-1 | M0012 REV A | Initial Release | ### Physical Specification | Specicifcation | Value | |----------------------------|--------------------------------------------| | Weight | 12g | | Dimensions | 49 x 40mm | | Antenna Connector | ?? UFL-R-SMT-110 | | Recommend Antennas | | | USB2 Host Connectors | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | USB2 Host Mating Connector | JST GHR-04V-S | ### Power Consumption | M0048 Configuration | 5V Power Consumption (mA) | |------------------------------------------------------|---------------------------| | Baseline (USB Hub, Glue Logic, All LEDs ON) | 315 | | Baseline plus Qty-2 USB Peripherals at Max 500mA* | 1375 | | Baseline + Qty-2 DS USB* + Microhard 900MHz @ 10dBm | 2800 | | Baseline + Qty-2 DS USB* + Microhard 900MHz @ 30dBm | 3700 | | Baseline + Qty-2 DS USB* + Microhard 2400MHz @ 10dBm | 2500 | | Baseline + Qty-2 DS USB* + Microhard 2400MHz @ 30dBm | 3100 | *For each of the two downstream peripherals removed from the hub, subtract 500mA plus ~30mA logic from the power requirement. ### Inputs External 5VDC input required. Included in the kit is the 5V Stand Alone Dongle Cable, v1 [MCBL-00017](/cable-datasheets/#mcbl-00017). ## Pictures ### Assembled with Cabling ![mh-sa-assembled.png](/images/modems/microhard/mh-sa-assembled.png) ## Board Connections and I/O ### Top of Board ![ma-sa-top.png](/images/modems/microhard/mh-sa-2-top.png) ### Bottom of Board ![ma-sa-bottom.png](/images/modems/microhard/mh-sa-2-bottom.png) ### USB Connections You can connect up to two USB-clients to the `USB2 Host` ports on the top of the board. A [MCBL-00009](/cable-datasheets/#mcbl-00009) cable can be used, this is a 4-pin JST to USB Female Type A cable. You can connect the carrier board to a host computer using the USB port on the bottom of the baord. Connect to a host computer with the `MCBL-00010` stub cable, which is a 4-pin JST to microUSB female cable. ### LEDs | Index | LED | Description | |-------|-----------|----------------------------------------------------------------------------------------------------------| | 1 | `TX` | Flashes `GREEN` indicating wireless TX traffic | | 2 | `RX` | Flashes `GREEN` indicating wireless RX traffic | | 3 | `RSSI-3` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 4 | `RSSI-2` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 5 | `RSSI-1` | Flashes `GREEN` to indicate the Received Signal Strength on the wireless link | | 6 | `CPU` | Solid `GREEN`indicates power to module and normal operation, flashing indicates boot or FW upgrade status | | 7 | `LAN` | TODO | | 8 | `LAN/100` | TODO | | 9 | `LAN/ACT` | TODO | | 10 | `5V` | Illuminates solid `GREEN` indicating 5VDC USB bus power enabled | | 11 | `Port3` | Illuminates solid `GREEN` indicating Port 3 USB power enabled | | 12 | `Port4` | Illuminates solid `GREEN` indicating Port 4 USB power enabled | ### CFG Switch Can be used to reset all settings to default values required for a Slave module. ## Slave Configuration To reset all settings to the default values required for a Slave module, press and hold the `CFG Button`, once the `CPU LED` begins to flash, continue to hold for *5 seconds*, then release. The module will then reset all settings to the default values required for a Slave module ## Mechanical Drawings ### 2D Drawings ![M0012-Microhard.PNG](/images/modems/microhard/M0012-Microhard.PNG) ### 3D Drawings [M0048_MICROHARD_WITH_SOCKET_LAN7500.stp](https://storage.googleapis.com/modalai_public/modal_drawings/M0048_MICROHARD_WITH_SOCKET_LAN7500.stp) *Note: These 3D files contain all components on them. Some board configurations do not install "DNI" certain connectors or components. Please refer to the included diagrams and design schematics for more detailed information* --- Source: https://docs.modalai.com/dtc-modems/ # ModalAI DTC Modems Documentation for ModalAI's range of community supported DTC modems, this guide specifically covering the BluSDR-6. For support please email US.Technical.Support@domotactical.com or UK.Technical.Support@domotactical.com --- Source: https://docs.modalai.com/dtc-user-guide/ # DTC User Guide (Community Supported) ## Overview ***VOXL2 SDK 1.1.0 and Newer** VOXL and VOXL2 support the ability to quickly and easily add a DTC wireless connection to a Ground Control Station. The following guide provides you the necessary details to do so. Below are some helpful links from DTC: [DTC Products](https://www.dtccodan.com/products/) [BLUSDR-6 Datasheet](https://www.dtccodan.com/products/blusdr-6/) ![BluSDR-6 Modem](/images/modems/dtc/blusdr-6.png) As this is a community supported modem the ModalAI team cannot provide direct support. Instead please direct questions to US.Technical.Support@domotactical.com or UK.Technical.Support@domotactical.com ## Requirements ### Hardware The following ModalAI hardware is required to establish a DTC network connection between a VOXL-based product and a host device (computer, tablet, etc.). | Part Number | Description | Link | | --- | --- | --- | | MCCA-M0078 | VOXL USB Expansion Board v2 | EOL| | MCCA-M0041 | Power Module v3 | [Purchase](https://www.modalai.com/products/mdk-m0041-1?variant=31984449650739)| | M0006, M0019, or M0054 | VOXL, VOXL-Flight, or VOXL2 | Purchase links: [VOXL2](https://www.modalai.com/products/voxl-2?variant=39914779836467), VOXL-Flight, VOXL| ### Software In order for the required drivers to be available on target, the following software is required:
- [VOXL2 SDK Release 1.0.0 ](https://downloads.modalai.com) - [voxl-modem_0.17.0+](http://voxl-packages.modalai.com/dists/qrb5165/)
- [VOXL Platform Release 3.8.0-0.8+ ](https://downloads.modalai.com) - [voxl-modem_0.17.0+](http://voxl-packages.modalai.com/dists/apq8096/)
## Hardware Setup Below is a list of required hardware in order to create a connection between a VOXL-based device and a ground control station via. DTC BluSDR modems. | QTY | Part Number | Description | Notes | | --- | --- | --- | --- | | 1 | MCCA-M0078-2 | VOXL USB Expansion Board v2 | EOL| | 1 | MCCA-M0041-B | Power Module v3 | [Purchase](https://www.modalai.com/products/mdk-m0041-1?variant=31984449650739)| | 1 | M0006, M0019, or M0054 | VOXL, VOXL-Flight, or VOXL2 | Purchase links: [VOXL2](https://www.modalai.com/products/voxl-2?variant=39914779836467), VOXL-Flight, VOXL| | 1 | Ground station device | Computer, laptop, etc. | | 1 | Power source | Power supply for ground station modem | 5V Operating Voltage | | 1 | USB-C cable | USB-C to USB on specified port on ground station | USB-C, A, etc. | | 2 | BluSDR-6 Radio | DTC BluSDR-6 radio | [Description](https://www.dtccodan.com/products/the-blusdr-family/) | | 2 | DTC Antennas | Cables, antennas | ### VOXL Hardware Setup #### Using M0078 Compatable boards include the [USB Expansion Board with Fastboot v2](/usb-expander-and-debug-datasheet/) and the [USB Expansion Board V1](/usb-expander-and-debug-datasheet/). Other hats should work as well, as long as they don't have any other modems installed. ![dtc-voxl-setup](/images/modems/dtc/dtc-setup.png) ![voxl2-dtc](/images/modems/dtc/voxl2-dtc.jpg) Pictured above for your reference is a VOXL2 flight deck with a DTC BluSDR-6 radio connected. ***IMPORTANT! Before modifying hardware setup, ensure power is off or disconnected.*** - Attach `M0078` add-on board to `J3` of `VOXL2`. - Attach antennas to ports on BluSDR-6 radio. - Wire a `JST` accordingly to be able to plug from the `4-pin USB` on the `VOXL2 USB Expansion Board` to the `USB-2` port on the `DTC radio`. - Connect the `4-pin JST` on the VOXL2 to the `USB-2` port on the `DTC radio`. ***Note: You must connect to the USB-2 port on the DTC radio, and NOT the USB-1. The USB-1 port is used for host only, while the USB-2 is used for host/peripheral. The VOXL2 dtc connection must be peripheral, so USB-2 is required.*** - Attach `M0041` APM to VOXL2 and provide power - Provide power to the DTC radio. It must be powered through the power port shown above. - Plug in `USB-C cable` from desktop to VOXL2 in order to access `ADB` later on. ### Ground Station Hardware Setup ![dtc-station-setup](/images/modems/dtc/dtc-gcs.png) Pictured above for your reference is a ground station setup showing a DTC BluSDR-6 Radio and breakout board. ***IMPORTANT! Before modifying hardware setup, ensure power is off or disconnected.*** - Attach antennas to ports on DTC radio - Plug in ethernet to USB into USB-2 port on DTC radio - Plug in power cord into Power port on DTC radio and plug into outlet - Plug ethernet from ethernet to usb to your computer. If your computer does not have an ethernet port, you can use another ethernet to usb on your computer side. ## Software Setup ### Configure Radios - You will need to be on a Windows computer and download DTC's `Node Finder` software from [here](https://www.dtccodan.com/support/software-firmware/). - After downloading the Node Finder software, run it. - Hit the `reload` button until a radio shows up. > **Warning:** If no radio appears in Domo Node Finder, try disabling Windows Defender Firewall temporarily. Windows Firewall can block the UDP broadcast used by Node Finder to discover devices on the local network. ![domo-device-found](/images/modems/dtc/domo-node-finder-device-found.png) - As you can see, the IP address is `0.0.0.0`. This is because it is currently in DHCP mode. But you want it to have a static IP so you can access the configuration page. Right click on the radio, click `Configure Network`, and assign a static IP for the radio. ![domo-set-static-ip](/images/modems/dtc/domo-set-static-ip.png) - Set a static IP address for the host PC in the same subnet as what you set for the radio. As an example: ![host-pc-static-ip](/images/modems/dtc/host-pc-static-ip.png) - In a web browser, enter the IP you set for the radio on `Domo Node Finder`. A login screen should be brought up. Leave the username blank and enter "Eastwood" for the password. You should now be in the radio configuration screen. - On the left navbar, go to Presets -> Mesh Settings ![mesh-settings-navbar](/images/modems/dtc/mesh-settings-navbar.png) - `Mesh id` should be the same for all radios on the same mesh, so no need to change it. - `Node id` should be unique for each radio on a mesh network. By default is it set to 0. Set this radio's `Node id` to 1. - Check `Enable Transmitter`. Set the frequency, PA linearity, and channel bandwidth to what is desired. - Hit the save button to save the desired settings. ![mesh-settings](/images/modems/dtc/mesh-settings.png) - Once you are done, turn off the radio and swap it with the one you are going to use on the VOXL2 side. Temporarily wire the VOXL2 radio to your GCS computer so you can configure it. - Repeat the steps above for the VOXL2 radio, making sure to match the settings. Make sure the `Node ID` on the VOXL2 radio is different than the `Node ID` on the GCS radio. - Also make sure to make IP address of the second radio different than the first radio. - On the VOXL2 radio, make sure to go to `Global Setup`->`General Settings` and set `USB Mode` to `Peripheral`. If you fail to do this, the radio will NOT show up as a USB device when connected to the VOXL2 and will never be configured. ![usb-set-peripheral](/images/modems/dtc/usb-set-peripheral.png) - After you are done configuring the settings for both the VOXL2 and host computer radios, you can plug the VOXL2 radio back to the VOXL2 and then turn both radios on and look in "Domo Node Finder" to confirm both are found. You can also look in the configuration page to see if there are multiple nodes on the mesh. Look at the `Network Status` to see how many active nodes there are. ![network-status](/images/modems/dtc/network-status.png) ### VOXL2 Software Setup - adb onto VOXL2 ``` adb shell voxl2:/$ ``` - Run the following the begin modem setup: ``` voxl2:/$ voxl-configure-modem What type of modem are you using? If you are unsure of which modem you have, take a look at the following datasheets: v2 LTE Modem: https://docs.modalai.com/lte-modem-and-usb-add-on-v2-datasheet/ Microhard Modem: https://docs.modalai.com/microhard-add-on-datasheet/ 1) v2 2) microhard 3) dtc 4) doodle 5) quectel 6) em9191 ``` - Select `dtc` from the menu ``` #? 3 Enter the IP address you would like to the VOXL to use on the DTC network: Note: The chosen IP address must be of the form: 192.168.0.XXX Default - 192.168.0.100 1) default 2) custom ``` - Select the static IP you would like your VOXL2's `usb0` network interface to be set to, either choose default or another IP on the `192.168` subnet ``` #? 1 Making new interface file /etc/network/interfaces qrb5165 based device detected reloading systemd services enabling voxl-modem systemd service starting voxl-modem systemd service DONE configuring voxl-modem ``` - The VOXL2 will now enable the `voxl-modem` service in order to enable the bluSDR radio connection and set the static IP on bootup - Verify that the `usb0` network interface has enumerated and that the IP has been set correctly: ``` voxl2:/$ ifconfig usb0 usb0: flags=4163 mtu 1500 inet 192.168.0.100 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::4150:d5f3:7861:747a prefixlen 64 scopeid 0x20 ether 0a:a6:a8:f6:48:69 txqueuelen 1000 (Ethernet) RX packets 312 bytes 18106 (18.1 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 725 bytes 65407 (65.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` ### Ground Station Software Setup - As already shown above, you have set the Ground Station static IP address. In this case, the IP address of the host PC was set to `192.168.0.150` ## Connecting to QGroundControl Now that both the VOXL side and ground station side software have been setup you should be able to ping one device from the other. For example, one can ping the host computer radio by doing the following (assuming the DTC radio on the host computer has the IP address of 192.168.0.128): ``` voxl2:/$ ping 192.168.0.128 PING 192.168.0.128 (192.168.0.128): 56 data bytes 64 bytes from 192.168.0.128: icmp_seq=0 ttl=64 time=48.223 ms 64 bytes from 192.168.0.128: icmp_seq=1 ttl=64 time=66.942 ms 64 bytes from 192.168.0.128: icmp_seq=2 ttl=64 time=63.329 ms 64 bytes from 192.168.0.128: icmp_seq=3 ttl=64 time=54.784 ms 64 bytes from 192.168.0.128: icmp_seq=4 ttl=64 time=43.811 ms ``` Or one could ping the VOXL2 from the host computer by pinging the VOXL2 IP from command prompt: ``` C:\Users\john>ping 192.168.0.100 Pinging 192.168.0.100 with 32 bytes of data: Reply from 192.168.0.100: bytes=32 time=29ms TTL=64 Reply from 192.168.0.100: bytes=32 time=52ms TTL=64 Reply from 192.168.0.100: bytes=32 time=44ms TTL=64 Reply from 192.168.0.100: bytes=32 time=43ms TTL=64 Ping statistics for 192.168.0.100: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 29ms, Maximum = 52ms, Average = 42ms ``` > You may have difficulties pinging the host computer itself from the VOXL2. But if you can still ping the host computer radio IP from the VOXL2 and the VOXL2 IP from the host computer, you are good. Since we are able to get packets from drone to ground station we can now connect our VOXL2 / drone to QGroundControl. The VOXL system uses the `voxl-mavlink-server` service on VOXL to establish a connection between PX4 and QGroundControl over UDP. This is supported on VOXL2, VOXL Flight or when using Flight Core with VOXL. If you have not yet setup `voxl-mavlink-server` on your VOXL, do the following: ```bash # On Host PC $ adb shell # On VOXL voxl-configure-sku -w voxl-configure-mpa ``` ## Trouble Shoot If you do not see the IP address change for USB0 then you should enter the following command: `voxl-configure-modem dtc`. This will reset the config file for the VOXL2 to include the flag for dtc addresses. Then run ifconfig USB0 again to see if the IP address for USB0 is set to the default IP address. --- Source: https://docs.modalai.com/dtc-starling/ # DTC Starling Integration (Community Supported) ## Overview This page will cover how to add and mount a DTC Radio onto the Starling. Below are some helpful links from DTC: [DTC Products](https://www.dtccodan.com/products/) [BLUSDR-6 Datasheet](https://www.dtccodan.com/products/blusdr-6/) ![Starling with DTC Radio](/images/modems/dtc/starling/Starling_DTC.jpg) As this is a community supported modem the ModalAI team cannot provide direct support. Instead please direct questions to US.Technical.Support@domotactical.com or UK.Technical.Support@domotactical.com For Setting up the DTC Radio with the VOXL2,refer to the DTC User Guide Page located [here](/dtc-user-guide/). ## Requirements ### Hardware The following ModalAI hardware is required to establish a DTC network connection between a VOXL-based product and a host device (computer, tablet, etc.). | Part Number | Description | Link | | --- | --- | --- | | MCCA-M0078 | VOXL USB Expansion Board v2 | EOL| | MRB-D0005-4-V2-C6-M22 | Starling V2 Drone (with Battery) | [Purchase](https://www.modalai.com/products/starling-2-max)| ## 3D Drawings *** Below are links to the individual STEP and STL files for download. the links will take you to the Google Drive file location *** * [Center Starling Mount STEP](https://drive.google.com/file/d/1nTcc4Su2a_iHPXDoPejo0Pu-4MIFROIf/view?usp=drive_link) * [DTC Mount Holder STEP](https://drive.google.com/file/d/1H0_R1si7VENLEx27wqusICMNjiBGJZ3H/view?usp=drive_link) * [Starling Center Mount STL](https://drive.google.com/file/d/1ZsdAWo-RgR-9b9NSQijjkxLt06AiTwA7/view?usp=drive_link) * [DTC Mount Holder STL](https://drive.google.com/file/d/1kDzLV84nuVNhwLBOk-3_3nwQV1Ferb3f/view?usp=drive_link) ## Hardware Setup ***Please Note: the Li-Ion battery, recommended for the Starling is rated to handle ONLY the Starling. We recommend getting a separate 2 Cell or 3 Cell battery with a higher mAh when using the Starling with the DTC radio for long flights.*** ### Starling Side 1. Disconnect the GPS Tower from the Starlings VOXL2. 2. To remove the GPS Tower from the Starling, unscrew the four center screws on the bottom of the Starling. 3. Next Unfasten the USB Hat from the Starling (Hold the standoffs under the VOXL2 to prevent twisting while unscrewing). 4. Remove the USB Hat from the VOXL2 along with the wifi dongle attached. 5. Socket the USB Expansion Board V2 onto the VOXL2 J3. 6. Fasten the USB Expansion Board V2 down. 7. Attach the DTC Mount by lining up the holes on the center mount with the Starling holes. (Image below) ![Starling Center Mount Holes](/images/modems/dtc/starling/Center_Mount_Hole.jpg) 8. Lastly, fasten down the DTC Mount with M2 screws and M2 nut. (Optional) You can reattach the GPS Tower by placing it further back and reconnect it to the VOXL2. ![Starling with Mount](/images/modems/dtc/starling/Starling_mount.jpg) ### Powering DTC Radio We will need a method to power both the DTC Radio and the Starling, The simplest way to accomplish this is to send power from the battery to both the Power module and the DTC Radio. #### Required Components - 2 Pin Female Rectangular Molex Connector - XT30 Male Connector - XT30 Female Connector - Wires - Wire Cutters - Wire Stripper #### Instructions 1. Solder on the wires to the the XT30 Male connector taking note of the positive and negative wires. 2. Split the wire coming from the XT30 Male Connector. 3. On the first end of the split wire solder on the XT30 Female Connector. 4. On the second end of the split wire solder on the Female Molex Connector. ![Power Splitter](/images/modems/dtc/starling/Long_Splitter.jpg) *** Note: Since the DTC Radio requires between 16 and 6V to operate we have to use the power from the battery and not splice off the power going into the VOXL2. Secondly since all the ESC pads are being used for the motors there isn't an easier method of getting the required voltage other than from the battery. *** ### DTC Radio *** Please be sure that the DTC Radio is configured properly as a peripheral before mounting it onto the Starling. *** 1. Connect the Antennas to the DTC radio. 2. Place the DTC Radio in the Mount holder and make sure the holes line up. 3. Next Wrap the Antennas over the top of the Radio crossing one another to reach the sides of the DTC mount. ![DTC in Mount](/images/modems/dtc/starling/DTC_mount.jpg) 4. Point the 3M VHB Pads toward the DTC Radio. 5. Attach the Antennas to the sides, either by the VHB pads or using Velcro, or tape. ### Connecting it All Together 1. Connect the DTC Mount to the DTC Mount Holder 2. Fasten down using 4 x M2 Screws 3. Plug in the Power splitter to the Power Module for the Starling. ![Connect Power Splitter](/images/modems/dtc/starling/power_splitter_to_module.jpg) 4. Connect the Power splitter's Molex end to the Molex connector on the the DTC's Power cable. 5. Connect the 5-pin jst of the communications cable to the USB2 port on the DTC Radio 6. Connect the 4-pin jst of the Communications cable to the USB port on the USB2 HAT for the VOXL2 ![Final Results](/images/modems/dtc/starling/Starling_DTC.jpg) 7. Lastly, connect the battery to the Power splitter and the VOXL2 and DTC radio will now be Powered Check the other DTC Radio to ensure that the mesh shows that two nodes are appearing on the network. --- Source: https://docs.modalai.com/expansion-boards/ # Expansion Boards Documentation for ModalAI's range of expansion boards for VOXL and VOXL 2 products. --- Source: https://docs.modalai.com/m0017/ This component is EOL, please see its replacement [M0151](/m0151/) # USB Expander and Debug Add-On Board User Guide ## Summary The VOXL USB Expander and Debug Add-On board provides: - Ability to connect an additional USB2 peripheral device to VOXL - A debug console for low level system debugging - A switch that will force VOXL to boot into `fastboot` mode (for reflashing the [System Image](/flash-system-image/) if the unit is bricked in the field) - A switch that will force VOXL to boot into `emergency boot` mode (used at the factory only) - NOTE: newer versions of the board don't have this switch populated ## Board Connections ![voxl-usb-expander-and-debug.png](/images/other-products/hdmi-usb-accessories/voxl-usb-expander-and-debug-2.png) ## Specification | Specicifcation | Value | | --- | --- | | Weight | 5g | | Debug Console Connector | Micro USB, Female | | Debug Console Mating Connector | Micro USB, Male | | USB2 Host Connector | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | USB2 Host Mating Connector | JST GHR-04V-S | | J1 Connector | Samtec Inc, MPN: QTH-030-01-F-D-K | | J1 Mating Connector | Samtec Inc., MPN: QSH-030-01-L-D-A-K | ## USB2 Host Pinout Pin 1 is marked in the `Board Connections` graphic above. | Pin | Value | | --- | --- | | 1 | VBUS | | 2 | USB_M | | 3 | USB_P | | 4 | GND | ## Connecting to VOXL To connect the USB Expander and Debug Add-On board to VOXL: - Attach the daughter board's `J1` connector to VOXL's `J13` connector ![voxl-usb-expander-and-debug-connected.png](/images/other-products/hdmi-usb-accessories/voxl-usb-expander-and-debug-connected.png) ## Connecting a USB2 Peripheral A USB2 peripheral can be connected via a `JST GHR-04V-S` connector following the pinouts specified in the [datasheet](/usb-expander-and-debug-datasheet/). To validate the connection: - Power off the VOXL - Attach the USB Expander and Debug Add-On board - Ensure the `FASTBOOT` labeled switch is set to **off** - Ensure the `EMERG BOOT` labeled switch is set to **off** - NOTE: if your board is missing the `EMERG BOOT` switch, this is OK as its default un-populated state is OFF - Attach the USB2 peripheral - Power on the VOXL - Connect a Micro USB cable to VOXL's USB port and connect to a Linux PC Open the terminal in the Linux PC and run the following: ```bash adb shell ``` Now you're inside VOXL, run the following, where in this use case we've attached a Flight Core board to the USB2 Host connector (showing up as the `STMicroelectronics` MCU): ```bash / # lsusb ... Bus 001 Device 003: ID 0483:a32f STMicroelectronics ... ``` ## Forcing the VOXL into Fastboot to Unbrick Follow the unbrick procedure found at [docs.modalai.com/unbrick-voxl](/unbrick-voxl) ## Using the Debug Console You'll need two MicroUSB cables for this procedure. - Power off the VOXL - Attach the USB Expander and Debug Add-On board - Ensure the `FASTBOOT` labeled switch is set to **off** - Ensure the `EMERG BOOT` labeled switch is set to **off** - Connect a Micro USB cable to VOXL's USB port and connect to a Linux PC - Connect a second Micro USB cable to the Add-On board's Micro USB port and connect to a Linux PC. It may display as `FT232R USB UART` and will exist as `/dev/ttyUSB0` - Power on the VOXL Open `Terminal A` in the Linux PC and run the following command (if `screen` isn't installed, first run `apt install screen`): ```bash screen /dev/ttyUSB0 115200 [HIT ENTER] ``` Open `Terminal B` in the Linux PC and run the following commands: ```bash adb shell reboot ``` You should now see debug information in `Terminal A`: ```bash [10] Opening SSR Glink Port success [20] Glink Connection between APPS and RPM established [20] Glink Connection between APPS and RPM established [40] UFS init success [80] pm8x41_get_is_cold_boot: cold boot [90] Unable to locate /bootselect partition [90] Loading (boot) image (57376768): start [300] Loading (boot) image (57376768): done [310] use_signed_kernel=1, is_unlocked=1, is_tampered=0. [310] decompressing kernel image: start [630] decompressing kernel image: done [640] Best match DTB tags 291/00000008/0x00000003/30001/20009/10013/0/0/940319e2/51297 [650] Using pmic info 0x20009/0x10013/0x0/0x0 for device 0x20009/0x10113/0x0/0x0 [650] cmdline: noinitrd rw console=ttyHSL0,115200,n8 androidboot.hardware=qcom ehci-hcd.park=3 msm_rtb.filter=0x37 lpm_levels.sleep_disabled=0 rootwait net.ifnames=0 androidboot.bootdevice=624000.ufshc androidboot.serialno=a0259b4a androidboot.baseband=apq root[670] Updating device tree: start [680] Updating device tree: done [680] RPM GLINK UnInit [690] booting linux @ 0x80080000, ramdisk @ 0x82200000 (0), tags/device tree @ 0x82000000 [690] Jumping to kernel via monitor ``` ## Forcing the VOXL into Emergency Boot This is typically done at the factory and not in the field by a normal user. To force the VOXL to boot into `emergency boot` mode: - Power off the VOXL - Attach the USB Expander and Debug Add-On board - Ensure the `FASTBOOT` labeled switch is set to **off** - Ensure the `EMERG BOOT` labeled switch is set to **on** - Attach - Power on the VOXL The device will show up on a Linux PC as `Qualcomm, Inc. Gobi Wireless Modem`: ```bash / lsusb ... Bus 001 Device 015: ID 05c6:9008 Qualcomm, Inc. Gobi Wireless Modem (QDL mode) ... ``` --- Source: https://docs.modalai.com/m0078/ This component is EOL, please see its replacement [M0151](/m0151/) # USB2 Expansion Board with Fastboot V2 Datasheet ## Overview The USB Expansion Board with Fastboot v2 is used to add a USB 2.0 port to VOXL/VOXL2 and provides a Fastboot button for forcing devices into Fastboot mode when needed. ![m0078-hero](/images/other-products/voxl-usb-add-on-v2/m0078-hero.png) ### Dimensions #### 3D Drawings [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0078-2_FINAL.step) ![M0078 3D view](/images/other-products/voxl-usb-add-on-v2/m0078-2-iso-view.png) #### 2D Drawings ![M0078 dimensions](/images/other-products/voxl-usb-add-on-v2/m0078-dimensions.png) ### Features | Feature | Details | |-:------------|-:--------------------------| | Weight | TODO | | USB 2.0 port | QTY1 (500mA or 5.0A power) | ### Revisions | PN | Information | |----------------|--------------------------------------------------------------| | MDK-M0078-2-01 | Standard version, no EDL switch (S2), no serial console (J5) | | MDK-M0078-1-01 | Install S2, install FTDI IC and J5 | ### Schematic [M0078 Schematic](https://storage.googleapis.com/modalai_public/modal_schematics/M0078_A_SCHEMATIC.pdf) ## Connector Callouts ![m0078-callouts](/images/other-products/voxl-usb-add-on-v2/m0078-callouts.png) ### J2 - USB 5V Power Source Select | Connector | MPN | | --- | --- | | Board Connector | TSM-103-02-X-SH | | Pin # | Signal Name | |--- |--- | | 1 | 5P0V_LOCAL (2A) | | 2 | Connects to J3 pin 1 | | 3 | 5V_VBUS (500mA) | ![m0078-user-power-options](/images/other-products/voxl-usb-add-on-v2/m0078-user-power-options-3.png) ### J3 - USB 2.0 | Connector | MPN | | --- | --- | | Board Connector | BM04B-GHS-TBT(LF)(SN)(N) | | Pin # | Signal Name | |--- |--- | | 1 | 5P0V | | 2 | USB_M | | 3 | USB_P | | 4 | GND | ### J5 - NOT INSTALLED NOT INSTALLED | Connector | MPN | | --- | --- | | Board Connector | BM04B-SRSS-TB(LF)(SN) | | Pin # | Signal Name | |--- |--- | | 1 | 3P3V | | 2 | RX_3P3V | | 3 | TX_3P3V | | 4 | GND |
### J1 - VOXL/VOXL2 Board To Board Connector See host board datasheet for mating connector pinout.
### S1 - Fastboot Button Momentary push button for Fastboot. Press and hold while booting up device, then let go after the device powers on, to enter fastboot. ### S2 - NOT INSTALLED NOT INSTALLED
--- Source: https://docs.modalai.com/usb2-type-a-breakout-add-on/ # USB2 Type A Breakout (M0141) ## Overview The M0141 USB2 Type A Breakout board provides: - a USB2 Type A Female connection - an apps proc UART, I2C and GPIOs (VOXL 2 Only) - momentary fastboot switch ![m0141-top](/images/other-products/m0141/m0141-top.jpg) ![m0141-bottom](/images/other-products/m0141/m0141-bottom.jpg) ## Mechanical Drawing and Spec [Download STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0141%20USB2%20Type%20A%20Breakout.step) | Feature | Details | |--------------|----------------------------| | Weight | 6.3g | ## Revisions | PN | Information | |----------------|--------------------------------------------------------------| | MDK-M0141-1-00 | TODO | ## Schematic [Download Schematic](https://storage.googleapis.com/modalai_public/modal_schematics/M0141_Schematic_REVA.pdf) ## Connector Callouts ![m0141-callouts](/images/other-products/m0141/m0141-callouts-1.jpg) ### J2 - USB2 - Board Connector - `` - Mating Connector - `` | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5P0V | | | 2 | USB_N | | | 3 | USB_P | | | 4 | GND | | ### J5 - UART/I2C/GPIO Supported on VOXL 2 only. - Board Connector - `SM12B-GHS-TB(LF)(SN)` - Mating Connector - `GHR-12V-S` Signals are 3P3V, see [Linux User Guide](/voxl2-linux-user-guide/) for details on interfaces. | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 3P3V | | | 2 | GPIO_52 (in) | alt SPI17 MISO | | 3 | GPIO_53 (out) | alt SPI17 MOSI | | 4 | GPIO_54 (out) | alt SPI17 SCLK | | 5 | GPIO_55 (out) | alt SPI17 CS_N | | 6 | GPIO_32 (in/out) | | | 7 | GPIO_33 (in/out) | | | 8 | I2C9_SDA | `/dev/i2c-1` | | 9 | I2C9_SCL | `/dev/i2c-1` | | 10 | UART7_TX | `/dev/ttyHS1` | | 11 | UART7_RX | `/dev/ttyHS1` | | 12 | GND | | ### SW1 Force Fastboot momentary button. --- Source: https://docs.modalai.com/voxl2-io/ # VOXL 2 IO > Starting in VOXL SDK 1.1.1, VOXL 2 IO is being updated as follows: - new bootloader based on same bootloader as VOXL ESC (requires in field update, or request replacement by sending in existing hardware) - new firmware based on same firmware as VOXL ESC - new `voxl-px4` driver `voxl2-io` - for upgrade instructions, see the [firmware guide](/voxl2-io-firmware/) VOXL 2 IO is meant to be paired with VOXL 2 and adds PWM output along with an S.Bus radio connection. Spektrum receivers connect directly to VOXL 2 instead, not through VOXL 2 IO. It communicates over UART to VOXL 2 running PX4. > VOXL 2 IO also works with [VOXL 2 Mini](/voxl2-mini/) by connecting the IO board's J4 host UART to one of the UARTs on the VOXL 2 Mini J19 connector. The VOXL 2 Mini exposes only three UARTs on J19 (ESC, RC, and GNSS), so one of them has to be given up. The PWM outputs are mainly intended for vehicles that use PWM ESCs instead of a ModalAI UART ESC; in that case connect VOXL 2 IO to the ESC UART. To use VOXL 2 IO together with a ModalAI UART ESC, choose between the RC UART and the GNSS UART. For documentation on the legacy PX4IO/VOXL SDK 1.1.0 and older usage, see [here](/voxl2-io-legacy-guide/) ![VOXL 2 IO board](/images/voxl2-io/M0065-hero.png) --- Source: https://docs.modalai.com/voxl2-io-datasheet/ # VOXL 2 IO Datasheet ## Important Update Starting in VOXL SDK 1.1.1, the VOXL 2 IO system is being updated, with changes including: - a new bootloader based on same bootloader as VOXL ESC - a new firmware based on same firmware as VOXL ESC - a new `voxl-px4` driver `voxl2-io` to support new firmware Existing VOXL 2 IO may be updated but requires a bootloader update over the debug header. This can be done in the field, or contact ModalAI to arrange a swap out if needed. For updating the legacy firmware, please see the [firmware guide](/voxl2-io-firmware/). ## Development Kits | PN | Description | |--- |--- | | MDK-M0065-1-00 | VOXL 2 IO board only | | MDK-M0065-1-01 | VOXL 2 IO board, VOXL2 to VOXL2 IO UART Cable (MCBL-00061), S.Bus and Spektrum RC cables (MCBL-00064 and MCBL-00005). See the J3 connector section for the other compatible S.Bus cables. | | MDK-M0065-1-02 | Same as MDK-M0065-1-01, plus PWM breakout Board and Cable (MCCA-M0022, MCBL-00004) | ## VOXL SDK Support ### SDK 1.1.1 - SDK 1.1.1 - supported by these documents ### SDK 1.1.0 and older See [legacy user guide](/voxl2-io-legacy-guide/) ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0065_PX4IO_PWM_REVA.step) ### 2D Drawings 25mm x 33mm x 7.2mm ![M0065 2D dimensions](/images/voxl2-io/m0065-2d.png) ## Features | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | 4 g | | MCU | 72MHz, 32-bit ARM M3 [STM32F103C8T6](https://www.st.com/en/microcontrollers-microprocessors/stm32f103c8.html) | | Memory | 20Kb RAM | | | 64KB Flash | | Firmware | VOXL 2 IO | | Inputs | S.Bus | | Outputs | 3 LEDs (1xRGB) | | | 8 PWM Channels (400 Hz PWM, 800 Hz OneShot125) | > Spektrum receivers connect directly to VOXL 2 (`spektrum_rc` driver) on current firmware, not through VOXL 2 IO. The legacy PX4IO firmware supported Spektrum input; see the [legacy user guide](/voxl2-io-legacy-guide/). > VOXL 2 IO has no ESC telemetry or battery sense input. Battery voltage and current reach PX4 from the power module's I2C monitors on VOXL 2 `J4` (the `voxlpm` driver), independent of the ESC. See [VOXL 2 Power](/voxl2-power/) and the [Power Module v3 datasheet](/power-module-v3-datasheet/). [Top](#table-of-contents) ## Block Diagram ![m0065-block-diagram.png](/images/voxl2-io/m0065-block-diagram.png) *Figure 1* ## Connector Callouts Hover a connector to identify it — click to jump to its pinout.
### Summary | Connector | Description | | --- | --- | | J1 | PWM Output | | J2 | USART1 (future additional RC Input) | | J3 | S.BUS RC input (USART3) | | J4 | Host UART and power | | J5 | Debug/Programming Header |
### J1 - PWM Output | Connector | MPN | | --- | --- | | Board Connector | BM10B-GHS-TBT(LF)(SN)(N) | | Mating Connector | GHR-10V-S | | Cable | [MCBL-00004](/cable-datasheets/#mcbl-00004) - PWM Output Cable, [Buy](https://www.modalai.com/products/mcbl-00004) | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | 5P0V_BOOST | Low-power reference/monitor voltage only, do not power servos or ESCs from this pin. Default on, no control unless R10 stuffed | | 2 | IOPWM_OUT_CH1 | | | 3 | IOPWM_OUT_CH2 | | | 4 | IOPWM_OUT_CH3 | | | 5 | IOPWM_OUT_CH4 | | | 6 | IOPWM_OUT_CH5 | | | 7 | IOPWM_OUT_CH6 | | | 8 | IOPWM_OUT_CH7 | | | 9 | IOPWM_OUT_CH8 | | | 10 | GND | |
### J2 - USART1 (future additional RC Input) **Future use**. Not supported in VOXL SDK 1.1.1 (use main RC input on VOXL 2 / VOXL 2 Mini) | Connector | MPN | | --- | --- | | Board Connector | BM04B-GHS-TBT(LF)(SN)(N) | | Mating Connector | GHR-04V-S | Color: Yellow | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | 3P3V_IO | Controllable | | 2 | USART1_TX | 3P3V | | 3 | USART1_RX | 3P3V | | 4 | GND | |
### J3 - S.BUS RC Connection | Connector | MPN | | --- | --- | | Board Connector | BM04B-GHS-TBT(LF)(SN)(N) | | Mating Connector | GHR-04V-S | | Cables | [MCBL-00064](/cable-datasheets/#mcbl-00064) - S.Bus, (eg. Graupner GR-16), Dupont Style, [Buy](https://www.modalai.com/products/mcbl-00064) | | | [MCBL-00065](/cable-datasheets/#mcbl-00065) - S.Bus, (e.g FrSky R-XSR), picoblade, EOL | | | [MCBL-00021](/cable-datasheets/#mcbl-00021) - S.Bus, (e.g FrSky R-XSR) | Color: Black | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | 5P0V_BOOST | Low-power reference/monitor voltage only, do not power servos or ESCs from this pin. Default on, no control unless R10 stuffed | | 2 | SBUS_OUTPUT_INV | 3P3V, Tx, USART3 | | 3 | SBUS_INPUT_INV | 3P3V, Rx, USART3 | | 4 | GND | |
### J4 - Host UART Input Connector | Connector | MPN | | --- | --- | | Board Connector | BM04B-GHS-TBT(LF)(SN)(N) | | Mating Connector | GHR-04V-S | | Cable | [MCBL-00015](/cable-datasheets/#mcbl-00015) - 4pin-JST-GH-to-4pin-JST-GH cable, [Buy](https://www.modalai.com/products/mcbl-00015) | Color: White | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | 3P3V_IO | Main voltage input from host | | 2 | RX from host | | | 3 | TX to host | | | 4 | GND | |
### J5 - Debug/Programming Header | Connector | MPN | | --- | --- | | Board Connector | BM08B-SRSS-TBT(LF)(SN) | | Mating Connector | SHR-08V-S | | Pin # | Signal Name | Usage / Notes | | --- | --- | --- | | 1 | 3P3V_IO | Jlink, STLink, etc | | 2 | UART_2W_DEBUG_TX | nsh | | 3 | UART_2W_DEBUG_RX | nsh | | 4 | IOMCU_SWDIO | Jlink, STLink, etc | | 5 | IOMCU_SWCLK | Jlink, STLink, etc | | 6 | GND | | | 7 | PROG_RESET_N | Jlink, STLink, etc | | 8 | VPP_STM | STM BOOT0 | --- Source: https://docs.modalai.com/voxl2-io-user-guide/ # VOXL 2 IO User Guide ![VOXL 2 IO board](/images/voxl2-io/user-guide/M0065-hero.png) ## Summary ### VOXL SDK Support - See the [voxl2-io firmware changelog](/voxl2-io-firmware/#release-notes) for details - Note: this documentation requires VOXL SDK 1.1.1 or newer (recommend SDK 1.3.0+). For documentation on the legacy PX4IO/VOXL SDK 1.1.0 and older usage, see [here](/voxl2-io-legacy-guide/) ### Important Update Starting in VOXL SDK 1.1.1, the VOXL 2 IO system is being updated, with changes including: - a new bootloader based on same bootloader as VOXL ESC - a new firmware based on same firmware as VOXL ESC - a new `voxl-px4` driver `voxl2-io` to support new firmware Existing VOXL 2 IO may be updated but requires a bootloader update over the debug header. This can be done in the field, or contact ModalAI to arrange a swap out if needed. For updating the legacy firmware, please see the [firmware guide](/voxl2-io-firmware/). ## System Overview In general, VOXL 2 IO provides PWM outputs along with additional RC inputs for the VOXL 2 / VOXL 2 Mini ecosystem. ### Block Diagram ![VOXL 2 IO system block diagram](/images/voxl2-io/user-guide/M0065-system.jpg) ### Components The following components describe the VOXL 2 IO system: - VOXL 2 IO Hardware (M0065) - voxl2-io firmware - application running on hardware that communicates with voxl-px4 - voxl2-io bootloader - used for firmware updates over UART - Hardware connection for power and 2-wire UART - VOXL 2 (M0054) or VOXL 2 Mini (M0104) - VOXL SDK 1.1.1 or newer - voxl-px4 package - voxl2-io PX4 driver that communicates with VOXL 2 IO application - Command line tools for VOXL 2 IO (e.g. FW update) ## Wiring Guides > Connector colors may vary due to supply chain variations. ### Host Connection
Using the default DSP UART QUP2 on J18: ![VOXL 2 J18 to VOXL 2 IO connection](/images/voxl2-io/user-guide/M0054-J18-M0065.jpg) | | | |-----------|-----------| | Connectors | VOXL 2 `J18` to VOXL 2 IO `J4` | | Cable | [MCBL-00015](/cable-datasheets/#mcbl-00015) - 4pin-JST-GH-to-4pin-JST-GH cable, [Buy](https://www.modalai.com/products/mcbl-00015) | | PX4 Config (`/etc/modalai/voxl-px4.conf`) | `ESC`=`VOXL2_IO_PWM_ESC` | | PX4 Config (SBUS RC, Ghost) | `RC`=`M0065_SBUS` | | PX4 Config (EXTERNAL/NO RC) | `RC`=`{SPEKTRUM, GHST, CRSF_MAV, CRSF_RAW, EXTERNAL, or FAKE_RC_INPUT}` | > the UART on J19 pins 10/11 may be used (QUP7) instead if required. Note PX4 configuration is required.
Using the default DSP UART QUP2 on J19 pins 7/8: ![VOXL 2 Mini J19 to VOXL 2 IO connection](/images/voxl2-io/user-guide/M0104-J19-M0065.jpg) | | | |----------- |-----------| | Connectors | VOXL 2 `J19` to VOXL 2 IO `J4` | | Cable | [MCBL-00061](/cable-datasheets/#mcbl-00061) - 4-pin JST-GH UART cable, `J19` to VOXL 2 IO `J4` | | PX4 Config (`/etc/modalai/voxl-px4.conf`) | `ESC`=`VOXL2_IO_PWM_ESC` | | PX4 Config (SBUS RC, Ghost) | `RC`=`M0065_SBUS` | | PX4 Config (EXTERNAL/NO RC) | `RC`=`{SPEKTRUM, GHST, CRSF_MAV, CRSF_RAW, EXTERNAL, or FAKE_RC_INPUT}` | > The alternate UART on J19 pins 10/11 (QUP7) is only used by the RC-only fallback configuration, which starts the voxl2_io driver on port 7. For the PWM ESC use case there is currently no supported configuration mechanism to move the driver off its default port (QUP2).
### RC Connections #### SBUS RC ##### FrSky R-XSR ![S.Bus receiver (R-XSR) wired to VOXL 2 IO](/images/voxl2-io/user-guide/M0065-rc-sbus-r-xsr.jpg) | | | |----------- |-----------| | Connectors | VOXL 2 IO `J3` to R-XSR | | Cable | [MCBL-00065](/cable-datasheets/#mcbl-00065) | ##### Graupner GR-16 ![S.Bus receiver (GR-16) wired to VOXL 2 IO](/images/voxl2-io/user-guide/M0065-rc-sbus-gr-16.jpg) | | | |----------- |-----------| | Connectors | VOXL 2 IO `J3` to GR-16 | | Cable | [MCBL-00064](/cable-datasheets/#mcbl-00064) | ### PWM Out Connection ![PWM output connection on VOXL 2 IO](/images/voxl2-io/user-guide/M0065-pwm.jpg) | | | |----------- |-----------| | Connectors | VOXL 2 IO `J1` to [M0022](https://modalai.com/collections/accessories/products/flight-core-pwm-output-cable-and-break-out-board) PWM Breakout Board | | Cable | [MCBL-00004](/cable-datasheets/#mcbl-00004) | ## LED Patterns ![VOXL 2 IO LED locations](/images/voxl2-io/user-guide/M0065-leds.png) ### SDK 1.3.0+ **BLUE** | State | Description | |-------|-------------| | 10Hz | Bootloader mode, ~1 second duration after power cycle | | 1 Hz | Two (2) 500ms blinks to indicate valid FW | | Off | Idle, no PX4 activity/packets | | 5Hz | PX4 activity/packets | **Orange** | State | Description | |-------|-------------| | Off | Idle, no RC packets | | Blinking | Receiving RC packets | **Green** | State | Description | |-------|-------------| | Off | No power | | On | Power | ## VOXL PX4 Configuration See the [voxl2-io firmware changelog](/voxl2-io-firmware/#release-notes) for details on changes.
**Actuator Setup using QGC** > 'Rev Range (for servos)` is not supported The **Actuators** tab in QGroundControl will display a **VOXL 2 IO** tab that can be used to configure and test the outputs. ![QGroundControl actuator configuration](/images/voxl2-io/user-guide/M0065-qgc-actuator-v2.jpg) **PX4 Parameters** | Name | Description | Default | Units | |----------------------|------------------------------------------|---------|-----------| | `VOXL2_IO_BAUD` | Baud Rate
**Reboot Required** | 921600 | bits/sec | | `VOXL2_IO_CMAX` | Max PWM value used during calibration | 2000 | us | | `VOXL2_IO_CMIN` | Min PWM value used during calibration | 1050 | us | | `VOXL2_IO_DIS ` | When disarmed, use this PWM value | 1000 | us | | `VOXL2_IO_FUNC1` | PWM CH1 Function | 101 | enum | | `VOXL2_IO_FUNC2` | PWM CH2 Function | 102 | enum | | `VOXL2_IO_FUNC3` | PWM CH3 Function | 103 | enum | | `VOXL2_IO_FUNC4` | PWM CH4 Function | 104 | enum | | `VOXL2_IO_FUNC5` | PWM CH5 Function | 0 | enum | | `VOXL2_IO_FUNC6` | PWM CH6 Function | 0 | enum | | `VOXL2_IO_FUNC7` | PWM CH7 Function | 0 | enum | | `VOXL2_IO_FUNC8` | PWM CH8 Function | 0 | enum | | `VOXL2_IO_MAX` | Max PWM value used when armed | 2000 | us | | `VOXL2_IO_MIN` | Min PWM value used when armed | 1100 | us | **How to Perform ESC Calibration** **REMOVE ALL PROPS, MOTORS MAY SPIN DURING CALIBRATION** - power on VOXL2 and ESC while the PWM cable is not plugged into VOXL2. Calibration procedure only works before the ESC receives any valid signals - start px4 and QGC and verify that the calibration parameters are set to suggested values (min 1050 and max 2000) and regular min and max values are set to min=1100 and max=2000. - verify that the voxl2_io driver has started correctly : either qshell voxl2_io status or look at the blue led on M0065 should be blinking which means it is receiving the pwm commands from voxl2_io driver (the disabled commands, since not armed) - start the custom esc calibration procedure : “qshell voxl2_io calibrate_escs” and follow instructions (which are mainly just plug in the motor pwm cable into m0065 within 10 seconds) - after the calibration is complete, test to make sure the PWM ranges have been correctly set: - using QGC actuator test, set the actuator from disabled to 1100 and the motors should spinup and stay on (no jerking) - it is encouraged to double check the motor starting point but temporarily lowering the VOXL2_IO_MIN param to 1000 and using actuator test to find the motor starting point, should be around 1060 (the calibration value was 1050). If the motor starting point is very close to 1100, it may not be safe to use this configuration, because if mixer commands 1100 during flight, variations due to temperature of the ESC MCU could cause 1100 command to be interpreted as DISABLED. - IMPORTANT: if VOXL2_IO_MIN was temporarily modified to find the motor starting point, revert it back to the desired value of 1100
**Actuator Setup using QGC** > 'Rev Range (for servos)` is not supported The **Actuators** tab in QGroundControl will display a **VOXL 2 IO** tab that can be used to configure and test the outputs. ![QGroundControl actuator configuration, older layout](/images/voxl2-io/user-guide/M0065-qgc-actuator.png) **PX4 Parameters** | Name | Description | Default | Units | |:--------------------:|:--------------------------------------------------------------------------------------------------------------:|:----------------:|:-----------:|:-------:| | `VOXL2_IO_BAUD` | Baud Rate
**Reboot Required** | 921600 | bits/sec | | `VOXL2_IO_FUNC1` | PWM 1 Function | 101 | | | `VOXL2_IO_FUNC2` | PWM 2 Function | 102 | | | `VOXL2_IO_FUNC3` | PWM 3 Function | 103 | | | `VOXL2_IO_FUNC4` | PWM 4 Function | 104 | | | `VOXL2_IO_MIN` | PWM Min | 1000 | microseconds | | `VOXL2_IO_MAX` | PWM Max | 2000 | microseconds | **How to Perform ESC Calibration** **REMOVE ALL PROPS, MOTORS MAY SPIN DURING CALIBRATION** **REMOVE ALL PROPS, MOTORS MAY SPIN DURING CALIBRATION** 1. Power off drone 2. Disconnect the PWM output cable connected to J1 on VOXL 2 IO (MCBL-00004) 3. Power on drone 4. Adb shell or ssh onto drone 5. Run to following command on your drone: ```px4-qshell voxl2_io calibrate_escs``` 6. You now have 10 seconds to reconnect the cable for J1 on VOXL 2 IO (MCBL-00004) before the calibration process begins 7. The calibration will write the PWM max value you have set by `VOXL2_IO_MAX` for 5 seconds 8. The calibration will write the PWM min value you have set by `VOXL2_IO_MIN` for 5 seconds 9. The calibration then waits 5 seconds with no PWM output to finish 10. At the end of the calibration process, the ESCs/Motors will play a sequence of tones
## Supported Use Cases VOXL SDK 1.1.1 or newer required for the following use cases. ### VOXL 2 standard RC input and PWM Output
![VOXL 2 with ELRS receiver and VOXL 2 IO PWM output](/images/voxl2-io/user-guide/M0065-use-cases-M0054-M0065-ELRS-PWM.jpg) | VOXL 2 Connector | Usage | PX4 Driver | |:------------------:|:-------------:|:------------:| | J18 | PWM Out | `voxl2_io` | | J19 | RC, ELRS | `crsf_rc` | | `/etc/modalai/voxl-px4.conf` | Value | PX4 Driver Used | |:------------------:|:-------------:|:---:| | `ESC` | `VOXL2_IO_PWM_ESC` | `voxl2_io` | | `RC` | `CRSF_RAW` | `crsf_rc` |
![VOXL 2 Mini with ELRS receiver and VOXL 2 IO PWM output](/images/voxl2-io/user-guide/M0065-use-cases-M0104-M0065-ELRS-PWM.jpg) | VOXL 2 Mini Connector | Usage | PX4 Driver | |:------------------:|:-------------:|:------------:| | J19 | PWM Out | `voxl2_io` | | J19 | RC, ELRS | `crsf_rc` | | `/etc/modalai/voxl-px4.conf` | Value | PX4 Driver Used | |:------------------:|:-------------:|:---:| | `ESC` | `VOXL2_IO_PWM_ESC` | `voxl2_io` | | `RC` | `CRSF_RAW` | `crsf_rc` |
### VOXL 2 IO S.BUS input and PWM Output
![VOXL 2 with S.Bus input on VOXL 2 IO and PWM output](/images/voxl2-io/user-guide/M0065-use-cases-M0054-M0065-SBUS-PWM.jpg) | VOXL 2 Connector | Usage | PX4 Driver | |:------------------:|:---------------------:|:------------:| | J18 | PWM Out, SBUS RC in | `voxl2_io` | | `/etc/modalai/voxl-px4.conf` | Value | PX4 Driver Used | |:------------------:|:-------------:|:---:| | `ESC` | `VOXL2_IO_PWM_ESC` | `voxl2_io` | | `RC` | `M0065_SBUS` | `voxl2_io` |
![VOXL 2 Mini with S.Bus input on VOXL 2 IO and PWM output](/images/voxl2-io/user-guide/M0065-use-cases-M0104-M0065-SBUS-PWM.jpg) | VOXL 2 Connector | Usage | PX4 Driver | |:------------------:|:---------------------:|:------------:| | J19 | PWM Out, SBUS RC in | `voxl2_io` | | `/etc/modalai/voxl-px4.conf` | Value | PX4 Driver Used | |:------------------:|:-------------:|:---:| | `ESC` | `VOXL2_IO_PWM_ESC` | `voxl2_io` | | `RC` | `M0065_SBUS` | `voxl2_io` |
### VOXL 2 IO S.BUS input and 4-in-1 UART ESC Output #### VOXL 2 (M0054) ![VOXL 2 with VOXL 2 IO and M0134 ESC](/images/voxl2-io/user-guide/M0065-use-cases-M0054-M0065-M0134.jpg) | VOXL 2 Connector | Usage | PX4 Driver | |:------------------:|:---------------------:|:------------:| | J18 | 4-in-1 ESC | `voxl_esc` | | J19 | SBUS RC in | `voxl2_io` | | `/etc/modalai/voxl-px4.conf` | Value | PX4 Driver Used | |:------------------:|:-------------:|:---:| | `ESC` | `VOXL_ESC` | `voxl_esc` | | `RC` | `M0065_SBUS` | `voxl2_io` | ## VOXL 2 IO Command Line Tool VOXL SDK includes a `voxl-2-io` command line tool on VOXL 2 for interacting with the VOXL 2 IO board directly. Running it with no arguments starts an interactive wizard, or a subcommand can be used: ```bash voxl-2-io scan # ping the board, report firmware/bootloader versions and UID voxl-2-io detect # detect the board voxl-2-io spin # bench test the motors at low power voxl-2-io upgrade_firmware # update the VOXL 2 IO firmware ``` > `voxl-2-io spin` spins the motors. Remove all props before using it. The tool automatically looks for the board on the default UART port (2), then falls back to the alternate port (7). It stops `voxl-px4` before communicating with the board and restarts it when done. Firmware images ship on target in `/usr/share/modalai/voxl2-io-tools/firmware/`. ## Common Issues If none of the tips here help solve your issue, feel free to post a question on [https://forum.modalai.com/](https://forum.modalai.com/category/34/voxl-2-io). ### One of my motors isn't spinning or my motors aren't all spinning the same rate When this occurs, its usually because the ESCs need to be calibrated. If a ModalAI development drone is being used then the calibration procedure on this page can be used to calibrate the ESCs and this should help. If other ESCs are being used, you may want to refer to the manufacturers calibration procedure for your ESCs as there is no guarantee the calibrate procedure on this page will work. ### None of my motors are spinning If none of your motors are spinning then there could be a variety of issues depending on your setup, it is a good idea to validate any of the following that are relevant: - Check that all the cables in your setup connected to Voxl2 IO are secure - Check that the voxl2_io driver is running in voxl-px4 - The voxl2_io driver requires an exact firmware version match (software version 2, hardware version 35) and will refuse to start on a mismatch. Check the reported version with `voxl-2-io scan` or `px4-qshell voxl2_io status`, and update the firmware with `voxl-2-io upgrade_firmware` - Check your RC connection if applicable - Check that all the correct parameters loaded, mainly `/usr/share/modalai/px4_params/v1.14/experimental_do_not_use/voxl2_io.params`, which is loaded automatically by `voxl-configure-mpa` for relevant SKUs. - In QGC you can check the actuators tab as shown on this page to make sure that the motors are mapped correctly. You can also test the ESCs and motors by using the "Actuators Testing" section of the tab or via command line. --- Source: https://docs.modalai.com/voxl2-io-firmware/ # VOXL 2 IO Firmware / Bootloader ## How to Tell What FW Version You Have ### SDK 1.3.0+ The **current** version which uses a VOXL ESC based firmware has LED pattern like this upon power up: This is when there is no RC attached. This is when there is no RC attached and bound. ### SDK 1.1.1+ ### Legacy The **legacy** version which uses PX4IO has LED pattern like this upon power up: To update from the legacy version to the new version, see the section below. If you would like to get a replacement by sending your hardware in, please contact us. ## Release Notes ### VOXL SDK 1.2.X - VOXL 2 IO (`M0065`) firmware version: - Software version: 2 - Hardware version: 35 Bug Fixes/Enhancements: - add timeout on both LEDs (blue and orange). if there is no activity, the LEDs will be off - define a new pwm control message 4-8 channels (dynamic), specify pwm width with 50ns resolution - this allows to set any PWM value for any of the 8 outputs between 0 and 2000us with resolution of 50ns - switched to generating OneShot PWM signals (for a single control message, there is only one pulse) - removes the need for timeout to stop continuous pwm output in case of lack of commands - synchronizes the pwm output to the flight controller update cycle (lower latency) - voxl2-io cannot distinguish (and does not care) that the signal is OneShot style - this also inherently supports OneShot125 pwm pulse, which further allows to reduce control latency - Maximum update rate with regular pwm now is 400hz, 800hz for OneShot125 (since flight controller is updating at 800hz) - If SBUS RC was connected to M0065, the PWM output from mixer was only sent out at the rate of SBUS input packets (100hz) - fix the ESC calibration issues: - when using Blheli32 ESC (Tmotor), the calibration procedure resulted in the DISABLED pulse set as the minimum calibration pulse. To fix this, the calibration period had to be extended so that the ESC interprets the calibration minimum pulse correctly. - Calibration procedure was using the same values for calibrating the ESC and the armed min and max, which is problematic because this allowed the mixer to potentially command such low PWM command that would cause the motor to stop in the armed state. The fix was to specify separate parameters for calibration and for normal armed ranges. - the updated calibration procedure has been tested using the standard pwm and oneshot125 signals. - the mixer value range was 0-800, which is confusing because everyone is used to around 1000-2000us signals. The update now uses standard ranges in terms of microseconds (0-2000) Features Added: - added VOXL2_IO prefix for all the prints from the module, so it is easy to see it’s output: `voxl-px4 -d | grep VOXL2_IO` - moved the M0065 version check to init and using the extended version message that has firmware hash. If M0065 is not detected, the voxl2_io module will not run - added higher resolution command for setting desired PWM signal on M0065 - added support of up to 8 pwm channels (with the new packet). The pwm channels are configured as standard actuators - added params for pwm range of calibration procedure, updated the armed pwm command range to have a safe margin and prevent motor from inadvertently shutting off when armed - simplify SBUS packet handling (the packet that is coming from M0065) Features Removed: - command line actuator test (this is redundant - use the QGC instead so that we are consistently testing the same way) - configuration packet for m0065 has been removed. with the new pwm control message, there is no need for any configuration of M0065 Misc: - changed the failsafe actuator values from 0 to -1, which is the suggested default and it lets PX4 select the failsafe behavior based on the actuator type - Suggested parameter set: - DISABLED (VOXL2_IO_DIS) 1000 - CALIBRATION MIN (VOXL2_IO_CMIN) 1050 - CALIBRATION MAX (VOXL2_IO_CMAX) 2000 - ARMED MIN (VOXL2_IO_MIN) 1100 - ARMED MAX (VOXL2_IO_MAX) 2000 - update to Suggested ESC calibration procedure ### VOXL SDK 1.1.1 - VOXL 2 IO (`M0065`) firmware version: - Software version: 1 - Hardware version: 35 - Support for 4 channel 400Hz PWM output - Support for SBUS ## How to Update Legacy Firmware to New Firmware ### Send into ModalAI We strive to enable in field updates, but when a bootloader update is required, sometimes lower level tools are needed. If you would like to update the bootloader and firmware on your VOXL 2 IO, you can send in your existing hardware to be updated without charge by contacting contact@modalai.com. ## Getting New Firmware New firmware ships with VOXL SDK updates and can be installed with the `voxl-2-io upgrade_firmware` command line tool, which automatically stops `voxl-px4`, verifies the firmware git hash, and also supports boards already in bootloader mode. Additionally, FW files may be hosted on the [public downloads](https://downloads.modalai.com/) page. ## How to Update Firmware ### Via voxl-2-io Command Line Tool On the VOXL 2 shell, run: ```bash voxl-2-io upgrade_firmware ``` The tool stops `voxl-px4` automatically, detects the board (default port 2, then port 7), compares the installed firmware git hash against the shipped image, and flashes it if needed. Boards already in bootloader mode are also supported. ### Manual Update via adb (fallback) 1. Stop voxl-px4 on your VOXL 2: ```systemctl stop voxl-px4``` 2. Power off drone 3. Disconnect VOXL 2 IO from drone 4. Power on drone 5. Place the code below into a bash script, or you can run each command separately (Script is to be executed on host computer in either case).[^1] [^2] ```bash #!/bin/bash set -e +x # Firmware ships on target in /usr/share/modalai/voxl2-io-tools/firmware/ # with a filename like modalai_m0065_firmware_v0_2_RC1_.bin. # Point FIRMWARE_FILE at a different on-target path if flashing another image. FIRMWARE_FILE="/usr/share/modalai/voxl2-io-tools/firmware/modalai_m0065_firmware_v0_2_RC1_f94baad1.bin" adb shell "cd /usr/share/modalai/voxl-esc-tools; \ ./voxl-esc-upload-firmware.py \ --id 0 \ --firmware-file $FIRMWARE_FILE \ --device /dev/slpi-uart-2 \ --skip-firmware-reset 1 " ``` 6. You will see an output like the image below. Reconnect your VOXL 2 IO now. ![Firmware updater waiting for reconnect](/images/voxl2-io/firmware/fw_update_connect.png) 7. Your VOXL 2 IO will now be flashed with the latest firmware and you should see an output like the image below. ![Firmware update success output](/images/voxl2-io/firmware/fw_update_success.png) 8. You can restart voxl-px4 now: ```systemctl start voxl-px4``` ## How to Update Bootloader If you would like to update the bootloader on your VOXL 2 IO, please email devops @ modalai . com for more information. --- Footnotes: [^1]: You may need to run the command ```chmod +x {flash_script}``` in order to make your bash script executable. [^2]: You will need to change the port ```--device /dev/slpi-uart-2``` to ```--device /dev/slpi-uart-7``` if you have VOXL 2 IO connected to J19 on voxl2. [^3]: This method uses the tool OpenOCD which may require some setup, guides can be found online. --- Source: https://docs.modalai.com/voxl2-io-legacy-guide/ # VOXL 2 IO Legacy Guide ## Overview To help with searching in our docs, the `VOXL 2 IO` board will be called `legacy PX4IO based board` ### VOXL SDK Requirements This is not valid for VOXL SDK 1.1.1 or newer. See [here](/voxl2-io-user-guide/) for newer guide. This is accurate for SDK 0.9.5, and there were some breaking changes in SDK 1.0 when the PX4IO driver dropped from mainline PX4. - SDK 1.1.0 - no change - SDK 1.0.1 - PX4 1.14, no PWM support, SBUS RC input support only - SDK 0.9.5 - PX4 1.12, basic 4 channel support, see following documentation ### Summary The legacy PX4IO based board requires a host running PX4 running the [px4io](https://github.com/modalai/px4-firmware/tree/voxl-master/src/modules/px4iofirmware) module, such as VOXL 2. The IO board provides PWM outputs (8) and expands the native Spektrum RC support by adding S.BUS support (and provides passthrough Spektrum as well). The IO board is powered from and communicates via VOXL 2's RC port. The VOXL 2 communicates to the legacy PX4IO based board using a UART connection. ### Limitations #### Supported Mixers and Airframe Setup Airframe selection via QGroundControl is not supported. This has validated against `quad_x` and `hex_x` airframes only. In the current release, configuring the mixer is done manually by editing the `/usr/lib/rfsa/adsp/quad_x_io.main.mix` file. Quad: ``` R: 4x 10000 10000 10000 0 ``` Hex: ``` R: 6x 10000 10000 10000 0 ``` #### UART ESC Compatibility This has not been validated to be used in parallel to the ModalAI UART ESC yet to expose additional PWM channels while also using the ModalAI UART ESC. #### PX4 Parameters The defaults set by `voxl-px4-set-default-parameters.config`. Ensure you vehicle is configured correctly. ``` CBRK_IO_SAFETY 22027 PWM_MAIN_MAX 2000 PWM_MAIN_MIN 1060 PWM_MAIN_RATE 400 PWM_MAIN_DISARM 900 ``` #### Spektrum RC Binding The Spektrum bind feature invoked via QGroundControl does not work and needs to be ran manually from VOXL2. To enable Spektrum bind: Connect to VOXL 2's shell: ```bash adb shell ``` Run the following commands to put Spektrum RC in bind mode. ``` px4-qshell px4io safety_on px4-qshell px4io bind dsmx8 ``` #### PWM ESC Calibration > the following feature is still in beta. For this process to work, you need to have physical access to J1 (PWM output port). **Use with caution**, as this will be setting PWM outputs which could spin motors inadvertently. **REMOVE ALL PROPS. REPEAT: REMOVE ALL PROPS** Using the Sentinel drone with PWM based ESCs as an example: - Power off the drone - Remove the PWM cable from legacy PX4IO based connector J1 - Power on the drone - adb or ssh onto the drone - get prepared to re-attach the cable (but not yet) After you do the next step, you have 10 seconds to connect the PWM cable back to J1. - from the terminal, run `px4-qshell pwm cal_backdoor` *Note: you will see an timeout error message, this is OK, for example:* ``` voxl2:/$ px4-qshell pwm cal_backdoor INFO [qshell] Send cmd: 'pwm cal_backdoor' ERROR [qshell] command timed out ERROR [qshell] Command failed ``` - re-attach the cable, ESCs will make a short power on jingle - in 10 seconds, a set of beeps being lasting several seconds - after the jingles are done, you are done Here's the waveform generated over time: ![m0065-pwm-cal](/images/voxl2-io/legacy/m0065-pwm-cal.png) And the same in video, for fun ;) #### VOXL 2 Firmware Update The Firmware Update feature from host to legacy PX4IO based board is currently not supported. ## Wiring Guides ### Host Connection #### VOXL 2 as Host (M0054) ![m0065-host-m0054](/images/voxl2-io/legacy/m0065-host-m0054-2.png) From VOXL2, connect J19 pins 9-12 to VOXL2 IO J4 pins 1-4 as shown here: | VOXL 2 | legacy PX4IO based board | |--- |--- | | J19 Pin 9 - 3P3V | J4 Pin 1 - 3P3V_IO | | J19 Pin 10 - Host TX | J4 Pin 2 - IO RX | | J19 Pin 11 - Host RX | J4 Pin 3 - IO TX | | J19 Pin 12 - GND | J4 Pin 4 - GND | #### RB5-Flight as Host (M0052) ![m0065-host-m0052](/images/voxl2-io/legacy/m0065-host-m0052-2.png) | RB5-Flight | legacy PX4IO based board | |--- |--- | | J12 Pin 1 - 3P3V | J4 Pin 1 - 3P3V_IO | | J12 Pin 2 - Host TX | J4 Pin 2 - IO RX | | J12 Pin 3 - Host RX | J4 Pin 3 - IO TX | | J12 Pin 4 - GND | J4 Pin 4 - GND | ### RC Connections #### Using S.BUS (FrSky R-XSR) In the following example, the FrSky R-XSR receiver is being used with `MCBL-00065-1`: ![m0065](/images/voxl2-io/legacy/rc-connections-sbus-molex.png) #### Using S.BUS (Graupner GR-16) In the following example, the Graupner GR-16 receiver is being used has had it's channel 8 setup as `SBUS` with `MCBL-00064-1`: ![m0065](/images/voxl2-io/legacy/rc-connections-sbus-dupont.png) #### Using Spektrum (DSMX) In the following example, the Spektrum SMX-SPM9745 receiver is being used with `MCBL-00005-1`: ![m0065](/images/voxl2-io/legacy/rc-connections-spektrum-2.png) ### PWM Connection In the following example, the PWM Breakout Board (`MCCA-M0022`) and cable (`MCBL-00004-1`) are used to expose PWM based actuation: ![m0065](/images/voxl2-io/legacy/m0065-pwm-2.png) ## Modes and LED Patterns The legacy PX4IO based board can be in the following modes accompanied with a unique LED pattern. - Bootloader Mode - Application Running in Waiting Mode - Application Running in Standard Mode - Firmware update mode - Communication error mode ### Bootloader Mode For the first 200ms after power on, the legacy PX4IO based board is in bootloader mode. The serial firmware update could be performed during this time. > this mode is very short lived an almost not perceptible to the eye. | legacy PX4IO based board LED | State | Meaning | |--- | |--- | | Green | Solid | Power Good | | Blue | Off | Application not running | | Orange | Fast Blink (10Hz) | In bootloader mode | ### Application Running in Waiting Mode When the system is running and communications with VOXL 2 have not started and it is waiting, the following LED pattern can be seen. | legacy PX4IO based board LED | State | Meaning | |--- | |--- | | Green | Solid | Power Good | | Blue | Blink Slow (2Hz) | Application running OK | | Orange | Solid | Warning, waiting for VOXL 2 | ### Application Running in Standard Mode When the system is running, the following LED pattern can be seen. | legacy PX4IO based board LED | State | Meaning | |--- | |--- | | Green | Solid | Power Good | | Blue | Blink Slow (2Hz) | Application running OK | | Orange | Off | No error or warning | ### Firmware Update Mode When the system is in firmware update mode, the following LED pattern can be seen. | legacy PX4IO based board LED | State | Meaning | |--- | |--- | | Green | Solid | Power Good | | Blue | Fast Blink (10Hz) | Firmware update in progress | | Orange | Fast Blink (10Hz) | In bootloader mode | ### Communication Error Mode When communication errors occur, the following LED pattern can be seen. > early RB5 based releases showed this mode when acting as an RC passthrough. | legacy PX4IO based board LED | State | Meaning | |--- | |--- | | Green | Solid | Power Good | | Blue | Blink Slow (2Hz) | Communication with VOXL 2 OK | | Orange | Mediaum Blink (4Hz)| Warning, not getting actuation messages | ## Developer Guide This is not valid for VOXL SDK 1.1.1 or newer. See (here)[/voxl2-io-user-guide/] for newer guide. This is valid for VOXL SDK 0.9.5 - 1.1.0. ### Hardware ![m0065-dev-guide-bd-0](/images/voxl2-io/legacy/m0065-dev-guide-bd-0.jpg) - A battery powers VOXL2 (`M0054`) through a Power Module (`M0041`), and the battery also powers the ESCs/Motors - VOXL2 J19 connects to VOXL2 IO J4 to provide both power and communications using a UART - VOXL2 IO connects to an RC receiver (either J2 or J3, depending on user's receiver type) - VOXL2 IO J1 connects to a PWM breakboard board (`M0022`) and 'communicates' to the ESCs using PWM, which in turn spin the motors ### Software ![m0065-dev-guide-bd-1](/images/voxl2-io/legacy/m0065-dev-guide-bd-1.jpg) #### High Level Idea VOXL2 runs PX4 and VOXL2 IO runs PX4IO. They share a register map and keep it synchronized. The VOXL2 IO has a control loop that includes mixing, and reacts to updates that are from VOXL2s `px4io` driver which populates the register map based updates to subscriptions. #### Running on VOXL2 - On VOXL2 (`M0054`), the `px4io` driver runs on the sDSP/SLPI proc - The `px4io` driver creates a bit of a hybrid device which has a few similarities as `pwm_output` device - The `voxl-px4.config` script starts the detection and configuration process, including loading a mixer, which actually runs on VOXL2 IO (`M0065`) - The `px4io` driver subscribes to various topics and updates the 'registers' on the VOXL2 IO board by sending commands over UART following a simple [protocol](https://github.com/PX4/PX4-Autopilot/blob/main/src/modules/px4iofirmware/protocol.h) #### Running on VOXL2 IO - Upon bootup, VOXL2 (`M0054`) detects the VOXL2 IO (`M0065`) board, and configures the VOXL2 IO board including loading of a mixer - A control loop takes place, which involves checking various flags, updating status based upon updates from VOXL2, checking for inputs, handling outputs, etc ## PX4IO Based Firmware > this is no longer maintained. See [here](/voxl2-io-firmware/) for newer information. ### Bootloader #### Build | Component | Notes | |--- |--- | | Build Docker | https://gitlab.com/voxl-public/flight-core-px4/px4-bootloader-build-docker | | Source Code | https://github.com/PX4/PX4-Bootloader.git | To build: ```bash git clone https://gitlab.com/voxl-public/flight-core-px4/px4-bootloader-build-docker cd px4-bootloader-build-docker ./docker-build-image.sh cd .. git clone -b https://github.com/PX4/PX4-Bootloader.git --recursive cd px4-bootloader cp ../px4-bootloader-build-docker/docker-run-image.sh . ./docker-run-image.sh make modalai_voxl2_io_bl -j4 ``` Output at `build/modalai_voxl2_io_bl/modalai_voxl2_io_bl.bin` #### Flash Write the 4kb bootloader to `0x08000000` ### Application #### Build | Component | Notes | |--- |--- | | Build Docker | https://gitlab.com/voxl-public/flight-core-px4/px4-stm32-build-docker.git | | Source Code | https://github.com/modalai/px4-firmware/tree/voxl2-io | To build: ```bash https://gitlab.com/voxl-public/flight-core-px4/px4-stm32-build-docker.git cd px4-stm32-build-docker ./docker-build-image.sh cd .. git clone -b voxl2-io-1.11 https://github.com/modalai/px4-firmware --recursive cd px4-firmware cp ../px4-stm32-build-docker/docker-run-image.sh . ./docker-run-image.sh make modalai_voxl2-io ``` Output at `build/modalai_voxl2-io/modalai_voxl2_io.bin` #### Flash Write the 60kb application to `0x08001000` --- Source: https://docs.modalai.com/m0151/ # USB3 UART Add-On For VOXL2 only. ![m00125-zoom](/images/other-products/usb3-uart/capture.png) --- Source: https://docs.modalai.com/voxl2-usb3-uart-add-on-datasheet/ # VOXL 2 USB3 UART Add-On Datasheet ## Overview ![m0125-hero](/images/voxl2-usb3-uart-add-on/m0125-hero.jpg) ## Dimensions ### 3D Drawings [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0125_A.step) ### 2D Drawings TODO ## Features - Exposes an apps proc UART (`/dev/ttyHS1` on VOXL2, `/dev/ttyHS4` on RB5) on a 4-pin JST connector - Exposes a USB3 on a 10-pin JST connector ## Schematic [M0125 Schematic](https://storage.googleapis.com/modalai_public/modal_schematics/M0125_A_SCHEMATIC.pdf) ## Connector Callouts
### J3 - UART | Connector | MPN | | --- | --- | | Board Connector | BM04B-GHS-TBT(LF)(SN)(N) | | Mating Connector | | Pin # | Signal Name | Usage / Notes | |--- |--- |--- | | 1 | 3P3V | | | 2 | UART7_RX_3P3V | `/dev/ttyHS1` | | 3 | UART7_TX_3P3V | `/dev/ttyHS1` | | 4 | GND | |
### J2 - USB3 | Connector | MPN | | --- | --- | | Board Connector | BM10B-GHS-TBT(LF)(SN)(N) | | Mating Connector | | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | VBUS 5P0V | | | 2 | USB1_HS_CONN_D_N | | | 3 | USB1_HS_CONN_D_P | | | 4 | GND | | | 5 | VOXL2_USB1_SS_RX_N | | | 6 | VOXL2_USB1_SS_RX_P | | | 7 | GND | | | 8 | VOXL2_USB1_SS_TX_N | | | 9 | VOXL2_USB1_SS_TX_P | | | 10 | GND | |
--- Source: https://docs.modalai.com/voxl2-usb3-uart-add-on-user-guide/ # VOXL 2 USB3 UART Add-On User Guide ## UART Use Case For an example use case using UART, see [VOXL 2 External Flight Controller](/voxl2-external-flight-controller/). ## USB3 Use Case The `J2` connector on the M0125 can be used to connect a USB3 capable device. ![m0125-standalone.jpg](/images/voxl2-usb3-uart-add-on/m0125-standalone.jpg) ### Setting up a Connection - Using a [MCBL-00022](/cable-datasheets/#mcbl-00022) cable, connect the 10-pin JST side to the M0125's `J2` connector. ![m0125-cable.jpg](/images/voxl2-usb3-uart-add-on/m0125-cable.jpg) - Connect your USB3 capable device to the USB connector side of the [MCBL-00022](/cable-datasheets/#mcbl-00022) cable. ![m0125-usb3.jpg](/images/voxl2-usb3-uart-add-on/m0125-usb3.jpg) ### Verifying a USB3 Capable Connection - Connect to the VOXL2 over ADB: ```bash adb shell ``` - Verify that the connected USB3 device is present: ``` lsusb -t ``` Example Output: ``` /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 10000M |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M ``` > - The example output above is using a USB3.0 flash drive. USB3.0 (gen 1) devices will show 5000M (5000MBit/s) capability and USB3.1 (gen 2) devices will show 10000M (10000MBit/s) capability. - The generation of your USB device can be verified by executing the following command and checking the `bcdUSB` line in the output: ``` # General Format: lsusb -v -s [Bus#]:[Dev#] # Format based on example output from above: lsusb -v -s 002:002 ``` Example Output: ``` Bus 002 Device 002: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) Flash Drive Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.10 . . . ``` --- Source: https://docs.modalai.com/voxl2-dev-test-board/ # VOXL 2 Developer Test Board The VOXL 2 Developer Test Board (M0144) is the first of-its-kind plug-in expansion board that allows Hardware and Software developers of the VOXL 2 ecosystem to access and utilize all GPIO/QUP signals (and others) from J3 and J5. Benefits of this board include: - No need to design your own custom breakout hardware for software and proof-of-concept efforts - Significant Software and Hardware de-risking by validating your code on-target with actual hardware before integrating your custom hardware - Allows for “what-if” code and hardware development and testing - Promotes sandbox testing and validating of your VOXL 2 should you suspect any Hardware issues after a drone crash or other anomalous behavior - Several “fun” features included such as: - - PCA9685 16-Channel I2C to PWM driver direct on board for PWM/LED development - - RGB LED plus discrete Orange, Green, and Blue LEDs for various/flexible indication or GPIO validation - - Quickly access ANY GPIO from J3 or J5 on large header pins (GND posts throughout the design) - - Remap any QUP port from J3 or J5 into an SPI, I2C, or UART function with direct on-board buffers/drivers mapped to standard JST Dronecode format cable connectors - USB3 host port in the 10-pin ModalAI format with a high-current jumper option for powering devices requiring more than 1A of VBUS - uSD Card Socket direct on-board - Dedicated Linux Kernel Debug UART Port - Jumpers and jumper wires included as part of a kit (see ordering info) to get you started immediately *** ModalAI Provided Schematics to get you started with your own design!!*** We are not able to provide schematics for VOXL 2, and we understand this creates challenges for designers. This plug-in board is a great way to accelerate your own design and enhance your understanding of what hardware is proven to work, giving you a huge advantage for your design cycle times. Please refer to the datasheets page for a schematic download link: https://docs.modalai.com/voxl2-dev-test-board-datasheet/ ![m0144-hero](/images/voxl2-dev-test-board/m0144-hero-3d-top.jpg) The following reference links are pre-requisite material for ensuring success with this design (these pages are written under the premise the following pages are understood): - VOXL 2 Overall User Guide: https://docs.modalai.com/voxl2-user-guides/ - - Special emphasis on this page for SW usage: https://docs.modalai.com/voxl2-linux-user-guide/ - Expansion Hardware Design Guide: https://docs.modalai.com/expansion-design-guide/ --- Source: https://docs.modalai.com/voxl2-dev-test-board-datasheet/ # VOXL 2 Developer Test Board Datasheet ## Overview ![m0144-cca](/images/voxl2-dev-test-board/m0144-hero-3d-top.jpg) ## Development Kits | PN | Description | |--- |--- | | MDK-M0144-00 | VOXL 2 Developer Test Board only plus default jumpers and jumper wires | | MDK-M0144-01 | Same as MDK-M0144-00, plus USB and UART cables (MCBL-00022-2, MCBL-00016-1, MCBL-00031-1) | ## Schematics [.PDF SCH File](https://storage.googleapis.com/modalai_public/modal_drawings/M0144_VOXL2_B2B_BREAKOUT_REVA_06-15-23.PDF) ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0144_VOXL2_B2B_BREAKOUT_REVA_v1(-1_MAIN).step) > The 3D step only includes components that are populated (installed) as per the "-1_MAIN" design/build variant. ### 2D Drawings > The 2D drawings shows all components whether populated or not. The MTG holes are arranged to align with the Voxl2 mounting hole pattern as shown. ![M0144 2D dimensions](/images/voxl2-dev-test-board/m0144-2d-dimensions.jpg) ## Features - Quickly access ANY GPIO from J3 or J5 on large header pins (GND posts throughout the design) - Remap any QUP port from J3 or J5 into an SPI, I2C, or UART function with direct on-board buffers/drivers mapped to standard JST Dronecode format cable connectors - PCA9685 16-Channel I2C to PWM driver direct on board for PWM/LED development - RGB LED plus discrete Orange, Green, and Blue LEDs for various/flexible indication or GPIO validation - USB3 Host Port - Linux Kernel (Apps) Debug UART - Four (4) Mounting holes that align with Voxl2 mounting hole pattern [Top](#table-of-contents) ## Block Diagram ![M0144 B2B breakout card block diagram](/images/voxl2-dev-test-board/M0144 V2 B2B Breakout Card Diagrams.jpg) ## Connector Callouts Hover a connector to identify it — click to jump to its details. > Only change jumper and cable connections while the entire system is unpowered. Changing jumpers or fly-wires while powered will damage the M0144 and the VOXL 2.
### J1 - Legacy Voxl Debug/Expansion Port | Connector | MPN | | --- | --- | | Board Connector | QTH-030-01-L-D-A-K-TR | | Mating Connector | [VOXL 2 J3 — legacy board-to-board](/voxl2-connectors/#j3---legacy-board-to-board-connector-b2b) | Color: Black Pinouts as per Schematic and Voxl2 Mating Connector 1:1
### J2 - High Speed Board to Board Port | Connector | MPN | | --- | --- | | Board Connector | ADM6-30-01.5-L-4-2-A-TR | | Mating Connector | [VOXL 2 J5 — high-speed board-to-board](/voxl2-connectors/#j5---high-speed-board-to-board-connector-hsb2b) | Color: Black Pinouts as per Schematic and Voxl2 Mating Connector 1:1
### J3 - System Debug Header (Not Installed) | Connector | MPN | | --- | --- | | Board Connector | BM10B-SRSS-TB(LF)(SN) | | Mating Connector | SHR-10V-S-B | Color: Beige (DNI'd) | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | VREG_S4A_1P8 | 1.8V I/O Rail VTREF | | 2 | VPH_PWR | 3.8V VREF | | 3 | PM_RESIN_N | Main PMIC RESET_N Signal (FASTBOOT) | | 4 | APQ_RESOUT_LCL_N | APQ Out of RESET Indication | | 5 | QDL_H | eDL Signal Input, LOW = eDL | | 6 | WDOG_DIS_H | Watchdog Disable Input | | 7 | PMK8002_PMIC_CLK | PMK8002 Spare Clock Output | | 8 | PM8150L_AMUX1 | PM8150L AMUX Input | | 9 | PM8250_AMUX1 | PM8250 AMUX Input | | 10 | DGND | System GND |
### J4 - Power Access/Tap-Off (PTO) Header (Not Installed) | Connector | MPN | | --- | --- | | Board Connector | TSW-106-07-T-S | | Mating Connector | M20-1060100 | Color: Black (DNI'd) | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | VDCIN_5V | Raw Prime Input PTO/Access/Input (and J17.1) | | 2 | VDC_5V_LOCAL | eFuse Protected 5V Output Access | | 3 | VDC_5V_USB1_VOXL | Voxl2 5V USB Output Access | | 4 | VPH_PWR | Voxl2 3.8V VPH_PWR Access | | 5 | VREG_3P3V_LOCAL | Voxl2 3.3V Power Access | | 6 | VREG_S4A_1P8 | Voxl2 1.8V Power Access |
### J5, J7, J12 - GND Access Points | Connector | MPN | | --- | --- | | Board Connector | TSW-102-07-T-S | | Mating Connector | M20-1060200 | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | DGND | Probe GND Access | | 2 | DGND | Probe GND Access |
### J6 - Kernel (Apps) Debug UART Header | Connector | MPN | | --- | --- | | Board Connector | BM04B-SRSS-TB(LF)(SN) | | Mating Connector | SHR-04V-S-B | Color: Beige | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | VREG_3P3V_LOCAL | Debug UART Signal Level VTREF | | 2 | DEBUG_UART_RX | Debug UART Receive (Input), 3.3V CMOS | | 3 | DEBUG_UART_TX | Debug UART Transmit (Output), 3.3V CMOS | | 4 | DGND | System GND |
### J8 - SPI Port Connector | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | GHR-06V-S | Color: Beige | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | V_SEL_CONNS | Set by JP3 (3.3V or 5V) | | 2 | SPI_MISO_3P3V_CON | SPI Port J8 MISO, 3.3V CMOS | | 3 | SPI_MOSI_3P3V_CON | SPI Port J8 MOSI, 3.3V CMOS | | 4 | SPI_SCLK_3P3V_CON | SPI Port J8 SCLK, 3.3V CMOS | | 5 | SPI_CS0_N_3P3V_CON | SPI Port J8 CS0_N, 3.3V CMOS | | 6 | DGND | System GND | [Top](#table-of-contents)
### J9 - UART + I2C Port Connector | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | GHR-06V-S | Color: Beige | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | V_SEL_CONNS | Set by JP3 (3.3V or 5V) | | 2 | UART_TX_3P3V_CON | UART+I2C Port J9 UART_TX, 3.3V CMOS | | 3 | UART_RX_3P3V_CON | UART+I2C Port J9 UART_RX, 3.3V CMOS | | 4 | I2C_SDA_3P3V_CON | UART+I2C Port J9 SDA, 3.3V CMOS | | 5 | I2C_SCL_3P3V_CON | UART+I2C Port J9 SCL, 3.3V CMOS | | 6 | DGND | System GND |
### J10 - 2-In & 2-Out (2I/2O) Port Connector | Connector | MPN | | --- | --- | | Board Connector | SM06B-GHS-TB(LF)(SN) | | Mating Connector | GHR-06V-S | Color: Beige | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | V_SEL_CONNS | Set by JP3 (3.3V or 5V) | | 2 | OUTPUT_1_3P3V_CON | 2I/2O Port J10 OUTPUT_1, 3.3V CMOS | | 3 | OUTPUT_2_3P3V_CON | 2I/2O Port J10 OUTPUT_2, 3.3V CMOS | | 4 | INPUT_1_3P3V_CON | 2I/2O Port J10 INPUT_1, 3.3V CMOS | | 5 | INPUT_2_3P3V_CON | 2I/2O Port J10 INPUT_2, 3.3V CMOS | | 6 | DGND | System GND |
### J11 - USB3 Host Port Connector | Connector | MPN | | --- | --- | | Board Connector | BM10B-GHS-TBT(LF)(SN)(N) | | Mating Connector | GHR-10V-S | Color: Beige | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | V_SEL_USB | VBUS Set by JP4 (Voxl2 or eFuse sourced) | | 2 | USB1_HS_CON_D_N | Host Port USB_D- | | 3 | USB1_HS_CON_D_P | Host Port USB_D+ | | 4 | DGND | System GND | | 5 | USB1_SS_RX_N | Host Port SuperSpeed USB RX- | | 6 | USB1_SS_RX_P | Host Port SuperSpeed USB RX+ | | 7 | DGND | System GND | | 8 | USB1_SS_TX_CONN_N | Host Port SuperSpeed USB TX- | | 9 | USB1_SS_TX_CONN_P | Host Port SuperSpeed USB TX+ | | 10 | DGND | System GND |
### J13 - uSD Card Socket | Connector | MPN | | --- | --- | | Board Connector | DM3AT-SF-PEJM5 | Color: Silver Pinout as per uSD Standard. On-Board Test Points provided for each signal (see Schematic)
### J14 - Signal Breakout Access Header (1 of 3) | Connector | MPN | | --- | --- | | Board Connector | TSM-110-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or similar | Note all Signal Breakout Access Headers have GND pins on 1, 2, 19, and 20 (the four corners) Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | DGND | System GND | | 2 | DGND | System GND | | 3 | GPIO_16_QUP6_L0 | GPIO# and QUP# as Indicated by net name | | 4 | GPIO_115_I2C2_SDA | GPIO# and QUP# as Indicated by net name | | 5 | GPIO_17_QUP6_L1 | GPIO# and QUP# as Indicated by net name | | 6 | GPIO_116_I2C2_SCL | GPIO# and QUP# as Indicated by net name | | 7 | GPIO_18_QUP6_L2 | GPIO# and QUP# as Indicated by net name | | 8 | GPIO_117_QUP2_L2 | GPIO# and QUP# as Indicated by net name | | 9 | GPIO_19_QUP6_L3 | GPIO# and QUP# as Indicated by net name | | 10 | GPIO_118_QUP2_L3 | GPIO# and QUP# as Indicated by net name | | 11 | GPIO_0_QUP19_L0 | GPIO# and QUP# as Indicated by net name | | 12 | GPIO_155 | GPIO# as Indicated by net name | | 13 | GPIO_1_QUP19_L1 | GPIO# and QUP# as Indicated by net name | | 14 | GPIO_154 | GPIO# as Indicated by net name | | 15 | GPIO_2_QUP19_L2 | GPIO# and QUP# as Indicated by net name | | 16 | GPIO_153 | GPIO# as Indicated by net name | | 17 | GPIO_3_QUP19_L3 | GPIO# and QUP# as Indicated by net name | | 18 | GPIO_152 | GPIO# as Indicated by net name | | 19 | DGND | System GND | | 20 | DGND | System GND | [Top](#table-of-contents)
### J15 - Signal Breakout Access Header (2 of 3) | Connector | MPN | | --- | --- | | Board Connector | TSM-110-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or similar | Note all Signal Breakout Access Headers have GND pins on 1, 2, 19, and 20 (the four corners) Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | DGND | System GND | | 2 | DGND | System GND | | 3 | GPIO_36_UART13_CTS | GPIO# and QUP# as Indicated by net name | | 4 | GPIO_56_I2C18_SDA | GPIO# and QUP# as Indicated by net name | | 5 | GPIO_37_UART13_RTS | GPIO# and QUP# as Indicated by net name | | 6 | GPIO_57_I2C18_SCL | GPIO# and QUP# as Indicated by net name | | 7 | GPIO_38_UART13_TXD | GPIO# and QUP# as Indicated by net name | | 8 | GPIO_60_QUP11_L0 | GPIO# and QUP# as Indicated by net name | | 9 | GPIO_39_UART13_RXD | GPIO# and QUP# as Indicated by net name | | 10 | GPIO_61_QUP11_L1 | GPIO# and QUP# as Indicated by net name | | 11 | GPIO_8_I2C4_SDA | GPIO# and QUP# as Indicated by net name | | 12 | GPIO_62_QUP11_L2 | GPIO# and QUP# as Indicated by net name | | 13 | GPIO_9_I2C4_SCL | GPIO# and QUP# as Indicated by net name | | 14 | GPIO_63_QUP11_L3 | GPIO# and QUP# as Indicated by net name | | 15 | GPIO_130_I2C10_SCL | GPIO# and QUP# as Indicated by net name | | 16 | GPIO_24_I2C8_SDA | GPIO# and QUP# as Indicated by net name | | 17 | GPIO_129_I2C10_SDA | GPIO# and QUP# as Indicated by net name | | 18 | GPIO_25_I2C8_SCL | GPIO# and QUP# as Indicated by net name | | 19 | DGND | System GND | | 20 | DGND | System GND |
### J16 - Signal Breakout Access Header (3 of 3) | Connector | MPN | | --- | --- | | Board Connector | TSM-110-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or similar | Note all Signal Breakout Access Headers have GND pins on 1, 2, 19, and 20 (the four corners) Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | DGND | System GND | | 2 | DGND | System GND | | 3 | GPIO_119_QUP3_L0 | GPIO# and QUP# as Indicated by net name | | 4 | GPIO_143 | GPIO# as Indicated by net name | | 5 | GPIO_120_QUP3_L1 | GPIO# and QUP# as Indicated by net name | | 6 | GPIO_142 | GPIO# as Indicated by net name | | 7 | GPIO_121_QUP3_L2 | GPIO# and QUP# as Indicated by net name | | 8 | GPIO_137 | GPIO# as Indicated by net name | | 9 | GPIO_122_QUP3_L3 | GPIO# and QUP# as Indicated by net name | | 10 | GPIO_88 | GPIO# as Indicated by net name | | 11 | GPIO_20_QUP7_L0 | GPIO# and QUP# as Indicated by net name | | 12 | GPIO_89 | GPIO# as Indicated by net name | | 13 | GPIO_21_QUP7_L1 | GPIO# and QUP# as Indicated by net name | | 14 | GPIO_87 | GPIO# as Indicated by net name | | 15 | GPIO_32_QUP12_L0 | GPIO# and QUP# as Indicated by net name | | 16 | GPIO_86 | GPIO# as Indicated by net name | | 17 | GPIO_33_QUP12_L1 | GPIO# and QUP# as Indicated by net name | | 18 | GPIO_85 | GPIO# as Indicated by net name | | 19 | DGND | System GND | | 20 | DGND | System GND |
### J19 - LED Driver Access Header/Jumper | Connector | MPN | | --- | --- | | Board Connector | TSM-106-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or 2-pin jumpers | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | LED0 | Direct LED0 Output of PCA9685, 3.3V CMOS | | 2 | LED_RGB_GREEN | RGB Green Driver Input 1.8V <-> 5V CMOS | | 3 | LED1 | Direct LED1 Output of PCA9685, 3.3V CMOS | | 4 | LED_RGB_RED | RGB Red Driver Input 1.8V <-> 5V CMOS | | 5 | LED2 | Direct LED2 Output of PCA9685, 3.3V CMOS | | 6 | LED_RGB_BLUE | RGB Blue Driver Input 1.8V <-> 5V CMOS | | 7 | LED3 | Direct LED3 Output of PCA9685, 3.3V CMOS | | 8 | LED_BLUE | Discrete Blue LED Driver Input 1.8V <-> 5V CMOS | | 9 | LED4 | Direct LED4 Output of PCA9685, 3.3V CMOS | | 10 | LED_GREEN | Discrete Green LED Driver Input 1.8V <-> 5V CMOS | | 11 | LED5 | Direct LED5 Output of PCA9685, 3.3V CMOS | | 12 | LED_ORANGE | Discrete Orange LED Driver Input 1.8V <-> 5V CMOS | [Top](#table-of-contents)
### JP1 - Connector Selection Jumper (1 of 2), SPI + UART | Connector | MPN | | --- | --- | | Board Connector | TSM-106-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or 2-pin jumpers | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | GPIO_52_SPI17_MISO | GPIO# and QUP# as Indicated by net name | | 2 | SPI_MISO_SEL | SPI MISO Selection Pin, Sets SPI Port J8 SW Mapping | | 3 | GPIO_53_SPI17_MOSI | GPIO# and QUP# as Indicated by net name | | 4 | SPI_MOSI_SEL | SPI MOSI Selection Pin, Sets SPI Port J8 SW Mapping | | 5 | GPIO_54_SPI17_SCLK | GPIO# and QUP# as Indicated by net name | | 6 | SPI_SCLK_SEL | SPI SCLK Selection Pin, Sets SPI Port J8 SW Mapping | | 7 | GPIO_55_SPI17_CS | GPIO# and QUP# as Indicated by net name | | 8 | SPI_CS0_N_SEL | SPI CS_N Selection Pin, Sets SPI Port J8 SW Mapping | | 9 | GPIO_22_UART7_TXD | GPIO# and QUP# as Indicated by net name | | 10 | UART_TX_SEL | UART TX Selection Pin, Sets UART Port J9 SW Mapping | | 11 | GPIO_23_UART7_RXD | GPIO# and QUP# as Indicated by net name | | 12 | UART_RX_SEL | UART RX Selection Pin, Sets UART Port J9 SW Mapping |
### JP2 - Connector Selection Jumper (2 of 2), 2I/2O + I2C | Connector | MPN | | --- | --- | | Board Connector | TSM-106-01-L-DV | | Mating Connector | Individual jumper wires PRT-12796 or 2-pin jumpers | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | GPIO_124 | GPIO# as Indicated by net name | | 2 | INPUT_1_SEL | 2I/2O Port Selection Pin, Sets IN1 Port J10 SW Mapping | | 3 | GPIO_131 | GPIO# as Indicated by net name | | 4 | INPUT_2_SEL | 2I/2O Port Selection Pin, Sets IN2 Port J10 SW Mapping | | 5 | GPIO_144 | GPIO# as Indicated by net name | | 6 | OUTPUT_1_SEL | 2I/2O Port Selection Pin, Sets OUT1 Port J10 SW Mapping | | 7 | GPIO_145 | GPIO# as Indicated by net name | | 8 | OUTPUT_2_SEL | 2I/2O Port Selection Pin, Sets OUT2 Port J10 SW Mapping | | 9 | GPIO_126_I2C9_SCL | GPIO# and QUP# as Indicated by net name | | 10 | I2C_SCL_SEL | I2C SCL Selection Pin, Sets I2C Port J9 SW Mapping | | 11 | GPIO_125_I2C9_SDA | GPIO# and QUP# as Indicated by net name | | 12 | I2C_SDA_SEL | I2C SDA Selection Pin, Sets I2C Port J9 SW Mapping |
### JP3 - Port Connector J8, J9, J10 VTREF Selection Jumper | Connector | MPN | | --- | --- | | Board Connector | TSM-103-01-L-SV | | Mating Connector | 2-pin jumper | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | VREG_3P3V_LOCAL | 3.3V Option for Connectors J8, J9, J10 | | 2 | V_SEL_CONNS | Pin 1 VTREF for Connectors J8, J9, J10 | | 3 | VDC_5V_LOCAL | 5V Option for Connectors J8, J9, J10 | RED Jumper on Pins 1--2 or 2--3 ONLY, Default Shipped is 1--2 for ModalAI Compatability Switch to 2--3 for DroneCode Compatability [Top](#table-of-contents)
### JP4 - USB VBUS J11 Selection Jumper | Connector | MPN | | --- | --- | | Board Connector | TSM-103-01-L-SV | | Mating Connector | 2-pin jumper | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | VDC_5V_USB1_VOXL | VBUS Option, 2A limit, SW controlled by Voxl 2 GPIO_157 | | 2 | V_SEL_USB | J11 USB VBUS, Pin 1 | | 3 | VDC_5V_LOCAL | VBUS Option, 3A limit, direct from eFuse on Voxl 2 | RED Jumper on Pins 1--2 or 2--3 ONLY, Default Shipped is 1--2 for Voxl2 SW controlled option at 2Amps Switch to 2--3 to bypass software control
[Top](#table-of-contents) ### JP5 - PCA9685 I2C Flywire Access Header | Connector | MPN | | --- | --- | | Board Connector | TSM-103-01-L-SV | | Mating Connector | Individual jumper wires PRT-12796 | Color: Black | Pin | Net | M0144 Usage | | ----- | ------- | ------- | | 1 | I2C_SCL_PWM_LED_SEL | I2C Bus SCL for PCA9685, 1.8V CMOS | | 2 | I2C_SDA_PWM_LED_SEL | I2C Bus SDA for PCA9685, 1.8V CMOS | | 3 | DGND | System GND | **ONLY Connect I2C ports from 1.8V signals referenced to VREG_S4A_1P8, such as J14, J15, and J16. Do NOT connect from J9 signals.** If an Aardvark type of device is required, be sure to use J20 VREG_S4A_1P8 as the VTREF of the host device so there are no power domain conflicts. Refer to the Schematic, Sheet 8, D1 for details.
--- Source: https://docs.modalai.com/voxl2-dev-test-board-user-guide/ # VOXL 2 Developer Test Board User Guide ## Overview The VOXL 2 Developer Test Board (M0144) is the first of-its-kind plug-in expansion board that allows Hardware and Software developers of the VOXL 2 ecosystem to access and utilize all GPIO/QUP signals (and others) from J3 and J5. ### Hardware The VOXL 2 Developer Test Board (M0144) is a companion/test board that accompanies your VOXL 2 boards. It was designed with software and hardware developers in-mind. It was NOT designed with any Mechanical or Flight constraints (purposely large so you do not fly with it!). Prior to this design, there was always a risk that a specific GPIO or QUP port you wanted to use in your end application was not enabled, blocked, or just inaccessible for you to try out first. This created lots of risk both in Software and Hardware development cycles. The “B-Quad” (anecdotally the “Board to Board Breakout Board”) is our way to de-risk that scenario by allowing any hardware or software developer the option to try all potential signal and port mappings on their target hardware before committing to hardware PCB fabrication and/or software releases. This guide will help you understand how to use this hardware and why it was designed the way it was. **This design has a no RMA policy (non-returnable) due to the excessive handling and opportunities for damage or mis-wiring** Exceptions will be made on a case-by-case basis if we agree there is a defect with your particular unit. #### Component Arrangement The design of this board is for direct plug in to VOXL 2 J3 and J5 and allow for mounting hole alignment so that standoffs can be used to secure the boards together at a 5mm mating height. The High-Speed signals (USB and SD Card) are placed closer to the top so the signal lengths are minimized. We then made sure to place the signal access headers, J14, J15, and J16 with enough room to add clear silkscreen/labeling and allow for fingers to reach in and adjust jumper wires. All the translated/buffered signals are located at the bottom of the board with right-angle connectors so cables clearly egress away from the board for test equipment needs. The several jumpers on the board ware placed strategically where they are needed. For example, the USB VBUS power selection jumper JP4 is near the USB connector J11. The Connector VTREF selection jumper JP3 is placed down near all of the R/A connectors. Most jumper pins will come with 2-position shorting jumpers on them pre-set as indicated throughout these pages. We intended this design to be easy to view and use without the need for schematics, but of course, we still provide them for your use and understanding. #### Reading the Silkscreen As noticed here, ![m0144-cca](/images/voxl2-dev-test-board/m0144-hero-3d-top.jpg) a number or notation is placed next to each header pin in silkscreen, such as in the middle with "DGND, 16, 17, 18, 19, 0, 1, 2, 3, DGND" at J14. Note the pinouts for J14 net names correlate to these GPIO numbers. All pin 1's for every connector are noted with dots, and the dual row headers always count zig-zag. So, referencing the schematic for J14, notice pin 1 is DGND, pin 3 is GPIO_16_QUP6_L0, pin 5 is GPIO_17_QUP6_L1" and so on. For another example, refer to JP1 for the SPI port jumper (lower right of image). On the board, note the "RX", "TX", "CS", "SC", "MO", and "MI" markings. These correlate with the UART RX, UART TX, SPI_CS_N, SPI_SCLK, SPI_MOSI, and SPI_MISO signals respectively that are directly connected to the 1.8V side of the 1.8V-to-3.3V level translators. Then, using J8 (for SPI) and J9 (for UART), the 3.3V versions of these signals are exposed. #### LEDs Switches & Misc LEDs and switches are all called out here: ![m0144-led](/images/voxl2-dev-test-board/m0144-leds-sw-ics-mtg.jpg) The six power and VBUS LEDs are automatically ON when that respective power rail is active. All GPIO (or PCA9685) controlled LEDs are arranged in order of the connector J19. On the left, notice the labeling "OR", GR", "BL", "B", "R", and "G". The "OR/GR/BL" are the discrete (single) color LEDs, and the "BRG" is for the RGB LED DS1. This design also exposes a push button for Fastboot that is common across many of our debug boards, as noted above by SW3. Operation of this switch is documented here: https://docs.modalai.com/voxl2-connectors/#sw1---force-fastboot-button #### Selecting VBUS using JP4 As shown in the schematic snippet here: ![m0144-jp4](/images/voxl2-dev-test-board/VSEL_USB Jumper Info.jpg) the USB VBUS can be set as either sourced from the 2Amp 5V power rail direct from VOXL 2, J3 pin 16 (controlled by GPIO_157), or it can be sourced by the 5V supply on VOXL 2 VDC_5V_LOCAL. The benefit of one vs the other is up to the user as described here: https://docs.modalai.com/voxl2-dev-test-board-datasheet/#jp4---usb-vbus-j11-selection-jumper To change the setting, make sure the VOXL 2 (and entire system) is powered OFF, then remove the red jumper (provided) from position 1--2 and move it to position 2--3. #### Selecting VTREF on J8, J9, and J10 using JP3 As shown in the schematic snippet here: ![m0144-jp3](/images/voxl2-dev-test-board/VSEL_CONS Jumper Info.jpg) the pin 1 voltage of J8, J9, and J10 can be set as either 5V or 3.3V. The benefit of one vs the other is up to the user as described here: https://docs.modalai.com/voxl2-dev-test-board-datasheet/#jp3---port-connector-j8-j9-j10-vtref-selection-jumper To change the setting, make sure the VOXL 2 (and entire system) is powered OFF, then remove the red jumper (provided) from position 1--2 and move it to position 2--3. Note the signals on J8-J10 are ALWAYS +3.3V regardless of this jumper selection as observed in the schematic on sheet 5 with each translator device VCCB set as VREG_3P3V_LOCAL. #### Selecting an I2C bus for the PCA9685 using JP5 As shown in the schematic snippet here: ![m0144-jp5](/images/voxl2-dev-test-board/I2C Flywire Info.jpg) the only way to talk to the PCA9685 device is by connecting some I2C bus to this jumper. If you want a bus that is on one of the signal access headers, such as J15 pins 15 and 17 (I2C10), then simply use one of the flywire jumpers provided with the development kit to connect J15.15 (SCL) to JP5.1, and J15.17 (SDA) to JP5.2 and now the make sure QUP_10 is set up as I2C in software to talk to the PCA9685 device. If you require an external device, such as an Aardvark or other external hardware, then you must also connect a GND connection on JP5.3, and if the devices requires a VTREF to set the signals at 1.8V, use J20 as noted in the schematic. You may install a single pin jumper, or just directly solder a wire into that plated hole. #### Selecting specific QUPs for SPI, UART, or I2C on J8-J10 As shown in the schematic snippet here: ![m0144-jp1-2](/images/voxl2-dev-test-board/JP1-JP2 Usage Info.jpg) the 6-pin Board to Board connectors are shipped in the default mode as follows: | Connector | QUP Mapping (Default jumpers) | Set By | | ----- | ------- | ------- | | J8, SPI | QUP_17 | JP1: 1--2, 3--4, 5--6, 7--8 | | J9, UART + I2C | QUP_7 (UART), QUP_9 (I2C) | JP1(UART): 9--10, 11--12 JP2 (I2C)9--10, 11--12 | | J10 2I/2O | GPIO_124 (IN1), GPIO_131 (IN2), GPIO_144 (OUT1), GPIO_145 (OUT2) | JP2: 1--2, 3--4, 5--6, 7--8 | To change these settings, make sure the VOXL 2 (and entire system) is powered OFF, then remove the specific JP1/JP2 jumpers you need and flywire in the signals you need from J14-J16 or JP1/JP2 cross-wise. For example, if you want to change the UART port on J9 from QUP_7 to QUP_11; - Make sure the VOXL 2 (and entire system) is powered OFF - Remove JP1 jumpers from 9--10 and 11--12 only - Locate GPIO_62 and GPIO_63 on J15, pins 12/14 respectively (use the QUP Lane mapping table in the Schematic on Sheet 4 to help you map L0, L1, L2, and L3 to each QUP function as explained in the Hardware User Guide) - Fly wire from J15.12 (TX) using one of the PRT-12796 jumpers provided to JP1.10. - Fly wire from J15.14 (RX) using one of the PRT-12796 jumpers provided to JP1.12. - Power ON your system, and set your software now for QUP_11 in UART mode. - J9 UART pins (pin 2 and 3) is now set as QUP_11 and at 3.3V CMOS signals! #### J8-J10 Cross-QUP Modes The QUP ports J8-J10 can support **limited** cross-functional port types. For example, the 2I/2O port can easily support UARTS. Simply map the TX to the OUT pins, and RX to Input pins following similar steps above for changing QUP ports. Vice-versa, the UART port can become a 3rd pair of input and output signals. However, the I2C port is limited to I2C and only slow signals such as GPI/GPO due to the driver types. Edge rates are slowed dramatically due to the I2C translators, and do not expect fast data port functions, such as Fast-UART or SPI on J9.4/J9.5 The SPI port can also be re-mapped as other functions, but note the directions on each pin and be aware that if you push a UART into J8, the RX and TX pins will not map up correctly with all ModalAI connectors. SPI is 3 outputs and only 1 input, as shown in the schematics. By providing the schematics for this design, you are free to use this board as you need and have full access to part numbers of each IC so you can validate use cases we did not plan for. You assume all responsibility for operating it out of the intended modes. ### Software This board is pure hardware and has no micro-controller or other device requiring software programming (Flash memory) on it. All software is executed on VOXL 2. The PCA9685 device is a very common and well-known part for I2C-to-PWM generation and many open-source drivers are available for it. Our Developer guide will get into more details how to use that part. This section will focus more on the hardware configuration. --- Source: https://docs.modalai.com/voxl2-dev-test-board-developer-guide/ # VOXL 2 IO Developer Guide ## Overview The VOXL 2 Developer Test Board (M0144) is the first of-its-kind plug-in expansion board that allows Hardware and Software developers of the VOXL 2 ecosystem to access and utilize all GPIO/QUP signals (and others) from J3 and J5. TO DO --- Source: https://docs.modalai.com/expansion-design-guide/ # Expansion Hardware Design Guide This hardware design guide is intended for engineers who are comfortable designing and manufacturing custom PCBAs. The focus of this guide are PCBs that plug directly into a VOXL's board to board connector. Details on VOXL 2's board to board connector can be found on the [VOXL 2 Connectors](/voxl2-connectors/) page. ## VOXL 2 Custom Expansion PCB An example add-on board for VOXL 2 with reference Altium schematic package can be downloaded [here](https://storage.googleapis.com/modalai_public/modal_drawings/VOXL2_PLUGIN_STARTER_KIT_REVA.zip) For those without Altium, if you cannot get an online conversion or the 30-day trial period to work for you, here is another zip file of the generated outputs (SCH, BOM, 3D Step, ODB++, and an ASSY drawing with all relevant dimensions): [Altium Generated Outputs](https://storage.googleapis.com/modalai_public/modal_drawings/VOXL2_PLUGIN_STARTER_KIT_REVA_OUTPUTS.zip) When designing a custom expansion board, please be aware of these pointers: - We will review your schematic as a courtesy. Please reach out and we will coordinate so you are not posting your IP on a public facing portal/forum. To make the review quick, provide: - a searchable PDF - all items annotated, with correct page numbers - off-page references if the schematic spans multiple pages - capacitor and resistor ratings visible (voltages, power, values) - a simple block diagram of what the design does - Not all GPIOs are created equal. There is a risk that some of your intended GPIO assignments may not work as expected. - - The Snapdragon SoC is a very complex chip with many cores in it. Some of these cores can "claim" GPIOs making them unavailable to the Linux kernel. We try to check for these ahead of time, but are not able to assess all possible combinations, so this [Linux User Guide](/voxl2-linux-user-guide/) shows what has already been validated on various SW builds. If you contact us ahead of time, we can check specific ones and try to make sure the SW is ready for it or if your application should select a different GPIO/Port - Explore this breakout board for J3 & J5 [here](/voxl2-dev-test-board/) for the best way to validate your desing before you tape-out. ## Expansion Hardware Architecture ### J3/J5 Expansion ModalAI designed the J3 (60-pin "Legacy B2B") and J5 (120-pin "High-Speed B2B") with many use cases in mind. We took the success of the Voxl/Voxl-Flight 60-pin B2B (J13 in that board) used for LTE Modem and Microhard expansion, and took it to another level of expandability by incorporating J5. It is important to note that we explored using a 120-pin version of the same Samtec QSH/QTH series connector for this expansion, but we could not fit all of the incredible Voxl2 features we needed while doing so, so we had to use a higher density and different family of connectors from Samtec using the ADF/ADM line in order to meet all of the needs. ![J13-to-J3](/images/hardware-design-guides/j13_compared_to_j3.jpg) Please review these pinouts as needed: [https://docs.modalai.com/voxl2-connectors/](/voxl2-connectors/) 1. J3 on Voxl2 is in almost every way identical to J13 on Voxl. Any design that plugs into Voxl/Voxl-Flight J13, will electrically be safe to plug into Voxl2. All power and GND signals, along with critical debug and boot control signals map up (and the location of Voxl2's mounting holes relative to J13 are the same relative to J3). So, if you bought a debug or fastboot adapter or LTE modem for Voxl/Voxl-Flight, it will still work exactly the same on Voxl2!! - Just be careful to manage the potential contact of J5 to the bottom of your "legacy" board, such as M0048 (Microhard) where we have heard of instances of J5 pins contacting the bottom of the Microhard design, triggering a reset. We have a forum post on this where we recommend placing Kapton tape over J5 in these cases, and be sure to use 5mm standoffs between the boards to prevent any "diving board" issues. 2. We made three key changes to J3 relative to J13 - We converted several sparsely used signals from J13 on Voxl into the USB3 Super-Speed signals to allow USB3 speeds on the Voxl2 platform with just J3 (no need for J5 in most USB expansion use-cases) - We dedicated some of the former BLSP pins into an SPI and extra UART (see below for an explanation of QUPS) - And the 5V Power (see next section) ### 5V Power IN vs 5V Power-Out The 5V on pins 2, 4, and 6 are now dedicated as OUTPUT ONLY. On Voxl/Voxl-Flight, the direction of this power was loosely defined which allowed for some limited test boards to power Voxl. However, it was not designed for the 6A support Voxl2 really needs on power-up, so we came up with a different scheme for 5V as follows: - J5 VDCIN_5V is **5V INPUT Only** to the Voxl2 system (as an alternative to J4) - J3 VDC_5V_LOCAL is **5V OUTPUT Only** from the Voxl2 system. Here is a diagram explaining our power system on Voxl2: ![V2-Power](/images/hardware-design-guides/voxl2-power-diagram.jpg) - - If you try to power into J3, the board will not boot. It is protected by an eFuse that requires power in from J5 or J4 only. - - This eFuse validates the 5V input is within range (we can tolerate accidental insertion up to 12V "verified by test" and 17V "by design"), and there is no short downstream on the VDC_5V_LOCAL. Therefore, we will always recommend if your design provide power to Voxl2 VDCIN_5V on J5, then you should use the VDC_5V_LOCAL from J3 for your 5V peripherals, since you now have the confidence it is protected and guaranteed to be valid if present. Also note in the diagram, if the VDCIN_5V is not good, the eFuse keeps the primary "VBAT" power rail off, and the VREG_3P3V_LOCAL power OFF as well. This decision does not impact any previous product from ModalAI, other than some of our own internal test hardware. So why did we do that? We wanted to ensure customers had a reliable and clear way to treat Voxl2 as a "SOM" (System on Module) or to provide power from their dedicated Power Distribution Boards (PDB). - In the case of a "SOM" approach, Voxl2 can be plugged into a host system via J3 and J5, and that host system will provide power to Voxl2 using J5 instead of the primary input connector J4. - Voxl2 is still the main system component, but some customers do not want to use our Power Module, and are already designing a plug-in board, so there is an option to consolidate hardware by incorporating the power module functions directly into the expansion board. ### Power Tap-Offs and their limits As noted above, the 5V rail has special features that require attention. Additionally, we provide a range of other voltage options for your plug-in board, eliminating the need for additional power regulators—saving you effort, space, and cost. Refer to the diagram above to see the available voltages for plug-in boards: - VREG_3P3V_LOCAL (3.3V) - VPH_PWR (3.8V) - VREG_S4A_1P8 (1.8V) The table below illustrates the load limits for these voltage rails. These voltages are available at various connectors on VOXL 2, including the J3/J5 expansion, Camera Groups, and multiple JST connectors: ![V2-Power-taps](/images/hardware-design-guides/power-tap-off-limits.jpg) The convention for connector locations used in the table is "netlist" style, where J3.53 means connector J3 pin #53, and so on. ### FORCE_USB_BOOT and EDL Mode J3 pin 56 is the `FORCE_USB_BOOT` signal (`SDM_FORCE_USB_BOOT` in the [J3 pinout](/voxl2-connectors/)). It is weakly pulled down by default inside the SoC. To force the QRB5165 into Emergency Download (EDL/QDL) mode for recovery, connect a 2 kOhm to 2.2 kOhm pull-up from J3 pin 56 to VREG_S4A_1P8 (J3 pin 47). This is what the SW2 EDL switch on VOXL 2 does: in the default OPEN/OFF position it does nothing, and in the ON position it connects the pull-up. An expansion board can provide the same function with a switch or jumper in series with a 2 kOhm to 2.2 kOhm resistor between J3 pin 56 and J3 pin 47. No pull-down is needed. The recovery procedure itself is described on the [VOXL 2 Unbricking](/voxl2-unbricking/) page. ### QUPS, The Key I/O Groups for Expansion A QUP is a specific set of four GPIOs that have alternate functions underneath the hood enabling the group to work as an I2C bus, a UART port, or an SPI port. In total, there are 20 QUPs on the QRB5165. On Voxl2 and Voxl2-Mini we use many of them direct on-board, and make the rest of them available to customers for expansion purposes. The Software team has done a great job explaining how to use these in SW (and which ones are already enabled) in this section here: [QUP Software](/voxl2-qups/) Understanding these QUPS and how to use them is paramount to your custom HW design's success, so this section here should demystify how to use them correctly. When the group of GPIOs is assigned as a QUP (Qualcomm Universal Peripheral), it is assigned a "Lane" number, from 0:3. That lane number determines what function each GPIO maps to, according to the table shown here: ![Qup-map](/images/hardware-design-guides/qup_mapping.jpg) All users must be aware of a few key things and constraints for these QUPs: 1. They are set in software through a "trust-zone" image, and therefore cannot be changed on-the-fly, for example from UART to SPI. If the platform image is set for SPI, it is always an SPI with that image. 2. All QUPS are still fundamentally four GPIOs, so if a QUP is not needed, it is possible to use them as their primary GPIO (usually we indicate the GPIO # in the signals's net name) 3. Once a QUP is defined as one function, it can only be that function. For example, as shown in the table above, the I2C lines and 2W UART lines are distinct. On earlier versions of Qualcomm chipsets with BLSPs, this type of dual "2W UART + I2C" mode was possible. However, in the QRB5165, a QUP can only be a UART or only be an I2C, it cannot be both I2C + UART. I2C + 2-GPIOs is possible, and UART + 2-GPIOs is also possible. 4. ModalAI does not support all possible combinations of QUPs. This would be a monumental task, and technically, this would have 4^20 possibilities. So please understand that we hope your application can work within our proven and validated modes as indicated on the software support page linked above. 5. All Board to Board connector signals are at 1.8V. J3, J5, J6, J7, and J8 all have QUPS on them. Each one is always 1.8V natively and are direct to the QRB5165 without any buffers/translators. We provide VREG_S4A_1P8 (1.8V VDDIO) which is their VDD domain. This is useful for any voltage level translation needed to interface to 3.3V or 5V systems. Here are a couple of examples of QUPs and how the hardware on Voxl2 defines them. This snapshot is from our brand-new **"B-QUAD" Test Board (M0144)** which will be available for sale soon. We will post all schematics and PCB info for this design making it a very valuable tool for all hardware and software developers. The B-QUAD will expose **every GPIO**, SD card signals, USB, and the Power signals and allow remapping to connectors set for either I2C, UART, SPI, or just plain GPI/GPOs. We even have an I2C to PWM device for RGB/LED/PWM control. Check back soon!! ![Qup-example](/images/hardware-design-guides/qup_example.jpg) In the above image, we show a portion of the J5 mating connector on the B-QUAD. The pinout matches the previously linked Voxl2 connector pages. When ModalAI specifically identifies a QUP as a function, such as I2C or SPI, we like to include that as part of the name for clarity. Therefore, The conventions we follow for signal/net names is as follows: - GPIO_xyz_(Function or QUP#)_(Lane or specific signal) - - GPIO_115_I2C2_SDA for example, is GPIO_115, and part of QUP2, and we expect it to be set as I2C, specifically SDATA - - GPIO_16_QUP6_L0 for example, is GPIO_16, and part of QUP6, and we have not explicitly defined it as a QUP, hence it is just defined as "Lane0" and can be either CTS, SDA, or MISO - If a GPIO is not part of a QUP, we just list it as GPIO_xyz - - GPIO_153, GPIO_152, etc, are not part of a QUP, so they are just GPIOs (some may have other alternate functions which we can explain later). - When we define a signal as I2C, we include a 2.2K-ohm pullup on Voxl2 to VREG_S4A_1P8. For example, **the following I2C busses already have 2.2K pullups on Voxl2**: - - QUP_2 (GPIO_115/116) - - QUP_4 (GPIO_8/9) - - QUP_8 (GPIO_24/25) - - QUP_9 (GPIO_125/126) - - QUP_10 (GPIO_129/130) - - QUP_18 (GPIO_56/57) - If you need to define a generic QUP, or one defined already as a UART or SPI into an I2C, be sure to include pull-ups on your hardware design to VREG_S4A_1P8 before any translation buffers. ### I2C Translation Important Note * All I2C ports on the JST Board-to-Cable connectors (J19 on VOXL 2 and VOXL 2 Mini plus ModalAI Plug-in Boards such as M00130 & M0090) use a TCA9517 to translate and buffer the I2C from the Snapdragon SOC 1.8V to 3.3V logic levels. * The expectation is that these ports go directly to an accesory target device without further translation back down to lower voltages. For example; a micro-controller running at 3.3V native I/O levels. The TCA9517 cannot operate "B-port to B-port" and therefore if your system requires translating back down to lower voltages, such as 1.8V or 2.5V, a special un-buffered I2C translater will be required such as the PCA9306 or PCA9509. * If you are designing a plug-in board and planning on using level translators to convert the 1.8V I2C signals to another voltage, please keep this important design constraint in-mind. With all of the constraints applied to these QUPS, we always ask that you check the [Linux User Guide](/voxl2-linux-user-guide/) and [QUP Software](/voxl2-qups/) pages often for your expected use case, and as always, contact us on the [Forum](https://forum.modalai.com/category/26/voxl-2) for any clarification. ### QUP I2C vs CCI_I2Cs It is vitally important every user understands that the MIPI CSI I2C ports, referred to as CCI I2C ports, are **not traditional QUPs**. Do not plan on using a CCI_I2C bus for general purpose I2C usage. These I2C ports are specialized with direct access to the camera infrastructure, and cannot be executed as standard I2C ports through the Linux Kernel. The following signals noted in the Voxl2/Voxl2-Mini user guides are the signals dedicated as "CCI" I2C ports, and must only be used for image sensor applications: - CCI_I2C0_SDA/SCL - CCI_I2C1_SDA/SCL - CCI_I2C2_SDA/SCL - CCI_I2C3_SDA/SCL These CCI I2C ports have VDDIO rails referenced to the power rail PM8009_VREG_L7_DOVDD_1P8 (J6-J8, pin 6). There are already 2.2K-Ohm pullups on Voxl2/Voxl2-Mini for these I2C ports. ### USB EXPANSION OVER J3 & J5 The "secret sauce" to ModalAI Ecosystem expansion is based on USB over the J3 connector. Before starting off trying to design your own expansion (or for just a better understanding of our hardware designs), please review this section for how USB works on Voxl2, and how we use it to extend main-board support (Voxl/Voxl-Flight/Voxl2/Voxl2-Mini) to many radios and modems. This is not intended to be an explanation of how USB works, but rather how we use USB in our hardware designs. If not already familiar with USB operations, please start with this basic wikipedia link then come back to review this section: [https://en.wikipedia.org/wiki/USB](https://en.wikipedia.org/wiki/USB) The Voxl2 USB Architecture is shown in this simple block diagram: ![USB-Arch](/images/hardware-design-guides/Voxl2-USB-Architecture.jpg) - USB-Type C (J9), which is the primary ADB/Programming Port for Voxl2 is seen on the left side going into the QRB5165's USB-Port0. - - The charging functions of this port are disabled, which leads to a hardware limitation of it not supporting true OTG modes. This is why Voxl2 (M0054) is only capable of acting in peripheral mode - - We changed that on Voxl2-Mini (M0104) and are going to change that on a future spin of Voxl2 (TBD) so that it works in Host Mode - The second USB port on the QRB5165 is shown on the top-right of the diagram, noted as USB1 3.0 (port 1, supports USB3.0 rates). - - As shown, this port, which **operates exclusively in Host mode**, is brought to the "Legacy" B2B connector J3. From this foundational concept of the Host Only port residing on J3, it becomes clear how we achieve the bulk of our expansion using these B2B connectors. #### ModalAI USB Hub Example We will show an example hub architecture that we use on several designs. This will be useful to explain how we achieve the bus expansion and how we implement the various VBUS current limits throughout our diverse ecosystem of products. This will help any hardware designer learn how to match (or exceed) our designs where needed for your system constraints. We understand that not all system architecture constraints can be met with our designs, so with this knowledge of our implementation, you can enable your design to support what your system needs while maintaining compatibility in our ecosystem. An example USB Hub Design from J3 is shown in this simple block diagram (you can see similar diagrams on our Microhard and 4G datasheet pages): ![USB-Hub-Example](/images/hardware-design-guides/Basic-USB-Hub-Architecture.jpg) This block diagram shows these three key things vital to every USB hub based design: 1) Up-stream vs down-stream ports 2) VBUS detection 3) VBUS power delivery - Note most importantly that the hub connects the up-stream facing port directly to J3. In this case, we only show USB2 for a Voxl/Voxl-Flight, but this applies to the USB3 lines from Voxl2 as well. - - On Voxl2, with USB3, make sure to connect the Hub TX to the Voxl2 port’s RX, and vice versa. You also **need to include AC caps on BOTH RX/TX ports** since there are no TX caps on Voxl2. Our M0144 expansion design schematic will illustrate this too. - - We already provide ESD protection and Common Mode filters on the USB2&3 lines on Voxl2, so there is no need to add in your own on the up-stream side. In fact, adding in more can break the interface. - - Do not want to use a Hub? No Problem, just bring the J3 signals VBUS, D+, D-, and a GND to a connector. Done. We do that on M0144 B-Quad test board. - Next, note the hub’s VBUS detect. Every hub is different, but we use the VBUS from the J3 connector (divided down typically to meet 3.3V input levels) to indicate to the hub when it is time to enumerate. Every hub that we know of has an equivalent function, and it is important to use the VBUS from J3 for this purpose or enumeration with Voxl2 can be flakey or problematic. - - There are also various ways to issue a reset, and we provide a dedicated signal for USB_RESET that you can use if your application SW wants to trigger a hub reset. GPIO_131, as noted in the Connectors Page of Voxl2, is dedicated for this purpose. Please note it is an **ACTIVE HIGH** signal (HIGH = RESET) therefore, if your hub is active LOW, you will need to invert it. On our designs, we qualify this reset along with power good monitors to make sure reset is only released if power is good. - - All downstream ports are then capable of being brought to a connector as shown. These are how we cascade multiple USB peripherals from our plug-in boards. - VBUS sourcing is also very important. Again, only you know your system constraints. We will do our best to communicate how our hardware works so you can determine if it meets your needs. - - The VBUS from Voxl2 is capable of sourcing 2A (Total). Even though the Samtec QSH/QTH pin specs are rated for 1A, we have a circuit on Voxl2 that can provide double that to that pin. You are free to use it as 2A as we do with extra thick routing right at each pin to help alleviate the 1A pin spec limit. - - If you need more than 2A, you can alternatively provide the 5V output from J3’s **“VDC_5V_LOCAL”** (shown as VDCIN_5V in the above diagram due to a Voxl1 based design, refer back above about the 5V input vs Output of Voxl1 vs Voxl2) and use that to source your VBUS. - - As shown in the diagram, we use dedicated USB power switches to provide VBUS power to each downstream connector. On all ModalAI hub based designs, every USB downstream port has a dedicated VBUS switch on it to set a limit and detect shorts or malfunctions on the port. We show a table just below that lists every design we have (so far) and for each port, what it’s VBUS limit is. Here is a zoom in image of that function for better clarity: ![USB-VBUS-Switch](/images/hardware-design-guides/USB-Power-Control.jpg) - - Fundamentally, on Voxl1/Voxl-Flight based designs, we limited this to a nominal USB2 port, with 500mA limits. On Voxl2, we increased that limit to support higher current devices (such as Boson, Doodle, etc) and made sure that every port is at least capable of delivering 1A at 5V. - - Voxl2-Mini is capable of providing 900mA on VBUS to match typical USB3 specs - - Make sure you review the device spec and application notes for your hub for how to implement power control switches. Most of them have minor nuances between them that can impact reliable operation. This table shows a comprehensive listing of all our USB Hub Based designs and what the VBUS current limits are: ![USB-VBUS-Limits](/images/hardware-design-guides/USB-VBUS-Limits-by-Design.jpg) Please take note of the footnotes highlighting some limitations to these numbers. For example, not all ports can be maxed out at the same time, and if inherently the upstream port is USB2, the USB3 connectors will still enumerate as USB3 with the hub, but be bandwidth limited to the upstream host by USB2 speeds. The connector formats are referring to ModalAI's designation of the 4-pin JST GH for USB3, and the 10-pin JST GH for USB3. The pinouts are indicated on each relevant design connector pages and are the same on all platforms (we never had an alternate USB pinout, nor will we). ### PCIe using the High-Speed Board to Board (J5) Connector VOXL 2 implements a 2-lane PCI Express (PCIe) interface compliant with PCIe Base Specification Revision 3.0, operating at a data rate of 8.0 GT/s (Gigatransfers per second) per lane. Key Features: - PCIe Gen 3.0 Compliance: Supports 8.0 GT/s data rate with efficient 128b/130b encoding. - 2-Lane Configuration: Uses two transmit and two receive differential pairs, providing an aggregate bandwidth of 2 GB/s per direction. - AC Coupling on TX Lines: Includes 0.22 µF AC coupling capacitors on TX (transmit) lines to ensure DC isolation and compatibility across varying device bias levels. These capacitors are placed close to the transmitters on VOXL 2 for optimal signal integrity. - - Note: When pairing VOXL 2 with a PCIe target device, be sure to check TX (Output) vs RX (input) directions. Some module vendors swap notations based on whether the HW is a host or target device. In these cases, it is easier to keep track of Inputs vs Outputs and make sure your design includes AC caps on your TX (Outputs) and connect to the VOXL 2 RX (Input) pins. - - REFCLK does not use AC caps as per PCIe Spec (the REFCLK is DC coupled), but systems requiring DC isolation may require it at your discretion. - Impedance Control: All differential pairs are impedance-controlled to 85 ohms to ensure signal integrity and compliance with PCIe standards. - Length Matching Requirements: - - _M/_P skew within each differential pair must be less than 0.7 mm. - - The length difference between the TX and RX signal paths must be within 20 mm to minimize timing mismatches. - Signal Pinout: The PCI Express signal pinout follows the conventions specified in the [ModalAI VOXL 2 J5 Connector Documentation](/voxl2-connectors/#j5-pin-out) A simple block diagram showing the usage for PCIe is illustrated here: ![pcie-main-arch](/images/hardware-design-guides/pcie-main-arch.jpg) - Sideband GPIO Lines: - - WAKE_N (GPIO_87): Input to VOXL 2, used to signal wake-up events. This signal requires special consideration for voltage translation to ensure compatibility with VOXL 2's input voltage levels. - - CLK_REQ_N (GPIO_86): Input to VOXL 2, serves as the clock request line for power management. Like WAKE_N, this signal also requires voltage translation to align with VOXL 2's input requirements. - - PERST_N (GPIO_85): Output from VOXL 2, used to initialize the PCIe interface by resetting the target device. This signal requires signal translation to match the voltage requirements of the connected target device. > VOXL 2 GPIOs operate on the VREG_S4A_1P8 power rail (1.8V). All buffer translation for WAKE_N, CLK_REQ_N, and PERST_N must use VREG_S4A_1P8 from the J5 connector to ensure proper voltage compatibility. The following example of sideband signal translation is directly from the [ModalAI M0183 PCIe adapter design](/m0183/). Different parts or translation/isolation schemes may be required based on your target device, but in particular pay careful attention to open-drain and push-pull signal types and target voltage levels as listed in the corresponding specifications. Both M.2 and Mini-PCIe electro-mechanical specifications have allotments for module vendors to be flexible with certain I/O configurations and can impact your plug-in board's functionality if not done correctly. ![pcie-sideband](/images/hardware-design-guides/pcie-sideband-signals.jpg) When planning on a PCIe based design, it is important your software team reaches out to us on the Forum for driver support verification. As of [VOXL SDK version 1.4](/voxl-sdk/) there are very few supported PCIe devices for VOXL 2. You may need to plan on developing your own drivers for your targeted PCIe device. If you have any questions about our designs, or how to make your own, contact us on the [Forum](https://forum.modalai.com/category/40/pcb-design-reviews). ** MUCH MORE TO COME, CHECK BACK OFTEN*** --- Source: https://docs.modalai.com/pcb-catalog/ # PCB Decoder Ring | NUMBER | DESCRIPTION | WEIGHT | 3D Model | BUY | DATASHEET | |--:----------|--:-:----------------------------------------------------------------|--:-:---------------------------|--:-:---------------------------------------------------------------------------------------------------------------------|--:-:----------------------------------------------------------------------------------------------------------------------------|--:----------------------------------------------------------------------------------------------------------------| | M0006 | VOXL | 16.51g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0006_PCB_3D_STEP.zip) | [Buy](https://www.modalai.com/pages/voxl) | [Datasheet](/voxl-datasheets/) | | M0007 | EOL - Flight Core REV A | | | | | | M0008 | Flex VOXL Interposer DFT36/24 | 0.8g | | [Buy](https://www.modalai.com/products/m0074) | | | M0009 | EOL - APM V2 | | | | | | M0010 | Stereo Flex 36/24/24 | 0.87g | | EOL | [Datasheet](/M0015/) | | M0011 | NOT IN PRODUCTION | | | | | | M0012 | EOL - Microhard Modem using LAN7850 | | | | | | M0013 | NOT IN PRODUCTION | | | | | | M0014 | VIO OV7251 Tracking Image Sensor | 0.51g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0014%20Tracking%20Camera.STEP) | EOL — see [MSU-M0166](https://www.modalai.com/products/msu-m0166) | [Datasheet](/M0014/) | | M0015 | Stereo Image Sensor OV7251 | 0.41g | [PDF](https://storage.googleapis.com/modalai_public/modal_drawings/M0015_2D_11-02-21.pdf) | | [Datasheet](/M0015/) | | M0016 | NOT IN PRODUCTION | | | | | | M0017 | Serial / USB / Fastboot Debug Board | 4.83g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0017_STEP_FILE.step) | EOL | | | M0018 | Flight Core | 6.13g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0018_122721.stp) | EOL | [Datasheet](/flight-core-datasheet/) | | M0019 | VOXL Flight | 24.5g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0019_VOXL-Flight.zip) | EOL | [Datasheet](/voxl-flight-datasheet/) | | M0022 | PWM Breakout Board (3row header) | 4.17g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0022_A.step) | [Buy](https://www.modalai.com/products/flight-core-pwm-output-cable-and-break-out-board?_pos=1&_sid=b8a0734b1&_ss=r) | | | M0024 | IMX214 High-res Image Sensor (10x10x16mm) | 3.79g | | EOL | [Datasheet](/M0025/) | | M0025 | IMX214 High-resolution (8.5x8.5x5mm) | 0.83g | | EOL — see [MSU-M0161](https://www.modalai.com/products/msu-m0161) | [Datasheet](/M0025/) | | M0026 | IMX377 m12 Wide Angle | 8.57g | | EOL | [Datasheet](/M0025/) | | M0027 | EOL - ESC 4in1 Gen 2.5 | | | | | | M0030 | LTE Add-on v2 (Sierra Wireless) | 8.24g / 14g (with modem + lid) | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0030_REVA_WP_Socket_with_lid.stp) | EOL | [Datasheet](/lte-modem-and-usb-add-on-v2-datasheet/) | | M0034 | VOXL-TRAY for VOXL Flight Deck | | | | [Datasheet](/flight-deck-datasheet/) | | M0036 | Image Sensor Extension 14.5cm | 0.62g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0036_145mm.stp) | [Buy](https://www.modalai.com/products/m0036) | [Datasheet](/M0036/) | | M0037 | Interposer for Auvidea B102 to VOXL | | | | | | M0038 | Mezzanine Gen 1 - Stereo, IMU, Tracking connector | 5.65g | | | | | M0039 | Wide Stereo Flex | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0039_O21422A.STEP) | | | | M0040 | TOF cable | 0.59g | | | | | M0041-1 | APM LITE (5V, 12AWG XT60 Cables) | 34.72g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0041_REVB_CCA_ONLY_NO_WIRES.stp) | | [Datasheet](/power-module-v3-datasheet/) | | M0041-5 | APM LITE (5V, No Cables Soldered) | 4.81g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0041_REVB_CCA_ONLY_NO_WIRES.stp) | | [Datasheet](/power-module-v3-datasheet/) | | M0042 | FRAMOS IMX296 Interposer | 2.27g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/FSM-IMX296M_v1b.step) | | | | M0045 | UART Splitter - Horizontal | | | | | | M0046 | ICM42688 Breakout Board | | | | | | M0047 | NOT IN PRODUCTION | | | | | | M0048 | Microhard Modem LAN7500 | 14.81g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0048_MICROHARD_WITH_SOCKET_LAN7500.stp) | | [Datasheet](/microhard-add-on-datasheet/) | | M0049 | ESC 4in1 rev B | 10.28g / 9.5 no wires | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0049_ESC_4_IN_1_REVB_CAM_FINAL_20200610.stp) | [Buy](https://www.modalai.com/collections/electronic-speed-controls) | [Datasheet](/voxl-esc-datasheet/) | | M0052 | RB5 Flight SOM Carrier PCB | 24.87g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0052_RB5_FLIGHT_REVA.step) | | [Datasheet](/Qualcomm-Flight-RB5-datasheet/) | | M0054 | VOXL 2 | 16g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0054_VOXL2_PVT_SIP_REVA.step) | | [Datasheet](/voxl2-datasheets/) | | M0059 | Microhard pMDDL900, pMDDL1621/4 Add-on | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0059_Rev-A_052421A.stp) | [Buy](https://www.modalai.com/collections/voxl-add-ons/products/voxl-microhard-modem-usb-hub) | [Datasheet](/microhard-add-on-datasheet/) | | M0061 | FRAMOS Flexible FSM Interposer ("FFF") | 2.29g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0061_CCA_3D.stp) | | [Datasheet](/M0061/) | | M0062 | VOXL2 breakout w/ debug (upgrade for M0017) | 15.46g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0062_VOXL2_DEBUG_REVA.step) | | | | M0064 | Voxl-2 DF40C to Voxl AXT Image Sensor Adapter | | | | | | M0065 | VOXL 2 IO - UART to PWM/S.Bus board | 4g | | | | | M0067 | VOXL2 5G PCIe Modem Carrier Board with Debug | 13.22g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0067-mechanical-drawing%20v1.pdf) | | | | M0068 | VOXL - M0006 Refresh for EOL and maintainability | | | | | | M0069 | VOXL - M0019 Refresh for EOL and maintainability | | | | | | M0070 | Mini-STM TOF board (VL53L1CX) | 0.13g | | | | | M0072 | MD102A Replacement | 0.38g | | EOL — see [MSU-M0166](https://www.modalai.com/products/msu-m0166) | | | M0073 | Color stereo sensor OV9782 | 0.53g | | | | | M0074 | Image Sensor Extension Flex - 60mm | 0.35g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0074_112222.stp) | [Buy](https://www.modalai.com/products/m0008) | [Datasheet](/M0074/) | | M0076 | VOXL-2 DF40C to VOXL AXT Image Sensor Adapter + Power Fix version 2 | 0.59g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0076_112222.stp) | | [Datasheet](/m0076/) | | M0078 | VOXL Serial / USB / Fastboot Debug Board Ver 2 | 3.14g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0078-2_FINAL.step) | EOL | [Datasheet](/usb-expander-and-debug-datasheet/) | | M0084 | VOXL-2 DF40C to VOXL Y-AXT Flex | 1.52g | | [Buy](https://www.modalai.com/products/msu-m0084) | [Datasheet](/M0084/) | | M0085 | Respin of M0038-1 mezzanine for Flir, RGB LED | 5.91g | | | | | M0086 | Chirp Adapter for RB5 Flight | 3g | | | | | M0087 | Flight Core v2 / H7 | 6g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0087-050922.stp) | | | | M0088 | Color stereo sensor OV9782 | 0.68g | | | | | M0089 | IR LED Board + Driver board | | | | | | M0090 | M.2 USB2.0/3.0 adapter board for VOXL/VOXL2 5G modems | 12.8g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0090_DUAL_VOXL_5G_M.2_REVA-3-01-V2-QUECTEL.step) | [Buy](https://www.modalai.com/products/mdk-m0090) | [Datsheet](/5G-Modem-datasheet/) | | M0091 | OV9281 VIO Tracking Modules | 2.13g | | | | | M0092 | NOT IN PRODUCTION | | | | | | M0093 | NOT IN PRODUCTION | | | | | | M0094 | RB5 Flight Spektrum Binding Module | | | | | | M0104 | VOXL 2 Mini | 11.0g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0104_VOXL2_MINI_V1_REVA.step) | [Buy](https://www.modalai.com/products/voxl-2-mini) | | | M0107 | IMX412 RGB Rolling Shutter with IR Filter | 7.5g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0107-m12.STEP) | EOL — see [MSU-M0161](https://www.modalai.com/products/msu-m0161) | [Datasheet](/M0107/) | | M0113 | Color stereo sensor (OV9782) | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0113_720pGlobalShutter.STEP) | | | | M0117 | ESC 4in1 rev B / Alternate to M0049 | 10.28g / 9.5 no wires | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0117_ESC_4_IN_1_AD_REVA(-1_MAIN).step) | [Buy](https://www.modalai.com/collections/electronic-speed-controls) | [Datasheet](/voxl-esc-datasheet/) | | M0125 | USB3 UART Expansion Board | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0125_A.step) | [Buy](https://www.modalai.com/products/m0151?variant=40740708876339) | [Datasheet](/m0151/) | | M0129 | ESC Micro 4-in-1 | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0129_ESC_4_IN_1_MICRO_20230222_FINAL.stp) | [Buy](https://www.modalai.com/products/voxl-esc-mini) | [Datasheet](/voxl-mini-esc-datasheet/) | | M0130-1 | VOXL 2 LTE Add-on | 11.3g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0130_LTE_V2_PRO_REVA_V3(M0130-3-V2).step) | [Buy](https://www.modalai.com/products/m0130-3) | [Datasheet](/lte-io-breakout-usb-hub-datasheet/) | | M0134-1 | ESC 4in1 rev B / Alternate to M0049, M0117 | 10.28g / 9.5 no wires | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0134_ESC_4_IN_1_32_REVA.step) | [Buy](https://www.modalai.com/collections/electronic-speed-controls) | [Datasheet](/voxl-esc-datasheet/) | | M0135-1 | VOXL 2 and VOXL 2 Mini Dual Image Sensor Adapter | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0135_simple.STEP) | [Buy](https://www.modalai.com/products/mdk-m0135) | [Datasheet](/M0135/) | | M0136-1 | TBD WiFi VOXL/VOXL2 + EXT ANT | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0136-1_A.step) | [Buy]() | [Datasheet]() | | M0136-2 | TBD WiFi STANDALONE + EXT ANT | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0136-2_A.step) | [Buy]() | [Datasheet]() | | M0136-3 | TBD VOXL/VOXL2 + CHIP_ANT_VER | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0136-3_A.step) | [Buy]() | [Datasheet]() | | M0136-4 | TBD STANDALONE + CHIP_ANT_VER | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0136-4_A.step) | [Buy]() | [Datasheet]() | | M0138-1 | ESC FPV 4-in-1 | 17.9g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0138_RACING_ESC_4_IN_1_REVA.step) | [Buy](https://www.modalai.com/products/m0138) | [Datasheet](/voxl-fpv-esc-datasheet/) | | M0141-1 | VOXL 2 WiFi Add-on and I/O Breakout | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0141%20USB2%20Type%20A%20Breakout.step) | [Buy](https://www.modalai.com/products/m0141) | | | M0143-1 | IMX678 RGB Module | 7.97g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0143-IMX678.STEP) | | | | M0144-1 | VOXL 2 B2B Breakout | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0144_VOXL2_B2B_BREAKOUT_REVA_v1(-1_MAIN).step) | | | | M0149-1 | VOXL 2 AR0144 Fisheye Tracking Module | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0149-AR0144.STEP) | [Buy](https://www.modalai.com/products/msu-m0149-1) | [Datasheet](/M0149/) | | M0151-1 | USB3 UART Expansion Board | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0151_A%20v1.step) | [Buy](https://www.modalai.com/products/m0151) | [Datasheet](/m0151/) | | M0154 | VOXL 2 | 16g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0154_VOXL2_SIP_REVA_06-06-23.step) | [Buy](https://www.modalai.com/products/voxl-2?variant=39914779836467) | [Datasheet](/voxl2-datasheets/) | | M0155-1 | VOXL 2 Single Coax Adapter | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0155.step) | [Buy](https://www.modalai.com/products/m0155) | [Datasheet](/M0155/) | | IRS2975C | PMD IRS2975C TOF Module | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/PMD_IRS2975C_MODULE.step) | | | | M0162-1 | VOXL 2 Coax Adapter for Boson+ | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0162_v6.step) | | | | M0161-1 | IMX412 Module with m12 lens and micro-coax interface | 7.75g | | [Buy](https://www.modalai.com/products/msu-m0161) | [Datasheet](/M0161/) | | M0166-1 | AR0144 Module with m7 lens and micro-coax interface | 1g | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0166_AR0144_COAX_with_lens.STEP) | [Buy](https://www.modalai.com/products/msu-m0166) | [Datasheet](/M0166/) | | M0169-1 | PMD IRS2975C TOF Legacy Adapter Board (External Power) | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0169_LIOW2_TOF_ADAPTER_REVA(-1_MAIN).step) | | | | M0170-1 | 40-Pin Molex Straight Flex | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0170_REV-B_032124.stp) | [Buy](https://www.modalai.com/products/msu-m0170) | [Datasheet](/M0170/) | | M0171-1 | PMD IRS2975C TOF High Power Adapter Board | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0171_PMD_TOF_HP_ADAPTER_REVA(-1_MAIN).step) | | | | M0173-1 | Starling 2 Camera Front-end | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0173_STARLING_FRONT_END_REVA.step) | | | | M0177-1 | Starling 2 TOF Flex Cable | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0177_031524_REVIEW2.stp) | | [Datasheet](/M0177/) | | M0178-1 | PMD IRS2975C TOF High Power Adapter Board with mounting hole | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0178_STARLING_TOF_ADAPTER_REVA_2024-03-07.step) | | | | M0181-1 | VOXL 2 and VOXL 2 Mini micro-coax Hi-res and Boson adapter (Hadron) | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0181_HADRON_640R_ADAPTER_REVB_2025-06-05.step) | [Buy](https://www.modalai.com/products/m0201?variant=49834050945328) | [Datasheet](/voxl2-hadron/) | | M0185-2 | VTX PCB | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0185_VTX_DUAL_BAND_RADIO_REVA_2024-10-04.step) | | | | M0186-1 | IMX664 FPV Module with m12 lens and micro-coax interface | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0186-ModalAi%20FPV%20Cam%20Assembly.STEP) | [Buy](https://www.modalai.com/products/msu-m0186) | [Datasheet](/M0186/) | | M0188-2 | VOXL 2 Mini / Stinger Image Sensor Break-out | 5.54g | | | | | M0194-2 | VOXL 2 Mini / Stinger Image Sensor Break-out Hi-Res and Boson | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0194_V2MINI_IR_HR_COAX_REVA_3D_2024-11-24.step) | | | | M0201-1 | Boson+ MIPI adapter for VOXL 2 and VOXL 2 Mini (replaces M0153) | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0201_040225.stp) | [Buy](https://www.modalai.com/products/m0201) | [Datasheet](/M0153/) | | M0202-1 | Hadron640R MIPI micro-coax adapter for VOXL 2 and VOXL 2 Mini | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0202_HADRON_640R_ADAPTER_REVA_-1_MAIN_2025-06-05.step) | | [Datasheet](/voxl2-hadron/) | | M0204-1 | VOXL 2 Mini Refresh | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0204_VOXL2_MINI_V2_REVA.step) | | [Datasheet](/voxl2-mini/) | --- Source: https://docs.modalai.com/m0062/ # VOXL 2 Ethernet Expansion and USB Hub ## Overview The M0062 VOXL 2 Ethernet Expansion and USB Hub provides convenient access to extra I/O. ![m0062-hero](/images/expansion-boards/m0062-overview.jpg) _Note: the USB A connector, J10, is not working consistently on this board for USB3 speeds and may only work in USB2 mode. Please use J11 if you need USB3. You can use MCBL-00022-2 to convert this into an "A-type" port._ ## Details The M0062 provides a variety of basic access to several key features supported by the VOXL 2 platform, including: - USB3 host port in the 10-pin ModalAI format with 1A VBUS support - USB2 host port in the 4-pin ModalAI format with 1A VBUS support - USB2 host port in a Type-A format (this port uses a USB3 Type-A connector, but USB3 speeds may not be work, use J11) - uSD and UFS Combo Card Socket direct on-board (accepts either uSD or UFS memory cards) - Dedicated Linux Kernel Debug UART Port using on-board FTDI to Micro-USB - 10/100/1000 GbE RJ-45 Ethernet Jack (with integrated magnetics) - 6-pin JST GH for SPI port access - 6-pin JST GH for 2W UART + I2C access --- Source: https://docs.modalai.com/m0062-datasheet/ # M0062 VOXL 2 Ethernet Expansion and USB Hub Datasheet ## Overview ## Block Diagram ![m0062-diagram](/images/expansion-boards/m0062-voxl2-main-diagram.jpg) ## Dimensions ### 3D Drawings [3D Step](https://storage.googleapis.com/modalai_public/modal_drawings/M0062_VOXL2_DEBUG_REVA.step) ## Connector Callouts ![m0062-connectors](/images/expansion-boards/m0062-datasheets.jpg)
### J1 - Legacy Voxl Debug/Expansion Port | Connector | MPN | | --- | --- | | Board Connector | QTH-030-01-L-D-A-K-TR | | Mating Connector | https://docs.modalai.com/voxl2-connectors/#j3---legacy-board-to-board-connector-b2b | Color: Black
### J2 - High Speed Board to Board Port | Connector | MPN | | --- | --- | | Board Connector | ADM6-30-01.5-L-4-2-A-TR | | Mating Connector | https://docs.modalai.com/voxl2-connectors/#j5---high-speed-board-to-board-connector-hsb2b | Color: Black
### J6 - FTDI Serial DEBUG Port | Connector | MPN | | --- | --- | | Board Connector | Amphenol 10118194-0001LF | | Mating Connector | Micro-USB Plug | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VBUS_DEBUG | VBUS | | 2 | DBG_HS_CON_D_N | Debug Port USB_D- | | 3 | DBG_HS_CON_D_P | Debug Port USB_D+ | | 4 | USB_ID | Not Connected (FTDI is Always Host) | | 5 | DGND | System GND |
### J7 - uSD/UFS Combo Card Slot | Connector | MPN | | --- | --- | | Board Connector | Amphenol 1010170469#2A | | Mating Products | uSD Card or UFS Card | | Pins | Nets | M0062 Usage | | ----- | ------- | ------- | | FRONT | UFS, 1 Lane | Automatically Picked up when inserting UFS card | | BACK | uSD (SDCC) | Automatically Picked up when inserting uSD card |
### J8 - SPI Port | Connector | MPN | | --- | --- | | Board Connector | JST SM06B-GHS-TB | | Mating Connector | JST GHR-06V-S | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VREG_3P3V_LOCAL | 3.3V Reference Voltage | | 2 | SPI_MISO_3P3V_CON | QUP_17 SPI_MISO, 3.3V CMOS | | 3 | SPI_MOSI_3P3V_CON | QUP_17 SPI_MOSI, 3.3V CMOS | | 4 | SPI_SCLK_3P3V_CON | QUP_17 SPI_SCLK, 3.3V CMOS | | 5 | SPI_CS0_N_3P3V_CON | QUP_17 SPI_CS0, 3.3V CMOS | | 6 | DGND | System GND |
### J9 - 2W UART + I2C Port | Connector | MPN | | --- | --- | | Board Connector | JST SM06B-GHS-TB | | Mating Connector | JST GHR-06V-S | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VREG_3P3V_LOCAL | 3.3V Reference Voltage | | 2 | UART_TX_3P3V_CON | QUP_19 UART TX, 3.3V CMOS | | 3 | UART_RX_3P3V_CON | QUP_19 UART RX, 3.3V CMOS | | 4 | I2C_SDA_3P3V_CON | QUP_10 I2C_SDA, 3.3V CMOS | | 5 | I2C_SCL_3P3V_CON | QUP_10 I2C_SCL, 3.3V CMOS | | 6 | DGND | System GND |
### J10 - USB Host Type A Port | Connector | MPN | | --- | --- | | Board Connector | Molex 0483930003 | | Mating Connector | USB-A Plugs to USB device | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VBUS_PORT2 | 5V VBUS, 1A Limit | | 2 | USB1_HS_CON_D_N | Host Port USB_D- | | 3 | USB1_HS_CON_D_P | Host Port USB_D+ | | 4 | DGND | System GND | | 5 | USB1_SS_RX_N | Host Port SuperSpeed USB RX- (may not work) | | 6 | USB1_SS_RX_P | Host Port SuperSpeed USB RX+ (may not work) | | 7 | DGND | System GND | | 8 | USB1_SS_TX_CONN_N | Host Port SuperSpeed USB TX- (may not work) | | 9 | USB1_SS_TX_CONN_P | Host Port SuperSpeed USB TX+ (may not work) | | 10 | DGND | System GND |
### J11 - USB Host 10-Pin ModalAI Format | Connector | MPN | | --- | --- | | Board Connector | JST BM10B-GHS-TBT | | Mating Connector | JST GHR-10V-S | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VBUS_PORT3 | 5V VBUS, 1A Limit | | 2 | USB1_HS_CON_D_N | Host Port USB_D- | | 3 | USB1_HS_CON_D_P | Host Port USB_D+ | | 4 | DGND | System GND | | 5 | USB1_SS_RX_N | Host Port SuperSpeed USB RX- | | 6 | USB1_SS_RX_P | Host Port SuperSpeed USB RX+ | | 7 | DGND | System GND | | 8 | USB1_SS_TX_CONN_N | Host Port SuperSpeed USB TX- | | 9 | USB1_SS_TX_CONN_P | Host Port SuperSpeed USB TX+ | | 10 | DGND | System GND |
### J12 - USB Host 4-Pin ModalAI Format | Connector | MPN | | --- | --- | | Board Connector | JST BM04B-GHS-TBT (may be blue format) | | Mating Connector | JST GHR-04V-S | | Pin | Net | M0062 Usage | | ----- | ------- | ------- | | 1 | VBUS_PORT4 | 5V VBUS, 1A Limit | | 2 | USB1_HS_CON_D_N | Host Port USB_D- | | 3 | USB1_HS_CON_D_P | Host Port USB_D+ | | 4 | DGND | System GND | --- Source: https://docs.modalai.com/m0062-user-guide/ # VOXL 2 Ethernet Expansion and USB Hub User Guide --- ## Overview The M0062 adds wired Ethernet, USB host ports, removable storage, and a kernel debug console to VOXL 2. Board features, the connector list, and purchasing links are on the [M0062 datasheet](/m0062/). ## Ethernet Plug a cable into the RJ-45 jack and the interface enumerates on VOXL 2 as `eth0`. For a network with DHCP: ```bash dhclient eth0 ``` For a direct connection to a PC or a static setup, assign an address manually: ```bash ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up ``` Once an IP is up you can use SSH, [voxl-portal](/voxl-portal/), RTSP streaming, and any other IP-based tooling over the wired link. ## USB Host Ports - **J11** — USB3 host in the 10-pin ModalAI format (1A VBUS) - **USB2 host** in the 4-pin ModalAI format (1A VBUS) - **J10** — Type-A connector; USB3 speeds are not reliable on this port, so treat it as USB2 and use J11 when you need USB3 (an MCBL-00022-2 converts J11 to a Type-A port) ## Kernel Debug Console The on-board FTDI bridges VOXL 2's debug UART to the Micro-USB connector. Connect it to a host PC and open the enumerated serial port (e.g. `/dev/ttyUSB0` on Linux) at **115200** baud with your terminal of choice to watch the kernel console — including early boot output, which is invaluable when the board isn't reachable over ADB. See the [VOXL 2 QUP mappings](/voxl2-qups/) for details on the debug console UART. ## Storage The combo socket accepts either a uSD or a UFS memory card, mounted by the OS as removable storage. ## SPI, UART, and I2C The 6-pin JST-GH connectors expose an SPI port and a 2-wire UART + I2C. Pinouts are on the [M0062 datasheet](/m0062/), and bus usage from software is covered by [libqrb5165-io](https://gitlab.com/voxl-public/voxl-sdk/core-libs/libqrb5165-io) and the [VOXL 2 Linux User Guide](/voxl2-linux-user-guide/). --- Source: https://docs.modalai.com/m0183/ # VOXL 2 mPCIe Expansion and USB Hub ## Overview The M0183 VOXL 2 mPCIe Expansion and USB Hub provides convenient access to extra I/O. Hover a connector to identify it — click to jump to its pinout. ## Details The M0183 provides a variety of basic access to several key features supported by the VOXL 2 platform, including: - QTY. 1 Mini PCIe port - QTY. 1 USB3 host port in the 10-pin ModalAI format with 2A VBUS support - QTY. 2 USB2 host port in the 4-pin ModalAI format with 1A VBUS support - QTY. 1 6-pin JST GH for SPI port access - Apps proc UART and I2C (VOXL 2 only) - Momentary force-fastboot switch ## Connector Callouts ### P3 - Connects to J3 on VOXL 2 ### P5 - Connects to J5 on VOXL 2 ### J1 - Fan Connect | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5V Local | | | 2 | GND | | ### J2 - mPCIe Supports 8devices miniPini - 2041119-2 TE Connectivity ### J9 - UART and I2C Connect - Board Connector: JST SM06B-GHS-TB - Mating Connector: GHR-09V-S | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 3.3V | | | 2 | UART_TX | `/dev/ttyHS2` | | 3 | UART_RX | `/dev/ttyHS2` | | 4 | SDA | `/dev/i2c-2` | | 5 | SCL | `/dev/i2c-2` | | 6 | GND | | ### J10 - USB 2 Connect - Board Connector: JST SM04B-GHS-TB - Mating Connector: GHR-04V-S | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5P0V | | | 2 | USB_N | | | 3 | USB_P | | | 4 | GND | | ### J11 - USB 3.0 Connect - Board Connector: JST SM10B-GHS-TB - Mating Connector: GHR-10V-S | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5P0V | | | 2 | USB_N | | | 3 | USB_P | | | 4 | GND | | | 5 | RX_N | | | 6 | RX_P | | | 7 | GND | | | 8 | TX_N | | | 9 | TX_P | | | 10 | GND | | ### J12 - USB 2 Connect - Board Connector: JST SM04B-GHS-TB - Mating Connector: GHR-04V-S | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5P0V | | | 2 | USB_N | | | 3 | USB_P | | | 4 | GND | | ### J13 - Micro-SD Card Slot | Pin# | Signal | Notes/Usage | |------|----------------------|---------------------------| | 1 | 5P0V | | | 2 | USB_N | | | 3 | USB_P | | | 4 | GND | | ### SW3 Force Fastboot momentary button. --- Source: https://docs.modalai.com/accessories/ # Accessories Documentation for ModalAI's accessories such as Cameras, ESCs, power supplies, and more. --- Source: https://docs.modalai.com/voxl-escs/ # ModalAI Electronic Speed Controller (ESC) ModalAI's Electronic Speed Controllers (ESCs) are high-performing, closed-loop speed controllers that use a digital interface (UART, i2c in future). ## Brief Overview Brushless Electronic Speed Controllers (**ESCs**) are devices that consist of hardware and software for controlling three-phase brushless DC (**BLDC**) motors. ESCs communicate with the flight controller, which instructs the ESCs how fast the motor should spin. ModalAI's ESCs implement the following advanced features: * Full integration with ModalAI VOXL and Flight Core PCBs * Bi-directional UART communication with checksum; status and fault monitoring * Real-time status and health reporting at high update rate (100Hz+ each) * Closed-loop RPM control for best flight performance * LED control from flight controller via UART ## Feature Comparison
M0129
M0134
M0138
![M0129 top and bottom](/images/modal-esc/m0129/m0129_top_bottom.jpg)
![M0134 top and bottom](/images/modal-esc/m0134/m0134_top_bottom.jpg)
![M0138 top and bottom](/images/modal-esc/m0138/m0138_top_bottom.jpg)
| Feature | ModalAI 4-in-1 ESC (M0129) | ModalAI 4-in-1 ESC (M0134) | ModalAI 4-in-1 ESC (M0138) | |---------------------------------------------------------------------------------------------------------|---------------------------------------------|---------------------------------------------|---------------------------------------------| | Nominal Input Voltage | 6.0V-16.8V (2-4S Lipo) | 6.0V-16.8V (2-4S Lipo) | 6.0V-26V (2-6S Lipo) | | | | 6.0V-25.2V (2-6S Lipo) (M0134-6) | | | VOXL Power Output | 3.8V or 5.0V @ 5A (6A 30 sec) | ❌ | 5.0V or 3.8V @ 6A | | Aux Power Output | 1x 3.3V / 5.0V 500mA | 1x 5.0V 500mA | 1x 3.3V/5.0V 500mA, 1x 16.8V 500mA | | Max Continuous Current Per Motor | 20A (thermally limited, requires airflow) | 20A (thermally limited, requires airflow) | 40A (thermally limited, requires airflow) | | Max Burst Current Per Motor | 30-40A for <1s | 40-50A for <1s | 100A for <1s | | MCU | STM32F051K86 | STM32F051K86 | STM32F051K86 | | MOSFET Driver | MP6531A | MP6530 (M0134-1) | MP6531A | | | | MP6531A (M0134-3, M0134-6) | | | MOSFETs | AON7528 (N) | AON7528 (N) | TBD | | Current Sensing | 1x 0.5mOhm + INA186 (-20A..+110A) | 4x 0.5mOhm + INA186 (-10A..+55A) | 1x 0.25mOhm + INA186 (-35A..+200A) | | ESD signal protection | ✅ | ✅ | ✅ | | Temperature Sensing | ✅ (internal to MCU) | ✅ (internal to MCU) | ✅ (internal to MCU + top and bottom) | | On-board Status LEDs | ✅ 4x | ✅ 4x | ✅ 4x | | External LEDs | 1x Neopixel LED output | 2x Neopixel LED outputs | 1x Neopixel LED output | | Secure Bootloader | Yes (AES256) | Yes (AES256) | Yes (AES256) | | Motor PWM Switching Frequency | 48, 24 Khz | 48, 24 Khz | 48, 24 Khz | | Maximum RPM (6 pole pairs) | 50K+ | 50K+ | 50K+ | | PWM control input (1-2ms) | ✅ | ✅ | ❌ | | PWM output | ✅ 4x (shared with PWM input) | ✅ 4x (shared with PWM input) | ✅ 2x | | Active Freewheeling | ✅ | ✅ | ✅ | | Disable Regenerative Braking | Always enabled | Always enabled (M0134-1) | ✅ Option to disable | | | | ✅ Option to disable (M0134-3, M0134-6) | | | Tone Generation | ✅ | ✅ | ✅ | | Closed-loop RPM Control | Yes (10Khz) | Yes (10Khz) | Yes (10Khz) | | Number of UART ports | 2 (2Mbit+) | 2 (2Mbit+) | 1 (2Mbit+) | | [voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) UART Protocol | ✅ | ✅ | ✅ | | UART connector type | JST GH 4-pin | Hirose DF13 6-pin | JST GH 4-pin | | UART Cable (for VOXL2) | mcbl-00015 | mcbl-00029 | mcbl-00015 | | Weight without wires (g) | 5.9 | 9.5 | 17.9 | | Board Dimensions (mm) | 36.5 x 36.5 | 40.5 x 40.5 | 45.5 x 59.0 | | Mounting Hole Size, Pattern (mm) | 2.5, 30.5 x 30.5 | 3.05, 31.0 x 33.0 | 3.05, 30.5 x 30.5 | | Notes | | | | ## Mechanical Drawings | PCB | 3D STEP | |---------|----------------------------------------------------------------------------------------------------------------------| | M0049 | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0049_ESC_4_IN_1_REVB_CAM_FINAL_20200610.stp) | | M0117 | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0117_ESC_4_IN_1_AD_REVA(-1_MAIN).step) | | M0134 | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0134_ESC_4_IN_1_32_REVA.step) | | M0129 | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0129_ESC_4_IN_1_MICRO_20230222_FINAL.stp) | | M0138 | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0138_RACING_ESC_4_IN_1_REVA.step) | ## Other ESCs
M0049
![M0049 top and bottom](/images/modal-esc/m0049/m0049_top_bottom.jpg)
M0117
![M0117 top and bottom](/images/modal-esc/m0117/m0117_top_bottom.jpg)
| Feature | ModalAI 4-in-1 ESC (M0049) | ModalAI 4-in-1 ESC (M0117) | |---------------------------------------------------------------------------------------------------------|---------------------------------------------|---------------------------------------------| | Nominal Input Voltage | 6.0V-16.8V (2-4S Lipo) | 6.0V-16.8V (2-4S Lipo) | | | | | | Aux Power Output | 1x 4.5V, 1x 5.0V (adj) 600mA each | 1x 5.0V (adjustable) 600mA | | Max Continuous Current Per Motor | 20A (thermally limited) | 20A (thermally limited) | | Max Burst Current Per Motor | 40-50A (requires airflow and heat-spreader) | 40-50A (requires airflow and heat-spreader) | | MCU | STM32F051K86 | STM32F051C6U6 | | MOSFET Driver | MP6530 | MP6530 (M0117-1) | | | | MP6531A (M0117-3) | | MOSFETs | AON7528 (N) | AON7528 (N) | | Individual Current Sensing | 4x 1mOhm + INA186 | 4x 0.5mOhm + INA186 | | ESD signal protection | ✅ | ✅ | | Temperature Sensing | ✅ | ✅ | | On-board Status LEDs | ✅ | ✅ | | External LEDs | Neopixel LEDs | N/A | | Secure Bootloader | Yes (AES256) | Yes (AES256) | | PWM Switching Frequency | 48, 24 Khz | 48, 24 Khz | | Maximum RPM (6 pole pairs) | 50K+ | 50K+ | | PWM control input | ✅ | ✅ | | Active Freewheeling | ✅ | ✅ | | Disable Regenerative Braking | ❌ Always enabled | ❌ Always enabled (M0117-1) | | | | ✅ (M0117-3) | | Tone Generation | ✅ | ✅ | | Closed-loop RPM Control | Yes (10Khz) | Yes (10Khz) | | Number of UART ports | 2 (2Mbit+) | 2 (2Mbit+) | | [voxl_esc](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) UART Protocol | ✅ | ✅ | | Weight without wires (g) | 9.5 | 9.5 | | Board Dimensions (mm) | 40.5 x 40.5 | 40.5 x 40.5 | | Mounting Hole Size, Pattern (mm) | 3.05, 31.0 x 33.0 | 3.05, 31.0 x 33.0 | | Notes | limited availability | limited availability | --- Source: https://docs.modalai.com/voxl-esc-datasheet/ # VOXL 4-in-1 ESC Datasheet --- ## Hardware Overview ![m0134-diagram.jpg](/images/modal-esc/m0134/m0134-diagram.jpg) ## Dimensions [M0134 VOXL ESC 3D CAD](https://storage.googleapis.com/modalai_public/modal_drawings/M0134_ESC_4_IN_1_32_REVA.step) ![m0134-dimensions.png](/images/modal-esc/m0134/m0134-dimensions.png) ## Specifications | | Details | |--- |--- | | Power Input | 2-4S Li-Po (5.5-18V) : M0134-1 and M0134-3 variants | | | 2-6S Li-Po (5.5-26V) : M0134-6 variant | | | XT30 connector (suggested) | | Power Output | Single AUX power output at 5.0V (adjustable via resistor) 500mA (can be used for Neopixel LEDs) | | Performance | 4 channels at 10A+ maximum continuous current per channel (depends on cooling) | | | Maximum RPM : 50,000+RPM for a 12-pole motor | | Features | Open-loop control (set desired % power) | | | Closed-loop RPM control (set desired RPM), used in PX4 driver | | | Control LED colors of external LED Strip (Neopixel) | | | Generate tones using motors | | | Real-time RPM feedback | | Communications | Supported by VOXL Flight, VOXL and Flight Core | | | Dual Bi-directional UART (3.3VDC logic-level) | | | PWM input supporting 1-2ms and OneShot125 (more protocols coming soon) | | Connectors | UART: Hirose DF13 6-pin | | | PWM Input: JST GH 6-pin | | | AUX Regulated Output Connectors: N/A (solder pads) | | | Motor Output Connectors: N/A (solder pads) | | Hardware | MCU : STM32F051K86 @ 48Mhz, 64KB Flash | | | Mosfet Driver : MP6530 | | | Mosfets : AON7528 (N-channel) | | | Individual Current Sensing : 4x 2mOhm + INA186 | | | ESD Protection : Yes (on UART and PWM I/O) | | | Temperature Sensing : Yes | | | On-board Status LEDs : Yes | | | Weight (no wires) : 9.5g | | | Motor Connectors: N/A (solder pads) | | PX4 Integration | Supported in PX4 1.12+ | | | [Code](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | | Resources | [Manual](/modal-esc-v2-manual/) | | | [PX4 Integration User Guide](/modal-esc-px4-user-guide/) | ## Connector Information and Pin-outs **UART Connector J2** * Used for UART communication with the ESC * Connector on board : Hirose DF13A-6P-1.25H * Mating connector : DF13-6S-1.25C * Pre-crimped wires : (Digikey) H4BBT-10112-B8 or similar * Connector is compatible with VOXL ESC V1, except V2 board has additional UART2 functionality * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :------: | :------: | :------: | :------: | :------: | :---: | :------: | | Function > | VREF_OUT | UART RX (IN) | UART TX (OUT) | RESERVED | GND | RESERVED | Pin 1 is the end of J2 nearest the J3 connector, marked with a dot on the board silkscreen. --- **PWM Input / Output Connector J3** * Used for PWM input or output * Connector on board : BM06B-GHS-TBT * Mating connector : GHR-06V-S * Pre-crimped wires : (Digikey) AGHGH28K152 or similar * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :--------: | :------: | :------: | :------: | :------: | :------: | :------: | | Function > | VREF_OUT | PWM0 | PWM1 | PWM2 | PWM3 | GND | ## Neopixel LED Support ![m0134-diagram-neopixel.jpg](/images/modal-esc/m0134/m0134-diagram-neopixel.jpg) - Two independent Neopixel RGB LED outputs are available, up to 32 LEDs each - Use test points labeled `IO_0` and `IO_3` in the AUX IO section of the ESC - IO_0 and IO_3 are connected to ESC `ID0 PB8` and `ID3 PB8` respectively (3.3V levels) - VAUX output provides 5.0V output for the LED array - Test tools: [voxl-esc-neopixel-test.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/voxl-esc-neopixel-test.py) - Integration with PX4 is done via `voxl_esc` driver and `modal_io_bridge` ## PWM Inputs / Outputs - Four independent PWM input / output pins are available, one pin per ESC channel - Use J3 connector (pins 2,3,4,5 corresponding to PWM 0,1,2,3) - PWM pin 0 is connected to ESC ID0, PWM1 -> ESC ID1, and so on (3.3V levels) - PWM input enabled in ESC firmware `V39 RC13` or later, PWM output in `39.18` or later - Operating mode of PWM pins - Default mode of PWM pins is PWM input. In absence of UART communication, PWM pins can be used to control the ESC power using standard PWM signal (1-2ms) - Upon detecting any UART communication by ESC, PWM input is disabled until power reset - PWM output can be enabled by sending specific message to the ESC via UART interface - PWM output mode specifications - 3 frequency modes (50hz, 200hz, 400hz) - enable or disable timeout (0.5s). If timeout is enabled, PWM output will be disabled (set to low state) after 0.5s of no commands - output range 0-2200 us with 0.05us resolution, special value of 2201us will force HIGH state (can be used as GPIO) - Test tools: [voxl-esc-pwm.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/dev/voxl-esc-tools/voxl-esc-pwm.py) - this tool can only be used while PX4 is not running, since it needs direct access to the UART port - Integration with PX4 is done via `voxl_esc` px4 driver and `modal-io-server`. `voxl-send-esc-pwm-cmd` (part of voxl-io-server, whose source is not publicly available) - this tool will send a control message to PX4 (`voxl_esc` driver) and the driver will forward the PWM command to the ESC --- Source: https://docs.modalai.com/voxl-mini-esc-datasheet/ # VOXL Mini 4-in-1 ESC Datasheet --- ## Hardware Overview This Mini ESC is designed for aerial vehicles under 750g (under 500g for FPV racing applications). For larger slow flying vehicles up to 1500g, please use the [VOXL 4-in-1 ESC](/voxl-esc-datasheet/). For FPV racers exceeding 500g, please use [VOXL 4-in-1 FPV ESC](/voxl-fpv-esc-datasheet/). ![m0129-labels.jpg](/images/modal-esc/m0129/m0129-labels.jpg) ## Dimensions 36.5 mm x 36.5 mm x 4.25 mm. [M0129 VOXL Mini 4-in-1 ESC 3D CAD](https://storage.googleapis.com/modalai_public/modal_drawings/M0129_ESC_4_IN_1_MICRO_20230222_FINAL.stp) ![m0129-dimensions.jpg](/images/modal-esc/m0129/m0129-dimensions.png) ## Specifications | | Details | |------------------------|-------------------------------------------------------------------------------------------------| | Power Input | 2-4S Lipo (6-18V) : M0129-3 and M0129-5 variants. Supports 4S LiHV | | | 2-6S Lipo (6-26V) : M0129-63 and M0129-65 variants. Supports 6S LiHV | | | | | Main Power Output | 3.8V (M0129-3, M0129-63) or 5.0V (M0129-5, M0129-65) @ 5A - (select correct version) | | AUX Power Output | 3.3V or 5.0V @ 500mA (default 3.3V, SW-controlled) | | | | | Features | Open-loop control (set desired % power) | | | Closed-loop RPM control (set desired RPM), used in PX4 driver | | | Regenerative braking | | | Smooth sinusoidal spin-up | | | Tone generation using motors | | | Real-time RPM, temperature, voltage, current feedback via UART | | Communications | Supported by VOXL 2, VOXL 2 Mini, VOXL Flight, VOXL and Flight Core | | | Dual Bi-directional UART up to 2Mbit/s (3.3VDC logic-level) | | | | | Connectors | 4-pin JST GH for UART communication, solder pads for 3.8V output | | | | | Hardware | MCU : STM32F051K86 @ 48Mhz, 64KB Flash | | | Mosfet Driver : MP6531 | | | Mosfets : CSD17575Q3 (N-channel) | | | Current Sensing : 0.5mOhm + INA186 (total current only) | | | ESD Protection : Yes (on UART and PWM I/O) | | | Temperature Sensing : Yes | | | On-board Status LEDs : Yes | | | Weight (no wires) : 5.87g | | | Motor Connectors: N/A (solder pads) | | PX4 Integration | Supported in PX4 1.12 and higher | | | Available [here](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | | Resources | [Manual](/modal-esc-v2-manual/) | | | [PX4 Integration User Guide](/modal-esc-px4-user-guide/) | ## Connector Information and Pin-outs **UART Connector J1** * Used for UART communication with the ESC * Connector on board : BM04B-GHS-TBT * Mating connector : GHR-04V-S * Pre-crimped wires : (Digikey) AGHGH28K152 or similar * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | | :------: | :------: | :-----: | :-----: | :-----: | | Function > | N/C | UART RX (IN) | UART TX (OUT) | GND | ## Neopixel LED Support ![m0129-neopixel.jpg](/images/modal-esc/m0129/m0129-neopixel.jpg) - Single Neopixel RGB LED outputs is available, up to 32 LEDs - Use test point labeled ⬇️ (pointing into center of the board) in the AUX UART section of the ESC (AUX UART is not used) - The I/O pin is connected to ESC ID0 `PB6` (3.3V levels) - ➕ output provides 3.3V output for the LED array - Test tools: [voxl-esc-neopixel-test.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/voxl-esc-neopixel-test.py) - Integration with PX4 is done via `voxl_esc` driver and `modal_io_bridge` ## PWM Inputs / Outputs ![m0129-pwm.jpg](/images/modal-esc/m0129/m0129-pwm.jpg) - Four independent PWM input / output pins are available, one pin per ESC channel - Use test points G (GND), A0, A1, A2, A3 - PWM pin A0 is connected to ESC ID0, A1 -> ESC ID1, and so on (3.3V levels) - ⚠️*Solder carefully to test points and use strain relief to avoid damaging the pads* - PWM input enabled in ESC firmware `V39 RC13` or later, PWM output in `39.18` or later - Operating mode of PWM pins - Default mode of PWM pins is PWM input. In absence of UART communication, PWM pins can be used to control the ESC power using standard PWM signal (1-2ms) - Upon detecting any UART communication by ESC, PWM input is disabled until power reset - PWM output can be enabled by sending specific message to the ESC via UART interface - PWM output mode specifications - 3 frequency modes (50hz, 200hz, 400hz) - enable or disable timeout (0.5s). If timeout is enabled, PWM output will be disabled (set to low state) after 0.5s of no commands - output range 0-2200 us with 0.05us resolution, special value of 2201us will force HIGH state (can be used as GPIO) - Test tools: [voxl-esc-pwm.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/dev/voxl-esc-tools/voxl-esc-pwm.py) - note: the tool's `--pin` argument is an MCU port/pin string (default `A2`, meaning MCU pin PA2) and is NOT the test-point label above — all boards use MCU pin A2 for PWM output, so you normally should not change it - this tool can only be used while PX4 is not running, since it needs direct access to the UART port - Integration with PX4 is done via `voxl_esc` px4 driver and `modal-io-server`. `voxl-send-esc-pwm-cmd` (part of voxl-io-server, whose source is not publicly available) - this tool will send a control message to PX4 (`voxl_esc` driver) and the driver will forward the PWM command to the ESC ## GPIO - Available in ESC firmware `39.20` or later - Test tools: [voxl-esc-gpio.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/dev/voxl-esc-tools/voxl-esc-gpio.py) > The current voxl-esc-gpio.py tool is hard-coded for the M0138 FPV ESC aux regulator and cannot toggle this board's PC13 directly. On a flying vehicle, GPIO control is instead exposed through the PX4 voxl_esc driver's `GPIO_CTL_CH` parameter. | Signal Name | MCU Pin | Function | |-----------------|----------|-----------------------------------------| | AUX_VREG_ENABLE | CH0 PC13 | AUX 3.3 / 5.0V Regulator Power Control | | AUX_VREG_ADJUST | CH0 PC14 | AUX 3.3 / 5.0V Regulator Voltage Select (disabled) | --- Source: https://docs.modalai.com/voxl-fpv-esc-datasheet/ # VOXL FPV Racing 4-in-1 ESC Datasheet --- ## Hardware Overview This M0138-1 high-performance ESC uses 100A 40V MOSFETs and board layout optimized for demanding FPV racing applications. The ESC supports 100A burst current per channel and over 300A total burst current (usually limited by battery and connectors). Communicate reliably with low-latency digital UART from your flight controller to the 4-in-1 ESC. This ESC has a dedicated 5V regulated power output to power [VOXL 2](/voxl-2/) or [Flight Core v2](/flight-core-v2/) with battery voltage and current monitoring support in PX4. Additionally the ESC can power a video transmitter and has the ability to toggle on and off. ![m0138_diagram.jpg](/images/modal-esc/m0138/m0138_diagram.jpg) ## Dimensions ![m0138-dimensions.png](/images/modal-esc/m0138/m0138-dimensions.png) [M0138 VOXL Racing 4-in-1 ESC 3D CAD](https://storage.googleapis.com/modalai_public/modal_drawings/M0138_RACING_ESC_4_IN_1_REVA.step) - Board dimensions: 45.5mm x 59.0mm - Mounting hole pattern: 30.5mm x 30.5mm, M3 (3.05mm) ## Specifications | Feature | Details | |------------------------|-------------------------------------------------------------------------------------------------| | Power Input | 2-6S Lipo (6-26V). Supports 6S LiHV | | | | | VOXL Power Output | 5V @ 6A | | VTX Power Output | 16.8V @ 500mA (switch on/off). Passthrough if Vbatt < 16.8 | | AUX Power Output | 3.3V / 5.0V @ 500mA (switch on/off, voltage selectable in software) | | Payload Connector | Battery Voltage, JST Connector, rated 4A | | | | | Performance | 40V, 100A+ Mosfets | | | 100A peak current per motor (<1s) | | | 40A continuous current per motor (with sufficient airflow, application dependent) | | | Peak total board current 300A+ (<1s) | | | | | Software Features | Open-loop control (set desired % power) | | | Closed-loop RPM control (set desired RPM), used in PX4 driver | | | Regenerative braking | | | Smooth sinusoidal spin-up | | | Tone generation using motors | | | Real-time RPM, temperature, voltage, current feedback via UART | | Communications | Supported by VOXL 2, VOXL 2 Mini, VOXL Flight, VOXL and Flight Core | | | Bi-directional UART up to 2Mbit/s (3.3VDC logic-level) | | | | | Connectors | 4-pin JST GH for UART communication | | | VOXL output: solder pads for 5.0V / 3.8V (depends on board variant) | | | Payload connector: JST SM02B-SFHLS-TF(LF)(SN) | | | VTX power output: solder pads | | | AUX power output: solder pads | | | | | Hardware | MCU : STM32F051K86 @ 48Mhz, 64KB Flash | | | Mosfet Driver : MP6531 | | | Mosfets: Infineon BSC022N04LS (40V, N-channel) | | | Current Sensing : 0.25mOhm + INA186 (total current only). 200A max sensing range | | | ESD Protection : Yes (on UART and PWM I/O) | | | Temperature Sensing : 4x internal to MCU, 2x external (top and bottom of PCB) | | | On-board Status LEDs : Yes | | | Weight (no wires) : 17.9g | | | Motor Connectors: N/A (solder pads) | | PX4 Integration | Supported in PX4 1.12 and higher | | | Available [here in developer preview](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc) | | Resources | [Manual](/modal-esc-v2-manual/) | | | [PX4 Integration User Guide](/modal-esc-px4-user-guide/) | > The operating input range is 2S to 6S (6 V to 26 V). Do not run this ESC on 7S or 8S packs. The 40 V rating of the MOSFETs and other components is design margin for transients, back-EMF and regenerative energy, not headroom for a higher cell count. ## Connector Information and Pin-outs **UART Connector J1** * Used for UART communication with the ESC * Connector on board : BM04B-GHS-TBT * Mating connector : GHR-04V-S * Pre-crimped wires : (Digikey) AGHGH28K152 or similar * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | | :------: | :------: | :-----: | :-----: | :-----: | | Function > | 3.3V reference out (leave unconnected) | UART RX (IN) | UART TX (OUT) | GND | The pinout matches the M0129 VOXL Mini 4-in-1 ESC UART connector. ## Power Connectors and Pads All locations reference the board silkscreen (see the labeled diagram at the top of this page). | Output | Location | Details | |--------|----------|---------| | Battery input | `+++` / `---` M3 plated through-holes (bottom side) | 2-6S LiPo, TVS protected | | Payload output (connector) | J2, JST SM02B-SFHLS, silkscreen `+BATOUT-` | pin 1 = battery voltage (+), pin 2 = GND; rated 4A. Downstream of the current-sense resistor, so payload current is included in the ESC's battery-current telemetry | | Payload output (pads) | solder pads beside J2 | same net as J2 (battery voltage / GND) | | VTX output | solder pad pair marked `<4SOUT>` beside J2 | battery voltage clipped to 16.8V (4S level); switched on/off via `VTX_VREG_ENABLE` (see GPIO below) | | VOXL power output | `+VXL-` / `-GND-` pad pair, top side next to J1 | 5.1V (VOXL 2 variant) or 3.8V (VOXL 2 Mini variant) from a 6A-rated regulator | | AUX output | `VAUX` pad in the AUX IO group, bottom edge | 3.3V (default) or 5.0V selectable; switched via `AUX_VREG_ENABLE` | | Motor outputs | 12 castellated solder pads around the board edge | three phases per channel, silkscreen `ID:A/B/C` (channel n, phase A/B/C) | The AUX IO pad group on the bottom edge also carries a ground reference pad `G` for the PWM/Neopixel signals (see image below). ## Neopixel LED Support ![m0138_pwm_neopixel.jpg](/images/modal-esc/m0138/m0138_pwm_neopixel.jpg) - Single Neopixel RGB LED outputs is available, up to 32 LEDs - Use test point labeled `RGB` in the AUX IO section of the ESC - The I/O pin is connected to ESC ID0 PB8 (3.3V levels) - VAUX output provides 3.3V output for the LED array - ⚠️*Solder carefully to test points and use strain relief to avoid damaging the pads* - Test tools: [voxl-esc-neopixel-test.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/voxl-esc-neopixel-test.py) - Integration with PX4 is done via `voxl_esc` driver and `modal_io_bridge` ## PWM Inputs / Outputs - Two independent PWM output pins are available, one pin per ESC channel - Use test points 0P and 3P (AUX IO section of the ESC) - PWM pin `0P` is connected to ESC ID0, `3P` -> ESC ID3 (3.3V levels) - ⚠️*Solder carefully to test points and use strain relief to avoid damaging the pads* - PWM output is available in firmware in `39.18` or later - Operating mode of PWM pins - PWM input is disabled on this ESC because only two I/O pins are available - PWM output can be enabled by sending specific message to the ESC via UART interface - PWM output mode specifications - 3 frequency modes (50hz, 200Hz, 400hz) - enable or disable timeout (0.5s). If timeout is enabled, PWM output will be disabled (set to low state) after 0.5s of no commands - output range 0-2200 us with 0.05us resolution, special value of 2201us will force HIGH state (can be used as GPIO) - Test tools: [voxl-esc-pwm.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/dev/voxl-esc-tools/voxl-esc-pwm.py) - this tool can only be used while PX4 is not running, since it needs direct access to the UART port - Integration with PX4 is done via `voxl_esc` px4 driver and `modal-io-server`. `voxl-send-esc-pwm-cmd` (part of voxl-io-server, whose source is not publicly available) - this tool will send a control message to PX4 (`voxl_esc` driver) and the driver will forward the PWM command to the ESC ## GPIO - Available in ESC firmware `39.18` or later - Test tools: [voxl-esc-gpio.py](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/dev/voxl-esc-tools/voxl-esc-gpio.py) | Signal Name | MCU Pin | Function | |-----------------|-----------|-----------------------------------------| | VTX_VREG_ENABLE | CH0 PF0 | VTX Power Control | | AUX_VREG_ENABLE | CH0 PA12 | AUX 3.3 / 5.0V Regulator Power Control | | AUX_VREG_ADJUST | CH0 PA11 | AUX 3.3 / 5.0V Regulator Voltage Select (disabled)| ## Wiring Diagrams ### M0138-1 FPV ESC with Flight Core v2 ![m0138-flight-core-wiring.jpg](/images/modal-esc/m0138/m0138-flight-core-wiring.jpg) --- Source: https://docs.modalai.com/modal-esc-v2-manual/ # VOXL ESC Manual ## Software Components | Function | Description | Resource Link | |--:-:--------------------|---------------------------------------------------------------------------------------------------------|--:-:---------------------------------------------------------------------------------------| | **Bootloader** | Provides firmware update capability over UART and ensures integrity of the firmware before executing it | Installed on board during production | | **Firmware** | Main software that performs all motor control functionality | [gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-tools/firmware) | | **Firmware Parameters** | Parameters that allow user to change behavior of the Firmware without changing the Firmware itself | [gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-params) | | **VOXL ESC Tools** | Tools for testing / tuning ESC using a PC | [gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-tools) | | **PX4 Driver** | PX4 driver found on main branch of PX4 Firmware | [github](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) | ## VOXL ESC Tools VOXL ESC Tools is a Python software package which allows testing, calibration and diagnostics of ESCs using a PC or through VOXL itself. The ESC tools consist of two parts: - voxl-esc-tools : open source tools : [gitlab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) - voxl-esc-tools-bin : proprietary support library, now included in the same repository (no separate download needed; Python 3.6 through 3.12 supported) ### Installation on VOXL (Recommended) The voxl-esc package comes as part of VOXL SDK 1.0.0 and newer. ### Installation on a PC Get the tools — a plain clone is all you need, the proprietary `voxl-esc-tools-bin` support library is included in the repository: ```bash git clone https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc.git cd voxl-esc/voxl-esc-tools ``` Install dependencies (Python 3.6 or newer is required): ```bash sudo addgroup dialout sudo apt-get update sudo apt-get -y install python3-pip python3-serial python3-numpy ``` The tools must be run from inside the `voxl-esc-tools` directory (they locate the bundled support library relative to the working directory). --- ### VOXL ESC USB Interface to PC You can interface with a VOXL ESC using your Ubuntu workstation, a USB-to-serial adapter, and a serial cable. ModalAI sells a ready-made cable for this — MCBL-00091, USB to Serial UART JST-GH, pinned specifically for ESC tools with a direct plug into M0129 and newer ESCs (see the [cable datasheets](/cable-datasheets/)). Alternatively any 3.3V USB-to-serial adapter (e.g. an FTDI breakout) with a hand-wired cable works: Here’s what one USB interface cable looks like: ![ESC Flash Cable](/images/modal-esc/modalai-esc-flash-cable.png) ![ESC Flash Cable 1](/images/modal-esc/modalai-esc-flash-cable-1.png) ### Serial connector found on ESC ![ESC Connector](/images/modal-esc/modalai-esc-flash-cable-2.png) Be cautious when plugging the serial plug into the connector. Be sure no pins are bent out of alignment before inserting the plug and do not bend any pins during the plug in process. | USB-Serial Adapter | VOXL ESC 6-Pin Serial Connector | |-:-:----------------|-:-:-----------------------------| | GND | GND - Pin 5 | | TXD (3.3v) | RXD - Pin 2 | | RXD (3.3v) | TXD - Pin 3 | On the ESC, J2 pin 1 is the end nearest the J3 connector, marked with a dot on the silkscreen. Part of this cable can be used. VOXL ESC and USB adapter currently tested with 3.3v; if needed, docs say it can support 5v input. * The USB-Serial adapter comes up as `/dev/ttyUSB0 device`. --- ### Run The Tools on PC: Go to the tools directory: * `cd voxl-esc/voxl-esc-tools` on VOXL, adb in and go to the voxl-esc-tools directory. Then enable the UART bridge which stops the PX4 flight controller and opens a bridge to allow the SDSP UART port ```bash voxl2:/$ cd /usr/share/modalai/voxl-esc-tools/ voxl2:/usr/share/modalai/voxl-esc-tools$ voxl2:/usr/share/modalai/voxl-esc-tools$ voxl-esc enable_bridge ``` Later you can disable the bridge and PX4 will start up again. Or you can simply power cycle the VOXL before your next flight and it will power up as normal. ```bash voxl2:/usr/share/modalai/voxl-esc-tools$ voxl-esc disable_bridge ``` > "Enabling the bridge" is really just stopping PX4 (`systemctl stop voxl-px4`) so the tools can use the ESC UART, and "disabling" restarts it. If you run the bare `voxl-esc-*.py` scripts instead of the `voxl-esc` wrapper, stop PX4 yourself first — and note `systemctl disable` only prevents start on boot, it does not stop a running PX4. #### Tool Quick Reference | Tool | Purpose | |---|---| | `voxl-esc-scan.py` | Detect ESCs; print ID, board, firmware/bootloader versions, UID | | `voxl-esc-spin.py` | Spin motors by power or RPM (`--id 255` = all four); live telemetry, optional plot | | `voxl-esc-spin-step.py` | Aggressive step-response tests (battery only — regenerative braking) | | `voxl-esc-calibrate.py` | Measure the feed-forward RPM curve — see [ESC Calibration](/voxl-esc-calibration/) | | `voxl-esc-upload-params.py` | Upload a params XML to the ESCs and reset them | | `voxl-esc-verify-params.py` | Read back params, confirm valid and identical across ESCs | | `voxl-esc-upload-firmware.py` / `voxl-esc-upload-firmware-all.sh` | Flash firmware (one ESC / auto-detect all) | | `voxl-esc-tone.py` | Play tones through the motors | | `voxl-esc-led.py` | Cycle onboard RGB LEDs | | `voxl-esc-pwm.py` / `voxl-esc-gpio.py` | Drive the aux PWM/GPIO pins (see datasheets for supported boards) | Now run ls inside this directory. There are many tools, most are self explanatory and have "--help" pages that print the usage. There is also a README.md file in that directory with more usage information. ```bash voxl2:/usr/share/modalai/voxl-esc-tools$ ls README.md voxl-esc-board-detect.py voxl-esc-spin-sine.py voxl-esc-upload-params.py calibration.md voxl-esc-calibrate.py voxl-esc-spin-step.py voxl-esc-verify-params.py crc.py voxl-esc-led.py voxl-esc-spin.py voxl_esc_setup_paths.py esc_boards.py voxl-esc-neopixel-test.py voxl-esc-tools-bin voxl_serial.py esc_scanner.py voxl-esc-scan.py voxl-esc-upload-firmware-all.sh firmware voxl-esc-spin-helper.sh voxl-esc-upload-firmware.py ``` Note that on VOXL2, there is a top-level "voxl-esc" tool with a wizard interface that manages enabling and disabling the UART bridge for you. This is the tool that is used during the voxl-configure-mpa step when setting up a new drone. It calls a select few of the above python tools under the hood, but gives you quick access to the most frequently used tools such as upgrading firmware, uploading params, scanning for current firmware version, and spinning motors to verify rotation direction. ```bash voxl2:/usr/share/modalai/voxl-esc-tools$ voxl-esc Starting Wizard What do you want to do? 1) scan 3) spin 5) upload_params 2) detect 4) upgrade_firmware #? ``` #### ESC Parameters Example verify params command: `python3 voxl-esc-verify-params.py` Console Output: ![ESC Parameter Console](/images/modal-esc/modalai-esc-flash-console.png) Example upload params command for Seeker: `python3 voxl-esc-upload-params.py --params-file ../voxl-esc-params/Seeker_V1/Seeker_V1_tmotor_f2203_1500kv_Param_Rev_A.xml` Example upload params command for m500/RB5: `python3 voxl-esc-upload-params.py --params-file ../voxl-esc-params/RB5_Flight_V1/esc_params_modalai_4_in_1_revb_holybro2216_880_third_kp.xml` Example upload params command for Sentinel: `python3 voxl-esc-upload-params.py --params-file ../voxl-esc-params/Sentinel_V1/Sentinel_V1.xml` --- ## Hardware Diagrams The 4-in-1 ESC board consists of four almost identical copies of a single ESC design. ### Single ESC Block Diagram ![Single ESC Channel Block Diagram](/images/modal-esc/voxl-v2-esc-single-block-diagram.png) The four ESCs share some components * 3.3V Voltage regulator * UART communication lines * ID_SELECT2 pin (see ID Assignment section) --- ### Communication Block Diagram ![Communication Block Diagram](/images/modal-esc/voxl-v2-esc-comms-diagram.png) ### Connector Information and Pin-outs **UART Connector J2** * Connector on board : Hirose DF13A-6P-1.25H * Mating connector : DF13-6S-1.25C * Pre-crimped wires : (Digikey) H4BBT-10112-B8 or similar * Connector is compatible with VOXL ESC V1, except V2 board has additional UART2 functionality * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :------: | :------: | :------: | :------: | :------: | :---: | :------: | | Function > | VREF_OUT | UART1 RX | UART1 TX | UART2 RX | GND | UART2 TX | --- **PWM Input Connector J3** * Connector on board : BM06B-GHS-TBT * Mating connector : GHR-06V-S * Pre-crimped wires : (Digikey) AGHGH28K305 or similar * 3.3V signals (5.0V input is acceptable) | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :--------: | :------: | :------: | :------: | :------: | :------: | :------: | | Function > | VREF_OUT | PWM_IN0 | PWM_IN1 | PWM_IN2 | PWM_IN3 | GND | --- ## ESC Software Start-up Procedure ![Boot-up Procedure](/images/modal-esc/modalai_esc_bootup_process.png) ### Start-up Error Cases | Error | Notes | | ----- | ----- | | Firmware Verification | Verification of the firmware could fail either because the firmware was never installed (fresh board) or the firmware has been corrupted. In this case, the status LED will continuously blink fast (10Hz) and the ESC will remain in bootloader mode indefinitely, waiting for host to install the firmware | | Firmware Update | Firmware update could be rejected by the Bootloader if incompatible firmware is provided by host. Incompatible firmware is detected before erasing existing firmware, so the old firmware should be retained in this case. Also, firmware update could fail in the middle of the update (loss of power or communication) - in this case the previous firmware would be lost and the ESC would end up without valid firmware. To fix this, simply re-install the firmware. | | Firmware Params Verification | If firmware parameters are corrupt or were never installed, ESC cannot be used normally. The firmware will enter a fallback mode, where it uses 57600 baud rate for UART communication and waits for host to upload valid parameters. Upon entering such condition, the firmware will blink 10 times with status LED and make a "sad" motor tone to signal the error. To fix this, use ESC Tools to upload valid firmware parameters | --- ## ID Assignment * Each of the 4 ESCs on the 4-in-1 board has a unique ID (0-7). The ID is used in software for UART communication. * IDs are hard-wired on the PCB using 3 inputs to each MCU (thus giving 2^3=8 possible IDs). Two of these pins are different for each MCU and third pulled low by default for 0-3 IDs. (third pin is ID_SELECT2 - see Hardware Diagrams section) is shared for all ESCs, and is selectable via resistor (see [datasheet](/voxl-esc-datasheet/), "ID 4-7 Selection Jumper" in Hardware Overview). If pulled high via a resistor, all ESCs will have IDs in range (4-7). * This allows to easily configure a board (using hardware resistor) for the desired ID range. * The bootloader and firmware will read the state of all three ID_SELECTx pins and determine their IDs during initialization. --- ## ESC Spin Test Example command: `python3 voxl-esc-spin.py --device /dev/ttyUSB0 --baud-rate 250000 --id 0 --power 15 --timeout 3` The following bash script can be used for production testing. Copy the text and save to a file called `test_esc_motors.sh` in your preferred work directory. In `test_esc_motor.sh` update the DIR variable to your voxl-esc tools installation directory. Update POWER and TIMEOUT per your testing requirements. Update DEVICE only if your USB-to-Serial dongle comes up as a different one on your device. ``` #!/bin/bash DIR="$HOME/projects/voxl-esc" DEVICE="/dev/ttyUSB0" BAUD="250000" POWER="10" TIMEOUT="5" cd $DIR/voxl-esc-tools/ for mot in {0..3} do python3 voxl-esc-spin.py --device $DEVICE --baud-rate $BAUD --id $mot --power $POWER --timeout $TIMEOUT --skip-prompt True done ``` After you save the file, run the command to make it executable: `chmod +x test_esc_motors.sh` To Run: `./test_esc_motor.sh` Disconnecting ESC plug: Use caution when unplugging the wire from the ESC. DO NOT pull on the wires as this will cause the cable/plug to break and need repair/replacement. Use your nails or a similar tool (such as a spudger) to grab/pry/pull on the outside edges of the connector. Just be gentle with it. Take caution to not bend any of the pins on the ESC board --- ## Calibration While VOXL ESCs are capable of running in open-loop mode like a hobby ESC, they are intended to run in RPM feedback loop mode for maximum performance and flight dynamics that don't change through battery degradation. This requires bespoke ESC parameters that define the behavior and calibration for every motor/prop/battery combination. See the dedicated [VOXL ESC Calibration](/voxl-esc-calibration/) guide for the full procedure: safety rules, power-source requirements, reading the calibration plots, and applying the results. The repo's [calibration.md](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/calibration.md) has additional reference material. ## ESC Recovery If an ESC stops responding after a failed or interrupted params/firmware update, it is usually recoverable: - An ESC detected only at **57600 baud** is in its fallback state — its **params are invalid**. Re-run `voxl-esc-upload-params.py` with your params file (it retries across baud rates), verify with `voxl-esc-verify-params.py`, then update firmware. - Rapidly blinking LEDs after a firmware update mean the ESC is sitting in its **bootloader waiting for a flash** — not bricked. Re-run the firmware upload. - Individual channels can be recovered by ID, e.g. `./voxl-esc-upload-firmware.py -f --id 0`. Note the tool's "perform manual power cycle" prompt only helps when the ESC can be power-cycled independently of the VOXL — if they share a battery, power-cycle both. - Full walkthrough: [recovery.md](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/recovery.md) in the repo. ## Other Resources - [VOXL ESC V2 Datasheet](/voxl-esc-datasheet/) - [PX4 Integration User Guide](/modal-esc-px4-user-guide/) ## Tones and Beeps VOXL ESCs play tones through the motors (motors act as speakers; tones only play while the motors are stopped). Two mechanisms exist: - **Startup tones** are defined in the firmware parameters: the `tone_freqs`, `tone_durations`, and `tone_powers` arrays in the params XML. Frequency values are relative 0-255 where the pitch is roughly `value x 10 Hz` (200 = 2kHz); durations are in units of 10ms; powers max at 255. - **On-demand tones** can be played with `voxl-esc-tone.py --frequency <20-255> --duration <0-255> --power <0-255>` (add `--mode sweep` for a frequency sweep). The same relative-frequency and 10ms-duration units apply (firmware 39.16 and newer). > Sending a tone command with frequency, duration, and power all zero replays the ESC's stored startup tone (firmware 39.20 and newer) — this is intentional, not a bug. The PX4 driver exposes the same mechanism via its tone command; note its help text calls the first argument a "period", but the value is in fact the relative frequency described above. ## FAQ Q: When I apply power, the board continuously flashes the LED very quickly and nothing else happens (not motor tones). What is wrong? A: If board is in this state, it means it has only bootloader installed but no firmware. Upload appropriate firmware using ESC Tools --- Q: When I apply power, the board flashes LED for 1 second, then flashes 10 times more slowly and emits a sad motor tone. What is wrong? A: Try to use ESC scan feature in ESC Tools. If it detects ESC at 57600, then it means there are no params uploaded. Upload appropriate params using the ESC Tools --- Q: When is ESC Calibration Required? A: When switching battery types (from 3S LiPo to 4S LiPo, etc), or when a new type of motor or new type of propeller is used. --- Source: https://docs.modalai.com/voxl-esc-calibration/ # VOXL ESC Calibration ## What Calibration Is Unlike hobby ESCs, ModalAI ESCs normally run **closed-loop RPM control**: PX4 commands an RPM, and the ESC holds it regardless of battery sag. To do this well, the ESC needs a feed-forward model of your specific motor + propeller: a quadratic fit of motor voltage versus RPM, stored in the ESC params as `pwm_vs_rpm_curve_a0`, `a1`, and `a2`. Calibration is the procedure that measures that curve. **When you need it:** - You are using a motor/propeller combination that ModalAI does not ship params for, or - You changed battery cell count (e.g. 4S to 6S) for an existing combination. **When you do NOT need it:** - Stock ModalAI drones and dev kits — correct params are already loaded and [available on GitLab](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-params). - Replacing a motor or prop with an identical part. Calibration characterizes the motor/prop **type**, not the individual unit. - Installing a new ESC board into an existing vehicle — just load the vehicle's existing calibrated params onto it. ## Safety First > Calibration is the highest-risk ESC operation. It runs the motor in **open-loop power mode with fewer safety checks** than normal RPM-mode operation, with propellers attached, at up to high power. Bolt the vehicle down rigidly, keep everyone clear of the propellers, and wear safety glasses. - **Propellers must be attached.** Calibrating without props produces plausible-looking but wrong coefficients — the motor must be under real load. - The frame or test stand must be **rigidly attached to a solid structure**. - Start with a power-limited pass (`--pwm-max 50`) before going to full power. - The tools abort automatically if ESC temperature exceeds 100°C; keep an eye on the live temperature output. Ideal is under 60-70°C, 80°C is acceptable, 90°C is worrying. ## Power Source: Battery, Not Bench Supply Use a **battery of the nominal voltage you will fly with**, not a bench power supply. Two reasons: 1. **Current limit.** A small supply (for example a 3A wall adapter) hits its current limit as the motor loads up and its voltage sags — the ESC can't draw the required power, and the resulting calibration is useless. If you see the voltage dropping in the tool output as power steps up, your supply is the problem. 2. **Regenerative braking.** ESCs push energy back into the supply when decelerating. A battery absorbs this; most bench supplies cannot sink current, so the voltage spikes into the ESC's protection diode and can eventually damage the board. See [the regenerative braking explainer](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/doc/regenerative_braking.md). If you must use a supply: it needs an adequate current rating for your motors, set the `brake_to_stop` ESC param to `0` (coast to stop), avoid aggressive high-to-low RPM transitions, and step `--pwm-max` up gradually (40-50 first, then 60, 70, 80, 90 across runs). Calibration itself steps power *upward* and ends with a coast-down, so it does not produce large regen events — but the current-limit problem still applies. ## Prerequisites Before calibrating, load a params file with correct basic values for your setup — start from a [generic board file](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-params/boards) and set: - `num_cycles_per_rev` — the motor's **pole pairs** (not magnet count; typically 6 or 7 for 5-inch class motors). If this is wrong, every RPM number is wrong. - `vbat_nominal_mv` — nominal battery voltage (e.g. 4S = 15200, 6S = 22200). - `motor_kv` — the motor's true kV rating (used by the spin-up procedure). - `spinup_type` = `1` (sinusoidal spin-up — the reliable, recommended mode). Then confirm basics with a low-power spin test (props on, 10% power) and check rotation direction before calibrating. On VOXL 2, stop PX4 first and use the installed tools: ```bash systemctl stop voxl-px4 cd /usr/share/modalai/voxl-esc-tools ``` The SDK-installed tools may lag the latest; for newest fixes use the [voxl-esc repo](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) `dev` branch. Alternatively, connect the ESC directly to a Linux PC with a USB-serial adapter — you get plots instantly and it removes VOXL 2 from the equation. ## Procedure Calibrate one ESC channel (the tool spins one motor at a time by design): ```bash # power-limited first pass ./voxl-esc-calibrate.py --id 0 --pwm-min 10 --pwm-max 50 # full-range pass once the limited pass looks good ./voxl-esc-calibrate.py --id 0 ``` The tool steps open-loop power from `--pwm-min` to `--pwm-max`, holds each step half a second, and fits the settled samples. It prints the three coefficients and writes `calibration_results.html` **into the directory you ran it from**. Viewing the plot requires internet access (it fetches the plotting library) — on VOXL 2 pull the file to your PC with `adb pull` and open it there. > On the FPV ESC (M0138), calibrate on **ID 2** if you want current shown in the plots — it is the only channel that measures (total board) current. On the Mini ESC (M0129) that channel is ID 3. Current is only a sanity check; it is not used in the calibration math. ## Reading the Plots Judge the calibration by the plots, not the coefficients — a0/a1/a2 are just a curve fit and can look reasonable even when the underlying data is bad. - **Motor voltage vs RPM** (the fit itself): should be a smooth shape with a slight quadratic upward trend. An upward *curl* at the high end means the motor isn't running optimally — try raising `timing_advance` from 0 to 20 and re-run. - **Current vs time**: roughly quadratic as power steps up. Sudden jumps, or current flatlining while voltage sags, mean supply problems or desync. - **RPM vs time**: the highlighted samples are the settled ones actually used for the fit. Look for sudden jumps up or down — a jump to a bogus high RPM with low current is a desync signature. Good reference plots are in the repo's [calibration guide](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/calibration.md#sample-calibration-results). ## Applying the Results 1. Copy `pwm_vs_rpm_curve_a0/a1/a2` into your params XML **with at least 6 decimal places** — truncated coefficients bend the curve. 2. Measure `min_rpm`: spin at `--power 10` and read the RPM. Measure `max_rpm`: spin at `--power 100 --ramp-time 3.0 --timeout 3.5`. 3. Upload and verify: ```bash ./voxl-esc-upload-params.py --params-file my_vehicle.xml ./voxl-esc-verify-params.py ``` If you calibrated multiple motors and want a single curve: do **not** average the coefficients — that produces a wrong curve. Refit one polynomial over the pooled data points instead. In practice CW and CCW props produce slightly different curves and either (or the pooled fit) works; the ESC's PI controller absorbs small deviations. ## RPM Controller Parameters Calibration produces only the feed-forward curve. The closed-loop RPM controller in the ESC firmware also depends on the feedback parameters in the same `TuneParams` block, and the untuned board starting files (for example `esc_params_prod_m0138.xml`) ship with all of them set to `0`, commented "RPM controller params are disabled since motor is not tuned". Copying only `a0/a1/a2` into such a file leaves the controller disabled. How the controller uses these parameters: - **Feed-forward:** for the desired RPM, the calibration curve gives the motor voltage (duty cycle) to apply. Battery voltage compensation keeps this accurate as the pack voltage changes. - **Feedback:** proportional and integral terms with gains `kp` and `ki`, and error caps `max_kpe` and `max_kie`. - **`max_rpm_delta`:** caps the target RPM relative to the current RPM. The controller computes `rpm_error = rpm_desired - rpm_current`, limits it to `max_rpm_delta`, and uses `rpm_current + rpm_error` as the operating point for the feed-forward lookup. The cap prevents very aggressive drive when a motor is spinning far below its target (for example when it is fouled), which could burn out or desync the motor. Because the capped error also feeds the feed-forward lookup, `max_rpm_delta` set to `0` forces the error to zero and the motor never leaves minimum RPM, even with a valid calibration curve. `kp` and `ki` at `0` are acceptable as a starting point: the ESC then runs on feed-forward plus voltage compensation alone and responds like a conventional ESC. A non-zero `max_rpm_delta` is required in every case. **Symptoms in PX4** when `max_rpm_delta` is `0`: motors spin up on arming but stay near arming speed regardless of throttle; the PX4 log shows every motor capped at a low RPM (about 2200 RPM in a reported case); the QGroundControl actuator sliders behave the same way in RPM mode, but work once **ESC Command Type** is switched to PWM, because open-loop power commands bypass the RPM controller. **Inspect** the parameters currently loaded on the ESC (props off, PX4 stopped): ```bash systemctl stop voxl-px4 cd /usr/share/modalai/voxl-esc-tools ./voxl-esc-verify-params.py --save-params 1 ``` This writes `esc0_params.xml` through `esc3_params.xml` into the current directory. Check `kp`, `ki`, `max_kpe`, `max_kie` and `max_rpm_delta` in `TuneParams`. **Fix:** set the controller parameters in your params XML and upload again. ModalAI's tuned files in [voxl-esc-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-params) use `kp` 50 to 100, `ki` 20 to 30, `max_kpe` 100 to 300, `max_kie` 30 to 100 and `max_rpm_delta` 5000 to 6000. For a new motor and propeller combination, start with `kp` and `ki` at `0` and a non-zero `max_rpm_delta`, confirm RPM tracking with `./voxl-esc-spin.py --id --rpm --ramp-time 2.0` (props on, vehicle secured), then raise `max_rpm_delta` and add `kp` and `ki` while checking that the response stays stable. ```bash ./voxl-esc-upload-params.py --params-file my_vehicle.xml ./voxl-esc-verify-params.py ``` ## Troubleshooting | Symptom | Likely cause | |---|---| | Motors hold minimum/arming RPM in PX4 regardless of throttle; PWM command type works | `max_rpm_delta` is `0` in the ESC params, see [RPM Controller Parameters](#rpm-controller-parameters) | | Voltage sags as power steps up | Power supply current-limited — use a battery | | Motor won't even attempt to spin | Supply voltage dipping below the MOSFET driver's ~4.5V lockout — weak supply or bad wiring | | Motor squeals, RPM jumps to a bogus value, current low | Desync — use sinusoidal spin-up; for motors under ~800kV see the [low-kV tuning guide](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/doc/low_kv_motor_tuning.md) | | Tool aborts with overheat error | ESC hit 100°C — let it cool, add airflow, reduce `--pwm-max` | | Coefficients look fine but flight is bad | Calibrated without props, wrong `num_cycles_per_rev`, or prop too large for the motor | | RPM never settles between steps | Prop too large for the motor | More depth: the repo's [calibration.md](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/calibration.md) and the [ESC FAQ](/voxl-escs/faq/). --- Source: https://docs.modalai.com/modal-esc-px4-user-guide/ # Using VOXL ESCs with PX4 --- ## Overview The VOXL 2, VOXL Flight and Flight Core systems provides the ability to easily and quickly interface with UART ESCs. The following guide provides you the necessary details on doing so. ## PX4 1.14 and Newer (eg. VOXL2) using Voxl ESC The `modal_io` driver was renamed to `voxl_esc` starting in SDK 1.1.1 and voxl-px4 version 1.14.0-2.0.58 or newer, additional information can be found in the [release notes](/old-release-notes/). The `voxl_esc` driver is used to interface with the VOXL ESC and can be configured using the QGroundControl Actuators tab or manually using the command line on target. The driver is located at [src/drivers/actuators/voxl_esc](https://github.com/modalai/px4-firmware/tree/voxl-dev/src/drivers/actuators/voxl_esc). ### Actuator Setup using QGC #### Example Screen Shot with Labels > - we've not yet seen the "Identify & Assign Motors" work with any flight controller at the time of this writing so please do not rely on using this. ![QGroundControl Actuators tab with numbered labels](/images/voxl-esc/px4/px4-1.14-voxl-esc-qgc-actuators-tab.png) #### Instructions using QGC - Click on the **Actuators** tab - In the **Configure** drop down (#1 in graphic above), select `VOXL ESC` - reboot the vehicle - Inspect the wiring of your ESC to motors, e.g.: ![ESC to motor wiring example](/images/voxl-esc/px4/m0117-px4-mapping.png) - Use this for configuring the ESC **Function** (#2 in graphic). Note the silkscreen is 0 based... In the following example we have: - silksreen ID0 --> ESC 1 --> wired to PX4 motor 1 --> `ESC 1 = Motor 1` - silksreen ID1 --> ESC 2 --> wired to PX4 motor 4 --> `ESC 2 = Motor 4` - silksreen ID2 --> ESC 3 --> wired to PX4 motor 2 --> `ESC 3 = Motor 2` - silksreen ID3 --> ESC 4 --> wired to PX4 motor 3 --> `ESC 4 = Motor 3` - Do not use "Rev Range" option - Configure the **Bitrate** if needed (#3). For VOXL2, the default is `2000000`, for FCv1/v2, use `250000`. - Configure the **RPM Min** and **RPM Max** based on your motor selection - The **ESC Command Type** and **ESC Minimum Power** entries correspond to the `VOXL_ESC_CMD` and `VOXL_ESC_PWR_MIN` params below - Using the **Actuator Testing** section, you can enable using a slider (#4) and use the motor sliders (#5) to spin the motors manually - Note: currently VOXL2 needs to use command line for this - If needed, change the **ESC Spin Direction** for a given ESC ID (#6) ### Actuator Setup Using Command Line - Configure mapping using `VOXL_ESC_FUNCX` params, where: - Motor 1 = `101` - Motor 2 = `102` - Motor 3 = `103` - Motor 4 = `104` - In the above example, we'd have: ``` VOXL_ESC_CONFIG = 1 VOXL_ESC_MODE = 0 VOXL_ESC_FUNC1 = 101 VOXL_ESC_FUNC2 = 104 VOXL_ESC_FUNC3 = 102 VOXL_ESC_FUNC4 = 103 VOXL_ESC_SDIR1 = 0 VOXL_ESC_SDIR2 = 0 VOXL_ESC_SDIR3 = 1 VOXL_ESC_SDIR4 = 0 VOXL_ESC_RPM_MAX = 8000 VOXL_ESC_RPM_MIN = 3000 ``` ### Actuator Testing Using Command Line - To spin motor 1 at 10% for 1 second, the following command can be used, in which we'd expect the **front right motor** to spin: ```actuator_test set -m 1 -v 0.1 -t 1``` (on VOXL 2, the command is prefixed: `px4-actuator_test set -m 1 -v 0.1 -t 1`) - You can also drive an ESC directly through the driver, for example 1000 RPM for 64 command cycles on ESC ID 0: ```voxl_esc rpm -i 0 -r 1000 -n 64``` ### PX4 Params The following are the PX4 parameters that are used by the `voxl_esc` driver: ![VOXL ESC parameters in QGroundControl](/images/voxl-esc/px4/px4-1.14-qgc-voxl-esc-params.png) | Name | Description | Min > Max (Incr.) | Default | Units | |--------------------|--------------------------------------------------------------------------------------------------------------|-:-:---------------|-:-:----------|-:-:------| | `VOXL_ESC_CONFIG` | UART ESC Configuration
**Values:**
- 0: Disabled
- 1: VOXL ESC

**Reboot Required** | | 0 (Disabled) | | | `VOXL_ESC_BAUD` | Baud rate between FlightController and Actuator | (1) | 250000 | Bits/sec | | `VOXL_ESC_FUNC1` | [info](https://docs.px4.io/main/en/concept/control_allocation.html) | 0, 101-104 | 0 | | | `VOXL_ESC_FUNC2` | [info](https://docs.px4.io/main/en/concept/control_allocation.html) | 0, 101-104 | 0 | | | `VOXL_ESC_FUNC3` | [info](https://docs.px4.io/main/en/concept/control_allocation.html) | 0, 101-104 | 0 | | | `VOXL_ESC_FUNC4` | [info](https://docs.px4.io/main/en/concept/control_allocation.html) | 0, 101-104 | 0 | | | `VOXL_ESC_SDIR1` | Reverse spin direction of ESC ID 0 | 0 > 1 | 0 | | | `VOXL_ESC_SDIR2` | Reverse spin direction of ESC ID 1 | 0 > 1 | 0 | | | `VOXL_ESC_SDIR3` | Reverse spin direction of ESC ID 2 | 0 > 1 | 0 | | | `VOXL_ESC_SDIR4` | Reverse spin direction of ESC ID 3 | 0 > 1 | 0 | | | `VOXL_ESC_RPM_MAX` | Maximum RPM, used by actuator output to determine thrust fullscale. | (1) | 15000 | RPM | | `VOXL_ESC_RPM_MIN` | Minimum RPM, used by actuator output to determine thrust fullscale. | (1) | 5500 | RPM | | `VOXL_ESC_CMD` | ESC command type: 0 = RPM (closed loop), 1 = PWM (open loop) | 0 > 1 | 0 | | | `VOXL_ESC_PWR_MIN` | Minimum power sent to the ESC | | 0.05 | | | `VOXL_ESC_PUB_BST` | Publish ESC battery status (voltage/current from the ESC) to PX4 | 0 > 1 | 1 | | | `VOXL_ESC_T_WARN` | ESC temperature warning threshold, 0 = disabled | | 0 | deg C | | `VOXL_ESC_T_OVER` | ESC over-temperature threshold, 0 = disabled | | 0 | deg C | | `VOXL_ESC_VLOG` | Enable verbose logging from the driver | 0 > 1 | 0 | | | `GPIO_CTL_CH` | ESC channel used for GPIO control (0 = disabled) | 0 > 6 | 0 | | The following are used to control "Turtle Mode" (flip over after crash, which is currently in test): | Name | Description | Min > Max (Incr.) | Default | Units | |-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|--:-:-----------------------|--:-:----|--:-:------------------| | `VOXL_ESC_MODE` | UART ESC Mode:
**Values:**
- 0: None
- 1: Turtle Mode enabled via AUX1
- 2: Turtle Mode enabled via AUX2
- 3: UART Passthrough Mode
**Reboot Required** | 0 > 3 | 0 | | | `VOXL_ESC_T_PERC` | Turtle Mode Crash Flip Motor Percent (percentage of motor range to use in flip over mode) | 1 > 100
(1) | 90 | Percentage (as int) | | `VOXL_ESC_T_DEAD` | Percentage of fullscale RPM that is in a deadband when in Turtle mode | 1 > 100
(1) | 20 | Percentage (as int) | | `VOXL_ESC_T_MINF` | Minimum stick percentage in the dead zone needed to move | 0.0 > 1.00
(0.01) | 0.15 | Percentage (as float) | | `VOXL_ESC_T_EXPO` | Flip power expo value | 1 > 100
(1) | 35 | Percentage (as int) | | `VOXL_ESC_T_COSP` | Value used to specify the sensitivity for isolating a single motor for spinning | 0.000 > 1.000
(0.001) | 0.990 | Percentage (as float) | ## PX4 1.13 and Older ### Overview > This feature is currently in developer preview and requires loading the PX4 firmware from a branch. - VOXL Flight or Flight Core with [this branch](https://github.com/modalai/px4-firmware/tree/modalai-1.12-dev/src/drivers/uart_esc/modalai_esc) - Note: this is scheduled to release with PX4 v1.12 - A ModalAI UART ESC [VOXL ESC v2, PN: MDK-M0049-1-01 - 4-in-1 UART ESC (gen2)](/voxl-esc-datasheet/) - UART ESC Serial Cable [MCBL-00013-1](/cable-datasheets/#mcbl-00013) ### Video Tutorial For those of you who prefer videos, we have a video tutorial here that covers the software configuration and usage. Note, you'll want to look at the hardware connections below as that part is skipped in this video. TL;DR ### Hardware Connections The guide here describes the connectivity: [VOXL ESC v2 Manual](/modal-esc-v2-manual/) ### PX4 Setup (1.13 and older) #### Enable UART ESC To enable the UART ESC feature, set the `UART_ESC_CONFIG` parameter to a value of `1` and power cycle the vehicle. You can use QGroundControl's **Parameter** feature to query and modify the `UART_ESC` params. The remainder of the settings can be left as default if you followed the hardware connections described in the previous section. ##### TELEM3 The UART ESC uses /dev/ttyS1, same as `TELEM3`. On bootup, if any MAVLink instance is configured to use `TELEM3`, it will be disabled via `boards/modalai/fc-v1/init/rc.board_defaults`. ### PX4 Params (1.13 and older) See the params section above, replacing the `VOXL_ESC` prefix with `UART_ESC` — for example `VOXL_ESC_CONFIG` in 1.13 and older is `UART_ESC_CONFIG`. ### RGB LED Codes This is currently a work in progress. The standard LED codes should output to the all the LED channels in a similar way as other PX4 RGB LED peripherals with the exception that the `breathing` pattern is replaced by a fast blink. ## Debugging Tips ### Setting Up PX4 Motor ID to UART_ESC_MOTORX Say you have the following: M0049 silkscreen `ID0` channel --> wired to a motor at PX4 Motor ID 2 M0049 silkscreen `ID1` channel --> wired to a motor at PX4 Motor ID 3 M0049 silkscreen `ID2` channel --> wired to a motor at PX4 Motor ID 1 M0049 silkscreen `ID3` channel --> wired to a motor at PX4 Motor ID 4 Then you would have the following params set: UART_ESC_MOTOR1 = 2 UART_ESC_MOTOR2 = 3 UART_ESC_MOTOR3 = 1 UART_ESC_MOTOR4 = 4 And you can test by spinning, for example, 1000 RPM for 64 command cycles: ``` # spin PX4 motor #1 (legacy 1.13 modalai_esc driver syntax) modalai_esc -i 1 -r 1000 -n 64 rpm # on current PX4, the equivalent through the voxl_esc driver is: voxl_esc rpm -i 0 -r 1000 -n 64 ``` ## ESC Telemetry and Battery Status Each ESC channel streams telemetry (RPM, voltage, current, temperature, applied power) back over the shared UART. The four channels report round-robin at one quarter of the PX4 update rate — on VOXL 2, PX4 runs at 800Hz, so each channel reports at 200Hz. The `voxl_esc` driver publishes this as `esc_status` (note that PX4 logs it at a lower rate than it arrives). ### Which channels measure current | ESC | Current sensing | |---|---| | VOXL 4-in-1 ESC (M0117, M0134) | **Per-channel** current on every ESC | | VOXL Mini ESC (M0129) | Total board current only, reported by **channel 3** — other channels always read 0.00A | | VOXL FPV ESC (M0138) | Total board current only, reported by **channel 2** — other channels always read 0.00A | This is by design, not a fault — on M0129/M0138 the per-channel current fields are simply not populated. On VOXL 2 with the FPV ESC, the total also includes the VOXL 2's own current draw. ### battery_status from the ESC On boards with total-current sensing, the reporting channel emits an extra telemetry message carrying battery voltage and total current. When `VOXL_ESC_PUB_BST` is `1`, the driver publishes it as `battery_status` — use this when the ESC also powers the system and there is no separate power module. When a power module (APM) is used, set `VOXL_ESC_PUB_BST` to `0` and let the `voxlpm` driver own battery reporting (`POWER_MANAGER=VOXLPM` in `/etc/modalai/voxl-px4.conf`; the Mini-ESC configuration is the exception since the ESC's regulator powers the system). See the [ESC FAQ](/voxl-escs/faq/#px4-related-qa) for the full no-battery_status checklist. A quick bench check that battery telemetry is flowing (props off, PX4 stopped): ```bash cd /usr/share/modalai/voxl-esc-tools ./voxl-esc-spin.py --id 255 --power 0 ``` `--id 255` addresses all detected channels; watch for `BOARD_VOLTAGE` and `BOARD_CURRENT` in the output. The battery message is emitted only by the current-sensing channel, so `--id 2` (M0138) or `--id 3` (M0129) shows the same fields from that channel alone. For PX4 to publish the result as `battery_status`, `BAT1_SOURCE` must be `0` (Power Module) in addition to `VOXL_ESC_PUB_BST` = `1`; with `BAT1_SOURCE` set to `2` (ESCs) the topic is not published. See the [ESC FAQ](/voxl-escs/faq/) for the full battery telemetry setup. ### RPM limits: PX4 and ESC params must match `VOXL_ESC_RPM_MIN` / `VOXL_ESC_RPM_MAX` in PX4 must equal the `min_rpm` / `max_rpm` in the ESC params. The PX4 values do **not** override the ESC — the ESC caps incoming commands itself — but a mismatch silently mis-scales PX4's 0-100% thrust mapping. ### Motor mapping and direction The ESC's channel numbering differs from PX4's motor numbering. Map channels with `VOXL_ESC_FUNC1`-`FUNC4` and reverse individual directions with `VOXL_ESC_SDIR1`-`SDIR4`, then confirm with an actuator test, props off. ### Reviewing ESC data in flight logs The standard [PX4 Flight Review](https://review.px4.io/) does not plot the VOXL ESC's custom telemetry. ModalAI maintains a [fork of flight-review](https://github.com/modalai/px4-flight-review) that adds plots for commanded vs actual RPM, ESC temperatures, per-motor currents (where measured), and total battery current — use it when debugging ESC behavior from logs. ## Development The PX4 Driver source code can be found on [github](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/actuators/voxl_esc) --- Source: https://docs.modalai.com/voxl-escs/faq/ # VOXL ESC Frequently Asked Questions --- ## Important — Please Review ### Using the latest ESC firmware - It is strongly recommended to update the ESC firmware to the latest version upon receipt of a new ESC board - This applies to all ModalAI ESCs - Current ESC firmware version can be queried using `voxl-esc` tools command : `voxl-esc-scan.py` - The latest ESC firmware is hosted on gitlab [ESC Firmware](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-tools/firmware) - Each VOXL2 SDK also includes ESC firmware releases, located in `/usr/share/modalai/voxl-esc-tools/firmware`, however it may not be latest depending on the version of SDK ### ESC params shipped with new ESC boards - ModalAI ESCs standalone ship with ESC parameters used for production testing only - All users must ensure that correct ESC parameters are loaded to the ESC before using the ESC - Loading ESC parameters is done using `voxl-esc` tools, specifically `voxl-esc-upload-params.py` and `voxl-esc-verify-params.py` - New motor / propeller configurations should go through the ESC tuning process, see [ESC Calibration](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/calibration.md) ### voxl-esc tools - `voxl-esc` python tools can be used to query information about the ESC, such as hardware version, firmware version, ESC params as well as updating ESC firmware, ESC params and running calibration and other tests - the latest `voxl-esc` tools are hosted on gitlab, see [voxl-esc-tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools) - the esc params for various vehicles are also hosted on gitlab, see [voxl-esc-params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-params) - a release of `voxl-esc-tools` and `voxl-esc-params` is also included in each VOXL2 SDK, but it may not be the latest version, depending on SDK version (`/usr/share/modalai/voxl-esc-tools` and `/usr/share/modalai/voxl-esc-params`) ## Unboxing and testing new standalone ESC - Remove the ESC from the packaging while following common ESD precautions - Inspect the ESC for any damage, if any damage is found, please contact us via RMA web form or the forum - Plug the ESC power leads into a power supply, appropriately rated for the ESC (12V is supported on all ESCs, but please confirm the spec sheet) - please note that aggressive spin testing using a power supply is highly discouraged due to voltage spikes from regenerative braking (see [Regenerative Braking](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/doc/regenerative_braking.md)) - The ESC should rapidly flash 4 blue status LEDs for 1 second (bootloader mode), then firmware will start and flash the LEDs more slowly several times, after which the blue status LEDs on the ESC will be off - The idle current draw of a standalone ESC will be between 20-30mA at 12V input (no spinning motors, no load connected to the ESC regulated voltage outputs). If current draw in excess of 100mA is observed, it is possible that the ESC has some sort of issue. - Perform a simple spin test - solder motor leads to all four ESC motor outputs - if the ESC parameters for the motor / propeller are available, load the correct parameters using `voxl-esc-upload-params.py` script - perform a simple test at low power using the following `voxl-esc` tools command (without propellers is always best for initial tests) ``` ./voxl-esc-spin.py --id 255 --power 10 ``` - stop the script after a few seconds and verify by looking at the information printed in the terminal that the RPMs of all four ESCs are close to the same (within 5-10%) - see sample output [here](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-tools?ref_type=heads#spinning-motors) - do not perform aggressive spin tests using a power supply, especially step tests which vary the power / rpm up and down ## Q/A ### Q: How do I identify the hardware and software version of my ModalAI ESC? A: - The ESC board can be identified visually by comparing the images from the datasheet : [ESC Docs](/voxl-escs/) - Using Software, it is easy to query the hardware and firmware version of the ESC - `https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc` is the location of primary tools for testing the ModalAI ESCs - use `voxl-esc-scan.py` command, which will detect the ESC and print out the hardware type (M0049, M0117, M0129, M0134, M0138, etc) and the software version and additional information - see [sample output](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/tree/master/voxl-esc-tools?ref_type=heads#scanning-for-escs-on-voxl2) ### Q: `voxl-esc-scan.py` reports firmware version `39` or `39.00`. Which release is that? A: - The ESC firmware returns its exact version in the `Vxy.ab` form (for example `39.25`) only from V39.15 onward. Older firmware reports the major version alone, so `39` or `39.00` can be any V39 release from V39 RC10 (39.10) up to V39.15. - Use the firmware hash printed next to the version to identify the release in the [firmware changelog](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/firmware/FIRMWARE_CHANGELOG.md). Hash `e4f576a0` is not listed there but is the V39 RC10 (39.10) release. - M0138 (FPV ESC) support was added in V39 RC10, so an M0138 reporting `39.00` is running the first firmware that supported the board. - The tools must also be current to display the minor version: `voxl-esc` tools reporting `bin version: 1.9` print `version 39` for 39.25 firmware, while `bin version: 1.10` prints `version 39.25`. The PX4 `voxl_esc` driver start-up output prints only the major version and hash as well. - Update to the latest firmware before troubleshooting motor behavior. ### Q: What behavior should I expect when I power on my ESC? A: See below ### Q: What is the behavior of the four blue on-board LEDs? A: - during the first 1 second after ESC is powered on, the bootloader in each MCU (ESC channel) activates and waits for an optional firmware update. During this first 1 second, the blue LED of each ESC channel will rapidly blink (5-10hz) - after the 1 second has elapsed, if the bootloader will verify the stored firmware and if the ESC has valid firmware installed, the firmware will begin executing, followed by 2-3 slow flashes and a motor beep (if motors are attached and beep is enabled in ESC params) - if there is no valid firmware loaded on one or more ESC channels, those ESC channels will continue to rapidly blink the blue status LED (indefinitely) and will be ready to accept the firmware, which should be loaded using `voxl-esc` tools. - during normal operation or firmware udpate, when there is ongoing communication with the ESC, blue status LEDs will flash continuously. This can be used to confirm communication between the ESC and host / flight controller. ### Q: How do I update ESC Firmware A: - if the ESC is connected to VOXL2, make sure PX4 is not running by stopping it with `systemctl stop voxl-px4` command - use `voxl-esc` tools command `./voxl-esc-upload-firmware-all.sh`, which will automatically detect the ESC type and pick the correct firmware for updating - individual ESC channels can be updated with specific firmware using `./voxl-esc-upload-firmware.py` script (see script help for details) ### Q: How do I troubleshoot communication with my ModalAI ESC when using a serial-to-usb adapter A: - Connect the serial-to-usb adapter to a Linux PC - Make sure TX of the ESC goes to RX of the USB adapter and RX of ESC goes to TX of the USB adapter - Make sure that you are using 3.3V I/O levels on the USB to serial adapter (although 5.0V levels should work and should not hurt the ESC, but no guarantees) - If your ESC configured to used 2Mbit communication rate, make sure your USB adapter supports 2Mbit. Some adapters, such as CP2102 only supports up to 1Mbit - (advanced) Use an oscilloscope to verify that USB adapter is transmitting data to ESC. To avoid any possibility that ESC is affecting the TX signal, disconnect the USB adapter from the ESC, run `voxl-esc-scan.py` command and check that TX signal is observed coming out of the USB adapter using an oscilloscope. The signal should be 3.3V level ### Q: How do I check the model of the serial-to-usb adapter I am using? A: - using `voxl-esc` tools, run `./voxl-esc-scan.py` and the output should be something like: ``` ... INFO: All COM ports: /dev/ttyS0 : ttyS0 /dev/ttyUSB0 : CP2102 USB to UART Bridge Controller - CP2102 USB to UART Bridge Controller ... ``` ### Q: I am using `voxl-esc-scan.py` command, but it is not detecting all four ESC channels? A: This can happen if one or more ESC channel has - corrupt firmware (firmware update interrupted or failed) - corrupt params (parameter update failed) - parameters set to different baud rate from the remaining ESC channels ### Q: What is the easiest way to test spinning the motors to make sure my ESC and motors are working correctly? A: - use `voxl-esc-spin.py` script - use `--ramp-time` parameter to avoid instantly jumping to high power / rpm command right after spin-up - use `--power` command instead of `--rpm` to check the open loop motor response. Rpm control can mask issues because it uses a feedback controller. - use plotting feature to plot the results and make sure all four look similar (within a few hundred rpm) - comparison of the rpm vs power command response from a known good configuration can be used to detect improperly functioning ESC / motor - see help in `voxl-esc-spin.py` script for more information ### Q: What is ESC calibration and when do I need to perform it? A: - The calibration of ModalAI ESCs is different from calibration of traditional ESCs, which typically use PWM signal as control input. - Since the data is sent to ModalAI ESC using serial protocol with error checking, there is no need to calibrate the response to PWM input signal - The calibration actually is designed to characterize the response of the specific motor and propeller in order to perform better RPM control - see https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/calibration.md for details on performing ESC calibration ### Q: How do I locate the IDs (0-3) of each of the four ESC Channels? A: The ID of the ESC channel (0, 1, 2 or 3) is marked on each corner either on one or both sides of the PCB and/or the motor output pads. When in doubt, running `voxl-esc-spin.py` test script for each ID can be used to confirm the ESC channel mapping. Please note that PX4 has parameters to re-map the ESC channels, however from point of view of the ESC itself and the ESC communication protocol, the true ESC ID mapping can be validated using the `voxl-esc` tools. ### Q: How is spin direction of the motor determined and how do I reverse it? A: The Spin direction of the motors depends on the wiring of the motor and the direction configuration in the ESC firmware. By default, all ESC params are set up to alternate directions, so if four motors are wired to the ESC in the same way, their spin directions will alternate (this simplifies production and testing). If a reversal of motors is required, it is recommended to simply switch the order of any two motor phases at the ESC solder pads. ### Q: How do I see the temperature of the ESC? A: The temperature of the ESC board is measured by each MCU on the ESC board and is continuously reported to the Flight Controller. `esc_status` topic on PX4 contains the ESC temperature of each ESC channel as well as `voxl-esc` test spin functions provide the temperature information. the M0138 ESC reports two temperature measurements taken at the two MCUs and two measurements taken by separate temperature sensors located next to mosfets. ### Q: How can I see the current measurement of each ESC channel and total current? A: The current measurement of each ESC channel is reported as part of the ESC communication protocol for those ESCs that have individual current sensing (M0049, M0117, M0134, but not M0129, M0138). The ESCs which only report total current sensing will report 0 for individual channel current and will send out a special packet (along with the standard esc telemetry packet) with the total board current and voltage information. This special packet is parsed by `voxl-esc` tools during testing as well as PX4 for reporting the battery status without using an APM ### Q: Does M0138 Racing ESC need an external capacitor? A: The Racing ESC (M0138) has more than 1000uF of surface mount capacitors, which is sufficient for most applications ### Q: Does the Mini ESC (M0129 standard 4S version) support 4S LiHV battery? A: Yes, the mini esc (standard 4S version) supports voltages up to at least 18V. The TVS protection diode will start clamping / conducting around 19-20V, depending on temperature, which means exceeding this voltage will result in the TVS diode overheating and burning out. ### Q: I have a M0134-6 ESC (6S version), however the marking on PCB states 2-4S. Which specification is correct? A: The M0134-6 ESC does in fact support up to 6s LiPo input voltage. The PCB markings from the 4S version have not been updated for the 6S version. There should be a -6 sticker on the ESC itself and the ESC will be detected as `M0134-6` when using `voxl-esc-scan.py` tool to detect the ESC with software. ### Q: Can the VOXL FPV ESC (M0138) run on 7S or 8S? A: No. The operating input range is 2S to 6S. The 40 V figure in the datasheet is the rating of the MOSFETs and other components, which provides margin for back-EMF, regenerative energy, wiring faults and transients above the nominal operating voltage; it is not headroom for a higher cell count. A 7S pack (29.4 V fully charged) is outside the operating range. ModalAI has no plans to support more than 6S on its ESCs at this time. ### Q: The voxl-esc tools don't detect my ESC at all. What should I check? A: Work down this ladder — it covers nearly every case we see: 1. **Is PX4 running?** The tools and PX4 can't share the ESC UART. Run `systemctl stop voxl-px4` first (the `voxl-esc` wrapper does this automatically; the bare python scripts do not). If the DSP gets into a bad state, `systemctl disable voxl-px4`, reboot, scan, then re-enable. 2. **Baud-rate mismatch.** `voxl-esc-scan.py` auto-tries all typical baud rates — but if you passed `--baud-rate` explicitly, remember recent params use 2M while older ones use 250K. If scanning from a PC, note that **CP2102-class USB-serial adapters max out at 1M baud** and silently fail on 2M params — use an FTDI-class adapter rated for 2M. 3. **ESC answers only at 57600 baud?** That is the fallback baud rate, and it means the ESC's **params are invalid** — a failed or interrupted params update. Re-upload your params file (the upload tool retries across baud rates), verify, then update firmware. See the [recovery guide](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/recovery.md). 4. **Stale tools.** The copy in `/usr/share/modalai/voxl-esc-tools` matches your SDK, not necessarily the latest. Newer boards (for example M0129-6) show "unknown board" on older tools — fetch the [latest tools](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc) if your board is newer than your SDK. 5. **Wiring.** RX/TX swapped on a serial adapter, missing ground between adapter and ESC, or debris/shorts on the 4-pin UART connector. 6. If tool commands time out sporadically on VOXL 2, try `voxl-set-cpu-mode perf` while testing. ### Q: My motors run rough, squeal, or get hot. What's wrong? A: Usually ESC params, in this order of likelihood: - `spinup_type` should be `1` (sinusoidal spin-up). The old spin-up mode (`0`) is unreliable, can leave the ESC mis-synchronized with the motor phases (de-sync) — causing rough control and motor overheating — and is being retired from all shipped param files. - `num_cycles_per_rev` must be the motor's **pole pairs** (often 7), not its magnet count. Wrong value = every RPM is wrong. - `min_rpm`/`max_rpm` must be realistic for your motor and prop (a 200 min_rpm is far too low for most motors; verify the motor actually reaches your max_rpm). - `spinup_power` around 100-120 is typical; find the minimum power that spins up reliably and add ~10%. - The a0/a1/a2 curve must come from an actual [calibration](/voxl-esc-calibration/) of your motor/prop combination. - Low-kV motors (under roughly 800kV) need the dedicated timing settings (`timing_advance`, `sense_advance`, `demag_timing`) — see the [low-kV tuning guide](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/doc/low_kv_motor_tuning.md). - A de-sync signature in test plots: motor squeals, reported RPM jumps to a bogus high value, current stays low. ### Q: One motor doesn't spin (or stops in flight) while the others are fine. A: Triage in this order: 1. Check `motor_kv` and battery voltage in the params match reality — the spin-up procedure depends on both. 2. Try a longer spin-up (`spinup_time_ms` 500 → 1000) and ~20% more `spinup_power`. 3. If it spins: compare its RPM at a fixed commanded power against the other motors. A noticeably slower motor under load often has a **partially shorted winding** — the classic cause is **motor mounting screws that are too long penetrating the windings**. Verify with a milliohm meter: phase-to-phase resistance should match across identical motors within a few percent. 4. Swap the suspect motor to a different ESC channel. If the problem follows the motor, it's the motor; if it stays with the channel, contact support about the ESC ([RMA](https://www.modalai.com/pages/rma)). 5. For intermittent in-flight stops, also inspect motor wires under zip ties, bullet-connector insulation, and anything conductive (camera flex edges) touching the ESC. ### Q: A motor with no propeller desyncs on the bench above roughly 2500 RPM. Is the ESC faulty? A: Bench tests without a propeller are not representative. The RPM controller assumes a loaded motor and uses tuning parameters measured with the propeller on; an unloaded motor behaves very differently, and ModalAI runs robustness and step-response tests with propellers fitted. A reported case on the FPV ESC (M0138) with a 650 kV motor on 5S desynced at the spin-up to closed-loop handoff for RPM targets above about 2500 RPM when unloaded, and did not desync with the propeller on. An unloaded motor is not expected to desync, so report it if it happens, but validate the setup with the propeller on before drawing conclusions about the firmware or the ESC. Use `--power` rather than `--rpm` for open-loop bench checks (see the spin-test question above). ### Q: How hot is too hot for the ESC? A: Ideal is **under 60-70°C**; 80°C is acceptable; 90°C is worrying; **100°C+ is critical** — firmware refuses to start motors above 100°C and the tools abort tests. Temperature is logged in PX4 logs and printed live by the spin tools. Notes: on most boards the sensor is inside the MCU, so the MOSFETs run hotter than the reading; on the FPV ESC (M0138) channels 0 and 3 report dedicated board sensors while channels 1 and 2 report MCU temperature (typically 5-7°C higher). Prop wash cools far better than a small bench fan; a heat spreader helps the physically small Mini ESC significantly. ### Q: Can I use a bench power supply instead of a battery for testing? A: Sometimes — but understand the limits. ESCs regeneratively brake on every high-to-low RPM transition, pushing current back at the source. A battery absorbs it; most supplies cannot sink current, so voltage spikes into the ESC's protection (TVS) diode, which can burn out under repeated/sustained spikes. Rules of thumb: - Steady-state runs and slow transitions: fine, if the supply's current rating is adequate (a 3A wall adapter is **not** — it sags and ruins tests). - Aggressive low-to-high steps: OK. Aggressive **high-to-low** steps and loaded step-down tests: battery only. - Set the `brake_to_stop` param to `0` and stop motors by ceasing commands, not by commanding a low RPM first. Full explanation: [regenerative braking](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-esc/-/blob/master/voxl-esc-tools/doc/regenerative_braking.md). ### Q: Can the ESC power my VOXL 2 / VOXL 2 Mini? A: Depends on the board: | ESC | Powers VOXL 2 / Mini? | |---|---| | VOXL Mini ESC (M0129 family) | **Yes** — built-in regulator; `-63` variant outputs 3.8V (VOXL 2 Mini), `-65` outputs 5.0V (VOXL 2). 4S-rated boards vs 6S per variant. | | VOXL FPV ESC (M0138) | **Yes** — includes a VOXL 2 power regulator, no separate power module needed. | | VOXL 4-in-1 ESC M0134-6 (6S) | **No** — its aux 5V regulator is only 0.5A; VOXL 2 needs 5V at 5A+. Use a [power module](https://www.modalai.com/products/mdk-m0041-1). | Tip for identifying Mini ESC variants: a bare "M0129" label almost always means M0129-3 (4S). The 6S versions carry a small `-63` or `-65` sticker on the white 4-pin connector. ### Q: Can I use a third-party ESC (DShot / PWM) with VOXL 2? A: Short version: **VOXL 2 cannot generate DShot signals**, and DShot ESC support is not on the roadmap. The VOXL 2 IO board (M0065) has hardware capable of it, but the feature is unsupported. **OneShot125 does work** through the VOXL 2 IO board, but requires rebuilding voxl-px4 with a one-line output-scale change. Conventional 1000-2000µs PWM ESCs work through the VOXL 2 IO board — see the [VOXL 2 IO user guide](/voxl2-io-user-guide/). If you want ESC telemetry (RPM, voltage, current, temperature per channel), use ModalAI ESCs — that path is not supported for third-party ESCs. Conversely, ModalAI ESCs can accept **PWM input** from a third-party flight controller on the aux pads (M0049/M0117/M0129/M0134, not M0138) — see the [Mini ESC datasheet](/voxl-mini-esc-datasheet/#pwm-inputs--outputs). PWM maps to % power (not RPM), 1000-2000µs; use 950µs to keep motors stopped, operate at 1050µs and above, and note that spin-direction reversal via PWM is not supported and any valid UART packet disables PWM input until reboot. ## PX4-Related Q/A ### Q: I have a M0129 (or M0138) ESC and it supposed to report `battery_status`, however battery status is not available. A: If px4 is running and `px4-listener battery_status` outputs "never published", this most likely means that px4 driver `voxl_esc` could not detect the ESC and the driver is not running. In order to fix this, - confirm that the ESC is actually powered on and UART cable is plugged into VOXL2 / VOXL2 mini - run `voxl-esc scan`, which will stop px4 and use `voxl-esc` python tools to try to find the ESC - if the ESC is detected by the scan, note the baud rate that was used to detect the ESC and make sure that px4 param `VOXL_ESC_BAUD` is set to the same value ( typically 250000 (250K) or 2000000 (2M) ) - it is recommended to use higher baud rate, such as 921600, 1000000 or 2000000 in order to avoid ESC communication drops. The ESC baud rate can be changed in the ESC params. 2M baud rate is used in most latest ESC params. - also confirm that `VOXL_ESC_PUB_BST` px4 param is set to 1 (enabled). This tells the `voxl_esc` driver to actually publish the battery status message - set the `BAT1_SOURCE` px4 param to 0 (`Power Module`). This is required for the `voxl_esc` driver to publish `battery_status`; setting `BAT1_SOURCE` to 2 (`ESCs`) will prevent the message from being published - restart PX4 after updating the param(s) and use `px4-listener battery_status` to check the battery status again - if the `voxl-esc scan` command fails to find the ESC, double check all electrical connections between the VOXL and ESC, check for activity of blue status LEDs on the ESC during power on (see other Q/A) - note that ESCs which do not measure total battery current will not report the battery status to PX4 ### Q: My drone won't lift off / thrust ramps up slowly, but ESC telemetry looks fine. A: If the logs show the ESC tracking commanded RPM well, the ESC is doing its job and the issue is almost always PX4 configuration: - `VOXL_ESC_RPM_MIN` / `VOXL_ESC_RPM_MAX` must **match** the ESC params' min/max RPM. PX4's params don't override the ESC (the ESC caps commands) — but a mismatch silently mis-scales PX4's 0-100% thrust calculation. - `SYS_VEHICLE_RESP` slew-rate-limits motor response — check it isn't set unusually low. - `THR_MDL_FAC` should be close to 1 (typically 0.7-0.8) for RPM-controlled ESCs. - Check `CA_ROTORx_AZ` signs — a flipped thrust axis makes PX4 think a motor pushes the wrong way. For deep PX4 tuning questions beyond the ESC interface, the [PX4 support channels](https://discuss.px4.io/) are the right venue. --- Source: https://docs.modalai.com/power-modules/ # Power Modules ModalAI offers high performance 5V power adapters for drones (sUAS, UAVs) and other robotic use cases. These power modules support voltage and current monitoring for estimating battery consumption and remaining charge. The v3 power monitor supports 2S-6S batteries, but does not support hot swapping. The v2 power monitor supports 2S-5S batteries and hot-swapping batteries with a wall power supply. ![hdmi-expansion](/images/other-products/hdmi-usb-accessories/pow-mod.jpg) --- Source: https://docs.modalai.com/power-module-v3-datasheet/ # Power Module v3 Datasheet ![mkit-00028-1.png](/images/voxl/voxlpm/mkit-00028-1.jpg) ## Specification ### Part Numbers Rated up to 6.0ADC output | Part Number | Description | |------------------|---------------------------------------------------------------------------------------------------------------------| | MDK-M0041-1-B-00 | Power Module v3 RevB | | MDK-M0041-1-B-01 | Power Module v3 RevB, With VOXL/VOXL Flight power cable (Molex 4-pin) ([MCBL-00001](/cable-datasheets/#mcbl-00001) | | MDK-M0041-1-B-02 | Power Module v3 RevB, With Flight Core v1 power cable (JST 6-pin) ([MCBL-00003](/cable-datasheets/#mcbl-00003) ) | | MDK-M0041-1-B-03 | Power Module v3 RevB, With Flight Core v2 power cable (JST 4-pin) ([MCBL-00011-1](/cable-datasheets/#mcbl-00011-1)) | ### Inputs - For benchtop development, the [PS-XT60](https://www.modalai.com/products/ps-xt60) wall power supply can be used. **NOTE: the VOXL wall power supply with a barrel jack is not supported** - XT60 LIPO battery input cable via solder pads (XT60 can be changed to anything with a cable, positive on V+IN pad or BAT_IN 0.025" hole, negative on GND pad or 0.025" hole) - LIPO range 2S-6S [2 cell (6.4V min, 7.4V nom, 8.4V max) 6 cell ( 19.2V min, 22.2V nom, 25.2V max)] - Note: Absolute max voltage of design is limited to 28V due to the INA231 current sense IC's. ### Ouputs - XT60 LIPO battery cable output via solder pads ((XT60 can be changed to anything with a cable, positive on V+OUT pad or BAT_OUT 0.025" hole, negative on GND pad or 0.025" hole) - J1: Molex 4-position 22-05-7045 2.5mm R/A male connector, 3A DC continuous per pin @22 AWG (PCB/wire gauge dependent) 4.5A capable regulator for RevA, 6A capable regulator for RevB - Mates with VOXL and VOXL Flight power input connectors via MCBL-00001 or Flight Core via MCBL-00010 - Pin 1: 5V DC OUT - Contact ModalAI for alternate voltage outputs, custom DC voltage outputs may impact LIPO input operational range - Pin 2: DGND - Pin 3: I2C SCL (5V levels) - Pin 4: I2C SDA (5V levels) - Note: Alternate DC voltage outputs above 5V will not impact 5V I2C levels due to dedicated regulator for INA231 devices. Alternate DC voltage outputs below 5V (example 3.3V) will make I2C voltage levels scale lower accordingly (i.e.: ~3.3V). ### I/O - I2C bus @ 5V SCL/SDA on output connector for reading LIPO and 5VDC Voltage and Current metrics with Qty-2 INA231 - LIPO on I2C ADDR 0x44, Device U3 - 5V Output on I2C ADDR 0x45, Device U4 ### Size and Weight PCB weight is 3.9g Full APM with XT60 connector is 34g PCB Dimensions: 21.6mm x 28.75mm ### Sensing A PX4 driver is already integrated starting with PX4 v1.11 and [can be viewed here](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/power_monitor/voxlpm). The maximum amperage that can be read by the driver before saturating the ADC is 90A, although the XT60 connector limits the system useability to 60A. One can tweak the `Rsense` values if needed [here](https://github.com/PX4/PX4-Autopilot/blob/main/src/drivers/power_monitor/voxlpm/voxlpm_params.yaml) ### Operating Range/Environmental - Power Module V3 is qualified for Industrial Temperature operating (ambient) ranges of -40°C to 85°C (non-condensing) - Not designed for dust or moisture ingress protection or solar load protection (no IPxy rating) - Heatshrink over design recommended for short protection from other electronic components - RoHS compliant PCB and PCBA (PCB Assembly) ### Also Known As - May be found referenced as `APM Lite` or `M0041-1-A` (Rev A) / `M0041-1-B` (Rev B) ## 2D/3D Drawings - Dimensions: 21.6mm x 28.75mm [M0041_REVB_CCA_ONLY_NO_WIRES.stp](https://storage.googleapis.com/modalai_public/modal_drawings/M0041_REVB_CCA_ONLY_NO_WIRES.stp) *Note: These 3D files contain all components on them. Some board configurations do not install "DNI" certain connectors or components. Please refer to the included diagrams and design schematics for more detailed information, or contact ModalAI, or post a question on our support Forum.* ## PX4 Driver [scr/drivers/powermonitor/voxlpm](https://github.com/modalai/px4-firmware/tree/modalai-1.10/src/drivers/power_monitor/voxlpm) --- Source: https://docs.modalai.com/power-module-v2-datasheet/ # Power Module v2 Datasheet ![mkit-00002-1.png](/images/voxl/voxlpm/mkit-00002-1.png) ## Specification ### Inputs - For benchtop development, the VOXL-ACC-PS or [PS-XT60](https://www.modalai.com/products/ps-xt60) wall power supplies can be used. - J2: 5V DC Barrel Jack Input - Switchcraft Inc. RAPC712X, 5A contacts - TP3 (+) TP1 (-) XT60 LIPO battery input cable via manual solder pads (XT60 can be changed to anything with a cable) - LIPO range 2S-5S [2 cell (6.4V min, 7.4V nom, 8.4V max) 5 cell ( 16V min, 18.5V nom, 21V max)] - Note: Absolute max voltage of design is limited to 25V due to capacitor ratings. A 27V zener is present which would clamp anything higher than 27V. ### Outputs - J1: Molex 4-position 22-05-7045 2.5mm R/A male connector, 3A DC per pin @22 AWG (PCB/wire gauge dependent) - Mates with VOXL and VOXL Flight power input connectors via `MCBL-00001` or Flight Core via `MCBL-00003` - Pin 1: 5V DC OUT - Pin 2: DGND - Pin 3: I2C SCL (5V levels) - Pin 4: I2C SDA (5V levels) ### I/O - I2C bus @ 5V SCL/SDA on output connector for reading LIPO and 5VDC Voltage and Current metrics with Qty-2 LTC2946 - LIPO on I2C ADDR 0xD4, Device U1 - 5V Output on I2C ADDR 0xD6, Device U2 ### Sensing A PX4 driver is already integrated starting with PX4 v1.10 and [can be viewed here](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/power_monitor/voxlpm). The maximum amperage that can be read by the driver before saturating the ADC is 90A, although the XT60 connector limits the system useability to 60A. One can tweak the `Rsense` values if needed [here](https://github.com/PX4/PX4-Autopilot/blob/main/src/drivers/power_monitor/voxlpm/voxlpm_params.yaml) ### Operating Range/Environmental - Selected to match the hardware designs at the time of 0C to 55C - Not designed for dust or moisture ingress protection or solar load protection ### AKA - May be found referenced as `APM` or `M0009` ## 2D/3D Drawings *Note: These 3D files contain all components on them. Some board configurations do not install "DNI" certain connectors or components. Please refer to the included diagrams and design schematics for more detailed information* ### Physical Dimensions 20mm x 40mm ![apmv2.png](/images/voxl/voxlpm/apmv2.png) --- Source: https://docs.modalai.com/image-sensors/ # Image Sensors Documentation for ModalAI's range of tracking, Hi-Res, Time of Flight, and Stereo image sensors. ![image-sensors](/images/other-products/image-sensors/image_sensors.jpg) ## Choosing an Image Sensor The table below compares the documented sensor boards. Tracking modules are global-shutter monochrome sensors with fisheye lenses intended for VIO; they are calibrated with `voxl-calibrate-camera --fisheye` (see [Calibrate Cameras](/calibrate-cameras/)). Hires and low-light modules are rolling-shutter color sensors calibrated with the pinhole model (no `--fisheye` flag). ToF modules are not calibrated with `voxl-calibrate-camera`. Boards marked (EOL) are end of life; their datasheet pages name the current replacement where one exists. The full adapter and cable chain for each board is in the VOXL 2 Integration table on its page. The sensor type is the token used by the standard voxl-camera-server camera configurations; the configurations are selected by sensor type, so any module with the same token is treated the same. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page for the configuration numbers, and run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | Board | Sensor | Resolution | Shutter | FOV | Role | Sensor type | Interface | Works with | |---|---|---|---|---|---|---|---|---| | [M0014](/M0014/) (EOL) | OV7251 | 640x480 | Global, mono | 166° fisheye | Tracking (VIO) | `ov7251` | Flex to M0076 / M0084 / M0135 | VOXL 2, VOXL 2 Mini | | [M0072](/M0072/) (EOL) | OV7251 | 640x480 | Global, mono | 166° fisheye | Tracking (VIO) | `ov7251`, `ov7251-combo` | 24-pin Molex, M0008 / M0010 flex | VOXL 2, VOXL 2 Mini | | [M0149](/M0149/) | AR0144 | 1280x800 | Global, mono | 162° fisheye | Tracking (VIO) | `ar0144` | Flex to M0076 / M0084 / M0135 | VOXL 2, VOXL 2 Mini | | [M0166](/M0166/) | AR0144 | 1280x800 | Global, mono | 162° fisheye | Tracking (VIO) | `ar0144-fsin` | Micro-coax (MCBL-00084) | VOXL 2, VOXL 2 Mini | | [M0015](/M0015/) (EOL) | OV7251 x2 | 2 x 640x480 | Global, mono, synced | 85° | Stereo depth | `ov7251-combo` | M0010 stereo flex | VOXL 2 | | [M0073](/M0073/) | OV9782, IR-cut | 1280x800 | Global, color | 121° | Color stereo / tracking | `ov9782-combo` | M0010 / M0039 stereo flex | VOXL 2 | | [M0113](/M0113/) | OV9782, no IR-cut | 1280x800 | Global, color | 121° | Color stereo / tracking | `ov9782-combo` | M0010 stereo flex | VOXL 2 | | [M0024](/M0024/) (EOL) | IMX214 | 4208x3120 | Rolling, color | 107° (-1), 146° (-2) | Hires | `imx214` | 36-pin J2, M0036 / M0074 flex | VOXL 2, VOXL 2 Mini | | [M0025](/M0025/) (EOL) | IMX214 | 4208x3120 | Rolling, color | 100° (-1), 81° (-2) | Hires | `imx214` | Flex to M0076 / M0084 / M0135 | VOXL 2, VOXL 2 Mini | | [M0061](/M0061/) (EOL) | IMX412 (-1), IMX678 (-2) | 12.3 MP (-1), 3856x2180 (-2) | Rolling, color | 120° | Hires / low light | `imx412` (-1), `imx678` (-2) | 36-pin J2, M0036 / M0074 flex | VOXL 2, VOXL 2 Mini | | [M0107](/M0107/) (EOL) | IMX412 | 12.3 MP | Rolling, color | 120° | Hires / low light | `imx412` | 36-pin J2, M0036 / M0074 flex | VOXL 2, VOXL 2 Mini | | [M0161](/M0161/) | IMX412 | 4056x3040 | Rolling, color | 120° | Hires / low light / FPV | `imx412-fpv` | Micro-coax (MCBL-00084) | VOXL 2, VOXL 2 Mini | | [M0186](/M0186/) | IMX664 | 2704x1540 | Rolling, color, no IR filter | 150° | Low light / FPV hires | `imx664-fpv` | Micro-coax (MCBL-00084) | VOXL 2, VOXL 2 Mini | | [M0040](/M0040/) (EOL) | PMD IRS1645 | 224x171 | ToF, depth + IR | 85° x 106° | ToF depth | `pmd-tof` | Flex to M0076 / M0084 / M0135 | VOXL 2, VOXL 2 Mini | | [M0169](/M0169/) | PMD IRS2975C | 240x180 | ToF, depth + IR | 106° x 86° | ToF depth | `pmd-tof-liow2` | 36-pin J2, M0036 / M0074 flex, external 5 V | VOXL 2, VOXL 2 Mini | | [M0178](/M0178/) | PMD IRS2975C | 240x180 | ToF, depth + IR | 106° x 86° | ToF depth | `pmd-tof-liow2` | 40-pin flex to M0173 | VOXL 2 | | [M0189](/M0189/) | ST VL53L8CX | 8x8 zones | ToF, range data | 65° | Multizone rangefinder | voxl-mini-tof-server | MCBL-00128 to M0188 / M0195 | VOXL 2 Mini | ## Image Sensor Catalog | NUMBER | DESCRIPTION | WEIGHT | 3D Model | DATASHEET | |:---------|--------------------------------------------------------------|:------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------:| | M0014 | OV7251 167° Tracking Module 9cm Flex | 0.5g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0014%20Tracking%20Camera.STEP) | [Datasheet](/M0014/) | | M0015 | OV7251 Stereo Sensor Module | | | [Datasheet](/M0015/) | | M0024-1 | IMX214 4k Sensor Module (M8 lens 107°) | 3.78g | | [Datasheet](/M0024/) | | M0024-2 | IMX214 4k Sensor Module (M8 lens 146°) | 2.95g | | [Datasheet](/M0024/) | | M0025 | IMX214 4k Sensor Module 8.5mm x 8.5mm | | | [Datasheet](/M0025/) | | M0026 | IMX377 4k Sensor Module (M12 lens) | | | N/A | | M0040 | PMD IRS1645 TOF Module | 3g | | [Datasheet](/M0040/) | | M0061-1 | IMX412 Framos VOXL Interposer | | | [Datasheet](/M0061/) | | M0061-2 | IMX678 Framos VOXL Interposer | | | [Datasheet](/M0061/) | | M0072 | OV7251 167° Tracking Module Molex Connector | 0.4g | [2D Drawing](/images/other-products/image-sensors/M0072-2D.jpg) | [Datasheet](/M0072/) | | M0073 | OV9782 RGB Global Shutter with IR Filter | | | | | M0107 | IMX412 RGB Rolling Shutter with IR Filter | 7.5g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0107-m12.STEP) | [Datasheet](/M0107/) | | M0113 | OV9782 RGB Global Shutter without IR Filter | | | [Datasheet](/M0113/) | | M0143 | IMX678 RGB Rolling Shutter | 7.97g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0143-IMX678.STEP) | | | M0149 | VOXL 2 AR0144 Fisheye Tracking Module | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0149-AR0144.STEP) | [Datasheet](/M0149/) | | M0161 | IMX412 with m12 lens for high-resolution FPV | 7.5g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0161_IMX412_COAX_with_Lens.STEP) | [Datasheet](/M0161/) | | M0166 | AR0144 with m7 lens for VIO Tracking | 1.5g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0166_AR0144_COAX_with_lens.STEP) | [Datasheet](/M0166/) | | M0169 | VOXL 2 PMD IRS2975C TOF Module | 3g | [Adapter](https://storage.googleapis.com/modalai_public/modal_drawings/M0169_LIOW2_TOF_ADAPTER_REVA(-1_MAIN).step) [Module](https://storage.googleapis.com/modalai_public/modal_drawings/PMD_IRS2975C_MODULE.step) | [Datasheet](/M0169/) | | M0171-1 | PMD IRS2975C TOF High Power Adapter Board | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0171_PMD_TOF_HP_ADAPTER_REVA(-1_MAIN).step) | N/A | | M0178-1 | PMD IRS2975C TOF High Power Adapter Board with mounting hole | | [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0178_STARLING_TOF_ADAPTER_REVA_2024-03-07.step) | [Datasheet](/M0178/) | | M0186 | IMX664 with m12 lens for FPV and low light | 10.1g | | [Datasheet](/M0186/) | | IRS2975C | PMD IRS2975C TOF Module | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/PMD_IRS2975C_MODULE.step) | | ## Extending MIPI Image Sensor Cable Lenghts It is strongly recommended to not connect multiple flex cables back-to-back to increase length beyond what ModalAI has shipped as a valid and supported configuration. The risk here includes: * Incorrect connector orientation risk resulting in sensor or Voxl failures (including power to ground shorts) * Adding mating cycles to connectors that have limited life span * Reducing reliability due to increased interconnect points * Increasing the length or creating a configuration beyond the data link limits ModalAI has already proven and supports If your application needs an extended length for your image sensor, please [contact ModalAI](https://www.modalai.com/pages/contact-us) and we can explore a custom flex/cable hardware and software solution that will work for you. --- Source: https://docs.modalai.com/M0014/ # VOXL Tracking Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current tracking sensors are the AR0144-based [MSU-M0166](https://www.modalai.com/products/msu-m0166) (micro-coax) and [MSU-M0149-1](https://www.modalai.com/products/msu-m0149-1) (with cable). ## Table of Contents 1. TOC ![MSU-M0014picture.jpg](/images/other-products/image-sensors/MSU-M0014picture.jpg) Tracking VGA sensor and flex cable to connect to VOXL® and VOXL 2 for indoor flight, GPS-denied navigation VIO and global shutter computer vision processing. This module is based on an OV7251 VGA, global-shutter CMOS sensor with fisheye lens. ## Specification ### MSU-M0014-1-01 OV7251 166° FOV (EOL) | Specification | Value | |----------------|--------------------------------------------------------------------------------------| | Sensor | OV7251 [Datasheet](https://www.ovt.com/products/ov7251/) | | Shutter | Global | | Resolution | 640x480 | | Framerate | 30,60,90Hz implemented on VOXL, sensor suports up to 120Hz | | Data formats | B&W 8 and 10-bit | | Lens Size | 1/3.06" | | Focusing Range | 5cm~infinity | | Focal Length | 0.83mm | | F Number | 2.0 | | Fov(DxHxV) | 166° x 133° x 100° | | TV Distortion | -20.77% | ### Requirements ### Current/Power Consumption ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0014%20Tracking%20Camera.STEP) #### 2D Diagram [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0014_2D_11-02-21.pdf) ## Module Connector Pinout | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | NC | 4 | NC | | 5 | SDA | 6 | D0VDD1.8V | | 7 | SCL | 8 | NC | | 9 | RST_0 | 10 | XCLK | | 11 | GND | 12 | GND | | 13 | MCP | 14 | STROBE | | 15 | MCP | 16 | NC | | 17 | MDP | 18 | NC | | 19 | MDN | 20 | AVDD2.8V | | 21 | GND | 22 | GND | | 23 | NC | 24 | NC | | 25 | NC | 26 | FSIN | | 27 | NC | 28 | NC | | 29 | NC | 30 | NC | | 31 | GND | 32 | GND | | 33 | NC | 34 | NC | | 35 | NC | 36 | GND | [Pinout Images](https://storage.googleapis.com/modalai_public/modal_drawings/M0014_pinoutImages.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `ov7251` | | Standard camera configurations | C01, C02, C03, C04, C05, C06, C11, C14, C16, C17, C19, C21, C23 (VOXL 2 platform config 0, tracking slot). The configuration files select by sensor type; any `ov7251` module is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0076](/m0076/) or [M0084](/M0084/) (JL) adapter on M0054 J6, J7 or J8 (HW ID 2, tracking) | | Connects to VOXL 2 Mini via | [M0135](/M0135/) (JL or JU), [M0076](/m0076/) (J1) or [M0084](/M0084/) (JL or JU) adapter on M0104 J6 or J7 (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Tracking camera: calibrate with `voxl-calibrate-camera --fisheye` (see [Calibrate Cameras](/calibrate-cameras/)) | ## Image Samples for Sensor ### Indoor ![tracking_in.png](/images/other-products/image-sensors/Samples/tracking_in.png) ### Outdoor ![tracking_out.png](/images/other-products/image-sensors/Samples/tracking_out.png) ## Hardware Design Guidance --- Source: https://docs.modalai.com/M0015/ # VOXL Stereo Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current tracking sensors are the AR0144-based [MSU-M0166](https://www.modalai.com/products/msu-m0166) (micro-coax) and [MSU-M0149-1](https://www.modalai.com/products/msu-m0149-1) (with cable). ## Table of Contents 1. TOC ![MSU-M0015picture.jpg](/images/other-products/image-sensors/MSU-M0015picture.jpg) Stereo VGA monochrome (grayscale) sensor kit that plugs directly into VOXL® and VOXL Flight. With 2 cameras, and some computer vision processing, a depth map can be generated. With a depth map and location, obstacle avoidance can be achieved. This configuration is ideal for outdoor SLAM (Simultaneous Location and Mapping) applications. Uses OV7251 global-shutter, VGA imaging sensors. ## Specification ### MSU-M0015-1-01 OV7251 85° FOV (EOL) | Specification | Value | |----------------|--------------------------------------------------------------------------------------| | Sensor | OV7251 [Datasheet](https://www.ovt.com/products/ov7251/)| | Shutter | Global, Hardware-Synchronized | | Resolution | 1280x480 (640x480 * 2) | | Framerate | up to 60Hz | | Data formats | YUV only | | Lens Size | 1/7.5" | | Focusing Range | 5cm~infinity | | Focal Length | 1.77mm | | F Number | 2.5 | | Fov(DxHxV) | 85° x 68° x 56° | | TV Distortion | < -3.5% | | Weight | 4g | ## Technical Drawings #### 3D STEP File M0015-1 Found Here #### 2D Diagram [M0015-1 Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0015_2D_11-02-21.pdf) ## Module Connector Pinout ### Left | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L23A_2P8 | 4 | CAM_MCLK1_BUFF | | 5 | GND | 6 | GND | | 7 | NC | 8 | CAM1_RST0_N | | 9 | VREG_S4A_1P8 | 10 | L_FLASH | | 11 | GND | 12 | GND | | 13 | CCI_I2C_SCL0 | 14 | MIPI_CSI1_LANE0_CONN_P | | 15 | CCI_I2C_SDA0 | 16 | MIPI_CSI1_LANE0_CONN_M | | 17 | GND | 18 | GND | | 19 | NC | 20 | MIPI_CSI1_CLK_CONN_P | | 21 | CAM_SYNC_0 | 22 | MIPI_CSI1_CLK_CONN_M | | 23 | L_ULPM | 24 | GND | ### Right | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L23A_2P8 | 4 | CAM1_MCLK3 | | 5 | GND | 6 | GND | | 7 | NC | 8 | CAM_RST1_N | | 9 | VREG_S4A_1P8 | 10 | R_FLASH | | 11 | GND | 12 | GND | | 13 | CCI_I2C_SCL1 | 14 | MIPI_CSI1_LANE2_CONN_P | | 15 | CCI_I2C_SDA0 | 16 | MIPI_CSI1_LANE2_CONN_M | | 17 | GND | 18 | GND | | 19 | NC | 20 | MIPI_CSI1_LANE3_CONN_P | | 21 | CAM_SYNC_0 | 22 | MIPI_CSI1_LANE3_CONN_M | | 23 | R_ULPM | 24 | GND | [Pinout Images](https://storage.googleapis.com/modalai_public/modal_drawings/M0015_pinoutImages.pdf) [Module Connector Schematic](https://storage.googleapis.com/modalai_public/modal_drawings/M0015_moduleConnectorSchematics.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `ov7251-combo` (written to the camera server config as `ov7251` with two camera IDs) | | Standard camera configurations | C01, C03, C10, C11 (VOXL 2 platform config 0, stereo slot on J6 lower and/or J8 lower only). The configuration files select by sensor type; any `ov7251-combo` pair is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0010-1](/M0010/) stereo flex plus [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) adapter; [M0008-1](/M0008/) flex plus the same adapters; or [M0109-1](/M0109/) cable with no adapter (SDK 0.7 and greater) | | Connects to VOXL 2 Mini via | Not supported. The M0010 stereo flex is not currently supported in the VOXL 2 Mini camera configurations (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Not documented for this module. The [Calibrate Cameras](/calibrate-cameras/) stereo example does not use the `--fisheye` flag; the 85 degree lens is not a fisheye. | SDK 0.7 and greater. More information [here](/voxl2-camera-configs/). | Cable | Adapter Requirements | |--------------------|-----------------------------------------------------------| | [M0008-1](/M0008/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0010-1](/M0010/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0109-1](/M0109/) | None | ## Image Samples for Sensor ### Indoor Stereo-front left ![stereo_front_l_in.png](/images/other-products/image-sensors/Samples/stereo_front_l_in.png) Stereo-front right ![stereo_front_r_in.png](/images/other-products/image-sensors/Samples/stereo_front_r_in.png) ### Outdoor Stereo-front left ![stereo_front_l_out.png](/images/other-products/image-sensors/Samples/stereo_front_l_out.png) Stereo-front right ![stereo_front_r_out.png](/images/other-products/image-sensors/Samples/stereo_front_r_out.png) --- Source: https://docs.modalai.com/M0024/ # VOXL Hi-res Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current hi-res color sensor is the 4k IMX412-based [MSU-M0161](https://www.modalai.com/products/msu-m0161). ## Table of Contents 1. TOC ![MSU-M0024picture.jpg](/images/other-products/image-sensors/MSU-M0024picture.jpg) ## Specification ### M0024-1 10cm IMX214 107° FOV (EOL) | Specification | Value | |----------------|-----------------------------------------------------------------------------------------------------| | Sensor | IMX214 [Datasheet](https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf) | | Shutter | Rolling | | Resolution | 4208x3120 | | Framerate | up to 60Hz | | Lens Size | 1/3.06" | | Focusing Range | 5cm~infinity | | Focal Length | 3.33mm | | F Number | 2.75 | | Fov(DxHxV) | 107° | | TV Distortion | < 6% | | Weight | 3.78g | ### M0024-2 10cm IMX214 146° FOV (EOL) | Specification | Value | |----------------|-----------------------------------------------------------------------------------------------------| | Sensor | IMX214 [Datasheet](https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf) | | Shutter | Rolling | | Resolution | 4208x3120 | | Framerate | up to 60Hz | | Lens Size | 1/3.06in | | Focal Length | 2.65MM | | F Number | 2.0 +/- 5% | | Fov(DxHxV) | 143° x 106° x 77° | | TV Distortion | < 15% | | Weight | 2.95g | ## Technical Drawings #### 2D Diagram [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0024_2D_11-01-21.pdf) ## Module Connector Pinout for J2 | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | NC | 4 | NC | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | NC | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | NC | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | NC | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | NC | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | NC | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | NC | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | [Module Connector Schematic](https://storage.googleapis.com/modalai_public/modal_drawings/J2moduleConnectorSchematic.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `imx214` (`imx214-flip` when rotated) | | Standard camera configurations | C03, C04, C06, C08, C11, C13, C14, C16, C19, C21 (VOXL 2 platform config 0, hires slot), selected by sensor type only; any `imx214` module is treated the same. No configuration names M0024. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex plus an [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) adapter. The module uses the same 36-pin J2 connector as the [M0107](/M0107/) and [M0061](/M0061/), see the connector schematic below | | Connects to VOXL 2 Mini via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex plus [M0135](/M0135/), [M0076](/m0076/) or [M0084](/M0084/) adapter | | Calibration | Pinhole model, no `--fisheye` flag (see [Calibrate Cameras](/calibrate-cameras/)) | --- Source: https://docs.modalai.com/M0025/ # VOXL Hi-res Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current hi-res color sensor is the 4k IMX412-based [MSU-M0161](https://www.modalai.com/products/msu-m0161). ## Table of Contents 1. TOC ![MSU-M0025picture.jpg](/images/other-products/image-sensors/MSU-M0025picture.jpg) Plugs directly into VOXL®! A 4k High-resolution Camera based on the Sony IMX214 sensor. Enable AI video processing and video recording at 1080p30 or 4k30 using this camera. ## Specification ### M0025-1 8.5cm IMX214 100° FOV (EOL) | Specification | Value | |----------------|-----------------------------------------------------------------------------------------------------| | Sensor | IMX214 [Datasheet](https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf) | | Shutter | Rolling | | Resolution | 4208x3120 | | Framerate | up to 60Hz | | Lens Size | 1/3.06" | | Focusing Range | 5cm~infinity | | Fov(DxHxV) | ~100° | | Weight | <1g | ### M0025-2 8.5cm IMX214 81° FOV | Specification | Value | |----------------|-----------------------------------------------------------------------------------------------------| | Sensor | IMX214 [Datasheet](https://www.mouser.com/datasheet/2/897/ProductBrief_IMX214_20150428-1289331.pdf) | | Shutter | Rolling | | Resolution | 4208x3120 | | Framerate | up to 60Hz | | Lens Size | 1/3.06" | | Focusing Range | 5cm~infinity | | Focal Length | | | F Number | | | Fov(DxHxV) | 81.3° x 69.0° x 54° | | TV Distortion | | | Weight | <1g | ## Module Connector Pinout [Pinout Images](https://storage.googleapis.com/modalai_public/modal_drawings/M0025pinoutImages.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `imx214` | | Standard camera configurations | C03, C04, C06, C08, C11, C13, C14, C16, C19, C21 (VOXL 2 platform config 0, hires slot; M0025-2 is the IMX214 module named on the configuration page). The configuration files select by sensor type; any `imx214` module is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0076](/m0076/) or [M0084](/M0084/) (JL) adapter for HW ID 2 or 4; [M0084](/M0084/) (JU) for HW ID 3 | | Connects to VOXL 2 Mini via | [M0135](/M0135/) (JL or JU), [M0076](/m0076/) (J1) or [M0084](/M0084/) (JL or JU) adapter (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Pinhole model, no `--fisheye` flag (see [Calibrate Cameras](/calibrate-cameras/)) | ## Image Samples for Sensor ### Indoor ![hires_in.jpg](/images/other-products/image-sensors/Samples/hires_in.jpg) ### Outdoor ![hires_out.jpg](/images/other-products/image-sensors/Samples/hires_out.jpg) --- Source: https://docs.modalai.com/M0040/ # M0040 Time of Flight Module Datasheet ## Table of Contents 1. TOC ![MSU-M0040picture.jpg](/images/other-products/image-sensors/MSU-M0040picture.jpg) This sensor module is EOL, please refer to the current [VOXL 2 Time of Flight Module](/M0178/) The PMD Time of Flight (ToF) sensor produces high-fidelity depth mapping indoors up to 6m. When used with the VOXL platform, this sensor is mutually exclusive to the stereo cameras, meaning the stereo cameras need to be replaced with the TOF Add-on. ## Specification ### MSU-M0040-1-01 ([Buy Here](https://www.modalai.com/products/m0178)) | Specification | Value | |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part Number | MSU-M0040-1-01 | | Technology | [PMD](https://pmdtec.com/en/) | | Rate | 5 - 45FPS in configurable option modes for distance / accuracy / framerate | | Exposure Time | 4.8 ms typ. @ 45 fps / 30 ms typ. @ 5 fps | | Resolution | 224 x 171 (38k) px | | FOV (H x W) | 85.1° 106.5° (measured by experiment) | | Range | 4 - 6m | | Illumination | 850nm | | Depth Resolution | <= 1% of distance (0.5 – 4m @ 5fps) <= 2% of distance (0.1 – 1m @ 45fps) | | Time Sync | No physical pin, but the frame timestamp is measured with 50ns precision on a single clock. All of the sensors on the VOXL platform are timestamped for computer vision. | | Power Consumption | <2W | | Weight | 3g | | Dimensions | 24mm x 10.6mm | | Eye Safe | Yes | ### Requirements * VOXL (APQ8096) Requires VOXL System Image 2.3 or greater. * VOXL 2 (QRB5165) Requires SDK 0.9 or greater ## Technical Drawings #### 3D File [Download STEP](https://storage.googleapis.com/modalai_public/modal_drawings/MCAM-00005-TOF-A65.STEP) [Download SolidWorks](https://storage.googleapis.com/modalai_public/modal_drawings/MCAM-00005-TOF-A65.SLDPRT) ## Module Connector Pinout J1 MFPC-M0040 #### Connector Specs | VOXL Board Connector | M0169-1 J? Mating Connector | |---------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | Panasonic, [MPN: AXT336124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | [Panasonic MPN: AXT436124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | #### Pin-out | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L17A_2P8 (AFVDD) | 4 | CAM0_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | CAM0_MCLK3 | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | | 35 | NC | 36 | GND | [Pinout Images](https://storage.googleapis.com/modalai_public/modal_drawings/M0040pinoutImages.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `pmd-tof` (driver `irs1645`) | | Standard camera configurations | C05, C06, C09, C14, C16, C17, C21, C23 (VOXL 2 platform config 0, ToF slot, always J6 lower). The configuration files select by sensor type; any `pmd-tof` module is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0076](/m0076/) adapter on M0054 J6 or J8, or [M0084](/M0084/) (JL or JU) | | Connects to VOXL 2 Mini via | [M0076](/m0076/) (J1), [M0135](/M0135/) (JL or JU) or [M0084](/M0084/) (JL or JU) adapter (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Not calibrated with the chessboard tool | > This guide assumes that you are able to run commands on VOXL2; if you cannot, please see [VOXL Developer Bootcamp](/voxl-developer-bootcamp/). All commands specified below should be run on VOXL2. ### Supported Sensors - M0040-1 (Legacy TOF) ### M0040-1 Camera Server Configuration In order to set up your VOXL2 to use the M0040-1 ToF sensor, connect the camera in one of the ToF configurations described on the [VOXL2 Camera Configs](/voxl2-camera-configs/) page. Then, run `voxl-configure-cameras `, where `` is the ID number of the configuration you selected. Reboot VOXL2, and then camera server should be publishing frames from the ToF camera. To verify functionality, please see the [VOXL Portal section](#voxl-portal) below. ### VOXL Portal In order to verify the functionality of your ToF configuration, you can attempt to view the IR and depth map images in VOXL portal. In order to view VOXL portal, your VOXL should be connected to the internet (see [VOXL2 WiFi Setup](/voxl-2-wifi-setup/)). After your VOXL is connected to the internet, run `systemctl status voxl-portal`. Then, find the IP address of your VOXL using `hostname -I` and visit this address in the web browser of a computer connected to the same local network as your VOXL (or your VOXL's access point, in AP mode). Then, navigate to "Cameras > TOF Conf / Depth / IR" in the top navigation bar, and verify that the displayed video stream matches what the camera is pointed at. --- Source: https://docs.modalai.com/M0061/ # M0061 Framos Adapter Module Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — for a current low-light color sensor see the Starvis 2 IMX664-based [MSU-M0186](https://www.modalai.com/products/msu-m0186), or the 4k IMX412-based [MSU-M0161](https://www.modalai.com/products/msu-m0161). ## Table of Contents 1. TOC ![MDK-M0061picture.jpg](/images/other-products/image-sensors/MDK-M0061picture.jpg) Plugs directly into VOXL®! A 4k High-resolution Camera based on the Sony Starvis IMX412 sensor. Enable video recording at 1080p30 or 4k30 using this image sensor module. NDAA '20 Section 848 compliant. IMX412-AACK is a (Type 1/2.3") 12.3 Mega-pixel CMOS active pixel type stacked image sensor with a square pixel array. R, G and B pigment primary color mosaic filter is employed. It equips an electronic shutter with variable integration time. This product has a removable and swappable lens. Note: there can be a small touch of glue to hold the focus in place, but you can break that seal to replace the lens. ## Specification ### MDK-M0061-1 m12 IMX412 120° FOV (EOL) | Specification | Value | |----------------|------------------------------------------------------------------------------------------------| | Sensor | IMX412 [Datasheet](https://www.sony-semicon.com/files/62/flyer_security/IMX412-AACK_Flyer.pdf) | | Shutter | Rolling | | Max Resolution | 7.857 mm (Type 1/2.3) 12.3 Mega-pixel | | Lens Mount | m12 | | Lens Part No. | 27629F-16MAS-CM | | Focal Length | 2.7mm | | Fov(DxHxV) | 120.4° x 93.5° x 146° | ### MDK-M0061-2 m12 IMX678 120° FOV (EOL) | Specification | Value | |----------------|------------------------------------------------------------------------------------------------| | Sensor | IMX678 [Datasheet](https://framos.com/products/modules/fsmgo-modules/fsmgo-with-imx678-sensor-27364/) | | Shutter | Rolling | | Max Resolution | 8.3 Mpx / 3856 x 2180 px | | Lens Mount | m12 | | Lens Part No. | SL-HD3125BMP | | Focal Length | 2.7mm | | Fov(DxHxV) | 120.4° x 93.5° x 146° | ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0061_CCA_3D.stp) ## Module Connector Pinout for J2 | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | NC | 4 | NC | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | NC | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | NC | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | NC | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | NC | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | NC | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | NC | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | [Module Connector Schematic](https://storage.googleapis.com/modalai_public/modal_drawings/J2moduleConnectorSchematic.pdf) ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `imx412` (M0061-1), `imx678` (M0061-2) | | Standard camera configurations | M0061-1: C17, C20, C23 (VOXL 2 platform config 0, hires slot). M0061-2: the `imx678` sensor type is accepted by `voxl-configure-cameras`, but no standard configuration uses it. The configuration files select by sensor type; any `imx412` module is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | J8: [M0076](/m0076/) interposer plus [M0074](/M0074/) flex (or [M0036](/M0036/) flex plus M0076); J7: [M0084](/M0084/) flex. Configuration page: M0076 or M0084 (JL) for HW ID 2 or 4, M0084 (JU) for HW ID 3 | | Connects to VOXL 2 Mini via | M0061 plus flex through [M0135](/M0135/), [M0076](/m0076/) or [M0084](/M0084/) (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Pinhole model, no `--fisheye` flag (see [Calibrate Cameras](/calibrate-cameras/)) | ### IMX678 based M0061-2 For [Platform Release 0.9.5, sys img 1.5.5](/voxl2-system-image/). #### Options for J8 ![m0054-imx678-m0061-2](/images/voxl2/m0054-imx678-m0061-2.JPG) - [M0076](/m0076/) interposer plugs into M0054 J8 - [M0074](/M0074/) flex then connects to the M0061-2 backpack for the IMX678 module ![m0054-imx678-m0061-2-c](/images/voxl2/m0054-imx678-m0061-2-c.JPG) - [M0076](/m0076/) interposer plugs into M0054 J8 - [M0074](/M0074/) flex then connects to the M0061-2 backpack for the IMX678 module #### Options for J7 ![m0054-imx678-m0061-2-b](/images/voxl2/m0054-imx678-m0061-2-b.JPG) - [M0084](/M0084/) flex plugs into M0054 J7 - [M0084](/M0084/) flex then connects to the M0061-2 backpack for the IMX678 module ### Dual Hires Example ![m0054-imx412-imx678](/images/voxl2/m0054-imx412-imx678.JPG) - IMX412 (M0061-1) connected to M0084 flex, plugged into M0054 J7 - IMX678 (M0061-2) connected to M0036 flex connected to M0076 interposer plugged into M0054 J8 More information [here](/voxl2-camera-configs/) --- Source: https://docs.modalai.com/M0072/ # VOXL Tracking Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current tracking sensors are the AR0144-based [MSU-M0166](https://www.modalai.com/products/msu-m0166) (micro-coax) and [MSU-M0149-1](https://www.modalai.com/products/msu-m0149-1) (with cable). ## Table of Contents 1. TOC ![MSU-M0072picture.jpg](/images/other-products/image-sensors/MSU-M0072picture.jpg) Replace the stereo image sensors used on VOXL to enable fisheye stereo. Leveraging the industry's smallest global shutter pixel, the black and white OV7251 is capable of capturing VGA (640x480) resolution video at 120 frames per second (fps), QVGA (320x240) at 180 fps with binning, and QQVGA (160x120) at 360 fps with binning and skipping. The OV7251's high frame rates make it an ideal solution for low-latency machine vision applications. * Molex connector, same pin-out as MD102A Compatible With: * Flex cable MFPC-M0010 *Flex cable MPFC-M0008 ## Specification ### MSU-M0072-1-01 OV7251 166° FOV (EOL) | Specification | Value | |----------------|--------------------------------------------------------------------------------------| | Sensor | OV7251 [Datasheet](https://www.ovt.com/products/ov7251/) | | Shutter | Global | | Resolution | 640x480 | | Framerate | 30,60,90Hz implemented on VOXL, sensor supports up to 120Hz | | Data formats | B&W 8 and 10-bit | | Lens Size | 1/3.06" | | Focusing Range | 5cm~infinity | | Focal Length | 0.83mm | | F Number | 2.0 | | Fov(DxHxV) | 166° x 133° x 100° | | TV Distortion | -20.77% | ## Technical Drawings #### 3D STEP File TBD #### 2D Diagram [Download](/images/other-products/image-sensors/M0072-2D.jpg) ## Module Connector Pinout | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | DGND | 2 | XCLK | | 3 | DGND | 4 | XSHUTDOWN | | 5 | STROBE | 6 | DGND | | 7 | MDP | 8 | MDN | | 9 | DGND | 10 | MCP | | 11 | MCN | 12 | DGND | | 13 | ULPN | 14 | FSIN | | 15 | NC | 16 | DGND | | 17 | SI0_D | 18 | SI0_C | | 19 | DGND | 20 | D0VDD_1.8V | | 21 | NC | 22 | DGND | | 23 | AVDD_2.8V | 24 | AGND | ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `ov7251` (single module on M0008 flex) or `ov7251-combo` (pair on M0010 flex) | | Standard camera configurations | C01, C02, C03, C04, C05, C06, C10, C11, C14, C16, C17, C19, C21, C23 (VOXL 2 platform config 0), selected by sensor type only; any `ov7251` module is treated the same. No configuration names M0072. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0008-1](/M0008/) or [M0010-1](/M0010/) flex plus [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) adapter; or [M0109-1](/M0109/) cable with no adapter (SDK 0.7 and greater) | | Connects to VOXL 2 Mini via | [M0008-1](/M0008/) flex plus [M0135](/M0135/) dual sensor adapter | | Calibration | Tracking camera: calibrate with `voxl-calibrate-camera --fisheye` (see [Calibrate Cameras](/calibrate-cameras/)) | SDK 0.7 and greater. More information [here](/voxl2-camera-configs/). | Cable | Adapter Requirements | |--------------------|-----------------------------------------------------------| | [M0008-1](/M0008/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0010-1](/M0010/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0109-1](/M0109/) | None | ## Image Samples for Sensor ### Indoor ![tracking_in.png](/images/other-products/image-sensors/Samples/tracking_in.png) ### Outdoor ![tracking_out.png](/images/other-products/image-sensors/Samples/tracking_out.png) --- Source: https://docs.modalai.com/M0073/ # M0073 OV9782 Module Datasheet ## Table of Contents 1. TOC ![MSU-M0113picture.jpg](/images/other-products/image-sensors/MSU-M0113picture.jpg) The M0073-1 is an RGB, global shutter, stereo sensor compatible with ModalAI's [M0010-1](/M0010/) and [M0039-1](/M0039/) stereo flex cables. The M0073-1 does incorporate an IR-cut filter. The M0073-1 is identical to [M0113-1](/M0113/) except that M0113-1 does NOT incorporate an IR-cut filter. This sensor is no longer recommended for new designs. ## Specification ### MSU-M0113-1 OV9782 121° FOV | Specification | Value | |----------------|-------------------------| | Sensor | OV9782 [Datasheet](https://www.ovt.com/products/ov9782/) | | Shutter | Global Shutter | | Resolution | 1280x800 | | Focal Length | 1.56 +/- 5% | | F Number | 2.2 +/- 5% | | Fov(DxHxV) | 121.3° x 103.2° x 84.6° | | TV Distortion | 10% | | IR Filter | IR-cut Filter | ## Module Connector Pinout Module connector Molex 503776-2410 | Pin # | Signal Name | |-------|-------------| | 1 | DGND | | 2 | XCLK | | 3 | DGND | | 4 | XSHUTDOWN | | 5 | STROBE | | 6 | DGND | | 7 | MDP | | 8 | MDN | | 9 | DGND | | 10 | MCP | | 11 | MCN | | 12 | DGND | | 13 | ULPM | | 14 | FSIN | | 15 | NC | | 16 | DGND | | 17 | SIO_D | | 18 | SIO_C | | 19 | DGND | | 20 | DOVDD1.8V | | 21 | NC | | 22 | DGND | | 23 | AVDD2.8V | | 24 | AGND | ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `ov9782-combo` (pair on M0010 or M0039 flex); a single `ov9782` type exists but no standard configuration uses it | | Standard camera configurations | C12, C13, C15, C17, C18, C32 (VOXL 2 platform config 0), selected by sensor type only; any `ov9782-combo` pair is treated the same. No configuration names M0073. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0010-1](/M0010/) or [M0039-1](/M0039/) stereo flex plus [M0076](/m0076/) adapter | | Connects to VOXL 2 Mini via | Not supported. The M0010 stereo flex is not currently supported in the VOXL 2 Mini camera configurations (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Pinhole model, no `--fisheye` flag: `voxl-calibrate-camera ` (see [Calibrate Cameras](/calibrate-cameras/)). The 121 degree lens is not a fisheye. The 1280x800 resolution makes the result sensitive to chessboard flatness; a warped board gives reprojection errors near 1.0 px and a failed calibration, a rigid flat board gives about 0.3 px | --- Source: https://docs.modalai.com/M0107/ # VOXL Hi-res RGB Sensor Datasheet > This module is EOL. ModalAI image sensors have moved to a **micro-coax** format — the current hi-res color sensor is the 4k IMX412-based [MSU-M0161](https://www.modalai.com/products/msu-m0161). ## Table of Contents 1. TOC ![MSU-M0107picture.jpg](/images/other-products/image-sensors/MSU-M0107picture.jpg) Built in the USA by ModalAI for VOXL® and VOXL 2! A 4k High-resolution Camera based on the Sony Starvis IMX412 sensor. Enable video recording at 1080p30 or 4k30 using this image sensor module. Built in the USA and NDAA '20 Section 848 compliant. IMX412-AACK is a (Type 1/2.3") 12.3 Mega-pixel CMOS active pixel type stacked image sensor with a square pixel array. R, G and B pigment primary color mosaic filter is employed. It equips an electronic shutter with variable integration time. This product has a removable and swappable lens. Note: there can be a small touch of glue to hold the focus in place, but you can break that seal to replace the lens. ## Specification ### Hi-resolution, 4k M0107 m12 IMX412 120° FOV (EOL) | Specification | Value | |----------------|------------------------------------------------------------------------------------------------| | Sensor | IMX412 [Datasheet](https://www.sony-semicon.com/files/62/flyer_security/IMX412-AACK_Flyer.pdf) | | Shutter | Rolling | | Max Resolution | 7.857 mm (Type 1/2.3) 12.3 Mega-pixel | | Framerate | TBD | | Lens Mount | m12 | | Lens Part No. | 27629F-16MAS-CM | | Focusing Range | TBD | | Focal Length | 2.7mm | | F Number | TBD | | Fov(DxHxV) | 120.4° x 93.5° x 146° | | TV Distortion | TBD | | Weight | 7.5g | | IR Filter | Optional | ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0107-m12.STEP) ## Module Connector Pinout for J2 | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | NC | 4 | NC | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | NC | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | NC | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | NC | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | NC | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | NC | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | NC | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | [Module Connector Schematic](https://storage.googleapis.com/modalai_public/modal_drawings/J2moduleConnectorSchematic.pdf) ## VOXL 2 Integration SDK 1.1.1 and greater. More information on the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. | Item | Value | |---|---| | Sensor type in voxl-camera-server | `imx412` (`imx412-flip` when the camera is mounted rotated) | | Standard camera configurations | VOXL 2 (platform config 0): C17, C20, C23. The camera configuration page also lists `imx412` as an alternative hires sensor for C03, C04, C06, C08, C11, C13 and C14; the standard configuration files for those numbers select `imx214`. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex plus an [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) adapter, or [M0084-1](/M0084/) alone (table below) | | Connects to VOXL 2 Mini via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex plus [M0135](/M0135/), [M0076](/m0076/) or [M0084](/M0084/) adapter | | Calibration | Pinhole model, no `--fisheye` flag: `voxl-calibrate-camera ` (see [Calibrate Cameras](/calibrate-cameras/)). | | Cable | Adapter Requirements | |--------------------|-----------------------------------------------------------| | [M0036-1](/M0036/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0074-1](/M0074/) | [M0076](/m0076/) or [M0084](/M0084/) or [M0135](/M0135/) | | [M0084-1](/M0084/) | None | --- Source: https://docs.modalai.com/M0113/ # M0113 OV9782 Module Datasheet ## Table of Contents 1. TOC ![MSU-M0113picture.jpg](/images/other-products/image-sensors/MSU-M0113picture.jpg) The M0113-1 is an RGB, global shutter, stereo sensor compatible with ModalAI's [M0010-1](/M0010/) and [M0039-1](/M0039/) stereo flex cables. The M0113-1 does NOT incorporate an IR-cut filter. The M0113-1 is identical to [M0073-1](/M0073/) except that M0113-1 does NOT incorporate an IR-cut filter. This sensor is in production and is no longer recommended for new designs. ## Specification ### MSU-M0113-1 OV9782 121° FOV | Specification | Value | |----------------|-------------------------| | Sensor | OV9782 [Datasheet](https://www.ovt.com/products/ov9782/) | | Shutter | Global Shutter | | Resolution | 1280x800 | | Focal Length | 1.56 +/- 5% | | F Number | 2.2 +/- 5% | | Fov(DxHxV) | 121.3° x 103.2° x 84.6° | | TV Distortion | 10% | | IR Filter | No IR-cut Filter | ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0113_720pGlobalShutter.STEP) ## Module Connector Pinout Module connector Molex 503776-2410 | Pin # | Signal Name | |-------|-------------| | 1 | DGND | | 2 | XCLK | | 3 | DGND | | 4 | XSHUTDOWN | | 5 | STROBE | | 6 | DGND | | 7 | MDP | | 8 | MDN | | 9 | DGND | | 10 | MCP | | 11 | MCN | | 12 | DGND | | 13 | ULPM | | 14 | FSIN | | 15 | NC | | 16 | DGND | | 17 | SIO_D | | 18 | SIO_C | | 19 | DGND | | 20 | DOVDD1.8V | | 21 | NC | | 22 | DGND | | 23 | AVDD2.8V | | 24 | AGND | ## VOXL 2 Integration | Item | Detail | |------|--------| | Sensor type in voxl-camera-server | `ov9782-combo` (written to the camera server config as `ov9782`) | | Standard camera configurations | C12, C13, C15, C17, C18, C32 (VOXL 2 platform config 0; C12, C18 and C32 run the pair as independent `trackingL` and `trackingR` cameras). The configuration files select by sensor type; any `ov9782-combo` pair is treated the same. See [VOXL 2 Camera Configurations](/voxl2-camera-configs/). Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0010](/M0010/) stereo flex plus [M0076](/m0076/) adapter (configuration page); [M0010-1](/M0010/) or [M0039-1](/M0039/) stereo flex | | Connects to VOXL 2 Mini via | Not supported. The M0010 stereo flex is not currently supported in the VOXL 2 Mini camera configurations (see [VOXL 2 Mini Image Sensors](/voxl2-mini-image-sensors/)) | | Calibration | Pinhole model, no `--fisheye` flag: `voxl-calibrate-camera ` (see [Calibrate Cameras](/calibrate-cameras/)). The 121 degree lens is not a fisheye. The 1280x800 resolution makes the result sensitive to chessboard flatness; a warped board gives reprojection errors near 1.0 px and a failed calibration, a rigid flat board gives about 0.3 px | --- Source: https://docs.modalai.com/M0149/ # VOXL Tracking Sensor Datasheet ## Table of Contents 1. TOC ![M0149.JPG](/images/other-products/image-sensors/M0149_angle_1920x1920.jpg) Tracking 1280x800 global-shutter sensor and flex cable to connect to VOXL 2® for indoor flight, GPS-denied navigation VIO and global shutter computer vision processing. This module is based on an OnSemi AR0144 1280x800, global-shutter CMOS sensor with fisheye lens. ## Specification ### MSU-M0149-1-01 OnSemi AR0144 166° ([Buy Here](https://www.modalai.com/products/msu-m0149-1)) | Specification | Value | |---------------------------------|-------------------------| | Sensor | OnSemi AR0144 | | Shutter | Global | | Resolution | 1280x800 | | Lens Size | 4.5mm | | Lens Mount | M7 * P0.35 | | Fov(DxHxV) | 162° x 132° 82° | | Effective Focal Length | 1.7mm | | F. NO | 2.4 | | Distortion | -31.79% | | IR Filter | Yes | IR filter option cannot be changed. Please consider [MSU-M0166](https://www.modalai.com/products/msu-m0166?) with optional IR filter. ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0149-AR0144.STEP) #### 2D Diagram [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0149_2D_02-24-24.pdf) ## Module Connector Pinout | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | DGND | 2 | DGND | | 3 | NC | 4 | NC | | 5 | SDA | 6 | VDDIO1.8/2.8V | | 7 | SCL | 8 | NC | | 9 | RST_0 | 10 | XCLK | | 11 | DGND | 12 | DGND | | 13 | MCP | 14 | FLASH | | 15 | MCN | 16 | NC | | 17 | MDP0 | 18 | NC | | 19 | MDN0 | 20 | AVDD2.8V | | 21 | DGND | 22 | AGND | | 23 | MDP1 | 24 | NC | | 25 | MDN1 | 26 | TRIGGER | | 27 | NC | 28 | NC | | 29 | NC | 30 | NC | | 31 | DGND | 32 | DGND | | 33 | NC | 34 | NC | | 35 | NC | 36 | DGND | [Pinout Image](https://storage.googleapis.com/modalai_public/modal_drawings/M0149pinoutImages.pdf) ## VOXL 2 Integration One of the following adapters is required to connect to VOXL 2 * [M0076](/m0076/) * [M0084](/M0084/) * [M0135](/M0135/) | Item | Value | |---|---| | Sensor type in voxl-camera-server | `ar0144` | | Standard camera configurations | VOXL 2 (platform config 0): C20, C31. Selected by sensor type; any `ar0144` module is treated the same. No standard configuration file or docs page names the M0149 specifically. The `ar0144-fsin` configurations in platform configs 1 and 2 are for the micro-coax [M0166](/M0166/) on the M0173, M0188 and M0195 adapters. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) | | Connects to VOXL 2 Mini via | [M0076](/m0076/), [M0084](/M0084/) or [M0135](/M0135/) adapter | | Calibration | Tracking camera: calibrate with `voxl-calibrate-camera --fisheye` (see [Calibrate Cameras](/calibrate-cameras/)). | --- Source: https://docs.modalai.com/M0161/ # VOXL Hi-res Sensor Datasheet ## Table of Contents 1. TOC ![MSU-M0161picture.jpg](/images/other-products/image-sensors/MSU-M0161picture.jpg) Built in the USA by ModalAI for VOXL® 2! A 4k High-resolution Camera based on the Sony Starvis IMX412 sensor. Enable video recording at 1080p120 or 4k60 using this image sensor module. NDAA '20 Section 848 compliant. This module uses a micro-coax for increased mounting flexibility. It does require an adapter to connect with VOXL 2 such as M0173 or M0155 (purchased separately). ## M0161: 4K IMX412 Color Camera with M12 120° FOV Lens [Buy Here](https://www.modalai.com/products/msu-m0161) ## Specifications | Specification | Value | |----------------|------------------------------------------------------------------------------------------------| | Sensor | IMX412 [Datasheet](https://www.sony-semicon.com/files/62/flyer_security/IMX412-AACK_Flyer.pdf) | | Shutter | Rolling | | Max Resolution | 4056x3040, 12.3 Mega-pixel, 7.857 mm (Type 1/2.3) | | Framerate | 4056x3040 @ 15-60, 3840x2160 @ 15-80, 1920x1080 @ 15-240 | | Lens Mount | M12 | | Lens Part No. | 27629F-16MAS-CM | | Focusing Range | TBD | | Focal Length | 2.7mm | | F Number | TBD | | Fov(DxHxV) | 120.4° x 93.5° x 146° | | TV Distortion | TBD | | Weight | 7.5g | | IR Filter | Optional | ## VOXL 2 Compatible Cables and Interfaces | Cable | Adapter Options | |------------|------------------------------------| | MCBL-00084 | [M0173](/M0173), [M0188](/M0188), M0195, [M0155](/M0155), M0172, M0181, M0194 | ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0161_IMX412_COAX_with_Lens.STEP) ## Module Connector Pinout for J1 ([S-H26-HR-DS-412](/micro-coax-user-guide/)) | Pin | CAM Group Function | Pin | |-----|------------------------------------------------|-----| | 1 | CCI I2C Bus, SDA | | | | 1.2V DVDD (LDO) | 2 | | 3 | CCI I2C Bus, SCL | | | | 1.2V DVDD (LDO) | 4 | | 5 | System GND | | | | System GND | 6 | | 7 | CSI CLK P | | | | 1.2V DVDD (LDO) | 8 | | 9 | CSI CLK M | | | | 1.8V VDDIO (LDO) | 10 | | 11 | MIPI CSI High Speed Diff Pair, Data Lane 0, P | | | | RESET_N Power down signal (Normally Unused) | 12 | | 13 | MIPI CSI High Speed Diff Pair, Data Lane 0, M | | | 14 | MIPI CSI High Speed Diff Pair, Data Lane 1, P | | | | MCLK, Buffered from VOXL 2, 1.8V | 15 | | 16 | MIPI CSI High Speed Diff Pair, Data Lane 1, M | | | | System GND | 17 | | 18 | System GND | | | | Sensor 2.8V AVDD (LDO) | 19 | | 20 | MIPI CSI High Speed Diff Pair, Data Lane 2, P | | | | Sensor Sync Signal | 21 | | 22 | MIPI CSI High Speed Diff Pair, Data Lane 2, M | | | | System GND | 23 | | 24 | MIPI CSI High Speed Diff Pair, Data Lane 3, P | | | | 3.8V Primary "Phone" Power (mimics nominal 1S) | 25 | | 26 | MIPI CSI High Speed Diff Pair, Data Lane 3, M | | ## VOXL 2 Integration SDK 1.3.0 and greater. More information on the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. | Item | Value | |---|---| | Sensor type in voxl-camera-server | `imx412-fpv` (written to the configuration file as `imx412`); `imx412-fpv-misp` in C36 and C37 | | Standard camera configurations | VOXL 2 (platform config 1, M0173 adapter): C26, C27, C28, C29, C30 (`imx412-fpv`); C36, C37 (`imx412-fpv-misp`). VOXL 2 Mini (platform config 2): no standard configuration selects `imx412`. Selected by sensor type; any `imx412-fpv` module is treated the same. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | MCBL-00084 micro-coax cable plus [M0173](/M0173/), [M0155](/M0155/), [M0172](/M0172/), M0181 or M0194 (see the cable table above) | | Connects to VOXL 2 Mini via | MCBL-00084 micro-coax cable plus [M0188](/M0188/) or [M0195](/M0195/) hires ports J1/J3, or [M0155](/M0155/) | | Calibration | Pinhole model, no `--fisheye` flag: `voxl-calibrate-camera ` (see [Calibrate Cameras](/calibrate-cameras/)). | ## Image Samples for Sensor ### Outdoor (With IR Filter) ![IMX412 Outdoor Sample](/images/other-products/image-sensors/Samples/imx412_with_ir_filter_1920x1080_outdoor_sample.jpg) ### Outdoor (Without IR Filter) > Please note that due to the lack of IR filter in the lens, colors in outdoor scenes will be distorted due to IR light from the environment. Vegetation, in particular, reflects IR light and does not appear green. Please see examples below. ![IMX412 Noir Outdoor Sample](/images/other-products/image-sensors/Samples/imx412_no_ir_filter1920x1080_outdoor_sample.jpg) ### Comparison of IMX412 and IMX664 (with and without IR filter) | IMX412 with IR Filter | IMX412 w/o IR Filter | IMX664 w/o IR Filter | ![IMX412 vs IMX664 comparison](/images/other-products/image-sensors/Samples/imx412_ir_noir_imx664_noir_comparison.jpg) --- Source: https://docs.modalai.com/M0166/ # VOXL Tracking Sensor Datasheet ## Table of Contents 1. TOC ![MSU-M0166picture.jpg](/images/other-products/image-sensors/MSU-M0166picture.jpg) The M0166 makes a MIPI tracking camera with a coaxial cable connection out of a AR0144 Image Sensor ## Specification ### MSU-M0166-1-01 OnSemi AR0144 | Specification | Value | |---------------------------------|-------------------------| | Sensor | OnSemi AR0144 | | Shutter | Global | | Resolution | 1280x800 | | Lens Size | M7 | | Fov(DxHxV) | 162° x 139° x 84° | | Pixel Size | 3um | | Effective Focal Length | 1.385mm | | F/NO | 2.4 | | Hyperfocal Distance | 0.274m | | Weight | 1.52g | | IR Filter | Yes (optional) | IR filter option can be specified at the time of purchase. ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0166_AR0144_COAX_with_lens.STEP) ## Module Connector Pinout for J2 ([S-H26-TS-DS-144](/micro-coax-user-guide/)) | Pin | CAM Group Function | Pin | |-----|--------------------------------------------------|-----| | 1 | CCI I2C Bus, SDA | | | | 1.2V DVDD LDO | 2 | | 3 | CCI I2C Bus, SCL | | | | 1.2V DVDD LDO | 4 | | 5 | System GND | | | | System GND | 6 | | 7 | CSI CLK P | | | | 1.2V DVDD LDO | 8 | | 9 | CSI CLK M | | | | 1.8V VDDIO (LDO) | 10 | | 11 | MIPI CSI High Speed Diff Pair, Data Lane 0, P | | | | RESET_N Power down signal (Normally Unused) | 12 | | 13 | MIPI CSI High Speed Diff Pair, Data Lane 0, M | | | 14 | MIPI CSI High Speed Diff Pair, Data Lane 1, P | | | | MCLK, Buffered from VOXL 2, 1.8V | 15 | | 16 | MIPI CSI High Speed Diff Pair, Data Lane 1, M | | | | System GND | 17 | | 18 | System GND | | | | Sensor 2.8V AVDD (LDO) | 19 | | 20 | NC | | | | Sensor Sync Signal | 21 | | 22 | NC | | | | System GND | 23 | | 24 | NC | | | | NC | 25 | | 26 | NC | | ## VOXL 2 Integration SDK 1.3.0 and greater. More information on the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. | Item | Value | |---|---| | Sensor type in voxl-camera-server | `ar0144-fsin`, `ar0144-fsin-combo` or `ar0144-fsin-combo-rotated` (written to the configuration file as `ar0144` or `ar0144-rotated`, frame sync on GPIO 109) | | Standard camera configurations | VOXL 2 (platform config 1): C22, C26, C27, C28, C29, C30, C36, C37, C46, C47, C48, C61, C62, C63, C64. VOXL 2 Mini (platform config 2): C22, C33, C34, C35, C38. Selected by sensor type; any `ar0144-fsin` module is treated the same. The configuration file names refer to the adapter (M0173, M0181, M0188, M0195), not to this module. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | Micro-coax cable to [M0173](/M0173/) (SDK 1.3 and greater); [M0155](/M0155/) and [M0172](/M0172/) also list this module | | Connects to VOXL 2 Mini via | MCBL-00084 micro-coax cable to the tracking ports on [M0188](/M0188/) (SDK 1.4 and greater) or [M0195](/M0195/) (SDK 1.5 and greater) | | Calibration | Tracking camera: calibrate with `voxl-calibrate-camera --fisheye` (see [Calibrate Cameras](/calibrate-cameras/)). | --- Source: https://docs.modalai.com/M0169/ # VOXL Time of Flight (ToF) Sensor Datasheet (IRS2975C) ## Table of Contents 1. TOC ![MSU-M0169picture.jpg](/images/other-products/image-sensors/MSU-M0169picture.jpg) The PMD Time of Flight sensor produces high-fidelity depth mapping indoors up to 6m. On the VOXL platform this sensor is mutually exclusive to the stereo cameras, meaning the stereo cameras need to be replaced with the TOF Add-on. The M0169-1 ToF adapter has the [M0040-1](/M0040/) backwards compatible Panasonic AXT connector, but requires external 5V power. The M0169-1 adapter can be used with the M0036-1 or M0074-1 extension flexes to connect to VOXL 2. The [M0178-1](/M0178/) adapter does not require external power, but is exclusive to VOXL 2. ## Specification ### MSU-M0169-1-01 106° FOV | Specification | Value | |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part Number | MSU-M0169-1-01 | | Technology | [PMD](https://pmdtec.com/en/) | | Rate | 5 - 45FPS in configurable option modes for distance / accuracy / framerate | | Exposure Time | 4.8 ms typ. @ 45 fps / 30 ms typ. @ 5 fps | | Resolution | 240 x 180 px | | FOV (H x W) | 106° x 86°, 138.4° DFOV Max | | Range | 4 - 6m | | Illumination | 940nm | | Depth Resolution | TBD | | Time Sync | No physical pin, but the frame timestamp is measured with 50ns precision on a single clock. All of the sensors on the VOXL platform are timestamped for computer vision. | | Power Consumption | TBD | | Weight | TBD | | Dimensions | TBD | | Eye Safe | Yes | ### Requirements * VOXL (APQ8096) not supported. * VOXL 2 (QRB5165) Requires SDK 1.2 or greater ### Current/Power Consumption The module draws 1.0-1.2Amp bursts continuously (>5ms pulses occurring rapidly enough to warrant a 2A+ DC/DC on the M0169-1 PCB). The average current draw is 300mA, but the pulses require a dedicated 2A DC/DC for the ToF module to work. Consequently, the DC/DC converter on M0169-1 requires 4-5V with at least 1.4-1.5A+ to account for cable losses and efficiencies. ![M0169-current.jpg](/images/other-products/image-sensors/m0169-current.png) - Yellow: VCSEL current draw (1A/1V) - Green : VCSEL enable signal (turns on the emitter at the beginning of exposure) - Purple: VCSEL supply voltage (3.30V in off state, sags to 3.25V during bursts, likely cable losses in test setup) ## Technical Drawings #### 3D STEP File [M0169-1 PCB](https://storage.googleapis.com/modalai_public/modal_drawings/M0169_LIOW2_TOF_ADAPTER_REVA(-1_MAIN).step) [PMD IRS2975C Module](https://storage.googleapis.com/modalai_public/modal_drawings/PMD_IRS2975C_MODULE.step) ## Module Connector Pinout #### Connector Specs | VOXL Board Connector | M0169-1 J? Mating Connector | |---------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | Panasonic, [MPN: AXT336124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | [Panasonic MPN: AXT436124](https://industry.panasonic.com/ap/en/products/control/connector/base-fpc/p4s) | #### Pin-out | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|------------------------| | 1 | GND | 2 | GND | | 3 | VREG_L17A_2P8 (AFVDD) | 4 | CAM0_STANDBY_N | | 5 | CCI_I2C_SDA0 | 6 | VREG_LVS1A_1P8 (DOVDD) | | 7 | CCI_I2C_SCL0 | 8 | VREG_L3A_1P1 (DVDD) | | 9 | CAM0_RST0_N | 10 | CAM_MCLK0_BUFF | | 11 | GND | 12 | GND | | 13 | MIPI_CSI0_CLK_CONN_P | 14 | CAM_FLASH | | 15 | MIPI_CSI0_CLK_CONN_M | 16 | CAM_SYNC_0 | | 17 | MIPI_CSI0_LANE0_CONN_P | 18 | CAM0_MCLK3 | | 19 | MIPI_CSI0_LANE0_CONN_M | 20 | VREG_L22A_2P8 (AVDD) | | 21 | GND | 22 | GND | | 23 | MIPI_CSI0_LANE1_CONN_P | 24 | CAM_RST1_N | | 25 | MIPI_CSI0_LANE1_CONN_M | 26 | CAM_SYNC_1 | | 27 | MIPI_CSI0_LANE2_CONN_P | 28 | CCI_I2C_SDA1 | | 29 | MIPI_CSI0_LANE2_CONN_M | 30 | CCI_I2C_SCL1 | | 31 | GND | 32 | GND | | 33 | MIPI_CSI0_LANE3_CONN_P | 34 | VPH_PWR | | 35 | MIPI_CSI0_LANE3_CONN_M | 36 | GND | ## VOXL 2 Integration | Item | Value | |---|---| | Sensor type in voxl-camera-server | `pmd-tof-liow2` | | Standard camera configurations | VOXL 2 (platform config 0): C24 (single ToF on J6 lower). Platform config 1 configurations C26, C27, C29 and C30 also select `pmd-tof-liow2`, but through the 40-pin [M0173](/M0173/) path used by the [M0178](/M0178/), not the 36-pin connector on this board. Any M0040-1 `pmd-tof` configuration can be converted as described below. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex; external 4 to 5 V supply required, [MCBL-00095](/cable-datasheets/#mcbl-00095) power cable | | Connects to VOXL 2 Mini via | [M0036-1](/M0036/) or [M0074-1](/M0074/) extension flex plus [M0135](/M0135/) dual sensor adapter; external 4 to 5 V supply required, [MCBL-00095](/cable-datasheets/#mcbl-00095) power cable | | Calibration | Not calibrated with the chessboard tool. | ## VOXL SDK > This guide assumes that you are able to run commands on VOXL2; if you cannot, please see [VOXL Developer Bootcamp](/voxl-developer-bootcamp/). All commands specified below should be run on VOXL2. ### Supported Sensor Module - M0169-1 IRS2975C Module (Requires VOXL SDK >= v1.2) ### Camera Server Configuration > IRS2975C support is coming to VOXL camera server in VOXL SDK release 1.2 In order to set up your VOXL2 to use just the IRS2975C ToF sensor, connect the camera to the J6 Lower camera connector (it must have ID 0; for more details, see [VOXL2 Camera Configs](/voxl2-camera-configs/)). Then, run `voxl-configure-cameras 24` in order to configure VOXL camera server to use the M0169-1 ToF sensor. If you wish to use any of the pre-existing M0040-1 ToF configurations listed in the [VOXL2 Camera Configs](/voxl2-camera-configs/) page, first run `voxl-configure-cameras `, where `` is the ID number of the configuration you wish to use. Then, edit the VOXL Camera Server configuration file on VOXL2 (`/etc/modalai/voxl-camera-server.conf`) and replace the line containing `"type": "pmd-tof",` with `"type": "pmd-tof-liow2",`. You have now updated a legacy M0040-1 ToF configuration to function with the newer M0169-1 module. After performing either of the above procedures, please reboot VOXL2 in order to reload the VOXL camera server configuration. To verify functionality, please see the [VOXL Portal section](#voxl-portal) below. ### VOXL Portal In order to verify the functionality of your ToF configuration, you can attempt to view the IR and depth map images in VOXL portal. In order to view VOXL portal, your VOXL should be connected to the internet (see [VOXL2 WiFi Setup](/voxl-2-wifi-setup/)). After your VOXL is connected to the internet, run `systemctl status voxl-portal`. Then, find the IP address of your VOXL using `hostname -I` and visit this address in the web browser of a computer connected to the same local network as your VOXL (or your VOXL's access point, in AP mode). Then, navigate to "Cameras > TOF Conf / Depth / IR" in the top navigation bar, and verify that the displayed video stream matches what the camera is pointed at. --- Source: https://docs.modalai.com/M0178/ # VOXL 2 Time of Flight (ToF) Sensor Datasheet (IRS2975C) ## Table of Contents 1. TOC ![M0178 ToF module](/images/other-products/image-sensors/MSU-M0178picture.jpg) The PMD Time of Flight sensor produces high-fidelity depth mapping indoors up to 6m. The [M0178-1](/M0178/) ToF adapter has a new ModalAI 40-pin format Molex connector and includes a high-power 5V feed as part of the single connector. This is a new connector not used elsewhere in ModalAI, so some integration guidelines are required as explained below. The M0178-1 adapter can be used with the M0170-1 40-pin extension flex and requires a PCB adapter at VOXL 2 (such as M0172 or M0173) that exposes this new 40-pin Molex from a Camera Group connector. The M0178 is similar to the M0171, except for the break off mounting tab on the M0171. ## Specification ### MSU-M0178-1-01 106° FOV | Specification | Value | |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part Number | MSU-M0178-1-01 | | Technology | [PMD](https://pmdtec.com/en/) | | Rate | 5 - 45FPS in configurable option modes for distance / accuracy / framerate | | Exposure Time | 4.8 ms typ. @ 45 fps / 30 ms typ. @ 5 fps | | Resolution | 240 x 180 px | | FOV (H x W) | 106° x 86°, 138.4° DFOV Max | | Range | 4 - 6m | | Illumination | 940nm | | Depth Resolution | TBD | | Time Sync | No physical pin, but the frame timestamp is measured with 50ns precision on a single clock. All of the sensors on the VOXL platform are timestamped for computer vision. | | Power Consumption | TBD | | Weight | TBD | | Dimensions | TBD | | Eye Safe | Yes | ### Requirements | VOXL Version | Supported | Compatible Adapters | |--------------------------------------|-----------|---------------------| | [VOXL (APQ8096)](/voxl/) | No | None | | [VOXL 2 (QRB5165)](/voxl-2/) | Yes | [M0173-1](/M0173/) | | [VOXL 2 Mini (QRB5165)](/voxl2-mini) | No | None | ### Current/Power Consumption The power consumption of the IRS2975 TOF module is a function of several operating conditions: - operating range mode (long, mid, short or ultra short range) - FPS: `5, 10, 15, 20, 30, 45, 60` - exposure time of the IR pulses emitted by the sensor #### IRS2975 Operating Modes ![IRS2975 Operating Modes](/images/other-products/image-sensors/tof_irs2975_operating_modes.png) The table above shows most of the available operating modes of the sensor. Different range modes and maximum exposure (per frame) are available depending on the desired FPS. > *Maximum power of any mode is around 0.9W which requires a heat spreader and thorough testing to prevent sensor overheating* ⚠️ - depending on range mode, there are either 9 measurement phases (8 illuminated) or 5 measurement phases (4 illuminated) per frame - `Max exposure per phase` is the maximum length of a single pulse / phase (note there are 8 or 4 of those per frame) - the last column (`Max average power (Watts)`) is the maximum power consumed by the emitter in the worst case scenario (`auto exposure time = max exposure time`) - note that mid range 5FPS at 6ms exposure results in the same power consumption as 10FPS at 3ms exposure due to the same total exposure time (per second) - if needed, maximum average power dissipation can be reduced by limiting the maximum exposure (per phase) that the auto exposure algorithm (inside the sensor) can apply - auto exposure works by increasing the IR output power in order to see distant objects or objects with low reflectivity - by lowerning the maximum allowed exposure time, the worst-case power consumption (and heat dissipation) can be reduced - the maximum exposure setting is available in `voxl-camera-server.conf` configuration file (e.g `"exposure_max_us": 2000`) - `voxl-portal` can be used to monitor the total frame exposure (in the image statistics section) ![IRS2975 Sample Current Draw](/images/other-products/image-sensors/m0169-current.png) The capture above shows a single frame of mid range, 6ms per phase. - yellow: IR emitter current (1V=1A) - purple: IR emitter voltage (3.3V nominal) - green: IR emitter disable signal (low=enable) - as seen in this diagram, for 9-phase modes, there are 4 pulses of one amplitude (1.0A) and another 4 pulses of slightly higher amplitude (1.1A). - M0178 is designed to support these current bursts by using a 3A DC/DC from the 5V input. ## Technical Drawings #### 3D STEP File [M0178-1 PCB](https://storage.googleapis.com/modalai_public/modal_drawings/M0178_STARLING_TOF_ADAPTER_REVA_2024-03-07.step) [PMD IRS2975C Module](https://storage.googleapis.com/modalai_public/modal_drawings/PMD_IRS2975C_MODULE.step) #### 2D Diagram ## Module Connector Pinout ### Pin-out P1 #### Connector Specs The 40-pin connector on M0178 is the new future format ModalAI will slowly be transitioning to that will replace the 24-pin and 36-pin connectors currently used across our image sensor line. This change will take place slowly, but it is a welcome improvement and capability enhancement. The family from Molex is referred to as the Slimstack SSB RP series, and is a 0.35mm fine pitch B2B style, but includes a 3.0A power delivery contact system in addition to the noted pin counts. So, the 40-pin family we use provides 40 signal/GND pins and a 3.0A capable power feed system, which we define with 5V. We defined the PLUG to be at the sensors, and the Receptacle to be on the Host (VOXL 2) side. This is more common in industry where the plug is free floating in space, and the receptacle is more "fixed" in place. We will use "Px" and "Jx" reference designators accordingly. The default mating height of this series as we use them are 0.8mm, but there are limited combinations that support 0.9mm. | VOXL 2 Board Connector (via an adapter such as M0172/M0173) | M0178-1 P1 Connector | |---------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | Molex, Receptacle MPN 5052704012, 0.8mm mate height | Molex, Plug MPN 5052744012 | | Molex, Alternate Receptacle MPN 5054134010, 0.9mm mate height| Molex, Plug MPN 5052744012 | #### Pin-out at P1 | Pin # | Signal Name | Pin # | Signal Name | |-------|------------------------|-------|-----------------------------------------| | 41 | GND (NAIL_1a) | 42 | GND (NAIL_1b) | | 1 | N.C. | 2 | N.C. | | 3 | VREG_L7_1P8 (DOVDD) | 4 | VREG_3P3V_LOCAL | | 5 | N.C. | 6 | N.C. | | 7 | N.C. | 8 | GND | | 9 | GND | 10 | N.C. | | 11 | CSI_CLK_P | 12 | N.C. | | 13 | CSI_CLK_N | 14 | N.C. | | 15 | CSI_LANE0_P | 16 | N.C. | | 17 | CSI_LANE0_N | 18 | GND | | 19 | CSI_LANE1_P | 20 | RESET_N (Unused, pulled HIGH on M0178) | | 21 | CSI_LANE1_N | 22 | N.C. | | 23 | GND | 24 | CCI_I2C_SDA (1.8V DOVDD levels) | | 25 | N.C. | 26 | CCI_I2C_SCL (1.8V DOVDD levels) | | 27 | N.C. | 28 | N.C. | | 29 | N.C. | 30 | N.C. | | 31 | N.C. | 32 | GND | | 33 | GND | 34 | MCLK (1.8V DOVDD levels) | | 35 | N.C. | 36 | N.C. | | 37 | VREG_3P3V_LOCAL | 38 | N.C. | | 39 | N.C. | 40 | N.C. | | 43 | VDC_5V_LOCAL (NAIL_2a) | 44 | VDC_5V_LOCAL (NAIL_2b) | Pay close attention to the pinout details in this image so that any custom hardware design maps pin 1 to pin 1, including the power nail features: ![M0178-connector-pinout.jpg](/images/other-products/image-sensors/40-pin-connector-guidance.jpg) Note the Power Nail pins are numbered 41, 42, 43, and 44 and are on both sides of the connector, with 41/42 being nearer to the Pin 1 side. ## VOXL 2 Integration | Item | Value | |---|---| | Sensor type in voxl-camera-server | `pmd-tof-liow2` | | Standard camera configurations | VOXL 2 (platform config 1, M0173 adapter): C26, C27, C29, C30. Selected by sensor type; the configuration files name the M0173 adapter, not this module. Configuration 24 (platform config 0) is the 36-pin J6 lower path used by the [M0169](/M0169/), not the 40-pin path this module requires. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | M0170-1 40-pin extension flex or M0177 flex to the 40-pin ToF connector on [M0173](/M0173/) (J3, the adapter listed in the requirements table); [M0172](/M0172/) also exposes the 40-pin connector (J1L) | | Connects to VOXL 2 Mini via | Not supported. ToF on the 40-pin connector is VOXL 2 only. | | Calibration | Not calibrated with the chessboard tool. | ## VOXL SDK > This guide assumes that you are able to run commands on VOXL2; if you cannot, please see [VOXL Developer Bootcamp](/voxl-developer-bootcamp/). All commands specified below should be run on VOXL2. ### Supported Sensor Module * M0178-1 IRS2975C Module on VOXL 2 through the [M0173](/M0173/) adapter (platform config 1 camera configurations; the M0173 requires SDK 1.3 or greater) ### IRS2975C Camera Server Configuration Connect the module to the 40-pin ToF connector on the M0173 (J3). The platform config 1 standard configurations that include a `pmd-tof-liow2` slot are C26, C27, C29 and C30 (see [VOXL 2 camera configurations](/voxl2-camera-configs/)). Select one with its ID number: ```bash voxl-configure-cameras 26 ``` For a camera set that is not covered by a standard configuration, start from the nearest one and edit `/etc/modalai/voxl-camera-server.conf`, keeping `"type": "pmd-tof-liow2"` for the ToF entry. After configuring, reboot VOXL 2 to reload the camera server configuration. To verify functionality, see the [VOXL Portal section](#voxl-portal) below. ### VOXL Portal In order to verify the functionality of your ToF configuration, you can attempt to view the IR and depth map images in VOXL portal. In order to view VOXL portal, your VOXL should be connected to the internet (see [VOXL2 WiFi Setup](/voxl-2-wifi-setup/)). After your VOXL is connected to the internet, run `systemctl status voxl-portal`. Then, find the IP address of your VOXL using `hostname -I` and visit this address in the web browser of a computer connected to the same local network as your VOXL (or your VOXL's access point, in AP mode). Then, navigate to "Cameras > TOF Conf / Depth / IR" in the top navigation bar, and verify that the displayed video stream matches what the camera is pointed at. ## Image Samples for Sensor ### Indoor ### Outdoor ## Hardware Design Guidance If designing your own custom hardware, here are other things to keep in mind to adapt to M0178: * All MIPI CSI Lines are to be impedance controlled at 100-ohms differential. * * Match the _P/_N skew to within 0.2mm, and all diff pairs within the group to be +/- 0.5mm * * Keep the overall length of the MIPI CSI lines to be less than 120mm or a re-driver may be required * VOXL 2 already has 2.2K pullups on CCI I2C lines to DOVDD * The 5V must be heavily bypassed with bulk capacitors, and provide several vias throughout the power route flow to support sustained 2A draws * Starling will incorporate a thermal spreader on the TOF module, and we recommend your design plans for some type of thermal allocation as well to deal with the ~3W consumption of the PMD module * Be sure to complete a 3D fit check using our 3D models linked above. We have several caps very close to the connector, and with a 0.8mm mate height, care must be taken to avoid interferences from components. * RESET_N noted above in the pinout table is held HIGH on M0178. We do not expect to ever need to control it with a GPIO/RESET_N signal, but if making your own hardware, it may be worthwhile to provide this feature should we decide to use it in the future. * We have plans to connect this TOF adapter to both LOWER and UPPER CSI ports throughout VOXL 2, so please check the camera configs to make sure we have your specific CSI port enabled for this TOF before committing to design tapeout. --- Source: https://docs.modalai.com/M0186/ # VOXL2 IMX664 Sensor Datasheet ## Table of Contents 1. TOC ![MSU-M0186picture.jpg](/images/other-products/image-sensors/MSU-M0186picture.jpg) Assembled in the USA by ModalAI for VOXL® 2! A High-resolution Camera based on the Sony Starvis IMX664 sensor. Enable video recording at resolutions up to 2704x1540 @ 120 FPS using this image sensor module. NDAA '20 Section 848 compliant. This module uses a micro-coax for increased mounting flexibility. It does require an adapter to connect with VOXL 2 such as M0173 or M0155 (purchased separately). ## M0186: Hi-Resolution IMX664 Color Camera with M12 150° FOV Lens [Buy Here](https://www.modalai.com/products/msu-m0186) ## Specifications | Specification | Value | |----------------|------------------------------------------------------------------------------------------------| | Sensor | IMX664 [Datasheet](https://www.sony-semicon.com/files/62/flyer_security/IMX664-AAMR1_Flyer.pdf)| | Shutter | Rolling | | Max Resolution | 2704 (H) x 1540 (W) 4.08MP | | Typ Resolution | 1920x1080, 1280x720 | | Framerate | 15-120 | | Lens Mount | M12 | | Lens Part No. | | | Focusing Range | TBD | | Focal Length | | | F Number | TBD | | FOV (DxHxV) | 150 x 130 x 75 (degrees, approx) | | TV Distortion | TBD | | Weight | 10.1g (with lens, 80mm cable) | | IR Filter | No | ## VOXL 2 Compatible Cables and Interfaces | Cable | Adapter Options | |------------|------------------------------------| | MCBL-00084 | [M0173](/M0173), [M0188](/M0188), M0195, [M0155](/M0155), M0172, M0181, M0194 | ## Technical Drawings #### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0186-ModalAi%20FPV%20Cam%20Assembly.STEP) ## Module Connector Pinout for J1 ([S-H26-HR-DS-412](/micro-coax-user-guide/)) | Pin | CAM Group Function | Pin | |-----|------------------------------------------------|-----| | 1 | CCI I2C Bus, SDA | | | | 1.2V DVDD (LDO) | 2 | | 3 | CCI I2C Bus, SCL | | | | 1.2V DVDD (LDO) | 4 | | 5 | System GND | | | | System GND | 6 | | 7 | CSI CLK P | | | | 1.2V DVDD (LDO) | 8 | | 9 | CSI CLK M | | | | 1.8V VDDIO (LDO) | 10 | | 11 | MIPI CSI High Speed Diff Pair, Data Lane 0, P | | | | RESET_N Power down signal (Normally Unused) | 12 | | 13 | MIPI CSI High Speed Diff Pair, Data Lane 0, M | | | 14 | MIPI CSI High Speed Diff Pair, Data Lane 1, P | | | | MCLK, Buffered from VOXL 2, 1.8V | 15 | | 16 | MIPI CSI High Speed Diff Pair, Data Lane 1, M | | | | System GND | 17 | | 18 | System GND | | | | Sensor 2.8V AVDD (LDO) | 19 | | 20 | MIPI CSI High Speed Diff Pair, Data Lane 2, P | | | | Sensor Sync Signal | 21 | | 22 | MIPI CSI High Speed Diff Pair, Data Lane 2, M | | | | System GND | 23 | | 24 | MIPI CSI High Speed Diff Pair, Data Lane 3, P | | | | 3.8V Primary "Phone" Power (mimics nominal 1S) | 25 | | 26 | MIPI CSI High Speed Diff Pair, Data Lane 3, M | | ## VOXL 2 Integration SDK 1.3.0 and greater. More information on the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. | Item | Value | |---|---| | Sensor type in voxl-camera-server | `imx664-fpv` (same driver file as `imx664`) | | Standard camera configurations | VOXL 2 (platform config 1): C46, C47, C48, C50, C51, C60, C61, C62, C63, C64. VOXL 2 Mini (platform config 2): C33, C34, C35, C38, C50, C51, C52. Selected by sensor type; any `imx664-fpv` module is treated the same. Custom configurations are also supported. See the [VOXL 2 camera configurations](/voxl2-camera-configs/) page. Run `voxl-configure-cameras help` on the device for the list shipped with your SDK release. | | Connects to VOXL 2 via | MCBL-00084 micro-coax cable plus [M0173](/M0173/), [M0155](/M0155/), [M0172](/M0172/), M0181 or M0194 (see the cable table above) | | Connects to VOXL 2 Mini via | MCBL-00084 micro-coax cable plus [M0188](/M0188/), [M0195](/M0195/) or [M0155](/M0155/) | | Calibration | Pinhole model, no `--fisheye` flag: `voxl-calibrate-camera ` (see [Calibrate Cameras](/calibrate-cameras/)). | ## Image Samples for the IMX664 Sensor ### Outdoor > Please note that due to the lack of IR filter in the lens, colors in outdoor scenes will be distorted due to IR light from the environment. Vegetation, in particular, reflects IR light and does not appear green. Please see examples below. ![IMX664 Outdoor Sample](/images/other-products/image-sensors/Samples/imx664_no_ir_filter_1920x1080_outdoor_sample.jpg) ### Comparison of IMX412 and IMX664 (with and without IR filter) | IMX412 with IR Filter | IMX412 w/o IR Filter | IMX664 w/o IR Filter | ![IMX412 vs IMX664 comparison](/images/other-products/image-sensors/Samples/imx412_ir_noir_imx664_noir_comparison.jpg) --- Source: https://docs.modalai.com/M0189/ # M0189 I2C 8x8 ToF Module A compact multizone Time-of-Flight rangefinder built around the STMicroelectronics **VL53L8CX**, assembled in the USA by ModalAI. The module provides up to 8x8 (64-zone) depth measurement over an I2C interface and connects to the [M0188](/M0188/) or [M0195](/M0195/) carrier on the VOXL 2 Mini. --- --- ## Description The M0189 is an I2C 8x8 Time-of-Flight (ToF) rangefinder module assembled in the USA by ModalAI. It is based on the STMicroelectronics VL53L8CX, a direct-ToF, multizone ranging sensor using FlightSense technology and an eye-safe 940 nm Class 1 VCSEL emitter. The module provides absolute distance measurement that is independent of target color and reflectance. Each M0189 connects to a single ToF port on the [M0188](/M0188/) or [M0195](/M0195/) carrier (`J01`, `J23`, `J45`, or `J67`) via an **MCBL-00128** cable. The board is hardware-strapped for I2C operation, so only power, ground, and the I2C bus are routed through the connector — no host configuration of the sensor's mode pins is required. The module is managed in software by [voxl-mini-tof-server](/mini-tof-server/). ## Specification | Parameter | M0189 I2C 8x8 ToF (Rev A) | | --- | --- | | ModalAI part number | M0189 | | Sensor | STMicroelectronics VL53L8CX | | Ranging technology | Direct Time-of-Flight (FlightSense), histogram-based | | Emitter | 940 nm invisible-light VCSEL, Class 1 eye-safe | | Multizone resolution | 8x8 (64 zones) or 4x4 (16 zones), software-selectable | | Field of view | 65° diagonal square FoV (DOE on Tx and Rx) | | Max ranging distance | Up to 400 cm (target- and ambient-dependent) | | Max frame rate | 15 Hz @ 8x8 · 60 Hz @ 4x4 | | Host interface | I2C, up to 1 MHz (board strapped to I2C mode) | | Default I2C address | `0x52` (8-bit) / `0x29` (7-bit) | | Supply rails | 3.3 V (AVDD) and 1.8 V (IOVDD / CORE_1V8) | | Board connector | JST `BM05B-SRSS-TBT` — SR series, 1.0 mm pitch, 5-position, top-entry | | Mating cable | MCBL-00128 | | Connects to | M0188 or M0195 carrier — `J01 / J23 / J45 / J67` | | ESD protection | TVS diodes on supply and I2C lines (D1–D4) | | Origin | Assembled in the USA | > The VL53L8CX defaults to 4x4 resolution at power-on. Use the ST ULD API > (`vl53l8cx_set_resolution()`) to switch to 8x8 **before** setting the ranging frequency, > since the maximum frame rate depends on the selected resolution. ## Functional Description The M0189 carries the VL53L8CX (`U1`) plus its required passives, decoupling, and ESD protection. Only the 1.8 V supply, 3.3 V supply, ground, and the I2C bus are exposed at the board connector. All sensor mode-select pins are tied off on the board so the device powers up in a known, ready-to-range I2C configuration. ### On-Board Pin Strapping The VL53L8CX control pins are configured on the M0189 so the host only needs power and the I2C bus: | Sensor pin | Strap | Effect | | --- | --- | --- | | SPI_I2C_N | Pulled to GND via R4 (47 kΩ) | Selects I2C communication mode | | LPN | Pulled to 1.8 V via R1 (10 kΩ) | Low-power / comms enable held active | | NCS | Pulled to 3.3 V via R3 (47 kΩ) | Chip-select inactive (not used in I2C mode) | | SYNC | Pulled to 1.8 V via R2 (47 kΩ), broken out to TP5 | Available for external synchronization | | INT | Broken out to TP6 | Data-ready interrupt test point | > I2C bus pull-ups for SCL/SDA are located on the [M0188](/M0188/) carrier, > not on the M0189 itself. ## Current / Power Consumption | Supply rail | Connector pin | Sensor pins | Max current (design) | | --- | --- | --- | --- | | 1.8 V (VREG_1P8) | J1.1 | IOVDD, CORE_1V8 | 90 mA max | | 3.3 V (VREG_3P3) | J1.2 | AVDD | 60 mA max | Values are the maximum expected currents the module is designed to draw, per the Rev A schematic. Actual consumption varies with resolution, ranging frequency, and integration time. ## Requirements **Hardware** - VOXL 2 Mini with an [M0188](/M0188/) or [M0195](/M0195/) - MCBL-00128 cable to `J01 / J23 / J45 / J67` - 1.8 V and 3.3 V supplied by the carrier **Software** - [voxl-mini-tof-server](/mini-tof-server/) for capture and publishing - ST VL53L8CX ULD API (STSW-IMG040) for low-level control - Data available through Modal Pipe Architecture (MPA) and VOXL Portal ## Technical Drawings ### Step File ### Pin-out at J1 The board connector is a JST `BM05B-SRSS-TBT` (SR series, 1.0 mm pitch, 5-position, top-entry). Pin 1 is the 1.8 V supply; the two mechanical solder tabs (S1, S2) are tied to ground. | Pin | Signal | Description | | --- | --- | --- | | 1 | VREG_1P8 | 1.8 V supply — feeds IOVDD and CORE_1V8 | | 2 | VREG_3P3 | 3.3 V supply — feeds AVDD | | 3 | I2C_SCL | I2C clock (pull-up on M0188/M0195) | | 4 | I2C_SDA | I2C data (pull-up on M0188/M0195) | | 5 | DGND | Digital ground | | S1, S2 | DGND | Connector mechanical / shield tabs, tied to ground | ## VOXL 2 Integration | Item | Value | |---|---| | Sensor type in voxl-camera-server | Not a voxl-camera-server device | | Standard camera configurations | None. `voxl-configure-cameras` does not configure this module; it is managed by [voxl-mini-tof-server](/mini-tof-server/). | | Connects to VOXL 2 via | Not supported; the M0188 and M0195 carrier boards are VOXL 2 Mini only | | Connects to VOXL 2 Mini via | [M0188](/M0188/) or [M0195](/M0195/) ToF port `J01`, `J23`, `J45` or `J67` with an [MCBL-00128](/cable-datasheets/#mcbl-00128) cable | | Calibration | Not calibrated with the chessboard tool. | ## Software Integration On a configured VOXL 2 Mini, the module is driven by [voxl-mini-tof-server](/mini-tof-server/), which publishes per-zone depth data into Modal Pipe Architecture for downstream consumers such as VOXL Vision Hub, the mapper, and VOXL Portal. - Set resolution to 8x8 before configuring the ranging frequency. - Default I2C address is `0x29` (7-bit); change it with `vl53l8cx_set_i2c_address()` when running multiple modules on one bus. - The `LPN` pin can be used to enumerate multiple sensors on a shared bus — note that on M0189 it is held active by R1. > Histogram crosstalk immunity holds beyond ~60 cm. With a cover glass, targets closer than 60 cm > may require crosstalk calibration to avoid false-near readings. --- Source: https://docs.modalai.com/image-sensor-flexes-adapters/ # Image Sensor Flex Cables and Adapters Documentation for ModalAI's range of flex cables and adapters that connect VOXL, RB5 Flight and VOXL 2 to various image sensor modules. ## Extending MIPI Image Sensor Cable Lengths It is strongly recommended to not connect multiple flex cables back-to-back to increase length beyond what ModalAI has shipped as a valid and supported configuration. The risk here includes: * Incorrect connector orientation risk resulting in sensor or Voxl failures (including power to ground shorts) * Adding mating cycles to connectors that have limited life span * Reducing reliability due to increased interconnect points * Increasing the length or creating a configuration beyond the data link limits ModalAI has already proven and supports If your application needs an extended length for your image sensor, please [contact ModalAI](https://www.modalai.com/pages/contact-us) and we can explore a custom flex/cable hardware and software solution that will work for you. ## Image Sensor Flex Catalog | MPN | DESCRIPTION | WEIGHT | 3D Model | BUY | DATASHEET | |-------|----------------------------------------------------|--------|---------------------------------------------------------------------------------------------------------|------------------------------------------------|----------------------| | M0008 | DFT Interposer Flex | 0.7g | | | [Datasheet](/M0008/) | | M0010 | Stereo Flex | 0.9g | | [Buy](https://www.modalai.com/products/m0010/) | [Datasheet](/M0010/) | | M0036 | 14.5cm Extension Flex | | | [Buy](https://www.modalai.com/products/m0036/) | [Datasheet](/M0036/) | | M0074 | 6mc Extension Flex | | | [Buy](https://www.modalai.com/products/m0074/) | [Datasheet](/M0074/) | | M0084 | VOXL 2 Y-Flex | | | [Buy](https://www.modalai.com/products/msu-m0084) | [Datasheet](/M0084/) | | M0109 | VOXL 2 J-Flex | | | | [Datasheet](/M0109/) | | M0135 | VOXL 2 Dual-cam Adapter | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0135_simple.STEP) | | [Datasheet](/M0135/) | | M0155 | VOXL 2 Single Image Sensor Micro-coax Adapter | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0155.step) | [Buy](https://www.modalai.com/products/m0155) | [Datasheet](/M0155/) | | M0170 | 40-pin Molex Straight Flex, 70mm | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0170_REV-B_032124.stp) | [Buy](https://www.modalai.com/products/msu-m0170) | [Datasheet](/M0170/) | | M0172 | VOXL 2 Mini 40-Pin Connector TOF and Hires Adapter | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0172_REVA_3D_2025-11-03.step) | [Buy](https://www.modalai.com/products/mdk-m0172-1-00) | [Datasheet](/M0172/) | | M0173 | VOXL 2 micro-coax breakout (Starling 2 Front-end) | 3.55g | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0173_STARLING_FRONT_END_REVA.step) | | | | M0177 | Starling 2 ToF Flex Cable (40-pin Molex) | | [STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0177_031524_REVIEW2.stp) | | [Datasheet](/M0177/) | | M0226 | VOXL 2 Classic Front End (updated M0173) | | | | [Datasheet](/M0226/) | | M0195 | VOXL 2 Mini Stinger Imager Adapter | | | | [Datasheet](/M0195/) | --- Source: https://docs.modalai.com/M0008/ # M0008 DFT Interposer Flex ## Specification | Specification | Value | |---------------------|-------| | Length | 75 mm end-to-end | | VOXL-side Connector | J1, AXT436124 | | Mating Connector | J2, 503772-2420 | ### Pin Out VOXL-side | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | DGND | | | 2 | DGND | | | 3 | NC | No Connect | | 4 | NC | No Connect | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | VREG_S4A_1P8 | 1.8V VDDIO | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | NC | No Connect | | 9 | CAM_RST0_N | Sensor Reset Control | | 10 | CAM_MCLK_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | NC | No Connect | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | NC | No Connect | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | NC | No Connect | | 24 | NC | No Connect | | 25 | NC | No Connect | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Normally Unused | | 27 | NC | No Connect | | 28 | NC | No Connect | | 29 | NC | No Connect | | 30 | NC | No Connect | | 31 | DGND | | | 32 | DGND | | | 33 | NC | No Connect | | 34 | NC | No Connect | | 35 | NC | No Connect | | 36 | DGND | | ### Pin Out Mating-side | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | DGND | Note Pin 1 of M0008 is Pin 24 of Sensor Module | | 2 | DGND | Note Pin 2 of M0008 is Pin 1 of Sensor Module | | 3 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 4 | CAM_MCLK_BUFF | MCLK, Buffered from Voxl, 1.8V | | 5 | DGND | | | 6 | DGND | | | 7 | NC | No Connect | | 8 | CAM_RST_N | Sensor Reset Control | | 9 | VREG_S4A_1P8 | 1.8V VDDIO | | 10 | CAM_FLASH | Sensor Sideband Control, Unused | | 11 | DGND | | | 12 | DGND | | | 13 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 14 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 15 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 16 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 17 | DGND | | | 18 | DGND | | | 19 | NC | No Connect | | 20 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 21 | CAM_SYNC_EN | Sensor Sync Signal, Normally Unused | | 22 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 23 | ULPM | Sensor Ultra-Low-Power Mode Input, Held HIGH | | 24 | DGND | | ## Technical Drawings ### 2D Diagram ![MCBL-M0008](/images/other-products/flex-cables/m0008-2d.png) ### ASSY Drawing This drawing shows pin 1' of each connector as related to the pin table above. Note many older ModalAI image sensors have an alternate pin 1 notation which aligns with pin 2 on this flex. We expect to fix this confusion as we introduce a new 40-pin connector format this year (2024). ![MCBL-M0008-ASSY](/images/other-products/flex-cables/m0008-assy.jpg) --- Source: https://docs.modalai.com/M0010/ # M0010 Stereo Flex ## Specification | Specification | Value | |---------------------|-----------------------------------------------------------| | Length | 100mm edge-to-edge for an 80mm baseline, ~20mm "T" height | | VOXL-side Connector | J1, Panasonic 36-pin AXT436124 | | Mating Connector | J2&J3, Molex 24-pin 5037722410 | [Buy Here](https://www.modalai.com/products/m0010) ### Pin Out VOXL-side, J1 | Pin | Net | Notes/Usage | |-----|------------------------|-----------------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | NC | No Connect | | 4 | NC | No Connect | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | VREG_S4A_1P8 | 1.8V VDDIO | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | NC | No Connect | | 9 | CAM1_RST0_N | Sensor Reset Control, 0 (Left) | | 10 | CAM_MCLK1_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI1_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | L_FLASH | Left Sensor Sideband Control, Unused | | 15 | MIPI_CSI1_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Left Sensor Sync Signal, Shorted to Right | | 17 | MIPI_CSI1_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM1_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V | | 19 | MIPI_CSI1_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | NC | No Connect | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | NC | No Connect | | 26 | CAM_SYNC_1 | Right Sensor Sync Signal, Shorted to Left | | 27 | MIPI_CSI1_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI1_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI1_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right CLK_P | | 34 | NC | No Connect | | 35 | MIPI_CSI1_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right CLK_M | | 36 | DGND | | ### Pin Out Mating-side, J2 (Left) | Pin | Net | Notes/Usage | |-----|------------------------|------------------------------------------------| | 1 | DGND | Note Pin 1 of M0010 is Pin 24 of Sensor Module | | 2 | DGND | Note Pin 2 of M0010 is Pin 1 of Sensor Module | | 3 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 4 | CAM_MCLK1_BUFF | MCLK, Buffered from Voxl, 1.8V | | 5 | DGND | | | 6 | DGND | | | 7 | NC | No Connect | | 8 | CAM1_RST0_N | Sensor Reset Control, 0 (Left) | | 9 | VREG_S4A_1P8 | 1.8V VDDIO | | 10 | L_FLASH | Left Sensor Sideband Control, Unused | | 11 | DGND | | | 12 | DGND | | | 13 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 14 | MIPI_CSI1_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 15 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 16 | MIPI_CSI1_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 17 | DGND | | | 18 | DGND | | | 19 | NC | No Connect | | 20 | MIPI_CSI1_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 21 | CAM_SYNC_0 | Left Sensor Sync Signal, Shorted to Right | | 22 | MIPI_CSI1_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 23 | L_ULPM | Sensor Ultra-Low-Power Mode Input, Held HIGH | | 24 | DGND | | ### Pin Out Mating-side, J3 (Right) | Pin | Net | Notes/Usage | |-----|------------------------|-----------------------------------------------------------| | 1 | DGND | Note Pin 1 of M0010 is Pin 24 of Sensor Module | | 2 | DGND | Note Pin 2 of M0010 is Pin 1 of Sensor Module | | 3 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 4 | CAM1_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V | | 5 | DGND | | | 6 | DGND | | | 7 | NC | No Connect | | 8 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 9 | VREG_S4A_1P8 | 1.8V VDDIO | | 10 | L_FLASH | Left Sensor Sideband Control, Unused | | 11 | DGND | | | 12 | DGND | | | 13 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 14 | MIPI_CSI1_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_P | | 15 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 16 | MIPI_CSI1_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_M | | 17 | DGND | | | 18 | DGND | | | 19 | NC | No Connect | | 20 | MIPI_CSI1_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right CLK_P | | 21 | CAM_SYNC_1 | Right Sensor Sync Signal, Shorted to Left | | 22 | MIPI_CSI1_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right CLK_M | | 23 | R_ULPM | Sensor Ultra-Low-Power Mode Input, Held HIGH | | 24 | DGND | | The following diagram shows the connectors on the [MSU-M0010-1-01](https://www.modalai.com/products/m0010) stereo flex cable. The OEM-M0015-1-00 image sensor module connects to these for example. ![MSU-M0010-1-01-pinout.png](/images/other-products/image-sensors/MFPC-M0010A-pinout.png) ![Stereo_TFlex_Pin_Location.JPG](/images/other-products/image-sensors/Stereo_TFlex_Pin_Location.JPG) ![Stereo_TFlex_Complete.JPG](/images/other-products/image-sensors/Stereo_TFlex_Complete.JPG) ![Stereo_TFlex_Location.JPG](/images/other-products/image-sensors/Stereo_TFlex_Location.JPG) ## Technical Drawings ### 2D Diagram ![MCBL-M0010](/images/other-products/flex-cables/m0010-2d.png) --- Source: https://docs.modalai.com/M0036/ # M0036 Extension Flex 15cm ## Specification | Specification | Value | |---------------------|-------| | Length | 150mm edge-to-edge for an ~145mm extension | | VOXL-side Connector | J1, Panasonic 36-pin AXT436124 | | Mating Connector | J2, Panasonic 36-pin AXT336124 | ### Pin Out VOXL-side, J1 | Pin | Net | Notes/Usage | |-----|-----------------------|------------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM0_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (VREG_S4A or switched VREG_S4A) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.1V or 1.2V DVDD | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAMx_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V. Only on J3 | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_AVDD_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ### Pin Out Mating-side, J2 (same as J1) | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM0_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (VREG_S4A or switched VREG_S4A) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.1V or 1.2V DVDD | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAMx_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V. Only on J3 | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_AVDD_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ## Technical Drawings ### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/M0036_145mm.stp) ### 2D Diagram ![MCBL-M0036](/images/other-products/flex-cables/m0036-2d.png) ![MCBL-M0036](/images/other-products/flex-cables/m0036-2d-2.png) --- Source: https://docs.modalai.com/M0039/ # M0010 Stereo Flex ## Specification | Specification | Value | |---------------------|-----------------------------------------------------------| | Length | 218mm baseline with QTY. M0015-1 stereo sensors | | VOXL-side Connector | J1, Panasonic 36-pin AXT436124 | | Mating Connector | J2&J3, Molex 24-pin 5037722410 | [Buy Here](https://www.modalai.com/products/m0039) ### Pin Out VOXL-side, J1 | Pin | Net | Notes/Usage | |-----|------------------------|-----------------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | NC | No Connect | | 4 | NC | No Connect | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | VREG_S4A_1P8 | 1.8V VDDIO | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | NC | No Connect | | 9 | CAM1_RST0_N | Sensor Reset Control, 0 (Left) | | 10 | CAM_MCLK1_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI1_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | L_FLASH | Left Sensor Sideband Control, Unused | | 15 | MIPI_CSI1_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Left Sensor Sync Signal, Shorted to Right | | 17 | MIPI_CSI1_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM1_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V | | 19 | MIPI_CSI1_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | NC | No Connect | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | NC | No Connect | | 26 | CAM_SYNC_1 | Right Sensor Sync Signal, Shorted to Left | | 27 | MIPI_CSI1_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI1_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI1_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right CLK_P | | 34 | NC | No Connect | | 35 | MIPI_CSI1_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right CLK_M | | 36 | DGND | | ### Pin Out Mating-side, J2 (Left) | Pin | Net | Notes/Usage | |-----|------------------------|------------------------------------------------| | 1 | DGND | Note Pin 1 of M0010 is Pin 24 of Sensor Module | | 2 | DGND | Note Pin 2 of M0010 is Pin 1 of Sensor Module | | 3 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 4 | CAM_MCLK1_BUFF | MCLK, Buffered from Voxl, 1.8V | | 5 | DGND | | | 6 | DGND | | | 7 | NC | No Connect | | 8 | CAM1_RST0_N | Sensor Reset Control, 0 (Left) | | 9 | VREG_S4A_1P8 | 1.8V VDDIO | | 10 | L_FLASH | Left Sensor Sideband Control, Unused | | 11 | DGND | | | 12 | DGND | | | 13 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 14 | MIPI_CSI1_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 15 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 16 | MIPI_CSI1_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 17 | DGND | | | 18 | DGND | | | 19 | NC | No Connect | | 20 | MIPI_CSI1_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 21 | CAM_SYNC_0 | Left Sensor Sync Signal, Shorted to Right | | 22 | MIPI_CSI1_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 23 | L_ULPM | Sensor Ultra-Low-Power Mode Input, Held HIGH | | 24 | DGND | | ### Pin Out Mating-side, J3 (Right) | Pin | Net | Notes/Usage | |-----|------------------------|-----------------------------------------------------------| | 1 | DGND | Note Pin 1 of M0010 is Pin 24 of Sensor Module | | 2 | DGND | Note Pin 2 of M0010 is Pin 1 of Sensor Module | | 3 | VREG_L23A_2P8 | Sensor 2.8V AVDD | | 4 | CAM1_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V | | 5 | DGND | | | 6 | DGND | | | 7 | NC | No Connect | | 8 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 9 | VREG_S4A_1P8 | 1.8V VDDIO | | 10 | L_FLASH | Left Sensor Sideband Control, Unused | | 11 | DGND | | | 12 | DGND | | | 13 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 14 | MIPI_CSI1_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_P | | 15 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 16 | MIPI_CSI1_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right Data Lane 0_M | | 17 | DGND | | | 18 | DGND | | | 19 | NC | No Connect | | 20 | MIPI_CSI1_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Stereo Right CLK_P | | 21 | CAM_SYNC_1 | Right Sensor Sync Signal, Shorted to Left | | 22 | MIPI_CSI1_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Stereo Right CLK_M | | 23 | R_ULPM | Sensor Ultra-Low-Power Mode Input, Held HIGH | | 24 | DGND | | The following diagram shows the connectors on the [MSU-M0010-1-01](/M0010/) stereo flex cable. The M0039-1 has the same pinouts as the M0010-1. ![MSU-M0010-1-01-pinout.png](/images/other-products/image-sensors/MFPC-M0010A-pinout.png) ![Stereo_TFlex_Pin_Location.JPG](/images/other-products/image-sensors/Stereo_TFlex_Pin_Location.JPG) ![Stereo_TFlex_Complete.JPG](/images/other-products/image-sensors/Stereo_TFlex_Complete.JPG) ![Stereo_TFlex_Location.JPG](/images/other-products/image-sensors/Stereo_TFlex_Location.JPG) ## Technical Drawings ### 2D Diagram --- Source: https://docs.modalai.com/M0074/ # M0074 Extension Flex 6cm ## Specification | Specification | Value | |---------------------|-------| | Length | 60mm edge-to-edge for an ~55mm extension | | VOXL-side Connector | J1, Panasonic 36-pin AXT436124 | | Mating Connector | J2, Panasonic 36-pin AXT336124 | ### Pin Out VOXL-side, J1 | Pin | Net | Notes/Usage | |-----|-----------------------|------------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM0_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (VREG_S4A or switched VREG_S4A) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.1V or 1.2V DVDD | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAMx_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V. Only on J3 | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_AVDD_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ### Pin Out Mating-side, J2 (same as J1) | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM0_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (VREG_S4A or switched VREG_S4A) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.1V or 1.2V DVDD | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAMx_MCLK3 | Stereo MCLK, Buffered from Voxl, 1.8V. Only on J3 | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | VREG_AVDD_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM1_RST1_N | Sensor Reset Control, 1 (Right) | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ## Technical Drawings ### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0074_112222.stp) ### 2D Diagram ![MCBL-M0074](/images/other-products/flex-cables/m0074-2d.png) ![MCBL-M0074](/images/other-products/flex-cables/m0074-2d-2.png) --- Source: https://docs.modalai.com/m0076/ # M0076 VOXL 2 AXT Interposer ## Specification | Specification | Value | |---------------------|-------| | Length | Not Applicable, Connector "interposer" format | | VOXL2-side Connector | J2, 60-pin Hirose DF40C-60DS-0.4V | | Mating Connector | J1, Voxl style 36-pin Panasonic AXT336124 | | Purpose | Connects "Lower Group" signals (CSI, Timers, Resets, etc) of either J6, J7, or J8 60-pin DF40 to a Voxl format 36-pin AXT connector. Refer to Voxl2 datasheets for more description on a camera "group" | ### Pin Out VOXL2-side, J2 | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | GND | | | 2 | GND | | | 3 | Lower CCI_I2C_SDA | Available on J1 | | 4 | DVDD 1.2V | Not default, R option | | 5 | Lower CCI_I2C_SCL | Available on J1 | | 6 | DOVDD 1.8V | Available on J1 | | 7 | GND | | | 8 | DVDD 1.05V | Available on J1 | | 9 | Lower CSI_CLK_P | Available on J1 | | 10 | Lower RST_N | Available on J1 | | 11 | Lower CSI_CLK_M | Available on J1 | | 12 | Lower MCLK | Available on J1 | | 13 | Lower CSI_DAT0_P | Available on J1 | | 14 | GND | | | 15 | Lower CSI_DAT0_M | Available on J1 | | 16 | Lower CCI Timer | Test Point TP2 Only | | 17 | GND | | | 18 | Upper CCI Timer | Test Point TP3 and Both Syncs on J1 | | 19 | Lower CSI_DATA1_P | Available on J1 | | 20 | Upper MCLK | Available on J1 | | 21 | Lower CSI_DATA1_M | Available on J1 | | 22 | AVDD 2.8V | Available on J1 | | 23 | Lower CSI_DATA2_P | Available on J1 | | 24 | GND | | | 25 | Lower CSI_DATA2_M | Available on J1 | | 26 | Upper RST_N, Shared | Available on J1 as CAM_RST_STBY_N | | 27 | GND | | | 28 | Upper CCI_I2C_SDA | Available on J1 | | 29 | Lower CSI_DATA3_P | Available on J1 | | 30 | Upper CCI_I2C_SCL | Available on J1 | | 31 | Lower CSI_DATA3_M | Available on J1 | | 32 | Spare MCLK/GPIO | Test Point TP4 Only | | 33 | GND | | | 34 | Group SPI MISO | Test Point TP5 Only | | 35 | Upper CSI_CLK_P | Not Available/Routed | | 36 | Group SPI MOSI | Test Point TP6 Only | | 37 | Upper CSI_CLK_M | Not Available/Routed | | 38 | Group SPI SCLK | Test Point TP7 Only | | 39 | Upper CSI_DATA0_P | Not Available/Routed | | 40 | Group SPI CS_N | Test Point TP8 Only | | 41 | Upper CSI_DATA0_M | Not Available/Routed | | 42 | VREG_S4A_1P8 | Test Point TP1 Only | | 43 | GND | | | 44 | GND | | | 45 | Upper CSI_DATA1_P | Not Available/Routed | | 46 | VPH_PWR 3.8V | Available on J1 | | 47 | Upper CSI_DATA1_M | Not Available/Routed | | 48 | VPH_PWR 3.8V | Available on J1 | | 49 | Upper CSI_DATA2_P | Not Available/Routed | | 50 | GND | | | 51 | Upper CSI_DATA2_M | Not Available/Routed | | 52 | 3.3V | Test Point TP9 only | | 53 | GND | | | 54 | GND | | | 55 | Upper CSI_DATA3_P | Not Available/Routed | | 56 | 5V | Test Point TP10 only | | 57 | Upper CSI_DATA3_M | Not Available/Routed | | 58 | 5V | Test Point TP10 only | | 59 | GND | | | 60 | GND | | ### Pin Out Mating-side (Voxl format), J1 | Pin | Net | Notes/Usage | | ----- | ------- | ------- | | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM_RST_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (VREG_S4A or switched VREG_S4A) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.1V or 1.2V DVDD | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl2, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 if using M0010 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM_MCLK1 | Second MCLK, Buffered from Voxl, 1.8V. | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | CAM_AVDD_2P8 | Sensor 2.8V AVDD | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM_RST1_N | Sensor Reset Control, 1 | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_0 if using M0010 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ## Technical Drawings ### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0076_112222.stp) ### 2D Diagrams ![MCBL-M0076](/images/other-products/flex-cables/m0076-2d.png) ![MCBL-M0076](/images/other-products/flex-cables/m0076-2d-2.png) --- Source: https://docs.modalai.com/M0084/ # M0084 VOXL 2 Y-AXT Flex Cable ## Specification | Specification | Value | |---------------------------------|-------------------------------------------| | Length | 125mm edge to edge | | Width | 16mm Voxl2 edge, 28mm JL leg edge to edge | | VOXL2-side Connector, J1 | DF40C-60DS-0.4V | | VOXL-Side Connectors, JU and JL | AXT336124 | The M0084 flex is a special cable connector that served many functions. - It is capable of plugging into any of the three Camera Group connectors, J6, J7, or J8, on Voxl2. - The Flex cable exposes two equivalent hardware connectors to the same 36-pin Panasonics that Voxl has from each camera group - In theory, if Qty-3 M0084 flexes were mated to Voxl2, then all 6 MIPI CSI ports are exposed as six 4-Lane Voxl style connectors - To differentiate the 4-Lane MIPI CSI porting, we use the term "Upper" and "Lower" CSI since each Camera group has two CSI ports on it - J6 has MIPI CSI ports 0 (lower) and 1 (upper) - J7 has MIPI CSI ports 2 (lower) and 3 (upper) - J8 has MIPI CSI ports 4 (lower) and 5 (upper) The notations below include a very detailed pin table for the M0084 depending on which Camera Group it is mated with, namely J6-J8 The mapping for the Voxl-side connectors, namely JU (upper) and JL (lower) are generic and follow the mapping from the more comprehensive 60-pin (x3 = 180) table We encourage you to copy-> paste this table into excel, and then you can sort accordingly for your group and align them with the JU and JL connectors. Also please reach out to us on our forum for any clarifications or verification. ### Pin Out VOXL2-side, J1 | Camera Group | Connector Pin # | Group Function | VOXL2 Specific Net Name | |--------------|-----------------|---------------------|--------------------------| | 0:J6 | 1 | GND | DGND | | 0:J6 | 2 | GND | DGND | | 0:J6 | 3 | Lower CCI_I2C_SDA | CCI_I2C0_SDA | | 0:J6 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 0:J6 | 5 | Lower CCI_I2C_SCL | CCI_I2C0_SCL | | 0:J6 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 0:J6 | 7 | GND | DGND | | 0:J6 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 0:J6 | 9 | Lower CSI_CLK_P | CSI0_CLK_CON_P | | 0:J6 | 10 | Lower RST_N | GPIO_93_CAM0_RST_N | | 0:J6 | 11 | Lower CSI_CLK_M | CSI0_CLK_CON_M | | 0:J6 | 12 | Lower MCLK | CAM_MCLK0_CON | | 0:J6 | 13 | Lower CSI_DAT0_P | CSI0_LANE0_CON_P | | 0:J6 | 14 | GND | DGND | | 0:J6 | 15 | Lower CSI_DAT0_M | CSI0_LANE0_CON_N | | 0:J6 | 16 | Lower CCI Timer | GPIO_110_CCI_TIMER1 | | 0:J6 | 17 | GND | DGND | | 0:J6 | 18 | Upper CCI Timer | GPIO_113_CCI_TIMER4 | | 0:J6 | 19 | Lower CSI_DATA1_P | CSI0_LANE1_CON_P | | 0:J6 | 20 | Upper MCLK | CAM_MCLK1_CON | | 0:J6 | 21 | Lower CSI_DATA1_M | CSI0_LANE1_CON_N | | 0:J6 | 22 | AVDD 2.8V | PM8009_VREG_L5_AVDD_2P8 | | 0:J6 | 23 | Lower CSI_DATA2_P | CSI0_LANE2_CON_P | | 0:J6 | 24 | GND | DGND | | 0:J6 | 25 | Lower CSI_DATA2_M | CSI0_LANE2_CON_N | | 0:J6 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 0:J6 | 27 | GND | DGND | | 0:J6 | 28 | Upper CCI_I2C_SDA | CCI_I2C1_SDA | | 0:J6 | 29 | Lower CSI_DATA3_P | CSI0_LANE3_CON_P | | 0:J6 | 30 | Upper CCI_I2C_SCL | CCI_I2C1_SCL | | 0:J6 | 31 | Lower CSI_DATA3_M | CSI0_LANE3_CON_N | | 0:J6 | 32 | Spare MCLK/GPIO | MCLK6_G0_CON | | 0:J6 | 33 | GND | DGND | | 0:J6 | 34 | Group SPI MISO | GPIO_28_CAM0_SPI0_MISO | | 0:J6 | 35 | Upper CSI_CLK_P | CSI1_CLK_CON_P | | 0:J6 | 36 | Group SPI MOSI | GPIO_29_CAM0_SPI0_MOSI | | 0:J6 | 37 | Upper CSI_CLK_M | CSI1_CLK_CON_N | | 0:J6 | 38 | Group SPI SCLK | GPIO_30_CAM0_SPI0_CLK | | 0:J6 | 39 | Upper CSI_DATA0_P | CSI1_LANE0_CON_P | | 0:J6 | 40 | Group SPI CS_N | GPIO_31_CAM0_SPI0_CS | | 0:J6 | 41 | Upper CSI_DATA0_M | CSI1_LANE0_CON_N | | 0:J6 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 0:J6 | 43 | GND | DGND | | 0:J6 | 44 | GND | DGND | | 0:J6 | 45 | Upper CSI_DATA1_P | CSI1_LANE1_CON_P | | 0:J6 | 46 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 47 | Upper CSI_DATA1_M | CSI1_LANE1_CON_N | | 0:J6 | 48 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 49 | Upper CSI_DATA2_P | CSI1_LANE2_CON_P | | 0:J6 | 50 | GND | DGND | | 0:J6 | 51 | Upper CSI_DATA2_M | CSI1_LANE2_CON_N | | 0:J6 | 52 | 3.3V | VREG_3P3V_LOCAL | | 0:J6 | 53 | GND | DGND | | 0:J6 | 54 | GND | DGND | | 0:J6 | 55 | Upper CSI_DATA3_P | CSI1_LANE3_CON_P | | 0:J6 | 56 | 5V | VDC_5V_LOCAL | | 0:J6 | 57 | Upper CSI_DATA3_M | CSI1_LANE3_CON_N | | 0:J6 | 58 | 5V | VDC_5V_LOCAL | | 0:J6 | 59 | GND | DGND | | 0:J6 | 60 | GND | DGND | | 1:J7 | 1 | GND | DGND | | 1:J7 | 2 | GND | DGND | | 1:J7 | 3 | Lower CCI_I2C_SDA | CCI_I2C2_SDA | | 1:J7 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 1:J7 | 5 | Lower CCI_I2C_SCL | CCI_I2C2_SCL | | 1:J7 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 1:J7 | 7 | GND | DGND | | 1:J7 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 1:J7 | 9 | Lower CSI_CLK_P | CSI2_CLK_CON_P | | 1:J7 | 10 | Lower RST_N | GPIO_92_CAM1_RST_N | | 1:J7 | 11 | Lower CSI_CLK_M | CSI2_CLK_CON_M | | 1:J7 | 12 | Lower MCLK | CAM_MCLK2_CON | | 1:J7 | 13 | Lower CSI_DAT0_P | CSI2_LANE0_CON_P | | 1:J7 | 14 | GND | DGND | | 1:J7 | 15 | Lower CSI_DAT0_M | CSI2_LANE0_CON_N | | 1:J7 | 16 | Lower CCI Timer | GPIO_111_CCI_TIMER2 | | 1:J7 | 17 | GND | DGND | | 1:J7 | 18 | Upper CCI Timer | GPIO_114_CCI_ASYNC_IN | | 1:J7 | 19 | Lower CSI_DATA1_P | CSI2_LANE1_CON_P | | 1:J7 | 20 | Upper MCLK | CAM_MCLK3_CON | | 1:J7 | 21 | Lower CSI_DATA1_M | CSI2_LANE1_CON_N | | 1:J7 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 1:J7 | 23 | Lower CSI_DATA2_P | CSI2_LANE2_CON_P | | 1:J7 | 24 | GND | DGND | | 1:J7 | 25 | Lower CSI_DATA2_M | CSI2_LANE2_CON_N | | 1:J7 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 1:J7 | 27 | GND | DGND | | 1:J7 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 1:J7 | 29 | Lower CSI_DATA3_P | CSI2_LANE3_CON_P | | 1:J7 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 1:J7 | 31 | Lower CSI_DATA3_M | CSI2_LANE3_CON_N | | 1:J7 | 32 | Spare MCLK/GPIO | MCLK6_G1_CON | | 1:J7 | 33 | GND | DGND | | 1:J7 | 34 | Group SPI MISO | GPIO_4_CAM1_SPI1_MISO | | 1:J7 | 35 | Upper CSI_CLK_P | CSI3_CLK_CON_P | | 1:J7 | 36 | Group SPI MOSI | GPIO_5_CAM1_SPI1_MOSI | | 1:J7 | 37 | Upper CSI_CLK_M | CSI3_CLK_CON_N | | 1:J7 | 38 | Group SPI SCLK | GPIO_6_CAM1_SPI1_CLK | | 1:J7 | 39 | Upper CSI_DATA0_P | CSI3_LANE0_CON_P | | 1:J7 | 40 | Group SPI CS_N | GPIO_7_CAM1_SPI1_CS | | 1:J7 | 41 | Upper CSI_DATA0_M | CSI3_LANE0_CON_N | | 1:J7 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 1:J7 | 43 | GND | DGND | | 1:J7 | 44 | GND | DGND | | 1:J7 | 45 | Upper CSI_DATA1_P | CSI3_LANE1_CON_P | | 1:J7 | 46 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 47 | Upper CSI_DATA1_M | CSI3_LANE1_CON_N | | 1:J7 | 48 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 49 | Upper CSI_DATA2_P | CSI3_LANE2_CON_P | | 1:J7 | 50 | GND | DGND | | 1:J7 | 51 | Upper CSI_DATA2_M | CSI3_LANE2_CON_N | | 1:J7 | 52 | 3.3V | VREG_3P3V_LOCAL | | 1:J7 | 53 | GND | DGND | | 1:J7 | 54 | GND | DGND | | 1:J7 | 55 | Upper CSI_DATA3_P | CSI3_LANE3_CON_P | | 1:J7 | 56 | 5V | VDC_5V_LOCAL | | 1:J7 | 57 | Upper CSI_DATA3_M | CSI3_LANE3_CON_N | | 1:J7 | 58 | 5V | VDC_5V_LOCAL | | 1:J7 | 59 | GND | DGND | | 1:J7 | 60 | GND | DGND | | 2:J8 | 1 | GND | DGND | | 2:J8 | 2 | GND | DGND | | 2:J8 | 3 | Lower CCI_I2C_SDA | CCI_I2C1_SDA | | 2:J8 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 2:J8 | 5 | Lower CCI_I2C_SCL | CCI_I2C1_SCL | | 2:J8 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 2:J8 | 7 | GND | DGND | | 2:J8 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 2:J8 | 9 | Lower CSI_CLK_P | CSI4_CLK_CON_P | | 2:J8 | 10 | Lower RST_N | GPIO_78_CAM2_RST_N | | 2:J8 | 11 | Lower CSI_CLK_M | CSI4_CLK_CON_M | | 2:J8 | 12 | Lower MCLK | CAM_MCLK4_CON | | 2:J8 | 13 | Lower CSI_DAT0_P | CSI4_LANE0_CON_P | | 2:J8 | 14 | GND | DGND | | 2:J8 | 15 | Lower CSI_DAT0_M | CSI4_LANE0_CON_N | | 2:J8 | 16 | Lower CCI Timer | GPIO_112_CCI_TIMER3 | | 2:J8 | 17 | GND | DGND | | 2:J8 | 18 | Upper CCI Timer | GPIO_111_CCI_TIMER2 | | 2:J8 | 19 | Lower CSI_DATA1_P | CSI4_LANE1_CON_P | | 2:J8 | 20 | Upper MCLK | CAM_MCLK5_CON | | 2:J8 | 21 | Lower CSI_DATA1_M | CSI4_LANE1_CON_N | | 2:J8 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 2:J8 | 23 | Lower CSI_DATA2_P | CSI4_LANE2_CON_P | | 2:J8 | 24 | GND | DGND | | 2:J8 | 25 | Lower CSI_DATA2_M | CSI4_LANE2_CON_N | | 2:J8 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 2:J8 | 27 | GND | DGND | | 2:J8 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 2:J8 | 29 | Lower CSI_DATA3_P | CSI4_LANE3_CON_P | | 2:J8 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 2:J8 | 31 | Lower CSI_DATA3_M | CSI4_LANE3_CON_N | | 2:J8 | 32 | Spare MCLK/GPIO | MCLK6_G2_CON | | 2:J8 | 33 | GND | DGND | | 2:J8 | 34 | Group SPI MISO | GPIO_12_CAM1_SPI5_MISO | | 2:J8 | 35 | Upper CSI_CLK_P | CSI5_CLK_CON_P | | 2:J8 | 36 | Group SPI MOSI | GPIO_13_CAM1_SPI5_MOSI | | 2:J8 | 37 | Upper CSI_CLK_M | CSI5_CLK_CON_N | | 2:J8 | 38 | Group SPI SCLK | GPIO_14_CAM1_SPI5_CLK | | 2:J8 | 39 | Upper CSI_DATA0_P | CSI5_LANE0_CON_P | | 2:J8 | 40 | Group SPI CS_N | GPIO_15_CAM1_SPI5_CS | | 2:J8 | 41 | Upper CSI_DATA0_M | CSI5_LANE0_CON_N | | 2:J8 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 2:J8 | 43 | GND | DGND | | 2:J8 | 44 | GND | DGND | | 2:J8 | 45 | Upper CSI_DATA1_P | CSI5_LANE1_CON_P | | 2:J8 | 46 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 47 | Upper CSI_DATA1_M | CSI5_LANE1_CON_N | | 2:J8 | 48 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 49 | Upper CSI_DATA2_P | CSI5_LANE2_CON_P | | 2:J8 | 50 | GND | DGND | | 2:J8 | 51 | Upper CSI_DATA2_M | CSI5_LANE2_CON_N | | 2:J8 | 52 | 3.3V | VREG_3P3V_LOCAL | | 2:J8 | 53 | GND | DGND | | 2:J8 | 54 | GND | DGND | | 2:J8 | 55 | Upper CSI_DATA3_P | CSI5_LANE3_CON_P | | 2:J8 | 56 | 5V | VDC_5V_LOCAL | | 2:J8 | 57 | Upper CSI_DATA3_M | CSI5_LANE3_CON_N | | 2:J8 | 58 | 5V | VDC_5V_LOCAL | | 2:J8 | 59 | GND | DGND | | 2:J8 | 60 | GND | DGND | ### Pin Out Mating-side, JL (lower CSI Port) | Pin | Net | Lower CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM_RST_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (LDO) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.05V (default) or 1.2V DVDD LDO | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl2, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM_MCLK1 | Second MCLK, Buffered from Voxl, 1.8V. | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | CAM_AVDD_2P8 | Sensor 2.8V AVDD LDO | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM_RST1_N | Sensor Reset Control, 1 | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_0 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ### Pin Out Mating-side, JU (upper CSI Port) | Pin | Net | Upper CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM_RST_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (LDO) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.05V (default) or 1.2V DVDD LDO | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl2, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM_MCLK1 | Second MCLK, Buffered from Voxl, 1.8V. | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | CAM_AVDD_2P8 | Sensor 2.8V AVDD LDO | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM_RST1_N | Sensor Reset Control, 1 | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_0 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ## Technical Drawings ### 3D STEP File [Download](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0084_091222.stp) ### 2D Diagrams -Assembly Version View: ![MCBL-M0084](/images/other-products/flex-cables/m0084-2d.png) -Dimensional View: ![MCBL-M0084-2](/images/other-products/flex-cables/m0084-2d-2.png) --- Source: https://docs.modalai.com/M0109/ # M0109 VOXL 2 J-Flex Cable ## Specification | Specification | Value | |---------------------------------|-------------------------------------------| | Length | | | Width | | | VOXL2-side Connector, J1 | DF40C-60DS-0.4V | | Stereo Module Connectors, J2 and J3 | | Description TO DO ### Pin Out VOXL2-side, J1 | Camera Group | Connector Pin # | Group Function | VOXL2 Specific Net Name | |--------------|-----------------|---------------------|--------------------------| | 0:J6 | 1 | GND | DGND | | 0:J6 | 2 | GND | DGND | | 0:J6 | 3 | Lower CCI_I2C_SDA | CCI_I2C0_SDA | | 0:J6 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 0:J6 | 5 | Lower CCI_I2C_SCL | CCI_I2C0_SCL | | 0:J6 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 0:J6 | 7 | GND | DGND | | 0:J6 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 0:J6 | 9 | Lower CSI_CLK_P | CSI0_CLK_CON_P | | 0:J6 | 10 | Lower RST_N | GPIO_93_CAM0_RST_N | | 0:J6 | 11 | Lower CSI_CLK_M | CSI0_CLK_CON_M | | 0:J6 | 12 | Lower MCLK | CAM_MCLK0_CON | | 0:J6 | 13 | Lower CSI_DAT0_P | CSI0_LANE0_CON_P | | 0:J6 | 14 | GND | DGND | | 0:J6 | 15 | Lower CSI_DAT0_M | CSI0_LANE0_CON_N | | 0:J6 | 16 | Lower CCI Timer | GPIO_110_CCI_TIMER1 | | 0:J6 | 17 | GND | DGND | | 0:J6 | 18 | Upper CCI Timer | GPIO_113_CCI_TIMER4 | | 0:J6 | 19 | Lower CSI_DATA1_P | CSI0_LANE1_CON_P | | 0:J6 | 20 | Upper MCLK | CAM_MCLK1_CON | | 0:J6 | 21 | Lower CSI_DATA1_M | CSI0_LANE1_CON_N | | 0:J6 | 22 | AVDD 2.8V | PM8009_VREG_L5_AVDD_2P8 | | 0:J6 | 23 | Lower CSI_DATA2_P | CSI0_LANE2_CON_P | | 0:J6 | 24 | GND | DGND | | 0:J6 | 25 | Lower CSI_DATA2_M | CSI0_LANE2_CON_N | | 0:J6 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 0:J6 | 27 | GND | DGND | | 0:J6 | 28 | Upper CCI_I2C_SDA | CCI_I2C1_SDA | | 0:J6 | 29 | Lower CSI_DATA3_P | CSI0_LANE3_CON_P | | 0:J6 | 30 | Upper CCI_I2C_SCL | CCI_I2C1_SCL | | 0:J6 | 31 | Lower CSI_DATA3_M | CSI0_LANE3_CON_N | | 0:J6 | 32 | Spare MCLK/GPIO | MCLK6_G0_CON | | 0:J6 | 33 | GND | DGND | | 0:J6 | 34 | Group SPI MISO | GPIO_28_CAM0_SPI0_MISO | | 0:J6 | 35 | Upper CSI_CLK_P | CSI1_CLK_CON_P | | 0:J6 | 36 | Group SPI MOSI | GPIO_29_CAM0_SPI0_MOSI | | 0:J6 | 37 | Upper CSI_CLK_M | CSI1_CLK_CON_N | | 0:J6 | 38 | Group SPI SCLK | GPIO_30_CAM0_SPI0_CLK | | 0:J6 | 39 | Upper CSI_DATA0_P | CSI1_LANE0_CON_P | | 0:J6 | 40 | Group SPI CS_N | GPIO_31_CAM0_SPI0_CS | | 0:J6 | 41 | Upper CSI_DATA0_M | CSI1_LANE0_CON_N | | 0:J6 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 0:J6 | 43 | GND | DGND | | 0:J6 | 44 | GND | DGND | | 0:J6 | 45 | Upper CSI_DATA1_P | CSI1_LANE1_CON_P | | 0:J6 | 46 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 47 | Upper CSI_DATA1_M | CSI1_LANE1_CON_N | | 0:J6 | 48 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 49 | Upper CSI_DATA2_P | CSI1_LANE2_CON_P | | 0:J6 | 50 | GND | DGND | | 0:J6 | 51 | Upper CSI_DATA2_M | CSI1_LANE2_CON_N | | 0:J6 | 52 | 3.3V | VREG_3P3V_LOCAL | | 0:J6 | 53 | GND | DGND | | 0:J6 | 54 | GND | DGND | | 0:J6 | 55 | Upper CSI_DATA3_P | CSI1_LANE3_CON_P | | 0:J6 | 56 | 5V | VDC_5V_LOCAL | | 0:J6 | 57 | Upper CSI_DATA3_M | CSI1_LANE3_CON_N | | 0:J6 | 58 | 5V | VDC_5V_LOCAL | | 0:J6 | 59 | GND | DGND | | 0:J6 | 60 | GND | DGND | | 1:J7 | 1 | GND | DGND | | 1:J7 | 2 | GND | DGND | | 1:J7 | 3 | Lower CCI_I2C_SDA | CCI_I2C2_SDA | | 1:J7 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 1:J7 | 5 | Lower CCI_I2C_SCL | CCI_I2C2_SCL | | 1:J7 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 1:J7 | 7 | GND | DGND | | 1:J7 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 1:J7 | 9 | Lower CSI_CLK_P | CSI2_CLK_CON_P | | 1:J7 | 10 | Lower RST_N | GPIO_92_CAM1_RST_N | | 1:J7 | 11 | Lower CSI_CLK_M | CSI2_CLK_CON_M | | 1:J7 | 12 | Lower MCLK | CAM_MCLK2_CON | | 1:J7 | 13 | Lower CSI_DAT0_P | CSI2_LANE0_CON_P | | 1:J7 | 14 | GND | DGND | | 1:J7 | 15 | Lower CSI_DAT0_M | CSI2_LANE0_CON_N | | 1:J7 | 16 | Lower CCI Timer | GPIO_111_CCI_TIMER2 | | 1:J7 | 17 | GND | DGND | | 1:J7 | 18 | Upper CCI Timer | GPIO_114_CCI_ASYNC_IN | | 1:J7 | 19 | Lower CSI_DATA1_P | CSI2_LANE1_CON_P | | 1:J7 | 20 | Upper MCLK | CAM_MCLK3_CON | | 1:J7 | 21 | Lower CSI_DATA1_M | CSI2_LANE1_CON_N | | 1:J7 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 1:J7 | 23 | Lower CSI_DATA2_P | CSI2_LANE2_CON_P | | 1:J7 | 24 | GND | DGND | | 1:J7 | 25 | Lower CSI_DATA2_M | CSI2_LANE2_CON_N | | 1:J7 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 1:J7 | 27 | GND | DGND | | 1:J7 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 1:J7 | 29 | Lower CSI_DATA3_P | CSI2_LANE3_CON_P | | 1:J7 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 1:J7 | 31 | Lower CSI_DATA3_M | CSI2_LANE3_CON_N | | 1:J7 | 32 | Spare MCLK/GPIO | MCLK6_G1_CON | | 1:J7 | 33 | GND | DGND | | 1:J7 | 34 | Group SPI MISO | GPIO_4_CAM1_SPI1_MISO | | 1:J7 | 35 | Upper CSI_CLK_P | CSI3_CLK_CON_P | | 1:J7 | 36 | Group SPI MOSI | GPIO_5_CAM1_SPI1_MOSI | | 1:J7 | 37 | Upper CSI_CLK_M | CSI3_CLK_CON_N | | 1:J7 | 38 | Group SPI SCLK | GPIO_6_CAM1_SPI1_CLK | | 1:J7 | 39 | Upper CSI_DATA0_P | CSI3_LANE0_CON_P | | 1:J7 | 40 | Group SPI CS_N | GPIO_7_CAM1_SPI1_CS | | 1:J7 | 41 | Upper CSI_DATA0_M | CSI3_LANE0_CON_N | | 1:J7 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 1:J7 | 43 | GND | DGND | | 1:J7 | 44 | GND | DGND | | 1:J7 | 45 | Upper CSI_DATA1_P | CSI3_LANE1_CON_P | | 1:J7 | 46 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 47 | Upper CSI_DATA1_M | CSI3_LANE1_CON_N | | 1:J7 | 48 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 49 | Upper CSI_DATA2_P | CSI3_LANE2_CON_P | | 1:J7 | 50 | GND | DGND | | 1:J7 | 51 | Upper CSI_DATA2_M | CSI3_LANE2_CON_N | | 1:J7 | 52 | 3.3V | VREG_3P3V_LOCAL | | 1:J7 | 53 | GND | DGND | | 1:J7 | 54 | GND | DGND | | 1:J7 | 55 | Upper CSI_DATA3_P | CSI3_LANE3_CON_P | | 1:J7 | 56 | 5V | VDC_5V_LOCAL | | 1:J7 | 57 | Upper CSI_DATA3_M | CSI3_LANE3_CON_N | | 1:J7 | 58 | 5V | VDC_5V_LOCAL | | 1:J7 | 59 | GND | DGND | | 1:J7 | 60 | GND | DGND | | 2:J8 | 1 | GND | DGND | | 2:J8 | 2 | GND | DGND | | 2:J8 | 3 | Lower CCI_I2C_SDA | CCI_I2C1_SDA | | 2:J8 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 2:J8 | 5 | Lower CCI_I2C_SCL | CCI_I2C1_SCL | | 2:J8 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 2:J8 | 7 | GND | DGND | | 2:J8 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 2:J8 | 9 | Lower CSI_CLK_P | CSI4_CLK_CON_P | | 2:J8 | 10 | Lower RST_N | GPIO_78_CAM2_RST_N | | 2:J8 | 11 | Lower CSI_CLK_M | CSI4_CLK_CON_M | | 2:J8 | 12 | Lower MCLK | CAM_MCLK4_CON | | 2:J8 | 13 | Lower CSI_DAT0_P | CSI4_LANE0_CON_P | | 2:J8 | 14 | GND | DGND | | 2:J8 | 15 | Lower CSI_DAT0_M | CSI4_LANE0_CON_N | | 2:J8 | 16 | Lower CCI Timer | GPIO_112_CCI_TIMER3 | | 2:J8 | 17 | GND | DGND | | 2:J8 | 18 | Upper CCI Timer | GPIO_111_CCI_TIMER2 | | 2:J8 | 19 | Lower CSI_DATA1_P | CSI4_LANE1_CON_P | | 2:J8 | 20 | Upper MCLK | CAM_MCLK5_CON | | 2:J8 | 21 | Lower CSI_DATA1_M | CSI4_LANE1_CON_N | | 2:J8 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 2:J8 | 23 | Lower CSI_DATA2_P | CSI4_LANE2_CON_P | | 2:J8 | 24 | GND | DGND | | 2:J8 | 25 | Lower CSI_DATA2_M | CSI4_LANE2_CON_N | | 2:J8 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 2:J8 | 27 | GND | DGND | | 2:J8 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 2:J8 | 29 | Lower CSI_DATA3_P | CSI4_LANE3_CON_P | | 2:J8 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 2:J8 | 31 | Lower CSI_DATA3_M | CSI4_LANE3_CON_N | | 2:J8 | 32 | Spare MCLK/GPIO | MCLK6_G2_CON | | 2:J8 | 33 | GND | DGND | | 2:J8 | 34 | Group SPI MISO | GPIO_12_CAM1_SPI5_MISO | | 2:J8 | 35 | Upper CSI_CLK_P | CSI5_CLK_CON_P | | 2:J8 | 36 | Group SPI MOSI | GPIO_13_CAM1_SPI5_MOSI | | 2:J8 | 37 | Upper CSI_CLK_M | CSI5_CLK_CON_N | | 2:J8 | 38 | Group SPI SCLK | GPIO_14_CAM1_SPI5_CLK | | 2:J8 | 39 | Upper CSI_DATA0_P | CSI5_LANE0_CON_P | | 2:J8 | 40 | Group SPI CS_N | GPIO_15_CAM1_SPI5_CS | | 2:J8 | 41 | Upper CSI_DATA0_M | CSI5_LANE0_CON_N | | 2:J8 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 2:J8 | 43 | GND | DGND | | 2:J8 | 44 | GND | DGND | | 2:J8 | 45 | Upper CSI_DATA1_P | CSI5_LANE1_CON_P | | 2:J8 | 46 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 47 | Upper CSI_DATA1_M | CSI5_LANE1_CON_N | | 2:J8 | 48 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 49 | Upper CSI_DATA2_P | CSI5_LANE2_CON_P | | 2:J8 | 50 | GND | DGND | | 2:J8 | 51 | Upper CSI_DATA2_M | CSI5_LANE2_CON_N | | 2:J8 | 52 | 3.3V | VREG_3P3V_LOCAL | | 2:J8 | 53 | GND | DGND | | 2:J8 | 54 | GND | DGND | | 2:J8 | 55 | Upper CSI_DATA3_P | CSI5_LANE3_CON_P | | 2:J8 | 56 | 5V | VDC_5V_LOCAL | | 2:J8 | 57 | Upper CSI_DATA3_M | CSI5_LANE3_CON_N | | 2:J8 | 58 | 5V | VDC_5V_LOCAL | | 2:J8 | 59 | GND | DGND | | 2:J8 | 60 | GND | DGND | ### Pin Out Mating-side, J2 (TBD CSI Port) | Pin | Net | TBD CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | | | ### Pin Out Mating-side, J3 (TBD CSI Port) | Pin | Net | TBD CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | | | ## Technical Drawings ### 3D STEP File ### 2D Diagrams --- Source: https://docs.modalai.com/M0135/ # M0135 VOXL 2 and VOXL 2 Mini Dual Image Sensor Adapter ## Specification | Specification | Value | |---------------------------------|-------------------------------------------| | Length | | | Width | | | VOXL2-side Connector, J1 | DF40C-60DS-0.4V | | Stereo Module Connectors, J2 and J3 | | Description TO DO ### Pin Out VOXL2-side, J1 | Camera Group | Connector Pin # | Group Function | VOXL2 Specific Net Name | |--------------|-----------------|---------------------|--------------------------| | 0:J6 | 1 | GND | DGND | | 0:J6 | 2 | GND | DGND | | 0:J6 | 3 | Lower CCI_I2C_SDA | CCI_I2C0_SDA | | 0:J6 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 0:J6 | 5 | Lower CCI_I2C_SCL | CCI_I2C0_SCL | | 0:J6 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 0:J6 | 7 | GND | DGND | | 0:J6 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 0:J6 | 9 | Lower CSI_CLK_P | CSI0_CLK_CON_P | | 0:J6 | 10 | Lower RST_N | GPIO_93_CAM0_RST_N | | 0:J6 | 11 | Lower CSI_CLK_M | CSI0_CLK_CON_M | | 0:J6 | 12 | Lower MCLK | CAM_MCLK0_CON | | 0:J6 | 13 | Lower CSI_DAT0_P | CSI0_LANE0_CON_P | | 0:J6 | 14 | GND | DGND | | 0:J6 | 15 | Lower CSI_DAT0_M | CSI0_LANE0_CON_N | | 0:J6 | 16 | Lower CCI Timer | GPIO_110_CCI_TIMER1 | | 0:J6 | 17 | GND | DGND | | 0:J6 | 18 | Upper CCI Timer | GPIO_113_CCI_TIMER4 | | 0:J6 | 19 | Lower CSI_DATA1_P | CSI0_LANE1_CON_P | | 0:J6 | 20 | Upper MCLK | CAM_MCLK1_CON | | 0:J6 | 21 | Lower CSI_DATA1_M | CSI0_LANE1_CON_N | | 0:J6 | 22 | AVDD 2.8V | PM8009_VREG_L5_AVDD_2P8 | | 0:J6 | 23 | Lower CSI_DATA2_P | CSI0_LANE2_CON_P | | 0:J6 | 24 | GND | DGND | | 0:J6 | 25 | Lower CSI_DATA2_M | CSI0_LANE2_CON_N | | 0:J6 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 0:J6 | 27 | GND | DGND | | 0:J6 | 28 | Upper CCI_I2C_SDA | CCI_I2C1_SDA | | 0:J6 | 29 | Lower CSI_DATA3_P | CSI0_LANE3_CON_P | | 0:J6 | 30 | Upper CCI_I2C_SCL | CCI_I2C1_SCL | | 0:J6 | 31 | Lower CSI_DATA3_M | CSI0_LANE3_CON_N | | 0:J6 | 32 | Spare MCLK/GPIO | MCLK6_G0_CON | | 0:J6 | 33 | GND | DGND | | 0:J6 | 34 | Group SPI MISO | GPIO_28_CAM0_SPI0_MISO | | 0:J6 | 35 | Upper CSI_CLK_P | CSI1_CLK_CON_P | | 0:J6 | 36 | Group SPI MOSI | GPIO_29_CAM0_SPI0_MOSI | | 0:J6 | 37 | Upper CSI_CLK_M | CSI1_CLK_CON_N | | 0:J6 | 38 | Group SPI SCLK | GPIO_30_CAM0_SPI0_CLK | | 0:J6 | 39 | Upper CSI_DATA0_P | CSI1_LANE0_CON_P | | 0:J6 | 40 | Group SPI CS_N | GPIO_31_CAM0_SPI0_CS | | 0:J6 | 41 | Upper CSI_DATA0_M | CSI1_LANE0_CON_N | | 0:J6 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 0:J6 | 43 | GND | DGND | | 0:J6 | 44 | GND | DGND | | 0:J6 | 45 | Upper CSI_DATA1_P | CSI1_LANE1_CON_P | | 0:J6 | 46 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 47 | Upper CSI_DATA1_M | CSI1_LANE1_CON_N | | 0:J6 | 48 | VPH_PWR 3.8V | VPH_PWR | | 0:J6 | 49 | Upper CSI_DATA2_P | CSI1_LANE2_CON_P | | 0:J6 | 50 | GND | DGND | | 0:J6 | 51 | Upper CSI_DATA2_M | CSI1_LANE2_CON_N | | 0:J6 | 52 | 3.3V | VREG_3P3V_LOCAL | | 0:J6 | 53 | GND | DGND | | 0:J6 | 54 | GND | DGND | | 0:J6 | 55 | Upper CSI_DATA3_P | CSI1_LANE3_CON_P | | 0:J6 | 56 | 5V | VDC_5V_LOCAL | | 0:J6 | 57 | Upper CSI_DATA3_M | CSI1_LANE3_CON_N | | 0:J6 | 58 | 5V | VDC_5V_LOCAL | | 0:J6 | 59 | GND | DGND | | 0:J6 | 60 | GND | DGND | | 1:J7 | 1 | GND | DGND | | 1:J7 | 2 | GND | DGND | | 1:J7 | 3 | Lower CCI_I2C_SDA | CCI_I2C2_SDA | | 1:J7 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 1:J7 | 5 | Lower CCI_I2C_SCL | CCI_I2C2_SCL | | 1:J7 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 1:J7 | 7 | GND | DGND | | 1:J7 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 1:J7 | 9 | Lower CSI_CLK_P | CSI2_CLK_CON_P | | 1:J7 | 10 | Lower RST_N | GPIO_92_CAM1_RST_N | | 1:J7 | 11 | Lower CSI_CLK_M | CSI2_CLK_CON_M | | 1:J7 | 12 | Lower MCLK | CAM_MCLK2_CON | | 1:J7 | 13 | Lower CSI_DAT0_P | CSI2_LANE0_CON_P | | 1:J7 | 14 | GND | DGND | | 1:J7 | 15 | Lower CSI_DAT0_M | CSI2_LANE0_CON_N | | 1:J7 | 16 | Lower CCI Timer | GPIO_111_CCI_TIMER2 | | 1:J7 | 17 | GND | DGND | | 1:J7 | 18 | Upper CCI Timer | GPIO_114_CCI_ASYNC_IN | | 1:J7 | 19 | Lower CSI_DATA1_P | CSI2_LANE1_CON_P | | 1:J7 | 20 | Upper MCLK | CAM_MCLK3_CON | | 1:J7 | 21 | Lower CSI_DATA1_M | CSI2_LANE1_CON_N | | 1:J7 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 1:J7 | 23 | Lower CSI_DATA2_P | CSI2_LANE2_CON_P | | 1:J7 | 24 | GND | DGND | | 1:J7 | 25 | Lower CSI_DATA2_M | CSI2_LANE2_CON_N | | 1:J7 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 1:J7 | 27 | GND | DGND | | 1:J7 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 1:J7 | 29 | Lower CSI_DATA3_P | CSI2_LANE3_CON_P | | 1:J7 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 1:J7 | 31 | Lower CSI_DATA3_M | CSI2_LANE3_CON_N | | 1:J7 | 32 | Spare MCLK/GPIO | MCLK6_G1_CON | | 1:J7 | 33 | GND | DGND | | 1:J7 | 34 | Group SPI MISO | GPIO_4_CAM1_SPI1_MISO | | 1:J7 | 35 | Upper CSI_CLK_P | CSI3_CLK_CON_P | | 1:J7 | 36 | Group SPI MOSI | GPIO_5_CAM1_SPI1_MOSI | | 1:J7 | 37 | Upper CSI_CLK_M | CSI3_CLK_CON_N | | 1:J7 | 38 | Group SPI SCLK | GPIO_6_CAM1_SPI1_CLK | | 1:J7 | 39 | Upper CSI_DATA0_P | CSI3_LANE0_CON_P | | 1:J7 | 40 | Group SPI CS_N | GPIO_7_CAM1_SPI1_CS | | 1:J7 | 41 | Upper CSI_DATA0_M | CSI3_LANE0_CON_N | | 1:J7 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 1:J7 | 43 | GND | DGND | | 1:J7 | 44 | GND | DGND | | 1:J7 | 45 | Upper CSI_DATA1_P | CSI3_LANE1_CON_P | | 1:J7 | 46 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 47 | Upper CSI_DATA1_M | CSI3_LANE1_CON_N | | 1:J7 | 48 | VPH_PWR 3.8V | VPH_PWR | | 1:J7 | 49 | Upper CSI_DATA2_P | CSI3_LANE2_CON_P | | 1:J7 | 50 | GND | DGND | | 1:J7 | 51 | Upper CSI_DATA2_M | CSI3_LANE2_CON_N | | 1:J7 | 52 | 3.3V | VREG_3P3V_LOCAL | | 1:J7 | 53 | GND | DGND | | 1:J7 | 54 | GND | DGND | | 1:J7 | 55 | Upper CSI_DATA3_P | CSI3_LANE3_CON_P | | 1:J7 | 56 | 5V | VDC_5V_LOCAL | | 1:J7 | 57 | Upper CSI_DATA3_M | CSI3_LANE3_CON_N | | 1:J7 | 58 | 5V | VDC_5V_LOCAL | | 1:J7 | 59 | GND | DGND | | 1:J7 | 60 | GND | DGND | | 2:J8 | 1 | GND | DGND | | 2:J8 | 2 | GND | DGND | | 2:J8 | 3 | Lower CCI_I2C_SDA | CCI_I2C1_SDA | | 2:J8 | 4 | DVDD 1.2V | PM8009_VREG_L2_DVDD_1P2 | | 2:J8 | 5 | Lower CCI_I2C_SCL | CCI_I2C1_SCL | | 2:J8 | 6 | DOVDD 1.8V | PM8009_VREG_L7_DOVDD_1P8 | | 2:J8 | 7 | GND | DGND | | 2:J8 | 8 | DVDD 1.05V | PM8009_VREG_L1_DVDD_1P05 | | 2:J8 | 9 | Lower CSI_CLK_P | CSI4_CLK_CON_P | | 2:J8 | 10 | Lower RST_N | GPIO_78_CAM2_RST_N | | 2:J8 | 11 | Lower CSI_CLK_M | CSI4_CLK_CON_M | | 2:J8 | 12 | Lower MCLK | CAM_MCLK4_CON | | 2:J8 | 13 | Lower CSI_DAT0_P | CSI4_LANE0_CON_P | | 2:J8 | 14 | GND | DGND | | 2:J8 | 15 | Lower CSI_DAT0_M | CSI4_LANE0_CON_N | | 2:J8 | 16 | Lower CCI Timer | GPIO_112_CCI_TIMER3 | | 2:J8 | 17 | GND | DGND | | 2:J8 | 18 | Upper CCI Timer | GPIO_111_CCI_TIMER2 | | 2:J8 | 19 | Lower CSI_DATA1_P | CSI4_LANE1_CON_P | | 2:J8 | 20 | Upper MCLK | CAM_MCLK5_CON | | 2:J8 | 21 | Lower CSI_DATA1_M | CSI4_LANE1_CON_N | | 2:J8 | 22 | AVDD 2.8V | PM8009_VREG_L6_AVDD_2P8 | | 2:J8 | 23 | Lower CSI_DATA2_P | CSI4_LANE2_CON_P | | 2:J8 | 24 | GND | DGND | | 2:J8 | 25 | Lower CSI_DATA2_M | CSI4_LANE2_CON_N | | 2:J8 | 26 | Upper RST_N, Shared | GPIO_109_CAM3_RST_N | | 2:J8 | 27 | GND | DGND | | 2:J8 | 28 | Upper CCI_I2C_SDA | CCI_I2C3_SDA | | 2:J8 | 29 | Lower CSI_DATA3_P | CSI4_LANE3_CON_P | | 2:J8 | 30 | Upper CCI_I2C_SCL | CCI_I2C3_SCL | | 2:J8 | 31 | Lower CSI_DATA3_M | CSI4_LANE3_CON_N | | 2:J8 | 32 | Spare MCLK/GPIO | MCLK6_G2_CON | | 2:J8 | 33 | GND | DGND | | 2:J8 | 34 | Group SPI MISO | GPIO_12_CAM1_SPI5_MISO | | 2:J8 | 35 | Upper CSI_CLK_P | CSI5_CLK_CON_P | | 2:J8 | 36 | Group SPI MOSI | GPIO_13_CAM1_SPI5_MOSI | | 2:J8 | 37 | Upper CSI_CLK_M | CSI5_CLK_CON_N | | 2:J8 | 38 | Group SPI SCLK | GPIO_14_CAM1_SPI5_CLK | | 2:J8 | 39 | Upper CSI_DATA0_P | CSI5_LANE0_CON_P | | 2:J8 | 40 | Group SPI CS_N | GPIO_15_CAM1_SPI5_CS | | 2:J8 | 41 | Upper CSI_DATA0_M | CSI5_LANE0_CON_N | | 2:J8 | 42 | VREG_S4A_1P8 | VREG_S4A_1P8 | | 2:J8 | 43 | GND | DGND | | 2:J8 | 44 | GND | DGND | | 2:J8 | 45 | Upper CSI_DATA1_P | CSI5_LANE1_CON_P | | 2:J8 | 46 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 47 | Upper CSI_DATA1_M | CSI5_LANE1_CON_N | | 2:J8 | 48 | VPH_PWR 3.8V | VPH_PWR | | 2:J8 | 49 | Upper CSI_DATA2_P | CSI5_LANE2_CON_P | | 2:J8 | 50 | GND | DGND | | 2:J8 | 51 | Upper CSI_DATA2_M | CSI5_LANE2_CON_N | | 2:J8 | 52 | 3.3V | VREG_3P3V_LOCAL | | 2:J8 | 53 | GND | DGND | | 2:J8 | 54 | GND | DGND | | 2:J8 | 55 | Upper CSI_DATA3_P | CSI5_LANE3_CON_P | | 2:J8 | 56 | 5V | VDC_5V_LOCAL | | 2:J8 | 57 | Upper CSI_DATA3_M | CSI5_LANE3_CON_N | | 2:J8 | 58 | 5V | VDC_5V_LOCAL | | 2:J8 | 59 | GND | DGND | | 2:J8 | 60 | GND | DGND | ### Pin Out Mating-side, J2 (TBD CSI Port) | Pin | Net | Upper CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | DGND | | | 2 | DGND | | | 3 | AFVDD | Normally Unused, 2.8V | | 4 | CAM_RST_STBY_N | Normally Unused, power down signal | | 5 | CCI_I2C_SDA0 | CCI I2C Bus, SDA | | 6 | 1P8_VDDIO | 1.8V VDDIO (LDO) | | 7 | CCI_I2C_SCL0 | CCI I2C Bus, SCL | | 8 | VREG_DVDD | 1.05V (default) or 1.2V DVDD LDO | | 9 | CAM_RST0_N | Sensor Reset Control, 0 | | 10 | CAM_MCLKx_BUFF | MCLK, Buffered from Voxl2, 1.8V | | 11 | DGND | | | 12 | DGND | | | 13 | MIPI_CSI_CLK_CONN_P | MIPI CSI High Speed Diff Pair, CLK_P | | 14 | CAM_FLASH | Sensor Sideband Control, Normally Unused | | 15 | MIPI_CSI_CLK_CONN_M | MIPI CSI High Speed Diff Pair, CLK_M | | 16 | CAM_SYNC_0 | Sensor Sync Signal, Shorted to SYNC_1 | | 17 | MIPI_CSI_LANE0_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 0_P | | 18 | CAM_MCLK1 | Second MCLK, Buffered from Voxl, 1.8V. | | 19 | MIPI_CSI_LANE0_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 0_M | | 20 | CAM_AVDD_2P8 | Sensor 2.8V AVDD LDO | | 21 | DGND | | | 22 | DGND | | | 23 | MIPI_CSI_LANE1_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 1_P | | 24 | CAM_RST1_N | Sensor Reset Control, 1 | | 25 | MIPI_CSI_LANE1_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 1_M | | 26 | CAM_SYNC_1 | Sensor Sync Signal, Shorted to SYNC_0 | | 27 | MIPI_CSI_LANE2_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 2_P | | 28 | CCI_I2C_SDA1 | Second CCI I2C Bus, SDA | | 29 | MIPI_CSI_LANE2_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 2_M | | 30 | CCI_I2C_SCL1 | Second CCI I2C Bus, SCL | | 31 | DGND | | | 32 | DGND | | | 33 | MIPI_CSI_LANE3_CONN_P | MIPI CSI High Speed Diff Pair, Data Lane 3_P | | 34 | VPH_PWR_3P8V | 3.8V Primary "Phone" Power (mimics nominal 1S) | | 35 | MIPI_CSI_LANE3_CONN_M | MIPI CSI High Speed Diff Pair, Data Lane 3_M | | 36 | DGND | | ### Pin Out Mating-side, J3 (TBD CSI Port) | Pin | Net | TBD CCI Notes/Usage | |-----|-----------------------|------------------------------------------------| | 1 | | | ## Technical Drawings ### 3D STEP File [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0135_simple.STEP) ### 2D Diagrams --- Source: https://docs.modalai.com/M0153/ # M0153 MIPI Boson Image Sensor Adapter ## M0153 vs M0201 ℹ️ M0201 and M0153 are electrically identical. M0201 is a mechanical change for a slightly better mounting fit to the rear of the Boson+ ![M0153](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0153_front.jpg) ![M0201](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0201_front.jpg) ## Boson+ USB Setup Requirement The Boson+ must first be configured over USB using the `FLIR Boson+ Application v4.2`. > We have not had success with newer versions of the FLIR Boson+ application — e.g. 4.6 did not work. You need to purchase the Boson+ and USB backback seperately. ## VOXL SDK Requirements VOXL SDK 1.4.3+ is required. Only 30 FPS is supported (not 60FPS) in this release. ## Hardware Requirements Where to buy : [https://www.modalai.com/products/m0201](https://www.modalai.com/products/m0201) ### VOXL2 Connection Options (Boson as the only camera per VOXL2 camera port) - use either M0162 or M0181 camera adapter, in both cases, use VOXL2 Kernel variant 0 - `[Boson] + [M0201] + [coax cable] + [M0162] -> [VOXL2 J6/7/8]` ![MDK-M0153-1-055](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-1-055.jpg) (showing Boson connected to VOXL2 J7 using M0153 + M0162) ![MDK-M0153-1-055-J7-Boson](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-1-055-J7-Boson.jpg) - `[Boson] + [M0201] + [coax cable] + [M0181 J1] -> [VOXL2 J6/7/8]` > If M0181 is used, Boson MUST be connected to M0181 J1 (not J2), as shown below ![Boson M0181 J1](/docs/70-accessories/12-image-sensor-flexes-adapters/images/boson_m0181_j1.jpg) - Mounting hole in the tab of M0181 will line up with VOXL2 mounting hole only if VOXL2 J8 camera port is used. Note that two coax cables are shown connected to M0181, disregard the second cable for this example, plugged into M0181 J2) ![Boson M0181 J8](/docs/70-accessories/12-image-sensor-flexes-adapters/images/voxl2_m0181_j8.jpg) - If connecting second camera to M0181 (J2), only VOXL2 J7 is currently compatible (kernel variant 0). Please note that the mounting holes of M0181 will not line up with mounting holes of VOXL2 in this case. ![Boson M0181 J7](/docs/70-accessories/12-image-sensor-flexes-adapters/images/voxl2_m0181_j7.jpg) ### VOXL2 Mini Connection Options - `[Boson] + [M0201] + [coax cable] + [M0162] -> [VOXL2 Mini J6/7]` - `[Boson] + [M0201] + [coax cable] + [M0194 J1L] -> [VOXL2 Mini J6/7]` ![Boson M0201 M0194](/docs/70-accessories/12-image-sensor-flexes-adapters/images/m0201_m0194.jpg) - `[Boson] + [M0201] + [coax cable] + [M0181 J1] -> [VOXL2 Mini J6/7]` - if M0181 is plugged into VOXL2 Mini J6, mounting hole in M0181 does not line up with mounting hole of VOXL2 Mini - If M0181 is plugged into VOXL2 Mini J7, tab can be removed from M0181 and the mounting holes of M0181 and VOXL2 Mini will line up ![Boson M0181 VOXL2 Mini J7](/docs/70-accessories/12-image-sensor-flexes-adapters/images/hadron_m0181_voxl2_mini_j7.jpg) ## Hardware Connection - Boson sensor supported on VOXL2 J8 using camera configs [C37](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/misc_files/usr/share/modalai/voxl-camera-server/standard_configs/platform_config_1/37%20-%20M0173%20Stalker%20V5+%20IMX412%20+%20dual%20AR0144%20+%20Boson?ref_type=heads#L89) or [C47](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/misc_files/usr/share/modalai/voxl-camera-server/standard_configs/platform_config_1/47%20-%20M0173%20Stalker%20V5+%20IMX664%20+%20dual%20AR0144%20+%20Boson?ref_type=heads#L78) - Boson sensor supported on VOXL2 Mini J7 using camera configs [C51](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/misc_files/usr/share/modalai/voxl-camera-server/standard_configs/platform_config_2/51%20-%20MVX-T0001%20voxl2%20mini%20hires%20imx664%20+%20boson?ref_type=heads#L11) or [C52](https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/misc_files/usr/share/modalai/voxl-camera-server/standard_configs/platform_config_2/52%20-%20MVX-T0001%20voxl2%20mini%20dual%20hires%20imx664%20+%20boson?ref_type=heads#L14) ## Boson Software Setup This procedure is done independent of VOXL2 and uses `MDK-M0201-2`. Original Boson USB adapter can also be used. ![MDK-M0153-1-055](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-2.jpg) #### Connect - Setup a Windows OS with `FLIR Boson+ Application v4.2` (see https://oem.flir.com/products/boson/) - Connect Boson+ using MDK-M0201-2 USB backpack to Windows PC using a USB connection - Select the Boson sensor from the "Port" drop down list (bottom right of GUI) - when selected, the "Boson Link" should show "Connected" #### Reset to Factory - Click on the "System" option in the left side navigation bar - Click on the "Configuration Controls" option - Click the "Restore Factory Defaults" button #### Confgure MIPI - Click on the "Image Apperance" option in the left side navigation bar - Click on "USB Video Controls" - Ensure "USB Video Enabled" is DISABLED - Click on "Analog/CMOS Video Controls" - Set "Video Source" to "Post-AGC" - Disable telemetry (both "CMOS Enabled" and "MIPI Embedded") - Set "Video" to "MIPI" #### Confgure 30 FPS - Click on the "System" option in the left side navigation bar - Click on the "Sync & Frame Rate" option - Set "Frame Skip" to 1, to enable 30 FPS #### Save Power On Defaults - Click on the "System" option in the left side navigation bar - Click on the "Configuration Controls" option - Click the "Save Power-On Defaults" button - Power off - Remove `MDK-M0201-2` USB backpack from BOSON. ## VOXL2 Hardware Setup The `MDK-M0153-1-055`, MIPI Boson+ Add On Development Kit comes with the following. - MCCA-M0153-1 - MIPI Coax to Boson W I2C GIMBAL PASS-THROUGH - Connects to Boson+ - MCCA-M0162-1 - VOXL2 To BOSON COAX ADAPTER (Code: V2(L)-H26-5L) - Connects to VOXL2/VOXL2 Mini J7 - MCBL-00084-055 - High-Speed Camera Coax Cable, 26-pin, 55mm - Connects between M0153/M0162 ![MDK-M0153-1-055](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-1-055.jpg) ![MDK-M0153-1-055-J7](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-1-055-J7.jpg) ![MDK-M0153-1-055-J7-Boson](/docs/70-accessories/12-image-sensor-flexes-adapters/images/MDK-M0153-1-055-J7-Boson.jpg) ## VOXL2 Software Setup VOXL2 J8 support via: ```bash voxl-configure-cameras 36 voxl-configure-cameras 37 ``` VOXL2 Mini J7 support via: ```bash voxl-configure-cameras 51 voxl-configure-cameras 52 ``` ## 3D Model [M0201 STEP File](https://storage.googleapis.com/modalai_public/modal_drawings/M0201_040225.stp) ## Misc Connector Pinout ### J3 - Function: USB2 - Connector Type: JST_BM06B-SRSS-TB | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :------: | :------: | :-----: | :-----: | :-----: | :-----: | :-----: | | Function > | 5.0V (in/out) | GND | EXT_SYN | GND | Boson USB_D_P | Boson USB_D_M | - EXT_SYN is connected to VOXL2 Cam Sync (GPIO 109), but not connected to Boson by default ### J4 - Function: I2C - Connector type: JST_BM06B-GHS-TBT | Pin > | 1 | 2 | 3 | 4 | 5 | 6 | | :------: | :------: | :-----: | :-----: | :-----: | :-----: | :-----: | | Function > | 3.3V (out) | IO_1 | IO_2 | VOXL2 I2C_SDA | VOXL2 I2C_SCL | GND | - IO_1 and IO_2 are not connected by default (DNI resistors on M0153 / M0201) - IO and I2C pins are 3.3V logic level (level shifters on M0153 / M0201) - I2C_SDA and I2C_SCL connect to pins 24, 26 on the 26-pin Coax MIPI Connector, and pins 34, 36 on VOXL2 / VOXL2 Mini (J6, J7, J8) - VOXL2: Only J7 has I2C mapped (`/dev/i2c-4`), see: - [VOXL2 i2c-4](/voxl2-linux-user-guide/#i2c-4---i2c1---camera-group-1-i2c) - [VOXL2 Connectors: J7](/voxl2-connectors/#j7---camera-group-1-specific-pinout) - VOXL2 Mini: Only J7 has I2C mapped (`/dev/i2c-0`) - [VOXL2 Mini Connectors: J7](/voxl2-mini-connectors/#j7---camera-group-1-specific-pinout) --- Source: https://docs.modalai.com/M0155/ # M0155 VOXL 2 Single Image Sensor Micro-coax Adapter --- ## Overview The M0155 connects one DF-56 micro-coax image sensor module to a VOXL 2 or VOXL 2 Mini camera group. Micro-coax lets the sensor sit anywhere on the airframe, at any orientation, with only a thin coax run back to the compute board, instead of the short flex cables that earlier modules used. ![M0155_diagram.jpg](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0155_diagram.jpg) | Item | Detail | |---|---| | Function | DF-56 micro-coax adapter for a single tracking or hi-res sensor | | Supported sensors | [M0161](/M0161/) IMX412 hi-res, [M0166](/M0166/) AR0144 tracking, [M0186](/M0186/) IMX664 low-light FPV | | Interconnect | MCBL-00084 micro-coax cable, several lengths, see [Cable Datasheets](/cable-datasheets/) | | Kit | MDK-M0155-1-00, containing one MCCA-M0155-1 adapter | | Country of origin | USA | ## Connectors ### VOXL 2 side, J1 J1 is a Hirose DF40C-60DS-0.4V(51) 60-pin board-to-board connector. It mates with VOXL 2 or VOXL 2 Mini camera group connectors J6, J7, or J8. Only the lower camera slot of the group is wired: its 4-lane MIPI CSI, CCI I2C, reset, and MCLK route to J2. The upper slot's signals, the SPI, and the 1.05 V, 1.8 V (VREG_S4A), 3.3 V, and 5 V rails are not connected. RESET_UPPER_SHARED/N (pin 26) is routed to J2 as SYNC. | Pin # | Signal | M0155 Net | Pin # | Signal | M0155 Net | |---|---|---|---|---|---| | 1 | GND | | 2 | GND | | | 3 | CCI_I2C_LOWER_SDA | I2C_SDA_0 | 4 | DVDD_1.2V | DVDD | | 5 | CCI_I2C_LOWER_SCL | I2C_SCL_0 | 6 | DOVDD_1.8V | VDDIO | | 7 | GND | | 8 | DVDD_1.05V | Not connected | | 9 | MIPI_CSI_CLK_LOWER_P | CLK_P | 10 | RESET_LOWER/N | RESET_0 | | 11 | MIPI_CSI_CLK_LOWER_M | CLK_M | 12 | MCLK_LOWER | MCLK_0 | | 13 | MIPI_CSI_L0_LOWER_P | LANE0_P | 14 | GND | | | 15 | MIPI_CSI_L0_LOWER_M | LANE0_M | 16 | CCI_TIMER_LOWER | Not connected | | 17 | GND | | 18 | CCI_TIMER_UPPER | Not connected | | 19 | MIPI_CSI_L1_LOWER_P | LANE1_P | 20 | MCLK_UPPER | Not connected | | 21 | MIPI_CSI_L1_LOWER_M | LANE1_M | 22 | AVDD_2.8V | AVDD | | 23 | MIPI_CSI_L2_LOWER_P | LANE2_P | 24 | GND | | | 25 | MIPI_CSI_L2_LOWER_M | LANE2_M | 26 | RESET_UPPER_SHARED/N | SYNC | | 27 | GND | | 28 | CCI_I2C_UPPER_SDA | Not connected | | 29 | MIPI_CSI_L3_LOWER_P | LANE3_P | 30 | CCI_I2C_UPPER_SCL | Not connected | | 31 | MIPI_CSI_L3_LOWER_M | LANE3_M | 32 | GPIO_MCLK6_SHARED | Not connected | | 33 | GND | | 34 | GPIO_SPI_MISO | Not connected | | 35 | MIPI_CSI_CLK_UPPER_P | Not connected | 36 | GPIO_SPI_MOSI | Not connected | | 37 | MIPI_CSI_CLK_UPPER_M | Not connected | 38 | GPIO_SPI_SCL | Not connected | | 39 | MIPI_CSI_L0_UPPER_P | Not connected | 40 | GPIO_SPI_CS/N | Not connected | | 41 | MIPI_CSI_L0_UPPER_M | Not connected | 42 | VREG_S4A_1.8V | Not connected | | 43 | GND | | 44 | GND | | | 45 | MIPI_CSI_L1_UPPER_P | Not connected | 46 | VPH_PWR | VPH_PWR | | 47 | MIPI_CSI_L1_UPPER_M | Not connected | 48 | VPH_PWR | VPH_PWR, tied to pin 46 | | 49 | MIPI_CSI_L2_UPPER_P | Not connected | 50 | GND | | | 51 | MIPI_CSI_L2_UPPER_M | Not connected | 52 | VREG_3.3V_LOCAL | Not connected | | 53 | GND | | 54 | GND | | | 55 | MIPI_CSI_L3_UPPER_P | Not connected | 56 | VDC_5V_LOCAL | Not connected | | 57 | MIPI_CSI_L3_UPPER_M | Not connected | 58 | VDC_5V_LOCAL | Not connected | | 59 | GND | | 60 | GND | | ### Sensor side, J2 J2 is a Hirose DF56C-26S-0.3V(51) 26-pin micro-coax receptacle. It mates with any ModalAI micro-coax sensor module through an MCBL-00084 cable: M0161, M0166, M0186, and similar. | Pin # | Net | Notes | |---|---|---| | 1 | I2C_SDA_0 | J1 pin 3 | | 2 | DVDD | 1.2 V, J1 pin 4 | | 3 | I2C_SCL_0 | J1 pin 5 | | 4 | DVDD | 1.2 V, J1 pin 4 | | 5 | GND | | | 6 | GND | | | 7 | CLK_P | J1 pin 9 | | 8 | DVDD | 1.2 V, J1 pin 4 | | 9 | CLK_M | J1 pin 11 | | 10 | VDDIO | 1.8 V, J1 pin 6 | | 11 | LANE0_P | J1 pin 13 | | 12 | RESET_0 | J1 pin 10 | | 13 | LANE0_M | J1 pin 15 | | 14 | LANE1_P | J1 pin 19 | | 15 | MCLK_0 | J1 pin 12 | | 16 | LANE1_M | J1 pin 21 | | 17 | GND | | | 18 | GND | | | 19 | AVDD | 2.8 V, J1 pin 22 | | 20 | LANE2_P | J1 pin 23 | | 21 | SYNC | J1 pin 26 | | 22 | LANE2_M | J1 pin 25 | | 23 | GND | | | 24 | LANE3_P | J1 pin 29 | | 25 | VPH_PWR | J1 pins 46, 48 | | 26 | LANE3_M | J1 pin 31 | | S1-S5 | GND | Shield | ## Software The sensors connected through the M0155 are supported by voxl-camera-server and publish over the Modal Pipe Architecture like any other camera. Select the sensor with `voxl-configure-cameras`, see [Configure Cameras](/configure-cameras/). The [Micro-Coaxial User Guide](/micro-coax-user-guide/) covers cable routing and handling. ## Technical Drawings ### 3D STEP File [M0155.step](https://storage.googleapis.com/modalai_public/modal_drawings/M0155.step) --- Source: https://docs.modalai.com/M0170/ # M0170 40-pin Molex Straight Flex Cable, 70mm ## Overview The M0170 is a 70 mm straight extension flex for the ModalAI 40-pin Molex SSB RP connector format introduced with the [M0178](/M0178/) Time of Flight (ToF) module. It connects the 40-pin ToF connector on an [M0173](/M0173/) Starling 2 front end or an [M0172](/M0172/) ToF + hi-res adapter to the M0178, and is the drop-in replacement for the shorter [M0177](/M0177/) Starling 2 ToF flex when that cable cannot reach. Unlike the M0177, which routes only the ToF signals, the M0170 passes all 40 signal positions and both power nail pairs one to one. It therefore also carries the four-lane CSI group, the upper camera group's I2C and MCLK, the SPI and timer sideband signals, and the additional sensor supply rails defined for the 40-pin format, so it works as a general extension for any future 40-pin sensor adapter. The sensor-side receptacle carries local bypass capacitors on each supply rail so the extra cable length does not degrade the power delivered to the module. Connection chain: ``` VOXL 2 <-> M0173 (J3) or M0172 (J1L) <-> M0170 <-> M0178 <-> IRS2975C ToF sensor ``` > Use the M0170 in place of the M0177, not in addition to it. Chaining flexes adds connector mating cycles, risks misalignment, and pushes the MIPI link past what ModalAI has validated. See [extending image sensor cable lengths](/image-sensor-flexes-adapters/#extending-mipi-image-sensor-cable-lengths). ## Specification | Specification | Value | |--------------------------|---------------------------------------------------------------------------------------------| | Part Number | MSU-M0170-1 | | Function | 40-pin to 40-pin straight extension flex (pin 1 to pin 1), all positions routed | | Connector Family | Molex Slimstack SSB RP, 40 signal positions plus 4 power nails, 0.35 mm pitch | | VOXL 2 Side, P1 | Molex 5052744012 plug. Mates with the 40-pin receptacle on M0173 (J3) or M0172 (J1L) | | Sensor Side, J1 | Molex 5052704012 receptacle, 0.8 mm mate height. Accepts the M0178 or M0171 P1 plug | | Length | 70 mm | | Power Rating | 3 A on the power nail pair (Molex SSB RP power contacts) | | Bypass Capacitors (J1) | 2 x 10 uF on 5 V; 2.2 uF on 3.3 V; 2.2 uF on VPH_PWR; 1 uF each on AVDD_2P8, DOVDD_1P8, DVDD_1P1, DVDD_1P2 | | PCB | Polyimide flex, 3 layers, 100 ohm differential impedance control on the CSI pairs | | Schematic Revision | SCH-M0170 Rev B, March 2024. Rev C (May 2025) is the same design migrated to Altium with no electrical changes | ## Pinout The flex is straight through: pin N on P1 connects to pin N on J1. The net names below follow the 40-pin connector definition used on the host adapters; only the subset listed on the [M0178 datasheet](/M0178/#pin-out-at-p1) is used by that module, and the remaining positions are reserved for other 40-pin sensor adapters. | Pin # | Signal | Notes | Pin # | Signal | Notes | |-------|-------------------|----------------------------------------------------------|-------|----------------------|------------------------------------------------------| | 41 | GND (NAIL_1) | Power nail, ground | 42 | GND (NAIL_1) | Power nail, ground | | 1 | AVDD_2P8 | 2.8 V analog sensor supply, 1 uF bypass at J1 | 2 | VPH_PWR | 3.8 V primary power, 2.2 uF bypass at J1 | | 3 | DOVDD_1P8 | 1.8 V I/O supply, 1 uF bypass at J1 | 4 | VREG_3P3V_LOCAL | 3.3 V, 2.2 uF bypass at J1 | | 5 | DVDD_1P1 | 1.1 V digital core supply, 1 uF bypass at J1 | 6 | GPIO_TIMER_ASYNC_OPT | Optional timer / async GPIO | | 7 | DVDD_1P2 | 1.2 V digital core supply, 1 uF bypass at J1 | 8 | GND | | | 9 | GND | | 10 | QUP_SPI_MISO | Optional SPI | | 11 | LWR_CSI_CLK_P | MIPI CSI clock, lower camera group | 12 | QUP_SPI_MOSI | Optional SPI | | 13 | LWR_CSI_CLK_N | MIPI CSI clock, lower camera group | 14 | QUP_SPI_SCLK | Optional SPI | | 15 | LWR_CSI_LANE0_P | MIPI CSI data lane 0 | 16 | QUP_SPI_CS_RST_OPT | Optional SPI chip select / reset (CCI_TIMER_RST_OPT_0 on Rev B) | | 17 | LWR_CSI_LANE0_N | MIPI CSI data lane 0 | 18 | GND | | | 19 | LWR_CSI_LANE1_P | MIPI CSI data lane 1 | 20 | LWR_RST_N | Sensor reset, lower camera group | | 21 | LWR_CSI_LANE1_N | MIPI CSI data lane 1 | 22 | CCI_TIMER_RST_OPT_1 | Optional CCI timer / reset | | 23 | GND | | 24 | LWR_CCI_I2C_SDA | CCI I2C data, lower camera group, 1.8 V | | 25 | LWR_CSI_LANE2_P | MIPI CSI data lane 2 | 26 | LWR_CCI_I2C_SCL | CCI I2C clock, lower camera group, 1.8 V | | 27 | LWR_CSI_LANE2_N | MIPI CSI data lane 2 | 28 | UPPR_CCI_I2C_SDA | CCI I2C data, upper camera group | | 29 | LWR_CSI_LANE3_P | MIPI CSI data lane 3 | 30 | UPPR_CCI_I2C_SCL | CCI I2C clock, upper camera group | | 31 | LWR_CSI_LANE3_N | MIPI CSI data lane 3 | 32 | GND | | | 33 | GND | | 34 | LWR_MCLK | Sensor master clock, lower camera group, 1.8 V | | 35 | GPIO_TIMER_RST_N | Optional timer reset GPIO | 36 | UPPR_MCLK | Sensor master clock, upper camera group | | 37 | VREG_3P3V_LOCAL | 3.3 V | 38 | VREG_S4A_1P8 | 1.8 V VDDIO (VREG_S4A) | | 39 | VPH_PWR | 3.8 V primary power | 40 | SHARED_RST_SYNC | Shared reset / sync | | 43 | 5VDC (NAIL_2) | Power nail, 5 V, 2 x 10 uF bypass at J1 | 44 | 5VDC (NAIL_2) | Power nail, 5 V | > The power nails are numbered 41 through 44 and sit at both ends of the connector, with 41 and 42 nearest pin 1. When mating, confirm pin 1 lines up with pin 1 on both ends. The [M0178 datasheet](/M0178/#pin-out-at-p1) has a labeled connector drawing. ### Schematic ![M0170 schematic: P1 VOXL 2 side plug, J1 sensor side receptacle with bypass capacitors](/images/other-products/flex-cables/m0170-schematic.png) ## Compatibility | Item | Value | |----------------------------|------------------------------------------------------------------------------------------| | VOXL 2 adapters | [M0173](/M0173/) J3 (Starling 2 front end), [M0172](/M0172/) J1L (ToF + hi-res adapter) | | ToF modules | [M0178](/M0178/) (Starling 2 ToF adapter with mounting tab), M0171 (same without the tab) | | Sensor type in voxl-camera-server | `pmd-tof-liow2` | | Shorter alternative | [M0177](/M0177/), the Starling 2 ToF flex shipped in the kit | ## Technical Drawings ### 3D STEP File [M0170 Rev B STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0170_REV-B_032124.stp) --- Source: https://docs.modalai.com/M0172/ # M0172 DF40 TOF and DF56 Coax Hires Adapter ## Specification ![M0172_top.jpg](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0172_top.jpg) ![M0172_bottom.jpg](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0172_bottom.jpg) This adapter provides a DF40 connector for the TOF sensor (lower camera group) and DF56 Coax connector for coax tracking or hires cameras ### TOF Sensor Connection Example VOXL 2 <-> M0172 <-> M0177 <-> M0178 <-> IRS2975 TOF sensor > ToF is supported on VOXL 2 only. The M0172 mates to VOXL 2 Mini for the coax hires or tracking camera on J2U, but the ToF path through J1L is not supported on VOXL 2 Mini. ### Pin Out VOXL2-side Mates to VOXL2 and VOXL2 mini J6, J7, J8 ### Pin Out Mating-side J1L : TOF connector (mates with M0177) . Lower camera group. - M0172 <-> M0177 <-> M0178 <-> IRS2975 TOF sensor J2U : Hires / tracking camera connector (coax versions). Higher camera group - M0161, M0166, M0186 and similar ## Technical Drawings ### 3D STEP File [M0172.step](https://storage.googleapis.com/modalai_public/modal_drawings/M0172_REVA_3D_2025-11-03.step) --- Source: https://docs.modalai.com/M0173/ # M0173 VOXL 2 Starling 2 Front End M0173 Serves as a breakout for Camera Groups J6 and J7 on VOXL 2. It exposes 4 COAX camera connectors for use with M0166 Tracking Cameras or M0161 IMX412 Hires cameras. It also exposes a connector for use with a single PMD TOF sensor, and a connector for attaching an M0157 Lepton plus rangefinder board. [VOXL 2 Coax Camera Bundle](/voxl2-coax-camera-bundles/) > [M0226](/M0226/) is the updated version of this board, adding an onboard barometer, a switchable Lepton clock, and PWM outputs. --- --- ## Overview ### VOXL SDK Requirements VOXL SDK 1.3.0+ is required. ### Hardware Requirements Only compatible with [VOXL 2](/voxl-2/) ## New Kernel Configuration for M0173 The `D0014/D0012` drone family uses the new kernel `config 1` (as opposed to `config 0`). See `/sys/module/voxl_platform_mod/parameters/config` to verify proper kernel config. ## Features ### VOXL2 Driven Image Sensor Synchronization In the D0014/D0012 architecture using the M0173 breakout, the following occurs for the tracking sensors: - The [voxl-fysnc-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fysnc-mod) ships in SDK 1.3+ and defaults to use GPIO 109, 30Hz, and disabled. - When a C26/C27/C8 image sensor configurations is setup using `voxl-configure-cameras`, the config file at `/etc/modalai/voxl-camera-server.conf` is setup with: ``` ... "fsync_en": true, "fsync_gpio": 109, ... ``` - When camera server runs, it will use the `voxl-fsync-mod` params exposed to the file system at `/sys/module/voxl_fsync_mod/parameters`, for example `enabled`, `gpio_num`, and enable the sync pulse at the default 30Hz. - When a C26/C27/C8 image sensor configurations is setup using `voxl-configure-cameras`, the `AR0144` drivers are copied into `/usr/lib/camera` that are setup for slave mode and will capture sychronized frames at the rate defined (note: the FPS should also be configured in `/etc/modalai/voxl-camera-server.conf` accordinly to ensure proper register settings are loaded) [![D0014-M0173.jpg](/images/d0014/D0014-M0173.jpg)](/images/d0014/D0014-M0173.jpg) ### Downward Range Finder and FLIR Lepton In the D0014/D0012 architecture using the M0173 breakout: - VL53L1CX Range Finder is accesible over `/dev/i2c-4`, see `/etc/modalai/voxl-rangefinder-server.conf` and `voxl-rangefinder` - FLIR Lepton is accessible over `/dev/i2c-4` and `/dev/spidev0.0`. Supported in VOXL SDK 1.3.1 and newer, see `/etc/modalai/voxl-lepton-server.conf` and [voxl-lepton-server](/voxl-lepton-server/) [![D0014-M0157.jpg](/images/d0014/D0014-M0157.jpg)](/images/d0014/D0014-M0157.jpg) ## Connectors ### J1 - Front Tracking : ID0 (CSI0) | Pin | Name | --- | ---- | 1 | CCI_I2C0_SDA | 3 | CCI_I2C0_SCL | 5 | DGND | 6 | DGND | 7 | CSIO_CLK_CON_P | 9 | CSIO_CLK_CON_N | 10 | PM8009_VREG_L7_DOVDD_1P8 | 11 | CSIO_LANE0_CON_P | 12 | GPIO_93_CAMO_RST_N | 13 | CSI0_LANE0_CON_N | 14 | CSIO_LANE1_CON_P | 15 | MCLK0_ID0 | 16 | CSI0_LANE1_CON_N | 17 | DGND | 18 | DGND | 19 | PM8009_VREG_L5_AVDD_2P8 | 21 | TRACKR_TRIGGER_ID0 | 23 | DGND | 25 | VPH_PWR | 2,4,8 | PM8009_VREG_L2_DVDD_1P2 ### J2 - Downward Tracking : ID6 (CSI0/Combo) | Pin | Name | --- | ---- | 1 | CCI_I2C1_SDA | 3 | CCI_I2C1_SCL | 5 | DGND | 6 | DGND | 7 | CSIO_LANE3_CON_P | 9 | CSIO_LANE3_CON_N | 10 | PM8009_VREG_L7_DOVDD_1P8 | 11 | CSIO_LANE2_CON_P | 12 | GPIO_110_CCI_TIMER1 | 13 | CSIO_LANE2_CON_N | 15 | MCLK0_ID6 | 17 | DGND | 18 | DGND | 19 | PM8009_VREG_L5_AVDD_2P8 | 21 | TRACKR_TRIGGER_ID6 | 23 | DGND | 25 | VPH_PWR | 2,4,8 | PM8009_VREG_L2_DVDD_1P2 ### J3 - Front T0F: ID3 (CSI3) | Pin | Name | | --- | ---------------------------- | | 1 | PM8009_VREG_L6_AVDD_2P8 | 2 | VPH_PWR | 3 | PM8009_VREG_L7_DOVDD_1P8 | 4 | VREG_3P3V_LOCAL | 5 | PM8009_VREG_L1_DVDD_1P05 | 6 | GPIO_92_CAMI_RST_N | 7 | PM8009_VREG_L2_DVDD_1P2 | 8 | DGND | 9 | DGND | 10 | GPIO_4_CAM1_SPI1_MISO | 11 | CSI3_CLK_CON_P | 12 | GPIO_5_CAM1_SPI1_MOSI | 13 | CSI3_CLK_CON_N | 14 | GPIO_6_CAM1_SPI1_CLK | 15 | CSI3_LANE0_CON_P | 16 | GPIO_7_CAMI_SPI1_CS | 17 | CSI3_LANE0_CON_N | 18 | DGND | 19 | CSI3_LANE1_CON_P | 20 | GPIO_114_CCI_ASYNC_IN | 21 | CSI3_LANE1_CON_N | 22 | GPIO_100_CAM_SHARED_RST_N | 23 | DGND | 24 | CCI_I2C3_SDA | 25 | CSI3_LANE2_CON_P | 26 | CCI_I2C3_SCL | 27 | CSI3_LANE2_CON_N | 28 | CCI_I2C2_SDA | 29 | CSI3_LANE3_CON_P | 30 | CCI_I2C2_SCL | 31 | CSI3_LANE3_CON_N | 32 | DGND | 33 | DGND | 34 | GPIO_97_MCLK3 | 35 | GPIO_111_CCI_TIMER2 | 36 | GPIO_96_MCLK2 | 37 | VREG_3P3V_LOCAL | 38 | VREG_S4A_1P8 | 39 | VPH_PWR | 40 | TOF_SYNC_ID3 | 43 | VDC_5V_LOCAL | 44 | VDC_5V_LOCAL ### J4 - Front Hires : ID1 (CSI1) | Pin | Name | --- | ---- | 1 | CCI_I2C1_SDA | 3 | CCI_I2C1_SCL | 5 | DGND | 6 | DGND | 7 | CSI1_CLK_CON_P | 9 | CSI1_CLK_CON_N | 10 | PM8009_VREG_L7_DOVDD_1P8 | 11 | CSI1_LANE0_CON_P | 12 | GPI0_113_CCI_TIMER4 | 13 | CSI1_LANE0_CON_N | 14 | CSI1_LANE1_CON_P | 15 | GPIO95_MCLK1 | 16 | CSI1_LANE1_CON_N | 17 | DGND | 18 | DGND | 19 | PM8009_VREG_L5_AVDD_2P8 | 20 | CSI1_LANE2_CON_P | 21 | HIRES_SYNC_ID1 | 22 | CSI1_LANE2_CON_N | 23 | DGND | 24 | CSI1_LANE3_CON_P | 25 | VPH_POWER | 26 | CSI1_LANE3_CON_N | 2,4,8 | PM8009_VREG_L2_DVDD_1P2 ### J5 - Downward Hires : ID2 (CSI2) | Pin | Name | --- | ---- | 1 | CCI_I2C2_SDA | 3 | CCI_I2C2_SCL | 5 | DGND | 6 | DGND | 7 | CSI2_CLK_CON_P | 9 | CSI2_CLK_CON_N | 10 | PM8009_VREG_L7_DOVDD_1P8 | 11 | CSI2_LANE0_CON_P | 12 | GPI092_CAMI_RST_N | 13 | CSI2_LANE0_CON_N | 14 | CSI2_LANE1_CON_P | 15 | GPIO96_MCLK2 | 16 | CSI2_LANE_1_CON_N | 17 | DGND | 18 | DGND | 19 | PM8009_VREG_L6_AVDD_2P8 | 20 | CSI2_LANE2_CON_P | 21 | HIRES_SYNC_ID2 | 22 | CSI2_LANE2_CON_N | 23 | DGND | 24 | CSI2_LANE3_CON_P | 25 | VPH_POWER | 26 | CSI1_LANE3_CON_N | 2,4,8 | PM8009_VREG_L2_DVDD_1P2 ### J6 - SM08B-SRSS-TB | Pin | Name | --- | ---- | 1 | VREG_AVDD_2P8_FLIR | 2 | FLIR_SPI_SCK_2P8 | 3 | FLIR_SPI_CS_N_2P8 | 4 | FLIR_SPI_MISO_2P8 | 5 | FLIR_I2C_SCL_2P8V | 6 | FLIR_I2C_SDA_2P8V | 7 | CLK_25M_FLIR_2P8V | 8 | GND --- Source: https://docs.modalai.com/M0177/ # M0177 Starling 2 ToF Flex Cable ## Overview The M0177 is the short flex cable that ships in [Starling 2](/starling-2/) and in the VOXL 2 ToF developer bundles to connect the [M0178](/M0178/) PMD IRS2975C Time of Flight (ToF) module to VOXL 2. It is a straight, one-to-one flex on the ModalAI 40-pin Molex SSB RP connector format: one end plugs into the 40-pin ToF connector on an [M0173](/M0173/) Starling 2 front end or an [M0172](/M0172/) ToF + hi-res adapter, and the other end accepts the M0178 (or M0171) ToF adapter board. The cable is built for exactly one job, so only the signals the ToF module uses are routed: the lower camera group's two-lane MIPI CSI interface, its CCI I2C bus and MCLK, RESET_N, 1.8 V DOVDD, 3.3 V, and the 5 V power nails that feed the module's illuminator regulator. Every other position on the 40-pin connector is left unconnected. For a general-purpose 40-pin extension that passes all signals, see the [M0170](/M0170/). Connection chain: ``` VOXL 2 <-> M0173 (J3) or M0172 (J1L) <-> M0177 <-> M0178 <-> IRS2975C ToF sensor ``` > Do not chain an M0177 and an M0170 back to back to gain length. See the guidance on [extending image sensor cable lengths](/image-sensor-flexes-adapters/#extending-mipi-image-sensor-cable-lengths). If the M0177 is too short for your installation, use the [M0170](/M0170/) 70 mm flex in its place. ## Specification | Specification | Value | |--------------------------|----------------------------------------------------------------------------------------| | Part Number | M0177-1 | | Function | 40-pin to 40-pin ToF flex, straight (pin 1 to pin 1) | | Connector Family | Molex Slimstack SSB RP, 40 signal positions plus 4 power nails, 0.35 mm pitch | | VOXL 2 Side, P1 | Molex 5052744012 plug. Mates with the 40-pin receptacle on M0173 (J3) or M0172 (J1L) | | Sensor Side, J1 | Molex 5054134010 receptacle, 0.9 mm mate height. Accepts the M0178 or M0171 P1 plug | | Signals Routed | Lower-group CSI clock and lanes 0 and 1, CCI I2C, MCLK, RESET_N, DOVDD 1.8 V, 3.3 V, 5 V | | Length | About 43 mm connector to connector, per the 3D model | | Power Rating | 3 A on the power nail pair (Molex SSB RP power contacts) | | Passive Components | None | | Schematic Revision | SCH-M0177 Rev A, March 2024 | ## Pinout The flex is straight through: pin N on P1 connects to pin N on J1. Pins marked N.C. are not routed on this cable. The VOXL 2 side net names come from the M0173 schematic (the lower camera group); the M0178 side names are given in the [M0178 datasheet](/M0178/#pin-out-at-p1). | Pin # | Signal (VOXL 2 side) | Notes | Pin # | Signal (VOXL 2 side) | Notes | |-------|-----------------------|------------------------------------------------|-------|----------------------|---------------------------------------------| | 41 | GND (NAIL_1A) | Power nail, ground | 42 | GND (NAIL_1B) | Power nail, ground | | 1 | N.C. | | 2 | N.C. | | | 3 | DOVDD_1P8 | 1.8 V I/O supply (VREG_L7_1P8 on M0178) | 4 | VREG_3P3V_LOCAL | 3.3 V | | 5 | N.C. | | 6 | N.C. | | | 7 | N.C. | | 8 | GND | | | 9 | GND | | 10 | N.C. | | | 11 | LWR_CSI_CLK_P | MIPI CSI clock, lower camera group | 12 | N.C. | | | 13 | LWR_CSI_CLK_N | MIPI CSI clock, lower camera group | 14 | N.C. | | | 15 | LWR_CSI_LANE0_P | MIPI CSI data lane 0 | 16 | N.C. | | | 17 | LWR_CSI_LANE0_N | MIPI CSI data lane 0 | 18 | GND | | | 19 | LWR_CSI_LANE1_P | MIPI CSI data lane 1 | 20 | LWR_RST_N | Sensor reset (pulled high on M0178, unused) | | 21 | LWR_CSI_LANE1_N | MIPI CSI data lane 1 | 22 | N.C. | | | 23 | GND | | 24 | LWR_CCI_I2C_SDA | CCI I2C data, 1.8 V | | 25 | N.C. | | 26 | LWR_CCI_I2C_SCL | CCI I2C clock, 1.8 V | | 27 | N.C. | | 28 | N.C. | | | 29 | N.C. | | 30 | N.C. | | | 31 | N.C. | | 32 | GND | | | 33 | GND | | 34 | LWR_MCLK | Sensor master clock, 1.8 V | | 35 | N.C. | | 36 | N.C. | | | 37 | VREG_3P3V_LOCAL | 3.3 V | 38 | N.C. | | | 39 | N.C. | | 40 | N.C. | | | 43 | VDC_5V_LOCAL (NAIL_2A)| Power nail, 5 V to the ToF illuminator supply | 44 | VDC_5V_LOCAL (NAIL_2B) | Power nail, 5 V | > The power nails are numbered 41 through 44 and sit at both ends of the connector, with 41 and 42 nearest pin 1. When mating, confirm pin 1 lines up with pin 1 on both ends. The [M0178 datasheet](/M0178/#pin-out-at-p1) has a labeled connector drawing. ### Schematic ![M0177 schematic: P1 VOXL 2 side plug and J1 sensor side receptacle](/images/other-products/flex-cables/m0177-schematic.png) ## Compatibility | Item | Value | |----------------------------|------------------------------------------------------------------------------------------| | VOXL 2 adapters | [M0173](/M0173/) J3 (Starling 2 front end), [M0172](/M0172/) J1L (ToF + hi-res adapter) | | ToF modules | [M0178](/M0178/) (Starling 2 ToF adapter with mounting tab), M0171 (same without the tab) | | Camera group | Lower camera group on the host adapter | | Sensor type in voxl-camera-server | `pmd-tof-liow2` | | Longer alternative | [M0170](/M0170/) 70 mm straight 40-pin flex | ## Technical Drawings ### 3D STEP File [M0177 STEP](https://storage.googleapis.com/modalai_public/modal_drawings/STP-M0177_031524_REVIEW2.stp) --- Source: https://docs.modalai.com/M0187/ # M0187 VOXL 2 Lepton Adapter --- ## Overview The M0187 is a breakout board for the FLIR Lepton 3.5 thermal camera on VOXL 2 platforms. It carries the Lepton socket, its 25 MHz clock, and an I2C IO expander that lets voxl-lepton-server hard-reset the Lepton. The IO expander is detected automatically at runtime. ![M0187_front_back](/docs/70-accessories/12-image-sensor-flexes-adapters/images/M0187_front_back.png) | Item | Detail | |---|---| | Camera | FLIR Lepton 3.5, 160x120 at 9 fps | | Host boards | VOXL 2 through [M0173](/M0173/); VOXL 2 Mini through [M0188](/M0188/) or [M0195](/M0195/) | | Interface | SPI for video, I2C for control, 2.8 V logic | | Software | voxl-lepton-server, VOXL SDK 1.4.0 or later | ## VOXL SDK Requirements SDK 1.4.0 or later. ## Hardware Requirements ### Connectors #### J1 8-pin connector carrying the Lepton's SPI, I2C, clock, and 2.8 V supply to the host carrier board. - Connects to [M0173](/M0173/) J6 - Connects to [M0188](/M0188/) J10 (primary) or J5 (secondary) - Connects to [M0195](/M0195/) J10 (primary) or J5 (secondary) | Pin | Function | |-----|--------------------| | 1 | VREG_AVDD_2P8_FLIR | | 2 | FLIR_SPI_SCK_2P8 | | 3 | FLIR_SPI_CS_N_2P8 | | 4 | FLIR_SPI_MISO_2P8 | | 5 | I2C_SCL_2P8V | | 6 | I2C_SDA_2P8V | | 7 | CLK_25M_FLIR_2P8V | | 8 | DGND | ## Software Setup voxl-lepton-server publishes the Lepton's frames over the Modal Pipe Architecture. Configure it for the carrier the M0187 is attached to: ```bash voxl-configure-lepton m0173 ``` Use `m0188` for a VOXL 2 Mini carrier, and `m0173_rotated` for the rotated image on Starling 2. The [FLIR Lepton](/voxl-lepton-server/) page covers the config file, pipes, and shutter control. Frames can be viewed live in [VOXL Portal](/voxl-portal/). ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0187_LEPTON_TOF_V2_REVA_2024-09-03.step) --- Source: https://docs.modalai.com/M0188/ # M0188 VOXL 2 Mini Stinger Imager Adapter --- # Table of contents 1. TOC --- # Summary ## Features M0188 Serves as a breakout for Camera Groups J6 and J7 on VOXL 2 Mini. - Micro Coax camera connections - 4 two lane MIPI-CSI - 2 four lane MIPI-CSI - hardware synchronization - 2 FLIR Lepton 3.5 sensor interfaces (1 natively, another using an additional cable to route to an extra SPI). - 8 channel I2C mux (TCA9548AMRGER, address 0x76) ## Hardware Requirements - Only compatible with [VOXL 2 Mini](/voxl2-mini/) - Micro-coax Cables [MCBL-00084](https://www.modalai.com/products/mcbl-00084) ## VOXL SDK Requirements VOXL SDK 1.4.0+ is required. ## Kernel Requirements for M0188 M0188 requires kernel `m0104-1-var00.2-kernel.img`. When installing SDK, select "D0013" option to install this kernel. ## Dimensions ### 3D Drawings [3D STEP](https://storage.googleapis.com/modalai_public/modal_drawings/M0188_SPARROW_IMAGER_ADAPTER_REVA_2024-09-12.step) ### 2D Drawings TODO ## Specifications | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | TODO g | | HxW | TODO # Hardware ## Hardware Block Diagram ![M0188 hardware block diagram](/images/m0188/m0188-hw-block-diagram.png) [View in fullsize](/images/m0188/m0188-hw-block-diagram.png){:target="_blank"} ## Connectors ### Summary Hover a connector to identify it — click to jump to its pinout. | Connector | Description | | --- | --- | | J0 | Tracking Sensor ID0 | | J1 | Hires Sensor ID1 | | J2 | Tracking Sensor ID2 | | J3 | Hires Sensor ID3 | | J6 | Tracking Sensor ID6 | | J8 | Tracking Sensor ID8 | | Connector | Description | | --- | --- | | P6 | Board to Board - mates to M0104 J6 | | P7 | Board to Board - mates to M0104 J7 | | Connector | Description | | --- | --- | | J4 | Connects to M0104 J10 SPI | | J5 | FLIR Leptopn 2 | | J10 | FLIR Leptopn 1 | | Connector | Description | | --- | --- | | J01 | TODO | | J23 | TODO | | J45 | TODO | | J67 | TODO | ## Image Sensor Interfaces ![M0188 image sensor interfaces](/images/m0188/m0188-image-sensors.png) - requires kernel `m0104-1-var00.2-kernel.img` ### Notes for Sensors - supported coax cables - [MCBL-00084](https://www.modalai.com/products/mcbl-00084) - HW synchronization - tracking sensors enabled sync by default using GPIO 109 ([voxl-fsync-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fsync-mod)) ### J0 - Tracking Sensor ID0 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0166) - 1280x800 Global Shutter Sensor AR0144 - 2 MIPI lane support, in combo mode with Sensor ID6 ### J1 - Hires Sensor ID1 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0161) - 4k High-resolution, Low-light, IMX412 - 4 MIPI lane support ### J2 - Tracking Sensor ID2 - supported image sensors - [M0166](https://www.modalai.com/products/msu-m0166) - 1280x800 Global Shutter Sensor AR0144 - 2 MIPI lane support, in combo mode with Sensor ID8 ### J3 - Hires Sensor ID3 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0161) - 4k High-resolution, Low-light, IMX412 - 4 MIPI lane support ### J6 - Tracking Sensor ID6 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0166) - 1280x800 Global Shutter Sensor AR0144 - 2 MIPI lane support, in combo mode with Sensor ID0 ### J8 - Tracking Sensor ID8 Not supported yet ## FLIR Lepton Interfaces ![FLIR Lepton interface on M0188](/images/m0188/m0188-lepton-v4.png) ### Lepton 1 - J10 TODO PINOUT ### Lepton 2 - J5 (external SPI to M0104 J10) TODO PINOUT ## I2C Mux Interfaces ### Summary An 8-channel I2C mux (`TCA9548AMRGER`) is on the `/dev/i2c-0` bus at address 0x76 when mated to VOXL2 Mini. ### J01 - I2C0 and I2C1 TODO PINOUT ### J23 - I2C2 and I2C3 TODO PINOUT ### J45 - I2C4 and I2C5 TODO PINOUT ### J67 - I2C6 and I2C7 TODO PINOUT # Software ## Linux Users Guide ![M0188 bus and connector mapping](/images/m0188/m0188-linux-user-guide.png) ### Lepton 1 - J10 The `/dev/spidev0.0` SPI interface comes through `M0188 P6`, the `/dev/i2c-0` I2C inteface comes though `M0188 P7`. I2C is shared between Lepton 1 and Lepton 2 and we need to use a channel selector. For Lepton 1 I2C, you need to use `CHANNEL0` of the TCA9543A device (write `0x01` to address `0x01` on slave device `0x73`). ### Lepton 2 - J5 (external SPI to M0104 J10) The `/dev/spidev14.0` SPI interface comes through `J4` that connects to M0104 `J10` externally, the `/dev/i2c-0` I2C inteface comes though `P7`. I2C is shared between Lepton 1 and Lepton 2 and we need to use a channel selector. For I2C, you can use `CHANNEL1` of the TCA9543A device (write `0x02` to address `0x01` on slave device `0x73`). ## I2C Mux Interfaces ### Summary An 8-channel I2C mux (`TCA9548AMRGER`) is on the `/dev/i2c-0` bus at address 0x76 when mated to VOXL2 Mini. ### J01 - I2C0 and I2C1 To use `CHANNEL0` of the TCA9548A device (write `0x01` to address `0x01` on slave device `0x76`). To use `CHANNEL1` of the TCA9548A device (write `0x02` to address `0x01` on slave device `0x76`). ### J23 - I2C2 and I2C3 To use `CHANNEL2` of the TCA9548A device (write `0x04` to address `0x01` on slave device `0x76`). To use `CHANNEL3` of the TCA9548A device (write `0x08` to address `0x01` on slave device `0x76`). ### J45 - I2C4 and I2C5 To use `CHANNEL4` of the TCA9548A device (write `0x10` to address `0x01` on slave device `0x76`). To use `CHANNEL5` of the TCA9548A device (write `0x20` to address `0x01` on slave device `0x76`). ### J67 - I2C6 and I2C7 To use `CHANNEL6` of the TCA9548A device (write `0x40` to address `0x01` on slave device `0x76`). To use `CHANNEL7` of the TCA9548A device (write `0x80` to address `0x01` on slave device `0x76`). --- Source: https://docs.modalai.com/M0195/ # M0195 VOXL 2 Mini Stinger Imager Adapter --- # Table of contents 1. TOC --- # Summary ## Features M0195 Serves as a breakout for Camera Groups J6 and J7 on VOXL 2 Mini. - Micro Coax camera connections - 2 one lane MIPI-CSI in combo mode for CV (AR0144, M0166) - 2 four lane MIPI-CSI for EO (IMX664, M0161) - 1 two lane MIPI-CSI for Thermal (Boson+) - image sensor hardware synchronization - 2 FLIR Lepton 3.5 sensor interfaces (1 natively, another using an additional cable to route to an extra SPI) - 2 channel I2C mux (TCA9543A, address 0x73) - 1 I2C connection for ModalAI VTX power monitoring (on /dev/i2c-0, ADC address 0x1D, Temp address 0x48) - 1 ICP-10100 Barometer (on /dev/i2c-0, address 0x63) ## Hardware Requirements - Only compatible with [VOXL 2 Mini](/voxl2-mini/) - Micro-coax Cables [MCBL-00084](https://www.modalai.com/products/mcbl-00084) ## VOXL SDK Requirements VOXL SDK 1.5.0+ is required. ## Kernel Requirements for M0195 M0195 requires kernel `m0104-1-var00.2-kernel.img`. When installing SDK, select "D0013" option to install this kernel. ## Dimensions ### 3D Drawings TODO ### 2D Drawings TODO ## Specifications | Feature | Details | |:-----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Weight | TODO g | | HxW | TODO # Hardware ## Connectors ### Summary Hover a connector to identify it — click to jump to its pinout. | Connector | Description | | --- | --- | | J0 | Tracking Sensor ID0 | | J1 | Hires Sensor ID1 | | J2 | Thermal Sensor ID2 | | J3 | Hires Sensor ID3 | | J6 | Tracking Sensor ID6 | | Connector | Description | | --- | --- | | P6 | Board to Board - mates to M0204 J6 | | P7 | Board to Board - mates to M0204 J7 | | Connector | Description | | --- | --- | | J4 | Connects to M0204 J10 SPI (For Lepton 2)| | J5 | FLIR Leptopn 2 | | J7 | ModalAI VTX power monitoring I2C | | J10 | FLIR Leptopn 1 | ## Board-to-Board Connectors P6 and P7 are Hirose DF40HC(4.0)-60DS-0.4V(51) 60-pin connectors with a 4 mm mate height. They mate with the VOXL 2 Mini camera group connectors J6 and J7. ### P6 - Camera Group 0 (mates to VOXL 2 Mini J6) P6 carries CSI0 (J0 and J6 tracking sensors) and CSI1 (J1 hires sensor), plus the CAM0 SPI0 port used by Lepton 1. | Pin # | Signal | Pin # | Signal | |---|---|---|---| | 1 | DGND | 2 | DGND | | 3 | CCI_I2C0_SDA | 4 | PM8009_VREG_L2_DVDD_1P2 | | 5 | CCI_I2C0_SCL | 6 | PM8009_VREG_L7_DOVDD_1P8 | | 7 | DGND | 8 | PM8009_VREG_L1_DVDD_1P05 | | 9 | CSI0_CLK_CON_P | 10 | GPIO_93_CAM0_RST_N | | 11 | CSI0_CLK_CON_N | 12 | GPIO_94_MCLK0 | | 13 | CSI0_LANE0_CON_P | 14 | DGND | | 15 | CSI0_LANE0_CON_N | 16 | GPIO_110_CCI_TIMER1 | | 17 | DGND | 18 | GPIO_113_CCI_TIMER4 | | 19 | CSI0_LANE1_CON_P | 20 | GPIO_95_MCLK1 | | 21 | CSI0_LANE1_CON_N | 22 | PM8009_VREG_L5_AVDD_2P8 | | 23 | CSI0_LANE2_CON_P | 24 | DGND | | 25 | CSI0_LANE2_CON_N | 26 | GPIO_109_GSYNC | | 27 | DGND | 28 | CCI_I2C1_SDA | | 29 | CSI0_LANE3_CON_P | 30 | CCI_I2C1_SCL | | 31 | CSI0_LANE3_CON_N | 32 | Not connected | | 33 | DGND | 34 | GPIO_28_CAM0_SPI0_MISO | | 35 | CSI1_CLK_CON_P | 36 | Not connected | | 37 | CSI1_CLK_CON_N | 38 | GPIO_30_CAM0_SPI0_CLK | | 39 | CSI1_LANE0_CON_P | 40 | GPIO_31_CAM0_SPI0_CS | | 41 | CSI1_LANE0_CON_N | 42 | VREG_S4A_1P8 | | 43 | DGND | 44 | DGND | | 45 | CSI1_LANE1_CON_P | 46 | VPH_PWR | | 47 | CSI1_LANE1_CON_N | 48 | VPH_PWR | | 49 | CSI1_LANE2_CON_P | 50 | DGND | | 51 | CSI1_LANE2_CON_N | 52 | VREG_3P3V_LOCAL | | 53 | DGND | 54 | DGND | | 55 | CSI1_LANE3_CON_P | 56 | VDC_5V_LOCAL | | 57 | CSI1_LANE3_CON_N | 58 | VDC_5V_LOCAL | | 59 | DGND | 60 | DGND | ### P7 - Camera Group 1 (mates to VOXL 2 Mini J7) P7 carries CSI2 (J2 thermal sensor, two lanes) and CSI3 (J3 hires sensor). GPIO_4 and GPIO_5 (QUP1) run in I2C mode and serve the barometer, the TCA9543A Lepton I2C mux, the VTX I2C on J7, and J2. | Pin # | Signal | Pin # | Signal | |---|---|---|---| | 1 | DGND | 2 | DGND | | 3 | CCI_I2C2_SDA | 4 | PM8009_VREG_L2_DVDD_1P2 | | 5 | CCI_I2C2_SCL | 6 | PM8009_VREG_L7_DOVDD_1P8 | | 7 | DGND | 8 | PM8009_VREG_L1_DVDD_1P05 | | 9 | CSI2_CLK_CON_P | 10 | GPIO_92_CAM1_RST_N | | 11 | CSI2_CLK_CON_N | 12 | GPIO_96_MCLK2 (test point only) | | 13 | CSI2_LANE0_CON_P | 14 | DGND | | 15 | CSI2_LANE0_CON_N | 16 | GPIO_111_CCI_TIMER2 (test point only) | | 17 | DGND | 18 | GPIO_114_CCI_ASYNC_IN | | 19 | CSI2_LANE1_CON_P | 20 | GPIO_97_MCLK3 | | 21 | CSI2_LANE1_CON_N | 22 | PM8009_VREG_L6_AVDD_2P8 | | 23 | Not connected | 24 | DGND | | 25 | Not connected | 26 | GPIO_109_GSYNC | | 27 | DGND | 28 | CCI_I2C3_SDA | | 29 | Not connected | 30 | CCI_I2C3_SCL | | 31 | Not connected | 32 | GPIO_100_CAM_SHARED_RST_N (test point only) | | 33 | DGND | 34 | GPIO_4_CAM1_SPI1_MISO | | 35 | CSI3_CLK_CON_P | 36 | GPIO_5_CAM1_SPI1_MOSI | | 37 | CSI3_CLK_CON_N | 38 | GPIO_6_CAM1_SPI1_CLK | | 39 | CSI3_LANE0_CON_P | 40 | GPIO_7_CAM1_SPI1_CS | | 41 | CSI3_LANE0_CON_N | 42 | VREG_S4A_1P8 | | 43 | DGND | 44 | DGND | | 45 | CSI3_LANE1_CON_P | 46 | VPH_PWR | | 47 | CSI3_LANE1_CON_N | 48 | VPH_PWR | | 49 | CSI3_LANE2_CON_P | 50 | DGND | | 51 | CSI3_LANE2_CON_N | 52 | VREG_3P3V_LOCAL | | 53 | DGND | 54 | DGND | | 55 | CSI3_LANE3_CON_P | 56 | VDC_5V_LOCAL | | 57 | CSI3_LANE3_CON_N | 58 | VDC_5V_LOCAL | | 59 | DGND | 60 | DGND | ## Image Sensor Interfaces - requires kernel `m0104-1-var00.2-kernel.img` ### MIPI Connection Details ![M0195 MIPI image sensor connections](/images/m0195/m0195-image-sensors.jpg) ### Support Camera Configs ![M0195 supported camera configurations](/images/m0195/m0195-camera-configs.jpg) ### Notes for Sensors - supported coax cables - [MCBL-00084](https://www.modalai.com/products/mcbl-00084) - HW synchronization - tracking sensors enabled sync by default using GPIO 109 ([voxl-fsync-mod](https://gitlab.com/voxl-public/system-image-build/meta-voxl2/-/tree/qrb5165-ubun1.0-14.1a/recipes-kernel/voxl-fsync-mod)) - hires sensors are not synced by default: their sync pins (J1 and J3 pin 21) connect to GPIO 109 only through R10 and R11, which are not fitted - the Boson+ on J2 receives GPIO 109 directly on pin 17 - connectors - J0, J1, J2, J3, and J6 are Hirose DF56C-26S-0.3V(51) 26-pin micro-coax receptacles ### J0 - Tracking Sensor ID0 - supported image sensors - [M0166](https://www.modalai.com/products/msu-m0166) - 1280x800 Global Shutter Sensor AR0144 - 2 MIPI lane support, in combo mode with Sensor ID6 | Pin # | Signal | Notes | |---|---|---| | 1 | CCI_I2C0_SDA | CCI I2C | | 2 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 3 | CCI_I2C0_SCL | CCI I2C | | 4 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 5 | DGND | | | 6 | DGND | | | 7 | CSI0_CLK_CON_P | | | 8 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 9 | CSI0_CLK_CON_N | | | 10 | PM8009_VREG_L7_DOVDD_1P8 | 1.8 V I/O supply | | 11 | CSI0_LANE0_CON_P | | | 12 | GPIO_93_CAM0_RST_N | Reset | | 13 | CSI0_LANE0_CON_N | | | 14 | CSI0_LANE1_CON_P | | | 15 | MCLK0_ID0 | MCLK, buffered from GPIO_94_MCLK0 | | 16 | CSI0_LANE1_CON_N | | | 17 | DGND | | | 18 | DGND | | | 19 | PM8009_VREG_L5_AVDD_2P8 | 2.8 V analog supply | | 20 | Not connected | | | 21 | TRACK_TRIG_ID0 | Frame sync, GPIO_109_GSYNC through R5/R6 | | 22 | Not connected | | | 23 | DGND | | | 24 | Not connected | | | 25 | VPH_PWR | Not used by AR0144 | | 26 | Not connected | | | S1-S5 | DGND | Shield | ### J1 - Hires Sensor ID1 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0161) - 4k High-resolution, Low-light, IMX412 - 4 MIPI lane support | Pin # | Signal | Notes | |---|---|---| | 1 | CCI_I2C1_SDA | CCI I2C | | 2 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 3 | CCI_I2C1_SCL | CCI I2C | | 4 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 5 | DGND | | | 6 | DGND | | | 7 | CSI1_CLK_CON_P | | | 8 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 9 | CSI1_CLK_CON_N | | | 10 | PM8009_VREG_L7_DOVDD_1P8 | 1.8 V I/O supply | | 11 | CSI1_LANE0_CON_P | | | 12 | GPIO_113_CCI_TIMER4 | Reset | | 13 | CSI1_LANE0_CON_N | | | 14 | CSI1_LANE1_CON_P | | | 15 | GPIO_95_MCLK1 | MCLK | | 16 | CSI1_LANE1_CON_N | | | 17 | DGND | | | 18 | DGND | | | 19 | PM8009_VREG_L5_AVDD_2P8 | 2.8 V analog supply | | 20 | CSI1_LANE2_CON_P | | | 21 | HIRES_SYNC_ID1 | Not connected by default (R10 not fitted) | | 22 | CSI1_LANE2_CON_N | | | 23 | DGND | | | 24 | CSI1_LANE3_CON_P | | | 25 | VPH_PWR | | | 26 | CSI1_LANE3_CON_N | | | S1-S5 | DGND | Shield | ### J2 - Thermal Sensor ID2 - supported image sensors - Boson+ (M0201 backpack) - 2 MIPI lane support | Pin # | Signal | Notes | |---|---|---| | 1 | DGND | | | 2 | GPIO_92_CAM1_RST_N | Reset | | 3 | CSI2_CLK_CON_P | | | 4 | GPIO_6_CAM1_SPI1_CLK | QUP1 lane 2 | | 5 | CSI2_CLK_CON_N | | | 6 | DGND | | | 7 | DGND | | | 8 | DGND | | | 9 | CSI2_LANE0_CON_P | | | 10 | VREG_S4A_1P8 | 1.8 V | | 11 | CSI2_LANE0_CON_N | | | 12 | GPIO_7_CAM1_SPI1_CS | QUP1 lane 3 | | 13 | DGND | | | 14 | CSI2_LANE1_CON_P | | | 15 | DGND | | | 16 | CSI2_LANE1_CON_N | | | 17 | GPIO_109_GSYNC | Frame sync | | 18 | DGND | | | 19 | VDC_5V_LOCAL | 5 V | | 20 | CCI_I2C2_SDA | CCI I2C | | 21 | VDC_5V_LOCAL | 5 V | | 22 | CCI_I2C2_SCL | CCI I2C | | 23 | VDC_5V_LOCAL | 5 V | | 24 | GPIO_4_CAM1_SPI1_MISO | QUP1 I2C SDA | | 25 | VDC_5V_LOCAL | 5 V | | 26 | GPIO_5_CAM1_SPI1_MOSI | QUP1 I2C SCL | | S1-S5 | DGND | Shield | ### J3 - Hires Sensor ID3 - supported image sensors - [M0161](https://www.modalai.com/products/msu-m0161) - 4k High-resolution, Low-light, IMX412 - 4 MIPI lane support | Pin # | Signal | Notes | |---|---|---| | 1 | CCI_I2C3_SDA | CCI I2C | | 2 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 3 | CCI_I2C3_SCL | CCI I2C | | 4 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 5 | DGND | | | 6 | DGND | | | 7 | CSI3_CLK_CON_P | | | 8 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 9 | CSI3_CLK_CON_N | | | 10 | PM8009_VREG_L7_DOVDD_1P8 | 1.8 V I/O supply | | 11 | CSI3_LANE0_CON_P | | | 12 | GPIO_114_CCI_ASYNC_IN | Reset | | 13 | CSI3_LANE0_CON_N | | | 14 | CSI3_LANE1_CON_P | | | 15 | GPIO_97_MCLK3 | MCLK | | 16 | CSI3_LANE1_CON_N | | | 17 | DGND | | | 18 | DGND | | | 19 | PM8009_VREG_L6_AVDD_2P8 | 2.8 V analog supply | | 20 | CSI3_LANE2_CON_P | | | 21 | HIRES_SYNC_ID3 | Not connected by default (R11 not fitted) | | 22 | CSI3_LANE2_CON_N | | | 23 | DGND | | | 24 | CSI3_LANE3_CON_P | | | 25 | VPH_PWR | | | 26 | CSI3_LANE3_CON_N | | | S1-S5 | DGND | Shield | ### J6 - Tracking Sensor ID6 - supported image sensors - [M0166](https://www.modalai.com/products/msu-m0166) - 1280x800 Global Shutter Sensor AR0144 - 2 MIPI lane support, in combo mode with Sensor ID0 | Pin # | Signal | Notes | |---|---|---| | 1 | CCI_I2C1_SDA | CCI I2C | | 2 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 3 | CCI_I2C1_SCL | CCI I2C | | 4 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 5 | DGND | | | 6 | DGND | | | 7 | CSI0_LANE3_CON_P | Clock in combo mode | | 8 | PM8009_VREG_L2_DVDD_1P2 | 1.2 V digital core supply | | 9 | CSI0_LANE3_CON_N | Clock in combo mode | | 10 | PM8009_VREG_L7_DOVDD_1P8 | 1.8 V I/O supply | | 11 | CSI0_LANE2_CON_P | Data lane 0 in combo mode | | 12 | GPIO_110_CCI_TIMER1 | Reset | | 13 | CSI0_LANE2_CON_N | Data lane 0 in combo mode | | 14 | Not connected | | | 15 | MCLK0_ID6 | MCLK, buffered from GPIO_94_MCLK0 | | 16 | Not connected | | | 17 | DGND | | | 18 | DGND | | | 19 | PM8009_VREG_L5_AVDD_2P8 | 2.8 V analog supply | | 20 | Not connected | | | 21 | TRACK_TRIG_ID6 | Frame sync, GPIO_109_GSYNC through R5/R7 | | 22 | Not connected | | | 23 | DGND | | | 24 | Not connected | | | 25 | VPH_PWR | Not used by AR0144 | | 26 | Not connected | | | S1-S5 | DGND | Shield | ## FLIR Lepton Interfaces ![FLIR Lepton interface on M0195](/images/m0195/m0195-lepton.jpg) ### Lepton 1 - J10 J10 and J5 are JST SM08B-SRSS-TB 8-pin 1.0 mm connectors with the same pinout. The SPI, I2C, and clock lines run at 2.8 V, and the board's level translators and 25 MHz oscillator handle the conversion. | Pin # | Signal | Notes | |---|---|---| | 1 | VREG_AVDD_2P8_FLIR | 2.8 V, from PM8009_VREG_L5_AVDD_2P8 | | 2 | FLIR1_SPI_SCK_2P8V | CAM0 SPI0, level-shifted from 1.8 V | | 3 | FLIR1_SPI_CS_N_2P8V | CAM0 SPI0, level-shifted from 1.8 V | | 4 | FLIR1_SPI_MISO_2P8V | CAM0 SPI0, level-shifted from 1.8 V | | 5 | FLIR1_I2C_SCL_2P8V | TCA9543A channel 0 | | 6 | FLIR1_I2C_SDA_2P8V | TCA9543A channel 0 | | 7 | CLK_25M_FLIR1_2P8V | 25 MHz reference clock | | 8 | DGND | | | S1, S2 | DGND | | ### Lepton 2 - J5 (external SPI to M0104 J10) Lepton 2's SPI comes from VOXL 2 Mini J10 through J4, not from the camera group connectors. | Pin # | Signal | Notes | |---|---|---| | 1 | VREG_AVDD_2P8_FLIR | 2.8 V, from PM8009_VREG_L5_AVDD_2P8 | | 2 | FLIR2_SPI_SCK_2P8V | From J4, level-shifted from 3.3 V | | 3 | FLIR2_SPI_CS_N_2P8V | From J4, level-shifted from 3.3 V | | 4 | FLIR2_SPI_MISO_2P8V | From J4, level-shifted from 3.3 V | | 5 | FLIR2_I2C_SCL_2P8V | TCA9543A channel 1 | | 6 | FLIR2_I2C_SDA_2P8V | TCA9543A channel 1 | | 7 | CLK_25M_FLIR2_2P8V | 25 MHz reference clock | | 8 | DGND | | | S1, S2 | DGND | | ### J4 - SPI from VOXL 2 Mini J10 J4 is a JST SM06B-SRSS-TB 6-pin 1.0 mm connector. It takes the 3.3 V SPI port from VOXL 2 Mini J10 and passes it to Lepton 2 on J5. The MCBL-00120-1 cable converts J10's 8-pin GH connector to this 6-pin SH connector. | Pin # | Signal | Notes | |---|---|---| | 1 | VREG_3P3V_LOCAL | 3.3 V | | 2 | V2MINIJ10_SPI_MISO_3P3V | | | 3 | V2MINIJ10_SPI_MOSI_3P3V | Not used on M0195 | | 4 | V2MINIJ10_SPI_SCLK_3P3V | | | 5 | V2MINIJ10_SPI_CS0_3P3V | | | 6 | DGND | | | S1, S2 | DGND | | ## ModalAI VTX I2C Interface `dev/i2c-0` - ADC address 0x1D, Temp Sensor address 0x48 J7 is a JST SM03B-SRSS-TB 3-pin 1.0 mm connector. | Pin # | Signal | Notes | |---|---|---| | 1 | SENSOR_SCL_3P3V | QUP1 I2C, translated to 3.3 V by PCA9517A | | 2 | SENSOR_SDA_3P3V | QUP1 I2C, translated to 3.3 V by PCA9517A | | 3 | DGND | | | S1, S2 | DGND | | ![ModalAI VTX power and I2C connection on M0195](/images/m0195/m0195-vtx-power.jpg) # Software ## Linux Users Guide ![M0195 bus and connector mapping](/images/m0195/m0195-linux-user-guide.jpg) ### Lepton 1 - J10 The `/dev/spidev0.0` SPI interface comes through `M0195 P6`, the `/dev/i2c-0` I2C inteface comes though `M0195 P7`. I2C is shared between Lepton 1 and Lepton 2 and we need to use a channel selector. For Lepton 1 I2C, you need to use `CHANNEL0` of the TCA9543A device (write `0x01` to address `0x01` on slave device `0x73`). ### Lepton 2 - J5 (external SPI to M0204 J10) The `/dev/spidev14.0` SPI interface comes through `J4` that connects to M0104 `J10` externally, the `/dev/i2c-0` I2C inteface comes though `P7`. I2C is shared between Lepton 1 and Lepton 2 and we need to use a channel selector. For I2C, you can use `CHANNEL1` of the TCA9543A device (write `0x02` to address `0x01` on slave device `0x73`). ### Baromter Interface A ICP-10100 barometer is exposed on `/dev/i2c-0` (address 0x63) when M0195 attached to M0204 (VOXL2 Mini) ### I2C Mux Interfaces A 2 channel I2C mux (TCA9543A) is on the `/dev/i2c-0` bus at address 0x73 when mated to VOXL2 Mini. --- Source: https://docs.modalai.com/M0226/ # M0226 VOXL 2 Classic Front End M0226 is an updated [M0173](/M0173/). It mates directly to camera groups J6 and J7 on VOXL 2 and breaks them out to four micro-coax image sensor connectors (two tracking, two hires), a 40-pin connector for a PMD ToF sensor, and a connector for a FLIR Lepton carrier board. New on M0226 are an onboard barometer, a 25 MHz Lepton clock that software can switch on and off, and an I2C PWM driver. --- --- ## Overview ### Hardware Requirements Only compatible with [VOXL 2](/voxl-2/). M0226 mates to both camera group connectors (J6 and J7) at once, so like M0173 it does not fit VOXL 2 Mini. ### VOXL SDK Requirements The camera connectors work the same way as on M0173. The Lepton clock control and the barometer need VOXL SDK 1.6.0 or newer: - [voxl-lepton-server](/voxl-lepton-server/) v1.4.0+ auto-detects the M0226 GPIO expander and toggles the Lepton clock. - voxl-fpv-px4 in SDK 1.6 adds the second apps-processor I2C bus for the M0226 barometer. ### What's New Compared to M0173 - **Barometer**: Infineon DPS368 on the board (I2C 0x77). - **Switchable Lepton clock**: a 25 MHz oscillator for the Lepton, gated by a PI4IOE5V6408 GPIO expander, so software can turn the clock on and off. - **PWM outputs**: PCA9685 16-channel I2C PWM driver (I2C 0x4E). The standard build brings two channels out to a 4-pin connector (J8). - **Hires sync**: in the standard build, both hires sensors (J4, J5) share the GPIO 109 frame sync with the tracking sensors. See [Image Sensor Synchronization](#image-sensor-synchronization). - **ToF connector J3**: pins 10 and 12 carry the QUP1 I2C bus (GPIO 4/5). M0173 used them for SPI. - **Lepton connector J6**: pinout unchanged, but the connector is now a JST SM08B-SHLS-TF (M0173 used SM08B-SRSS-TB). ## Block Summary | Function | Part | Bus | I2C Address (7-bit) | |---|---|---|---| | Barometer | Infineon DPS368 | QUP1 I2C (GPIO 4/5), 1.8 V | 0x77 | | GPIO expander (Lepton clock enable) | Diodes PI4IOE5V6408 | QUP1 I2C (GPIO 4/5), 1.8 V | 0x44 (0x88 8-bit write) | | PWM driver | NXP PCA9685 | QUP1 I2C (GPIO 4/5), buffered to 3.3 V by a TCA9517 | 0x4E | | FLIR Lepton (off-board) | - | QUP1 I2C, level-shifted to 2.8 V by a TCA9517 | 0x2A | | FLIR Lepton video | - | CAM0 SPI0 (GPIO 28/30/31), level-shifted to 2.8 V | - | The barometer, GPIO expander, PWM driver, and Lepton I2C all share the QUP1 I2C bus (GPIO 4 SDA, GPIO 5 SCL), which also reaches the ToF connector J3 on pins 10 and 12. ## Features ### Image Sensor Synchronization The sensor sync lines are routed through 0 Ω resistor options. The resistors fitted in the standard build connect the sensors as follows: | Sensor | Connector | Sync Net | Standard Build | |---|---|---|---| | Front tracking (ID0) | J1 pin 21 | TRACKR_TRIGGER_ID0 | Driven by GPIO 109 (R1) | | Downward tracking (ID6) | J2 pin 21 | TRACKR_TRIGGER_ID6 | Driven by GPIO 109 (R3) | | Front hires (ID1) | J4 pin 21 | HIRES_SYNC_ID1 | Driven by GPIO 109 (R5) | | Downward hires (ID2) | J5 pin 21 | HIRES_SYNC_ID2 | Driven by GPIO 109 (R7) | | Front ToF (ID3) | J3 pin 40 | TOF_SYNC_ID3 | Not connected (R9/R10 not fitted) | Each sync net can instead be moved to GPIO 111 (CCI_TIMER2) by fitting the alternate resistor (R2, R4, R6, R8, R10). GPIO 109 is the sync GPIO used by `voxl-fsync-mod`. See the M0173 [VOXL 2 Driven Image Sensor Synchronization](/M0173/#voxl2-driven-image-sensor-synchronization) section for how `voxl-camera-server` enables it. ### FLIR Lepton Clock The Lepton's 25 MHz clock (J6 pin 7) comes from an onboard oscillator buffered by a SN74AHC1G126. The buffer is enabled by output P0 (CLK_25M_EN, high = clock on) of the PI4IOE5V6408 GPIO expander. `voxl-lepton-server` drives it automatically. To toggle it by hand: ```bash voxl-lepton-server --crystal_on voxl-lepton-server --crystal_off ``` ### PWM Outputs The PCA9685 runs from the 3.3 V rail (R30 fitted; R29 lets it run from 5 V instead), so the PWM outputs swing 0-3.3 V. In the standard build J8 carries channels LED2 and LED3. The 12-pin J7 footprint, which would bring out more channels, is not fitted. ## Connectors | Connector | Function | Part | |---|---|---| | P6 | VOXL 2 J6 (camera group 0) board-to-board | Hirose DF40HC(4.0)-60DS-0.4V(51) | | P7 | VOXL 2 J7 (camera group 1) board-to-board | Hirose DF40HC(4.0)-60DS-0.4V(51) | | J1 | Front tracking, ID0 (CSI0) | Hirose DF56C-26S-0.3V(51) | | J2 | Downward tracking, ID6 (CSI0 combo) | Hirose DF56C-26S-0.3V(51) | | J3 | Front ToF, ID3 (CSI3) | Molex 5052704012 | | J4 | Front hires, ID1 (CSI1) | Hirose DF56C-26S-0.3V(51) | | J5 | Downward hires, ID2 (CSI2) | Hirose DF56C-26S-0.3V(51) | | J6 | FLIR Lepton carrier | JST SM08B-SHLS-TF | | J7 | PWM, 12-pin (not fitted in standard build) | Molex 0532611271 | | J8 | PWM, 4-pin | Molex 0532610471 | ### J1 - Front Tracking : ID0 (CSI0) Cable user code: V2(L1)-H26-TS | Pin | Name | |---|---| | 1 | CCI_I2C0_SDA | | 2, 4, 8 | PM8009_VREG_L2_DVDD_1P2 | | 3 | CCI_I2C0_SCL | | 5, 6 | DGND | | 7 | CSI0_CLK_CON_P | | 9 | CSI0_CLK_CON_N | | 10 | PM8009_VREG_L7_DOVDD_1P8 | | 11 | CSI0_LANE0_CON_P | | 12 | GPIO_93_CAM0_RST_N | | 13 | CSI0_LANE0_CON_N | | 14 | CSI0_LANE1_CON_P | | 15 | MCLK0_ID0 | | 16 | CSI0_LANE1_CON_N | | 17, 18 | DGND | | 19 | PM8009_VREG_L5_AVDD_2P8 | | 21 | TRACKR_TRIGGER_ID0 | | 23 | DGND | | 25 | VPH_PWR | | 20, 22, 24, 26 | NC | ### J2 - Downward Tracking : ID6 (CSI0/Combo) Cable user code: V2(L2)-H26-TS. In combo-PHY mode CSI0 lane 2 is the data lane and CSI0 lane 3 is the clock. | Pin | Name | |---|---| | 1 | CCI_I2C1_SDA | | 2, 4, 8 | PM8009_VREG_L2_DVDD_1P2 | | 3 | CCI_I2C1_SCL | | 5, 6 | DGND | | 7 | CSI0_LANE3_CON_P | | 9 | CSI0_LANE3_CON_N | | 10 | PM8009_VREG_L7_DOVDD_1P8 | | 11 | CSI0_LANE2_CON_P | | 12 | GPIO_110_CCI_TIMER1 | | 13 | CSI0_LANE2_CON_N | | 15 | MCLK0_ID6 | | 17, 18 | DGND | | 19 | PM8009_VREG_L5_AVDD_2P8 | | 21 | TRACKR_TRIGGER_ID6 | | 23 | DGND | | 25 | VPH_PWR | | 14, 16, 20, 22, 24, 26 | NC | VPH_PWR on J1 and J2 is not used by the AR0144 tracking sensors. ### J3 - Front ToF : ID3 (CSI3) Cable user code: V2(U)-M40 | Pin | Name | |---|---| | 1 | PM8009_VREG_L6_AVDD_2P8 | | 2 | VPH_PWR | | 3 | PM8009_VREG_L7_DOVDD_1P8 | | 4 | VREG_3P3V_LOCAL | | 5 | PM8009_VREG_L1_DVDD_1P05 | | 6 | GPIO_92_CAM1_RST_N | | 7 | PM8009_VREG_L2_DVDD_1P2 | | 8, 9 | DGND | | 10 | GPIO_4_QUP1_SDA | | 11 | CSI3_CLK_CON_P | | 12 | GPIO_5_QUP1_SCL | | 13 | CSI3_CLK_CON_N | | 14 | GPIO_6_QUP1 (via 0 Ω, R11) | | 15 | CSI3_LANE0_CON_P | | 16 | GPIO_7_QUP1 | | 17 | CSI3_LANE0_CON_N | | 18 | DGND | | 19 | CSI3_LANE1_CON_P | | 20 | GPIO_114_CCI_ASYNC_IN | | 21 | CSI3_LANE1_CON_N | | 22 | GPIO_100_CAM_SHARED_RST_N (via 0 Ω, R14) | | 23 | DGND | | 24 | CCI_I2C3_SDA | | 25 | CSI3_LANE2_CON_P | | 26 | CCI_I2C3_SCL | | 27 | CSI3_LANE2_CON_N | | 28 | CCI_I2C2_SDA | | 29 | CSI3_LANE3_CON_P | | 30 | CCI_I2C2_SCL | | 31 | CSI3_LANE3_CON_N | | 32, 33 | DGND | | 34 | GPIO_97_MCLK3 | | 35 | GPIO_111_CCI_TIMER2 (via 0 Ω, R12) | | 36 | GPIO_96_MCLK2 | | 37 | VREG_3P3V_LOCAL | | 38 | VREG_S4A_1P8 | | 39 | VPH_PWR | | 40 | TOF_SYNC_ID3 | | 41, 42 | DGND | | 43, 44 | VDC_5V_LOCAL | ### J4 - Front Hires : ID1 (CSI1) Cable user code: V2(U)-H26-HR | Pin | Name | |---|---| | 1 | CCI_I2C1_SDA | | 2, 4, 8 | PM8009_VREG_L2_DVDD_1P2 | | 3 | CCI_I2C1_SCL | | 5, 6 | DGND | | 7 | CSI1_CLK_CON_P | | 9 | CSI1_CLK_CON_N | | 10 | PM8009_VREG_L7_DOVDD_1P8 | | 11 | CSI1_LANE0_CON_P | | 12 | GPIO_113_CCI_TIMER4 | | 13 | CSI1_LANE0_CON_N | | 14 | CSI1_LANE1_CON_P | | 15 | GPIO_95_MCLK1 | | 16 | CSI1_LANE1_CON_N | | 17, 18 | DGND | | 19 | PM8009_VREG_L5_AVDD_2P8 | | 20 | CSI1_LANE2_CON_P | | 21 | HIRES_SYNC_ID1 | | 22 | CSI1_LANE2_CON_N | | 23 | DGND | | 24 | CSI1_LANE3_CON_P | | 25 | VPH_PWR | | 26 | CSI1_LANE3_CON_N | ### J5 - Downward Hires : ID2 (CSI2) Cable user code: V2(L)-H26-HR | Pin | Name | |---|---| | 1 | CCI_I2C2_SDA | | 2, 4, 8 | PM8009_VREG_L2_DVDD_1P2 | | 3 | CCI_I2C2_SCL | | 5, 6 | DGND | | 7 | CSI2_CLK_CON_P | | 9 | CSI2_CLK_CON_N | | 10 | PM8009_VREG_L7_DOVDD_1P8 | | 11 | CSI2_LANE0_CON_P | | 12 | GPIO_92_CAM1_RST_N | | 13 | CSI2_LANE0_CON_N | | 14 | CSI2_LANE1_CON_P | | 15 | GPIO_96_MCLK2 | | 16 | CSI2_LANE1_CON_N | | 17, 18 | DGND | | 19 | PM8009_VREG_L6_AVDD_2P8 | | 20 | CSI2_LANE2_CON_P | | 21 | HIRES_SYNC_ID2 | | 22 | CSI2_LANE2_CON_N | | 23 | DGND | | 24 | CSI2_LANE3_CON_P | | 25 | VPH_PWR | | 26 | CSI2_LANE3_CON_N | ### J6 - FLIR Lepton (SM08B-SHLS-TF) All signals are 2.8 V, level-shifted on the board from the 1.8 V VOXL 2 domain. | Pin | Name | |---|---| | 1 | PM8009_VREG_L5_AVDD_2P8 | | 2 | FLIR_SPI_SCK_2P8 | | 3 | FLIR_SPI_CS_N_2P8 | | 4 | FLIR_SPI_MISO_2P8 | | 5 | FLIR_I2C_SCL_2P8V | | 6 | FLIR_I2C_SDA_2P8V | | 7 | CLK_25M_FLIR_2P8V | | 8 | DGND | ### J8 - PWM (0532610471) 3.3 V PWM outputs from the PCA9685. | Pin | Name | |---|---| | 1 | I2C_PWM2 (PCA9685 LED2) | | 2 | DGND | | 3 | I2C_PWM3 (PCA9685 LED3) | | 4 | DGND | --- Source: https://docs.modalai.com/micro-coax-user-guide/ # Micro-Coaxial User Guide ## Overview Micro coaxial cables speed development by offering a flexible image image sensor connection with little to no NRE time required. Their flexibility also makes them an ideal choice for gimbal applications. Our Micro coaxial cables are only 2mm in diameter, have a bend radius of 1.5mm, and are available off the shelf in a variety of lengths from 35mm to 180mm. Users should note that MIPI lines are uncoupled over the length of a coaxial cable and therefore have less noise immunity. Users may notice increased noise and decreased performance, especially at high speeds, when compared to flex cables. The connectors for coaxial cables are also less rugged than flex cable connectors, and are only rated for 30 insertions. ## Image Sensor Cable User Code The Image Sensor Cable User Code is intended to make it simpler to connect image sensors using coax cables to VOXL 2 and VOXL 2 Mini (Host Boards). Coaxial cables have a limited number of pins, which requires different pinouts to be used for different types of sensors. Connecting boards with 2 different pinouts could damage sensors, adapters, or even host boards, so the image sensor cable user code was created to help reduce the chances of improper board connections. Adapter boards for coaxial cables are color coded to provide a simple visual indicator of board compatibility. ![Image_Sensor_Cable_User_Code](/images/other-products/image-sensors/Image_Sensor_Cable_User_Code_2024-06-17.jpg) ## Adapter Compatibility **Board Connection ①** = S adapters must be paired with a **Board Connection ①** ≠ S adapter. **Board Connection ①** ≠ S adapters must be paired with a **Board Connection ①** = S or **①** = EXT adapter. Connected adapters must have matching **Cable Connectors ③** and **MIPI/Power Configs ④**. ### Compatibility Matrix ![Image_Sensor_Compatibility_Matrix](/images/other-products/image-sensors/Image_Sensor_Code_Compatibility_Matrix_2024-05-16.jpg) ### Boards with Multiple Image Sensor Adapters Some Host Side Adapter boards have adapters for **MIPI/Power Config ④** = HR image sensors and adapters for other types of sensors. When multiple types of **MIPI/Power Configs** are on a board, each adapter is labeled with it’s own image sensor cable code and the label is surrounded by a box with the appropriate color for it’s **MIPI/Power Config**. This label may be around the adapter, or opposite the adapter on the reverse side of the board. Host Side Adapter Boards with **Board Connection ①** = V2 that connect to only one camera group adapter on the Host are compatible with either the VOXL 2 or the VOXL 2 Mini. However, Host Side Adapter Boards that connect to multiple camera group adapters on the host (M0173) are only compatible with their designated Host. ## !! Proper Cable and Adapter Handling !! ModalAI uses Hirose DF56 series micro coaxial connectors for our adapters and cables. For instructions on proper handling please refer to the [Hirose DF56 Series Handling Guidelines](https://www.hirose.com/en/product/document?clcode=CL0662-5605-4-00&productname=DF56-26P-SHL&series=DF56&documenttype=Guideline&lang=en&documentid=0000122105) and use the appropriate tool ([Hirose DF-SD3/RE-MD](https://www.mouser.com/ProductDetail/Hirose-Connector/DF-SD3-RE-MD?qs=cbprxTG2Yq8BLNmyfKF1vw%3D%3D)) if disconnecting a micro coaxial cable is unavoidable. --- Source: https://docs.modalai.com/usb-expander-and-debug-datasheet/ # USB Expander and Debug Board Datasheet ## Board Connections ![voxl-usb-expander-and-debug.png](/images/other-products/hdmi-usb-accessories/voxl-usb-expander-and-debug-2.png) ## Specification | Specification | Value | | --- | --- | | Weight | 5g | | Debug Console Connector | Micro USB, Female | | Debug Console Mating Connector | Micro USB, Male | | USB2 Host Connector | 4 Position JST GH, Vertical, BM04B-GHS-TBT | | USB2 Host Mating Connector | JST GHR-04V-S | | J1 Connector | Samtec Inc, MPN: QTH-030-01-F-D-K | | J1 Mating Connector | Samtec Inc., MPN: QSH-030-01-L-D-A-K | ## USB2 Host Pinout Pin 1 is marked in the `Board Connections` graphic above. | Pin | Value | | --- | --- | | 1 | VBUS | | 2 | USB_M | | 3 | USB_P | | 4 | GND | ## User Manual Information on usage is found in the [user manual](/voxl2-usb3-uart-add-on-user-guide/) --- Source: https://docs.modalai.com/image-sensor-design-guide/ # Image Sensor Hardware Design and Integration Guide This page will host a variety of hardware topics relevant to Hardware Engineers that are designing image sensor components relating to our VOXL ecosystem. Image sensor flex cables, adapter boards, and modules are hard to get right. There are many topics that must be well understood in order to have success the first time, and every time. The range of applications covered here will include, but are not limited to: - MIPI CSI fundamental aspects - VOXL based MIPI CSI Architectures - VOXL/VOXL-Flight vs VOXL 2 vs VOXL 2 Mini - Common Image Sensor specifications - ModalAI's new Computer Vision SW Framework definitions (only applicable to VOXL 2+, not VOXL) - Schematic Conventions & the "do's and don'ts" of electrical design for MIPI CSI - Flexes vs Rigid PCB design and the tradeoffs why/when each is selected - Key things to know when working with your Mechanical Engineering team - bend radius, clearances, pin 1's - Complete Schematic Examples (RB5 flight Flexes and VOXL-Cam rigid PCB) - HighSpeed Routing Constraints - Impedance Control, Length Limits, Via Structures and routing tips - Manufacturing Tips and Tricks for Flexes and Rigid PCBs - Layer Stackups - EMI coating - Ground planes, solid vs hatching - Testing and lastly, if this all becomes too overwhelming: - How to contract ModalAI to do your flexes for you - What info is needed - Our typical process and turn-around times ## Application Note Outline ### MIPI CSI Overview PENDING, TBD, etc etc... this will all take some time. Please check back often. ### VOXL MIPI CSI Architectures If there are certain topics you want to see first on that list above, please reach out on the [Forum](https://forum.modalai.com/category/15/image-sensors) and add the tag "Image Sensor Hardware Design and Integration Guide" in your topic so we can prioritize our responses --- Source: https://docs.modalai.com/transmitters/ # Transmitters ## Table of contents --- Source: https://docs.modalai.com/orqa-ghost/ # Orqa/GHST Setup

- [Here is a general link](https://orqafpv.freshdesk.com/support/home) to the Orqa help website if something isn't on this page. - The ImmersionRC Ghost Manual covers everything Ghost related; [here is a pdf](/docs/70-accessories/35-transmitters/files/Ghost-Manual-v2.5.pdf). - The [quickstart guide](/docs/70-accessories/35-transmitters/files/Ghost-Quick-Start-Guide.pdf) is also useful. ## **Orqa FPV.Ctrl with Ghost UberLite Module**
![Orqa FPV.Ctrl with Ghost UberLite module](/docs/70-accessories/35-transmitters/files/OrqaTransmitterA.png) ### **Key points: Updating, Pairing, Binding** This [FPV.ctrl Manual](/docs/70-accessories/35-transmitters/files/FPV.CTRL User Manual Rev.1.1.pdf) is a good source if something is not yet explained here.
#### **Updating** - Orqa has a guide for this already, hosted on [this Google Doc.](https://docs.google.com/document/d/14SjmFIHuKUN89edHd-gWJAc4zYP3Fi-y2eGyb7V_i3c/edit) [Here is a pdf download as well (version 1.0.8.3)](/docs/70-accessories/35-transmitters/files/Readme.pdf) - The Orqa Transmitter has a separate firmware from the UberLite Module, and that is the only thing able to be updated through the app. As of 02/2024, the current version for the Orqa Transmitter is 1.0.4. To get the up to date firmware on the UberLite Module, you will need to follow the steps in the pdf above.
#### **Pairing to App** - Will depend on your device of choice, connect your transmitter to your device via bluetooth. The app should walk you through this once opened.
#### **Binding** - Download Orqa FPV.ctrl app from your phone or tablet’s app store - Open app, connect to transmitter, and then enter the “Ghost Menu” - If this is a new receiver, it will automatically be in bind mode. To get a previously bound (to a different transmitter) receiver into bind mode, power up the receiver and then press the button next to the antenna connector within 30 seconds. The light should turn blue to indicate searching for transmitter. - Go through the settings and choose which modes you want, then click “Bind” - In this menu, choose which protocol you want, it is recommended to use GHST. Rx ID does not matter unless you will have multiple drones flying at once. - Click on “Start Bind.” After a brief moment it should say “Success” - Congratulations, you are now bound. It is recommended to restart the drone and transmitter/app at this point.
- **Alternative Bind**: If you do not want to use the app and do not have a need to change modes or settings of any sort, you can power on the Orqa transmitter, then press it’s button on the back (On the antenna module) and it should turn blue, indicating binding mode. Couple this with the binding mode of the receiver and they should both go through a series of colors and flashes before turning solid green each.
## **ImmersionRc Ghost xLite Module** ![ImmersionRC Ghost xLite module](/docs/70-accessories/35-transmitters/files/xLiteModuleHeader.jpeg) ### **Key points: Installing, Updating, Binding** #### **Installing** - This can be installed in transmitters with Lite module bays such as the Taranis X9 Lite or TBS Tango 2 (with module bay mod). Each transmitter is different, but will usually require you to remove the plastic cover of the external module bay, and then slide in the Ghost xLite Module. That is the installation. - To use the GHST Protocol, the transmitter will need to be updated to at least [OpenTX](https://www.open-tx.org/downloads) 2.3.10, which is the first firmware to support GHST transmission. (As of 02/2024, most up to date firmware is 2.3.15). Again, this updating process is entirely dependent on what transmitter you have. Most have detailed guides online. - Ghost is fully supported in 2.3.13 and later. - If not using a firmware at or beyond 2.3.10, SBus may be used on 2.3.09 and below by selecting SBus in the External Module protocol setting. #### **Updating** - To update the module, it must be connected to a Windows or MacOS computer with the Ghost Updater/Installer installed. ImmersionRC has ceased trading; firmware and utility downloads for Ghost products are now hosted by [Orqa Support](https://orqafpv.freshdesk.com/support/solutions). - On Windows, download (From the same place as above) and install the drivers, then open the installer. As of this guide, 1.8.0 is the latest version. - For Mac, download the installer, no drivers necessary. - Plug in the Module via usb, run the installer and verify the program sees the module on the correct COM port, this was automatic for me. Then click the ‘Update Ghost’ button. It should automatically have the latest firmware selected if connected to the internet.
![Ghost updater, firmware selection](/docs/70-accessories/35-transmitters/files/GhostUpdaterA.png) - It will take a minute or two to finish the update, then give a success message.
![Ghost updater, update complete](/docs/70-accessories/35-transmitters/files/GhostUpdaterB.png) - This will also give the module the ability to update any receivers it connects to the latest firmware as well. - If you have already bound to receivers with this module, rebind to them to update their software. If a receiver is on an older version, it will automatically update when binding. (This at one point was a separate step, but has been since streamlined and no longer needs that).
#### **Binding** - The Ghost PDF explains its capabilities well:
![Ghost transmitter binding menu](/docs/70-accessories/35-transmitters/files/BindingImg.png) ## **ImmersionRC Ghost JR Module**
![ImmersionRC Ghost JR module](/docs/70-accessories/35-transmitters/files/GhostJrModuleHeader.jpeg)
This is nearly identical to the xLite module, but fits into larger module bays and has a larger screen. Software and navigation are the same, with exception to settings involving the use of the two antennas compared to the xLite’s one. Installation should be the same as any other JR Module, simply remove the bay cover and push the module into the bay.
## **ImmersionRC Ghost Atto Receiver**
![ImmersionRC Ghost Atto receiver](/docs/70-accessories/35-transmitters/files/GhostAttoHeader.jpeg) This is the main Ghost receiver we use and will bind with any of the above systems. > ModalAI recommends ExpressLRS for new builds. An NDAA compliant ELRS transmitter and receiver are available on the [ModalAI website](https://www.modalai.com/); see the [M0184](/M0184/) receiver and [voxl-elrs](/voxl-elrs/). Migrating a Sentinel (or any VOXL 2 vehicle) from a Ghost Atto to an ELRS receiver on J19 requires one additional wire. The Ghost Atto uses a single data wire from the receiver to the VOXL RC RX pin; an ELRS receiver also needs the VOXL RC TX pin connected to the receiver RX. Power and ground wiring are otherwise identical. If the VOXL RC TX line is left disconnected, basic RC control still works, but firmware updates and configuration through `voxl-elrs` are not possible. Pre-crimped JST GH wires can be used to add the extra J19 connection. After rewiring, update `RC=` in `/etc/modalai/voxl-px4.conf` as described in [VOXL 2 RC Configs](/voxl2-rc-configs/#ghost-atto-vs-elrs-wiring-on-j19).
### **Connecting to Voxl/Flight Core** #### **Voxl 2** - Make sure you have the receiver connected to the proper port and pins (See “Pinout” below) - Before it will communicate with the Voxl, there will need to be a change in the “voxl-px4.conf” file - RC_Input needs to be set to “GHST” if it isn’t already. This file lives on the Voxl in /etc/modalai/ #### **Checking GHST Status on VOXL 2** Running `px4-qshell ghst_rc status` from the Linux shell while `voxl-px4` is running as a service prints only the qshell acknowledgement and no driver status. To read the driver status, stop the service, wait a few seconds, then start `voxl-px4` in the foreground in non-daemon mode: ```bash systemctl stop voxl-px4 voxl-px4 -d ``` Once the startup script completes and the `pxh>` prompt appears, run the status command from that prompt: ``` qshell ghst_rc status ``` If the status output shows that no bytes have been received over the UART, the receiver is not sending data to VOXL 2. Check the wiring to J19 (receiver TX to `RC_UART_RX`), confirm the receiver is actually bound to the transmitter, and if needed probe the receiver's transmit line with an oscilloscope. Exit with `shutdown` at the `pxh>` prompt and restart the service with `systemctl start voxl-px4`. #### **Voxl Flight / Flight Core V1/ Flight Core V2** - For Voxl-Flight: - Use MSA-D0001-1-02, plugged into J1003 and J1004, as shown here: ![Ghost receiver wired to J1003 and J1004 with MSA-D0001-1-02](/docs/70-accessories/35-transmitters/files/VoxlFlightCoreA.png) - Select “GHST” in QGroundControl under the “RC_INPUT_PROTO” parameter. - Pinout is as follows: (Connects to) - J1003 Pin 1- 5VDC (“+” on Atto) - J1003 Pin 3- GND (“G” on Atto) - J1004 Pin 2- USART6_TX (“S” on Atto)
- For Flight Core V1 and V2: - Not yet documented, coming soon.
## **Extra Information** ### **Updating, Pinout, LED Indicator Lights, Atto Dimensions, Misc**
#### **Updating** - If using any of the above transmitters, the Atto, Atto Duo, and Zepto receivers should all automatically check and update (if necessary) on a bind to an updated transmitter.
#### **Pinout** - This is the Pinout for the Atto, it is the same on the Zepto and Atto Duo. - The Atto has one U.FL antenna, Duo has two U.FL antennas and the Zepto has a standard MHF4 antenna. All of them are 2.4gHz. - Connecting to a Voxl 2 should be as follows: **Gnd to Gnd**, **5v to 5v** (It may tolerate 3.3v at potentially reduced performance, ModalAi has **not** tested this.) and **Serial Out to Rx**. - We have not had any issues with having **Tramp Telemetry** connected to **Tx**, which allows utilization of ELRS receivers as well without swapping cables if connecting via MCBL-89-01 using the plug and play [Harwin Rectangular Connector](https://www.digikey.com/en/products/detail/harwin-inc/M20-1060400/3728193). - ModalAi drones will only come with the Gnd, 5v, and S connected. T will be open.
![Ghost Atto receiver pinout](/docs/70-accessories/35-transmitters/files/AttoPinoutA.png)
#### **LED Indicator Lights:**
![Ghost Atto LED indicator table](/docs/70-accessories/35-transmitters/files/ReceiverLEDTable.png)
#### **RF Modes:** - ModalAi suggests using Race Mode for optimal performance (while still retaining some range and telemetry) in non long range scenarios. In some edge case use, normal mode will ‘lag' a bit as it uses a much lower frame rate. ![Ghost RF modes table](/docs/70-accessories/35-transmitters/files/RFModes.png)
#### **Physical Dimensions of Atto:**
![Ghost Atto physical dimensions](/docs/70-accessories/35-transmitters/files/AttoDimensions.png)
#### **Miscellaneous:** - Something ran into during testing is a short or total removal between two small pads between the 5v and Gnd pads. If these are messed up, the receiver will flash Red and then Yellow multiple times on repeat. This has been documented on [reddit](https://www.reddit.com/r/Multicopter/comments/mr8wym/immersionrc_ghost_atto_rx_undocummented_led/) by hobbyists.
![Location of the removed ferrite filter pads](/docs/70-accessories/35-transmitters/files/RemovedFerriteFilter.png) --- Source: https://docs.modalai.com/vtx-systems/ # VTX Systems ## Table of contents --- Source: https://docs.modalai.com/voxl2-with-third-party-vtx/ # VOXL2 with Third Party VTX ## VOXL2 / HDZero Freestyle 2 Integration Guide ### Hardware Using [M0151](/m0151/) addon board. ![VOXL 2 with M0125 and HDZero VTX wiring](/docs/70-accessories/40-vtx-systems/images/M0054-vtx-M0125-hdzero-v2.png) Using [M0130](/lte-io-breakout-usb-hub-datasheet/) addon board. ![VOXL 2 with M0130 and HDZero VTX wiring](/docs/70-accessories/40-vtx-systems/images/M0054-vtx-M0130-hdzero.png) ### Software - VOXL SDK 1.2.1 or newer required - For PX4 parameters, please reference [v1.14/other_helpers/msp_dp_osd.params](https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-px4-params/-/blob/master/params/v1.14/other_helpers/msp_dp_osd.params) for required params - Set `OSD` to `HDZERO` in `/usr/bin/voxl-px4` ## VOXL2 / Caddx Integration Guide ### Hardware Using [M0151](/m0151/) addon board. ![VOXL 2 with M0125 and Caddx VTX wiring](/docs/70-accessories/40-vtx-systems/images/M0054-vtx-M0125-caddx-v2.png) Using [M0130](/lte-io-breakout-usb-hub-datasheet/) addon board. ![VOXL 2 with M0130 and Caddx VTX wiring](/docs/70-accessories/40-vtx-systems/images/M0054-vtx-M0130-caddx.png) ### Software - VOXL SDK 1.2.1 or newer required - Set `OSD` to `DJI` in `/usr/bin/voxl-px4` ## VOXL2 / Vista Integration Guide ### Hardware TODO ### Software - VOXL SDK newer than 1.3.2 (1.3.3+) - For normal DJI OSD interface set `OSD` to `DJI` in `/usr/bin/voxl-px4` - For MSP DisplayPort OSD interface set `OSD` to `DJI_MSP_DP` in `/usr/bin/voxl-px4` --- Source: https://docs.modalai.com/cables/ # Cables ## Table of contents --- Source: https://docs.modalai.com/cable-datasheets/ # Cable Datasheets ModalAI has various cables used by its systems. Below captures the cables by part number and provides pinouts and other relevant information. The [Cable User Guide page](/cable-userguides/) has information on finding the right cable for your system and how to make your own cables with specific examples. Note when voltages are listed as "Source" that side is an Output voltage for use by a "Load" or device on the other side. Be sure to check that two sources are not shorted together without first verifying from ModalAI if they are from the same prime source. Weights provided in grams are subject to +/-0.25 gram tolerances.
## Table of contents ### Cable Catalog | Cable  (Click to jump to section) | Category | Description | Purchase | |-------------------------------------------------|--------------------------|-------------------------------------------------------------------|------------------------------------------------------------| | [MCK-M0018-1](/cable-datasheets/#mck-m0018-1-end-of-life) | Cable Kit | Flight Core Cable Kit ~ END OF LIFE ~ | EOL | | [MCK-M0087-2](/cable-datasheets/#mck-m0087-2) | Cable Kit | Flight Core V2 Cable Kit | EOL | | [MCBL-00001](/cable-datasheets/#mcbl-00001) | Power | VOXL Flight and VOXL/VOXL 2 to Power Module Cable | [Purchase](https://modalai.com/products/mcbl-00001) | | [MCBL-00003](/cable-datasheets/#mcbl-00003) | Power | Flight Core to Power Module Cable | [Purchase](https://modalai.com/products/mcbl-00003) | | [MCBL-00004](/cable-datasheets/#mcbl-00004) | Signal-PWM | PWM Output Cable | [Purchase](https://modalai.com/products/mcbl-00004) | | [MCBL-00005](/cable-datasheets/#mcbl-00005) | Signal-UART/RC+PWR | RC Input Cable (Spektrum) | [Purchase](https://modalai.com/products/mcbl-00005) | | [MCBL-00007](/cable-datasheets/#mcbl-00007) | Signal-UART | VOXL to Flight Core/VOXL ESC Serial Cable | [Purchase](https://modalai.com/products/mcbl-00007) | | [MCBL-00008](/cable-datasheets/#mcbl-00008) | Signal-UART | VOXL to Flight Controller TELEM port | [Purchase](https://modalai.com/products/mcbl-00008) | | [MCBL-00009](/cable-datasheets/#mcbl-00009) | USB | 4-pin JST GH to USBA Female Cable | [Purchase](https://modalai.com/products/mcbl-00009) | | [MCBL-00010](/cable-datasheets/#mcbl-00010) | USB | 4-pin JST GH to micro USB Female Cable | [Purchase](https://modalai.com/products/mcbl-00010) | | [MCBL-00011](/cable-datasheets/#mcbl-00011-1) | Power | VOXL-PM-Y for Flight Deck R0/R1 Cable | [Purchase](https://modalai.com/products/mcbl-00011) | | [MCBL-00013](/cable-datasheets/#mcbl-00013) | Signal-UART | VOXL Flight to VOXL ESC Cable (cross over) | | | [MCBL-00014](/cable-datasheets/#mcbl-00014) | Signal-UART | Flight Core to VOXL ESC Cable (cross over) | [Purchase](https://www.modalai.com/products/mcbl-00014-1) | | [MCBL-00015](/cable-datasheets/#mcbl-00015) | Signal-Multi | 4pin-JST-GH-to-4pin-JST-GH cable | [Purchase](https://modalai.com/products/mcbl-00015) | | [MCBL-00016](/cable-datasheets/#mcbl-00016) | Signal-Multi | 6pin-JST-GH-to-pigtail break out cable | [Purchase](https://modalai.com/products/mcbl-00016) | | [MCBL-00017](/cable-datasheets/#mcbl-00017) | Power | 5V Stand Alone Dongle Cable, v1 | | | [MCBL-00018](/cable-datasheets/#mcbl-00018) | Signal-UART/RC+PWR | RC Input Cable, Servo (S.Bus, FrSky) | EOL | | [MCBL-00020](/cable-datasheets/#mcbl-00020) | Signal-Multi | USB Cable, 4-pin Molex Picoblade to 4-pin JST-GH, ArduCam | | | [MCBL-00021](/cable-datasheets/#mcbl-00021) | Signal-UART/RC+PWR | RC Input Cable, FrSky R-XSR to Flight Core / VOXL Flight | | | [MCBL-00022](/cable-datasheets/#mcbl-00022) | USB | USB3 10-pin JST cable | [Purchase](https://modalai.com/products/mcbl-00022) | | [MCBL-00024](/cable-datasheets/#mcbl-00024) | Power | Power Module to Stand Alone Modem Cable | [Purchase](https://modalai.com/products/mcbl-00024) | | [MCBL-00025](/cable-datasheets/#mcbl-00025) | Signal-UART | LTE v2 to Flight Core Telemetry | | | [MCBL-00028](/cable-datasheets/#mcbl-00028) | Signal-UART/GNSS+I2C+PWR | Seeker GPS cable | | | [MCBL-00029](/cable-datasheets/#mcbl-00029) | Signal-UART | VOXL 2 or QC Flight RB5 to ESC cable / VOXL 2 to ESC | [Purchase](https://modalai.com/products/mcbl-00029) | | [MCBL-00031](/cable-datasheets/#mcbl-00031) | Signal-Multi | 6 pin-JST-GH-to 6-pin-JST-GH passthrough, Breakout | [Purchase](https://modalai.com/products/mcbl-00031) | | [MCBL-00041](/cable-datasheets/#mcbl-00041) | USB | 4-pin JST GH to USBA Female Cable | [Purchase](https://modalai.com/products/mcbl-00041) | | [MCBL-00048](/cable-datasheets/#mcbl-00048) | Signal-UART/GNSS+I2C+PWR | Flight Core v2 DroneCode Compliant 6-pin JST to 6-pin SHR | | | [MCBL-00061](/cable-datasheets/#mcbl-00061) | Signal-UART/RC+PWR | VOXL 2 to VOXL 2 I/O | [Purchase](https://modalai.com/products/mcbl-00061) | | [MCBL-00062](/cable-datasheets/#mcbl-00062) | Power | Flight Core v2 Power Cable | [Purchase](https://modalai.com/products/mcbl-00062) | | [MCBL-00063](/cable-datasheets/#mcbl-00063) | Signal-UART | Flight Core v2 UART ESC Cable | | | [MCBL-00064](/cable-datasheets/#mcbl-00064) | Signal-UART/RC+PWR | VOXL 2 IO RC Input Cable, Servo (S.Bus, FrSky) | [Purchase](https://modalai.com/products/mcbl-00064) | | [MCBL-00065](/cable-datasheets/#mcbl-00065) | Signal-UART/RC+PWR | VOXL 2 IO RC Input Cable, FrSky S.BUS R-XSR | | | [MCBL-00066](/cable-datasheets/#mcbl-00066) | Signal-UART | VOXL 2 Add-on UART 6-pin JST to FlightCore 6-pin JST (cross over) | [Purchase](https://modalai.com/products/mcbl-00066) | | [MCBL-00067](/cable-datasheets/#mcbl-00067) | Signal-UART | VOXL 2 Add-on UART 4-pin JST to FlightCore 6-pin JST (straight) | [Purchase](https://modalai.com/products/mcbl-00067) | | [MCBL-00068](/cable-datasheets/#mcbl-00068) | USB | VOXL 2 4-pin JST USB to Doodle Labs Helix | EOL | | [MCBL-00069](/cable-datasheets/#mcbl-00069) | Signal-UART | VOXL 2 ESC 4-pin JST UART to Custom TMotor F55A ESC | EOL | | [MCBL-00070](/cable-datasheets/#mcbl-00070) | Signal-Multi | VOXL 2 12-Pin JST GH Breakout Cable | | | [MCBL-00071](/cable-datasheets/#mcbl-00071) | Signal-Multi/USB | 4-Pin JST GH Breakout Cable | | | [MCBL-00072](/cable-datasheets/#mcbl-00072) | USB | VOXL 2 10-pin JST USB to Boson RHP-BOS-VPC3-IF | [Purchase](https://modalai.com/products/mcbl-00072) | | [MCBL-00076](/cable-datasheets/#mcbl-00076) | Signal-UART/GNSS+RC+PWR | Starling/Sentinel GPS + RC UART cable | [Purchase](https://modalai.com/products/mcbl-00076) | | [MCBL-00078](/cable-datasheets/#mcbl-00078) | Power | XT30U-M to Pigtail 150mm | | | [MCBL-00080](/cable-datasheets/#mcbl-00080) | USB | VOXL 2 10-pin JST USB3 to 4-pin JST USB2 | [Purchase](https://modalai.com/products/mcbl-00080) | | [MCBL-00081](/cable-datasheets/#mcbl-00081) | Signal-UART | VOXL 2 Mini 12-pin JST to 6-pin DF13 ESC UART | | | [MCBL-00082](/cable-datasheets/#mcbl-00082) | Signal-UART | VOXL 2 Mini 12-pin JST to 4-pin JST ESC UART | | | [MCBL-00083](/cable-datasheets/#mcbl-00083) | Signal-Multi | VOXL 2 8-Pin JST GH Breakout Cable | | | [MCBL-00085](/cable-datasheets/#mcbl-00085) | USB+PWR | VOXL 2 10-Pin JST USB to Doodle Labs RM-2025-62M3 Cable | [Purchase](https://modalai.com/products/mcbl-00085) | | [MCBL-00086](/cable-datasheets/#mcbl-00086) | Signal-UART/GNSS+RC+PWR | Sentinel Holybro (Pixhawk) GPS + RC UART Cable | | | [MCBL-00088](/cable-datasheets/#mcbl-00088) | Power | XT60-M to Pigtail 150mm | | | [MCBL-00089](/cable-datasheets/#mcbl-00089) | Signal-UART/GNSS+ESC+RC | Stinger ("Full VOXL 2 Mini Breakout") GPS + ESC + RC Cable | [Purchase](https://modalai.com/products/mcbl-00089) | | [MCBL-00090](/cable-datasheets/#mcbl-00090) | USB-to-UART | ModalAI USB to Serial UART JST-SH Cable (Console Debug) | | | [MCBL-00091](/cable-datasheets/#mcbl-00091) | USB-to-UART | ModalAI USB to Serial UART JST-GH Cable (ESC Tools/HWIL) | | | [MCBL-00092](/cable-datasheets/#mcbl-00092) | Power | JST RCY Receptacle Cable Assy Red/Black | | | [MCBL-00093](/cable-datasheets/#mcbl-00093) | Power | JST RCY Plug Cable Assy Red/Black | | | [MCBL-00094](/cable-datasheets/#mcbl-00094) | USB | 10-Pin JST GH USB2 Breakout Cable/Pigtails | | | [MCBL-00095](/cable-datasheets/#mcbl-00095) | Power | VOXL-PM-Y for Legacy ToF M0169 | [Purchase](https://modalai.com/products/mcbl-00095) | | [MCBL-00098](/cable-datasheets/#mcbl-00098) | Signal-Multi | 3-Pin JST GH Sub-Pop 1&3 Breakout Cable | | | [MCBL-00099](/cable-datasheets/#mcbl-00099) | Signal-Multi | 4-Pin JST GH Sub-Pop 1&4 Breakout Cable | | | [MCBL-00100](/cable-datasheets/#mcbl-00100) | Signal-Multi | 4-Pin JST GH Sub-Pop 2&3 Breakout Cable | | | [MCBL-00103](/cable-datasheets/#mcbl-00103) | Power | XT60EW-M Bulkhead to Pigtail 80mm | | | [MCBL-00104](/cable-datasheets/#mcbl-00104) | USB | ModalAI Boson USB Host Programming Cable | | | [MCBL-00105](/cable-datasheets/#mcbl-00105) | Signal | 8-Pin JST SH to 8-Pin JST SH Extension | | | [MCBL-00106](/cable-datasheets/#mcbl-00106) | Power | XT30U-F to Banana Plugs 300mm | | | [MCBL-00107](/cable-datasheets/#mcbl-00107) | USB | VOXL 2 4-pin JST USB to Boson RHP-BOS-VPC3-IF | | | [MCBL-00109](/cable-datasheets/#mcbl-00109) | Power | XT30U-F Test Mode Power Jumper | [Purchase](https://modalai.com/products/mcbl-00109) | | [MCBL-00110](/cable-datasheets/#mcbl-00110) | Power | XT60-M to Pigtail 120mm | | | [MCBL-00111](/cable-datasheets/#mcbl-00111) | Signal-Multi | 8pin-JST-GH-to-8pin-JST-GH cable | | | [MCBL-00112](/cable-datasheets/#mcbl-00112) | Power-Multi | Molex 4-Pin MicroOne to Pigtail, 100mm | | | [MCBL-00113](/cable-datasheets/#mcbl-00113) | Power | Molex 4-Pin MicroOne to Pigtail, Sub-Pop 1&2, 100mm | | | [MCBL-00114](/cable-datasheets/#mcbl-00114) | Power | JST SFHR-L to SFHR-L VBAT Extension Cable | | | [MCBL-00115](/cable-datasheets/#mcbl-00115) | Power | JST SFHR-L to XT30U-M VBAT Extension Cable | | | [MCBL-00116](/cable-datasheets/#mcbl-00116) | Power | JST SFHR-L to XT60-M VBAT Extension Cable | | | [MCBL-00117](/cable-datasheets/#mcbl-00117) | Signal-UART/VTX-PWR | VOXL 2 MINI UART + VBAT to HD-Zero VTX Cable, 100mm | | | [MCBL-00118](/cable-datasheets/#mcbl-00118) | Signal-UART/VTX-PWR | FC/OSD UART + VBAT to HD-Zero VTX Cable, 100mm | | | [MCBL-00119](/cable-datasheets/#mcbl-00119) | Signal-PWM/PWR | LED bar Cable PWM Pigtails SYR + SL, 100mm | | | [MCBL-00120](/cable-datasheets/#mcbl-00120) | Signal | VOXL 2 8-Pin JST GH SPI Adapter Cable to JST 6-Pin SH | | | [MCBL-00121](/cable-datasheets/#mcbl-00121) | USB | 10-pin JST GH to USBA Female Cable | | | [MCBL-00122](/cable-datasheets/#mcbl-00122) | Signal-Multi | 6-Pin JST GH Sub-Pop 2, 3, & 6 Breakout Cable | | | [MCBL-00123](/cable-datasheets/#mcbl-00123) | Signal-Multi | 2-Pin Molex SL Receptacle Breakout Cable | | | [MCBL-00124](/cable-datasheets/#mcbl-00124) | Signal-Multi | 2-Pin Molex SL Plug Breakout Cable | | | [MCBL-00125](/cable-datasheets/#mcbl-00125) | Power | JST SFHR-T-K to SFHR-T-K 3.8V 1S VBAT Extension | | | [MCBL-00126](/cable-datasheets/#mcbl-00126) | Power | JST SFHR-T-K breakout to Pigtail, 100mm | | | [MCBL-00127](/cable-datasheets/#mcbl-00127) | Power | JST SFHR-L to Molex SL Plug VBAT Power Cable | | | [MCBL-00128](/cable-datasheets/#mcbl-00128) | Signal | Sparrow 10-pin JST SH to Dual ToF Pill 5-pin SH | | | [MCBL-00129](/cable-datasheets/#mcbl-00129) | Signal-UART/ESC+RC | Stinger (VOXL 2 Mini) ESC + RC Cable | | | [MCBL-00130](/cable-datasheets/#mcbl-00130) | Signal | VOXL 2 Dronecode 6-pin JST GH I2C to 3-Pin JST SH | | | [MCBL-00131](/cable-datasheets/#mcbl-00131) | Signal | 3-Pin JST SH to 3-Pin JST SH Straight Through | | | [MCBL-00132](/cable-datasheets/#mcbl-00132) | Power | Molex 4-Pin MicroOne to JST SFHR-T-K 3.8V 1S VBAT, 80mm | | | [MCBL-00133](/cable-datasheets/#mcbl-00133) | Signal-Multi | 4pin-JST-GH-to-4pin-JST-GH Cross-Over cable, 50mm | | | [MCBL-00137](/cable-datasheets/#mcbl-00137) | Power | JST SFHR-L VBAT Pigtail Cable, 100mm | | | [MCBL-00138](/cable-datasheets/#mcbl-00138) | Signal-RC/PWM Type 2-B | Stinger: PWM Cable Type 2-B Receptacle | | | [MCBL-00146](/cable-datasheets/#mcbl-00146) | Power | XT60-M to Dual JST SFHR-L VBAT Y-Cable, 50mm | | | [MCBL-00151](/cable-datasheets/#mcbl-00151) | Signal | VOXL 2 8-Pin JST GH UART to BraveF7 OSD Cable, 75mm | | | [MCBL-00152](/cable-datasheets/#mcbl-00152) | USB | 4pin-JST GH to 4pin-JST SH cable, 50mm | | | [MCBL-00159](/cable-datasheets/#mcbl-00159) | Power | Molex Mini-SPOX to 6-Pin JST GH for Doodle RM-2025-62M3 | | | [MCBL-00160](/cable-datasheets/#mcbl-00160) | Signal | VOXL 2 Mini 8-pin JST GH UART to DroneCode 6-pin JST SH | | | [MCBL-00162](/cable-datasheets/#mcbl-00162) | USB | USB2 Type-A Male Data Only Cable to JST GH 4-pin, 200mm | | | [MCBL-00211](/cable-datasheets/#mcbl-00211) | Power | VOXL-PM-Y for FCv2 Flight Deck Cable | | | [MCBL-00218](/cable-datasheets/#mcbl-00218) | Signal-UART/RC+PWR | RC Input Cable, Servo (S.Bus, FrSky), Flight Core V2 | [Purchase](https://modalai.com/products/mcbl-00218) | | [MCBL-00221](/cable-datasheets/#mcbl-00221) | Signal-UART/RC+PWR | RC Input Cable, FrSky R-XSR to Flight Corev2 | | ### Related Accessories | Accessories | Description | |--- |--- | | [MCCA-M0022](https://modalai.com/collections/accessories/products/flight-core-pwm-output-cable-and-break-out-board)) | PWM Breakout PCB | --- ## MCK-M0018-1 END-OF-LIFE ![MCK-M0018-1](/images/other-products/cables/FC-CBL-R1-1.jpg) Description: - Flight Core Cable Kit Contains: - PWM Break Out Board ([MCCA-M0022](https://modalai.com/collections/accessories/products/flight-core-pwm-output-cable-and-break-out-board)) - [MCBL-00004](/cable-datasheets/#mcbl-00004) - PWM breakout cable - [MCBL-00005](/cable-datasheets/#mcbl-00005) - RC Input Cable - [MCBL-00010](/cable-datasheets/#mcbl-00010) - JST to microUSB female (MCBL-00006, not provided, shown in image) - [MCBL-00007](/cable-datasheets/#mcbl-00007) - VOXL to Flight Core Serial Cable (provides MAVLink connection over UART between VOXL and Flight Core) Buy: - Available on the ModalAI shop --- ## MCK-M0087-2 Description: - Flight Core V2 Cable Kit, See Contents List Below: Contains: - PWM Break Out Board ([MCCA-M0022](https://modalai.com/collections/accessories/products/flight-core-pwm-output-cable-and-break-out-board)) - [MCBL-00004](/cable-datasheets/#mcbl-00004) - PWM breakout cable - [MCBL-00005](/cable-datasheets/#mcbl-00005) - RC Input Cable - [MCBL-00008](/cable-datasheets/#mcbl-00008) - VOXL to Flight Controller TELEM port - [MCBL-00010](/cable-datasheets/#mcbl-00010) - JST to microUSB female - [MCBL-00016](/cable-datasheets/#mcbl-00016) - 6pin-JST-GH-to-pigtail break out cable - [MCBL-00062](/cable-datasheets/#mcbl-00062) - Flight Core v2 Power Cable - [MCBL-00063](/cable-datasheets/#mcbl-00063) - Flight Core v2 UART ESC Cable Buy: - Available on the ModalAI shop --- ## MCBL-00001 ![MCBL-00001](/images/other-products/cables/mcbl-1.jpg) Description: - VOXL Flight and VOXL to Power Module Cable - Note there are three variants, -1, -3, and -4. - - "-1" is nominally for sale and part of our power module kits and larger drones, 125mm. - - MCBL-00001-1: VOXL Flight and VOXL/VOXL 2 to Power Module Cable - - "-3" and "-4" are shorter lengths (40mm and 70mm respectively) embedded in complete drone kits, but can be made available for purchase upon request - - MCBL-00001-3: VOXL Flight and VOXL/VOXL 2 to Power Module Cable, 40mm - - MCBL-00001-4: VOXL Flight and VOXL/VOXL 2 to Power Module Cable, 70mm Where used: - [VOXL Flight J1013](/voxl-flight-datasheet-connectors/#j1013---5v-dc-power-input-i2c3-to-power-cable-apm) to [VOXL PM v2 or VOXL PM v3](/power-module-v3-datasheet/) - [VOXL J10](/voxl-datasheets-connectors/) to [VOXL PM v2 or VOXL PM v3](/power-module-v3-datasheet/) - Included in several drone platforms, various lengths Details: | Component | Details | |--- |--- | | Connector A | Molex, 0050375043 | | Connector B | Molex, 0050375043 | | Length | 125mm (-1 variant), 40mm (-3 variant), 70mm (-4 variant) | | Insulator | Silicon | | Color | Black | | Gauge | 20 AWG | | Weight | 4.5 grams (-1 variant) | Pinout: Note this cable is symmetric and can be used in either direction where the power module is the voltage source and the VOXL/VOXLFlight/VOXL 2 are the loads for pin 1. | A | | B | | |--- |--- |--- |--- | | 1 | 5V DC | 1 | 5V DC | | 2 | GND | 2 | GND | | 3 | I2C3_SCL | 3 | PM_SCL | | 4 | I2C3_SDA | 4 | PM_SDA | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00001-1%20Drawing%20v3.pdf), [See -3 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00001-3%20Drawing%20v2.pdf), and [See -4 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00001-4%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00003 ![MCBL-00003](/images/other-products/cables/mcbl-3.jpg) Description: - Flight Core to Power Module Cable Where Used: - [Flight Core J6](/flight-core-datasheet-connectors/#j6---voxl-power-management-input--expansion) Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-06V-S | | Connector B | Molex, 0050375043 | | Length | 120mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | 5V DC (Load) | 1 | 5V DC (Source) | | 2 | - | - | | | 3 | - | - | | | 4 | EXP_I2C_SCL | 3 | PM_SCL | | 5 | EXP_I2C_SDA | 4 | PM_SDA | | 6 | GND | 2 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00003%20Drawing%20v7.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00004 ![MCBL-00004](/images/other-products/cables/mcbl-4.jpg) Description: - PWM Output Cable Where Used: - [VOXL Flight J1007](/voxl-flight-datasheet-connectors/#j1007---8-channel-pwm--4-channel-dshot-esc-output-connector) or [Flight Core J7](/flight-core-datasheet-connectors/#j7---8-channel-pwm-output-connector-for-pwm-or-dshot-escs) to PWM Break Out Board ([MCCA-M0022](https://modalai.com/collections/accessories/products/flight-core-pwm-output-cable-and-break-out-board)) Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-10V-S | | Connector B | JST, GHR-10V-S | | Length | 120mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: Note this cable is symmetric and can be used in either direction with the FlightCore side providing 5VDC voltage as the Source for reference/monitor circuits only (cannot power a servo/BLDC). | A | | B | | |--- |--- |--- |--- | | 1 | 5V DC | 1 | 5V DC | | 2 | PWM_CH0 | 2 | PWM_CH0 | | 3 | PWM_CH1 | 3 | PWM_CH1 | | 4 | PWM_CH2 | 4 | PWM_CH2 | | 5 | PWM_CH3 | 5 | PWM_CH3 | | 6 | PWM_CH4 | 6 | PWM_CH4 | | 7 | PWM_CH5 | 7 | PWM_CH5 | | 8 | PWM_CH6 | 8 | PWM_CH6 | | 9 | PWM_CH7 | 9 | PWM_CH7 | | 10 | GND | 10 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00004%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00005 ![MCBL-00005](/images/other-products/cables/mcbl-5.jpg) Description: - RC Input Cable (Spektrum) Where Used: - [VOXL Flight J1004](/voxl-flight-datasheet-connectors/#j1004---rc-input--spektrumsbususart6-connector) or [Flight Core J12](/flight-core-datasheet-connectors/#j12---rc-input--usart6-connector) to RC Receiver (e.g. Spektrum) Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S | | Connector B | JST, ZHR-3 | | Length | 150mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | 3.3VDC (Source) | 1 | 3.3VDC (Load) | | 2 | USART6_TX |- | NC | | 3 | SPEKTRUM RX (3.3V), SBus RX (3.3V), USART6_RX | 3 | SPEKTRUM TX (3.3V), SBus TX (3.3V) | | 4 | GND | 2 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00005%20Drawing%20v7.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00007 ![MCBL-00007](/images/other-products/cables/mcbl-7.jpg) Description: - VOXL to Flight Core Serial Cable (provides MAVLink connection over UART between VOXL and Flight Core) - VOXL to VOXL ESC Cable (straight through) - No Power Connection, Signals + GND connections only Where Used: - [Flight Core J1](/flight-core-datasheet-connectors/#j1---voxl-communications-interface-connector) to [VOXL J12](/voxl-datasheets-connectors/) - [VOXL J12](/voxl-datasheets-connectors/) to VOXL ESC (J2 on VOXL ESC V2/V3, M0027/M0049/M0117/M0134) Details: | Component | Details | |--- |--- | | Connector A | DF13-6S-1.25C (Flight Core) | | Connector B | DF13-6S-1.25C (VOXL) | | Length | 90mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | - | 1 | | | 2 | FC RX | 2 | VOXL TX | | 3 | FC TX | 3 | VOXL RX | | 4 | - | 4 | - | | 5 | GND | 5 | GND | | 6 | - | 6 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00007%20Drawing%20v7.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00008 ![MCBL-00008](/images/other-products/cables/mcbl-8.jpg) Description: - VOXL to Flight Controller TELEM port (Dronecode Compliant) - No Power Connection, Signals + GND connections only Where Used: - [VOXL J12](/voxl-datasheets-connectors/) to Flight Controller TELEM, such as [Flight Core J5](/flight-core-datasheet-connectors/#j5---telemetry-connector) or other Dronecode Compliant TELEM ports Details: | Component | Details | |--- |--- | | Connector A | DF13-6S-1.25C (VOXL) | | Connector B | JST, GHR-06V-S (Flight Core) | | Length | 90mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | - | - | | | 2 | VOXL TX | 3 | FC RX | | 3 | VOXL RX | 2 | FC TX | | 4 | - | - | - | | 5 | GND | 6 | GND | | 6 | - | | - | --- ## MCBL-00009 ![MCBL-00009](/images/other-products/cables/mcbl-9.jpg) Description: - 4-pin JST to USBA Female/Receptacle Cable Where Used: - Used for connecting ModalAI USB Hosts (JST side, examples below) to USB Peripherals (Type A side) - [LTE Modem and USB Hub Addon J16 and J17](/lte-modem-and-usb-add-on-datasheet/) to USB peripheral device - [USB Expander and Debug Board](/usb-expander-and-debug-datasheet/) to USB peripheral device - [Microhard and USB Hub Add-on USB J16 and J17](/microhard-add-on-datasheet/) to USB peripheral device Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S) | | Connector B | USB 2.0 Type A Female/Receptacle | | Length | ~60mm | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS (Source side) | 1 | VBUS (Load side) | | 2 | DATA_M | 2 | D- | | 3 | DATA_P | 3 | D+ | | 4 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00009-1%20Drawing%20v15.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00010 ![MCBL-00010](/images/other-products/cables/mcbl-10.jpg) Description: - 4-pin JST to micro USB Female/Receptacle Cable - Used for connecting USB Hosts such as a PC (Micro USB connector side) to ModalAI USB Peripherals (JST side). - Note: Micro USB side requires a standard Type-A to MicroUSB cable/adapter depending on your system setups - Flight Core (PX4) to micro USB cable to QGroundControl (MAVLink) - Microhard Standalone Modem to micro USB cable to host computer Where Used: - [VOXL Flight J1006](/voxl-flight-datasheet-connectors/#j1006---usb-connector) or [Flight Core J3](/flight-core-datasheet-connectors/#j3---usb-connector) to micro USB cable to Host Computer with QGroundControl - [Microhard USB Carrier Board USB2 Host port](/microhard-usb-carrier/) to micro USB cable to Host Computer Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S | | Connector B | Micro USB 2.0 Female | | Length | ~60mm | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS (Load) | 1 | VBUS (Source) | | 2 | DATA_M | 2 | D- | | 3 | DATA_P | 3 | D+ | | - | | 4 | ID (unused) | | 4 | GND | 5 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00010-1%20Drawing%20v10.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00011-1 ![MCBL-00011-1](/images/other-products/cables/mcbl-11.jpg) Description: - VOXL-PM-Y for Flight Deck R0/R1 Cable - Powers both VOXL and FlightCore from one Power Module, with the I2C bus for power monitoring going to FlightCore Where Used: - VOXL-m500-R1 - [VOXL J1](/voxl-datasheets-connectors/) + [Flight Core J6](/flight-core-datasheet-connectors/#j6---voxl-power-management-input--expansion)to [VOXL PM v2 or VOXL PM v3](/power-module-v3-datasheet/) Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-06V-S (Flight Core side, 4 wires)| | Connector B | Molex, 0050375043 (Power Module side, 4 wires) | | Connector C | Molex, 0050375043 (VOXL side, 2 wires) | | Length | 120mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 22AWG (B-to-C)/ 26AWG (B-to-A) | Pinout: | C | VOXL | B | VOXL PM | A | Flight Core | |--- |--- |--- |--- |--- |--- | | 1 | 5V DC (Load) | 1 | 5V DC (Source) | 1 | 5V DC (Load) | | 2 | GND | 2 | GND | 6 | GND | | - | | 3 | SCL | 4 | EXP_I2C_SCL | | - | | 4 | SDA | 5 | EXP_I2C_SDA | --- ## MCBL-00013 ![MCBL-00013](/images/other-products/cables/mcbl-13.jpg) Description: - VOXL Flight to VOXL ESC V2/V3 Cable (cross over) - This is a UART RX/TX cross-over version of MCBL-00007 for Hirose DF13-6P - No Power Connection, Signals + GND connections only Where Used: - [VOXL Flight J1002](/voxl-flight-datasheet-connectors/#j1002---uart-esc-uart2telem3-interface-connector) to VOXL ESC (J2 on VOXL ESC V2/V3, M0027/M0049/M0117/M0134) Details: | Component | Details | |--- |--- | | Connector A | DF13-6S-1.25C (VOXL Flight) | | Connector B | DF13-6S-1.25C (ESC) | | Length | 100mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | VOXL Flight | B | VOXL ESC V2/V3 | |--- |--- |--- |--- | | 1 | - | - | | | 2 | RX | 3 | TX | | 3 | TX | 2 | RX | | 4 | - | - | - | | 5 | GND | 5 | GND | | 6 | - | - | - | --- ## MCBL-00014 ![MCBL-00014](/images/other-products/cables/mcbl-14.jpg) Description: - Flight Core to VOXL ESC Cable (cross over) - This is just like MCBL-00013 but one of the 6-pin DF13's is replaced by an 8-pin for FlightCore J4 - No Power Connection, Signals + GND connections only Where Used: - Flight Core J4 to VOXL ESC (J2 on VOXL ESC V2/V3, M0027/M0049/M0117/M0134) - Connecting ESC's' to VOXL CAM Flight Core (on Seeker Drone, for example) Details: | Component | Details | |--- |--- | | Connector A | DF13-8S-1.25C (Flight Core) | | Connector B | DF13-6S-1.25C (ESC) | | Length | 100mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | Flight Core | B | VOXL ESC V2/V3 | |--- |--- |--- |--- | | 1 | - | - | | | 2 | RX | 3 | TX | | 3 | TX | 2 | RX | | 4 | - | - | - | | 5 | GND | 5 | GND | | 6 | - | - | - | | 7 | - | | 8 | - | --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00015 ![MCBL-00015](/images/other-products/cables/mcbl-15.jpg) Description: - 4pin-JST-to-4pin-JST cable (straight through 1:1) Where Used: - VOXL USB Add-On boards to Stand Alone Modem Boards, ESC UART from VOXL 2 to Mini-ESC (M0129) - Conforms to all ModalAI 4-pin JST USB2.0 formats, either Host (VBUS, Pin1, is a source) or Peripheral (VBUS, Pin1, is a load) - Great item to have for making your own cables!! - Note there are four variants, -1, -2, -3, and -4. - - "-1" is nominally for sale, 100mm. - - "-2" is a longer length, 150mm, embedded in complete drone kits, but can be made available for purchase upon request - - "-3" is a shorter length, 50mm, embedded in Starling drone kits, but can be made available for purchase upon request - - "-4" is the shortest length at 15mm and can be made available for purchase upon request. - - - Note the -4 variant has no label on it due to its size. Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S | | Connector B | JST, GHR-04V-S | | Length | 100mm (-1 variant), 150mm (-2 variant), 50mm (-3 variant), 15mm (-4 variant) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.1 grams (-1 variant), 1.4 grams (-2 variant), 0.7 grams (-3 variant), 0.4 grams (-4 variant) | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | Pin1 | 1 | Pin1 | | 2 | Pin2 | 2 | Pin2 | | 3 | Pin3 | 3 | Pin3 | | 4 | Pin4 | 4 | Pin4 | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00015-1%20Drawing%20v2.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00015-2%20Drawing%20v2.pdf), [See -3 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00015-3%20Drawing%20v2.pdf), [See -4 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00015-4%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00016 ![MCBL-00016](/images/other-products/cables/mcbl-16.jpg) Description: - 6pin-JST-to-pigtail break out cable Where Used: - M0048 ICM42688 IMU Breakout Board - Any ModalAI 6-pin JST where soldering or custom harnesses are needed - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-06V-S) | | Connector B | None | | Length | 100mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.4 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | 4 | (pigtail) | | 5 | | 5 | (pigtail) | | 6 | | 6 | (pigtail) | --- ## MCBL-00017 ![MCBL-00017](/images/other-products/cables/mcbl-17.jpg) Description: - Power Supply (not supplied) to Stand Alone Modem Dongle - Connector mates to the Red JST J8 on Microhard boards, or J3 on Sierra LTE V2 modem boards - Tinned leads on the other side allow soldering or converting to pins as needed by the customer. - NOTE: Cut the wire length to 150mm or less if anticipating needing the full 4A capable of these designs (high power radio modes + all USB connectors used). Refer to the Where Used links below for power consumption estimates. Where Used: - [MDK-M0030-1-02 J3](/lte-modem-v2-dongle-datasheet/#j3---5vdc-power-in) - [MDK-M0030-1-01 J3](/lte-modem-v2-dongle-datasheet/#j3---5vdc-power-in) - [MA-SA-2 J3](/microhard-usb-carrier/) Details: | Component | Details | |--- |--- | | Connector A | [SFHR-02V-R](https://www.digikey.com/en/products/detail/jst-sales-america-inc/SFHR-02V-R/2328483) | | Connector B | None/Tinned ~10mm | | Length | 300 mm | | Insulator | PVC (flexible) | | Color | Red/Black | | Gauge | 22 AWG | | Pre-crimped | [ALEALEA22K102](https://www.digikey.com/en/products/detail/jst-sales-america-inc/ALEALEA22K102/9923160) | Pinout: | A | Wire | B |Modem | |--- |--- |--- |--- | | 1 | RED (Source) | 1 | VDCIN_5V (Load) | | 2 | BLACK | 2 | GND | --- ## MCBL-00018 ![MCBL-00018](/images/other-products/cables/mcbl-18.jpg) Description: - RC Input (S.Bus, FrSky) - Picks up Power on Red+Black, and Receive Signal on Orange from FlightCore or VOXLFlight to a R/C receiver 3-pin 0.1" hobby format - - ModalAI conforms to the notion of Pin 1 = Signal, Pin 2 = 5V, & Pin 3 = GND for the 3-pin hobby format. Please notify us if you see anything here to the contrary. - Note: This is only intended for remote receivers and cannot power high current servos or BLDCs Where Used: - 4-pin JST (connector B): [VOXL Flight J1004](/voxl-flight-datasheet-connectors/#j1004---rc-input--spektrumsbususart6-connector) or [Flight Core J12](/flight-core-datasheet-connectors/#j12---rc-input--usart6-connector) and 3-pin JST (connector A): [VOXL Flight J1003](/voxl-flight-datasheet-connectors/#j1003---ppm-rc-in) or [Flight Core J9](/flight-core-datasheet-connectors/#j9---ppm-rc-in) to 3-pin Harwin M20 Receptacle (connector C) to RC Receiver (e.g. S.Bus/FrSky) - Note: This is not for Spektrum, which requires +3.3V. For Spektrum, please see MCBL-00005 | Component | Details | |--- |--- | | Connector A | JST GHR-03V-S, for +5V Power/GND | | Connector B | JST GHR-04V-S, for UART_RX signal, +3.3V levels | | Connector C | Harwin M20-1060300, CONN RCPT HSG 3POS 2.54mm (or similar) | | Length | 150 mm | | Insulator | PVC (flexible) | | Color | Red/Black/Orange | | Gauge | 26 AWG | Pinout: | A | Power | C | RC Receiver | B | Signal | |--- |--- |--- |--- |--- |--- | | 1 | RED (5V, Source) | 2 | 5V DC (Load) | | | | 2 | | 1 | S.Bus/DSMX (Orange) | 3 | S.Bus/DSMX (Orange) | | 3 | BLACK (GND) | 3 | GND | | | | | | | | | | --- ## MCBL-00020 ![MCBL-00020](/images/other-products/cables/mcbl-20.jpg) Description: - USB Cable, Arducam-4 pin Molex Picoblade to 4 -pin JST-GH Where Used: - VOXL Add-ons with USB hub to ArduCam USB Camera Details: | Component | Details | |--- |--- | | Connector A | 4POS 1.25mm PICOBLADE | | Connector B | 4POS 1.25mm JST | | Length | 100mm | | Insulator | Silicon | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | V_BUS | 1 | V_BUS | | 2 | DATA_M | 2 | DATA_M | | 3 | DATA_P | 3 | DATA_P | | 4 | GND | 4 | GND | [See Schematic Here](/images/other-products/cables/MCBL-00020-1-v5.pdf) --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00021 ![MCBL-00021-1](/images/other-products/cables/mcbl-21-1.jpg) Description: - RC Input (FrSky R-XSR) - Picks up Power on Red+Black, and Receive Signal on Yellow from FlightCore or VOXLFlight to FrSky R-XSR format R/C receiver 5-pin Picoblade format - Note: This is just like MCBL-00018 but instead of the 3-pin hobby format receptacle, it is pinned for the FrSky R-XSR 5-position Picoblade Where Used: - 4-pin JST (connector B): [VOXL Flight J1004](/voxl-flight-datasheet-connectors/#j1004---rc-input--spektrumsbususart6-connector) or [Flight Core J12](/flight-core-datasheet-connectors/#j12---rc-input--usart6-connector) and 3-pin JST (connector A): [VOXL Flight J1003](/voxl-flight-datasheet-connectors/#j1003---ppm-rc-in) or [Flight Core J9](/flight-core-datasheet-connectors/#j9---ppm-rc-in) to 5-pin Molex Picoblade (connector C) to FrSky R-XSR Receiver | Component | Details | |--- |--- | | Connector A | JST GHR-03V-S, for +5V Power/GND | | Connector B | JST GHR-04V-S, for UART_RX signal, +3.3V levels | | Connector C | Molex 0510210500, 5-position Picoblade housing 1.25mm | | Length | 140 mm | | Insulator | PVC (flexible) | | Color | Red/Black/Yellow | | Gauge | 26 AWG | Pinout: ![R-XSR-Pinout](/images/other-products/cables/mcbl-21-1-pinout.png) | A | Power | C | RC Receiver | B | Signal | |--- |--- |--- |--- |--- |--- | | 1 | RED (5V, Source) | 4 | 5V DC (Load) | | | | 2 | | 2 | S.Bus (Yellow) | 3 | S.Bus (Yellow) | | 3 | BLACK (GND) | 5 | GND | | | | | | | | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00021-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00022 ![MCBL-00022](/images/other-products/cables/mcbl-00022.jpg) Description: - USB3 10-pin JST cable to USB3-Type A Receptacle - Note: This is not qualified for 10Gbps speeds. This is a proto-type design suitable for most application development. Customers are advised to source their own shielded and speed-qualified cable for high-volume needs. Where Used: - Any ModalAI CCA USB downstream port (host only) with the 10-pin JST ModalAI USB3 format (examples are M0062, M0067, M0090, M0104, M0130). - Earlier VOXL 2 Mini (M0104) cannot achieve USB3 speeds due to a HW issue, but new M0204 versions fixed that. Details: | Component | Details | |--- |--- | | Connector A | 10POS 1.25mm JST, GHR-10V-S | | Connector B | CONN RCPT USB3.0 TYPEA, CNC Tech 1003-006-01200 | | Length | 80mm | | Insulator | Silicon | | Color | Black, White/Green TP | | Gauge | 26AWG VBUS/GND, 28AWG Twisted Pair Signals| Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00022-2%20Drawing%20v20.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00024 ![MCBL-00024](/images/other-products/cables/mcbl-24.jpg) Description: - Power Module to Stand Alone Modem Cable Where Used: - Used to power a standalone modem board (Sierra M0030-2/M0130-2, or Microhard M0048-2/M0059-2, or 5G M0090-2) directly from the ModalAI Power Module V3 Details: | Component | Details | |--- |--- | | Connector A | Molex, 0050375043 (Power Module side, 2 wires) | | Connector B | SFHR-02V-R (Modem side, 2 wires) | | Length | 100mm | | Insulator | PVC (flexible) | | Color | Black/Red | | Gauge | 26AWG | Pinout: | A | POWER MODULE | B | Modem Side | |--- |--- |--- |--- | | 1 | 5V DC (Source) | 1 | 5V DC (Load) | | 2 | GND | 2 | GND | | 3 | - | | | | 4 | - | | | [See Drawing Here](/images/other-products/cables/MCBL-00024-1-v5.pdf) --- ## MCBL-00025 ![MCBL-00025](/images/other-products/cables/mcbl-25.jpg) Description: - LTE v2 to Flight Core (DroneCode Compliant) Telemetry - No Power Connection, Signals + GND connections only Where Used: - The M0030 Sierra 4G/LTE Modem has a spare UART port on J9 (matches the pinout of J2 as shown [here](/lte-modem-and-usb-add-on-v2-datasheet/)) - This connector provides a 3.3V UART link directly to the Modem, which can be connected to FlightCore J5 (UART7) to create a 4G Telemetry or general purpose data link. - Note: Software support of this feature may still be in BETA form, please contact ModalAI for support - Flightcore side pinouts also match other DroneCode compliant connectors J6 (expansion UART4) and J10 (GNSS UART1) ports - The 4-pin side on the 4G LTE Modem also matches many other Serial Debug Ports on ModalAI HW and can be used as a general purpose UART converter from the 4-wire eSH format to 6-wire eGH format (DroneCode Compliant) Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-06V-S, FlightCore Side, +3.3V levels | | Connector B | JST 1.0mm SHR-06V-S, 4G Modem Side, +3.3V levels | | Length | 100mm | | Insulator | Silicon | | Color | black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | - | 1 | - | | 2 | TX (FlightCore Output/Transmit) | 2 | RX (Modem Input/Receive) | | 3 | RX (FlightCore Input/Receive) | 3 | TX (Modem Output/Transmit) | | 4 | - | 4 | GND | | 5 | - | - | - | | 6 | GND | - | - | [See Drawing Here](/images/other-products/cables/MCBL-00025-1-v5.pdf) --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00028 ![MCBL-00028-2](/images/other-products/cables/mcbl-28-2.jpg) Description: - Seeker GPS Cable Where Used: - Connects HolyBro GPS/Magnetometer unit to VOXL-CAM on Seeker drone using FlightCore J10 (6-pin) - This cable provides power + UART + I2C Details: | Component | Details | |--- |--- | | Connector A | 10 POS 1.0mm JST, GNSS Side | | Connector B | 6 POS 1.25mm JST, FlightCore J10 side | | Length | 230mm | | Insulator | Silicon | | Color | Black | | Gauge | 26 AWG | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | 5VDC (Load) | 1 | 5VDC (Source) | | 2 | RX (GNSS Input) | 2 | TX (FlightCore Output) | | 3 | TX (GNSS Output) | 3 | RX (FlightCore Input)| | 4 | SCL | 4 | SCL (FlightCore Host Side) | | 5 | SDA | 5 | SDA (FlightCore Host Side) | | 6 | - | - | - | | 7 | - | - | - | | 8 | - | - | - | | 9 | - | - | - | | 10 | GND | 6 | GND | [See Drawing Here]() - updated drawing coming soon! --- ## MCBL-00029 ![MCBL-00029](/images/other-products/cables/mcbl-29.jpg) Description: - RB5 Flight (M0052) or VOXL 2 (M0054) to VOXL ESC V2/V3 Cable - This is just like MCBL-00007 but one side is now the new 4-pin JST GH format for ESC instead of DF13 on VOXL - No Power Connection, Signals + GND connections only - Note there are two variants, -1, and -2. - - "-1" is nominally for sale and part of our larger drones at 200mm. - - "-2" is shorter at 70mm and will be embedded into the new Starling drone kit, but can be made available for purchase upon request Where Used: - Qualcomm Flight RB5 Mainboard ESC Port (J18) to VOXL ESC V2/V3 J2 (M0027/M0049/M0117/M0134) - VOXL 2 ESC Port (J18) to VOXL ESC V2/V3 J2 (M0027/M0049/M0117/M0134) - 200mm length for long wire M500 frame installations - 70mm for smaller drone installations Details: | Component | Details | |--- |--- | | Connector A | DF13-6S-1.25C (VOXL ESC), +3.3V levels | | Connector B | JST 1.25mm GHR-04V-S, RB5 Flight/VOXL 2 Side, +3.3V levels | | Length | 200mm (-1 variant), 70mm (-2 variant)| | Insulator | Silicon (flexible) | | Color | Black | | Gauge | 26 AWG | Pinout: | A | VOXL ESC V2/V3 | B | RB5 Flight / VOXL 2 | |--- |--- |--- |--- | | 1 | - | 1 | | | 2 | ESC RX | 2 | VOXL 2/RB5-Flight TX | | 3 | ESC TX | 3 | VOXL 2/RB5-Flight RX | | 4 | - | - | - | | 5 | GND | 4 | GND | | 6 | - | - | - | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00029-1%20Drawing%20v4.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00029-2%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00030 ![MCBL-00030-3](/images/other-products/cables/mcbl-30-3.jpg) Description: - **End-Of-Life:** Being Replaced by MCBL-00040-2 with 3.5mm bullet terminal system - 2mm Bullet Connector to tinned lead for ESC soldering and easy motor mating - RB5 Flight ESC to motor cables (legacy usage) - Note: We have various lengths for this cable - - MCBL-00030-2 = 250mm (as per drawing link below, but Obsolete, use other lengths), - - MCBL-00030-3 = 265mm - - MCBL-00030-4 = 210mm Details: | Component | Details | |--- |--- | | Connector A | Female Bullet Wire,2mm, 18-22AWG | | Length | 250mm | | Insulator | Silicon | | Gauge | 20 AWG | [See Drawing Here](/images/other-products/cables/MCBL-00030-2-v1.pdf) --- ## MCBL-00031 ![MCBL-00031-1](/images/other-products/cables/mcbl-31-1.jpg) Description: - 6 pin-JST-GH-to 6-pin-JST-GH passthrough (1:1/Straight-through wiring) - Note there are two variants, -1, and -2. - - -1, 100mm, is nominally for sale and the -2 is a longer version at 150mm. Where Used: - Connects Qualcomm Flight RB5 Flight Deck Modem and Chirp Sensors - Connects VOXL 2/VOXL 2 Mini and FlightCoreV2 Dronecode Compliant ports to Dronecode Compliant GNSS modules - Chirp Breakout to Debug or Modem Carrier Board - Any place where a 6-pin JST GH is used for debugging, external sensors, etc. - Great item to have for making your own cables!! Details: | Component | Details | |-------------|------------------------------------------------| | Connector A | 6POS 1.25mm JST | | Connector B | 6POS 1.25mm JST | | Length | 100mm (-1 variant), 150mm (-2 variant) | | Insulator | PVC (flexible) (some old units may be silicone)| | Color | Black | | Gauge | 26 AWG | | Weight | 1.7 grams (-1 variant), 2.4 grams (-2 variant) | Pinout: | A | | B | | |---|----------|---|---------| | 1 | | 1 | | | 2 | | 2 | | | 3 | | 3 | | | 4 | | 4 | | | 5 | | 5 | | | 6 | | 6 | | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00031-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00031-2%20Drawing%20v2.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00041 ![MCBL-00041](/images/other-products/cables/mcbl-41.jpg) Description: - 4-pin JST to USBA Female/Receptacle Cable - 150mm (6") version of MCBL-00009 Where Used: - Used for connecting ModalAI USB Hosts (JST side, examples below) to USB Peripherals (Type A side) - [LTE Modem and USB Hub Addon J16 and J17](/lte-modem-and-usb-add-on-datasheet/) to USB peripheral device - [USB Expander and Debug Board](/usb-expander-and-debug-datasheet/) to USB peripheral device - [Microhard and USB Hub Add-on USB J16 and J17](/microhard-add-on-datasheet/) to USB peripheral device - This cable is often included in many kits, but can be made available to purchase separately if you need it. Please use our [contact page](https://www.modalai.com/pages/contact-us) to reach out with inquiries. Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S) | | Connector B | USB 2.0 Type A Female/Receptacle | | Length | ~150mm | | Weight | 10.9 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS (Source side) | 1 | VBUS (Load side) | | 2 | DATA_M | 2 | D- | | 3 | DATA_P | 3 | D+ | | 4 | GND | 4 | GND | --- ## MCBL-00048 ![MCBL-00048-1](/images/other-products/cables/mcbl-00048-1.jpg) Description: - Connects Matek GPS/Magnetometer unit to ModalAI DroneCode compliant ports, such as J10 on FlightCore V2 - This cable provides power + UART + I2C Where Used: - ModalAI FlightCore (v1 or V2) J10 (or other Dronecode compliant ports) to COTS Matek GNSS module, or others, with 6-pin JST SHR format (be sure to check GNSS module vendor specs as they change often) Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-06V-S, FCv2 side, +3.3V signal levels | | Connector B | JST 1.0mm SHR-06V-S-B, Module side, +3.3V signal levels | | Length | 150mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 2.2 grams | Pinout: | A | FlightCore V2 | B | GNSS Module | |--- |---------------- |--- |---------------- | | 1 | 5V (Source) | 6 | 5V (Load) | | 2 | UART_TX | 4 | UART_RX | | 3 | UART_RX | 3 | UART_TX | | 4 | MAG_I2C_SCL | 1 | SCL | | 5 | MAG_I2C_SDA | 2 | SDA | | 6 | GND | 5 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00048-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00061 ![MCBL-00061-1](/images/other-products/cables/mcbl-00061-1.jpg) Description: - Cable providing the primary connection used to connect VOXL 2 to VOXL 2 IO, which provides power and UART based communications Where Used: - Connects VOXL 2 J19 to VOXL 2 I/O J4 Details: | Component | Details | |-------------|-----------| | Connector A | GHR-12V-S | | Connector B | GHR-04V-S | | Length | 150mm | | Insulator | Silicone | | Color | Black | | Gauge | 26AWG | Pinout: | A | | B | | |----|----------|---|------------| | 1 | NC | | | | 2 | NC | | | | 3 | NC | | | | 4 | NC | | | | 5 | NC | | | | 6 | NC | | | | 7 | NC | | | | 8 | NC | | | | 9 | 3P3V | 1 | 3P3V_IO | | 10 | VOXL 2 TX | 2 | VOXL 2IO RX | | 11 | VOXL 2 RX | 3 | VOXL 2IO TX | | 12 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00061-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00062 ![MCBL-00062](/images/other-products/cables/MCBL-00062.png) Description: - Cable connecting the VOXL Power Module v3 to the Flight Core v2, providing power and I2C connections - This is basically an MCBL-00001 (or MCBL-0003) but the LOAD side is now a 4-pin JST GH with a 1:1 pinout - Note there are two variants, -1, and -2. - - -1, 150mm, is nominally for sale and the -2 is a shorter version at 75mm included in some drones (for sale upon request) Where Used: ![MCBL-00062-1](/images/other-products/cables/mcbl-00062-1.png) - Connects ModalAI Power Module V3 output connector to FlightCoreV2 J13 - Note, J13 is intended to be RED to help indicate Power. Due to supply chain challenges, some boards might have the standard white color connector for J13. Details: | Component | Details | |--- |-------------------------------------- | | Connector A | JST, GHR-04V-S | | Connector B | Molex, 0050375043 | | Length | 150mm (-1 variant), 75mm (-2 variant) | | Insulator | Silicone (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.9 grams (-1), 1.3 grams (-2) | Pinout: | A | FCv2 Side | B | Power Module V3 Side | |--- |--- |--- |--- | | 1 | 5V DC (Load) | 1 | 5V DC (Source) | | 2 | GND | 2 | GND | | 3 | I2C_SCL | 3 | PM_SCL | | 4 | I2C_SDA | 4 | PM_SDA | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00062-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00062-2%20Drawing%20v2.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00063 ![MCBL-00063](/images/other-products/cables/MCBL-00063.jpg) Description: - Cable providing the primary connection used to connect Flight Core v2 to the ModalAI UART ESC. - The cable is effectively a 6-pin JST version of the 4-pin JST used on MCBL-00029 (instead of a VOXL 2, use a FCv2 with Dronecode format). - Note there are two variants, -1 and -2 with the only difference in length. -1 = 200mm, -2 = 90mm Where Used: - ModalAI ESC (M0049/M0117/M0134) J2 to FlightCoreV2 J5 (starting 1.13.2-0.1.2) ![MCBL-00063-1](/images/flight-core-v2/m0087-modalai-esc-v2.png) Details: | Component | Details | |--- |--- | | Connector A | DF13-6S-1.25C (VOXL ESC), +3.3V levels | | Connector B | JST 1.25mm GHR-06V-S, FCv2 side, +3.3V levels | | Length | (-1 variant) 200mm, (-2 variant) 90mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | (-1 variant) 1.4 grams, (-2 variant) 0.9 grams | Pinout: | A | VOXL ESC V2/V3 | B | FlightCore V2 | |--- |--- |--- |--- | | 1 | - | 1 | | | 2 | ESC RX | 2 | FCv2 TX | | 3 | ESC TX | 3 | FCv2 RX | | 4 | - | - | - | | 5 | GND | 6 | GND | | 6 | - | - | - | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00063-1%20Drawing%20v3.pdf) & [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00063-2%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00064 ![MCBL-00064](/images/other-products/cables/MCBL-00064.png) Description: - RC Input (S.Bus, FrSky) - Picks up Power on Red+Black, and Receive Signal on Orange from VOXL 2 I/O Board (M0065) to a R/C receiver 3-pin 0.1" hobby format - Note: This is only intended for S.BUS (or +5V) remote receivers and cannot power high current servos or BLDCs - Note: For Spektrum Receivers with +3.3V power supply needs, please see MCBL-00005 - This is just like MCBL-00018 but instead of needing two JST GH connectors, it has been consolidated into one 4-pin Where Used: ![MCBL-00064-1](/images/other-products/cables/mcbl-00064-1.png) - 4-pin JST (connector B): VOXL 2 I/O (M0065) J3 (should be black in color, supply chain permitting) to 3-pin Harwin M20 Receptacle (connector A) to RC Receiver (e.g. S.BUS/FrSky) | Component | Details | |--- |--- | | Connector B | JST GHR-04V-S, +5V Power/GND, UART_RX signal, +3.3V levels | | Connector A | Harwin M20-1060300, CONN RCPT HSG 3POS 2.54mm (or similar) | | Length | 150 mm | | Insulator | PVC (flexible) | | Color | Red/Black/Orange (might be all black)| | Gauge | 26 AWG | | Weight | 1.5 grams | Pinout: | A | RC Receiver | B | VOXL 2 IO (M0065) | |--- |--- |--- |--- | | 1 | Orange, S.Bus Signal (Output) | 3 | S.Bus signal (Input) | | 2 | Red, +5V DC (Load) | 1 | +5V DC (Source) | | 3 | BLACK, GND | 4 | GND | [See Drawing Here]() --- ## MCBL-00065 ![MCBL-00065-1](/images/other-products/cables/mcbl-00065-1.png) Description: - RC Input (S.Bus, FrSky) - Picks up Power on Red+Black, and Receive Signal on Orange from VOXL 2 I/O Board (M0065) to an FrSky R-XSR receiver 5-pin Molex Picoblade format - Note: This is only intended for S.BUS (or +5V) remote receivers and cannot power high current servos or BLDCs - This is just like MCBL-00021-1 but for VOXL 2 IO instead of FlightCore and therefore consolidated into one 4-pin JST Where Used: - 4-pin JST (connector B): VOXL 2 I/O (M0065) J3 (should be black in color, supply chain permitting) to 5-pin molex Picoblade on FrSky R-SSR RC Receiver | Component | Details | |--- |--- | | Connector B | JST GHR-04V-S, +5V Power/GND, UART_RX signal, +3.3V levels | | Connector A | Molex 0510210500, 5-position Picoblade housing 1.25mm | | Length | 150 mm | | Insulator | PVC (flexible) | | Color | Red/Black/Orange (might be all black)| | Gauge | 26 AWG | Pinout: ![R-XSR-Pinout](/images/other-products/cables/mcbl-21-1-pinout.png) MCBL-00021-1 shown but the same Picoblade pinout is used on MCBL-00065 as shown | A | RC Receiver | B | VOXL 2 IO (M0065) | |--- |--- |--- |--- | | 2 | Orange, S.Bus Signal (Output) | 3 | S.Bus signal (Input) | | 4 | Red, +5V DC (Load) | 1 | +5V DC (Source) | | 5 | BLACK, GND | 4 | GND | [See Drawing Here]() --- ## MCBL-00066 ![MCBL-00066](/images/other-products/cables/MCBL-00066.png) Description: - Cable providing the primary connection used to connect Flight Core (V1 or v2) to the ModalAI 5G Modem (M0090) - Compatible with other plug-in boards with the 6-pin JST format as listed here. - The cable is effectively a 6-pin JST version of the 4-pin JST used on MCBL-00067. Where Used: - ModalAI VOXL 2 5G Plug In Board (M0090) J9 to FlightCore V1/V2 J5 (or other DroneCode compliant UART ports on the designs, Software dependant) - This can also be used on other ModalAI DroneCode compliant UART ports (6-pin JST GH), but Software mapping would require changes by the user. Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-06V-S, VOXL 2 side, +3.3V levels | | Connector B | JST 1.25mm GHR-06V-S, FCv2 side, +3.3V levels | | Length | 250mm | | Insulator | Silicon (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.9 grams | Pinout: | A | VOXL 2 J9 | B | FlightCore V2 J5 | |--- |--- |--- |--- | | 1 | - | 1 | | | 2 | UART TX (Output) | 3 | FCv2 UART RX (Input) | | 3 | UART RX (Input) | 2 | FCv2 UART TX (Output) | | 4 | - | - | - | | 5 | - | - | | | 6 | GND | 6 | GND | [See Drawing Here]() --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00067 ![MCBL-00067-1](/images/other-products/cables/mcbl-00067-1.png) Description: - Cable providing the primary connection used to connect Flight Core (V1 or v2) to the ModalAI USB and UART Breakout Board (M0125) - Compatible with other plug-in boards with the 6-pin JST format as listed here. - The cable is effectively a 4-pin JST version of the 6-pin JST used on MCBL-00066. Where Used: - ModalAI VOXL 2 USB and UART Breakout Board (M0125) J3 to FlightCore V1/V2 J5 (or other DroneCode compliant UART ports on the designs, Software dependant) - This can also be used on other ModalAI DroneCode compliant UART ports (6-pin JST GH), but Software mapping would require changes by the user. - Note: M0125 4-Pin JST UART port has RX on pin 2 and TX on pin 3, this is not common across our other HW designs (it was done intentionally, so be careful) Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S, VOXL 2 side, +3.3V levels | | Connector B | JST 1.25mm GHR-06V-S, FCv2 side, +3.3V levels | | Length | 250mm | | Insulator | Silicon (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.9 grams | Pinout: | A | M0125 UART Breakout J3 | B | FlightCore V2 J5 | |--- |--- |--- |--- | | 1 | - | 1 | | | 2 | UART RX (Input) | 2 | FCv2 UART TX (Output) | | 3 | UART TX (Output) | 3 | FCv2 UART RX (Input) | | 4 | GND | 6 | GND | [See Drawing Here]() --- ## MCBL-00068 ![MCBL-00068-1](/images/other-products/cables/mcbl-00068-1.jpg) Description: - Cable providing a 4-pin JST USB connection from a VOXL 2 Plug-in Board (M0090, M0130, etc) to a Doodle Labs Helix Smart Radio Primary connector - Compatible with any ModalAI 4-pin JST USB connectors on various designs - Note: Standalone versions of our USB boards require a stable high-power source that can deliver 5W to the Helix - Note: Doodle Labs Pinout notations in their documents has an incorrect pin1-pin15 callout. They are aware of it and will eventually fix it. We show an image below to help users understand this as our drawings use the proper JST based notations for pin 1 Where Used: - VOXL 2 + M0090 (5G modem) - VOXL 2 + M0130 (4G Modem, coming soon!!) - VOXL 2 + M0078 USB Debug Board Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S, VOXL 2 side | | Connector B | JST 1.25mm GHR-15V-S, Doodle Labs Helix side | | Length | 150mm | | Insulator | PVC (flexible)| | Color | Black | | Gauge | 26AWG (Power/GND), 28AWG USB Data | | Weight | 2.6 grams | Pinout: | A | VOXL 2 Side | B | Doodle Labs Helix 15-pin Side | |--- |--- |--- |--- | | 1 | VBUS (Source) | 1 & 2 | VCC/VBUS (Load), 2-way splice | | 2 | USB_D- | 14 | D- | | 3 | USB_D+ | 15 | D+ | | 4 | GND | 3 & 4 & 13 | GND, 3-way splice | ![MCBL-00068-pinout](/images/other-products/cables/mcbl-00068-pinout-note.png) Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00068-1%20Drawing%20v7.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00069 ![MCBL-00069-1](/images/other-products/cables/mcbl-00069-1.jpg) Description: - Cable providing the VOXL 2 ESC UART 4-pin JST to a TMotor F55A ESC - Note: The TMotor F55A ESC has custom ModalAI firmware and hardware mods on it, thus allowing operation as noted here for the UART lines and the 4 MCUs. If you did not buy the TMotor ESC through ModalAI, this will not work Where Used: - VOXL 2 + TMotor F55A ESC Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S, VOXL 2 side, +3.3V signal levels | | Connector B | JST 1.0mm SHR-10V-S-B, F55A ESC, +3.3V signal levels | | Length | 200mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 28 AWG | | Weight | 1.1 grams | Pinout: | A | VOXL 2 Side | B | TMotor Connector Side | |--- |--- |--- |--- | | 1 | - | - | | | 2 | UART_TX (Output of V2) | 1 | ESC UART RX (Input to ESC) | | 3 | UART_RX (Input to V2) | 3 | ESC UART TX (Output of ESC) | | 4 | GND | 10 | GND | This image shows the standard pinout for reference, but we use the signals as follows due to custom mods: ![MCBL-00069-pinout](/images/other-products/cables/mcbl-00069-pinout-guide.png) - TELEM Data output set as ESC UART Input - ESC[1:4] set as ESC UART Outputs Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00069%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00070 ![MCBL-00070-1](/images/other-products/cables/mcbl-00070-1.jpg) Description: - Cable providing a full JST GH 12-pin breakout Where Used: - VOXL 2 J19, M0130 4G Modem J8 - Any ModalAI 12-pin JST where soldering or custom harnesses are needed - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-12V-S | | Connector B | None: Pigtails | | Length | 100mm | | Insulator | PVC | | Color | Black | | Gauge | 26 AWG | | Weight | 3.0 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | 4 | (pigtail) | | 5 | | 5 | (pigtail) | | 6 | | 6 | (pigtail) | | 7 | | 7 | (pigtail) | | 8 | | 8 | (pigtail) | | 9 | | 9 | (pigtail) | | 10 | | 10 | (pigtail) | | 11 | | 11 | (pigtail) | | 12 | | 12 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00070-1%20Drawing%20v6.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00071 ![MCBL-00071-1](/images/other-products/cables/mcbl-00071-1.jpg) Description: - Cable providing a full JST GH 4-pin breakout, but with Pins 2&3 as twisted pair, suited for all of ModalAI's USB2 ports Where Used: - VOXL or VOXL 2 Plug-In boards - Microhard Plug-ins (M0048), Sierra 4G Plug-ins (M0030, M0130), 5G Plug-ins (M0090) - Any ModalAI 4-pin JST where soldering or custom harnesses are needed - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S | | Connector B | None: Pigtails | | Length | 150mm | | Insulator | PVC | | Color | Black, White/Green TP | | Gauge | 26 AWG, 28AWG Twisted Pair (Pins 2&3) | | Weight | 1.3 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail, TP) | | 3 | | 3 | (pigtail, TP) | | 4 | | 4 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00071-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00072 ![MCBL-00072-1](/images/other-products/cables/mcbl-00072-1.jpg) Description: - VOXL 2 10-pin JST USB to Boson RHP-BOS-VPC3-IF 6-JST - Cable providing a direct connection from ModalAI's USB3 ports (M0090, M0130) to a FLIR Boson that uses the RHP-BOS-VPC3-IF "backpack" - Note: Only picks up the USB2 bus and not the SuperSpeed signals, so bandwidth would be limited to the 480Mbps USB2 standard - For the 4-pin USB2 connector version instead of the 10-pin, see [MCBL-00107](/cable-datasheets/#mcbl-00107) Where Used: - VOXL 2 Modem or USB3 expansion boards - Sierra 4G Plug-ins (M0130), 5G Plug-ins (M0090) Details: | Component | Details | |--- |--- | | Connector A | 10 POS 1.25mm JST, GHR-10V-S, VOXL 2 USB3 10-pin | | Connector B | 6 POS 1.00mm JST, SHR-06V-S-B, Backpack side | | Length | 70mm | | Insulator | PVC | | Color | Black (VBUS/GND), White/Green Twisted Pair USB_D+/D- | | Gauge | Black 26 AWG, White/Green TP 28AWG | | Weight | 0.9 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS (Source) | 1 | 5VDC (Load) | | 2 | USB_D- | 6 | Boson D- | | 3 | USB_D+ | 5 | Boson D+| | 4 | GND | 2 | GND | | 5 | - | - | - | | 6 | - | - | - | | 7 | - | - | - | | 8 | - | - | - | | 9 | - | - | - | | 10 | - | - |- | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00072-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00076 ![MCBL-00076-1](/images/other-products/cables/mcbl-00076-1.jpg) Description: - Connects VOXL 2/VOXL 2-Mini J19 in the Starling or Sentinel Drone Platform to Matek GPS/Magnetometer M10 unit (DroneCode compliant) and pigtails for soldering to a R/C unit UART+PWR - This cable provides power (GNSS+RC) + UART (GNSS) + I2C (MAG) + UART (R/C) - Note there are two variants, -1, and -3. - - "-1" is included in the Starling platform for shorter cable length installations. - - "-3" is longer intended for the Sentinel platform installations. Where Used: - ModalAI Starling Drone, with either VOXL 2 or VOXL 2-Mini - ModalAI Sentinel Drone, with either VOXL 2 or VOXL 2-Mini Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-12V-S, VOXL 2 side, +3.3V signal levels | | Connector B | JST 1.25mm GHR-06V-S, Module side, +3.3V signal levels | | Connector C | Pigtails for soldering to R/C unit, +3.3V signal levels | | Length | 100mm (CONA-CONB), 45mm pigtails (-1) | | | 250mm (CONA-CONB), 155mm pigtails (-3) | | Insulator | Silicone | | Color | Black, Red, White, Yellow | | Gauge | 28 AWG | | Weight | 1.7 grams (-1), 3.4 grams (-3) | Pinout: | A | VOXL 2/ VOXL 2-Mini | B | GNSS Module | C | Pigtails | |--- |---------------- |--- |---------------- | --- | ----------------- | | 1 | 5V (Source) | 1 | 5V (Load) | PG1 | R/C 5V (Red, Load) | | 2 | UART_TX | 2 | UART_RX | | | | 3 | UART_RX | 3 | UART_TX | | | | 4 | MAG_I2C_SCL | 4 | SCL | | | | 5 | MAG_I2C_SDA | 5 | SDA | | | | 6 | GND | 6 | GND | | | | 10 | UART_TX | | | PG2 | R/C_RX (White) | | 11 | UART_RX | | | PG3 | R/C_TX (Yellow | | 12 | GND | | | PG4 | R/C GND (Black) | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00076-1%20Drawing%20v4.pdf) and [See -3 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00076-3%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00078 ![MCBL-00078](/images/other-products/cables/mcbl-00078-1.jpg) Description: - Multi-Purpose XT30 Male to Pigtail Leads, 150mm - Easily identifiable RED (+) and GREEN (-) cables - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints Where used: - Included in Starling ESC for system power from battery - Useful for ESC side or target side electronics when using an XT30-F based battery Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT30U-M | | Connector B | Pigtails, stripped and tinned 3.5mm | | Length | 150mm (-1 variant) | | Insulator | Silicon | | Color | Red (+) and Green (-) | | Gauge | 18 AWG | | Weight | 5.4 grams (-1 variant) | | A | | B | | |--- |--- |--- |--- | | + | + | + | RED | | - | - | - | GREEN | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00078-1%20Drawing%20v5.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00080 ![MCBL-00080](/images/other-products/cables/mcbl-00080-1.jpg) Description: - USB3 10-pin JST cable to USB2 4-Pin JST GH plug - There are two variants currently: -1 at the nominal 100mm and a -2 at a shorter 50mm length. Where Used: - Any ModalAI CCA USB downstream port (host only) with the 10-pin JST ModalAI USB3 format (examples are M0062, M0067, M0090, M0104, M0130). - Ideal for connecting standalone modules (Microhard, LTE) to the VOXL 2 Mini platform (standalone dongles still require independent power from MCBL-00017-1) Details: | Component | Details | |--- |--- | | Connector A | 10POS 1.25mm JST, GHR-10V-S | | Connector B | 4POS 1.25mm JST, GHR-04V-S | | Length | 100mm (-1 variant), 50mm (-2 variant) | | Insulator | PVC | | Color | Black, White/Green TP | | Gauge | 26AWG VBUS/GND, 28AWG Twisted Pair Signals | | Weight | 1.2 grams (-1 variant), 0.8 grams (-2 variant) | Pinout: | A | | B | | |----|---------------|---|---------------| | 1 | VBUS (Source) | 1 | VBUS (Load) | | 2 | USB_D- | 2 | D- | | 3 | USB_D+ | 3 | D+ | | 4 | GND | 4 | GND | | 5 | NC | | | | 6 | NC | | | | 7 | NC | | | | 8 | NC | | | | 9 | NC | | | | 10 | NC | | | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00080-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00080-2%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00081 ![MCBL-00081-1](/images/other-products/cables/mcbl-00081-1.jpg) Description: - Cable providing the ESC UART connection between VOXL 2 Mini and ModalAI ESC V2 (M0049, M0117, M0134). Where Used: - Connects VOXL 2 Mini J19 to ModalAI ESC V2 J2 Details: | Component | Details | |-------------|---------------| | Connector A | GHR-12V-S | | Connector B | DF13-6S-1.25C | | Length | 90mm | | Insulator | PVC (flexible)| | Color | Black | | Gauge | 26AWG | | Weight | 0.9 grams | Pinout: | A | | B | | |----|----------|---|------------| | 1 | NC | | | | 2 | NC | | | | 3 | NC | | | | 4 | NC | | | | 5 | NC | | | | 6 | NC | | | | 7 | UART_TX | 2 | ESC_RX | | 8 | UART_RX | 3 | ESC_TX | | 9 | NC | | | | 10 | NC | | | | 11 | NC | | | | 12 | GND | 5 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00081-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00082 ![MCBL-00082-1](/images/other-products/cables/mcbl-00082-1.jpg) Description: - Cable providing the ESC UART connection between VOXL 2 Mini and ModalAI Mini ESC (M0129). Where Used: - Connects VOXL 2 Mini J19 to ModalAI Mini ESC J1 Details: | Component | Details | |-------------|---------------| | Connector A | GHR-12V-S | | Connector B | GHR-04V-S | | Length | 90mm | | Insulator | PVC (flexible)| | Color | Black | | Gauge | 26AWG | | Weight | 0.9 grams | Pinout: | A | | B | | |----|----------|---|------------| | 1 | NC | | | | 2 | NC | | | | 3 | NC | | | | 4 | NC | | | | 5 | NC | | | | 6 | NC | | | | 7 | UART_TX | 2 | ESC_RX | | 8 | UART_RX | 3 | ESC_TX | | 9 | NC | | | | 10 | NC | | | | 11 | NC | | | | 12 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00082-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00083 ![MCBL-00083-1](/images/other-products/cables/mcbl-00083-1.jpg) Description: - Cable providing a full JST GH 8-pin breakout Where Used: - VOXL 2 & VOXL 2 Mini J10 - Any ModalAI 8-pin JST where soldering or custom harnesses are needed - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-08V-S | | Connector B | None: Pigtails | | Length | 100mm + 10mm pigtails | | Insulator | PVC | | Color | Black | | Gauge | 26 AWG | | Weight | 2.1 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | 4 | (pigtail) | | 5 | | 5 | (pigtail) | | 6 | | 6 | (pigtail) | | 7 | | 7 | (pigtail) | | 8 | | 8 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00083-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00084 ![MCBL-00084-1](/images/other-products/cables/MCBL-00084-80.jpg) Description: - Where Used: - VOXL 2 with [M0173](/M0173/) Starling Front-end Details: | Component | Details | |--- |--- | | Connector A | | | Connector B | | | Length | | | Insulator | | | Color | | | Gauge | | | Weight | | Pinout: | A | | | |--- |--- |--- | | 1 | | | --- ## MCBL-00085 ![MCBL-00085-1](/images/other-products/cables/mcbl-00085-1.jpg) Description: - Cable providing a 10-pin JST USB + Power connection from a VOXL 2 Plug-in Board (Sierra 4G Modem, M0130) to a Doodle Labs Mesh Rider Mini RM-2025-62M3 Smart Radio Port 1 (Data) and Port 4 (Power) connectors - Compatible with any ModalAI 10-pin JST USB connectors on various designs, - Note: Only M0130 (4G Sierra Modem for VOXL 2) at this time can supply the 2A needed on VBUS for the 10W max power use case reported in the device spec by Doodle Labs. Other 10-pin format designs (M0062, M0090, M0144) will work but range may be limited. Where Used: - VOXL 2 + M0090 (5G modem, <10W capable VBUS) - VOXL 2 + M0130 (4G Modem, 10W capable VBUS) - VOXL 2 + M0078 USB Debug Board (configurable VBUS) Details: | Component | Details | |-------------|----------------------------------------------------------------| | Connector A | JST 1.25mm GHR-10V-S, VOXL 2 Plug-In Board side | | Connector B | JST 1.25mm GHR-06V-S, Doodle Labs Helix side, Port 4, Power | | Connector c | JST 1.25mm GHR-04V-S, Doodle Labs Helix side, Port 1, USB Data | | Length | 150mm | | Insulator | PVC | | Color | Black (Power + GND), White/Green TP (USB) | | Gauge | 26AWG (Power/GND), 28AWG USB Data | | Weight | 3.7 grams | Pinout: | A | VOXL 2 Host (M0130, Source) | B | Mesh Rider Mini Port4 (Power, Load) | C | Mesh Rider Mini Port1 (USB Data) | |----|-----------------------------|-------|-------------------------------------|---|----------------------------------| | 1 | 5V VBUS (Source) | 1,2,3 | 5V DC (Load) | - | - | | 2 | D- | - | - | 2 | D- | | 3 | D+ | - | - | 3 | D+ | | 4 | GND | 4 | GND | 4 | GND | | 7 | GND | 5 | GND | - | - | | 10 | GND | 6 | GND | - | - | Image Courtesy of Doodle Labs minioem-v0323.pdf (miniOEM Mesh Rider Radio – Connector Descriptions (2023 Update)) ![MCBL-00085-pinout](/images/other-products/cables/mcbl-00085-connection-guide.jpg) Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00085-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00086 ![MCBL-00086](/images/other-products/cables/mcbl-00086.jpg) Description: - Connects VOXL 2 J19 in the Sentinel Drone Platform to Holybro GPS/Magnetometer unit (Not DroneCode compliant) and pigtails for soldering to a R/C unit UART+PWR - This cable provides power (GNSS+RC) + UART (GNSS) + I2C (MAG) + UART (R/C) - The case lid is opened, supplied cable is removed, and this cable CON-B plugs in directly to the CCA inside and the case lid is re-installed. Where Used: - ModalAI Sentinel Drone, with VOXL 2 and Holybro (Pixhawk) GNSS Module Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-12V-S, VOXL 2 side, +3.3V signal levels | | Connector B | JST 1.0mm SHR-10V-S-B, Module side, +3.3V signal levels | | Connector C | Pigtails for soldering to R/C unit, +3.3V signal levels | | Length | 250mm (CONA-CONB), 150mm pigtails | | Insulator | Silicone | | Color | Black, Red, White, Yellow | | Gauge | 28 AWG | | Weight | 3.3 grams | Pinout: | A | VOXL 2/ VOXL 2-Mini | B | GNSS Module | C | Pigtails | |--- |---------------- |--- |---------------- | --- | ----------------- | | 1 | 5V (Source) | 1 | 5V (Load) | PG1 | R/C 5V (Red, Load) | | 2 | UART_TX | 2 | UART_RX | | | | 3 | UART_RX | 3 | UART_TX | | | | 4 | MAG_I2C_SCL | 4 | SCL | | | | 5 | MAG_I2C_SDA | 5 | SDA | | | | 6 | GND | 10 | GND | | | | 10 | UART_TX | | | PG2 | R/C_RX (White) | | 11 | UART_RX | | | PG3 | R/C_TX (Yellow | | 12 | GND | | | PG4 | R/C GND (Black) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00086-1%20Drawing.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00088 ![MCBL-00088](/images/other-products/cables/mcbl-00088-1.jpg) Description: - Multi-Purpose XT60 Male to Pigtail Leads, 150mm - Easily identifiable RED (+) and GREEN (-) cables - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints Where used: - Included in Stinger ESC for system power from battery - Useful for ESC side or target side electronics when using an XT60 based battery Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT60-M | | Connector B | Pigtails, stripped and tinned 3.5mm | | Length | 150mm (-1 variant) | | Insulator | Silicon | | Color | Red (+) and Green (-) | | Gauge | 18 AWG | | Weight | 7.3 grams (-1 variant) | | A | | B | | |--- |--- |--- |--- | | + | + | + | RED | | - | - | - | GREEN | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00088-1%20Drawing%20v5.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00089 ![MCBL-00089](/images/other-products/cables/mcbl-00089-1.jpg) Description: - Connects VOXL 2 Mini J19 to DroneCode Compliant GPS/Magnetometer unit + ModalAI Mini ESC (M0129) UART + an R/C unit 2W UART - This cable provides power to the GNSS module and the R/C module at 5V (Mini ESC is powered from a battery) - - This cable excludes the 3.3V R/C voltage on J19 pin 9 - The 4-pin R/C port is pinned for a half-duplex UART (2 wire, TX & RX), but can alternatively be re-pinned into a 3-wire format H20 connector easily if needed. Follow the drawing .pdf link provided below to see the pinout details - - Note the R/C port power and GND cables are spliced in the opposite direction to allow the R/C connector to fold/flow leftward of the view shown in the image/cable drawings Where Used: - ModalAI Stinger Drone, with VOXL 2 Mini - Any fully-featured VOXL 2 Mini drone that requires the full use of J19, i.e.: a "Full Breakout of J19" Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-12V-S, VOXL 2 Mini side, +3.3V signal levels | | Connector B | JST 1.25mm GHR-06V-S, GNSS Module side, +3.3V signal levels | | Connector C | JST 1.25mm GHR-04V-S, to Mini ESC (M0129), +3.3V signal levels | | Connector D | Harwin 2.54mm M20-1060400 (Hobby format), R/C module, +3.3V signal levels | | Length | 100mm (CONA-CONB), 80mm (CONA-CONC,COND) | | Insulator | Silicone | | Color | Black, Red, White, Yellow | | Gauge | 28 AWG | | Weight | 2.8 grams | Pinout: | A | VOXL 2 Mini | B | GNSS Module | C | M0129 ESC | D | R/C Module | |--- |---------------- |--- |---------------- | --- | ----------------- | --- | ----------------- | | 1 | 5V (Source) | 1 | 5V (Load) | | | 3 | R/C 5V (Red, Load) | | 2 | UART_TX | 2 | UART_RX | | | | | | 3 | UART_RX | 3 | UART_TX | | | | | | 4 | MAG_I2C_SCL | 4 | SCL | | | | | | 5 | MAG_I2C_SDA | 5 | SDA | | | | | | 6 | GND | 6 | GND | | | 4 | GND (Black) | | 7 | ESC_UART_TX | | | 2 | R/C_RX | | | | 8 | ESC_UART_RX | | | 3 | R/C_TX | | | | 10 | RC_UART_TX | | | | | 1 | R/C_RX (White) | | 11 | RC_UART_RX | | | | | 2 | R/C_TX (Yellow) | | 12 | GND | | | 4 | ESC GND | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00089-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00090 ![MCBL-00090](/images/other-products/cables/mcbl-00090.jpg) Description: - Voxl Ecosystem Format Serial Debug Console Cable to Host PC USB Port - This cable converts ModalAI "standard" 4-pin JST SRSS Debug UART port to USB using embedded FTDI adapter Where Used: - All over ModalAI's Ecosystem of Debug boards and plug-in boards, such as: - - M0144 B-Quad (J6), M0130 New 4G Modem (J6, DNI'd), M0104 VOXL 2 MINI (J4), M0048 Microhard Modem (J2), M0030 4G Modem V2 (J2) - Serial Debug Port Settings at Host (115200 "8N1"): - - 115,200 Baud - - 8 bits - - No Parity/Flow Control - - 1 stop bit Details: | Component | Details | |--- |--- | | Connector A | USB STD-A Plug | | Connector B | JST 1.0mm SHR-04V-S, +3.3V signal levels | | Length | 1 Meter | | Insulator | PVC | | Color | Black | | Gauge | 28 AWG | | Weight | 27.4 grams | Pinout: | A | PC/USB | B | Target Board with Serial Debug Port | |--- |---------------- |--- |-------------------------------------------- | | 1 | VBUS | 1 | Not Connected | | 2 | D- | 2 | UART_RX, 3.3V Signal Levels (Green Wire = FTDI TX) | | 3 | D+ | 3 | UART_TX, 3.3V Signal Levels (White Wire = FTDI RX) | | 4 | DGND | 4 | DGND | --- ## MCBL-00091 ![MCBL-00091](/images/other-products/cables/mcbl-00091-1.jpg) Description: - VOXL 2 ESC UART (4-Pin JST-GH format) Serial Port Cable to Host PC USB Port (FTDI) - ModalAI 3.3V Signal Level UART Port to USB using embedded FTDI adapter Where Used: - All over ModalAI's VOXL 2 Ecosystem UARTs and expansion boards and plug-in boards - Specifically pinned for ESC Tools Support with direct plug into M0129 ESC and future ESCs (no adapter required) - With ModalAI's M0163 JST Flexi-Adapter (INSTRUCTIONS/Images AND MORE INFO COMING SOON!!!), easy re-configuration for: - - Hardware In the Loop (HWIL/HIL) ESC UART to M0054/M0154 (VOXL 2) - - Any Dronecode Compliant UART port (6-pin JST GH) to USB serial (Not just ModalAI hardware) - - Any UART port (4-pin JST GH) to USB serial Details: | Component | Details | |--- |--- | | Connector A | USB STD-A Plug | | Connector B | JST 1.25mm GHR-04V-S, +3.3V signal levels | | Length | 1 Meter | | Insulator | PVC | | Color | Black | | Gauge | 28 AWG | | Weight | 26.4 grams | Pinout: | A | PC/USB | B | Target Board with Serial Debug Port | |--- |---------------- |--- |-------------------------------------------- | | 1 | VBUS | 1 | Not Connected | | 2 | D- | 2 | UART_RX, 3.3V Signal Levels (Green Wire = FTDI TX) | | 3 | D+ | 3 | UART_TX, 3.3V Signal Levels (White Wire = FTDI RX) | | 4 | DGND | 4 | DGND | --- ## MCBL-00092 ![MCBL-00092](/images/other-products/cables/mcbl-00092-1.jpg) Description: - JST RCY Receptacle Cable Assembly RED/BLACK, 150mm, Pigtails Where Used: - General Purpose Use for Power Delivery using popular JST RCY Family Connector Series Details: | Component | Details | |--- |--- | | Connector A | JST RCY Receptacle, SYR-02T | | Connector B | Pigtails, Stripped and Tinned | | Length | 150 mm | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 2.1 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | - | - | BLACK | | 2 | + | + | RED | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00092-1%20Drawing%20v6.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00093 ![MCBL-00093](/images/other-products/cables/mcbl-00093-1.jpg) Description: - JST RCY Plug Cable Assembly RED/BLACK, 150mm, Pigtails Where Used: - General Purpose Use for Power Delivery using popular JST RCY Family Connector Series Details: | Component | Details | |--- |--- | | Connector A | JST RCY Plug, SYP-02T | | Connector B | Pigtails, Stripped and Tinned | | Length | 150 mm | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1.9 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | - | - | BLACK | | 2 | + | + | RED | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00093-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00094 ![MCBL-00094](/images/other-products/cables/mcbl-00094-1.jpg) Description: - USB3 10-pin JST cable to USB2 Pigtails Where Used: - Any USB2 downstream port that needs to connect to ModalAI's 10-pin USB3 Format - Ideal for connecting custom hardware to the VOXL 2 Mini platform or M0090 5G Modem designs Details: | Component | Details | |--- |--- | | Connector A | 10POS 1.25mm JST, GHR-10V-S | | Connector B | Pigtails | | Length | 150mm | | Insulator | PVC | | Color | Black, White/Green TP | | Gauge | 26AWG VBUS/GND, 28AWG Twisted Pair Signals | | Weight | 1.3 grams | Pinout: | A | | B | Pigtails | |----|---------------|---|---------------| | 1 | VBUS (Source) | 1 | VBUS (Load) | | 2 | USB_D- | 2 | D- | | 3 | USB_D+ | 3 | D+ | | 4 | GND | 4 | GND | | 5 | NC | | | | 6 | NC | | | | 7 | NC | | | | 8 | NC | | | | 9 | NC | | | | 10 | NC | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00094-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00095 ![MCBL-00095-1](/images/other-products/cables/mcbl-00095-1.jpg) Description: - VOXL-PM-Y for Legacy ToF M0169 Adapter CCA from one Power Module, with the I2C bus for power monitoring going to VOXL 2 Where Used: - [M0169](/M0169/) with VOXL 2 Details: | Component | Details | |--- |--- | | Connector A | Molex, 0050375043 (Power Module side, 4 wires)| | Connector B | Molex, 0050375043 (VOXL side, 4 wires) | | Connector C | JST, SFHR-02V-R (connects to M0169 CCA, 2 wires) | | Length | 125mm (A - B), 190mm (A - C) | | Insulator | PVC (flexible) | | Color | Black and Red | | Gauge | 20AWG (A-to-B)/ 24AWG (A-to-C) | | Weight | 5.9 grams | Pinout: | A | VOXL 2 PM | B | VOXL 2 | C | M0169 Legacy ToF CCA | |--- |--- |--- |--- |--- |--- | | 1 | 5V DC (Source) | 1 | 5V DC (Load) | 1 | 5V DC (Load) | | 2 | GND | 2 | GND | 2 | GND | | 3 | SCL | 3 | PM_I2C3_SCL_5V | - | - | | 4 | SDA | 4 | PM_I2C3_SDA_5V | - | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00095-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00098 ![MCBL-00098-1](/images/other-products/cables/mcbl-00098-1.jpg) Description: - Cable providing a partial (sub-populated) JST GH 3-pin breakout, with just pins 1 & 3. Where Used: - Great for FCv1 connections with a 3-pin JST GH connector for Power and GND tap-offs - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-03V-S | | Connector B | None: Pigtails | | Length | 150mm (10mm pigtails) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 0.8 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | - | | | 3 | | 3 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00098-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00099 ![MCBL-00099-1](/images/other-products/cables/mcbl-00099-1.jpg) Description: - Cable providing a partial (sub-populated) JST GH 4-pin breakout, with just pins 1 & 4. Where Used: - Great for FCv1/FCv2 connections with a 4-pin JST GH connector for Power and GND tap-offs - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S | | Connector B | None: Pigtails | | Length | 150mm (10mm pigtails) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 0.8 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | - | | | 3 | | - | | | 4 | | 4 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00099-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00100 ![MCBL-00100-1](/images/other-products/cables/mcbl-00100-1.jpg) Description: - Cable providing a partial (sub-populated) JST GH 4-pin breakout, with just pins 2 & 3. Where Used: - Great for FCv1/FCv2 connections with a 4-pin JST GH connector for UART only tap-offs - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-04V-S | | Connector B | None: Pigtails | | Length | 150mm (10mm pigtails) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 0.8 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | - | | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | - | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00100-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00103 ![MCBL-00103](/images/other-products/cables/mcbl-00103-1.jpg) Description: - Multi-Purpose XT60 Bulkhead Male to Pigtail Leads, 80mm - Easily identifiable RED (+) and GREEN (-) cables - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints Where used: - Included in Stinger ESC for system power from battery - Useful for ESC side or target side electronics when using an XT60 based battery Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT60EW-M | | Connector B | Pigtails, stripped and tinned 3.5mm | | Length | 80mm (-1 variant) | | Insulator | Silicon | | Color | Red (+) and Green (-) | | Gauge | 18 AWG | | Weight | 5.9 grams (-1 variant) | | A | | B | | |--- |--- |--- |--- | | + | + | + | RED | | - | - | - | GREEN | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00103-1%20Drawing%20v6.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00104 ![MCBL-00104-1](/images/other-products/cables/mcbl-00104-1.jpg) Description: - 6-pin JST SH to USB Type A Where Used: - USB Host for configuring a Boson Sensor Details: | Component | Details | |--- |--- | | Connector A | USB, Type A Male | | Connector B | JST, SHR-06V-S-B, 1.0mm Housing (with Protrusions), 6-POS | | Length | 500mm | | Insulator | PVC | | Color | Black, White/Green TP, Red | | Gauge | 26 AWG, 28AWG Twisted Pair | | Weight | 16.8 grams | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | VBUS (Source) | 1 | VBUS (Load) | | 2 | D- | 6 | D- | | 3 | D+ | 5 | D+ | | 4 | GND | 2 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00104-1%20Drawing%20v6.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00105 ![MCBL-00105](/images/other-products/cables/mcbl-00105-1.jpg) Description: - 8pin-JST-to-8pin-JST cable (straight through 1:1) Where Used: - Note there are two variants, -1 and -2 - - "-1" 150mm. - - "-2" is a shorter length, 100mm, used on Starling 2 drones Details: | Component | Details | |--- |--- | | Connector A | JST, SHR-08V-S-B, 1.00mm Housing (with Protrusions), 8-POS | | Connector B | JST, SHR-08V-S-B, 1.00mm Housing (with Protrusions), 8-POS | | Length | 150mm (-1 variant), 100mm (-2 variant) | | Insulator | PVC | | Color | Black | | Gauge | 26 AWG | | Weight | 2.9 grams (-1 variant), 2.0 grams (-2 variant) | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | Pin1 | 1 | Pin1 | | 2 | Pin2 | 2 | Pin2 | | 3 | Pin3 | 3 | Pin3 | | 4 | Pin4 | 4 | Pin4 | | 5 | Pin5 | 5 | Pin5 | | 6 | Pin6 | 6 | Pin6 | | 7 | Pin7 | 7 | Pin7 | | 8 | Pin8 | 8 | Pin8 | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00105-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00105-2%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00106 ![MCBL-00106](/images/other-products/cables/mcbl-00106-1.jpg) Description: - Multi-Purpose XT30U-F to Banana Jacks, 300mm - Easily identifiable RED (+) and BLACK (-) cables - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints - Easily removable set-screw based Banana Plugs to expose stripped/tinned cable for other uses Where used: - Useful for VOXL 2 Development within a Pre-Built Drone without needing a battery by using a power supply - ***CAUTION: NEVER ARM THE DRONE USING A POWER SUPPLY. THE ELECTRONICS WILL BE DAMAGED AND VOID ALL WARRANTIES*** Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT30U-F | | Connector B | Banana Plugs, 4mm, Gold Plated, set-screw secured^ | | Length | 300mm | | Insulator | Silicon | | Color | Red (+) and Black (-) | | Gauge | 14 AWG | | Weight | 25 grams | | A | | B | | |--- |--- |--- |--- | | + | + | + | RED | | - | - | - | BLACK | ^ Note: If desired, the set-screw in the side of the banana plug can be loosened to expose the bare stripped and tinned cable inside for soldering to your own format as desired. Because of this however, it may be possible for the screw to come loose over time. If intermittent power issues are suspected during normal operations, be sure to tighten this screw firmly before use. Here is an example of the cables inside the set-screw plugs: ![mcbl-00106-set-screw](/images/other-products/cables/mcbl-00106-1-plug-screw.jpg) Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00106%20Drawing%20v11.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00107 ![MCBL-00107-1](/images/other-products/cables/mcbl-00107.jpg) Description: - VOXL 2 4-pin JST USB to Boson RHP-BOS-VPC3-IF 6-JST Cable providing a direct connection from ModalAI’s USB2 ports (M0090, M0130) to a FLIR Boson that uses the RHP-BOS-VPC3-IF “backpack” - Note: Only picks up the USB2 bus, For the 10-pin version, see [MCBL-00072](/cable-datasheets/#mcbl-00072) Where Used: VOXL 2 Modem or USB expansion boards Sierra 4G Plug-ins (M0130), 5G Plug-ins (M0090) Details: | Component | Details | |--- |--- | | Connector A | 4 POS 1.25mm JST, GHR-04V-S | | Connector B | 6 POS 1.00mm JST, SHR-06V-S-B, Backpack side | | Length | 70mm | | Insulator | PVC | | Color | Black (VBUS/GND), White/Green Twisted Pair D+/D- | | Gauge | Black 26 AWG, White/Green TP 28AWG | | Weight | 0.9 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS (Source)| 1 | 5VDC (Load) | | 2 | USB_D- | 6 | Boson D- | | 3 | USB_D+ | 5 | Boson D+ | | 4 | GND | 2 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00107-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00109 ![MCBL-00109](/images/other-products/cables/mcbl-00109-1.jpg) Description: - XT30U-F Power Jumper, 80mm - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints Where used: - Useful for Starling 2 Max to bypass the second battery when using MCBL-00106 with a power supply - ***CAUTION: NEVER ARM THE DRONE USING A POWER SUPPLY. THE ELECTRONICS WILL BE DAMAGED AND VOID ALL WARRANTIES*** Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT30U-F | | Length | 80mm | | Insulator | Silicon | | Color | Red (+) and (-) | | Gauge | 16 AWG | | Weight | 2.7 grams | | A | | A | | |--- |--- |--- |--- | | + | + | - | - (RED) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00109%20Drawing%20v6.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00110 ![MCBL-00110](/images/other-products/cables/mcbl-00110-1.jpg) Description: - Multi-Purpose XT60 Male to Pigtail Leads, 120mm - Easily identifiable RED (+) and BLACK (-) cables - Robust adhesive lined heatshrink for long-lasting protection of pin solder joints Where used: - - Useful for ESC side or target side electronics when using an XT60 based battery Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT60-M | | Connector B | Pigtails, stripped and tinned 4mm | | Length | 120mm | | Insulator | Silicon | | Color | Red (+) and Black (-) | | Gauge | 12 AWG | | Weight | 12.9 grams | | A | | B | | |--- |--- |--- |--- | | + | + | + | RED | | - | - | - | BLACK | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00110%20Drawing%20v4.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00111 ![MCBL-00111](/images/other-products/cables/mcbl-00111-1.jpg) Description: - 8pin-JST-to-8pin-JST cable (straight through 1:1) Short Jumper Cable Where Used: - VOXL Add-On boards to stacked boards where the 8-pin SPI port (or other) is desired to connect very close to VOXL 2 or Mini - Great item to have for making your own cables!! - - Note this has no label on it due to its size. Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-08V-S | | Connector B | JST, GHR-08V-S | | Length | 15mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 0.8 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | Pin1 | 1 | Pin1 | | 2 | Pin2 | 2 | Pin2 | | 3 | Pin3 | 3 | Pin3 | | 4 | Pin4 | 4 | Pin4 | | 5 | Pin5 | 5 | Pin5 | | 6 | Pin6 | 6 | Pin6 | | 7 | Pin7 | 7 | Pin7 | | 8 | Pin8 | 8 | Pin8 | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00111-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00112 ![MCBL-00112-1](/images/other-products/cables/mcbl-00112-1.jpg) Description: - Cable providing a full 4-pin breakout of the 4-pin MicroOne connector used on VOXL 2 Mini Where Used: - Built into MDK-M0041-4-00 power module assemblies - Great for custom power module or ESC power pad soldering to VOXL 2 Mini systems - Pigtail side is tinned for ~5mm making it easy to install on solder pads - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | Molex 2.0mm MicroOne 2059792041 | | Connector B | None: Pigtails | | Length | 100mm (5mm pigtails) | | Insulator | Silcon | | Color | Black | | Gauge | 22 AWG | | Weight | 2.8 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | 4 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00112-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00113 ![MCBL-00113-1](/images/other-products/cables/mcbl-00113-1.jpg) Description: - Cable providing a sub-pop (partial) 2-pin breakout of the 4-pin MicroOne connector used on VOXL 2 Mini - Power Leads Only (1&2), no I2C bus cables (3&4) Where Used: - Built into ESC assemblies for VOXL 2 Mini - Great for custom power module or ESC power pad soldering to VOXL 2 Mini systems - Pigtail side is tinned for ~5mm making it easy to install on solder pads - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | Molex 2.0mm MicroOne 2059792041 | | Connector B | None: Pigtails | | Length | 100mm (5mm pigtails) | | Insulator | Silcon | | Color | Black | | Gauge | 22 AWG | | Weight | 1.6 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | | 1 | (pigtail) | | 2 | | 2 | (pigtail) | | 3 | | 3 | - | | 4 | | 4 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00113-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00114 ![MCBL-00114-1](/images/other-products/cables/mcbl-00114-1.jpg) Description: - ModalAI Yellow 2S-6S VBAT Format End-to-End Extension Cable Where Used: - Embedded within ESC and VTX/VRX Assemblies - Useful for general purpose JST eSFH connector hookups, with the yellow format - Note: Red version are ModalAI's 5V format and Black/Grey are ModalAI's 1S VBAT (3.8V) format Details: | Component | Details | |--- |--- | | Connector A & B | JST, SFHR-02V-L, 1.8mm Housing, 2-POS | | Length | 80mm | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1.0 gram | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | + (Red) | 1 | + | | 2 | - (Black) | 2 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00114-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00115 ![MCBL-00115-1](/images/other-products/cables/mcbl-00115-1.jpg) Description: - ModalAI Yellow 2S-6S VBAT Format to XT30 Male Adapter/Extension Cable Where Used: - Embedded within ESC and VTX/VRX Assemblies - Useful for general purpose JST eSFH connector hookups from a 2S-6S XT30 battery, with the yellow format - Note: JST eSFH Red versions are ModalAI's 5V format and Black/Grey are ModalAI's 1S VBAT (3.8V) format Details: | Component | Details | |--- |--- | | Connector A | JST, SFHR-02V-L, 1.8 mm Housing, 2-POS | | Connector B | AMASS, XT30U-M, Male plug, 2-POS | | Length | 100mm | | Insulator | Silicone | | Color | Red(+), Black (-) | | Gauge | 22 AWG | | Weight | 2.2 grams | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | + (Red) | + | + | | 2 | - (Black) | - | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00115-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00116 ![MCBL-00116-1](/images/other-products/cables/mcbl-00116-1.jpg) Description: - ModalAI Yellow 2S-6S VBAT Format to XT60 Male Adapter/Extension Cable Where Used: - Embedded within ESC and VTX/VRX Assemblies - Useful for general purpose JST eSFH connector hookups from a 2S-6S XT60 battery, with the yellow format - Note: JST eSFH Red versions are ModalAI's 5V format and Black/Grey are ModalAI's 1S VBAT (3.8V) format Details: | Component | Details | |--- |--- | | Connector A | JST, SFHR-02V-L, 1.88 mm Housing, 2-POS | | Connector B | AMASS, XT60U-M, Male plug, 2-POS | | Length | 100mm | | Insulator | Silicone | | Color | Red(+), Black (-) | | Gauge | 22 AWG | | Weight | 4.9 grams | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | + (Red) | + | + | | 2 | - (Black) | - | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00116-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00117 ![MCBL-00117](/images/other-products/cables/mcbl-00117.jpg) Description: - Connects VOXL 2 Mini J10 SPI Port (in UART Mode) to HD Zero OSD/UART Port + Power Feed from VBAT using Pigtails - This cable provides power to the HD Zero from a direct VBAT solder from an ESC or other capable source - Note: HD Zero can pull over 13W in some power modes, be sure your VBAT power source can handle the correct HD Zero Voltage and 26AWG is suitable for the rated current Where Used: - VOXL 2 Mini to add OSD to the HD Zero VTX Unit with a DroneCode Compliant UART Port - Stinger HD Zero Configurations Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-08V-S, VOXL 2 Mini UART, +3.3V signal levels | | Connector B | JST 1.25mm GHR-05V-S, HD Zero Side, +3.3V signal levels | | Pigtails | 100mm Red and Black, 5mm striped and tined. 26AWG | | Length | 100mm (CONA-CONB), 100mm (pigtails) | | Insulator | Flexible PVC | | Color | Black, Red | | Gauge | 26 AWG | | Weight | 1.3 grams | Pinout: | A | V2 MINI Side | B | HD Zero | PG | VTX Power Source | |--- |---------------- |--- |---------------- | ---| ------------- | | 4 | UART TX | 2 | UART RX | | | | 5 | UART RX | 3 | UART TX | | | | 8 | FC GND | 4 | GND | 1 | GND | | | - | 5 | V+ (Load) | 2 | RED (Source) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00117-1%20Drawing%20v7.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00118 ![MCBL-00118](/images/other-products/cables/mcbl-00118.jpg) Description: - Connects VOXL 2 or FCv2 Drone Code Compliant UART Port to HD Zero OSD/UART Port + Power Feed from VBAT using new VTX Format Connector - This cable provides power to the HD Zero from a direct VBAT tap-off using MCBL-00123 on the ESC - Note: HD Zero can pull over 13W in some power modes, be sure your VBAT power source can handle the correct HD Zero Voltage and 26AWG is suitable for the rated current Where Used: - Any Flight Controller that needs to add OSD to the HD Zero VTX Unit with a DroneCode Compliant UART Port - Stinger HD Zero Configurations Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-06V-S, Flight Controller Side, +3.3V signal levels | | Connector B | JST 1.25mm GHR-05V-S, HD Zero Side, +3.3V signal levels | | Connector C | Molex SL-Series Housing 701070001, VBAT | | Length | 100mm (CONA-CONB), 65mm (CONB-CONC) | | Insulator | Flexible PVC | | Color | Black, Red | | Gauge | 26 AWG | | Weight | 3.2 grams | Pinout: | A | FC Side | B | HD Zero | C | VTX Power Source | |--- |---------------- |--- |---------------- | ---| ------------- | | 2 | UART TX | 2 | UART RX | | | | 3 | UART RX | 3 | UART TX | | | | 6 | FC GND | 4 | GND | 2 | GND | | | - | 5 | V+ (Load) | 1 | RED (Source) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00118%20Drawing%20v8.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00119 ![MCBL-00119](/images/other-products/cables/mcbl-00119.jpg) Description: - Molex SL Based PWM Device Power and PWM Feeds - LED Bar format, with JST SYR as power IN and Molex SL as device load - PWM signals as pigtails to solder onto various RC receivers with extra PWM control outputs Where Used: - ModalAI Drones or for Standalone modules where a PWM type of device is needed with VBAT power from a JST SYR - Follows common Hobby formats for pinouts - - Note the SYR is the ONLY ModalAI connector format with Pin 1 = GND, Pin 2 = VBAT to match hobbyist conventions - - Note the Molex 3-pin is the ONLY ModalAI connector format with Pin 1 = Signal, Pin 2 = VBAT, and Pin 3 = GND to match hobbyist conventions Details: | Component | Details | |--- |--- | | Connector A | JST Red SYR 2-Pos Receptacle Housing, SYR-02T | | Connector B | Molex 3-Position SL Plug in PWM Format, 070107-0002 | | Length | 100mm | | Insulator | Silicone | | Color | Black, Red, White | | Gauge | 22 AWG (Power Red/Black), 28AWG (PWM signal white/black) | | Weight | 3.1 grams | Pinout: | A | VBAT Source | B | PWM Device | |--- |---------------- |--- | ------------------ | | 1 | GND | 3 | GND, with Pigtail Splice from PWM source | | 2 | VBAT 2-6S (6.4-25.2V) | 2 | VBAT (Load) | | | | 1 | Pigtail for PWM Input | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00119-1%20%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00120 ![MCBL-00120-1](/images/other-products/cables/mcbl-00120-1.jpg) Description: - 8-Pin VOXL 2 SPI JST GH to JST SH Jumper Cable - Plugs into VOXL 2 J10 to bring the SPI port @ 3.3V to an external peripheral in 6-pin JST SH format without extra chip selects Where Used: - Sparrow for additional M0188-1 (not M0188-2) SPI Port - General purpose conversion of 8-Pin JST GH to 6-Pin JST SH Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-08V-S, 1.25 mm Housing, 8-POS | | Connector B | JST, SHR-06V-S-B, 1.0 mm Housing (with Protrusions), 6-POS | | Length | 75mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 28 AWG | | Weight | 1.0 grams | Pinout: | SIGNAL | CON A | | CON B | |--- |--- |--- |--- | | 3P3V_VREG_LOCAL | Pin1 | 1 | Pin1 | | SPI_MOSI_3P3V | Pin2 | 2 | Pin2 | | SPI_MOSI_3P3V | Pin3 | 3 | Pin3 | | SPI_SCLK_3P3V | Pin4 | 4 | Pin4 | | SPI_CS0_3P3V | Pin5 | 5 | Pin5 | | DGND | Pin8 | 6 | Pin6 | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00120-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00121 ![MCBL-00121](/images/other-products/cables/mcbl-00121-1.jpg) Description: - 10-pin JST to USBA Female/Receptacle Cable - 10-pin version of MCBL-00041 - Note there are two versions of this cable - - (-1) is nominally as shown here - - (-2) is the same exact functional cable, but the outer insulation around the cable conductors has been trimmed back to 1/2 the overall cable length to allow for tighter installations. Where Used: - Used for connecting ModalAI USB Hosts with the 10-Pin JST format (examples below) to USB Peripherals (Type A side) - [VOXL 2 USB3.0 / UART Expansion Adapter](https://www.modalai.com/products/m0151) to USB peripheral device - [VOXL 2 Cellular LTE, I/O Breakout and USB hub add-on (M0130-3)](https://www.modalai.com/collections/expansion-board/products/m0130-3?variant=48186331693360) - [5G Modem Carrier Board, USB HUB, I/O Breakout for VOXL 2](https://www.modalai.com/collections/expansion-board/products/mdk-m0090?variant=40594936463411) Details: | Component | Details | |-------------|---------------------------------------- | | Connector A | JST, GHR-10V-S | | Connector B | USB 2.0 Type A Female/Receptacle | | Length | ~150 mm | | Insulator | PVC | | Color | Black, Red, White/Green TP | | Gauge | 26AWG VBUS/GND, 28AWG Twisted Pair Signals | | Weight | 12.9 grams (-1), 12.3 grams (-2) | Pinout: | A | VOXL 2 HOST SIDE | B | USB Peripheral Side | |-----|--------------------------|----|-------------------------------| | 1 | VBUS (Source) | 1 | VBUS (Load) | | 2 | DATA_M | 2 | D- | | 3 | DATA_P | 3 | D+ | | 4 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00121-1%20Drawing%20v5.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00121-2%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00122 ![MCBL-00122-1](/images/other-products/cables/mcbl-00122-1.jpg) Description: - Cable providing a partial (sub-populated) JST GH 6-pin breakout, with just pins 2 & 3 & 6. Where Used: - Great for FCv2 or VOXL 2 Add-in board connections with a 6-pin JST GH connector for UART only tap-offs, with a Ground wire (pin 6) - Note: pigtail side is tinned for ~10mm making it easy to install JST SSHL-002T-P0.2 pins if needed - Great item to have for making your own cables!! Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-06V-S | | Connector B | None: Pigtails | | Length | 150mm (10mm pigtails) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.2 grams | Pinout: | A | | | | |--- |--- |--- |--- | | 1 | | - | | | 2 | | 2 | (pigtail) | | 3 | | 3 | (pigtail) | | 4 | | - | | | 5 | | - | | | 6 | | 6 | (pigtail) | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00122-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00123 ![MCBL-00123](/images/other-products/cables/mcbl-00123-1.jpg) Description: - 2-pin Molex SL-Series Keyed Receptacle to Pigtails - Red (Pin 1) and Black (Pin 2) cables for easy pin 1 identification - Multiple pigtail lengths to start from (60mm, 100mm, & 150mm) Where Used: - ModalAI Drones with the need to a deliver low current signals (like RPM/PWM) or VBATT/GND - General purpose use where the need for a simple 2-Pin with keying and retention latches are needed - See the Mating product MCBL-00124 for a complete solution Details: | Component | Details | |-------------|---------------------------------------- | | Connector A | Molex, SL-Series Receptacle, 50579402 | | Connector B | Pigtails, stripped and tinned 5mm | | Length | 100mm (-1 variant), 150mm (-2 variant), 60mm (-3 variant) | | Insulator | Siicone | | Color | Black, Red | | Gauge | 28AWG | | Weight | 0.6g (-1 variant), 0.8g (-2 variant), 0.5g (-3 variant) | Pinout: | A | | B | | |-----|--------------------------|----|-------------------------------| | 1 | Pin 1 (Red) | 1 | (Pigtail) | | 2 | Pin 2 (Black) | 2 | (Pigtail) | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00123-1%20Drawing%20v2.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00123-2%20Drawing%20v2.pdf),[See -3 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00123-3%20Drawing%20v3.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00124 ![MCBL-00124](/images/other-products/cables/mcbl-00124-1.jpg) Description: - 2-pin Molex SL-Series Keyed Plug to Pigtails - Red (Pin 1) and Black (Pin 2) cables for easy pin 1 identification - Multiple pigtail lengths to start from (100mm & 150mm) Where Used: - ModalAI Drones with the need to a deliver low current signals (like RPM/PWM) or VBATT/GND - General purpose use where the need for a simple 2-Pin with keying and retention latches are needed - See the Mating product MCBL-00123 for a complete solution Details: | Component | Details | |-------------|---------------------------------------- | | Connector A | Molex, SL-Series Plug, 50579402 | | Connector B | Pigtails, stripped and tinned 5mm | | Length | 100mm (-1 variant), 150mm (-2 variant) | | Insulator | Silcione | | Color | Black, Red | | Gauge | 28AWG | | Weight | 0.6g (-1 variant), 0.8g (-2 variant) | Pinout: | A | | B | | |-----|--------------------------|----|-------------------------------| | 1 | Pin 1 (Red) | 1 | (Pigtail) | | 2 | Pin 2 (Black) | 2 | (Pigtail) | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00124-1%20Drawing%20v2.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00124-2%20Drawing%20v2.pdf). Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00125 ![MCBL-00125-1](/images/other-products/cables/mcbl-00125-1.jpg) Description: - ModalAI Black 3.8V 1S VBAT Format End-to-End Extension Cable - This new black JST SFHR format is being used as a substitute to the larger Molex MicroOne solution on some VOXL 2 Mini based designs in process - Note we have several variants for length as described in the table below Where Used: - Useful for general purpose JST eSFH connector hookups, with the black format - Note: Red version are ModalAI's 5V format and Yellow are ModalAI's 2S-6S VBAT format Details: | Component | Details | |--- |--- | | Connector A & B | JST, SFHR-02V-T-K, 1.8mm Housing, 2-POS | | Length | 75mm (-1 variant), 125mm (-2 variant), 45mm (-3 variant) | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1 gram (-1 variant), 1.5 grams (-2 variant), 0.7 grams (-3 variant) | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | + (Red) | 1 | + | | 2 | - (Black) | 2 | - | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00125-1%20Drawing%20v2.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00125-2%20Drawing%20v2.pdf), [See -3 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00125-3%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00126 ![MCBL-00126-1](/images/other-products/cables/mcbl-00126-1.jpg) Description: - ModalAI Black 3.8V 1S VBAT Format End-to-End Breakout to Pigtail Cable - This new black JST SFHR format is being used as a substitute to the larger Molex MicroOne solution on VOXL 2 Mini - Useful for soldering onto 3.8V power module pads to provide VOXL 2 Mini 1S VBAT Where Used: - Useful for general purpose JST eSFH connector hookups, with the black format - Note: Red version are ModalAI's 5V format and Yellow are ModalAI's 2S-6S VBAT format Details: | Component | Details | |--- |--- | | Connector A | JST, SFHR-02V-T-K, 1.8mm Housing, 2-POS | | Length | 100mm | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1.1 grams | Pinout: | A | Signal | B | Pigtail | |--- |--- |--- |--- | | 1 | + (Red) | 1 | + | | 2 | - (Black) | 2 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00126-1%20Drawing%20v2.pdf), Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00127 ![MCBL-00127](/images/other-products/cables/mcbl-00127.jpg) Description: - New ModalAI Yellow VBAT Format to New VTX Power Format - Converts Yellow VBAT (2-6S) JST Payload Connectors to VTX Molex SL Plug Format Where Used: - VTX Assemblies integrated into ModalAI Drones or for Standalone modules Details: | Component | Details | |--- |--- | | Connector A | Molex SL Series Housing 701070001 with Pin contact 16020077 | | Connector B | JST 1.8mm SFHR-02V-L | | Length | 65mm | | Insulator | Silicone | | Color | Black, Red | | Gauge | 24 AWG | | Weight | 1.4 grams | Pinout: | A | VBAT Payload/VTX | B | ESC/Battery/Source | |--- |---------------- |--- | ------------------ | | 1 | VBAT (Load) | 1 | VBAT (Source) 2-6S (6.4-25.2V) | | 2 | GND | 2 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00127-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00128 ![MCBL-00128](/images/other-products/cables/mcbl-00128.jpg) Description: - Connects M0188/M0195 Sparrow/Stinger Imager Front End to Two ToF "Pill" Modules, M0189 Where Used: - Sparrow/Stinger Drones with Single Point ToF modules Details: | Component | Details | |--- |--- | | Connector A | JST 1.0mm SHR-10V-S-B, Imager Front End Side | | Connector B | JST 1.0mm SHR-05V-S-B, ToF Pill (M0189) Side | | Connector C | JST 1.0mm SHR-05V-S-B, ToF Pill (M0189) Side | | Length | 75mm | | Insulator | Silicone | | Color | Black | | Gauge | 28 AWG | | Weight | 1.4 grams | Pinout: | Signal | CON A | CON B | CON C | |------------|-----------|-----------|-----------| | 1 | 1 | 1 | | | 2 | 2 | 2 | | | 3 | 3 | 3 | | | 4 | 4 | 4 | | | 5 | 5 | 5 | | | 6 | 6 | | 1 | | 7 | 7 | | 2 | | 8 | 8 | | 3 | | 9 | 9 | | 4 | | 10 | 10 | | 5 | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00128-1%20Drawing%20v8.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00129 ![MCBL-00129](/images/other-products/cables/mcbl-00129.jpg) Description: - Connects VOXL 2 Mini J19 to ModalAI Mini ESC (M0129) UART + an R/C unit 2W (TX/RX) UART via pigtails - This cable provides power to the R/C module at 5V (Mini ESC is powered from a battery) - All pigtails are stripped and tinned for 5mm Where Used: - ModalAI Stinger Drone, with VOXL 2 Mini - Any fully-featured VOXL 2 Mini drone that requires J19 for ESC and R/C UARTs Details: | Component | Details | |--- |--- | | Connector A | JST 1.25mm GHR-12V-S, VOXL 2 Mini side, +3.3V signal levels | | Connector B | JST 1.25mm GHR-04V-S, ESC side, +3.3V signal levels | | Length | 100mm (CONA-CONB), 100mm (pigtails) | | Insulator | Silicone | | Color | Black, Red, White, Yellow | | Gauge | 28 AWG | | Weight | 1.3 grams | Pinout: | A | VOXL 2 Mini | B | M0129 ESC | Pigtails | |--- |---------------- |--- |---------------- | ---------------- | | 1 | 5V (Source) | | | Red | | 2 | - | | | | | 3 | - | | | | | 4 | - | | | | | 5 | - | | | | | 6 | GND | | | Black | | 7 | ESC_UART_TX | 2 | UART_RX | | | 8 | ESC_UART_RX | 3 | UART_TX | | | 9 | - | | | | | 10 | RC_UART_TX | | | White | | 11 | RC_UART_RX | | | Yellow | | 12 | GND | 4 | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00129-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00130 ![MCBL-00130-1](/images/other-products/cables/mcbl-00130.jpg) Description: - ModalAI 6-pin JST GGH DroneCode Compliant UART+I2C port to 3-pin JST SH for I2C - New 3-pin I2C format for accesory sensors (ADC, Temp, etc) - I2C + GND only, no power pickup Where Used: - VTX assemblies with M0154 + M0130/M0090 where a sensor board exists - Useful for general purpose lab use to access I2C from our JST GH Dronecode formats Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-06V-S, VOXL 2 Side | | Connector B | JST, SHR-03V-S-B, Sensor Board Side | | Length | 100mm | | Insulator | Flexible PVC | | Color | Black | | Gauge | 28 AWG | | Weight | 0.6 grams | *Please note our first batch of cables did not include a label and only a temporary one is shown in the image here. Product received may or may not include a label. Pinout: | A | Signal (Host Side) | B | Signal (Target Side) | |--- |--- |--- |--- | | 1 | | | | | 2 | | | | | 3 | | | | | 4 | SDA | 2 | SDA | | 5 | SCL | 1 | SCL | | 6 | GND | 3 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00130-1%20Drawing%20v9.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00131 ![MCBL-00131-1](/images/other-products/cables/mcbl-00131.jpg) Description: - New 3-pin I2C format for accesory sensors (ADC, Temp, etc) direct to 3-pin I2C - I2C + GND only (as intended, but can be used as 3 general purpose conductors) - Two variants exist: - - (-1) is nominally 75mm in length and (-2) at 40mm in length Where Used: - VTX assemblies with M0104/M0204 + M0194 where a sensor board exists - Useful for general purpose lab use for 3-pin JST SH Details: | Component | Details | |--- |--- | | Connector A | JST, SHR-03V-S-B, VOXL 2 Mini Adapter Side | | Connector B | JST, SHR-03V-S-B, Sensor Board Side | | Length | 75mm (-1), 40mm (-2) | | Insulator | Flexible PVC | | Color | Black | | Gauge | 28 AWG | | Weight | 0.5 grams (-1), 0.3 grams (-2) | *Please note our first batch of cables did not include a label and only a temporary one is shown in the image here. Product received may or may not include a label. Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | 1 | 1 | 1 | | 2 | 2 | 2 | 2 | | 3 | 3 | 3 | 3 | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00131-1%20Drawing%20v5.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00131-2%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00132 ![MCBL-00132-1](/images/other-products/cables/mcbl-00132.jpg) *Please note our first batch of (-1) variant cables did not include a label and only a temporary one is shown in the image here. Product received may or may not include a label. Description: - ModalAI 4-pin MicroOne connector used on VOXL 2 Mini to Black JST (1S 3.8V format) - Power Leads Only (1&2), no I2C bus cables (3&4) - Note there are 2 variants, (-1) nominally at 80mm, and (-2) shorter length for 20mm Where Used: - Embedded within VTX assemblies with M0204 - Useful for general purpose JST eSFH connector hookups, with the black format, for VOXL 2 Mini - Note: Red version are ModalAI's 5V format and Black/Grey are ModalAI's 1S VBAT (3.8V) format Details: | Component | Details | |--- |--- | | Connector A | Molex 2.0mm MicroOne 2059792041 | | Connector B | JST, SFHR-02V-T-K, 1.8mm Housing, 2-POS | | Length | 80mm (-1), 20mm (-2) | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1.5 grams (-1), 0.9 grams (-2) | Pinout: | A | Signal | B | Signal | |--- |--- |--- |--- | | 1 | + (Red) | 1 | + | | 2 | - (Black) | 2 | - | | 3 | | | | | 4 | | | | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00132-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00132-2%20Drawing%20v2.pdf), Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00133 ![MCBL-00133](/images/other-products/cables/mcbl-00133-1.jpg) Description: - 4pin-JST-to-4pin-JST cable (cross-over 1:1, 2:3, 3:2, 4:4) - Exactly like MCBL-00015-3 but with pins 2&3 swapped for Cross-over UART Where Used: - Great item to have for making your own cables!! - JST 4-pin Applications with TX/RX to TX/RX on same pin 2&3 at each board Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S | | Connector B | JST, GHR-04V-S | | Length | 50mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 26 AWG | | Weight | 1.1 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | Pin1 | 1 | Pin1 | | 2 | Pin2 | 2 | Pin3 | | 3 | Pin3 | 3 | Pin2 | | 4 | Pin4 | 4 | Pin4 | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00133-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00137 ![MCBL-00137-1](/images/other-products/cables/mcbl-00137-1.jpg) Description: - ModalAI Yellow VBAT Format (2S-6S) Pigtail Cable, 100mm - This new yellow JST SFHR format is being used in places of larger XT-30 or XT-60 connectors as a micro board connector option Where Used: - Useful for general purpose JST eSFH connector hookups, with the yellow format - Useful for soldering onto power module or ESC pads to provide 2S-6S VBAT power to ModalAI products - Note: Red version are ModalAI's 5V format and Yellow are ModalAI's 2S-6S VBAT format Details: | Component | Details | |--- |--- | | Connector A | JST, SFHR-02V-L, 1.8mm Housing, 2-POS Yellow | | Length | 100mm | | Insulator | Silicone | | Color | Red/Black | | Gauge | 22 AWG | | Weight | 1.1 grams | Pinout: | A | Signal | B | Pigtail | |--- |--- |--- |--- | | 1 | + (Red) | 1 | + | | 2 | - (Black) | 2 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00137-1%20Drawing%20v2.pdf), Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00138 ![MCBL-00138-1](/images/other-products/cables/mcbl-00138-1.jpg) Description: - ModalAI PWM Type 2-B (3-pin Molex Picoblade) Cable - Receptacle Housing side meant for RC Receivers with 2 PWM signal outs + shared GND ref Where Used: - Stinger Drone - Multi-length variant tuned specifically for TBS Details: | Component | Details | |--- |--- | | Connector A | Molex, 0510210300, 3-POS PicoBlade Receptacle Housing | | Length | 25mm/30mm/35mm (black/purple/orange) | | Insulator | Flexible PVC | | Color | Black/Purple/Orange | | Gauge | 28 AWG | | Weight | 0.2 grams | Pinout: | A | Signal | B | Pigtails | |--- |--- |--- |--- | | 1 | PWM1 (Purple) | | - | | 2 | GND (Black) | | - | | 3 | PWM2 (Orange) | | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00138-1%20Drawing%20v5.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00146 ![MCBL-00146-1](/images/other-products/cables/mcbl-00146-1.jpg) Description: - Dual ModalAI Yellow 2S-6S VBAT Format to XT60 Male Cable - Just like MCBL-00116-1, but a Y-splitter Where Used: - Embedded within ESC and VTX/VRX Assemblies - Useful for general purpose JST eSFH connector hookups from a 2S-6S XT60 battery, when there are two boards with the yellow format - Note: JST eSFH Red versions are ModalAI's 5V format and Black/Grey are ModalAI's 1S VBAT (3.8V) format Details: | Component | Details | |--- |--- | | Connector A | AMASS, XT60U-M, Male plug, 2-POS | | Connector B/C | JST, SFHR-02V-L, 1.88 mm Housing, 2-POS | | Length | 50mm (each split) | | Insulator | Silicone | | Color | Red(+), Black (-) | | Gauge | 22 AWG | | Weight | 5.1 grams | Pinout: | A | Signal (Source) | B | Signal | C | Signal | |--- |--- |--- |--- |--- | --- | | + | + (Red) | 1 | + | 1 | + | | - | - (Black) | 2 | - | 2 | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00146%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00151 ![MCBL-00151-1](/images/other-products/cables/mcbl-00151-1.jpg) Description: - 8-Pin VOXL 2 UART JST GH to JST SH Jumper Cable for Rotor Riot Brave F7 - Plugs into VOXL 2 J10 to connect directly to the Brave F7 Flight Conteoller OSD UART Port @ 3.3V - RX, TX, and GND Only - Note there are two variants - - (-1) at 75mm, and (-2) at 100mm for slightly larger frames Where Used: - Customers that wish to use V2 Mini for VTX, yet BraveF7 for FC - ModalAI Shikra DIY Drone Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-08V-S, 1.25 mm Housing, 8-POS | | Connector B | JST, SHR-06V-S-B, 1.0 mm Housing (with Protrusions), 6-POS | | Length | 75mm (-1), 100mm (-2) | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 28 AWG | | Weight | 0.6 grams (-1), 0.8 grams (-2) | Pinout: | SIGNAL | CON A (V2 Mini side) | | CON B (BraveF7 side) | |--- |--- |--- |--- | | UART_TXO | Pin4 | 4 | OSD_RXI | | UART_RXI | Pin5 | 3 | OSD_TXO | | DGND | Pin8 | 6 | GND | Pinout, Part Number, & Additional Specs: [See -1 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00151-1%20Drawing%20v3.pdf), [See -2 Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00151-2%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- --- ## MCBL-00152 ![MCBL-00152](/images/other-products/cables/mcbl-00152-1.jpg) Description: - 4pin-JST GH to 4pin-JST SH cable (straight thru: 1:1) - Designed for USB2 Conversion from GH ModalAI Format to SH Where Used: - Any ModalAI JST 4-pin USB2 port that is required to slim down to a JST SH Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-04V-S | | Connector B | JST, SHR-04V-S-B | | Length | 50mm | | Insulator | PVC | | Color | Black, White/Green TP | | Gauge | 26AWG VBUS/GND, 28AWG Twisted Pair Signals | | Weight | 0.6 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS | 1 | VBUS | | 2 | D- | 2 | D- | | 3 | D+ | 3 | D+ | | 4 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00152-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00159 ![MCBL-00159](/images/other-products/cables/mcbl-00159-1.jpg) Description: - Molex Mini-SPOX 4-Pin Power Module Format Power Cable to Doodle Labs 6-pin JST GH Format - Designed for powering the Doodle Labs RM-2025-62M3 when also using a data-only USB2 cable such as [MCBL-00162-1](/cable-datasheets/#mcbl-00162) Where Used: - Useful for Doodle Labs or other JST 6-Pin High Current modes with 3 conductors for 5V from ModalAI's power module, M0041. Details: | Component | Details | |--- |--- | | Connector A | Molex, 0050375043 (Power Module side, 2 wires) | | Connector B | JST, GHR-06V-S | | Length | 100mm | | Insulator | PVC | | Color | Black | | Gauge | 20AWG to 26AWG | | Weight | 2.1 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VDC (Source) | 1, 2, 3 | 5V DC (Load) | | 2 | GND | 4, 5, 6 | GND | | 3 | - | - | - | | 4 | - | - | - | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00159-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00160 ![MCBL-00160](/images/other-products/cables/mcbl-00160-1.jpg) Description: - VOXL 2 Mini 8-Pin JST GH to DroneCode Compliant UART Port, 6-pin JST GH - TX/RX/GND Only Where Used: - Any VOXL 2 Mini based system where a DroneCode compliant UART device is needed from J10 when in UART mode (not SPI mode) Details: | Component | Details | |--- |--- | | Connector A | JST, GHR-08V-S | | Connector B | JST, GHR-06V-S | | Length | 100mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 28AWG | | Weight | 0.8 grams | Pinout: | A | VOXL 2 MINI | B | Device | |--- |--- |--- |--- | | 1 | - | - | - | | 2 | - | - | - | | 3 | - | - | - | | 4 | UART_TX_OUT | 3 | UART_RX_IN | | 5 | UART_RX_IN | 2 | UART_TX_OUT | | 6 | - | - | - | | 7 | - | - | - | | 8 | GND | 6 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00160-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- ## MCBL-00162 ![MCBL-00162](/images/other-products/cables/mcbl-00162-1.jpg) Description: - USB2 Type-A Plug to 4-pin JST GH Peripheral Data Only Cable - Designed for a data-only USB2 solution such as a Doodle Labs RM-2025-62M3 when a Type-A Female is present on the host - NO VBUS, Data +/- and GND Only. This solution expects the USB peripheral is powered independantly from USB, such as with [MCBL-00024-1](/cable-datasheets/#mcbl-00024), [MCBL-00159-1](/cable-datasheets/#mcbl-00159), or the like. Where Used: - Useful for a variety of USB peripherals that are self powered and need a host connection with a USB-A port - Do not confuse this with [MCBL-00104](/cable-datasheets/#mcbl-00104) for Boson which picks up VBUS for configuration purposes, this is just DATA ONLY in a 4-pin GH format Details: | Component | Details | |--- |--- | | Connector A | USB, Type A Male | | Connector B | JST, GHR-04V-S | | Length | 200mm | | Insulator | PVC | | Color | Black, White/Green TP | | Gauge | 26AWG GND, 28AWG Twisted Pair Signals | | Weight | 11.7 grams | Pinout: | A | | B | | |--- |--- |--- |--- | | 1 | VBUS | 1 | - | | 2 | D- | 2 | D- | | 3 | D+ | 3 | D+ | | 4 | GND | 4 | GND | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00162-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of these drawings. --- [Back to top](/cable-datasheets/#top) ## MCBL-00211 ![MCBL-00211-1](/images/other-products/cables/mcbl-00211-1.jpg) Description: - VOXL-PM-Y for FCv2 Flight Deck - Powers both VOXL and FlightCoreV2 from one Power Module, with the I2C bus for power monitoring going to FlightCoreV2 Where Used: - VOXL-m500 - [VOXL J1](/voxl-datasheets-connectors/) + [Flight Core V2 J13](/flight-core-v2-datasheets-connectors/#j13---power-input-and-voxl-pm-monitoring)to [VOXL PM v3](/power-module-v3-datasheet/) Details: | Component | Details | |--- |--- | | Connector A | Molex, 0050375043 (Power Module side, 4 wires)| | Connector B | Molex, 0050375043 (VOXL side, 2 wires) | | Connector C | JST, GHR-04V-S (Flight Core side, 4 wires) | | Length | 120mm | | Insulator | PVC (flexible) | | Color | Black | | Gauge | 20AWG (A-to-B)/ 26AWG (A-to-C) | | Weight | 4.0 grams | Pinout: | A | VOXL PM | B | VOXL | C | Flight Core V2 | |--- |--- |--- |--- |--- |--- | | 1 | 5V DC (Source) | 1 | 5V DC (Load) | 1 | 5V DC (Load) | | 2 | GND | 2 | GND | 2 | GND | | 3 | SCL | - | - | 3 | APM_I2C3_SCL_5V | | 4 | SDA | - | - | 4 | APM_I2C3_SDA_5V | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00211-1%20Drawing%20v3.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- [Back to top](/cable-datasheets/#top) --- ## MCBL-00218 ![MCBL-00218](/images/other-products/cables/mcbl-00218-1.jpg) Description: - RC Input (S.Bus, FrSky) - Picks up Power on Red+Black, and Receive Signal on Orange from FlightCoreV2 to a R/C receiver 3-pin 0.1" hobby format - - ModalAI conforms to the notion of Pin 1 = Signal, Pin 2 = 5V, & Pin 3 = GND for the 3-pin hobby format. Please notify us if you see anything here to the contrary. - Note: This is only intended for R/C receivers and cannot power high current servos or BLDCs Where Used: - Power 4-pin JST (connector B): [Flight Core V2 J8](/flight-core-v2-datasheets-connectors/#j8---can-bus-connector) and R/C signal 4-pin JST (connector C): [Flight Core J12](/flight-core-v2-datasheets-connectors/#j12---rc-input) to 3-pin Harwin M20 Receptacle (connector A) to RC Receiver (e.g. S.Bus/FrSky) - Note: This is not for Spektrum, which requires +3.3V. For Spektrum, please see MCBL-00005 | Component | Details | |--- |--- | | Connector A | Harwin M20-1060300, CONN RCPT HSG 3POS 2.54mm | | Connector B | JST GHR-04V-S, for +5V Power/GND | | Connector C | JST GHR-04V-S, for UART_RX signal, +3.3V levels | | Length | 150 mm | | Insulator | PVC (flexible) | | Color | Red/Black/Orange | | Gauge | 26 AWG | | Weight | 1.7 grams | Pinout: | A | RC Receiver | B | Power | C | R/C Signal | |--- |--- |--- |--- |--- |--- | | 1 | S.Bus/DSMX (Orange) | | | 3 | S.Bus/DSMX (Orange) | | 2 | 5V DC (Load) | 1 | RED (5V, Source) | | | | 3 | BLACK (GND) | 4 | GND | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00218-1%20Drawing%20v2.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- ## MCBL-00221 ![MCBL-00221-1](/images/other-products/cables/mcbl-00221-1.jpg) Description: - RC Input (FrSky R-XSR) - Picks up Power on Red+Black (from CANBUS port), and Receive Signal on Yellow (R/C Port) from FlightCoreV2 to FrSky R-XSR format R/C receiver 5-pin Picoblade format - Note: This is just like MCBL-00021 but for FlightCoreV2 instead of FCv1 Where Used: - 4-pin JST (connector B, yellow cable): [Flight Core V2 J12](/flight-core-v2-datasheets-connectors/#j12---rc-input) and 4-pin JST (connector A, Red+Black cables): [Flight Core V2 J8](/flight-core-v2-datasheets-connectors/#j8---can-bus-connector) to 5-pin Molex Picoblade (connector C) to FrSky R-XSR Receiver - Note if CONA and CONB are installed in the wrong/swapped ports on FCv2, damage should not occur due to the FrSKy receiving 3.3V instead of 5V, but the UART TX of the FrSky might be over-driven by the CANBUS transceiver damaging your receiver. Please install connectors carefully. | Component | Details | |--- |--- | | Connector A | JST GHR-04V-S, for +5V Power/GND | | Connector B | JST GHR-04V-S, for UART_RX signal, +3.3V levels | | Connector C | Molex 0510210500, 5-position Picoblade housing 1.25mm | | Length | 140 mm | | Insulator | Silicone | | Color | Red/Black/Yellow | | Gauge | 26 AWG | | Weight | 1.3 grams | Pinout: ![R-XSR-Pinout](/images/other-products/cables/mcbl-21-1-pinout.png) | A | Power | C | RC Receiver | B | Signal | |--- |--- |--- |--- |--- |--- | | 1 | RED (5V, Source) | 4 | 5V DC (Load) | | | | 2 | | 2 | S.Bus (Yellow) | 3 | S.Bus (Yellow) | | 3 | | | | | | | 4 | BLACK (GND) | 5 | GND | | | Pinout, Part Number, & Additional Specs: [See Drawing Here](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00221-1%20Drawing%20v4.pdf) Contact ModalAI on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) for .DXF or .DWG formats of this drawing. --- Source: https://docs.modalai.com/cable-userguides/ # Cable User Guides This section is meant to help users with finding cables, understanding various pinouts, and how to make your own cables from stock you may already have. Once a cable is made for sale and included in various kits, we will show all the relevant specifications (pinouts, BOM, length, etc) on the main datasheets page [here](/cable-datasheets/) New in this section is a brief user guide on how to use the M0163 JST Flexi-Adapter CCA. This is a powerful new CCA we have to enable converting the most common 4-pin and 6-pin JST GH cables into other 4-pin or generic formats with user-defined pinouts. ## Table of contents ### Comprehensive ModalAI Cable Spreadsheet and Examples The spreadsheet file linked [Here](https://storage.googleapis.com/modalai_public/modal_drawings/ModalAI%20Master%20Cable%20Catalogue%20v4%2012-19-23.xlsx) (Native Microsoft Excel format) is provided as a convenience for all customers to help find and understand the various cables we offer. It even includes information on cables that are EOL/Obsoleted, and cables in-the-works to hopefully give you a jump start. Latest Spreadsheet Update: **V4 on 12/19/23** - File updates (compared to V3): - - Added many new cables since MCBL-00083, plus several new "dash" numbers to existing cable products for length variations. Don't have MS Excel? We have verified the key "data filter" function works on the following two programs: - Linux/Mac user: "OfficeOnly-DekstopEditors" - Windows user: "Trio Office: Docs & Sheets Software" Below are some examples how to use this file, most of which is by using the filter pull-down arrows on the top/header row. Simple Usage: use the top row to sort and filter by the following attributes: ![Cable-Example-1](/images/other-products/cables/Cable-list-example-1.png) - ModalAI Item/Part Number (Default sorting order provided in the file) - Cable Category/Type (signal, Power, USB, etc) - Description - Status (Active, EOL, In Development, Obsolete) - Length (in mm): Note: Length refers to the cable conductor length measured from end-to-end, excluding any plastic shroud dimensions. This may not be provided for cables with three or more connectors if it not useful, in which case, please refer to the drawings) - CONA (connector A manufacturer and MPN) - CONB (connector B manufacturer and MPN) - CONC/COND (if applicable) > There is no convention for CONA vs CONB always being a specific type or function, so when searching for specific connector MPNs, be sure to include both ends in the A and B columns (example shown below). **User Example 1: Find a cable by Connector Mates** Let's say you want to find a cable that adapts a Hirose DF13-6S to a JST GHR-06. To find those relevant cables, start by clicking on the down arrow in the "CONA" column, de-select all items, and just select the "Hirose DF13-6S-1.25C" box and the "JST GHR-06V-S" box as shown here: ![Cable-Example-2](/images/other-products/cables/Cable-list-example-2.png) Next, repeat that same step on the CONB filter arrow (note there are now already less options to deselect) as shown here: ![Cable-Example-3](/images/other-products/cables/Cable-list-example-3.png) After this, you'll notice the entire file has been filtered to just about six cable options showing all cables that mate DF13-6 to JST GH-6 (and JST to JST along with DF13 to DF13), as shown: ![Cable-Example-4](/images/other-products/cables/Cable-list-example-4.png) Now, with this info, you can follow the web-links provided to bring you to the TechDocs section of our website that will provide you with further information, including drawings to confirm if these work for you. If you need to validate the pinouts, see the next example: **User Example 2: Determining the Pinouts Portrayed in the file** Once you think you found a cable that meets your length, connector, or function type, the pinouts are the next important function to confirm. The pinouts are listed in this file in a sentence-line aligned format. That is, the order (from top to bottom) the pin numbers are listed in the cell matter. The image below shows some of the more complex pin assignments to see how this works: ![Cable-Example-5](/images/other-products/cables/Cable-list-example-5.png) Start on the MCBL-00020, and note that the A:PINOUT and B:PINOUT show "1,2,3,4" and "1,2,3,4" respectively. This means that this is a 1:1 cable, so that pin1 of CONA connects to pin1 of CONB, and so on. Now, look at the MCBL-00011, and note that the A:PINOUT and B:PINOUT have 4 items, with mapping 1-1, 4-3, 5-4, and 6-2. Also note there is a CONC in this assembly. On that entry for C:PINOUT we see 1, -, -, 2. What this means is that pin1 connects to pin1 of BOTH CONA and CONB, but pin2 of CONC connects to pin6 of CONA, and pin2 of CONB. Note the "dashes". This shows that nothing on CONC connects to CONA/CONB pins 4-3, and the 5-4 connections. Another example is on MCBL-00021, where you can see that pin1 of CONA does NOT connect to CONB, but connects to pin4 of CONC, and pin3 of CONB connects to pin2 of CONC, and there are no connections between CONA and CONB. It can be a little bit of an eye strain at first, but once you follow through a few examples, this becomes easy and natural. And, of course, please contact us on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) and we will help you if you have any questions! We take pride in providing all the information needed to propel your projects to success. We will update this file very frequently in the up-coming months, so check back often and look for the version/date codes so you can see if there are any updates. For now, there will not be a "change log" as it is a simple spreadsheet file maintained manually, so for updates, you may need to run your own diff utility if it is not obvious. ### How to Modify MCBL-00022-2 for use with VOXL 2 Mini USB 3 Speeds This [document](https://storage.googleapis.com/modalai_public/modal_drawings/MCBL-00022-AC_Instructions_03-01-24.pdf) provides a step-by-step guide of how to take an existing MCBL-00022-2 and add series AC caps enabling VOXL 2 Mini to work with USB 3 speeds. Please reach out to us on the Forum if there are any questions or difficulties performing this rework. We hope to get this listed as a product on our webstore in the up-coming months. ### FlightCore V2 Conversion Cables Info As we update our website and tech docs with more info for FlightCore V2, we know some "power users" are comfortable making their own cable adapters. This section will help guide users that are switching from FCv1 to FCv2 make some of the basic conversion cables. We know it's a little terse below as we focus instead on making new cable drawings to better document all these cables going forward. If you cannot follow these instructions, please post on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) and we will help you out! **Upgrade Path (Compatibility Drawing) Primary UART Link Cable Options:** > Not all the cables in the images are listed here yet or on our sales pages, but will be soon! Please reach out to us on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) if you need immediate sales/shipping access to these planned cables, and we will accommodate you. You can also see the tips in this section below to guide making your own cables while we get everything posted. The following image is attempting to show what cables change for the UART/ESC/TELEM links between various systems as a user upgrades from Voxl1 or FlightCore V1 to Voxl2 or FlightCore V2. Please download [ESC-UART Cable Guide Here](/images/other-products/cables/ESC-UART-Cable-Guidance.pdf) as it is easier to see the details. This does not show all the other power and accessory cables, since those are much easier to scan our site to find, and many of them do not change between generations. We know the cables and connectors on our designs are hard to keep track of, so we hope this helps! ![ESC-UART Cable Guide](/images/other-products/cables/modalai-esc-cable-guide.png) > The STM32 has very specific parameters to allow 5V tolerance on UART RX pins. In the diagram above, for FCv2, we meet that constraint. However, if a customer uses a custom config, be sure to check all specs. **Recommended Parts to Order:** > Several parts below can be found in kits from Amazon or other large retailers, but they are most commonly knock-offs. Be sure your parts are genuine or you may have some issues following these guides and experience reliability problems long-term. - 6-position JST GH Shrouds, Digikey Link [Here](https://www.digikey.com/en/products/detail/jst-sales-america-inc/GHR-06V-S/807818?s=) - 4-position JST GH Shrouds, Digikey Link [Here](https://www.digikey.com/en/products/detail/jst-sales-america-inc/GHR-04V-S/807816?s=) - Pre-crimped JST GH Pin Contact (SSHL-002T-P0.2) Jumper cable (gives you two contacts per cable, ideal for splicing, can also get in shorter lengths), Digikey Link [Here](https://www.digikey.com/en/products/detail/jst-sales-america-inc/AGHGH28K305/6009450) **Tips for making cables:** Get a good set of ESD safe tweezers. Use a well-lit area with a magnifying glass (helps you find the very small pin 1 arrows or notches). Plan to discard the old plastic shrouds/housing when re-pinning connectors: - When taking an existing JST/Hirose/0.025" pin header pin from a shroud, it is important to salvage the pin contact and the integrity of the "barb" that latches into the plastic housing. Therefore, we recommend using tweezers and flipping up the plastic tab that the barb grabs onto, and deliberately damage the plastic shroud that is being replaced anyway. If you press into the crimp terminal to push the barb down, it is required to then pry it back up, which adds a micro-fracture and stress crack into the metal crimp terminal. Crimp tools are expensive (so buy the pre-crimped wires posted above) and soldering is annoying and can be unreliable. Therefore, just toss your old plastic housing when you re-pin anything. Doing this will ensure the maximum integrity of the crimp terminal and wire connection to the housing. **Cables that work the same as FCv1:** MCBL-00004 PWM Output Cable MCBL-00005 RC Input Cable (Spektrum) MCBL-00008 VOXL to Flight Controller 2W UART TELEM1 port J1 (Dronecode Compliant, can be ESC or MAVLINK, SW Depending) - Note, Voxl J12 is a 5V bus. FCv1 J1 is also a 5V bus. However, FCv2 J1 port is a 3.3V bus to be in-line with Dronecode, but it is 5V Tolerant due to buffers on J1. All other FCv2 ports are NOT 5V compliant since they are direct to the MCU which has an ABS max of 4.0V on all signal pins. There are a few noted exceptions as shown in the diagram above. Most of the Receive UART pins are 5V tolerant, but the receive buffers on the other side loose a lot of noise margin. It gets complicated really fast parsing through the MCU datasheet and running PX4 on-top. Always reach out if you need more info. - The other two 6-pin DF13 ports on Voxl (J10, J11) are 3.3V signal levels, and therefore with MCBL-00008, can connect to FCv2 J1 or J5. MCBL-00009 4-pin JST to micro USB Female/Receptacle Cable MCBL-00028-2 Seeker GPS Cable **Cables Already in Process on ModalAI.com, but you can get a jump start if you want:** This **tutorial [Here](https://storage.googleapis.com/modalai_public/modal_drawings/Make_MCBL-00061_from_MCBL-00015_Tutorial.pdf)** is a great step-by-step with detailed photos showing how to make an MCBL-00061 from an MCBL-00015. Once you have reviewed this tutorial, any of the changes shown below should be easy to follow, understand, and replicate as you need! The format here is showing how to make a new cable from an existing one (Existing -> New) by swapping out a few shrouds and re-pinning them. MCBL-00003 → **MCBL-00062** (Standalone power from APM) - From MCBL-00003 - Keep Molex Mini-Spox side - Change JST 6-pin to JST 4-pin GHR-04V-S as follows: - - pin 1 of Molex to pin1 of 4-pin JST, 2:2, 3:3, 4:4 - Power plugs into M0087 J13 (Might be RED) MCBL-00011 → **MCBL-00211** (APM to Voxl/Voxl2 + FCv2) - From MCBL-00011 - Keep Both Molex Mini-Spox sides - Change JST 6-pin to JST 4-pin GHR-04V-S as follows: - - pin 1 of Molex to pin1 of 4-pin JST, 2:2, 3:3, 4:4 - Power plugs into M0087 J13 (Might be RED) FrSKY/S.BUS 5V RC Cables: On FCv1, 3-pin JST for J9 now moves to a 4-pin JST J8 (CANBUS Port) since that is the only "free" +5V source easily picked up MCBL-00018 → **MCBL-00218** ( FCv2 RC Input (S.Bus, FrSky)) - From MCBL-00018 - Keep 3-pin Harwin Socket and 4-pin JST (with the single wire) - Change 3-pin JST red/black to 4-pin JST GHR-04V-S as follows: - - Pin 1 stays to Pin 1 - - Pin 2 and now Pin 3 stay empty on the new 4-pin - - Pin 3 moves to pin 4 (GND) FrSKY/S.BUS 5V RC Cables: Switching from FCv1 to VOXL2 I/O (M0065) to effectively make MCBL-00064 MCBL-00018 → **MCBL-00064** ( FCv2 RC Input (S.Bus, FrSky)) - From MCBL-00018 - Keep 3-pin Harwin Socket and 4-pin JST (with the single wire) - Keep Pin 1 of Harwin Socket to Pin 3 of 4-pin JST (Signal) - Remove (and discard) 3-pin JST housing. Red and black cables remap to the 4-pin JST as follows: - - Pin 1 of the 3-pin JST now moves to Pin1 of the 4-pin JST (+5V) - - Pin 3 of the 3-pin JST now moves to Pin4 of the 4-pin JST (GND) MCBL-00021 → **MCBL-00221** ( FCv2 RC Input (FrSky R-XSR)) - From MCBL-00021 - Keep 5-pin Picoblade socket and 4-pin JST (with the single wire) - Change 3-pin JST red/black to 4-pin JST GHR-04V-S as follows: - - Pin 1 stays to Pin 1 - - Pin 2 and now Pin 3 stay empty on the new 4-pin - - Pin 3 moves to pin 4 (GND) MCBL-00029 → **MCBL-00063-1** ( FCv2 to ModalAI ESC, 200mm) - From MCBL-00029 - Keep the Hirose DF13 side - Change JST 4-pin to JST 6-pin GHR-06V-S as follows: - - Pin 2 and Pin 3 of 4-pin move to pin 2 & pin 3 of 6-pin. - - Pin 4 GND of 4-pin to pin 6 GND of 6-pin JST MCBL-00008 → **MCBL-00063-2** ( FCv2 to ModalAI ESC, 90mm) - From MCBL-00008 - Keep the Hirose DF13 side - Repin the JST 6-pin to swap pins 2&3: - - Pin 2 and Pin 3 of 6-pin JST swap positions in the housing. - - Note, it might be OK to keep this housing if you replace them carefully, otherwise, you should plan on replacing the housing as per our standard recommendations. - - In the case of housing replacement, be sure to keep Pin 6 in the same Pin 6 location along with the 2 swaps noted above. # M0163 JST FLEXI-Adapter User Guide Our new M0163 circuit board is designed to cover a lot of the common annoyances with various 6-pin and 4-pin JST cables. We designed this adapter as a very fast and easy way to use a single MCBL-00091 USB to Serial FTDI Console cable [MCBL-00091 Link Here](/cable-datasheets/#mcbl-00091) and switch between the M0129 Mini ESC port J1 (to run ESC programming and test tools) or to easily swap RX/TX and connect to VOXL 2 ESC port J18 for Hardware In The Loop (HWIL/HIL) simulation. We also added a few extra features such as converting 6-pin JST to 4-pin JST or any 4-pin/6-pin conversion by using standard 0.025" square header posts. This section will cover many common scenarios and provide guidance how to use this neat little adapter. But first, download all the design data!!! We are making the Schematic, Assembly, and 3D step available to help you use this neat tool: ## M0163 Design Collateral - Schematic available [Here](https://storage.googleapis.com/modalai_public/modal_drawings/M0163_4-PIN_JST_FLEXI_ADAPTER_REVA.PDF) - Assembly Drawing available [Here](https://storage.googleapis.com/modalai_public/modal_drawings/M0163_4-PIN_JST_FLEXI_ADAPTER_REVA_ASY.PDF) - 3D Step file available [Here](https://storage.googleapis.com/modalai_public/modal_drawings/M0163_4-PIN_JST_FLEXI_ADAPTER_REVA(-1_MAIN).step) Please dig into the schematic to understand how to use this tool. If you are having any difficulties reading that or understanding some of these examples, please reach out to us on the [Forum](https://forum.modalai.com/category/49/voxl-accessories) and be sure to mention the M0163 or this page. ## M0163 User Examples ### M0163 4-pin JST to 4-pin JST Straight Through Example In this example, let's say you are running ESC Tools on the M0129, and you bought an MCBL-00091. Normally, there is nothing to do. MCBL-00091 can plug directly into M0129 J1. But, if you wanted to probe the UART lines, then this adapter will help by exposing them on the 4-position jumper block. In this case, you want to follow the image shown here, where the 4-jumpers are bridging the pins 1-2, 3-4, 5-6, and 7-8 as shown. We use RED and BLUE on purpose here to track the changes later on: ![4-to-4-straight](/images/hardware-design-guides/straight-4-to-4-example.jpg) This example shows how an MCBL-00015 [Link Here](/cable-datasheets/#mcbl-00015) would be needed to connect your ESC (or other 4-pin JST) to the Flexi-Adapter. ### M0163 4-pin JST to 4-pin JST Cross-Over Example In this example, let's say you bought an MCBL-00091 and want to run HWIL using your VOXL 2. In this case, you need to swap RX/TX pins on MCBL-00091. Instead of re-pinning your serial adapter, all that is needed now is to re-position the jumpers on the jumper block. In this case, you want to follow the image shown here, where the 4-jumpers are bridging the pins 1-2, 3-5, 4-6, and 7-8 as shown. We use RED and BLUE on purpose here to track the changes relative to the straight-thru example above: ![4-to-4-cross](/images/hardware-design-guides/cross-4-to-4-example.jpg) This example shows how an MCBL-00015 [Link Here](/cable-datasheets/#mcbl-00015) would be needed to connect your VOXL 2 (or other 4-pin JST) to the Flexi-Adapter. Note the RED and BLUE jumpers are now installed rotated. ### M0163 6-pin JST to 4-pin JST Straight Through Example In this example, let's say you bought a VOXL 2 [Developer Test Board](/voxl2-dev-test-board/) or any other ModalAI Hardware with UARTs in the 6-pin format and you need to display that port data to a serial console on your host machine. The Flexi-Adapter was designed with that in mind as well. However, we provide full re-pinning flexibility for any pins on your 6-pin JST to be re-mapped to any of the 4-pins on JCOM. Care must be taken to ensure you do not cross-wire power and ground pins, and that you also provide a common ground connection between all the hardware. ![6-to-4-straight](/images/hardware-design-guides/straight-6-to-4-example.jpg) This example shows how an MCBL-00031 [Link Here](/cable-datasheets/#mcbl-00031) would be needed to connect your 6-pin JST ports to the Flexi-Adapter J6J with pins 2 & 3 aligning as RX/TX. Note the RED and BLUE jumper cables, and in this image we do not show the Ground cable. ### M0163 6-pin JST to 4-pin JST Cross-Over Example In this example, let's say you bought a VOXL 2 [Developer Test Board](/voxl2-dev-test-board/) or any other ModalAI Hardware with UARTs in the 6-pin format and you need to display that port data to a serial console on your host machine, and for whatever reason the mapping is reversed from MCBL-00091. The Flexi-Adapter was designed with that in mind as well. Just like above, any pins on your 6-pin JST can be re-mapped to any of the 4-pins on JCOM. Care must be taken to ensure you do not cross-wire power and ground pins, and that you also provide a common ground connection between all the hardware. ![6-to-4-cross](/images/hardware-design-guides/cross-6-to-4-example.jpg) This example shows how an MCBL-00031 [Link Here](/cable-datasheets/#mcbl-00031) would be needed to connect your 6-pin JST ports to the Flexi-Adapter J6J with pins 2 & 3 aligning as TX/RX. Note the RED and BLUE jumper cables crossed from above, and in this image we do not show the Ground cable. ### M0163 6-pin JST to 4-pin JST Adapter In this example, You can effectively convert a 6-pin JST to a 4-pin JST with any pinout you wish. This is where your imagination can really go wild by converting any thing to anything else. Simply connect the 6-pin header pins to the even or odd side of the 2x4 header as needed. The possibilities are endless. ![6-to-4-conversion](/images/hardware-design-guides/6-to-4-pin-converter.jpg) This example shows how an MCBL-00031 [Link Here](/cable-datasheets/#mcbl-00031) can effectively be connected to an MCBL-00015 [Link Here](/cable-datasheets/#mcbl-00015) and it is possible with some additional soldering to the jumpers you can create a "Y" cable from the 6-pin to two 4-pins, or any combination thereof. --- Source: https://docs.modalai.com/part-numbers/ # Part Number Index Every ModalAI part number referenced in these docs, resolved to its product page. Hovering a part number anywhere in the docs shows the same preview card. ## {{ group.name }} | Part | Product | Mentioned on | |---|---|---| | **{{ p.num }}** | {% if p.img %}![]({{ p.img }}) {% endif %}[{{ p.title }}]({{ p.url }}) | {{ p.count }} page{% if p.count != 1 %}s{% endif %} | --- Source: https://docs.modalai.com/deprecated/ # Deprecated Pages > These pages are deprecated --- Source: https://docs.modalai.com/downloads/ # Downloads ## VOXL SDK Releases Each platform is flashed with a complete SDK release: | Platform | SDK tarball | Download | |----------|-------------|----------| | VOXL 2 (M0054) | `voxl2_SDK_x.y.z.tar.gz` | VOXL 2 Platform Releases | | VOXL 2 Mini (M0104, M0204) | `voxl2-mini_SDK_x.y.z.tar.gz` | VOXL 2 Mini Platform Releases | | VRX (R0001) | `ubun2.0-multi_SDK_x.y.z.tar.gz` | VRX Platform Releases | | VOXL (M0006) / VOXL Flight (M0019) — EOL | `voxl_SDK_x.y.z.tar.gz` | VOXL 1 Platform Releases | Not sure which release your vehicle needs? See [Which SDK Should I Flash?](/voxl-suite/#which-sdk-should-i-flash) — then follow [Flash the SDK](/flash-system-image/) to install it. What changed in each release is in the [Release Notes](/voxl-suite/). ## Account-Gated Downloads Some files cannot be shared without a EULA, so you will need to make a free account at [downloads.modalai.com](https://downloads.modalai.com) to reach them. Our goal is to make as much as possible open and easily available, but there are some restrictions we have to follow. System images, software bundles, and Docker images all live there. ## Public Packages Pre-built copies of our open-source projects are served from [voxl-packages.modalai.com](http://voxl-packages.modalai.com) — this is the package repository your VOXL's package manager talks to. Source code for these packages is on [GitLab](https://gitlab.com/voxl-public). ## STEP Files and Drawings 3D STEP models and 2D drawings for ModalAI boards are collected in the [PCB Catalog](/pcb-catalog/); each board's datasheet page links its own drawings as well. --- Source: https://docs.modalai.com/contact/ # Contact The best way to get technical help is the [ModalAI Forum](https://forum.modalai.com/) — post in the [category matching your product](https://forum.modalai.com/categories) and the engineering team plus the community will see it. Other ways to reach us: - **Sales and general inquiries** — [contact form](https://www.modalai.com/pages/contact-us) on modalai.com - **Orders and products** — [ModalAI Store](https://www.modalai.com/) - **Debugging a problem?** Start with the [Debugging Services](/debugging-services/) guide — and include `voxl-version` and `journalctl` output in forum posts - **Documentation issues** — every page footer has "Suggest an edit" and "report an issue" links (merge requests are welcome)