ALOHA多相机Realsense配置以及数据采集

简介

在诸多模仿学习的工作中,均使用到多个Realsense相机作为数据输入端。本文探讨多个Realsense的ros节点启动。

环境配置

librealsense
realsense_ros#python
h5py
opencv-python

多相机启动

ALOHA工程仅需要彩色图像进行输入。因此需要只保留彩色图像,当要求帧率为50Hz时,需要将相机的频率调整至60Hz,然后每6帧丢弃一帧。在${realsense_ws}/realsense_camera/launch/includes文件夹下,创建一个专用的配置文件d405_30fps.xml

  <!--将无关传感器关闭以节省带宽--><arg name="enable_fisheye"      default="false"/><arg name="enable_fisheye1"     default="false"/><arg name="enable_fisheye2"     default="false"/><arg name="enable_depth"        default="false"/><arg name="enable_confidence"   default="false"/><arg name="enable_infra"        default="false"/><arg name="enable_infra1"       default="false"/><arg name="enable_infra2"       default="false"/><arg name="infra_rgb"           default="false"/><arg name="enable_gyro"         default="false"/><arg name="enable_accel"        default="false"/><arg name="enable_pose"         default="false"/><arg name="color_width"         default="640"/><arg name="color_height"        default="480"/><arg name="enable_color"        default="true"/><arg name="color_fps"           default="30"/>

然后创建多相机启动launch文件。创建launch/aloha_30.launch。本文采用和ALOHA同样的3个D405硬件配置。建议绑定相机序列号,这样可以防止相机顺序接反。序列号在相机机身以及realsense-viewer中均可查到。

<launch><arg name="serial_no_left"    			default="130xxxxxxxxx"/> 			<!-- Note: Replace with actual serial number --><arg name="serial_no_right"    			default="230xxxxxxxxx"/> 			<!-- Note: Replace with actual serial number --><arg name="serial_no_main"    			default="130xxxxxxxxx"/> 			<!-- Note: Replace with actual serial number --><arg name="left"              			default="left"/>		<!-- Note: Replace with camera name --><arg name="right"              			default="right"/>		<!-- Note: Replace with camera name --><arg name="main"              			default="main"/>		<!-- Note: Replace with camera name --><arg name="tf_prefix_left"         default="$(arg left)"/><arg name="tf_prefix_right"        default="$(arg right)"/><arg name="tf_prefix_main"         default="$(arg main)"/><arg name="initial_reset"             default="false"/><group ns="$(arg left)"><include file="$(find realsense2_camera)/launch/includes/d405_30fps.xml"><arg name="serial_no"             value="$(arg serial_no_left)"/><arg name="tf_prefix"         		value="$(arg tf_prefix_left)"/><arg name="initial_reset"         value="$(arg initial_reset)"/></include></group><group ns="$(arg right)"><include file="$(find realsense2_camera)/launch/includes/d405_30fps.xml"><arg name="serial_no"             value="$(arg serial_no_right)"/><arg name="tf_prefix"		          value="$(arg tf_prefix_right)"/><arg name="initial_reset"         value="$(arg initial_reset)"/></include></group><group ns="$(arg main)" if="$(eval serial_no_main != '')"><include file="$(find realsense2_camera)/launch/includes/d405_30fps.xml"><arg name="serial_no"             value="$(arg serial_no_main)"/><arg name="tf_prefix"		          value="$(arg tf_prefix_main)"/><arg name="initial_reset"         value="$(arg initial_reset)"/></include></group></launch>

此时运行ros节点,保证3个相机供电、带宽正常的情况下,可以在rviz中看到3个相机的画面。

数据采集

ALOHA需要将图像抓取后,存入hdf5文件。实现上,采用ROS同步多个topic,图像抓取后,存入hdf5。代码如下

