rigid_trans_object_model_3d
算子详解rigid_trans_object_model_3d
用于对3D对象模型进行刚性变换,即仅改变模型的位置和方向而不改变形状。这是3D视觉处理中的基础算子,常用于:
参数名 | 类型 | 说明 |
---|---|---|
ObjectModel3D | 对象 | 需要进行刚性变换的3D对象模型 |
Pose | 元组 | 变换位姿(3D模型到目标坐标系的变换) 格式: [Tx,Ty,Tz,Rx,Ry,Rz,Mode] |
参数名 | 类型 | 说明 |
---|---|---|
ObjectModel3DRigidTrans | 对象 | 变换后的3D对象模型 |
Halcon支持多种位姿表示模式:
‘Rp+T’ (默认):旋转+平移表示法
‘Rpy’:Roll-Pitch-Yaw表示法
‘gba’:全局旋转角度
‘rodriguez’:罗德里格斯旋转表示
* 创建绕X轴旋转90度,沿Z轴平移0.1米的位姿
create_pose(0, 0, 0.1, 1.5708, 0, 0, 'Rp+T', 'gba', 'point', Pose)
* 读取3D模型
read_object_model_3d('part.obj', [], [], OriginalModel, _)
* 创建变换位姿(Y轴方向移动0.5米,绕Z轴旋转45度)
create_pose(0, 0.5, 0, 0, 0, 0.785, 'Rp+T', 'gba', 'point', TransformPose)
* 应用刚性变换
rigid_trans_object_model_3d(OriginalModel, TransformPose, TransformedModel)
* 可视化结果
visualize_object_model_3d([OriginalModel, TransformedModel], [], [], [], ['color_0','color_1'], ['gray','red'], WindowHandle)
* 读取两个视角的扫描数据
read_object_model_3d('scan1.ply', [], [], Scan1, _)
read_object_model_3d('scan2.ply', [], [], Scan2, _)
* 通过配准获取变换位姿
register_object_model_3d_pair(Scan1, Scan2, 'icp', [], [], AlignmentPose, Score)
* 应用配准结果进行变换
rigid_trans_object_model_3d(Scan2, AlignmentPose, AlignedScan2)
* 融合两个视角
union_object_model_3d([Scan1, AlignedScan2], 'points', 'true', FusedModel)
* 读取CAD模型
read_object_model_3d('valve.step', [], [], CADModel, _)
* 创建检测位姿(翻转并抬高)
create_pose(0, 0, 0.3, 3.1416, 0, 0, 'Rp+T', 'gba', 'point', InspectionPose)
* 变换到检测姿态
rigid_trans_object_model_3d(CADModel, InspectionPose, InspectionModel)
* 与实际扫描对比
distance_object_model_3d(InspectionModel, ScannedPart, 'point_to_point', Distances)
* 多个连续变换的应用
create_pose(0.5, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', MovePose)
create_pose(0, 0, 0, 1.5708, 0, 0, 'Rp+T', 'gba', 'point', RotatePose)
* 先平移再旋转
rigid_trans_object_model_3d(Model, MovePose, TempModel)
rigid_trans_object_model_3d(TempModel, RotatePose, FinalModel)
* 或者使用位姿组合(推荐)
pose_compose(MovePose, RotatePose, CombinedPose)
rigid_trans_object_model_3d(Model, CombinedPose, FinalModel)
算子 | 变换类型 | 保持形状 | 保持拓扑 | 适用场景 |
---|---|---|---|---|
rigid_trans_object_model_3d |
刚性变换 | 是 | 是 | 位姿调整、坐标系变换 |
affine_trans_object_model_3d |
仿射变换 | 否(可缩放) | 是 | 简单形变 |
projective_trans_object_model_3d |
投影变换 | 否 | 否 | 视角变换 |
* 计算反向变换
pose_invert(OriginalPose, InvertedPose)
* 恢复原始状态
rigid_trans_object_model_3d(TransformedModel, InvertedPose, RestoredModel)
* 同时变换多个模型(优于循环变换)
Models := [Model1, Model2, Model3]
Poses := [Pose1, Pose2, Pose3]
for i := 0 to |Models|-1 by 1
rigid_trans_object_model_3d(Models[i], Poses[i], TransModels[i])
endfor
* 简化复杂模型(加速变换计算)
prepare_object_model_3d(ComplexModel, 'reduce_num_points', 'true', [], SimplifiedModel)
rigid_trans_object_model_3d(SimplifiedModel, Pose, TransformedModel)
检查步骤:
* 1. 验证位姿参数
write_pose(Pose, 'Rp+T') // 打印位姿详情
* 2. 检查模型原始坐标系
get_object_model_3d_params(Model, 'center', CenterPoint)
解决方案:
* 确保使用的是刚性变换(不改变形状)
distance_object_model_3d(OriginalModel, TransformedModel, 'hausdorff', Distance)
if (Distance > 1e-6)
* 非刚性变换警告
endif
优化方案:
* 使用多线程处理
set_system('parallelize_operators', 'true')
set_system('thread_num', 4)
rigid_trans_object_model_3d(LargeModel, Pose, FastTransformedModel)
* 加载车身和零部件
read_object_model_3d('car_body.stp', [], [], Body, _)
read_object_model_3d('door.3mf', [], [], DoorAssembly, _)
* 定义标准装配位姿
create_pose(1.2, 0.8, 0.5, 0, 0, 1.57, 'Rp+T', 'gba', 'point', DoorPose)
* 变换车门到装配位置
rigid_trans_object_model_3d(DoorAssembly, DoorPose, InstalledDoor)
* 检测装配间隙
distance_object_model_3d(Body, InstalledDoor, 'point_to_point', Clearances)
* 可视化结果(不同颜色表示间隙大小)
visualize_object_model_3d([Body, InstalledDoor], [], [], [],
['color_0','color_1','color_2'],
['gray','temperature','red'], WindowHandle)
* 获取检测到的物体位姿
find_object_model_3d(SceneModel, ObjectModel, 'matching', [], [], DetectedPose, Score)
* 计算抓取变换(相对物体坐标系的变换)
create_pose(0, 0, -0.02, 0, 3.1416, 0, 'Rp+T', 'gba', 'point', GraspOffset)
* 变换到机器人基坐标系
pose_compose(DetectedPose, GraspOffset, RobotGraspPose)
* 生成抓取模型预览
rigid_trans_object_model_3d(GripperModel, RobotGraspPose, GraspPoseModel)
render_object_model_3d(GraspImage, [SceneModel, GraspPoseModel], CamParam, [], [])