From bd8b17a51d1d20230a64c4a1ebcec073f4d1494c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 10 Apr 2019 14:29:43 +0300 Subject: [PATCH] docs: restore info on led ros node in nti2019 --- docs/ru/nti2019.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/ru/nti2019.md b/docs/ru/nti2019.md index 99530fa1..5221926c 100644 --- a/docs/ru/nti2019.md +++ b/docs/ru/nti2019.md @@ -135,3 +135,69 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed Сигнальный провод ленты подключен к GPIO-пину 18. Про работу с LED-лентой можно прочитать [в соответствующей статье](leds.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 + +# Прокси к сервису установки состояния светодиодов +set_leds = rospy.ServiceProxy("/led/set_leds", SetLeds, persistent=True) + +# Вспомогательная функция заполнения всей ленты указанным цветом. +# red, green, blue - интенсивность красного, зелёного, синего цвета +# (задаётся числом от 0 до 255) +def fill_strip(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) + # Вызываем сервис. После этого вся лента должна стать указанного цвета + set_leds(ledMsg) + + +# Заполняем ленту разными цветами +fill_strip(255, 0, 0) +rospy.sleep(2.0) +fill_strip(0, 255, 0) +rospy.sleep(2.0) +fill_strip(0, 0, 255) +rospy.sleep(2.0) +# Выключение ленты +fill_strip(0, 0, 0) +```