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

news2024/11/15 10:15:05

项目概述

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

主要功能:

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

系统设计

硬件部分

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

  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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费【2024】springboot 超市在线销售系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Adobe Photoshop(Ps)安装包软件下载

一、Adobe Photoshop简介 Adobe Photoshop&#xff08;简称PS&#xff09;是由Adobe Systems公司开发的图像处理软件&#xff0c;它是一款集图像扫描、编辑修改、图像制作、广告创意、图像输入与输出于一体的图形图像处理软件。广泛应用于专业测评、平面设计、广告摄影、影像创…

通过限制访问,实现纯私有Docker镜像

怎么会不过审呢?没有敏感信息呀。 For obvious reasons,Many Docker image repositories are inaccessible,The official warehouse has also been filtered by the firewall,So write about how to build a self use Docker image using CloudFlares Workers and Pages. …

SQL Server 设置端口号:详细步骤与注意事项

目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…

VSCode 解决 pylint 报错 No name QWidget in module PyQt5.QtWidgets

问题 启用了 VSCode 的 Pylint 插件, 即便 Python 环境中安装了 PyQt5, 也无法正确解析 PyQt5 的导入 PyQt5 底层代码是用 C/C 写的, pylint 默认不会深入解析 pylint doesn’t load any C extensions by default, because those can run arbitrary code. 解决 修改 Settings…

Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍

1. Internet Download Manager&#xff08;IDM&#xff09;是一款功能强大的下载管理器&#xff0c;支持所有流行的浏览器&#xff0c;并可提升下载速度高达5倍。 2. IDM具有智能下载逻辑加速器&#xff0c;可以设置文件下载优先级、分块下载等&#xff0c;提高下载效率。 IDM…

网站用HTTP访问的危害以及如何升级HTTPS访问

在互联网世界中&#xff0c;数据传输的安全性是至关重要的。我们每天都在网络上进行各种操作&#xff0c;从浏览网页、购物到银行转账&#xff0c;每一项活动都涉及敏感信息的传递。然而&#xff0c;在这个过程中&#xff0c;我们的数据可能面临被窃取、篡改或滥用的风险。这正…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm&#xff0c;创建项目&#xff1a;flask-web vue create flask…

深入理解Python装饰器:从基础到进阶

引言 在Python中&#xff0c;装饰器是一种强大的工具&#xff0c;它允许程序员以一种简洁而优雅的方式修改函数或类的行为。装饰器本质上是一个接受函数作为参数的函数&#xff0c;并返回一个新的函数。本文将从装饰器的基础开始介绍&#xff0c;并逐步深入到一些高级用法。 …

鸿蒙应用框架开发【多线程任务】

多线程任务 介绍 本示例通过ohos.taskpool和ohos.worker接口&#xff0c;展示了如何启动worker线程和taskpool线程。 效果预览 使用说明 在主界面&#xff0c;可以点击字符串排序和拷贝文件按钮进入对应的界面&#xff1b; 点击字符串排序按钮进入多线程界面&#xff1a; w…

数据库连接断开后,DBAPI的数据源如何自动重连

现象 在使用DBAPI的过程中&#xff0c;如果网络抖动导致数据库连接不上&#xff0c;发现DBAPI的数据源不能重连&#xff0c;必须重启DBAPI才能连上数据库 解决办法 在数据源的连接池参数配置druid.breakAfterAcquireFailurefalse注意在企业版的4.1.1及以上版本才可以配置连接…

7. LangChain4j如何使用统一api调用?

前言 当我们对接LangChain4j的时候&#xff0c;面对复杂的各种各样的大模型的api的对接&#xff0c;让很多开发者感到力不从心。在每个大模型的api都不一样的时候&#xff1f;该如何快捷的切换模型的使用呢&#xff1f; 这时&#xff0c;One-API应运而生&#xff0c;它以其简洁…

Linux中如何用ida调试fork后的子进程

原文链接 > https://redqx.github.io/linux/2024/07/24/linux-debugfork.html 本文的一些图片引用可能有一些问题, 比如数据不对劲,但无伤大雅 自己懒得粘贴图片了 环境: wsl-kali-2024 ida-7.7 插件: Lazy_ida, 还有一个什么插件不知道什么名字, 可以把汇编转字节码 …

聚焦智慧出行,TDengine 与路特斯科技再度携手

在全球汽车行业向电动化和智能化转型的过程中&#xff0c;智能驾驶技术正迅速成为行业的焦点。随着消费者对出行效率、安全性和便利性的需求不断提升&#xff0c;汽车制造商们需要在全球范围内实现低延迟、高质量的数据传输和处理&#xff0c;以提升用户体验。在此背景下&#…

java学习--练习题

在类中this.属赋值&#xff0c;则外部创建对象调用其值也会随之一样 package com.test01;/* author:我与java相爱相杀---c语言梦开始的地方 今天又是努力学习的一天&#xff01;&#xff01;&#xff01;&#xff01; */ /*1. 在Frock类中声明私有的静态属性currentNum[int类型…

谷粒商城-性能压测

1.压力测试 在项目上线前对其进行压力测试(以每个微服务为单元) 目的:找到系统能承载的最大负荷,找到其他测试方法更难发现的错误(两种类型:内存泄漏,并发与同步). 1.性能指标 响应时间(Response Time (RT)): 响应时间 指用户从客户端发起一个请求开始,到客户端接收到从服务…

学习笔记-系统框图传递函数公式推导

目录 *待了解 现代控制理论和自动控制理论区别 自动控制系统的组成 信号流图 1、系统框图 1.1、信号线、分支点、相加点 1.2、系统各环节间的连接 1.3、 相加点和分支点的等效移动&#xff08;比较点、引出点&#xff09; 2、反馈连接公式推导 2.1、前向通路传递函数…

SpringCloud注册中心(Nacos,Ribbon)

微服务是由多个模块共同组成的&#xff0c;注册中心可以帮助我们沟通这些模块&#xff0c;帮助我们完成模块间的 常见的注册中心 Zookeeper zookeeper它是⼀个分布式服务框架&#xff0c;是Apache Hadoop 的⼀个⼦项⽬&#xff0c;它主要是⽤来解决分布式应 ⽤中经常遇到的⼀…

项目的小结

1.实现实时聊天 1.服务端建立一个ConcurrentHashMap<> 用来存储在线用户&#xff0c;用户账号和socket然后&#xff0c;如果有个人发了信息&#xff0c;就去数据库中查询&#xff0c;然后根据这个在线用户进行传递信息 服务端框架&#xff1a; public class ServerMain {…

转置卷积 transposed convolution

1. 转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;也叫Fractionally-strided Convolution和Deconvolution&#xff0c;但用的最多的是Transposed Convolution。 注意&#xff1a; 转置卷积不是卷积的逆运算&#xff0c;只会大小恢复为原本大小。转置卷积…