实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据

简介: WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。

要在ROS系统中实现WebSocket传输以向Web应用推送 sensor_msgs::Image数据,可以通过以下步骤实现:

1. 选择合适的WebSocket库

首先,需选择一个合适的WebSocket库。在ROS环境中,经常使用 websocketpp库,这是一个C++库,用于构建WebSocket服务器和客户端。此外,也可考虑使用 rosbridge_suite,它为ROS提供了一个JSON API,使得通过WebSocket与非ROS系统进行通信变得容易。

2. 设置ROS环境

确保您的ROS环境已正确安装并设置。创建一个新的ROS工作空间,并在其中创建一个新的包以容纳WebSocket通信代码。

mkdir -p ~/websocket_ws/src
cd ~/websocket_ws/src
catkin_create_pkg websocket_communication std_msgs rospy roscpp
cd ~/websocket_ws
catkin_make
source devel/setup.bash
​

3. 编写WebSocket服务器端代码

在您的ROS包中创建WebSocket服务器端代码。以下是一个简化的例子,展示了一个基本的WebSocket服务器,它监听 sensor_msgs::Image类型的消息,并将其转发给所有连接的客户端。

#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

typedef websocketpp::server<websocketpp::config::asio> server;
typedef server::message_ptr message_ptr;

class ImageServer {
public:
    ImageServer() {
        // 初始化ROS节点
        ros::NodeHandle nh;
        // 订阅Image类型的消息
        image_sub = nh.subscribe("/camera/image", 10, &ImageServer::imageCallback, this);

        // 设置WebSocket事件处理函数
        wss.init_asio();
        wss.set_message_handler(bind(&ImageServer::on_message, this, ::_1, ::_2));
    }

    void imageCallback(const sensor_msgs::ImageConstPtr& msg) {
        // 将接收到的Image消息转换为适合WebSocket传输的格式
        std::string image_data(reinterpret_cast<const char*>(&msg->data[0]), msg->data.size());

        // 向所有WebSocket客户端广播图像数据
        for (auto it : connections) {
            wss.send(it, image_data, websocketpp::frame::opcode::binary);
        }
    }

    void on_message(websocketpp::connection_hdl hdl, message_ptr msg) {
        // ... 处理来自客户端的消息(如果需要)
    }

    void run(int port) {
        // 监听指定端口
        wss.listen(port);
        // 开始WebSocket事件循环
        wss.start_accept();
        wss.run();
    }

    void add_connection(websocketpp::connection_hdl hdl) {
        connections.insert(hdl);
    }

    void remove_connection(websocketpp::connection_hdl hdl) {
        connections.erase(hdl);
    }

private:
    server wss;
    ros::Subscriber image_sub;
    std::set<websocketpp::connection_hdl,std::owner_less<websocketpp::connection_hdl>> connections;
};

int main(int argc, char** argv) {
    // 初始化ROS节点
    ros::init(argc, argv, "image_server");
    // 创建ImageServer对象
    ImageServer server;

    // 运行WebSocket服务器
    server.run(9002);

    ros::spin();

    return 0;
}
​

在此代码中,imageCallback方法将ROS图像消息逐字节转换为字符串,并通过WebSocket广播给所有连接的客户端。这种做法基于原始比特传输,适用于不需要处理图像编码和解码的场景。

4. 编写Web客户端

创建Web页面,其中包含连接到您的WebSocket服务器的JavaScript代码。用于从ROS WebSocket服务器接收图像数据的JavaScript客户端代码片段如下:

var ws = new WebSocket("ws://localhost:9002/");
ws.binaryType = 'arraybuffer';  // 以二进制形式接收数据

ws.onmessage = function(event) {
    var blob = new Blob([event.data], {type: "image/jpeg"});
    var url = URL.createObjectURL(blob);
    document.getElementById("ros-image").src = url;
};

ws.onopen = function(event) {
    console.log("Connected to WebSocket server.");
};

ws.onerror = function(error) {
    console.log("WebSocket Error: ", error);
};
​

在此代码中,WebSocket客户端监听服务器发送的数据,并将接收到的数据作为Blob对象创建一个URL,然后将这个URL设置为HTML图片元素的源,以便显示图像。