#!/usr/bin/env python
import message_filters
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
from message_filters import ApproximateTimeSynchronizer
import h5py
import signal
import numpy as npimport argparse
from datetime import datetimeout_name = datetime.now().strftime('%Y-%m-%d-%H_%M_%S')+".hdf5"
print("Saving file " + out_name)parser = argparse.ArgumentParser(description='h5saver')
parser.add_argument('--save', type=str, default=out_name, help='')
args = parser.parse_args()bridge = CvBridge()
cv_image1 = Nonehf = h5py.File(args.save, "w")topic_1 = "/left/color/image_raw"
topic_2 = "/right/color/image_raw"
topic_3 = "/top/color/image_raw"topic_left  = "observations/images/left_wrist"
topic_right = "observations/images/right_wrist"
topic_top  = "observations/images/top"img_arrayl = []
img_arrayr = []
img_arrayt = []def signal_handler(signal, frame):# 处理Ctrl+C信号的逻辑print("捕获到Ctrl+C信号!")dt = h5py.string_dtype(encoding='ascii')print(np.array(img_arrayl).shape)# hf.create_dataset(topic_left , data=np.array(img_arrayl), dtype=dt)# hf.create_dataset(topic_right, data=np.array(img_arrayr), dtype=dt)# hf.create_dataset(topic_top , data=np.array(img_arrayt), dtype=dt)hf[topic_left ] = np.array(img_arrayl)hf[topic_right] = np.array(img_arrayr)hf[topic_top ] = np.array(img_arrayt)print("OK")exit(0)def callback(img1, img2, img3):global cv_image1, bridge, hfcv_image1 = bridge.imgmsg_to_cv2(img1, "bgr8")cv_image2 = bridge.imgmsg_to_cv2(img2, "bgr8")cv_image3 = bridge.imgmsg_to_cv2(img3, "bgr8")if cv_image1 is not None and cv_image2 is not None and cv_image3 is not None :img_arrayl.append(cv_image1)img_arrayr.append(cv_image2)img_arrayt.append(cv_image3)cv2.imshow("Image 1", cv_image1)cv2.imshow("Image 2", cv_image2)cv2.imshow("Image 3", cv_image3)cv2.waitKey(1)if __name__ == '__main__':rospy.init_node('sync_images')topics = [topic_1, topic_2, topic_3]topics_sub1 = message_filters.Subscriber(topic_1, Image) topics_sub2 = message_filters.Subscriber(topic_2, Image)topics_sub3 = message_filters.Subscriber(topic_3, Image)topics_subs = [topics_sub1, topics_sub2, topics_sub3]sync = message_filters.ApproximateTimeSynchronizer(\topics_subs, \2, \0.9)sync.registerCallback(callback)rate = rospy.Rate(60)while not rospy.is_shutdown():signal.signal(signal.SIGINT, signal_handler)rate.sleep()

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

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

相关文章

树与图的一些计数问题(图论学习总结部分内容)

文章目录 前言七、树与图的一些计数问题&#xff08;偏数学&#xff09;容斥原理知识点例题 e g 1 : eg1: eg1: 完全子图染色问题 e g 2 : eg2: eg2: D A G DAG DAG计数 生成树计数知识点例题 环计数问题练习题 前言 由于图论学习总结内容过多&#xff0c;全放在一篇博客过于…

QLineEdit文本长度和框宽度的比较问题

开发环境 操作系统: 银河麒麟V10SP1qt版本 : 5.12.12背景 测试同事提出,QLineEdit中设置的占位符(由setPlaceholderText函数设置)文本能完全显示时不要显示tips,不完全显示时要显示tips,这样显得简洁。 想了想逻辑上比较好实现,那就是占位符文本长度大于QLineEdit宽度就显示…

Python pyqtgraph库:高效可视化数据的利器

更多Python学习内容&#xff1a;ipengtao.com 在数据科学和工程领域&#xff0c;数据可视化是一项非常重要的任务。Python pyqtgraph库是一个功能强大的数据可视化工具&#xff0c;可以帮助用户快速、高效地可视化各种类型的数据&#xff0c;包括实时数据、大数据集和3D数据等。…

PostgreSQL-常用函数和操作符-2

0. WITH 在 PL/pgSQL 中&#xff0c;WITH 子句通常用于创建一个临时结果集&#xff0c;这个结果集在执行 SQL 查询时使用。这个临时结果集通常被称为一个公共表表达式&#xff08;Common Table Expression, CTE&#xff09;。CTE 允许您在查询中引用它&#xff0c;就像引用一个…

Kerberos-梳理

