"""
CVBpy Example Script for AQS12 Calibration - Use Case 3.
This example shows how to bring an intrinsically calibrated point cloud to
a world coordinate system via a rigid body transformation.
This workflow is recommended for area 3D compact sensors.
See also use case 3 described in the CVB Metric documentation:
https://help.commonvisionblox.com/NextGen/15.0/md_theory_of_operation_tools__metric.html#calibration_setup
The rigid body transformation solely inlcudes rotation and translation.
"""
import os
import cvb
def print_trafo(trafo: cvb.AffineMatrix3D) -> None:
print("Estimated transformation:")
print("Translation:")
print(f"[{trafo.translation.x}, {trafo.translation.y}, "
f"{trafo.translation.z}]")
print("Transformation matrix:")
print(f"[[{trafo.matrix.at(0, 0)}, "
f"{trafo.matrix.at(0, 1)}, "
f"{trafo.matrix.at(0, 2)}],")
print(f"[{trafo.matrix.at(1, 0)}, "
f"{trafo.matrix.at(1, 1)}, "
f"{trafo.matrix.at(1, 2)}],")
print(f"[{trafo.matrix.at(2, 0)}, "
f"{trafo.matrix.at(2, 1)}, "
f"{trafo.matrix.at(2, 2)}]]")
def print_trafo_parameters(atp: cvb.AffineTransformationParameters) -> None:
print("Rotation angles about X, Y, Z axis in degrees:")
print(f"{atp.rotation_angles.x}, {atp.rotation_angles.y}, "
f"{atp.rotation_angles.z}")
print("Shear Syx, Syz:")
print(f"{atp.s_yx}, {atp.s_yz}")
print("Inclination of laser plane about X, Z axis in degrees:")
print(f"{atp.inclination_x}, {atp.inclination_z}")
print("Scale in X, Y, Z:")
print(f"{atp.scale.x}, {atp.scale.y}, {atp.scale.z}")
def print_point_3d_list(points: list[
cvb.Point3D]) ->
None:
data_list = list()
for p in points:
data_list.append(f"[{p.x}, {p.y}, {p.z}]")
delimiter = ",\n"
print(f"[{delimiter.join(data_list)}]")
def print_residuals(points: list[
cvb.Point3D]) ->
None:
print("Residuals:")
print_point_3d_list(points)
def print_extrinsic_matrix(matrix: cvb.AffineMatrix3D) -> None:
rotation = matrix.matrix.rotation_angles
print("Transformation results:")
print("Rotation about x, y, and z in degrees:")
print(f"{rotation[0]}, {rotation[1]}, {rotation[2]}")
print("Translation about x, y, and z in millimeters:")
print(f"{matrix.translation.x}, {matrix.translation.y}, "
f"{matrix.translation.z}")
def create_aqs12():
points = [
save = False
print("Estimation of a rigid body transformation (rotation and translation)")
print("Loading range map and calibration file.")
range_map_file = os.path.join(
"RangeMapCalibrationPattern.tif"))
print(f"Range map loaded with size of {range_map.width} x {range_map.height} "
f"from {range_map_file}.")
aqs12 = create_aqs12()
calibrator_file = os.path.join(
calibrator.range_map_ignore_value = 0.
range_map.planes[0], calibrator,
cvb.PointCloudFlags.Float | cvb.PointCloudFlags.XYZConfidence)
print("Dense point cloud created from range map and calibration file "
f"with {cloud_intrinsic.num_points} points.")
cvb.foundation.SegmentationMethod.KmeansClustering)
print("Estimating a rigid-body transformation.")
transformation_, residuals_, transformation_parameters_ = \
cloud_intrinsic, segmentor, aqs12)
calibrator.extrinsic_matrix = transformation_
if transformation_:
print_trafo(transformation_)
if transformation_parameters_:
print_trafo_parameters(transformation_parameters_)
if residuals_:
print_residuals(residuals_)
print_extrinsic_matrix(calibrator.extrinsic_matrix)
print("Creating calibrated point cloud.")
range_map.planes[0], calibrator,
cvb.PointCloudFlags.Float | cvb.PointCloudFlags.XYZConfidence)
if save:
cloud.save("cloud.ply")
Union[cvb.Calibrator3DAT, cvb.LaserPlaneHomographyCalibrator3D, cvb.LaserPlaneZigZagCalibrator3D, cvb.FactorsCalibrator3D, cvb.MatrixCalibrator3D, cvb.PinholeCameraCalibrator3D] load(str file_name)
Union[cvb.PointCloud, cvb.DensePointCloud, cvb.SparsePointCloud] create(cvb.ImagePlane range_map, cvb.Calibrator3D calibrator, int flags, Union[Type[cvb.PointCloud|cvb.DensePointCloud|cvb.SparsePointCloud]] point_cloud_type=DensePointCloud)
cvb.DensePointCloud create_dense(cvb.ImagePlane range_map, cvb.Calibrator3D calibrator, int flags)
cvb.foundation.AQS12DensePointCloudSegmentor create(int method)
Tuple[cvb.AffineMatrix3D, Optional[List[cvb.Point3D]], cvb.AffineTransformationParameters] calculate_rigid_body_transformation_from_aqs12_piece(cvb.DensePointCloud cloud, cvb.foundation.AQS12DensePointCloudSegmentor segmentor, cvb.foundation.AQS12Piece aqs12, Optional[cvb.Rect] aoi=None)