基于Flask-wifi的远程Turtlebot3控制仿真 Моделирование удаленного управления Turtlebot3 на основе Flask-wifi
- 背景
- 一、电脑环境
- 二、安装Turtlebot3仿真环境
- 三、运行Rviz
- 四、编写控制节点(flask_turtlebot3.py)
- 五、仿真过程
- Моделирование удаленного управления Turtlebot3 на основе Flask-wifi
- Обоснование
- 1. Конфигурация компьютера
- 2. Установка среды моделирования Turtlebot3
- 3. Запуск Rviz
- 4. Разработка управляющего узла (flask_turtlebot3.py)
- 5. Процесс моделирования
背景
为完成基于脑电的的机器人控制项目,目前脑电信号已经分类完毕,分为向前,向后,左转,右转4个方向。该报告采用Flask框架来发送指令,当机器人和控制设备处于同一WiFi下时,机器人可以收到控制设备的信号。当收到向前的信号,机器人保持向前状态,此时若收到向后信号,则机器人停止,其他方向同理。
一、电脑环境
虚拟机Ubuntu20.04,ROS1-Noetic.
二、安装Turtlebot3仿真环境
mkdir -p ~/turtlebot3_ws/src/
cd ~/turtlebot3_ws/src/
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd ~/turtlebot3_ws
catkin_make
三、运行Rviz
roslaunch turtlebot3_fake turtlebot3_fake.launch
四、编写控制节点(flask_turtlebot3.py)
from flask import Flask, request
import rospy
from geometry_msgs.msg import Twist
import threading
import time
app = Flask(__name__)
# 初始化 ROS
rospy.init_node("flask_turtlebot3_control", anonymous=True)
pub = rospy.Publisher("/cmd_vel", Twist, queue_size=10)
# 维护一个全局变量,记录当前运动状态
current_command = None
running = True
def publish_cmd():
global current_command, running
rate = rospy.Rate(10) # 10Hz, 每 0.1 秒发布一次
last_command = None # 记录上一次的指令,避免重复打印
while running and not rospy.is_shutdown():
if current_command:
twist = Twist()
status_message = ""
if current_command == "1":
twist.linear.x = 0.2 # 前进
status_message = "⬆️ Вперёд (前进)"
elif current_command == "2":
twist.linear.x = -0.2 # 后退
status_message = "⬇️ Назад (后退)"
elif current_command == "3":
twist.angular.z = 1.0 # 左转
status_message = "⬅️ Налево (左转)"
elif current_command == "4":
twist.angular.z = -1.0 # 右转
status_message = "➡️ Направо (右转)"
pub.publish(twist)
# 避免重复打印相同状态
if current_command != last_command:
print(status_message)
last_command = current_command
else:
if last_command is not None:
print("🛑 Стоп (停止)")
last_command = None
rate.sleep()
# 启动持续发布线程
threading.Thread(target=publish_cmd, daemon=True).start()
@app.route("/", methods=["GET"])
def control():
global current_command
command = request.args.get("d") # 获取 HTTP 参数 "d"
if command not in ["1", "2", "3", "4"]:
print("❌ 无效指令收到: ", command)
return "❌ 无效指令"
# 如果发送的指令和当前指令相反,则停止机器人
opposite_commands = {"1": "2", "2": "1", "3": "4", "4": "3"}
if current_command and opposite_commands.get(command) == current_command:
current_command = None
twist = Twist()
pub.publish(twist) # 停止机器人
print("🛑 Стоп 机器人已停止 (收到相反指令)!")
return "🛑 Стоп 机器人已停止"
# 否则更新指令,让机器人持续运动
print(f"✅ 机器人执行新指令: {command}")
current_command = command
return f"✅ 机器人执行: {command}"
if __name__ == "__main__":
print("🚀 Flask 服务器已启动!请在浏览器访问: http://192.168.100.9:5000/?d=1 控制机器人")
app.run(host="0.0.0.0", port=5000)
五、仿真过程
roscore
roslaunch turtlebot3_fake turtlebot3_fake.launch
cd turtlebot3_ws/src/
python3 flask_turtlebot3.py
-
查看ip地址
-
控制机器人运动
http://192.168.100.9:5000/?d=1 # 让机器人前进 Up
http://192.168.100.9:5000/?d=2 # 让机器人后退 Down
http://192.168.100.9:5000/?d=3 # 让机器人左转 Left
http://192.168.100.9:5000/?d=4 # 让机器人右转 Right
Моделирование удаленного управления Turtlebot3 на основе Flask-wifi
Обоснование
Для реализации проекта по управлению роботом на основе ЭЭГ-сигналов завершена классификация сигналов мозга на 4 направления: вперед, назад, поворот влево и вправо. В данном отчете используется фреймворк Flask для отправки команд. Когда робот и управляющее устройство находятся в одной WiFi-сети, робот может получать сигналы. При получении сигнала “вперед” робот продолжает движение вперед. Если в этом состоянии приходит сигнал “назад”, робот останавливается. Аналогичная логика применяется для других направлений.
1. Конфигурация компьютера
Виртуальная машина Ubuntu 20.04, ROS1 Noetic.
2. Установка среды моделирования Turtlebot3
mkdir -p ~/turtlebot3_ws/src/
cd ~/turtlebot3_ws/src/
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd ~/turtlebot3_ws
catkin_make
3. Запуск Rviz
roslaunch turtlebot3_fake turtlebot3_fake.launch
4. Разработка управляющего узла (flask_turtlebot3.py)
from flask import Flask, request
import rospy
from geometry_msgs.msg import Twist
import threading
import time
app = Flask(__name__)
# Инициализация ROS
rospy.init_node("flask_turtlebot3_control", anonymous=True)
pub = rospy.Publisher("/cmd_vel", Twist, queue_size=10)
# Глобальная переменная для отслеживания текущей команды
current_command = None
running = True
def publish_cmd():
global current_command, running
rate = rospy.Rate(10) # 10Hz, публикация каждые 0.1 сек
last_command = None # Для предотвращения дублирования вывода
while running and not rospy.is_shutdown():
if current_command:
twist = Twist()
status_message = ""
if current_command == "1":
twist.linear.x = 0.2 # Вперед
status_message = "⬆️ Вперёд (前进)"
elif current_command == "2":
twist.linear.x = -0.2 # Назад
status_message = "⬇️ Назад (后退)"
elif current_command == "3":
twist.angular.z = 1.0 # Влево
status_message = "⬅️ Налево (左转)"
elif current_command == "4":
twist.angular.z = -1.0 # Вправо
status_message = "➡️ Направо (右转)"
pub.publish(twist)
if current_command != last_command:
print(status_message)
last_command = current_command
else:
if last_command is not None:
print("🛑 Стоп (停止)")
last_command = None
rate.sleep()
# Запуск потока публикации команд
threading.Thread(target=publish_cmd, daemon=True).start()
@app.route("/", methods=["GET"])
def control():
global current_command
command = request.args.get("d") # Получение параметра "d"
if command not in ["1", "2", "3", "4"]:
print("❌ Получена недопустимая команда: ", command)
return "❌ Недопустимая команда"
# Остановка при получении противоположной команды
opposite_commands = {"1": "2", "2": "1", "3": "4", "4": "3"}
if current_command and opposite_commands.get(command) == current_command:
current_command = None
twist = Twist()
pub.publish(twist)
print("🛑 Стоп: получена противоположная команда!")
return "🛑 Стоп: робот остановлен"
# Обновление текущей команды
print(f"✅ Выполнение новой команды: {command}")
current_command = command
return f"✅ Робот выполняет: {command}"
if __name__ == "__main__":
print("🚀 Сервер Flask запущен! URL для управления: http://192.168.100.9:5000/?d=1")
app.run(host="0.0.0.0", port=5000)
5. Процесс моделирования
roscore
roslaunch turtlebot3_fake turtlebot3_fake.launch
cd turtlebot3_ws/src/
python3 flask_turtlebot3.py
5.1. Проверка IP-адреса:
5.2. Управление роботом:
http://192.168.100.9:5000/?d=1 # 让机器人前进 Up
http://192.168.100.9:5000/?d=2 # 让机器人后退 Down
http://192.168.100.9:5000/?d=3 # 让机器人左转 Left
http://192.168.100.9:5000/?d=4 # 让机器人右转 Right