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

简介: 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

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

include

include

include

include

typedef websocketpp::server 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> 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广播给所有连接的客户端。这种做法基于原始比特传输,适用于不需要处理图像编码和解码的场景。

  1. 编写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图片元素的源,以便显示图像。

  1. 编译和运行
    编译新的ROS包和您的WebSocket服务器代码:

cd ~/websocket_ws
catkin_make

启动ROS节点:

rosrun websocket_communication image_server

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

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

注意:
WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发

目录
相关文章
|
8天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
296 164
|
2天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
304 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
820 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
235 113