robohead_controller
Главный пакет, который на основе распознанных аудио-команд управляет Робоголовой.
Запуск через CLI:
roslaunch robohead_controller robohead_controller_py.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'"
Обратите внимание: сообщения в топик чувствительны к регистру: 'сделай фото' и 'Сделай фото' НЕ эквивалентны.
Для вызова 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
Подробнее см. Ubuntu-сервис.
В каталоге 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_srv_PlayMedia - rospy.ServiceProxy, сервис для вывода медиа из файла на экран (тип сообщения display_driver/PlayMedia - см. display_driver)
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
ears_driver_srv_EarsSetAngle - rospy.ServiceProxy, сервис для установки положения ушей (тип сообщения ears_driver/EarsSetAngle - см. ears_driver)
neck_driver_srv_NeckSetAngle - rospy.ServiceProxy, сервис для установки положения шеи (тип сообщения neck_driver/NeckSetAngle - см. neck_driver)
speakers_driver_srv_PlayAudio - rospy.ServiceProxy, сервис для воспроизведения аудио из файла (тип сообщения speakers_driver/PlayAudio - см. speakers_driver)
speakers_driver_srv_GetVolume - rospy.ServiceProxy, сервис для получения текущей установленной громкости воспроизведения (тип сообщения speakers_driver/GetVolume - см. speakers_driver)
speakers_driver_srv_SetVolume - rospy.ServiceProxy, сервис для установки громкости воспроизведения (тип сообщения speakers_driver/SetVolume - см. speakers_driver)
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)
voice_recognizer_pocketsphinx_kws_srv_IsWork - rospy.ServiceProxy, сервис вкл/выкл распознавания голосовых команд (тип сообщения voice_recognizer_pocketsphinx/IsWork, см. voice_recognizer_pocketsphinx)
voice_recognizer_pocketsphinx_cmds_srv_IsWork - rospy.ServiceProxy, сервис вкл/выкл распознавания ключевых слов (тип сообщения voice_recognizer_pocketsphinx/IsWork, см. voice_recognizer_pocketsphinx)
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