读取realsense d455双目及imu
问题定义
实时读取realsense数据喂给slam系统
代码
/**
rs_d455设备
*/#include <librealsense2/rs.hpp>
#include <iostream>#include "rs_common_device.h"// opencv
#include <opencv2/opencv.hpp>class RsD455Device: public rsCmmonDevice {public:using Ptr = std::shared_ptr<RsD455Device>;static constexpr int IMU_RATE = 200;static constexpr int NUM_CAMS = 2; // 相机数量int frame_num = 0;int imu_num = 0;RsD455Device(bool manual_exposure, int skip_frames, int webp_quality, double exposure_value = 10.0);// 开启设备void start();// 关闭设备void stop();// 设置曝光bool setExposure(double exposure); // in milliseconds// 设置跳过的framesvoid setSkipFrames(int skip);void setWebpQuality(int quality);private:// realsense的一些配置rs2::context context;rs2::config config;rs2::pipeline pipe;rs2::sensor sensor;rs2::pipeline_profile profile;
};std::string get_date();RsD455Device::RsD455Device(bool manual_exposure, int skip_frames,int webp_quality, double exposure_value):rsCmmonDevice("rsD455"){ std::cout << "open realsense d455" << std::endl;rsCmmonDevice::manual_exposure = manual_exposure;rsCmmonDevice::skip_frames = skip_frames;rsCmmonDevice::webp_quality = webp_quality;rs2::log_to_console(RS2_LOG_SEVERITY_ERROR);pipe = rs2::pipeline(context);config.enable_stream(RS2_STREAM_ACCEL, RS2_FORMAT_MOTION_XYZ32F);// 使能加速度config.enable_stream(RS2_STREAM_GYRO, RS2_FORMAT_MOTION_XYZ32F); // 使能角速度config.enable_stream(RS2_STREAM_INFRARED, 1, 640, 480, RS2_FORMAT_Y8, 30);// left IRconfig.enable_stream(RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 30);// right IR// config.disable_stream(RS2_STREAM_DEPTH);if (context.query_devices().size() == 0) {std::cout << "Waiting for device to be connected" << std::endl;rs2::device_hub hub(context);hub.wait_for_device();}for (auto& s : context.query_devices()[0].query_sensors()) {std::cout << "Sensor " << s.get_info(RS2_CAMERA_INFO_NAME)<< ". Supported options:" << std::endl;for (const auto& o : s.get_supported_options()) {std::cout << "\t" << rs2_option_to_string(o) << std::endl;}}auto device = context.query_devices()[0];std::cout << "Device " << device.get_info(RS2_CAMERA_INFO_NAME) << " connected" << std::endl;sensor = device.query_sensors()[0];if (manual_exposure) {std::cout << "Enabling manual exposure control" << std::endl;sensor.set_option(rs2_option::RS2_OPTION_ENABLE_AUTO_EXPOSURE, 0);sensor.set_option(rs2_option::RS2_OPTION_EXPOSURE, exposure_value * 1000);}// std::cout << "finish open camera" << std::endl;
}void RsD455Device::start() {auto callback = [&](const rs2::frame& frame) {if (auto fp = frame.as<rs2::motion_frame>()) {auto motion = frame.as<rs2::motion_frame>();if (motion && motion.get_profile().stream_type() == RS2_STREAM_GYRO &&motion.get_profile().format() == RS2_FORMAT_MOTION_XYZ32F) {imu_num += 1;} else if (motion &&motion.get_profile().stream_type() == RS2_STREAM_ACCEL &&motion.get_profile().format() == RS2_FORMAT_MOTION_XYZ32F) {}} else if (auto fs = frame.as<rs2::frameset>()) {std::vector<rs2::video_frame> vfs;for (int i = 0; i < NUM_CAMS; ++i) {rs2::video_frame vf = fs[i].as<rs2::video_frame>();if (!vf) {std::cout << "Weird Frame, skipping" << std::endl;return;}vfs.push_back(vf);}for (int i = 1; i < NUM_CAMS; ++i) {if (vfs[0].get_timestamp() != vfs[i].get_timestamp()) {return;}}if (frame_counter++ % skip_frames != 0) {return;}// 读取N个图像的数据for (int i = 0; i < NUM_CAMS; i++) {const auto& vf = vfs[i];int64_t t_ns = vf.get_timestamp() * 1e6;cv::Mat img = cv::Mat(cv::Size(640, 480), CV_8UC1, (void*)vfs[i].get_data());cv::imshow("img_"+std::to_string(i), img);}// 读取ircv::waitKey(1);std::cout << "frame num = " << frame_num << " imu_num = " << imu_num << std::endl;frame_num += 1;}return;};profile = pipe.start(config, callback);
}void RsD455Device::stop() {std::cout << "stop d455" << std::endl;
}// 设置手动曝光参数
bool RsD455Device::setExposure(double exposure) {if (!manual_exposure) return false;sensor.set_option(rs2_option::RS2_OPTION_EXPOSURE, exposure * 1000);return true;
}
// 设置跳过的帧数
void RsD455Device::setSkipFrames(int skip) { skip_frames = skip; }void RsD455Device::setWebpQuality(int quality) { webp_quality = quality; }int main(void){// realsense 设备RsD455Device d455_device(false, 1, 90, 10.0);// 开启设备和加载标定参数d455_device.start();// 开启相机while(1);return 0;
}
连接
开源链接
相关文章:
读取realsense d455双目及imu
问题定义 实时读取realsense数据喂给slam系统 代码 /** rs_d455设备 */#include <librealsense2/rs.hpp> #include <iostream>#include "rs_common_device.h"// opencv #include <opencv2/opencv.hpp>class RsD455Device: public rsCmmonDevice…...
浮点的运算
浮点数表示: N 尾数 * 基数指数 1.25 X 106 尾数一般用补码,指数一般用移码 在IEEE745中尾数可以是原码。 尾数可以表示数值的有效精度,位数越多精度越高 阶码的位数决定数的表示范围,位数越多,范围越大 对阶时&…...
对随机游走问题的分析特定行为模式的建模
从一段随机游走的数据中寻找特定的行为模式,这种问题涉及 序列模式识别 或 序列分析。处理这种问题的算法选择取决于你要找的模式的具体性质和复杂性。以下是几种可能的算法: 隐马尔可夫模型(HMM) 隐马尔可夫模型特别适合处理随…...
JVM面试(七)G1垃圾收集器剖析
概述 上一章我们说了,G1收集器,它属于里程碑式的发展,开创了面向局部收集垃圾的概念。专门针对多核处理器以及大内存的机器。在JDK9中,更是呗指定为官方的GC收集器。满足高吞吐的通知满足GC的STW停顿时间尽可能的短。 虽然现在我…...
php转职golang第一期
入局golang 基础语法:学习 Go 语言的基本语法、数据类型、流程控制等。 数据结构与算法:掌握常用的数据结构和算法。 Web 开发基础:了解 HTTP 协议、Web 开发的基本概念。 Gin 框架或其他 Web 框架:深入学习使用一种 Go 的 Web…...
java后端服务监控与告警:Prometheus与Grafana集成
Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Pr…...
【系统架构设计师】工厂方法设计模式
工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类中进行。 工厂方法模式的主要角色 产品(Product):定义工厂的创建对象的接口。具体产品(Concrete Product):实…...
怎样解决OpenEuler下载sdl2失败
OpenEuler 下载 sdl2失败 解决办法(使用wget中git上下载) wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.6/SDL2-2.30.6.tar.gz使用yum下载,下载的最后说找不到这样的库(no match)使用 apt-get,说找不到apt-get使用curl冲gi…...
基于Python的自然语言处理系列(2):Word2Vec(负采样)
在本系列的第二篇文章中,我们将继续探讨Word2Vec模型,这次重点介绍负采样(Negative Sampling)技术。负采样是一种优化Skip-gram模型训练效率的技术,它能在大规模语料库中显著减少计算复杂度。接下来,我们将…...
每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟
每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五…...
大数据之Flink(六)
17、Flink CEP 17.1、概念 17.1.1、CEP CEP是“复杂事件处理(Complex Event Processing)”的缩写;而 Flink CEP,就是 Flink 实现的一个用于复杂事件处理的库(library)。 总结起来,复杂事件处…...
设计模式学习[5]---装饰模式
文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时,基于原有的设计类图进行讨论。其中涉及到了装饰模式,因为书本很早已经看过一遍,所以谈及到这个名词的时候…...
3.C_数据结构_栈
概述 什么是栈: 栈又称堆栈,是限定在一段进行插入和删除操作的线性表。具有后进先出(LIFO)的特点。 相关名词: 栈顶:允许操作的一端栈底:不允许操作的一端空栈:没有元素的栈 栈的作用: 可…...
Debian11安装DolphinScheduler
安装地址 前置准备工作 JDK安装 下载JDK (1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在,可以跳过这步 二进制包安装DolphinScheduler 依赖 apt-get install psmisc 二进制安…...
C语言深度剖析--不定期更新的第五弹
const关键字 来看一段代码: #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下: 接下来我们在上面的代码做小小的修改: #include <stdio.h> int main() {const int a 1…...
python之事务
事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,用于确保一组数据库操作要么全部成功,要么全部失败,从而保证数据的一致性和完整性。 事务ACID 特性 事务具有以下四个特性…...
文件加密软件都有哪些?推荐6款文件加密工具
不久前,一家知名科技公司的内部文件在未经授权的情况下被泄露到了网络上,其中包括了公司的核心技术蓝图、客户名单及未来战略规划。这一事件不仅给公司带来了巨大的经济损失,还严重损害了企业的声誉。 如何防止以上事件的发生呢,文…...
Docker中的容器内部无法使用vi命令怎么办?
不知道你是否遇到过,在修改容器内部的配置的时候,有时候会提示vi命令不可用。尝试去安装vi插件,好像也不是很容易,有什么办法可以帮助我们修改这个配置文件呢? 解决办法 这时候,我们就需要用到docker cp 命令了,它可以帮助我们把容器内部的文件复制到宿主机上,也可以将…...
【Linux系统编程】TCP实现--socket
使用套接字socket实现服务器和客户端之间的TCP通信。 流程如下: 实现代码: /* server.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <s…...
企业微信hook协议接口,聚合群聊客户管理工具开发
服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
