Создадим новую немного модифицированную версию команды "Улыбнись" без использования head_controller
Опишем, что должно происходить при выполнении нашей программы:
- на экран выводится изображение smile.png
- включается воспроизведение аудио smile.mp3
- до завершения аудио голова попеременно двигает ушами вперед-назад с частотой 2 Гц
- за счет шейного сустава голова приподнимается и 5 секунд мотается в стороны
Прямо в домашнем каталоге ~/ создадим папку scripts командой:
mkdir~/scriptscd~/scripts
Добавим в нее медиа-файлы smile.png и smile.mp3 и создадим файл-скрипт main.py
touchmain.py
Вставьте в файл main.py следующий код
#!/usr/bin/env python3# -*- coding: utf-8 -*-import osimport syssys.path.append(os.path.dirname(os.path.abspath(__file__)))from mors_driver.srv import TwistDuration, PoseArrayDuration, JointTrajectoryPointDurationimport rospyimport timefrom std_msgs.msg import String, Empty, Int32from sensor_msgs.msg import BatteryStatefrom display_controller.srv import displayControllerPlayfrom neck_controller.srv import NeckSetAnglefrom ears_controller.srv import EarsSetAnglefrom speakers_controller.srv import playSoundfrom speakers_controller.srv import setVolumefrom speakers_controller.srv import isPlayingscript_path = os.path.dirname(os.path.abspath(__file__))print("Script path: "+ script_path)rospy.init_node("smile_node")# Дожидаемся запуска всех сервисовrospy.wait_for_service('displayControllerPlay')rospy.wait_for_service('NeckSetAngle')rospy.wait_for_service('EarsSetAngle')rospy.wait_for_service('playSound')rospy.wait_for_service('isPlaying')rospy.wait_for_service('setVolume')# Инициализация сервисомservice_display_player = rospy.ServiceProxy('displayControllerPlay', displayControllerPlay)# Сервис воспроизведения медиа на экранеservice_set_neck = rospy.ServiceProxy('NeckSetAngle', NeckSetAngle)# Сервис задания положения шейного суставаservice_set_ears = rospy.ServiceProxy('EarsSetAngle', EarsSetAngle)# Сервис задания положения ушейservice_play_sound = rospy.ServiceProxy('playSound', playSound)# Сервис проигрывания аудиоservice_is_playing = rospy.ServiceProxy('isPlaying', isPlaying)# Сервис проверки проигрывается ли сейчас аудиоservice_set_volume = rospy.ServiceProxy('setVolume', setVolume)# Сервис установки громкости проигрывания аудиоservice_display_player(f"{script_path}/smile.png")# Выводим картинку на экранservice_set_volume(60)# Устанавливаем громкость воспроизведения аудио, диапазон 0..100service_play_sound(f"{script_path}/smile.mp3", 0)start = time.time()ear_k =1service_set_ears(-90*ear_k, 90*ear_k)# Установка первоначального положенияears_timer = time.time()neck_k =1service_set_neck(15, 20* neck_k, 1)neck_timer = time.time()while ((time.time()-start)<=5):ifservice_is_playing().Data and ((time.time()-ears_timer)>0.5):# Пока проигрывается аудио, каждые 0.5 секунды двигаются уши ear_k = ear_k*(-1) # Меняем направлениеservice_set_ears(-90*ear_k, 90*ear_k)# Устанавливаем положение ears_timer = time.time()# Обновляем таймерif (time.time()-neck_timer)>1:# Каждую секунду голова движется в новую сторону neck_k = neck_k*(-1) # Меняем направлениеservice_set_neck(15, 20* neck_k, 1)# Задать положение neck_timer = time.time()# Обновляем таймерservice_set_neck(0,0,1)# Возвращаем шейный сустав в начальное положениеservice_set_ears(0,0)# Возвращаем уши в начальное положениеservice_display_player(f"__BLANK__")# Убираем изображение с экрана
Остановите сервис robohead
sudosystemctlstoprobohead.service
В отдельном терминале запустите все необходимые пакеты без head_controller
roslaunchhead_controllerdependencies.launch
И запустите созданный скрипт main.py
python3~/scripts/main.py
Псле запуска скрипта произойдет выполнение действий команды "Улыбнись".
Дальше можно перезапускать только скрипт main.py
После перезагрузки нужно будет вновь остановить сервис robohead и запустить зависимости