halcon实现对点云的平移、旋转、线性运动等动画效果操作

news2024/10/7 6:46:32

一、点云从点A沿直线运动至B点

过程为:

1、读取点云

本例子用凸包算子convex_hull_object_model_3d生成点云,这个步骤可以换成自己的,直接读取点云即可。

2、设置旋转的角度

3、对点云进行转化

4、显示

5、带动画效果的移动代码

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
tuple_gen_const (220, '', Labels)
Colors := 'color_' + [0:220]
StepSize := 0.05
WaitSeconds := 0.05

Tx := 50
Ty := 50
Tz := 80
DualQuatTrans := [1,0,0,0,0,Tx / 2,Ty / 2,Tz / 2]
DualQuatStart := [1,0,0,0,0,0,0,0]
*创建平移箭头的可视化
create_pose (Tx, Ty, Tz, 0, 0, 0, 'Rp+T', 'gba', 'point', TransPose)
gen_arrow_object_model_3d (0.2, [0,0,0,0,0,0,0], TransPose, OM3DArrow)
X := [-30,30,30,-30,-30,30,30,-30]
Y := [-20,-5,20,20,-20,20,20,20]
Z := [-10,-10,-10,-10,10,0,0,10]
gen_object_model_3d_from_points (X / 2, Y / 2, Z / 2, ObjectModel3DTmp)
convex_hull_object_model_3d (ObjectModel3DTmp, ObjectModel3D)

tuple_gen_const (|OM3DArrow|, 'khaki', ColorOM3DArrow)
* 可视化移动过程
NumOM3D := |[ObjectModel3D,OM3DArrow]| - 1
*visualize_object_model_3d (WindowHandle, [ObjectModel3D,OM3DArrow], [], [], ['color_0',Colors[0:NumOM3D],'alpha'], ['orange','green',ColorOM3DArrow,0.5], '移动点云', [], [], VisPose2)

for Index := 0 to 1 + StepSize by StepSize
    *向四元数中插值,步长为0.05
    dual_quat_interpolate (DualQuatStart, DualQuatTrans, Index, DualQuatTransInterpolated)
    *将对偶四元数转化为3D位姿
    dual_quat_to_pose (DualQuatTransInterpolated, PoseTrans)
    *对点云进行刚性变换,移动至新的位置
    rigid_trans_object_model_3d (ObjectModel3D, PoseTrans, ObjectModel3DTrans)
    NumOM3D := |[ObjectModel3D,ObjectModel3DTrans,OM3DArrow]| - 1
    *显示
    disp_object_model_3d (WindowHandle, [ObjectModel3D,ObjectModel3DTrans,OM3DArrow], [], [], ['color_0',Colors[0:NumOM3D],'alpha'], ['orange','green','white',ColorOM3DArrow,0.5])
    wait_seconds (WaitSeconds)
endfor

6、效果图

 

7、去掉动画效果,简化的代码如下

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

X := [-30,30,30,-30,-30,30,30,-30]
Y := [-20,-5,20,20,-20,20,20,20]
Z := [-10,-10,-10,-10,10,0,0,10]
gen_object_model_3d_from_points (X / 2, Y / 2, Z / 2, ObjectModel3DTmp)
convex_hull_object_model_3d (ObjectModel3DTmp, ObjectModel3D)

*从初始位置,沿x轴移动50,沿y轴移动50,沿z轴移动80
PoseTrans2:=[50,50,80,0,0,0,0]

*对点云进行刚性变换,移动至新的位置
rigid_trans_object_model_3d (ObjectModel3D, PoseTrans2, ObjectModel3DTrans2)
disp_object_model_3d (WindowHandle, [ObjectModel3D,ObjectModel3DTrans2], [], [], ['color_0','color_1','alpha'], ['orange','green',0.5])

二、点云绕Z轴旋转135度

1、带动画效果的旋转代码

指定开始和最终旋转的四元数.
有意思的是写成360度不进行旋转,所以它里面是有判断的,
如果想获得各个角度,可以转正的180和负180度

说明,不添加VisPose1,也可以旋转,就是显示点云的时候角度不是很好,效果很不好,halcon窗口会根据点云的位置和大小自动调整点云显示的位置,窗口显示不够稳定

