From 5f961b3852bfac6c7bda0647309733f3eb1eb1d1 Mon Sep 17 00:00:00 2001 From: mavxa Date: Thu, 17 Sep 2026 06:56:07 +0300 Subject: [PATCH] add minimal module4 control example --- module4/simple/App.tsx | 19 +++++++++++++++++++ module4/simple/api.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 module4/simple/App.tsx create mode 100644 module4/simple/api.py diff --git a/module4/simple/App.tsx b/module4/simple/App.tsx new file mode 100644 index 0000000..303eb8e --- /dev/null +++ b/module4/simple/App.tsx @@ -0,0 +1,19 @@ +export default function App() { + + function forward() { + fetch("http://localhost:8000/api/forward", { + method: "POST" + }) + } + + return ( +
+ +
+ ) +} diff --git a/module4/simple/api.py b/module4/simple/api.py new file mode 100644 index 0000000..8739958 --- /dev/null +++ b/module4/simple/api.py @@ -0,0 +1,33 @@ +import rclpy +from flask import Flask +from geometry_msgs.msg import Twist + +app = Flask(__name__) + +rclpy.init() +node = rclpy.create_node("web_api") +publisher = node.create_publisher(Twist, "/RMC2/cmd_vel", 10) + + +@app.after_request +def cors(response): + response.headers["Access-Control-Allow-Origin"] = "*" + return response + + +@app.post("/api/forward") +def forward(): + speed = Twist() + speed.linear.x = 0.1 + + for _ in range(40): + publisher.publish(speed) + rclpy.spin_once(node, timeout_sec=0.05) + + for _ in range(5): + publisher.publish(Twist()) + rclpy.spin_once(node, timeout_sec=0.05) + + return "ok" + +app.run(host="0.0.0.0", port=8000, threaded=False)