robohead_controller
Главный пакет, который на основе распознанных аудио-команд управляет Робоголовой.
Запуск через CLI:
Пакет по распознанным голосовым командам запускает, так называемые 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, для этого введите:
Для запуска std_wait, используйте:
Обратите внимание: сообщения в топик чувствительны к регистру: 'сделай фото' и 'Сделай фото' НЕ эквивалентны.
Для вызова action-скрипта std_attention, который запускается по ключевому слову, используйте:
После этого будет ожидаться продолжение голосовой команды. Если же требуется просто запустить скрипт для проверки используйте:
Вызов action-скрипта std_low_bat осуществляется автоматически, на основании данных из топика /robohead_controller/sensor_driver/bat, куда пакет sensor_driver публикует текущее состоянии батареи (напряжение и ток). Для отладки можно отключить этот пакет, чтобы иметь возможность вручную эмулировать напряжение батереи и вызывать этот скрипт. Для этого можно отредактировать launch-файл пакета robohead_controller или во время всех запущенных пакет убить соотвествующую ноду командой:
После этого можно вручную эмулировать состояние батареи в топике /robohead_controller/sensor_driver/bat. Например, чтобы сэмулировать низкое напряжение (3.0V), тем самым вызвать скрипт std_low_bat введите:
Для возобновления работы других action-скриптов и выхода из std_low_bat измените поле voltage с 3.0 на 4.0 и отправьте сообщение еще раз. Для запуска пакета sensor_driver наиболее безопасно - просто перезапустить launch-файл.
Если необходимо просто разово запустить скрипт, используйте
Если все пакеты были запущены автоматически (после включения), то для перезапуска используйте:
В каталоге 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-скриптов (устанавливается в зависимости от текущего напряжения)
Пример, как вызызвать отдельные поля объекта:
Last updated