Compare commits

...

15 Commits

Author SHA1 Message Date
Oleg Kalachev
67877457b1 Add a marker to nti novgorod map 2019-04-10 18:42:08 +03:00
Oleg Kalachev
ebd92b7d85 docs: edit nti2019.md 2019-04-09 20:44:27 +03:00
Oleg Kalachev
8b144f2355 Edit NTI markers 2019-04-09 20:07:08 +03:00
Oleg Kalachev
90dfa4c473 Edit nti_novgirod markers map 2019-04-09 16:32:43 +03:00
Oleg Kalachev
af019f51f5 docs: small fix for markdownlint 2019-04-08 20:34:00 +03:00
Oleg Kalachev
b4492d16fa Set correct camera frame by default for nti 2019-04-08 20:31:00 +03:00
Oleg Kalachev
d5cbe0c266 Expand nti novgorod aruco map 2019-04-08 20:30:36 +03:00
Oleg Kalachev
cd9fcb0595 aruco.launch: change default map to nti_novgorod.txt 2019-04-08 17:29:25 +03:00
Oleg Kalachev
f90c1a6329 Change some default for NTI 2019 2019-04-08 17:23:52 +03:00
Oleg Kalachev
c63e4265d6 aruco_map: add nti_novgorod map 2019-04-08 17:22:14 +03:00
Oleg Kalachev
60c97d2318 Merge branch 'master' into nti2019 2019-04-08 17:21:11 +03:00
sfalexrog
8dec500702 builder: Add ros_ws281x package 2019-04-07 17:50:31 +03:00
sfalexrog
09a8f702a7 docs: Add note about LED strip 2019-04-06 23:57:21 +03:00
sfalexrog
bcefb03f04 builder: Install paho-mqtt system-wide 2019-04-06 23:23:04 +03:00
sfalexrog
bc1ceb2fa0 Add annotated MQTT sample 2019-04-06 23:20:35 +03:00
11 changed files with 114 additions and 13 deletions

View File

@@ -0,0 +1,22 @@
34 0.33 0 0 0 0 0 0
37 0.33 0.74 0 0 0 0 0
100 0.05 0.37 0.2 0 0 0 0
6 0.10 0.37 0.39 0 0 0 0
25 0.33 0 0.54 0 0 0 0
28 0.33 0.74 0.54 0 0 0 0
32 0.33 2.74 -0.11 1.20 0 0 0
29 0.33 2.41 0.69 1.20 0 0 0
30 0.33 0 2.3 0.05 0 0 0
31 0.33 0 2.94 0.05 0 0 0
27 0.33 0.74 2.3 0.05 0 0 0
26 0.33 0.74 2.94 0.05 0 0 0
43 0.33 2.39 2.13 0.8 0 0 0
42 0.33 2.39 3.03 0.8 0 0 0
40 0.33 3.32 2.13 0.8 0 0 0
41 0.33 3.32 3.03 0.8 0 0 0
44 0.33 5.26 2.92 0.05 0 0 0
50 0.33 5.51 3.38 0.05 0 0 0
46 0.33 3.95 3.65 0.1 0 0 0
36 0.33 4.76 -0.18 0.3 0 0 0
35 0.33 5.36 -0.18 0.3 0 0 0
33 0.33 5.2 0.61 0.3 0 0 0

View File

@@ -0,0 +1,14 @@
[Unit]
Description=ROS ws281x support
Requires=roscore.service
After=roscore.service
[Service]
EnvironmentFile=/lib/systemd/system/roscore.env
ExecStart=/opt/ros/kinetic/bin/roslaunch ros_ws281x clever4.launch --wait --screen
Restart=on-failure
RestartSec=3
TimeoutSec=infinity
[Install]
WantedBy=multi-user.target

View File

