当前位置: 首页 > news >正文

rviz是如何获取图像里选择的点云的3D坐标的

以前以为rviz是用OpenGL渲染绘图,那么获取图像里像素点对应的真实3D坐标是采用的OpenGL里提供的API实现的,结果一看代码还真不是这样,rviz也就渲染用了OpenGL,其他都是自己实现的,图像界面的实现完全是遵循MVC设计模式自己实现的透视投影和坐标转换等所有相关类。获取点云图像里所选择的点云点的3D坐标相关的代码是这里:

src/rviz/selection/selection_manager.cpp:bool SelectionManager::getPatchDepthImage(Ogre::Viewport* viewport,int x,int y,unsigned width,unsigned height,std::vector<float>& depth_vector)
{unsigned int num_pixels = width * height;depth_vector.reserve(num_pixels);setDepthTextureSize(width, height);M_CollisionObjectToSelectionHandler::iterator handler_it = objects_.begin();M_CollisionObjectToSelectionHandler::iterator handler_end = objects_.end();for (; handler_it != handler_end; ++handler_it){handler_it->second->preRenderPass(0);}if (render(viewport, depth_render_texture_, x, y, x + width, y + height, depth_pixel_box_, "Depth",depth_texture_width_, depth_texture_height_)){uint8_t* data_ptr = (uint8_t*)depth_pixel_box_.data;for (uint32_t pixel = 0; pixel < num_pixels; ++pixel){uint8_t a = data_ptr[4 * pixel];uint8_t b = data_ptr[4 * pixel + 1];uint8_t c = data_ptr[4 * pixel + 2];int int_depth = (c << 16) | (b << 8) | a;float normalized_depth = ((float)int_depth) / (float)0xffffff;depth_vector.push_back(normalized_depth * camera_->getFarClipDistance());}}else{ROS_WARN("Failed to render depth patch\n");return false;}handler_it = objects_.begin();handler_end = objects_.end();for (; handler_it != handler_end; ++handler_it){handler_it->second->postRenderPass(0);}return true;
}bool SelectionManager::get3DPatch(Ogre::Viewport* viewport,int x,int y,unsigned width,unsigned height,bool skip_missing,std::vector<Ogre::Vector3>& result_points)
{boost::recursive_mutex::scoped_lock lock(global_mutex_);ROS_DEBUG("SelectionManager.get3DPatch()");std::vector<float> depth_vector;if (!getPatchDepthImage(viewport, x, y, width, height, depth_vector))return false;unsigned int pixel_counter = 0;Ogre::Matrix4 projection = camera_->getProjectionMatrix();float depth;for (unsigned y_iter = 0; y_iter < height; ++y_iter)for (unsigned x_iter = 0; x_iter < width; ++x_iter){depth = depth_vector[pixel_counter];// Deal with missing or invalid pointsif ((depth > camera_->getFarClipDistance()) || (depth == 0)){++pixel_counter;if (!skip_missing){result_points.push_back(Ogre::Vector3(NAN, NAN, NAN));}continue;}Ogre::Vector3 result_point;// We want to shoot rays through the center of pixels, not the corners,// so add .5 pixels to the x and y coordinate to get to the center// instead of the top left of the pixel.Ogre::Real screenx = float(x_iter + .5) / float(width);Ogre::Real screeny = float(y_iter + .5) / float(height);if (projection[3][3] == 0.0) // If this is a perspective projection{// get world-space ray from camera & mouse coordOgre::Ray vp_ray = camera_->getCameraToViewportRay(screenx, screeny);// transform ray direction back into camera coordsOgre::Vector3 dir_cam = camera_->getDerivedOrientation().Inverse() * vp_ray.getDirection();// normalize, so dir_cam.z == -depthdir_cam = dir_cam / dir_cam.z * depth * -1;// compute 3d point from camera origin and direction*/result_point = camera_->getDerivedPosition() + camera_->getDerivedOrientation() * dir_cam;}else // else this must be an orthographic projection.{// For orthographic projection, getCameraToViewportRay() does// the right thing for us, and the above math does not work.Ogre::Ray ray;camera_->getCameraToViewportRay(screenx, screeny, &ray);result_point = ray.getPoint(depth);}result_points.push_back(result_point);++pixel_counter;}return !result_points.empty();
}bool SelectionManager::get3DPoint(Ogre::Viewport* viewport, int x, int y, Ogre::Vector3& result_point)
{ROS_DEBUG("SelectionManager.get3DPoint()");std::vector<Ogre::Vector3> result_points_temp;bool success = get3DPatch(viewport, x, y, 1, 1, true, result_points_temp);if (result_points_temp.empty()){// return result_point unmodified if get point fails.return false;}result_point = result_points_temp[0];return success;
}

世界3D坐标是用的射线法计算出来。SelectionManager::get3DPoint()被rviz里多个地方调用,凡是UI界面上需要查看点的坐标地方都是调用它。

相关文章:

rviz是如何获取图像里选择的点云的3D坐标的

以前以为rviz是用OpenGL渲染绘图&#xff0c;那么获取图像里像素点对应的真实3D坐标是采用的OpenGL里提供的API实现的&#xff0c;结果一看代码还真不是这样&#xff0c;rviz也就渲染用了OpenGL&#xff0c;其他都是自己实现的&#xff0c;图像界面的实现完全是遵循MVC设计模式…...

响应体和状态码

后端响应体和状态码设计 主流技术&#xff1a;响应体 和 状态码结合使用 响应体&#xff1a;数据 响应 给前端的 格式 1、为什么要设计统一响应体? 1、系统默认提供许多的状态码&#xff0c;但HTTP的状态码数量有限。 通过修改响应返回的JSON数据&#xff0c;更好的表达业务中…...

CNN进展:AlexNet、VGGNet、ResNet 和 Inception

一、说明 对于初学者来说&#xff0c;神经网络进展的历程有无概念&#xff1f;该文综合叙述了深度神经网络的革命性突破&#xff0c;从AlexNet开始&#xff0c;然后深度VGG的改进&#xff0c;然后是残差网络ResNet和 Inception&#xff0c;如果能讲出各种特色改进点的和改进理由…...

数据的存储--MongoDB文档存储

MongoDB文档存储 NoSQL&#xff0c;全称为Not Only SQL&#xff0c;意为不仅仅是SQL&#xff0c;泛指非关系型数据库。NoSQL是基于键值对的&#xff0c;而且不需要经过SQL层的解析&#xff0c;数据之间没有耦合性&#xff0c;性能非常高。 非关系行数据库又可细分如下。 键值存…...

Notepad++ 通过HexEditor插件查看.hprof文件、heap dump文件的堆转储数据

文章目录 需求场景插件安装查看notepad的版本&#xff0c;看看是32位的还是64位的下载对应的版本解压导入插件打开notepad插件文件夹&#xff1a;Notepad安装目录新建一个HexEditor文件夹选中插件文件导入 重启notepad使用 需求场景 想要查看app内存的某个域的数据。 利用Andr…...

微服务学习 | Eureka注册中心

微服务远程调用 在order-service的OrderApplication中注册RestTemplate 在查询订单信息时&#xff0c;需要同时返回订单用户的信息&#xff0c;但是由于微服务的关系&#xff0c;用户信息需要在用户的微服务中去查询&#xff0c;故需要用到上面的RestTemplate来让订单的这个微…...

spring boot集成quartz

目录 1.定时任务实现 2.quartz说明 3.存储方式 4.示例 5.定时任务的重新定制&#xff0c;恢复&#xff0c;暂停及删除 1.定时任务实现 定时任务的实现方式有很多&#xff0c;如下&#xff1a; 1.启动类中添加EnableScheduling&#xff0c;开启定时任务功能&#xff0c;然…...

[Linux] yum仓库相关

一、yum仓库 1.1 yum简介 yum 是一种基于 RPM 软件包&#xff08;Red-Hat Package Manager 的缩写&#xff09;的软件更新机制&#xff0c;可自动解决软件包之间的依赖关系。这就解决了日常工作中花费大量时间寻找安装包的问题。 为什么会出现依赖 linux 本身就有简化系统的优…...

2023.11.15-hivesql之炸裂函数explode练习

把一个容器的多个数据炸裂出单独展示: explode(容器) 需求:将NBA总冠军球队数据使用explode进行拆分&#xff0c;并且根据夺冠年份进行倒序排序。 1.建表 --step1:建表 create table the_nba_championship(team_name string,champion_year array<string> ) row format…...

Linux - 内核 - 安全机制 - 内存页表安全

说明 内核页表安全的最终目标是&#xff1a;将内核使用到的内存页&#xff08;内核与module占用&#xff09;的属性&#xff08;读/写/可执行&#xff09;配置成安全的&#xff0c;即&#xff1a;代码段和rodata段只读&#xff0c;非代码段不能执行等&#xff0c;用来防御堆栈…...

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入&#x1f397;️下面的代码什么现象&#xff1f;&#x1f397;️下面的代码什么现象&#xff1f; 二、缓冲区三、回车换行&#x1f397;️注意&#x1f397;️图解&#x1f397;️老式回车键造型&#xff08;意思是充当两个动作&#xff09;&#x1f397;…...

数据库分页查询

数据库只所以要分页查询&#xff0c;其实是界面显示的需要&#xff0c;不是数据库的需要。 数据库本身查询是很快的。本文章是针对这种情况的。 如果数据库本身查询慢&#xff0c;那是优化查询语句的事情了。不在本文章范围内。 今天遇到了这个问题。 是个老项目。在原有的查询…...

如何选择合适的数据库管理工具?Navicat Or DBeaver

写在前面 在阅读本文之前&#xff0c;糖糖给大家准备了Navicat和DBeaver安装包&#xff0c;在公众号内回复“Navicat”或“DBeaver”或"数据库管理工具"来下载。 引言 对于测试而言&#xff0c;在实际工作中往往会用到数据库&#xff0c;那么选择使用哪种类型的数…...

Opencv!!在树莓派上安装Opencv!

一、更新树莓派系统 sudo apt-get update sudo apt-get upgrade二、安装python-opencv sudo apt-get install libopencv-dev sudo apt-get install python3-opencv三、查看是否安装成功 按以下命令顺序执行&#xff1a; python import cv2 cv2.__version__如果出现版本号&a…...

三菱FX3U小项目—传输带定分级控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 两条运输带顺序相连&#xff0c;为了避免运送的物料在1号运输线上堆积&#xff0c;所以启动时&#xff0c;1号运输带开始运行&#xff0c;5S后2号运输带自动启动。停机时顺序与启动刚好相反&#xff0c…...

实例解释遇到前端报错时如何排查问题

前端页面报错&#xff1a; 1、页面报错500&#xff0c;首先我们可以知道是服务端的问题&#xff0c;需要去看下服务端的报错信息&#xff1a; 2、首先我们查看下前端是否给后端传了id: 我们可以看到接口是把ID返回了&#xff0c;就需要再看下p_id是什么情况了。 3、我们再次请…...

微电影分销付费短剧小程序开发

微电影系统分销管理付费软件是一款面向微电影制作公司和影视产业的付费软件&#xff0c;它的出现旨在帮助微电影制作公司和影视产业实现分销管理&#xff0c;提高产业的效率和竞争力。本文将介绍微电影系统分销管理付费软件的背景、特点和开发方法。 一、背景 微电影作…...

时间序列预测中的4大类8种异常值检测方法(从根源上提高预测精度)

一、本文介绍 本文给大家带来的是时间序列预测中异常值检测&#xff0c;在我们的数据当中有一些异常值&#xff08;Outliers&#xff09;是指在数据集中与其他数据点显著不同的数据点。它们可能是一些极端值&#xff0c;与数据集中的大多数数据呈现明显的差异。异常值可能由于…...

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…...

02-2解析JsonPath

一、jsonpath的安装及使用方式 pip安装 pip install jsonpathjsonpath的使用 obj json.load(open(json文件, r, encodingutf‐8)) ret jsonpath.jsonpath(obj, jsonpath语法)可以参考以下这篇博客进行jsonpath的简单入门JSONPath-简单入门...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...