* 使用对偶四元数进行刚性变换
* 
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
tuple_gen_const (220, '', Labels)
Colors := 'color_' + [0:220]
*说明,不添加VisPose1,也可以旋转,就是显示的时候角度不是很好,很难看
create_pose (-2, 4, 500, 125, 0, 325, 'Rp+T', 'gba', 'point', VisPose1)

gen_initial_object_model_3d (ObjectModel3DInitial)

disp_object_model_3d (WindowHandle, ObjectModel3DInitial, [], VisPose1, ['disp_pose','color','alpha'], ['true','orange',0.5])

disp_continue_message (WindowHandle, 'black', 'true')


stop ()
* 定义指定开始和最终旋转的四元数.
*有意思的是写成360度不进行旋转,所以它里面是有判断的,
*如果想获得各个角度,可以转正的180和负180度
Rotation := rad(135)
DualQuatStart := [1,0,0,0,0,0,0,0]
DualQuatRotation := [cos(Rotation / 2),0,0,sin(Rotation / 2),0,0,0,0]
StepSize := 0.05
WaitSeconds := 0.05
* Visualize rotation.
for Index := 0 to 1 + StepSize by StepSize
    * 依次插入位于开始和最后旋转之间的对偶四元数,步长为0.05。
    dual_quat_interpolate (DualQuatStart, DualQuatRotation, Index, DualQuatRotationInterpolated)
    * 将双四元数转换为姿势。
    dual_quat_to_pose (DualQuatRotationInterpolated, PoseRotation)
    * 转换初始三维对象模型并显示它.
    rigid_trans_object_model_3d (ObjectModel3DInitial, PoseRotation, ObjectModel3DRotation)
    disp_object_model_3d (WindowHandle, [ObjectModel3DInitial,ObjectModel3DRotation], [], VisPose1, ['disp_pose_0','color_0','color_1','alpha'], ['true','orange','green',0.5])
    wait_seconds (WaitSeconds)
endfor

2、旋转简化后的代码

实现绕z轴旋转135度,与上面的效果是一样的

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

X := [-30,30,30,-30,-30,30,30,-30]
Y := [-20,-5,20,20,-20,20,20,20]
Z := [-10,-10,-10,-10,10,0,0,10]
gen_object_model_3d_from_points (X / 2, Y / 2, Z / 2, ObjectModel3DTmp)
convex_hull_object_model_3d (ObjectModel3DTmp, ObjectModel3D)

*从初始位置,沿z轴旋转135度
PoseTrans2:=[0,0,0,0,0,135,0]

*对点云进行刚性变换,移动至新的位置
rigid_trans_object_model_3d (ObjectModel3D, PoseTrans2, ObjectModel3DTrans2)
disp_object_model_3d (WindowHandle, [ObjectModel3D,ObjectModel3DTrans2], [], [], ['color_0','color_1','alpha'], ['orange','green',0.5])

3、效果图 

 三、弧线运动

弧线运动其实就是结合了平移和旋转,将上面的两种方法结合起来而已,不再详细赘述。

1、弧线运动动画效果代码

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
tuple_gen_const (220, '', Labels)
Colors := 'color_' + [0:220]
StepSize := 0.05
WaitSeconds := 0.05

