Files
clover/docs/ru/leds.md
Oleg Kalachev 2f6125ce54 Implement block programming (using Blockly) (#272)
* Clover Blockly: add first blocks set

* Adjust Blockly settings

* Fix get_position output type

* Add screenshot

* Rename readme.md to README.md

* Resize screenshot

* Add package.xml

* Little change

* Fixes

* Add python_compressed to blockly

* Implement some of the Clover blocks in Python

* Make Python indentation 4 spaces

* Fixes to Python blocks implementation

* Implement set_velocity block in Python

* Implement wait_arrival block in Python

* Fix indentation in Python implementation of blocks

* Fix

* Fix land_wait template

* Set reserved words in Python

* Change default frame_id to aruco_map in get_position block

* Fix

* Move blocks definitions to blocks.js

* Get rid of missing favicon error

* Simplify navigate

* Rearrange layout, add tabs

* Generate Python code

* Small style change

* -console.log

* Code style

* Use modules

* Move modules to the header

* Correct order for ROS definitions + generating "backend" code

* Fix rangefinder_distance block

* simple_offboard: commands to change only yaw and yaw rate

* Implement set_yaw block

* Start working on Blockly documentation

* Implement print block with a topic

* Unneeded code

* Little fixes

* Fix indentation

* Fixes

* Fix wait_arival, get_distance

* Implement running Blockly programs, implement prompt block, fixes

* Add land button

* Little change

* Fix reserved words + little fixes

* +x for main.py

* Simplify run button

* Auto-save and load workspace

* Make land button work

* Handle exceptions

* Minor change

* Add help URL for blocks

* Fix

* Implement arrived block

* Mark blockly and highlight.js as linguist-vendored

* Add forgotten CMakeLists.txt

* Add wait checkbox to set_yaw block

* Disable run button when disconnected

* Add message and service files

* Add some comments

* Add tooltip to some blocks

* Implement GPIO blocks

* Don’t latch print message to prevent duplication

* Prevent duplication prompts

* Add ROS init code to backend code anyways

* Make GPIO blocks color a constant

* Minor fix

* More correctly update blocks on input value changes

* Minor fixes

* Remove unneeded readonly attribute

* Add marker ID shadow blocks to toolbox

* Add lacking reserved words

* Fix frame id generation for complex marker id expressions

* Consider frame_id in set_yaw block

* Shorten ros module import

* Implement stop service

* Disable and enable run button correctly

* Don’t print KeyboardInterrupt exceptions

* Put notifications to notifications element

* Add 'running' mark

* Disable signal in backend python code

* Sleep a little bit to let rospy initialize publishers

* Remove accidental code

* Make ROS namespace and private namespace constants

* editorconfig-lint: don’t check Blockly code

* Use private namespace constant in Python generator

* Implement ~running topic to display current program status more robustly

* Make navigate tolerance and sleep time constants

* Make set_leds and and set_effect services proxies persistent

* Replace a number with constant

* Limit ~block topic publishing rate
Otherwise messages get queued making the frontend to freeze

* Improve internal documentation

* Append 'map' to frames list

* Return degrees in get_attitude block

* Move getting yaw in a separate block

* Improve block tooltips

* Add some more files to editorconfig-lint excludes

* Add get_yaw block to toolbox

* Implement get_time block

* Implement ~store and ~load services for storing user programs

* Set auto_arm only in take_off block

* Minor CSS fixes

* Make 'Python' tab textarea-like

* Implement saving and loading programs

* Adjust styles

* Retrieve only .xml files in load service

* Forgotten code

* Documentation on store and load services

* Add some examples

* Add blocks programming arg to launch file

* Update docs

* Add package’s dependencies

* Add dependency

* Add title to select

* Fix syntax

* Minor fix in docs

* Add forgotten roslib.js

* Run user program in the same process

* Use print function for print block in Python 2

* Add variables example

* Fix url

* Add functions example

* Fix set_servo block

* Fix gpio_read block

* Update blocks screenshot

* Update docs

* Update docs

* Fix set_effect block

* Minor fix in example

* Add setpoint block, remove set_velocity from toolbox

* Remove unused modules

* Unused variable

* Add English article skeleton

* Clarify backend node link error

* Remove unused variable

* Update documentation

* Fix link to documentation

* Add Blockly logo

* Update English article

* Add Blocks programming link to the main page

* Minor change

* Add catkin_install_python to CMakeLists.txt

* Make navigate tolerance and sleep time configurable

* Add minor todo

* Add blockly examples directory to editorconfig-lint excludes

* Rename main node to clover_blocks

* Add a warning to the old blocks programming article

* Fix editorconfig-lint exclude
2020-09-30 17:07:03 +03:00

9.0 KiB
Raw Blame History

Работа со светодиодной лентой

Note

Документация для версий образа, начиная с 0.20. Для более ранних версий см. документацию для версии 0.19.

Адресуемая RGB-светодиодная лента типа ws281x, которая входит в наборы "Клевер", позволяет выставлять произвольные 24-битные цвета на каждый из отдельных светодиодов. Это позволяет сделать полет Клевера более ярким, а также визуально получать информацию о полетных режимах, этапе выполнения пользовательской программы и других событиях.

На образе для RPi предустановлены необходимые модули для работы с лентой. Они позволяют:

  • управлять эффектами/анимациями на ленте;
  • управлять лентой на низком уровне (переключением цветов отдельных светодиодов);
  • настраивать реакцию ленты на полетные события.

Caution

Обратите внимание, что светодиодную ленту нужно питать от стабильного источника энергии. Если вы подключите питание напрямую к Raspberry, то это создаст слишком большую нагрузку на ваш микрокомпьютер. Для снятия нагрузки с Raspberry можно подключить питание к преобразователю BEC.

Высокоуровневое управление лентой

  1. Для работы с лентой подключите ее к питанию +5v 5v, земле GND GND и сигнальному порту DIN GPIO21. Обратитесь к инструкции по сборке для подробностей.

  2. Включите поддержку LED-ленты в файле ~/catkin_ws/src/clever/clever/launch/clever.launch:

    <arg name="led" default="true"/>
    
  3. Настройте параметры подключения ленты ws281x в файле ~/catkin_ws/src/clover/clover/launch/led.launch. Необходимо ввести верное количество светодиодов в ленте и GPIO-пин, использованный для подключения (если он отличается от GPIO21):

    <param name="led_count" value="30"/>  <!-- количество светодиодов в ленте -->
    <param name="gpio_pin" value="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;
  • stabilized, acro, rattitude, altctl, posctl, offboard, mission, rtl, land переключение полетных режимов;
  • error возникновение ошибки в ROS-нодах или полетном контроллере (ERROR-сообщение в топике /rosout);
  • low_battery – низкий заряд батареи (порог настраивается в параметре threshold).

Note

Для корректной работы сигнализации 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