Я делаю первый шаг в разработке на 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.Делать то же самое на хосте будет работать.
Что здесь не так?Может быть, перезагрузка 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-устройства?
На моем хостеЯ получил майор: минор № 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