首页 > 编程语言 >嵌入式Python、ROS、SLAM、WebSocket和Node.js:智能巡逻监控安防机器人设计流程(代码示例)

嵌入式Python、ROS、SLAM、WebSocket和Node.js:智能巡逻监控安防机器人设计流程(代码示例)

时间:2024-07-26 20:28:02浏览次数:16  
标签:Node WebSocket 示例 alert ws 警报 GPIO ROS

项目概述

随着智能技术的发展,智能巡逻机器人在安防、监控和巡逻等领域的应用越来越广泛。本文将介绍一个结合嵌入式系统、机器人技术和后端开发的智能巡逻机器人。该机器人能够自主导航,实时检测异常情况(如火灾或入侵者),并将数据发送到后端服务器,以实现高效的监控和应急响应。

主要功能:

  • 自主导航
  • 异常情况检测(火灾、入侵)
  • 实时数据传输与存储
  • 远程监控与控制

系统设计

硬件部分

本项目的硬件部分主要包括以下组件:

  1. Raspberry Pi 4:作为核心控制单元,负责数据处理和通信。
  2. 传感器
    • 火焰传感器:用于检测火灾。
    • 红外传感器:用于检测入侵者。
    • 超声波传感器:用于避障。
  3. 电机驱动模块:控制机器人运动的电机。
  4. 摄像头:用于实时监控和图像处理。
  5. 电源管理模块:提供稳定的电源供应。

软件部分

本项目的软件架构分为三个主要部分:

  1. 嵌入式系统

    • 使用Raspberry Pi与传感器进行数据采集和基本控制。
    • 使用Python编写数据采集和处理程序。
  2. 机器人控制

    • 使用ROS(Robot Operating System)进行导航和控制。
    • 配置SLAM(Simultaneous Localization and Mapping)以实现自主导航。
  3. 后端服务

    • 使用Node.js或Django构建后端服务。
    • 利用WebSocket实现实时通信,进行数据存储和处理。

以下是系统设计的整体架构图:

代码实现

1. 嵌入式系统

在嵌入式系统部分,我们将使用Raspberry Pi进行数据采集和基本控制。以下是使用Python与传感器进行数据采集的示例代码。

代码示例
import RPi.GPIO as GPIO
import time
import requests

# 设置GPIO模式
GPIO.setmode(GPIO.BCM)

# 定义传感器引脚
FLAME_SENSOR_PIN = 17  # 火焰传感器引脚
PIR_SENSOR_PIN = 27    # 红外传感器引脚

# 初始化引脚
GPIO.setup(FLAME_SENSOR_PIN, GPIO.IN)
GPIO.setup(PIR_SENSOR_PIN, GPIO.IN)

# 后端服务器地址
SERVER_URL = 'http://your-server-address/api/alerts'

def send_alert(alert_type):
    """发送警报到后端服务器"""
    payload = {'alert': alert_type}
    try:
        response = requests.post(SERVER_URL, json=payload)
        if response.status_code == 200:
            print(f"成功发送警报: {alert_type}")
        else:
            print(f"发送警报失败: {response.status_code}")
    except Exception as e:
        print(f"连接后端服务器失败: {e}")

try:
    while True:
        # 检测火灾
        if GPIO.input(FLAME_SENSOR_PIN):
            print("火灾警报!")
            send_alert('火灾')
        else:
            print("火灾正常。")

        # 检测入侵者
        if GPIO.input(PIR_SENSOR_PIN):
            print("检测到入侵者!")
            send_alert('入侵')
        else:
            print("无入侵者。")

        time.sleep(1)  # 每秒检测一次

except KeyboardInterrupt:
    GPIO.cleanup()
代码解析
  • GPIO设置:使用RPi.GPIO库设置GPIO引脚模式,并定义火焰传感器和红外传感器的引脚。
  • 数据采集:使用GPIO.input()函数读取传感器状态,检测火灾和入侵。
  • 发送警报:检测到异常情况后,调用send_alert()函数向后端服务器发送警报信息。

