我是使用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
在此post之后,我将运行脚本更改为(没有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