halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
目录
- 一、gen_robot_tool_and_base_object_model_3d 函数调用
- 二、gen_arrow_object_model_3d 函数调用
首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。
一、gen_robot_tool_and_base_object_model_3d 函数调用
RobotToolSize := 0.03
gen_robot_tool_and_base_object_model_3d (RobotToolSize * 0.05, RobotToolSize, OM3DToolOrigin, OM3DBase)
* This procedure creates 3D models that represent the tool and the base
* of the robot.
*
if (ArrowThickness <= 0)throw ('ArrowThickness should be > 0')
endif
if (ArrowLength <= 0)throw ('ArrowLength should be > 0')
endif
create_pose (0, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', IdentityPose)
*
* 3D model for the tool.
create_pose (ArrowLength, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', TransXPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransXPose, OM3DToolXOrigin)
create_pose (0, ArrowLength, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', TransYPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransYPose, OM3DToolYOrigin)
create_pose (0, 0, ArrowLength, 0, 0, 0, 'Rp+T', 'gba', 'point', TransZPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransZPose, OM3DToolZOrigin)
OM3DToolOrigin := [OM3DToolXOrigin,OM3DToolYOrigin,OM3DToolZOrigin]
*
* 3D model for the base.
FactorVisBase := ArrowThickness * 10
gen_box_object_model_3d (IdentityPose, FactorVisBase * 1.5, FactorVisBase * 1.5, FactorVisBase / 12.0, OM3DBasePlate)
create_pose (ArrowLength, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', TransXPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransXPose, OM3DBaseX)
create_pose (0, ArrowLength, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', TransYPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransYPose, OM3DBaseY)
create_pose (0, 0, ArrowLength, 0, 0, 0, 'Rp+T', 'gba', 'point', TransZPose)
gen_arrow_object_model_3d (ArrowThickness, IdentityPose, TransZPose, OM3DBaseZ)
OM3DBase := [OM3DBaseX,OM3DBaseY,OM3DBaseZ,OM3DBasePlate]
return ()
二、gen_arrow_object_model_3d 函数调用
这个函数绘制一个箭头,从ArrowStart点开始,到ArrowEnd点结束。
*
* This procedure draws an arrow that starts at the point ArrowStart and ends at ArrowEnd.
*
* Get parameters.
DirectionVector := ArrowEnd[0:2] - ArrowStart[0:2]
ArrowLength := sqrt(DirectionVector[0] * DirectionVector[0] + DirectionVector[1] * DirectionVector[1] + DirectionVector[2] * DirectionVector[2])
ConeRadius := 2.0 * ArrowThickness
ConeLength := min([2.0 * ConeRadius,ArrowLength * 0.9])
CylinderLength := ArrowLength - ConeLength
*
* Create cone.
pi := rad(180)
X := 0
Y := 0
Z := CylinderLength + ConeLength
for Index := 0 to 2 * pi by 0.1X := [X,ConeRadius * cos(Index)]Y := [Y,ConeRadius * sin(Index)]Z := [Z,CylinderLength]
endfor
gen_object_model_3d_from_points (X, Y, Z, OM3DConeTmp)
convex_hull_object_model_3d (OM3DConeTmp, OM3DCone)
clear_object_model_3d (OM3DConeTmp)
*
* Create cylinder.
X := []
Y := []
for Index := 0 to 2 * pi by 0.1X := [X,ArrowThickness * cos(Index)]Y := [Y,ArrowThickness * sin(Index)]
endfor
tuple_gen_const (|Y|, 0, ZZero)
tuple_gen_const (|Y|, CylinderLength, ZTop)
gen_object_model_3d_from_points ([X,X], [Y,Y], [ZZero,ZTop], OM3DCylinderTmp)
convex_hull_object_model_3d (OM3DCylinderTmp, OM3DCylinder)
clear_object_model_3d (OM3DCylinderTmp)
*
* Union cone and cylinder Create arrow.
union_object_model_3d ([OM3DCone,OM3DCylinder], 'points_surface', OM3DArrowTmp)
clear_object_model_3d (OM3DCone)
clear_object_model_3d (OM3DCylinder)
Scale := CylinderLength / ArrowLength
OriginX := [0, 0, 0]
OriginY := [0, 0, 0]
OriginZ := [0,CylinderLength,ArrowLength]
TargetX := [ArrowStart[0],ArrowStart[0] + Scale * DirectionVector[0],ArrowEnd[0]]
TargetY := [ArrowStart[1],ArrowStart[1] + Scale * DirectionVector[1],ArrowEnd[1]]
TargetZ := [ArrowStart[2],ArrowStart[2] + Scale * DirectionVector[2],ArrowEnd[2]]
vector_to_hom_mat3d ('rigid', OriginX, OriginY, OriginZ, TargetX, TargetY, TargetZ, HomMat3D)
affine_trans_object_model_3d (OM3DArrowTmp, HomMat3D, OM3DArrow)
clear_object_model_3d (OM3DArrowTmp)
return ()
获取参数:
计算方向向量DirectionVector,这是ArrowEnd和ArrowStart的前两个坐标的差。
计算箭头的长度ArrowLength,这是方向向量的长度(即三维空间中的直线距离)。
计算锥体的半径ConeRadius,这是箭头粗细ArrowThickness的两倍。
计算锥体的长度ConeLength,这是箭头长度的90%和两倍锥体半径中的较小值。
计算圆柱体的长度CylinderLength,这是箭头总长度减去锥体长度。
创建锥体:
使用循环生成锥体底面的点,这些点位于一个圆上,圆的半径为ConeRadius。
使用这些点生成一个临时三维对象模型OM3DConeTmp。
使用convex_hull_object_model_3d函数从临时模型生成一个凸包模型OM3DCone,这是最终的锥体模型。
清除临时模型OM3DConeTmp。
创建圆柱体:
使用循环生成圆柱体侧面的点,这些点位于一个圆上,圆的半径为ArrowThickness。
生成两个常数值数组ZZero和ZTop,分别代表圆柱体的底部和顶部在Z轴上的位置。
使用这些点生成一个临时三维对象模型OM3DCylinderTmp。
使用convex_hull_object_model_3d函数从临时模型生成一个凸包模型OM3DCylinder,这是最终的圆柱体模型。
清除临时模型OM3DCylinderTmp。
合并锥体和圆柱体以创建箭头:
使用union_object_model_3d函数将锥体和圆柱体合并成一个临时模型OM3DArrowTmp。
清除原始的锥体和圆柱体模型OM3DCone和OM3DCylinder。
调整箭头的位置和方向:
计算缩放比例Scale,这是圆柱体长度与箭头总长度的比例。
计算原点和目标点的坐标,用于将箭头从原点(临时模型的位置)变换到实际的位置和方向。
使用vector_to_hom_mat3d函数计算一个从原点到目标点的刚体变换矩阵HomMat3D。
使用affine_trans_object_model_3d函数应用这个变换矩阵,将箭头从临时模型OM3DArrowTmp变换到最终的位置和方向,生成最终的箭头模型OM3DArrow。
清除临时模型OM3DArrowTmp。
相关文章:
halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
目录 一、gen_robot_tool_and_base_object_model_3d 函数调用二、gen_arrow_object_model_3d 函数调用 首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。 一、gen_robot_tool_and_base_object_model_3d 函数调用 RobotToolSize : 0.…...

容器技术思想 Docker K8S
容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前,程序直接部署在物理服务器上,依赖管理复杂,包括各类运行依赖,且易变,多程序混合部署时还可能产生依赖冲突,给程序…...

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)
python环境没有安装的可以点击这里先安装好python环境,python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版(免费)和专业版(付费)。对于初学者和个人开发者而言,社区…...
Oracle job(定时任务)
1、job的作用 可以定时执行任务(分/次、时/次、天/次等) 2、创建job --创建job --注意点: --①job_no 为系统自动获取; --②存储过程名需要加‘;’ --③定时器开始执行时间可以填‘sysdate,表示立即执行 --④执行频…...
[python3]Excel解析库-xlwt
xlwt 是一个用于创建 Excel .xls 文件(即旧版的 Excel 97-2003 格式)的 Python 库。它允许你用 Python 编写程序来生成 Excel 文件,而不需要实际运行 Microsoft Excel 应用程序。请注意,xlwt 只支持写入 .xls 文件,并不…...

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 题外话:trait的概念非常非常非常重要!!!整个第10章全都是Rust的重难点!&#x…...

大数据高级ACP学习笔记(2)
钻取:变换维度的层次,改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub...

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令
K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台;我这里是安装的其他开…...

【ArcGIS Pro二次开发实例教程】(2):BSM字段赋值
一、简介 一般的数据库要素或表格都有一个BSM字段,用来标识唯一值。 此工具要实现的功能是:按一定的规律(前缀中间的填充数字OBJECT码)来给BSM赋值。 主要技术要点包括: 1、ProWindow的创建,Label,Comb…...
OpenCV轮廓相关操作API (C++)
在OpenCV中,轮廓(contours)是图像处理中的一个重要概念,通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API,可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…...

[开源]自动化定位建图系统
系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、敬请期待… 开源链接: 1、多传感器融合里程计 https://gitee.com/li-wenhao-lw…...

linux ansible部署
ansible部署完后,执行报错 # ansible one -i hosts -m ping dataos193 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add …...

《Rust权威指南》学习笔记(二)
枚举enum 1.枚举的定义和使用如下图所示: 定义时还可以给枚举的成员指定数据类型,例如:enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下,使用::进行分隔。 2.一个特殊的枚举Option࿰…...

Redis内存碎片
什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数…...

Express 加 sqlite3 写一个简单博客
例图: 搭建 命令: 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…...
正则表达式进阶学习(一):环视、捕获分组与后向引用
一、环视(零宽断言) 理论部分 环视(零宽断言)是一种用于匹配位置而非字符的正则表达式技术。它的核心特点是:不消耗字符,只检查某个位置前后是否符合特定的条件。可以理解为,环视是在匹配前“…...

《Vue3 七》插槽 Slot
插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽: 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装;将不同的元素使用 slot 作为占位,让外部决定到底显示什么样的…...

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...

Linux C/C++编程-获得套接字地址、主机名称和主机信息
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…...
USB kbtab linux 驱动代码
#include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> #include <asm/unaligned.h> /* Pressure-threshold modules param code from */MODULE_AUTHOR(“xxx”); MODULE_DESCRIPTION(“…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...