服务端: yuminstall-ykrb5-server vim/var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports=88 kdc_tcp_ports=88 [realms] HADOOP.COM={#master_key_type=aes256-cts acl_file=/var/kerberos/krb5kdc/kadm5.acl dict_file=/usr/share/dict/words admin_keytab=/var/kerbe…

英伟达解码性能NVDEC

如果你能打开官网&#xff0c;请看这里&#xff1a; NVDEC Application Note 下面是摘录&#xff1a;

STL---排序模板参数

map 对map进行排序 首先一定要注意map模板类的第三个模板参数&#xff0c;这个参数决定元素按键值升序或者降序在map中的存储方式&#xff1a; 默认&#xff1a;less<key>升序----- < -----第一个小于取第一个 可设置&#xff1a;greater<key>降序-------…

VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

VC 编程开发中的 封装类 &#xff1a;日志类 和SQL server 操作类 源代码 在VC&#xff08;Visual C&#xff09;开发中&#xff0c;日志文件输出是一个至关重要的环节&#xff0c;它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开…

ASP.NET仪器设备管理系统设计与实现

摘 要 文中以某中小型企业的设备管理为例&#xff0c;对设备管理系统的设计与应用进行研究&#xff0c;旨在通过设备管理系统提高内部设备的利用率及实现其最大的经济效益。文中首先对设备管理的现状及其重要性进行了分析&#xff0c;分析实现设备管理信息系统的必要性与可行…

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库&#xff1f; MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑&#xff0c;然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录&#xff08;这里以D:…

AI学习指南概率论篇-随机变量和随机过程

AI学习指南概率论篇-随机变量和随机过程 随机变量和随机过程是概率论中重要的概念&#xff0c;也是在人工智能领域中经常应用的概念。本文将介绍随机变量和随机过程的概述&#xff0c;它们在AI中的使用场景&#xff0c;定义和意义&#xff0c;以及相关的公式讲解&#xff0c;并…

蓝桥杯备战17.bitset砝码称重

P2347 [NOIP1996 提高组] 砝码称重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) bitset 用来存储二进制 #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int w[] {0,1,2,3,5,10,20}; signed main() {std…

电商选品的数据是可以用爬虫进行采集的吗?

在电子商务领域&#xff0c;选品是一个至关重要的环节&#xff0c;它直接影响到商家的销售业绩和市场竞争力。为了做出更明智的选品决策&#xff0c;商家需要获取大量的市场数据和产品信息。那么&#xff0c;电商选品的数据是否可以通过爬虫进行采集呢&#xff1f; 爬虫在电商数…

更适合户外使用的开放式耳机,佩戴舒适音质悦耳,虹觅HOLME NEO体验

随着气温的逐渐升高&#xff0c;不管是在室内工作娱乐&#xff0c;还是到户外运动健身&#xff0c;戴上一款合适的耳机都会帮我们隔绝燥热与烦闷&#xff0c;享受音乐与生活。现在市面上的耳机类型特别多&#xff0c;我很喜欢那种分体式的开放耳机&#xff0c;感觉这种耳机设计…

亚信安慧AntDB:颠覆传统的开放创新数据库生态

亚信安慧AntDB是亚信科技自主研发的一款颠覆传统的开放创新数据库产品。它引入了分布式架构&#xff0c;通过数据的弹性伸缩、 容灾容错和负载均衡等技术手段&#xff0c;实现了高性能、高可靠性和高可扩展性的数据存储和处理能力。不仅如此&#xff0c;亚信安慧 AntDB还具备…

从头开始学Spring—02基于XML管理bean

目录 1.实验一&#xff1a;入门案例 2.实验二&#xff1a;获取bean 3.实验三&#xff1a;依赖注入之setter注入 4.实验四&#xff1a;依赖注入之构造器注入 5.实验五&#xff1a;特殊值处理 6.实验六&#xff1a;为类类型属性赋值 7.实验七&#xff1a;为数组类型属性赋值…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子&#xff1a; 评价类问题可用打分解决&#xff0c;比如&#xff1a;小华高考结束后&#xff0c;在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 &#xff08;一&#xff09;一道引出层次分析法的例…

如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者&#xff1a;来自 Elastic Musab Dogan 概述 Elasticsearch 提供两种类型的索引模板&#xff1a;旧&#xff08;legacy&#xff09;索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板&#xff0c;两者仍然可以在 Elasticsear…

深入理解MVCC与Read View:并发控制的关键要素

MVCC MVCC的几个问题1.update、insert、select和delete如何在MVCC中维护版本链&#xff1f;2.select读取&#xff0c;是读取最新的版本呢&#xff1f;还是读取历史版本&#xff1f;3.当前读和快照读4.那为什么要有隔离级别呢&#xff1f;5.如何保证&#xff0c;不同的事务&…

【go从入门到精通】golang单元测试

单元测试 随着软件开发变得越来越复杂,确保服务按预期运行至关重要。实现这一目标的方法之一是通过测试。在Go中,我们可以进行单元测试和集成测试,以确保我们的代码正确并满足要求。单元测试的最终目标是断言一小部分逻辑“单元”的行为符合预期。我们通过在测试中调用该函数…