1

I do my first step in developing on the PX4 using Docker.

Therefore I extend the px4io/px4-dev-nuttx image to px4dev with some extra installations.

Dockerfile

FROM px4io/px4-dev-nuttx

RUN apt-get update && \
    apt-get install -y \
    python-serial \
    openocd \
    flex \
    bison \
    libncurses5-dev \
    autoconf \
    texinfo \
    libftdi-dev \
    libtool \
    zlib1g-dev

RUN useradd -ms /bin/bash user
ADD ./Firmware /src/firmware/
RUN chown -R user:user /src/firmware/

Than I run the image/container:

docker run -it --privileged \
    --env=LOCAL_USER_ID="$(id -u)" \
    -v /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00:/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00:rw \
    px4dev \
    bash

I also tried:

--device=/dev/ttyACM0 \
--device=/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 \

Than I switched to /src/firmware/, build the code. But the upload always results in this error:

make px4fmu-v2_default upload
ninja: Entering directory `/src/firmware/build/nuttx_px4fmu-v2_default'
[0/1] uploading px4
Loaded firmware for board id: 9,0 size: 1028997 bytes (99.69%), waiting for the bootloader...

I use a Pixhawk 2.4.8, my host is an Ubuntu 18.04 64bit. Doing the same at the host will work.

  1. What is going wrong here? Does maybe a reboot of the PX4 during flashing it cause the problem?

  2. If it is generally not possible, what is the output file of the build and is it possible to upload this using QGroundControl?

Kind regards, Alex


run script:

#!/bin/bash

docker run -it --rm --privileged \
    --env=LOCAL_USER_ID="$(id -u)" \
    --device=/dev/ttyACM0 \
    --device=/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 \
    --name=dev01 \
    px4dev \
    bash

for any reason sometimes the upload ends differently:

user@7d6bd90821f9:/src/firmware$ make px4fmu-v2_default upload
...
[153/153] Linking CXX executable nuttx_px4io-v2_default.elf
[601/602] uploading /src/firmware/build/px4fmu-v2_default/px4fmu-v2_default.px4
Loaded firmware for 9,0, size: 1026517 bytes, waiting for the bootloader...
If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.

but even if I do so. It stucks here.


regarding the default device, I grep through the build folder:

user@7d6bd90821f9:/src/firmware$ grep -r "/dev/serial" ./build/
./build/px4fmu-v2_default/build.ninja:  COMMAND = cd /src/firmware/build/px4fmu-v2_default && /usr/bin/python /src/firmware/Tools/px_uploader.py --port "/dev/serial/by-id/*_PX4_*,/dev/serial/by-id/usb-3D_Robotics*,/dev/serial/by-id/usb-The_Autopilot*,/dev/serial/by-id/usb-Bitcraze*,/dev/serial/by-id/pci-3D_Robotics*,/dev/serial/by-id/pci-Bitcraze*,/dev/serial/by-id/usb-Gumstix*" /src/firmware/build/px4fmu-v2_default/px4fmu-v2_default.px4

there is px_uploader.py --port "...,/dev/serial/by-id/usb-3D_Robotics*,...". So I would say it looks out for /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00!

Looking with ls /dev/ inside the container for the devices available, neither /dev/ttyACM0 nor /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 is listed. Here may is the problem. Something is wrong with --device=...

But ls shows that /dev/usb/ is available. So I checked it with lsusb and the PX4 is listed next to the others:

user@3077c8b483f8:/$ lsusb
Bus 003 Device 018: ID 26ac:0011 

Maybe there is not correct driver inside the container for this USB device?

On my host I got the major:minor no 166:0:

user:~$ ll /dev/
crw-rw----  1 root dialout   166,     0 Jan  2 00:40 ttyACM0

The folder /sys/dev/char/166:0 is identical at host and container as far as I can see. And at the container seems to be a link to someting with */tty/ttyACM0 like on the host:

user@3077c8b483f8:/$ ls -l /sys/dev/char/166\:0
lrwxrwxrwx 1 root root 0 Jan  1 23:44 /sys/dev/char/166:0 -> ../../devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.3/3-1.3.1/3-1.3.1.3/3-1.3.1.3:1.0/tty/ttyACM0

At the host I got this information about the devices - but this is missing inside the container:

user:~$ ls -l /dev/ttyACM0 
crw-rw---- 1 root dialout 166, 0 Jan  2 00:40 ttyACM0
user:~$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Jan  2 00:40 usb-3D_Robotics_PX4_FMU_v2.x_0-if00 -> ../../ttyACM0

Following this post I changed my run script to (without the privileged flag)

#!/bin/bash
DEV1='/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00'
docker run \
    -it \
    --rm \
    --env=LOCAL_USER_ID=0 \
    --device=/dev/ttyACM0 \
    --device=$DEV1 \
    -v ${PWD}/Firmware:/opt/Firmware \
    px4dev_nuttx \
    bash

Than I see the devices. But they are not accessible.

root@586fa4570d1c:/# setserial /dev/ttyACM0 
/dev/ttyACM0, UART: unknown, Port: 0x0000, IRQ: 0
root@586fa4570d1c:/# setserial /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 
/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00, UART: unknown, Port: 0x0000, IRQ: 0
Alex44
  • 3,597
  • 7
  • 39
  • 56

0 Answers0