【发布时间】:2021-09-14 07:05:08
【问题描述】:
如何在浏览器中解码 rosbridge 数据?
到目前为止,我已经能够解码以下类型:
- 未压缩的原始 RGB
- 未压缩的原始深度
- JPEG 压缩 RGB
我现在的问题是解码压缩深度和 PointCloud2 数据。据我了解,数据被编码为base64。深度图像已被压缩为 mono16 PNG。我尝试了许多不同的方法,但似乎都没有奏效。深度图像应该包含 307200 个深度值,每个 16 位。
我不想以 ros3djs 或 webviz 之类的方式显示这些数据(云不知道它们是如何进行解码的)。我想解码数据并在我自己的分析中使用它。
重现步骤:
这是一个示例文件。它包含 JSON 消息的数据字段:https://drive.google.com/file/d/18ZPpWrH9TKtPBbevfGdceZVpmmkiP4bh/view?usp=sharing
或
- 确保您有一个正在发布的设备或正在播放的 rosbag
- roslaunch rosbridge_server rosbridge_websocket.launch
- 启动您的网页并确保您在脚本标签中添加了 roslibjs
我网页的JS简化成这样:
var ros = new ROSLIB.Ros({
url: 'ws://127.0.0.1:9090'
});
var depthListener = new ROSLIB.Topic({
ros: ros,
name: '/camera/color/image_raw/compressedDepth',
messageType: 'sensor_msgs/CompressedImage'
});
var pointCloudListener = new ROSLIB.Topic({
ros: ros,
name: '/camera/depth/color/points',
messageType: 'sensor_msgs/PointCloud2'
});
depthListener.subscribe(function (message) {
console.log(message);
depthListener.unsubscribe();
});
pointCloudListener.subscribe(function (message) {
console.log(message);
pointCloudListener.unsubscribe();
});
我已将两个主题设置为在第一条消息后取消订阅,这样我的控制台就会被淹没。
提供了深度图像的控制台日志截图
对于点云
这是我目前所拥有的,但从未触发过 onload 功能。
image = new Image();
image.src = "data:image/png;base64, " + message.data
image.onload = function(){
image.decode().then(() =>{
if(image.width != 0 && image.height != 0){
canvas.width = image.width;
canvas.height = image.height;
ctx = canvas.getContext('2d');
ctx.drawImage(image, 0, 0);
image_data = canvas.getContext('2d').getImageData(0,0, 640,480).data;
}
});
}
我认为this opencv 代码用于压缩图像。 该消息本质上可以被认为是一个 16 位灰度图像。
如果我可以用具体信息更新问题,请发表评论
感谢您
【问题讨论】:
标签: javascript ros