From 4746f3181dc3dafc0f4a263ab125f723bbfdda01 Mon Sep 17 00:00:00 2001 From: sfalexrog Date: Wed, 10 Apr 2019 02:03:20 +0300 Subject: [PATCH] docs: Add ros_ws281x example --- docs/ru/nti2019.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/ru/nti2019.md b/docs/ru/nti2019.md index 253665ac..e70dda1e 100644 --- a/docs/ru/nti2019.md +++ b/docs/ru/nti2019.md @@ -127,3 +127,69 @@ 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). + +### Работа с LED-лентой через ROS + +В образ Клевера для Олимпиады НТИ включена нода ROS, работающая со светодиодной подсветкой. С её помощью можно управлять светодиодами, не запуская свою программу из-под `sudo`. По умолчанию эта нода выключена, но её можно включить, если в файле `/home/pi/catkin_ws/src/ros_ws281x/launch/clever4.launch` изменить строку + +```xml + +``` + +на + +```xml + +``` + +и перезапустить службу `rosled`: + +```bash +sudo systemctl restart rosled +``` + +Пример работы со светодиодной лентой: + +```python +import rospy +# Загружаем из ноды LED-ленты описание сервиса SetLeds... +from ros_ws281x.srv import SetLeds +# ...и сообщений LEDState и LEDStateArray. Сообщение LEDState +# содержит номер светодиода и его цвет, LEDStateArray - массив +# сообщений LEDState +from ros_ws281x.msg import LEDState, LEDStateArray +# Для задания цвета используется стандартное сообщение ColorRGBA +from std_msgs.msg import ColorRGBA + +# Количество светодиодов в ленте +NUM_LEDS = 60 + +# Прокси к сервису установки состояния светодиодов +setLeds = rospy.ServiceProxy("/led/set_leds", SetLeds, persistent=True) + +# Вспомогательная функция заполнения всей ленты указанным цветом. +# red, green, blue - интенсивность красного, зелёного, синего цвета +# (задаётся числом от 0 до 255) +def fillStrip(red, green, blue): + # Создаём сообщение для setLeds + ledMsg = LEDStateArray() + ledMsg.leds = [] + # Для каждого светодиода указываем его новое состояние + for i in range(NUM_LEDS): + led = LEDState(i, ColorRGBA(red, green, blue, 0)) + # Записываем состояние светодиода в сообщение + ledMsg.leds.append(led) + # Вызываем сервис. После этого вся лента должна стать указанного цвета + setLeds(ledMsg) + + +# Заполняем ленту разными цветами +fillStrip(255, 0, 0) +rospy.sleep(2.0) +fillStrip(0, 255, 0) +rospy.sleep(2.0) +fillStrip(0, 0, 255) +rospy.sleep(2.0) +# Выключение ленты +fillStrip(0, 0, 0) +```