@@ -112,6 +112,7 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/ros_pyt
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clever.rosinstall' '/home/pi/ros_catkin_ws/' # ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clever.rosinstall' '/home/pi/ros_catkin_ws/'
# Add PX4 udev rules # Add PX4 udev rules
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/99-px4fmu.rules' '/lib/udev/rules.d/' ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/99-px4fmu.rules' '/lib/udev/rules.d/'
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/rosled.service' '/lib/systemd/system/'
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS} ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS}
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh' ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh'

View File

@@ -137,6 +137,10 @@ fi
export ROS_IP='127.0.0.1' # needed for running tests export ROS_IP='127.0.0.1' # needed for running tests
echo_stamp "Adding ros_ws281x ROS package"
cd /home/pi/catkin_ws/src
git clone https://github.com/sfalexrog/ros_ws281x
echo_stamp "Installing CLEVER" \ echo_stamp "Installing CLEVER" \
&& cd /home/pi/catkin_ws/src/clever \ && cd /home/pi/catkin_ws/src/clever \
&& git status \ && git status \
@@ -145,7 +149,7 @@ echo_stamp "Installing CLEVER" \
&& my_travis_retry pip install wheel \ && my_travis_retry pip install wheel \
&& my_travis_retry pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \ && my_travis_retry pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \
&& source /opt/ros/kinetic/setup.bash \ && source /opt/ros/kinetic/setup.bash \
&& catkin_make -j2 -DCMAKE_BUILD_TYPE=Release \ && catkin_make -j2 -DCMAKE_BUILD_TYPE=Release -DROS_WS2811_REAL_LIB=ON \
&& catkin_make run_tests \ && catkin_make run_tests \
&& catkin_test_results \ && catkin_test_results \
&& systemctl enable roscore \ && systemctl enable roscore \
@@ -153,6 +157,9 @@ echo_stamp "Installing CLEVER" \
&& echo_stamp "All CLEVER was installed!" "SUCCESS" \ && echo_stamp "All CLEVER was installed!" "SUCCESS" \
|| (echo_stamp "CLEVER installation was failed!" "ERROR"; exit 1) || (echo_stamp "CLEVER installation was failed!" "ERROR"; exit 1)
echo_stamp "Enabling ROS LED service"
systemctl enable rosled
echo_stamp "Build CLEVER documentation" echo_stamp "Build CLEVER documentation"
cd /home/pi/catkin_ws/src/clever cd /home/pi/catkin_ws/src/clever
NPM_CONFIG_UNSAFE_PERM=true npm install gitbook-cli -g NPM_CONFIG_UNSAFE_PERM=true npm install gitbook-cli -g

View File

@@ -139,6 +139,9 @@ mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
mv /root/monkey /etc/monkey/sites/default mv /root/monkey /etc/monkey/sites/default
systemctl enable monkey.service systemctl enable monkey.service
echo_stamp "Install paho-mqtt"
my_travis_retry pip install paho-mqtt
echo_stamp "Install Node.js" echo_stamp "Install Node.js"
cd /home/pi cd /home/pi
wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz

View File

@@ -46,3 +46,4 @@ rosversion rosserial
rosversion usb_cam rosversion usb_cam
rosversion cv_camera rosversion cv_camera
rosversion web_video_server rosversion web_video_server
rosversion ros_ws281x

View File

@@ -1,7 +1,7 @@
<launch> <launch>
<arg name="aruco_detect" default="true"/> <arg name="aruco_detect" default="true"/>
<arg name="aruco_map" default="false"/> <arg name="aruco_map" default="true"/>
<arg name="aruco_vpe" default="false"/> <arg name="aruco_vpe" default="true"/>
<!-- For additional help go to https://clever.copterexpress.com/aruco.html --> <!-- For additional help go to https://clever.copterexpress.com/aruco.html -->
@@ -20,7 +20,7 @@
<remap from="image_raw" to="main_camera/image_raw"/> <remap from="image_raw" to="main_camera/image_raw"/>
<remap from="camera_info" to="main_camera/camera_info"/> <remap from="camera_info" to="main_camera/camera_info"/>
<remap from="markers" to="aruco_detect/markers"/> <remap from="markers" to="aruco_detect/markers"/>
<param name="map" value="$(find aruco_pose)/map/map.txt"/> <param name="map" value="$(find aruco_pose)/map/nti_novgorod.txt"/>
<param name="known_tilt" value="map"/> <param name="known_tilt" value="map"/>
<param name="frame_id" value="aruco_map_detected" if="$(arg aruco_vpe)"/> <param name="frame_id" value="aruco_map_detected" if="$(arg aruco_vpe)"/>
<param name="frame_id" value="aruco_map" unless="$(arg aruco_vpe)"/> <param name="frame_id" value="aruco_map" unless="$(arg aruco_vpe)"/>

