如何从Docker容器中刷新pixhawk?

时间:2019-01-01 19:33:08

标签: docker dockerfile px4

我是使用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 / 可用。所以我用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

0 个答案:

没有答案