Робо-голова
  • Общая информация
  • Технические характеристики
  • Комплект поставки
  • Полезные ссылки
  • Быстрый старт
  • Настройка и обслуживание
    • Подключение к Робоголове по сети
      • Настройка подключения к Сети
      • Подключение по SSH к Робоголове
      • Подключение по SFTP
      • Подключение через VSCode
    • Смена данных устройства
    • Выключение головы
    • Возврат к заводским настройкам
    • Ubuntu-сервис
    • Подключение аккумулятора
    • Зарядка батареи
    • Подключение сервоприводов к плате расширения
  • Интеграция с роботом TurtleBro
  • Устройство головы
    • Аппаратная конфигурация
    • Программное обеспечение
    • ROS-пакеты
      • robohead_controller
      • display_driver
      • neck_driver
      • ears_driver
      • speakers_driver
      • respeaker_driver
      • voice_recognizer_pocketsphinx
        • ROS-нода ~kws_recognizer
        • ROS-нода ~cmds_recognizer
        • Настройка собственных команд и ключевых слов для распознавания
      • sensor_driver
      • usb_cam
  • Кейсы взаимодействия
    • 1. Смена ресурс-пака стандартных действий
    • 2. Внесение изменений в стандартные действия
    • 3. Написание своего действия для robohead_controller
    • 4. Создание своих сценариев взаимодействия без использования robohead_controller
    • 5. Создание ROS-пакета со своим сценарием взаимодействия и его автозагрузка
Powered by GitBook
On this page
  1. Устройство головы
  2. ROS-пакеты

robohead_controller

Главный пакет, который на основе распознанных аудио-команд управляет Робоголовой.

Запуск через CLI:

roslaunch robohead_controller robohead_controller_py.launch

При запуске robohead_controller через roslaunch автоматически запускаются все остальные пакеты (какие именно, можно посмотреть в launch-файле).

Пакет по распознанным голосовым командам запускает, так называемые action-скрипты, которые можно редактировать. Их расположение: robohead_controller/scripts/robohead_controller_actions/

Описание action-скриптов:

  • std_wait - состояние по-умолчанию, когда идет ожидание ключевого слова

  • std_attention - запускается, когда распознано ключевое слово (по умолчанию "Слушай, Робот!")

  • std_ears - дергает ушами, команда "покажи уши"

  • std_left_ear - дергает левым ухом, команда "покажи левое ухо"

  • std_right_ear - дергает правым ухом, команда "покажи правое ухо"

  • std_greeting - здоровается, команда "поздоровайся"

  • std_make_photo - делает фотографию, команда "сделай фото"

  • std_ball_tracker - следит за шариком, команда "следи за шариком"

  • std_low_bat - запускается при низком заряде батареи, остальные action-скрипты блокируются

Каждый скрипт лежит внутри одноименной папки. В этой же папке находят медиа-файлы (картинки, видео, звуки) которые воспроизводятся скриптом. Чтобы изменить картинку, не меняя кода, просто замените эту картинку в папке с нужным скриптом, оставив прежнее название и расширение.


Action-скрипты можно запускать и в ручном режиме, без непосредственной голосовой команды (полезно при откладке, чтоб не повторять голосом одну и ту же команду много раз). Для этого в топик /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands необходимо отправить ту команду, которую вы бы произнесли голосом (выше помечены синим цветом). Например, вручную запустим action-скрипт std_make_photo, для этого введите:

rostopic pub /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands std_msgs/String "data: 'сделай фото'" 

Для запуска std_wait, используйте:

rostopic pub /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands std_msgs/String "data: 'wait_action'" 

Обратите внимание: сообщения в топик чувствительны к регистру: 'сделай фото' и 'Сделай фото' НЕ эквивалентны.

Вообще, пакет голосового распознавания voice_recognizer_pocketsphinx когда распознает голосовую команду (после обнаружения ключевого слова 'Слушай, Робот!'), самостоятельно шлет в топик /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands распознанную команду


Для вызова action-скрипта std_attention, который запускается по ключевому слову, используйте:

rostopic pub /robohead_controller/voice_recognizer_pocketsphinx/kws_recognizer/keywords std_msgs/String "data: 'слушайробот'" 

После этого будет ожидаться продолжение голосовой команды. Если же требуется просто запустить скрипт для проверки используйте:

rostopic pub /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands std_msgs/String "data: 'слушайробот'" 

