Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
Brand Logo

ModalAI Forum

  1. ModalAI Support Forum
  2. Ask your questions right here!
  3. PX4 -> QGC connection through USB for VOXL2

PX4 -> QGC connection through USB for VOXL2

Scheduled Pinned Locked Moved Ask your questions right here!
27 Posts 8 Posters 3.1k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Alex KushleyevA Alex Kushleyev

    @bendraper , I will ask around.

    B Offline
    B Offline
    bendraper
    Regular
    wrote on last edited by
    #18

    @Alex-Kushleyev So I can see a gadget functionality called gsi.rndis (I'd expect something called rndis.0 or something but maybe that is irrelevant) but when I change the line in /sbin/usb/compositions/901D to use gsi.rndis instead of ncm.0, my network interface on windows disappears and I can no longer ADB. I'd imagine there's something at the kernal level that doesn't like that but I'm out of my wheelhouse there. Setting it back to ncm.0 returns to the previous state but still cannot ping. Wireshark doesn't even see anything happening over that interface

    1 Reply Last reply
    0
    • Zachary Lowell 0Z Offline
      Zachary Lowell 0Z Offline
      Zachary Lowell 0
      ModalAI Team
      wrote on last edited by
      #19

      Hi All - gonna spend a bit of time looking into this today so I can get some context on the problem.

      Zach

      B 1 Reply Last reply
      0
      • Q Offline
        Q Offline
        qt
        wrote on last edited by qt
        #20
        This post is deleted!
        Q 1 Reply Last reply
        0
        • Q qt

          This post is deleted!

          Q Offline
          Q Offline
          qt
          wrote on last edited by
          #21
          This post is deleted!
          1 Reply Last reply
          0
          • Alex KushleyevA Alex Kushleyev

            @Sarika-Sharma ,

            We discussed this internally and we will make an effort to formalize enabling the instructions (in a script) in the near future, but there is a relatively short way of enabling TCP/IP communication between VOXL2 and a QGC host. Please try these instructions and let us know if that works for you or what issue you run in to.

            Basically, there is a command to enable the usb gadget in the kernel and this creates the network interface which you then have to configure on both sides. You can change the IP range if necessary.

            Alex

            # VOXL2 Setup
            # Begin by configuring the usb gadget
            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
            
            # Reboot VOXL2
            
            # Check usb0 network device
            voxl2:/$ ifconfig usb0
            usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
                    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
            - note that a network manager may rename the device from usb0 to something else..
            
            ifconfig usb0
            usb0: flags=4098<BROADCAST,MULTICAST>  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
            
            #bring up the interface and set it to static ip
            sudo ip addr add 192.168.7.1/24 dev usb0 
            sudo ip link set usb0 up
            
            # Can also use Network manager to configure the network interface for a static configuration
            - address 192.168.7.1
            - netmask 255.255.255.0
            - gateway 192.168.7.1
            
            # ping VOXL2 from linux host
            - ping 192.168.7.2
            
            #set up QGC
            - use ip address:port : 192.168.7.2:14550
            
            You can also use other network tools like ssh, etc, to communicate to the host, but this setup does not enable you to communicate from VOXL2 to outside world (using NAT to enable internet access via the host)
            
            Q Offline
            Q Offline
            qt
            wrote on last edited by
            #22

            @Alex-Kushleyev
            That's not perfect but I created a shell script based on https://docs.modalai.com/qgc-via-adb/ for the drone configuraiton.
            For my PC configuration, I created an udev rule to force an interface name since usb0 is renamed in "enx******". My udev rule can only work with my drone (I think). To define IP address, I add a conf file in /etc/systemd/network/
            I have only tested on my linux and it works perfectly :

            #!/usr/bin/env bash
            set -euo pipefail
            
            # See ModalAI doc : https://docs.modalai.com/qgc-via-adb/
            
            UDEV_RULE_DRONE="/etc/udev/rules.d/80-usb-ncm.rules"
            UDEV_RULE_PC="/etc/udev/rules.d/99-voxl-usb-ncm.rules"
            SYSTEMD_CONF_PC="/etc/systemd/network/10-voxl0.network"
            
            USB_COMP_QUALCOM="/sbin/usb/compositions/901D"
            
            # Network configuration
            USB_IFACE="usb0"
            USB_NET="192.168.7.0/24"
            PC_IP="192.168.7.1"
            DRONE_IP="192.168.7.2"
            NM_CONN_NAME="voxl-usb-ncm"
            
            show_help() {
                echo "Usage: $0 [--pc] [--drone] [--uninstall]"
                echo
                echo "Enable USB NCM networking for ModalAI VOXL / Starling 2 Max"
                echo
                echo "Options:"
                echo "  --pc         Configure host PC only"
                echo "  --drone      Configure drone via adb only"
                echo "  --uninstall  Remove configuration"
                echo "  --help       Show this help"
                echo
                echo "Defaults: if neither --pc nor --drone is provided, both are processed."
            }
            
            do_pc_install() {
                echo "[INFO][PC] Installing udev rule for VOXL USB NCM"
            
                cat > "$UDEV_RULE_PC" <<EOF
            SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="901d", ATTRS{serial}=="890d035c", NAME="voxl0"
            EOF
            
                echo "[INFO][PC] Creating systemd-networkd config for voxl0"
            
                cat > "$SYSTEMD_CONF_PC" <<EOF
            [Match]
            Name=voxl0
            
            [Network]
            Address=${PC_IP}/24
            LinkLocalAddressing=no
            IPv6AcceptRA=no
            EOF
            
                echo "[INFO][PC] Reloading udev rules"
                udevadm control --reload-rules
                udevadm trigger
            
                echo "[INFO][PC] Restarting systemd-networkd"
                systemctl restart systemd-networkd
            
                echo "[INFO][PC] PC installation complete"
            }
            
            do_pc_uninstall() {
                echo "[INFO][PC] Removing PC configuration"
            
                if [ -f "$UDEV_RULE_PC" ]; then
                  rm -f "$UDEV_RULE_PC"
                  echo "[INFO][PC] Removed udev rule"
                fi
            
                if [ -f "$SYSTEMD_CONF_PC" ]; then
                  rm -f "$SYSTEMD_CONF_PC"
                  echo "[INFO][PC] Removed systemd-networkd config"
                fi
            
                echo "[INFO][PC] Reloading udev rules"
                udevadm control --reload-rules
                udevadm trigger
            
                echo "[INFO][PC] Restarting systemd-networkd"
                systemctl restart systemd-networkd
            
                echo "[INFO][PC] PC uninstallation complete"
            }
            
            do_drone_install() {
                echo "[INFO][DRONE] Enabling USB NCM networking on VOXL via adb"
            
                adb root
                adb remount
            
                echo "[INFO][DRONE] Updating USB composition in Qualcomm script \
            $USB_COMP_QUALCOM configure the usb gadget with \
            the addition of the function NCM"
                echo "[INFO][DRONE] In $USB_COMP_QUALCOM, \
            add the line 'ln -s functions/ncm.0 configs/c.1/f3 2>/dev/null | true' \
            just after the line 'ln -s functions/ffs.adb configs/c.1/f2'"
                
                adb shell "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' \
                $USB_COMP_QUALCOM"
            
                echo "[INFO][DRONE] Creating udev rule $UDEV_RULE_DRONE for usb0 with IP ${DRONE_IP}"
                
                adb shell "cat << 'EOF' > $UDEV_RULE_DRONE
            ACTION==\"add\", SUBSYSTEM==\"net\", KERNEL==\"usb0\", \
            RUN+=\"/bin/sh -c 'sleep 2; /sbin/ifconfig usb0 ${DRONE_IP} netmask 255.255.255.0 up'\"
            EOF"
            
                echo "[INFO][DRONE] NCM enabled — reboot required"
            }
            
            do_drone_uninstall() {
                echo "[INFO][DRONE] Removing NCM configuration"
            
                adb root
                adb remount
            
                echo "[INFO][DRONE] Removing udev rule $UDEV_RULE_DRONE"
                adb shell "rm -f $UDEV_RULE_DRONE || true"
            
                echo "[INFO][DRONE] Reverting USB composition (901D)"
                adb shell "
                sed -i '/ln -s functions\\/ncm.0 configs\\/c.1\\/f3/d' \
                $USB_COMP_QUALCOM
                "
            
                echo "[INFO][DRONE] USB NCM configuration removed"
                echo "[INFO][DRONE] Reboot required to fully apply changes"
            }
            
            
            # Arg parsing
            TARGET_PC=false
            TARGET_DRONE=false
            DO_UNINSTALL=false
            
            for arg in "$@"; do
              case "$arg" in
                --help) show_help; exit 0 ;;
                --pc) TARGET_PC=true ;;
                --drone) TARGET_DRONE=true ;;
                --uninstall) DO_UNINSTALL=true ;;
                *)
                  echo "[ERROR] Unknown argument: $arg";
                  show_help;
                  exit 1 ;;
              esac
            done
            
            # Default to both if none selected
            if ! $TARGET_PC && ! $TARGET_DRONE; then
              TARGET_PC=true
              TARGET_DRONE=true
            fi
            
            # Execute
            if $DO_UNINSTALL; then
              $TARGET_PC && do_pc_uninstall
              $TARGET_DRONE && do_drone_uninstall
            else
              $TARGET_PC && do_pc_install
              $TARGET_DRONE && do_drone_install
            fi
            
            echo "[INFO] All done."
            ``
            
            1 Reply Last reply
            0
            • Zachary Lowell 0Z Zachary Lowell 0

              Hi All - gonna spend a bit of time looking into this today so I can get some context on the problem.

              Zach

              B Offline
              B Offline
              bendraper
              Regular
              wrote on last edited by
              #23

              @Zachary-Lowell-0 Hey Zach did you discover anything in this effort? I played around with recompiling the kernel to include the CONFIG_USB_CONFIGFS_RNDIS=y flag and confirmed it took on my Voxl 2 Mini, and can see the existence of a new rndis.rndis function in the usb gadget functions directory, but when I try to reconfigure the 901D config file, I end up just breaking the USB port entirely.

              1 Reply Last reply
              0
              • Zachary Lowell 0Z Offline
                Zachary Lowell 0Z Offline
                Zachary Lowell 0
                ModalAI Team
                wrote on last edited by
                #24

                @qt said in PX4 -> QGC connection through USB for VOXL2:

                name

                @bendraper I kind of redid exactly what you described above and ran into very similar issue in the sense that it basically rocked my usb-c port. All this to say, I think we should choose a different route - is it possible instead to route the packets via adb over the USB-C port instead to basically get the same result? Point the software to the serial connection and leverage ADB to pull the packets that are forwarded? Basically creating our own sudo rndis connection almost.

                Zach

                B 1 Reply Last reply
                0
                • Zachary Lowell 0Z Zachary Lowell 0

                  @qt said in PX4 -> QGC connection through USB for VOXL2:

                  name

                  @bendraper I kind of redid exactly what you described above and ran into very similar issue in the sense that it basically rocked my usb-c port. All this to say, I think we should choose a different route - is it possible instead to route the packets via adb over the USB-C port instead to basically get the same result? Point the software to the serial connection and leverage ADB to pull the packets that are forwarded? Basically creating our own sudo rndis connection almost.

                  Zach

                  B Offline
                  B Offline
                  bendraper
                  Regular
                  wrote on last edited by
                  #25

                  @Zachary-Lowell-0 This would probably work but for my use case I cannot guarantee ADB being an option unfortunately.

                  Alex KushleyevA 1 Reply Last reply
                  0
                  • B bendraper

                    @Zachary-Lowell-0 This would probably work but for my use case I cannot guarantee ADB being an option unfortunately.

                    Alex KushleyevA Offline
                    Alex KushleyevA Offline
                    Alex Kushleyev
                    ModalAI Team
                    wrote on last edited by Alex Kushleyev
                    #26

                    @bendraper , have you considered running a docker container (VM) on your Windows machine with a minimal Linux kernel that would use the Linux drivers for NCM and create the proper network connection between VOXL2 and Linux container. Then you could potentially set up the routing table in Windows so that it can access the device via the Linux container and linux container may need to have some networking magic down as well to pass through the communication?

                    Alex

                    1 Reply Last reply
                    0
                    • Zachary Lowell 0Z Offline
                      Zachary Lowell 0Z Offline
                      Zachary Lowell 0
                      ModalAI Team
                      wrote on last edited by
                      #27

                      ^^^ This is the next best option outside of ADB IMO - nice suggestion @Alex-Kushleyev

                      1 Reply Last reply
                      0
                      • Alex KushleyevA Alex Kushleyev referenced this topic on

                      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                      With your input, this post could be even better 💗

                      Register Login
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      ModalAI
                      Categories Recent Tags ModalAI.com Docs
                      © 2026 ModalAI® · Accelerating autonomy for smaller, smarter, safer drones · Powered by NodeBB
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups