dream
142 строки · 4.1 Кб
1import threading2import rospy3
4from std_msgs.msg import String5from flask import Flask, request6from flask import jsonify7
8import logging9import time10from os import getenv11
12import sentry_sdk13
14
15sentry_sdk.init(getenv("SENTRY_DSN"))16
17logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)18logger = logging.getLogger(__name__)19
20app = Flask(__name__)21
22talker = rospy.Publisher("talker", String, queue_size=1)23
24threading.Thread(target=lambda: rospy.init_node("listener", disable_signals=True)).start()25
26VALID_COMMANDS = ["test_command"]27COMMAND_QUEUE = []28EXECUTING_COMMAND = None29
30
31@app.route("/ping", methods=["POST"])32def ping():33return "pong"34
35
36@app.route("/set_commands", methods=["POST"]) # this endpoint should not be accessed from within dream37def respond_set_commands():38global VALID_COMMANDS39
40st_time = time.perf_counter()41VALID_COMMANDS = list(map(lambda i: i.lower(), request.json.get("commands", [])))42if not VALID_COMMANDS:43logger.info("embodied-server user did not send valid commands list")44logger.info(f"embodied-server `VALID_COMMANDS` set: {VALID_COMMANDS}")45
46total_time = time.perf_counter() - st_time47
48logger.info(f"embodied-server `is_command_valid` exec time: {total_time:.3f}s")49
50return {"result": bool(VALID_COMMANDS)}51
52
53@app.route("/is_command_valid", methods=["POST"])54def respond_is_command_valid():55st_time = time.perf_counter()56
57command = request.json.get("command", None)58results = {"result": any(item in command for item in VALID_COMMANDS)}59logger.info(f"embodied-server `is_command_valid` results: {results}")60
61total_time = time.perf_counter() - st_time62
63logger.info(f"embodied-server `is_command_valid` exec time: {total_time:.3f}s")64
65return jsonify(results)66
67
68@app.route("/perform_command", methods=["POST"])69def respond_perform_command():70st_time = time.perf_counter()71
72command = request.json.get("command", None)73cmd_valid = command in VALID_COMMANDS74logger.info(f"ros-flask-server received command: {command}, valid? -{cmd_valid}")75if cmd_valid:76logger.info("Sending command to ROS...")77try:78talker.publish(command)79logger.info("Successfully returned from ROS!")80COMMAND_QUEUE.append(command)81except Exception as e:82logger.info(f"Error inside ROS: {e}")83results = {"result": cmd_valid}84logger.info(f"embodied-server `perform_command` {command} appended to queue?: {results}")85
86total_time = time.perf_counter() - st_time87
88logger.info(f"embodied-server `perform_command` exec time: {total_time:.3f}s")89
90return jsonify(results)91
92
93@app.route("/receive_command", methods=["POST"]) # this endpoint should not be accessed from within dream94def respond_receive_command():95global EXECUTING_COMMAND96
97st_time = time.perf_counter()98
99command = COMMAND_QUEUE.pop(0) if COMMAND_QUEUE else None100results = {"command": command}101logger.info(f"embodied-server `receive_command` results: {results}")102
103total_time = time.perf_counter() - st_time104
105logger.info(f"embodied-server `receive_command` exec time: {total_time:.3f}s")106
107return jsonify(results)108
109
110@app.route("/is_command_performed", methods=["POST"])111def respond_is_command_performed():112st_time = time.perf_counter()113
114results = {"result": EXECUTING_COMMAND}115logger.info(f"embodied-server `is_command_performed` results: {results}")116
117total_time = time.perf_counter() - st_time118
119logger.info(f"embodied-server `is_command_performed` exec time: {total_time:.3f}s")120
121return jsonify(results)122
123
124@app.route("/command_is_performed", methods=["POST"]) # this endpoint should not be accessed from within dream125def respond_command_is_performed():126global EXECUTING_COMMAND127
128st_time = time.perf_counter()129
130results = {"result": True}131logger.info(f"embodied-server `command_is_performed` results: {results}")132EXECUTING_COMMAND = None133
134total_time = time.perf_counter() - st_time135
136logger.info(f"embodied-server `command_is_performed` exec time: {total_time:.3f}s")137
138return jsonify(results)139
140
141if __name__ == "__main__":142app.run(host="0.0.0.0", port=6000, debug=True)143