Вызов action-скрипта std_low_bat осуществляется автоматически, на основании данных из топика /robohead_controller/sensor_driver/bat, куда пакет sensor_driver публикует текущее состоянии батареи (напряжение и ток). Для отладки можно отключить этот пакет, чтобы иметь возможность вручную эмулировать напряжение батереи и вызывать этот скрипт. Для этого можно отредактировать launch-файл пакета robohead_controller или во время всех запущенных пакет убить соотвествующую ноду командой:

rosnode kill /robohead_controller/sensor_driver

После этого можно вручную эмулировать состояние батареи в топике /robohead_controller/sensor_driver/bat. Например, чтобы сэмулировать низкое напряжение (3.0V), тем самым вызвать скрипт std_low_bat введите:

rostopic pub /robohead_controller/sensor_driver/bat sensor_msgs/BatteryState "header:
  seq: 0
  stamp: {secs: 0, nsecs: 0}
  frame_id: ''
voltage: 3.0
temperature: 0.0
current: 0.0
charge: 0.0
capacity: 0.0
design_capacity: 0.0
percentage: 0.0
power_supply_status: 0
power_supply_health: 0
power_supply_technology: 0
present: false
cell_voltage: [0]
cell_temperature: [0]
location: ''
serial_number: ''" 

Для возобновления работы других action-скриптов и выхода из std_low_bat измените поле voltage с 3.0 на 4.0 и отправьте сообщение еще раз. Для запуска пакета sensor_driver наиболее безопасно - просто перезапустить launch-файл.

Если необходимо просто разово запустить скрипт, используйте

rostopic pub /robohead_controller/voice_recognizer_pocketsphinx/cmds_recognizer/commands std_msgs/String "data: 'low_bat_action'" 

Если все пакеты были запущены автоматически (после включения), то для перезапуска используйте:

sudo systemctl restart robohead.service

В каталоге robohead_controller/config расположены конфигурационные файлы, настройки из которых используются при запуске всех зависимых пакетов (см. файл robohead_controller/launch/dependencies.launch). Заполнение конфигурационного файла каждого пакета в отдельности смотрите в соотвуствующих разделах настоящего мануала.

В файле robohead_controller/config/robohead_controller.yaml задаются следующие настройки:

  • low_voltage_threshold и low_voltage_hysteresis задают следующее поведение: при напряжении ниже чем low_voltage_threshold - low_voltage_hysteresis включается std_low_bat и блокируется выполнение любых других команд, при достижении напряжения low_voltage_threshold + low_voltage_hysteresis блокировки снимаются и можно выполнять любые скрипты.

  • camera_topic_name - название топика, куда публикуются данные с камеры

  • robohead_controller_actions_match словарь сопоставления голосовой команды и выполняемого по ней скрипта (указываются пути до исполняемых файлов из каталогаrobohead_controller/scripts/robohead_controller_actions). Именно команды из этого файла вызывались в ROS-топике выше.