2. 机器人控制

在机器人控制部分,我们将使用 ROS(Robot Operating System)进行导航和控制。ROS 提供了强大的工具和库,使得机器人开发变得更加高效和灵活。

2.1 ROS 环境搭建

在 Raspberry Pi 上安装 ROS 需要以下步骤:

  1. 更新系统

    sudo apt-get update
    sudo apt-get upgrade
    
  2. 安装 ROS
    根据所需的 ROS 版本(如 Noetic 或 Melodic),可以参考 ROS 官方文档进行安装。以下是安装 ROS Noetic 的基本步骤:

    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key F42ED6FBAB17C654
    sudo apt-get update
    sudo apt-get install ros-noetic-desktop-full
    
  3. 初始化 rosdep

    sudo rosdep init
    rosdep update
    
  4. 设置 ROS 环境变量
    在 ~/.bashrc 中添加 ROS 环境变量:

    echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    
  5. 安装 ROS 包
    根据需要安装相关的 ROS 包,如 ros-<distro>-navigation 和 ros-<distro>-slam。例如:

    sudo apt-get install ros-noetic-navigation
    sudo apt-get install ros-noetic-slam-gmapping
    
2.2 SLAM 与导航控制

在 ROS 中,使用 SLAM(Simultaneous Localization and Mapping)算法来实现自主导航。以下是一个简单的 ROS 节点示例,展示了如何使用 geometry_msgs 控制机器人移动。

代码示例
import rospy
from geometry_msgs.msg import Twist

def move_forward():
    # 初始化 ROS 节点
    rospy.init_node('robot_mover', anonymous=True)
    # 创建一个发布者,向 /cmd_vel 主题发送速度指令
    pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
    rate = rospy.Rate(10)  # 10Hz

    # 创建一个 Twist 消息,用于控制线速度和角速度
    move_cmd = Twist()
    move_cmd.linear.x = 0.5  # 前进速度 (m/s)
    move_cmd.angular.z = 0.0  # 旋转速度 (rad/s)

    while not rospy.is_shutdown():
        pub.publish(move_cmd)  # 发布速度指令
        rate.sleep()  # 控制循环频率

if __name__ == '__main__':
    try:
        move_forward()
    except rospy.ROSInterruptException:
        pass
代码解析
  • 初始化 ROS 节点:使用 rospy.init_node() 初始化节点。
  • 创建发布者:使用 rospy.Publisher() 创建一个发布者,向 /cmd_vel 主题发送控制指令。
  • 设置速度指令:使用 Twist 消息设置线速度和角速度,控制机器人前进。
  • 控制循环:在循环中不断发布速度指令,直到节点被关闭。

3. 后端服务

后端服务部分使用 Node.js 构建,负责接收来自嵌入式系统的数据,存储并处理这些数据,同时提供实时监控功能。

3.1 Node.js 环境搭建

在 Raspberry Pi 或其他服务器上安装 Node.js,使用以下命令:

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
3.2 创建后端服务

以下是一个简单的 Node.js 后端服务示例,使用 Express 框架和 WebSocket 实现实时通信。

代码示例
const express = require('express');
const bodyParser = require('body-parser');
const WebSocket = require('ws');

const app = express();
const server = require('http').createServer(app);
const wss = new WebSocket.Server({ server });

app.use(bodyParser.json()); // 解析 JSON 请求体

// 存储警报信息
let alerts = [];

// 处理 POST 请求,接收来自机器人发送的警报
app.post('/api/alerts', (req, res) => {
    const alert = req.body.alert;
    if (alert) {
        alerts.push({ alert, timestamp: new Date() }); // 将警报存储到数组中
        console.log(`接收到警报: ${alert}`);
        // 广播到所有连接的 WebSocket 客户端
        wss.clients.forEach(client => {
            if (client.readyState === WebSocket.OPEN) {
                client.send(JSON.stringify({ alert, timestamp: new Date() }));
            }
        });
        res.status(200).send({ message: '警报已接收' });
    } else {
        res.status(400).send({ message: '警报内容不能为空' });
    }
});

