Работа со светодиодной лентой
СОВЕТ
Документация для версий образа, начиная с 0.21. Для более ранних версий см. документацию для версии 0.20.
Адресуемая RGB-светодиодная лента типа ws281x, которая входит в наборы "Клевер", позволяет выставлять произвольные 24-битные цвета на каждый из отдельных светодиодов. Это позволяет сделать полет Клевера более ярким, а также визуально получать информацию о полетных режимах, этапе выполнения пользовательской программы и других событиях.
На образе для RPi предустановлены необходимые модули для работы с лентой. Они позволяют:
- управлять эффектами/анимациями на ленте;
- управлять лентой на низком уровне (переключением цветов отдельных светодиодов);
- настраивать реакцию ленты на полетные события.
ВНИМАНИЕ
Обратите внимание, что светодиодную ленту нужно питать от стабильного источника энергии. Если вы подключите питание напрямую к Raspberry, то это создаст слишком большую нагрузку на ваш микрокомпьютер. Для снятия нагрузки с Raspberry можно подключить питание к преобразователю BEC.
Высокоуровневое управление лентой
Для работы с лентой подключите ее к питанию +5v – 5v, земле GND – GND и сигнальному порту DIN – GPIO21. Обратитесь к инструкции по сборке для подробностей.
Включите поддержку LED-ленты в файле
~/catkin_ws/src/clover/clover/launch/clover.launch
:<arg name="led" default="true"/>
Настройте параметры подключения ленты ws281x в файле
~/catkin_ws/src/clover/clover/launch/led.launch
. Необходимо ввести верное количество светодиодов в ленте и GPIO-пин, использованный для подключения (если он отличается от GPIO21):<arg name="led_count" default="58"/> <!-- количество светодиодов в ленте --> <arg name="gpio_pin" default="21"/> <!-- GPIO-пин для подключения -->
Высокоуровневое управления лентой позволяет управлять текущим эффектом (анимацией) на ленте. Для этого используется ROS-сервис /led/set_effect
. Параметры сервиса:
effect
– название необходимого эффекта.r
,g
,b
– цвет эффекта в формате RGB. Значения изменяются от 0 до 255.
Список доступных эффектов:
fill
(или пустая строка) – залить всю ленту цветом;blink
– мигание цветом;blink_fast
– ускоренное мигание цветом;fade
– плавное перетекание в цвет;wipe
– "надвигание" нового цвета;flash
– быстро мигнуть цветом 2 раза и вернуться к предыдущему эффекту;rainbow
– переливание ленты цветами радуги;rainbow_fill
– переливать заливку по цветам радуги.
Пример работы с сервисом из Python:
import rospy
from clover.srv import SetLEDEffect
rospy.init_node('flight')
set_effect = rospy.ServiceProxy('led/set_effect', SetLEDEffect) # define proxy to ROS-service
set_effect(r=255, g=0, b=0) # fill strip with red color
rospy.sleep(2)
set_effect(r=0, g=100, b=0) # fill strip with green color
rospy.sleep(2)
set_effect(effect='fade', r=0, g=0, b=255) # fade to blue color
rospy.sleep(2)
set_effect(effect='flash', r=255, g=0, b=0) # flash twice with red color
rospy.sleep(5)
set_effect(effect='blink', r=255, g=255, b=255) # blink with white color
rospy.sleep(5)
set_effect(effect='rainbow') # show rainbow
Также лентой можно управлять из командной сроки (Bash):
rosservice call /led/set_effect "{effect: 'fade', r: 0, g: 0, b: 255}"
rosservice call /led/set_effect "{effect: 'rainbow'}"
Настройка реакции ленты на события
Клевер умеет показывать LED-лентой текущее состояние полетного контроллера и сигнализировать о событиях. Данная функция настраивается в файле ~/catkin_ws/src/clover/clover/launch/led.launch
в разделе events effects table. Пример настройки:
startup: { r: 255, g: 255, b: 255 }
connected: { effect: rainbow }
disconnected: { effect: blink, r: 255, g: 50, b: 50 }
<!-- ... -->
В левой части таблицы указывается событие, на которая лента должна среагировать. В правой части указывается эффект (анимация), который необходимо включить при возникновении события.
Список поддерживаемых событий:
Событие | Описание | Эффект по умолчанию |
---|---|---|
startup | Запуск всех систем Клевера | Белый |
connected | Успешное подключение к полетному контроллеру | Эффект радуги |
disconnected | Разрыв связи с полетным контроллером | Мигание красным |
armed | Переход в состояние Armed | |
disarmed | Переход в состояние Disarmed | |
acro | Режим Acro | Оранжевый |
stabilized | Режим Stabilized | Зеленый |
altctl | Режим Altitude | Желтый |
posctl | Режим Position | Синий |
offboard | Режим Offboard | Фиолетовый |
rattitude , mission , rtl , land | Переход в соответствующие режимы | |
error | Возникновение ошибки в ROS-нодах или полетном контроллере (ERROR-сообщение в топике /rosout ) | Мигнуть красным |
low_battery | Низкий заряд батареи (порог настраивается в параметре threshold ) |
СОВЕТ
Для корректной работы сигнализации LED-лентой о низком заряде батареи необходимо корректная калибровка электропитания.
Для того, чтобы отключить реакцию светодиодной ленты на события, установите аргумент led_notify
в файле ~/catkin_ws/src/clover/clover/launch/led.launch
в значение false
:
<arg name="led_notify" default="false"/>
Низкоуровневое управление лентой
Для управления отдельными светодиодами используется ROS-сервис /led/set_leds
. В параметрах задается массив номеров и RGB-цветов светодиодов, которые необходимо переключить.
Пример работы с сервисом из Python:
import rospy
from led_msgs.srv import SetLEDs
from led_msgs.msg import LEDStateArray, LEDState
rospy.init_node('flight')
set_leds = rospy.ServiceProxy('led/set_leds', SetLEDs) # define proxy to ROS service
# switch LEDs number 0, 1 and 2 to red, green and blue color:
set_leds([LEDState(0, 255, 0, 0), LEDState(1, 0, 255, 0), LEDState(2, 0, 0, 255)])
Сервис можно использовать из командной строки:
rosservice call /led/set_leds "leds:
- index: 0
r: 50
g: 100
b: 200"
При использовании ленты в ROS-топике /led/state
публикуется текущие цвета светодиодов. Просмотр топика из командной строки:
rostopic echo /led/state
Используя этот же топик можно получить общее выставленное в настройках количество светодиодов:
led_count = len(rospy.wait_for_message('led/state', LEDStateArray, timeout=10).leds)