我是使用 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 位。在主机上做同样的事情会奏效。
这里出了什么问题?在刷机过程中重启 PX4 是否会导致问题?
如果通常不可能,构建的输出文件是什么,是否可以使用 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/可用。所以我检查了它,lsusb
PX4列在其他旁边:
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