Содержит инструкции по быстрому развертыванию симулятора и зависимостей для программирования дронов на python
Данный проект предназначен для быстрого старта программирования дронов на python. Здесь рассказывается как:
-
установить контейнер с ROS для PX4;
-
установить и запустить PX4 SITL;
-
установить библиотеку dronekit и управлять дроном через нее.
На компьютере предварительно должны быть установлены git и docker (см. здесь).
- Загружаем docker-образ, содержащий ROS-Melodic, Gazebo и зависимости PX4
docker pull px4io/px4-dev-ros-melodic
- Скачиваем PX4 SITL
mkdir src
cd src
git clone https://github.com/PX4/PX4-Autopilot.git
cd ..
- Запускаем контейнер
Инструкция для Linux
Для Linux надо разрешить подключения к X Server для вывода графической информации:
xhost+
и запустить контейнер с параметрами:
docker run -it --privileged \
--network host \
--gpus=all \
--runtime=nvidia \
--tmpfs=/tmp \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=:0 \
-e QT_X11_NO_MITSHM=1 \
-e USE_NVIDIA=true \
-e NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES:-all} \
-e NVIDIA_DRIVER_CAPABILITIES=${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics \
-v `pwd`/src/PX4-Autopilot:/src/PX4-Autopilot \
--name=mycontainer px4io/px4-dev-ros-melodic:latest bash
Инструкция для Windows
На Windows ситуация другая. Для запуска GUI приложений надо скачать, установить и запустить программу VcXsrv Windows X Server.
После чего запустить docker-контейнер с параметрами:
docker run -it --privileged \
--network host \
-e DISPLAY={DISPLAY_IP} \
-v `pwd`/src/PX4-Autopilot:/src/PX4-Autopilot \
--name=mycontainer px4io/px4-dev-ros-melodic:latest bash
где вместо {DISPLAY_IP}
надо указать IP-адрес подключения к дисплею из программы VcXsrv Windows X Server. Его можно получить внутри контейнера командой (способ описан здесь):
grep nameserver /etc/resolv.conf
Пример вывода:
nameserver 127.0.1.1
Тогда при запуске контейнера указывается параметр вида:
-e DISPLAY=127.0.1.1:0 \
-v `pwd`/src/PX4-Autopilot:/src/PX4-Autopilot
- означает, что мы подключаем папку `pwd`/src/PX4-Autopilot
как том и в контейнере она будет располагаться по пути /src/PX4-Autopilot
.
Параметр --name
определяет имя контейнера. По умолчанию задается mycontainer
, но можно задать и свое.
- Загрузка подмодулей PX4 После запуска контейнера в PX4 надо догрузить содержимое подмодулей.
cd /src/PX4-Autopilot
git submodule update --init --recursive
Проверить, что все успешно работает можно, запустив симулятор px4 вместе с gazebo:
cd /src/PX4-Autopilot
make px4_sitl gazebo
Если все ОК, то должно открыться окно симулятора вместе с дроном.
- Установка dronekit в контейнер
pip install dronekit
- Установка nano
nano - это консольный текстовый редактор. Он устанавливается так:
apt-get update
apt-get install nano
- Если все вышеописанные шаги прошли успешно, то у Вас получился контейнер для разработки ПО для дронов на python. Выходите из контейнера:
exit
Запуск контейнера:
docker start mycontainer
Подключение к контейнеру:
docker attach mycontainer
Пример запуска программы на python с dronekit
- Запускаем PX4 SITL и симулятор gazebo:
cd /src/PX4-Autopilot
make px4_sitl gazebo
- Открывает новую консоль и подключаемся к контейнеру:
docker attach mycontainer
- Создаем python-файл:
cd /src
touch example.py
chmod a+x example.py
- Копируем в него код из туториала PX4
Для этого открывает файл через nano:
nano example.py
Вставляем код, сохраняем изменения (Ctrl+O
) и закрываем файл (Ctrl+X
).
- Запускаем код:
python example.py
- Наслаждаемся полетом дрона по точкам:)
Примечание. Контейнер не удалять!!! Иначе придется заново устанавливать dronekit и nano.
Ошибка при запуске симулятора JMAVSim
Текст ошибки:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
Caused by: java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper
at java.awt.Toolkit.loadAssistiveTechnologies(Toolkit.java:807)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:886)
at java.awt.Window.getToolkit(Window.java:1358)
at java.awt.Window.init(Window.java:506)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.JFrame.<init>(JFrame.java:189)
at me.drton.jmavsim.Visualizer3D.<init>(Visualizer3D.java:107)
at me.drton.jmavsim.Simulator.<init>(Simulator.java:192)
at me.drton.jmavsim.Simulator.main(Simulator.java:941)
... 5 more
Решение:
В контейнере в файле /etc/java-8-openjdk/accessibility.properties надо закомментировать строчку assistive_technologies=org.GNOME.Accessibility.AtkWrapper.