基于Flask-wifi的远程Turtlebot3控制仿真(Моделирование удаленного управления Turtlebot3 на основе Flask-wifi)


背景

为完成基于脑电的的机器人控制项目,目前脑电信号已经分类完毕,分为向前,向后,左转,右转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

在这里插入图片描述

  1. 查看ip地址
    在这里插入图片描述

  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

在这里插入图片描述

Моделирование удаленного управления 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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值