// 处理 WebSocket 连接
wss.on('connection', (ws) => {
    console.log('新客户端连接');

    // 向新连接的客户端发送当前存储的警报
    ws.send(JSON.stringify({ alerts }));

    // 处理客户端发送的消息(可选)
    ws.on('message', (message) => {
        console.log(`接收到消息: ${message}`);
    });

    ws.on('close', () => {
        console.log('客户端断开连接');
    });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
});
代码解析
  • Express 设置:使用 express 框架创建一个 web 服务器,使用 body-parser 中间件解析 JSON 格式的请求体。
  • 警报存储:定义一个 alerts 数组来存储收到的警报信息。
  • POST /api/alerts 端点:处理来自机器人发送的 POST 请求。将接收到的警报信息存储到 alerts 数组中,并向所有连接的 WebSocket 客户端广播该警报。
  • WebSocket 服务器:当新的客户端连接时,向其发送当前存储的警报信息。可以选择处理客户端发送的消息。
  • 启动服务器:指定服务器运行的端口号,启动 HTTP 服务器。

3.3 前端监控界面(可选)

对于智能巡逻机器人项目,我们可以创建一个简单的前端页面,通过 WebSocket 实时显示警报信息。以下是一个使用 HTML 和 JavaScript 实现的基本前端示例。

代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智能巡逻机器人监控</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 20px;
            background-color: #f4f4f4;
        }
        h1 {
            color: #333;
        }
        #alerts {
            margin-top: 20px;
            padding: 10px;
            border: 1px solid #ccc;
            background-color: #fff;
            max-height: 300px;
            overflow-y: auto;
        }
        .alert {
            padding: 5px;
            border-bottom: 1px solid #eaeaea;
        }
    </style>
</head>
<body>
    <h1>智能巡逻机器人监控</h1>
    <div id="alerts">
        <h2>警报记录</h2>
    </div>

    <script>
        const alertsDiv = document.getElementById('alerts');
        const ws = new WebSocket('ws://localhost:3000/');

        ws.onmessage = (event) => {
            const data = JSON.parse(event.data);
            if (data.alert) {
                const alertElement = document.createElement('div');
                alertElement.classList.add('alert');
                alertElement.textContent = `${data.timestamp}: ${data.alert}`;
                alertsDiv.appendChild(alertElement);
            }

            // 如果有多条警报,保持显示最新的几条
            if (alertsDiv.children.length > 20) {
                alertsDiv.removeChild(alertsDiv.firstChild);
            }
        };

        ws.onopen = () => {
            console.log('WebSocket 连接已建立');
        };

        ws.onclose = () => {
            console.log('WebSocket 连接已关闭');
        };

        ws.onerror = (error) => {
            console.error('WebSocket 错误:', error);
        };
    </script>
</body>
</html>
代码解析
  • WebSocket 连接:通过 new WebSocket('ws://localhost:3000/') 建立与后端的 WebSocket 连接。
  • 接收消息:在 ws.onmessage 事件处理程序中,解析接收到的消息并更新警报记录。每当收到一个新警报时,创建一个新的 <div> 元素并将其添加到 #alerts 容器中。
  • 限制显示数量:如果警报记录超过 20 条,则删除最早的一条,以保持界面整洁。
  • 连接状态:通过 ws.onopenws.onclose 和 ws.onerror 事件处理程序分别处理连接建立、关闭和错误的情况。

项目总结

通过本项目,我们成功地构建了一个智能巡逻机器人,能够实现自主导航、异常情况检测并将数据实时发送到后端服务器。该系统的主要组成部分包括:

  1. 嵌入式系统:基于 Raspberry Pi 的传感器数据采集和处理。
  2. 机器人控制:使用 ROS 实现自主导航和控制。
  3. 后端服务:使用 Node.js 构建的 RESTful API 和 WebSocket 实现实时通信。
  4. 前端监控界面:使用 HTML 和 JavaScript 实现的实时警报显示。

