0

我是使用 Docker 在 PX4 上进行开发的第一步。

因此,我通过一些额外的安装px4io/px4-dev-nuttx来扩展图像。px4dev

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/

比我运行图像/容器:

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

我也试过:

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

比我切换到/src/firmware/,构建代码。但是上传总是会导致这个错误:

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...

我使用 Pixhawk 2.4.8,我的主机是 Ubuntu 18.04 64 位。在主机上做同样的事情会奏效。

  1. 这里出了什么问题?在刷机过程中重启 PX4 是否会导致问题?

  2. 如果通常不可能,构建的输出文件是什么,是否可以使用 QGroundControl 上传?

亲切的问候,亚历克斯


运行脚本:

#!/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

出于某种原因,有时上传的结束方式会有所不同:

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.

但即使我这样做。它卡在这里。


关于默认设备,我通过构建文件夹 grep:

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

px_uploader.py --port "...,/dev/serial/by-id/usb-3D_Robotics*,..."。所以我会说它寻找/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00

ls /dev/在容器内部查看可用设备,既没有列出/dev/ttyACM0也没有列出/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00。这可能是问题所在。有问题--device=...

ls显示/dev/usb/可用。所以我检查了它,lsusbPX4列在其他旁边:

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

也许这个 USB 设备的容器内没有正确的驱动程序?

在我的主机上,我得到了major:minor no 166:0:

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

据我所知,主机和容器中的文件夹/sys/dev/char/166:0是相同的。在容器上似乎是与主机上的*/tty/ttyACM0相关的链接:

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

在主机上,我得到了有关设备的信息 - 但容器内缺少这些信息:

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

在这篇文章之后,我将运行脚本更改为(没有privileged标志)

#!/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

比我看到的设备。但它们不可访问。

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
4

0 回答 0