View File

@@ -5,10 +5,10 @@
<arg name="web_video_server" default="true"/> <arg name="web_video_server" default="true"/>
<arg name="rosbridge" default="true"/> <arg name="rosbridge" default="true"/>
<arg name="main_camera" default="true"/> <arg name="main_camera" default="true"/>
<arg name="optical_flow" default="false"/> <arg name="optical_flow" default="true"/>
<arg name="aruco" default="false"/> <arg name="aruco" default="true"/>
<arg name="rc" default="true"/> <arg name="rc" default="false"/>
<arg name="rangefinder_vl53l1x" default="false"/> <arg name="rangefinder_vl53l1x" default="true"/>
<arg name="arduino" default="false"/> <arg name="arduino" default="false"/>
<!-- mavros --> <!-- mavros -->

View File

@@ -5,10 +5,10 @@
<!-- article about camera setup: https://clever.copterexpress.com/camera_frame.html --> <!-- article about camera setup: https://clever.copterexpress.com/camera_frame.html -->
<!-- camera is oriented downward, camera cable goes backward [option 1] --> <!-- camera is oriented downward, camera cable goes backward [option 1] -->
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 -1.5707963 0 3.1415926 base_link main_camera_optical"/> <!-- <node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 -1.5707963 0 3.1415926 base_link main_camera_optical"/> -->
<!-- camera is oriented downward, camera cable goes forward [option 2] --> <!-- camera is oriented downward, camera cable goes forward [option 2] -->
<!--<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 1.5707963 0 3.1415926 base_link main_camera_optical"/>--> <node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="-0.04 0 -0.08 1.5707963 0 3.1415926 base_link main_camera_optical"/>
<!-- camera is oriented upward, camera cable goes backward [option 3] --> <!-- camera is oriented upward, camera cable goes backward [option 3] -->
<!--<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 1.5707963 0 0 base_link main_camera_optical"/>--> <!--<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 1.5707963 0 0 base_link main_camera_optical"/>-->

View File