Tx := 50
Ty := 50
Tz := 80
DualQuatTrans := [1,0,0,0,0,Tx / 2,Ty / 2,Tz / 2]
DualQuatStart := [1,0,0,0,0,0,0,0]
* 点云显示的角度,如果不加,点云在动作的时候,窗口会自动调整显示的中心位置,显示效果不加
create_pose (Tx, Ty, Tz, 0, 0, 0, 'Rp+T', 'gba', 'point', TransPose)
create_pose (-31, 32, 990, 125, 0, 325, 'Rp+T', 'gba', 'point', VisPose2)
gen_arrow_object_model_3d (0.2, [0,0,0,0,0,0,0], TransPose, OM3DArrow)
X := [-30,30,30,-30,-30,30,30,-30]
Y := [-20,-5,20,20,-20,20,20,20]
Z := [-10,-10,-10,-10,10,0,0,10]
gen_object_model_3d_from_points (X / 2, Y / 2, Z / 2, ObjectModel3DTmp)
convex_hull_object_model_3d (ObjectModel3DTmp, ObjectModel3DInitial)
d := TransPose[0]
create_pose (-1, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', L)
create_pose (TransPose[0] / 2, TransPose[1] / 2, TransPose[2] / 2, 0, 0, 0, 'Rp+T', 'gba', 'point', P)
screw_to_dual_quat ('point', L[0], L[1], L[2], P[0], P[1], P[2], -rad(90), d, DualQuaternionScrew)
dual_quat_interpolate (DualQuatStart, DualQuaternionScrew, [0:StepSize / 5:1], DualQuatScrewInterpolated)
dual_quat_to_pose (DualQuatScrewInterpolated, ScrewPoses)

NumOM3D := |[ObjectModel3DInitial]| - 1
visualize_object_model_3d (WindowHandle, [ObjectModel3DInitial], [], VisPose2, ['disp_pose_0','color_0','alpha'], ['true','orange',0.5], '', '', Instructions, VisPose2)
for Index := 0 to |ScrewPoses| / 7 - 1 by 1
    Pose := ScrewPoses[7 * Index:(Index + 1) * 7 - 1]
    rigid_trans_object_model_3d (ObjectModel3DInitial, Pose, ObjectModel3DScrew)
    NumOM3D := |[ObjectModel3DInitial,ObjectModel3DScrew]| - 1
    disp_object_model_3d (WindowHandle, [ObjectModel3DInitial,ObjectModel3DScrew], [], VisPose2, ['color_0','color_1','alpha'], ['orange','cyan',0.5])
endfor

本文参考例程:explain_dual_quaternions.hdev,例程里面实现了很复杂的运动过程

/*------------------------------------------------------------
// 作    者:    大胡子大叔
// 版权声明:  未经授权请勿转载,谢谢合作!
-------------------------------------------------------------*/

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

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

相关文章

3D机器视觉市场现状及未来发展趋势

原创 | 文 BFT机器人 当前,3D机器视觉市场正在经历快速发展阶段。多年来,该技术的应用领域也在不断扩大,特别是在工业制造和安防监控等多个领域具有广泛应用。这一持续发展得益于行业技术的不断进步。 3D机器视觉是指利用计算机视觉技术实现对…

关于开源项目 Tinywebserver的使用与配置fatal error: mysql.h: No such file or directory

Tinywebserver的配置和使用可以先看这篇文章配置 但是编译如果报错:fatal error: mysql.h: No such file or directory 文中提示是apt-get install libmysqlclient-dev 如果你执行了上面这条指令后还是编译报出同样错,请继续往下看。 根据提示是没找到m…

广东省21个地市谷歌卫星影像公开下载

广东省21个地市离线谷歌卫星影像数据资源(mbt格式),精度在18级0.5米左右分辨率,网盘下载链接:https://pan.baidu.com/s/1gsRNvz_Q1sPooCDdZMqpAw?pwd6666 提取码:6666

基于Zstack协议栈的智慧农业

界面演示 实物演示 包含两个终端节点以及一个协调器,协调器与上位机通过串口线连接,协调器与终端节点树形组网 硬件 cc2530 DHT11 超声波传感器 MQ-2 LED 三极管 直流电机 软件 Qt IAR Sqlyug Mysql 项目架构 智慧农业系统分为上位机和下位机&…

nvm安装后出现node不是内部或外部命令,也不是可运行的程序

nvm作为node管理工具可以在前端开发时,在本地安装多个node版本从来适应不同的工程代码,是比较推荐使用的!! 注意:在安装使用nvm时,需确保本地没有安装任意版本的nodejs(防止环境路径覆盖&#x…

opencv/深度学习框架/图像识别零基础学习课程(代码+视频+详细pdf资料)

课程介绍 open cv 学习掌握OpenCV的所有必要知识是成为一名优秀计算机视觉工程师的必经之路。通过深入学习OpenCV的图像处理、图像分割、特征提取、目标跟踪、机器学习等相关知识,可以让你在面试中更有信心,同时也能够更加流畅地编写高效的代码。不仅如…

代码随想录算法训练营第五十六天

第一题、两个字符串的删除操作 力扣题目链接 class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size()1, vector<int>(word2.size()1, 0));for(int i 1; i < word1.size()1; i){for(int j 1; j &l…

程序员转项目经理 快速成长的5个重点

程序员转项目经理&#xff0c;在刚开始时往往保留原有的固定思维&#xff0c;专注于项目技术的提升和突破&#xff0c;往往容易忽略干系人管理、进度管理、团队建设等问题&#xff0c;从而造成项目进度延期、费用超支等一系列的风险问题。那么我们该如何快速顺利地转型成为合格…

每天一点Python——day47

#第四十七天字典生成式&#xff1a;字典生成的公式 a[ab,ac,ad] b[12,13,14] 把a&#xff0c;b列表合并为字典 将第一个列表中的元素作为字典当中的键&#xff0c;第二个列表中的元素作为字典当中的值 这个过程我们需要打包 我们需要使用内置函数zip()生成字典 #如图所示 #例&a…

加密文件怎么解密?电脑文件加密后的解密方法

加密可以很好地保护电脑中的重要文件&#xff0c;那么加密文件该怎么解密呢&#xff1f;下面我们就一起来了解一下。 EFS加密 在使用EFS加密文件后&#xff0c;指定用户打开文件不需要输入密码。所以&#xff0c;在解密时同样无需输入密码。 我们在EFS加密文件上单击鼠标右键…

用wordpress建站效果怎么样?WordPress建站的8个主要优点

使用WordPress建站具有许多优势&#xff0c;其效果取决于您的需求、技能水平以及所选择的主题和插件。总体而言&#xff0c;WordPress是一个功能强大且灵活的内容管理系统&#xff0c;可用于创建各种类型的网站&#xff0c;从个人博客和企业网站到电子商务平台和社区论坛。 以下…

[Flask] Cookie与Session

由于HTTP的无状态性&#xff0c;为了使某个域名下的所有网页能够共享某些数据&#xff0c;Cookie和Session应运而生 1.Cookie对象 HTTP是无状态(stateless)协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下任何关于对方状态的信息 也就是说&#xff0c;尽管在…

Linux——进程信号(上)

目录 前文 一&#xff0c;什么是进程信号 二&#xff0c;信号的产生 2.1 通过按键终端产生信号 2.2 调用系统函数向进程发信号 2.3 由软条件产生信号 2.4 硬件异常产生信号 总结 前文 上文主要讲了一下进程间用管道通信的相关知识&#xff0c;本文主要带领大家深度认识一…

cpolar在windows系统下的关闭方法

计算机&#xff0c;右键-管理 管理–服务–cpolar service&#xff0c;停止服务

InfluxDB 压力测试

一、基础环境 1. InfluxDB V1.7.8&#xff0c;预置了10.3G 数据做为初始数据 &#xff08;调整了 部分参数&#xff0c;否则数据库动不动就崩溃&#xff09; 2. 模拟141个设备&#xff0c;共计1390个点位 3. 服务器配置 128G内存&#xff0c;2.4Ghz CPU&#xff0c;虚拟机 …

前端十万个为什么——软件设计的架构模式

&#x1f600;博主&#xff1a;小猫娃来啦 &#x1f600;文章核心&#xff1a;软件设计的架构模式 上篇文章&#xff0c;我们聊了一下前端的普遍性问题以及解决策略。书接上文&#xff0c;我们今天聊聊软件设计的架构模式。 在正文开始前&#xff0c;先思考几秒&#xff1a;为…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(二)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

想学会如何翻译pdf中的英文?让我教你三招

曾经有一个名叫小明的年轻人&#xff0c;他是一名热爱阅读的书虫。每天&#xff0c;他都会沉浸在大量的pdf文档中&#xff0c;探索着各种知识的海洋。然而&#xff0c;有时候他遇到了一些困扰&#xff0c;因为有些pdf文档并不是他熟悉的语言书写的。小明很苦恼&#xff0c;他希…

python接口自动化(十四)--session关联接口(详解)

简介 上一篇cookie绕过验证码模拟登录博客园&#xff0c;但这只是第一步&#xff0c;一般登录后&#xff0c;还会有其它的操作&#xff0c;如发帖&#xff0c;评论等等&#xff0c;这时候如何保持会话呢&#xff1f;这里我以jenkins平台为例&#xff0c;给小伙伴们在沙场演练一…