Внутри action-скрипта имортируется модуль main.py пакета robohead_controller, в котором доступен класс RoboheadController. Объект этого класса передается при вызове функции run(robohead_controller:RoboheadController, cmds:str) внутри action-скрипта, в cmds передается команда, по которой был запущен этот скрипт (см. словарь сопоставления в конфигурационном файле robohead_controller.yaml). У класса RoboheadController вы можете использовать следующие поля (фиолетовым цветом помечены наиболее часто используемые и полезные):

  • sensor_driver_bat_current - float, текущий ток батареи. Значение переменной обновляется автоматически

  • sensor_driver_bat_voltage - float, текущее напряжение батареи. Значение переменной обновляется автоматически

  • sensor_driver_sub_battery - rospy.Subscriber, подписчик на топик с данными батареи (стандартный тип сообщения sensor_msgs/BatteryState)

  • display_driver_pub_PlayMedia - rospy.Publisher, паблишер для потокового вывода медиа на экран (стандартный тип сообщения sensor_msgs/Image)

  • display_driver_sub_touchscreen - rospy.Subscriber, подписчик на топик с данными тачскрина (стандартный тип сообщения geometry_msgs/Pose2D)

  • display_driver_touchscreen_xy - tuple, координата касания тачскрина. Значение переменной обновляется автоматически (во время касания экрана). display_driver_touchscreen_xy[0] - координата X, display_driver_touchscreen_xy[1] - координата Y

  • respeaker_driver_sub_audio_main - rospy.Subscriber, подписчик на топик основного аудио-канала с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_0 - rospy.Subscriber, подписчик на топик аудио-канала №0 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_1 - rospy.Subscriber, подписчик на топик аудио-канала №1 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_2 - rospy.Subscriber, подписчик на топик аудио-канала №2 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_3 - rospy.Subscriber, подписчик на топик аудио-канала №3 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_4 - rospy.Subscriber, подписчик на топик аудио-канала №4 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_sub_audio_channel_5 - rospy.Subscriber, подписчик на топик аудио-канала №5 с микрофона (тип сообщения audio_common_msgs/AudioData)

  • respeaker_driver_msg_audio_main - AudioData, поток основного аудио-канала. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_0 - AudioData, поток аудио-канала №0. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_1 - AudioData, поток аудио-канала №1. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_2 - AudioData, поток аудио-канала №2. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_3 - AudioData, поток аудио-канала №3. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_4 - AudioData, поток аудио-канала №4. Значение переменной обновляется автоматически.

  • respeaker_driver_msg_channel_5 - AudioData, поток аудио-канала №5. Значение переменной обновляется автоматически.

  • respeaker_driver_sub_doa_angle - rospy.Subscriber, подписчик на топик направления принятого аудио-сигнала с микрофона (стандартный тип сообщения std_msgs/Int16)

  • respeaker_driver_doa_angle - int, направление, откуда пришел звук. Значение переменной обновляется автоматически

  • voice_recognizer_pocketsphinx_sub_kws - rospy.Subscriber, подписчик на топик с распознанными голосовыми командами (стандартный тип сообщения std_msgs/String)

  • voice_recognizer_pocketsphinx_sub_cmds - rospy.Subscriber, подписчик на топик с распознанными ключевыми словами (стандартный тип сообщения std_msgs/String)

  • usb_cam_sub_image_raw - rospy.Subscriber, подписчик на топик данных с видеокамеры (стандартный тип сообщения sensor_msgs/Image)

  • usb_cam_image_raw - Image, поток изображения с видеокамеры. Значение переменной обновляется автоматически

  • robohead_controller_low_voltage_threshold - float, загруженный параметр low_voltage_threshold из конфигурационного файла robohead_controller.yaml

  • robohead_controller_low_voltage_hysteresis - float, загруженный параметр low_voltage_hysteresis из конфигурационного файла robohead_controller.yaml

  • robohead_controller_actions_match - dict, загруженный параметр robohead_controller_actions_match из конфигурационного файла robohead_controller.yaml

  • robohead_controller_is_allow_work - bool, разрешение на распознавание команды и выполнение action-скриптов (устанавливается в зависимости от текущего напряжения)

Пример, как вызызвать отдельные поля объекта:

PreviousROS-пакетыNextdisplay_driver

Last updated 1 month ago

Подробнее см. .

display_driver_srv_PlayMedia - rospy.ServiceProxy, сервис для вывода медиа из файла на экран (тип сообщения display_driver/PlayMedia - см. )

ears_driver_srv_EarsSetAngle - rospy.ServiceProxy, сервис для установки положения ушей (тип сообщения ears_driver/EarsSetAngle - см. )

neck_driver_srv_NeckSetAngle - rospy.ServiceProxy, сервис для установки положения шеи (тип сообщения neck_driver/NeckSetAngle - см. )

speakers_driver_srv_PlayAudio - rospy.ServiceProxy, сервис для воспроизведения аудио из файла (тип сообщения speakers_driver/PlayAudio - см. )

speakers_driver_srv_GetVolume - rospy.ServiceProxy, сервис для получения текущей установленной громкости воспроизведения (тип сообщения speakers_driver/GetVolume - см. )

speakers_driver_srv_SetVolume - rospy.ServiceProxy, сервис для установки громкости воспроизведения (тип сообщения speakers_driver/SetVolume - см. )

voice_recognizer_pocketsphinx_kws_srv_IsWork - rospy.ServiceProxy, сервис вкл/выкл распознавания голосовых команд (тип сообщения voice_recognizer_pocketsphinx/IsWork, см. )

voice_recognizer_pocketsphinx_cmds_srv_IsWork - rospy.ServiceProxy, сервис вкл/выкл распознавания ключевых слов (тип сообщения voice_recognizer_pocketsphinx/IsWork, см. )

Ubuntu-сервис
display_driver
ears_driver
neck_driver
speakers_driver
speakers_driver
speakers_driver
voice_recognizer_pocketsphinx
voice_recognizer_pocketsphinx