@@ -55,6 +55,47 @@ hbmqtt_pub --url mqtt://192.168.0.1:1883 -t /copters/copter1 -m 'сообщен
Где `192.168.0.1` IP-адрес MQTT-брокера, `сообщение` – сообщение для публикации, `/copters/copter1` необходимый топик для публикации. Где `192.168.0.1` IP-адрес MQTT-брокера, `сообщение` – сообщение для публикации, `/copters/copter1` необходимый топик для публикации.
### Работа с MQTT
В образе Клевера предустановлена библиотека `paho-mqtt` для Python. Пример работы с этой библиотекой описан ниже:
```python
import paho.mqtt.client as mqtt # Импортирование библиотеки mqtt
# Callback, вызываемый при получении от сервера подтверждения о подключении
def on_connect(client, userdata, flags, rc):
print ("Connected with result code "+str(rc))
# Если подписываться на топик в on_connect, то при обрыве соединения
# и повторном подключении произойдёт автоматическое переподписание
client.subscribe("/copters/copter1")
# Callback, вызываемый при появлении сообщения в одном из топиков, на который
# подписан клиент
def on_message(client, userdata, msg):
# В объекте msg хранится топик, в который пришло сообщение (в поле topic)
# и само сообщение (в поле payload)
print (msg.topic+" "+str(msg.payload))
# Инициализация клиента MQTT
client = mqtt.Client()
# Здесь указываются callback'и, вызываемые при подключении и получении сообщения
client.on_connect = on_connect
client.on_message = on_message
# Подключение к MQTT-брокеру. Первый параметр - имя или адрес брокера, второй - порт
# (по умолчанию 1883), третий - максимальное время между сообщениями в секундах
# (по умолчанию 60).
client.connect("192.168.11.162", 1883, 60)
# Метод loop_start создаёт поток, в котором будет производиться опрос сервера и
# вызов callback'ов.
client.loop_start()
# Далее продолжается ваша программа
```
Более подробная документация доступна на [странице библиотеки в PyPI](https://pypi.org/project/paho-mqtt/).
## Работа с Клевером ## Работа с Клевером
Для выполнения команд на Клевере: Для выполнения команд на Клевере:
@@ -62,6 +103,8 @@ hbmqtt_pub --url mqtt://192.168.0.1:1883 -t /copters/copter1 -m 'сообщен
* подключитесь в Wi-Fi сети NTI; * подключитесь в Wi-Fi сети NTI;
* подключитесь к вашему Клеверу по SSH по его IP-адресу (подробнее см. [подключение по SSH](ssh.md)); * подключитесь к вашему Клеверу по SSH по его IP-адресу (подробнее см. [подключение по SSH](ssh.md));
> **Caution** После подключения к своему дрону по SSH, смените пароль SSH-доступа, чтобы другие участники не смогли несанкционированно подключаться к нему. Для этого [используйте](https://www.raspberrypi-spy.co.uk/2012/10/how-to-change-raspberry-pi-password/) команду passwd.
Для редактирования файлов на Клевере вы можете использовать консольные редакторы `nano` или `vim`. Также вы можете загружать файлы используя PyCharm или WinSCP. Для редактирования файлов на Клевере вы можете использовать консольные редакторы `nano` или `vim`. Также вы можете загружать файлы используя PyCharm или WinSCP.
Для автономного полета используйте API модуля [simple_offboard](simple_offboard.md). Для автономного полета используйте API модуля [simple_offboard](simple_offboard.md).
@@ -97,6 +140,8 @@ rospy.sleep(5)
land() land()
``` ```
Для более подробной информации и описания других команд смотрите [API simple_offboard](simple_offboard.md) и [примеры кода](snippets.md).
Пример взлета на высоту 1 метр из командной строки: Пример взлета на высоту 1 метр из командной строки:
```bash ```bash
@@ -104,3 +149,11 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed
``` ```
Для более подробной информации и описания других команд смотрите [API simple_offboard](simple_offboard.md) и [примеры кода](snippets.md). Для более подробной информации и описания других команд смотрите [API simple_offboard](simple_offboard.md) и [примеры кода](snippets.md).
### Работа со светодиодной лентой
В используемой версии Клевера LED-лента подключена напрямую к Raspberry Pi. При включении всех светодиодов ленты на полную мощность возможно повреждение цепей питания микрокомпьютера.
Сигнальный провод ленты подключен к GPIO-пину 18.
Подробнее про работу с LED-лентой можно прочитать [в соответствующей статье](leds.md)

View File

@@ -784,21 +784,21 @@
### Теория FPV полетов ### Теория FPV полетов
**1. Какой стик является основным для позиционирования при FPV полетах? ** **1. Какой стик является основным для позиционирования при FPV полетах?**
1. Roll 1. Roll
2. Pitch 2. Pitch
3. Yaw 3. Yaw
4. Throttle 4. Throttle
**2. Каким стиком удерживается высота? ** **2. Каким стиком удерживается высота?**
1. Roll 1. Roll
2. Pitch 2. Pitch
3. Yaw 3. Yaw
4. Throttle 4. Throttle
**3. Что такое FPV пилотирование? ** **3. Что такое FPV пилотирование?**
1. Полеты с ориентацией “от первого лица” 1. Полеты с ориентацией “от первого лица”
2. Полеты с грузом 2. Полеты с грузом