5. 编译和运行

编译新的ROS包和您的WebSocket服务器代码:

cd ~/websocket_ws
catkin_make
​

启动ROS节点:

rosrun websocket_communication image_server
​

在Web浏览器中打开包含上述JavaScript代码的HTML文件,您应该能够看到通过WebSocket从ROS接收的图像。

6. 性能优化

由于直接传输未压缩的图像数据可能导致带宽使用率较高,您可能需要在发送之前对图像进行压缩(例如,将其转换成JPEG或PNG格式)。为此,可以使用 cv_bridgeopencv库对图像进行编码,然后再发送。

注意:

WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
ROS入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
目录
相关文章
|
2月前
|
存储 消息中间件 NoSQL
体育赛事直播系统中基于 WebSocket 实现的聊天室与弹幕模块设计与实践
本文详解东莞梦幻网络科技体育直播系统中「聊天室+弹幕」模块的实时通信技术实现,涵盖 WebSocket 架构、连接池管理、多房间逻辑、消息转发与并发控制等核心要点,助力构建高并发、低延迟的直播互动体验。
|
监控 前端开发 API
实战指南:使用Python Flask与WebSocket实现高效的前后端分离实时系统
【7月更文挑战第18天】构建实时Web应用,如聊天室,可借助Python的Flask和WebSocket。安装Flask及Flask-SocketIO库,创建Flask应用,处理WebSocket事件。前端模板通过Socket.IO库连接服务器,发送和接收消息。运行应用,实现实时通信。此示例展现了Flask结合WebSocket实现前后端实时交互的能力。
1236 3
|
监控 JavaScript API
局域网监控软件的实时通知系统:利用Node.js和WebSocket实现即时消息推送
本文介绍了如何使用Node.js和WebSocket构建局域网监控软件的实时通知系统。实时通知对于网络安全和家庭监控至关重要,能即时发送监控数据变化的通知,提高响应速度。通过Node.js创建WebSocket服务器,当数据变化时,监控软件发送消息至服务器,服务器随即推送给客户端。此外,还展示了如何利用Node.js编写API,自动将监控数据提交到网站,便于用户查看历史记录,从而提升监控体验。
393 3
|
10月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
469 1
|
存储 监控 BI
HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService
医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等,为医院管理提供更有力的保障。 HIS系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各部门管理人员提供全面、准确的各种数据。 门诊医生工作站采用下拉式汉化菜单,界面友好,实用性强,设有与门诊挂号收费系统、医技科室信息系统、住院结算信息系统的软件接口。
478 1
|
存储 网络协议 JavaScript
浅谈WebSocket及如何搭建实时聊天系统
WebSocket 是一种在客户端和服务器之间提供全双工、双向通信的网络协议。它是基于TCP/IP协议栈的应用层协议,旨在实现浏览器与服务器之间的实时、低延迟且高效的长连接通信
795 1
|
网络协议 BI
直播系统源码协议探索篇(二):网络套接字协议WebSocket
直播系统源码网络套接字协议WebSocket搭建参考代码 connected_clients.add(websocket) try: async for message in websocket: await broadcast(message) finally: connected_clients.remove(websocket)
直播系统源码协议探索篇(二):网络套接字协议WebSocket
|
传感器 监控 测试技术
森林火灾预警系统 毕业设计 websocket+JAVA+Vue+SpringBoot+MySQL
森林火灾预警系统 毕业设计 websocket+JAVA+Vue+SpringBoot+MySQL
310 0
|
Linux PHP Windows
|
数据可视化 前端开发 数据挖掘
电子信息毕业设计VUE+websocket+Echart+服务器的智能农业管理系统
对于我们的传统农业生产方式,对于农田的参数检测、病虫害预警、远程管控等的实时效果能力达不到,对于现在的农作物而言,我们知道,农作物最重要的生长标准环境就是农地里的光照、温湿度、病虫害等等的因素,但是我们现在的传统生产方式是远远达不到要求的
电子信息毕业设计VUE+websocket+Echart+服务器的智能农业管理系统