在实际应用中,该智能巡逻机器人可以用于安防监控、消防预警等场景,为用户提供安全保障。

参考文献

  1. ROS 官方文档: Documentation - ROS Wiki
  2. Raspberry Pi 官方文档: https://www.raspberrypi.org/documentation/
  3. Node.js 官方文档: Index | Node.js v22.5.1 Documentation
  4. WebSocket API 文档: WebSocket - Web API | MDN

 

标签:Node,WebSocket,示例,alert,ws,警报,GPIO,ROS
From: https://blog.csdn.net/qq_40431685/article/details/140723877

相关文章

  • windows的nodejs版本控制工具:nvm nodejs以及vue的安装
    首先确保自己的电脑是首次安装nodejs相关的软件,安装nvm之前必须确保电脑无nodejs。1.nvm的安装在github上寻找合适的版本,我安装的是v1.12版本。Releases·coreybutler/nvm-windows·GitHubwindows下就下载如下图所示的nvm-setup.exe文件选择nvm的安装路径选择nodej......
  • KingbaseES 自定义操作符使用示例
    本文详细介绍了KingbaseES中在兼容适配过程中,当遇到不支持的操作符,如何通过自定义方式解决兼容适配问题。Kingbase自定义操作符语法和用例如下:用例数据:createtabledemo(idnumeric(10,5));insertintodemovalues(1.1);insertintodemovalues(0);insertintodemoval......
  • NodeJs 学习笔记
    Node.js是一个基于ChromeV8JavaScript引擎的开源运行环境,用于开发服务器端和网络应用。Node.js允许开发者使用JavaScript编写命令行工具和服务器端的应用程序,并且可以无缝地在从服务器到桌面应用再到移动设备的各种环境中运行。Node.js的核心原理包括:事件驱动:Node.......
  • Vue前端数值转换为千分位格式并保留两位小数代码示例
    在Vue中,你可以使用JavaScript的内置方法来实现数值转换为千分位格式并保留两位小数。以下是一个简单的示例:vue<template><div><inputv-model="number"type="number"placeholder="输入一个数字"><p>转换后的结果:{{formattedNumber}}</p></div>&l......
  • python 装饰器执行顺序的代码示例
    defdecoratorA(func):print(33)defwrapperA():print("EnteringA")print(func())print("ExitingA")print(44)returnwrapperAdefdecoratorB(func):print(11)defwrapperB():print("Ent......
  • FastAPI - 如何处理 websocket 端点中的通用异常
    我想了解在FastAPI应用程序中处理websocket端点异常的推荐方法是什么。我尝试过:app.add_exception_handler(Exception,handle_generic_exception)它捕获Exception,但它没有捕获,例如ValueError|||我也尝试过使用但它似乎不适用于web......
  • MySQL配置开发文章:学习路线、使用案例及代码示例
    引言MySQL是一个广泛使用的开源关系型数据库管理系统,由于其性能高、成本低、可靠性强,成为了许多开发者的首选工具,本文将介绍MySQL的基本配置、学习路线、使用案例及代码示例,帮助你更好地掌握MySQL的使用MySQL配置开发教程学习路线基础知识:了解关系型数据库的基本概念,熟......
  • 抖音直播弹幕数据逆向:websocket和JS注入
    ......
  • .NET TCP、UDP、Socket、WebSocket
    做.NET应用开发肯定会用到网络通信,而进程间通信是客户端开发使用频率较高的场景。进程间通信方式主要有命名管道、消息队列、共享内存、Socket通信,个人使用最多的是Sokcet相关。而Socket也有很多使用方式,Socket、WebSocket、TcpClient、UdpClient,是不是很多?HttpClient与TcpClien......
  • k8s-node节点平滑维护
    目录Kubernetes节点管理:cordon、drain和delete命令1.cordon命令2.drain命令3.delete命令4.节点平滑维护的推荐步骤Kubernetes节点管理:cordon、drain和delete命令在Kubernetes集群中,管理节点时常涉及到将节点从调度中排除以便进行维护。常用的操作包括cordon、d......