Я пишу свой первый навык Alexa с целью взаимодействия с роботом, обеспечивая голосовой ввод, а также позволяя роботу отправлять обратно сообщения через интерфейс Alexa.
Я использую расширение Flask-Ask Python для написания локального бэкэнда, используя ngrok для установления связи http и ROS для связи с роботом.
Я создаю намерения запуска и остановки, а также личное, в котором прошу Алексу переместить робота.
Что мне нужно сделать сейчас, так это создать функцию, которая позволяет мне передавать сообщение, используя вывод alexa speak, без взаимодействия с пользователем; Например, когда срабатывает пользовательское условие if
, я хочу, чтобы Алекса воспроизвела образец сообщения:
if condition == True:
def advise_function():
sample_message = 'Messaggio di avviso'
return statement(sample_message)
Это фактический код (для справки):
#!/usr/bin/env python
import os
import rospy
import threading
import requests
import time
from flask import Flask
from flask_ask import Ask, question, statement, session
from std_msgs.msg import String, Float64
#---------------------------------------------- FLASK & ROS INIZIALIZATION ---------------------------------------------#
app = Flask(__name__)
ask = Ask(app, "/")
# ROS node, publisher, and parameter. The node is started in a separate thread to avoid conflicts with Flask.
# The parameter *disable_signals* must be set if node is not initialized in the main thread.
threading.Thread(target=lambda: rospy.init_node('alexa_ros_node', disable_signals=True)).start()
direction_publisher = rospy.Publisher('alexa/direction', String, queue_size=100)
length_publisher = rospy.Publisher('alexa/lenght', Float64, queue_size=100)
NGROK = rospy.get_param('/ngrok', None)
#------------------------------------------------------- INTENTS -------------------------------------------------------#
# LaunchIntent -> Avvio dell'applicazione: "Apri nodo ros"
@ask.launch
def launch():
welcome_message = 'Benvenuto nel nodo di controllo ROS. Come posso aiutarti?'
return question(welcome_message)
# MuoviRobotIntent: "Muovi il robot"
@ask.intent('MuoviRobotIntent', default={'direzione':None, 'lunghezza':None})
def move_robot_function(direzione, lunghezza):
direction_publisher.publish(direzione)
length_publisher.publish(float(lunghezza))
return statement('Ho pubblicato direzione e lunghezza sul topic ROS: {0} di {1} metri.'.format(direzione, lunghezza))
# StopIntent -> Uscita dall'applicazione: "Stop / Esci..."
@ask.session_ended
def session_ended():
return "{}", 200
# ngrok app running
if __name__ == '__main__':
if NGROK:
print 'NGROK mode'
app.run(host=os.environ['ROS_IP'], port=5000)
else:
print 'Manual tunneling mode'
dirpath = os.path.dirname(__file__)
cert_file = os.path.join(dirpath, '../config/ssl_keys/certificate.pem')
pkey_file = os.path.join(dirpath, '../config/ssl_keys/private-key.pem')
app.run(host=os.environ['ROS_IP'], port=5000,
ssl_context=(cert_file, pkey_file))