Как прошить «ястреб» из контейнера докера? - PullRequest
0 голосов
/ 01 января 2019

Я делаю первый шаг в разработке на PX4 с использованием Docker.

Поэтому я расширяю 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 64bit.Делать то же самое на хосте будет работать.

  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-устройства?

На моем хостеЯ получил майор: минор № 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
...