GDK TF Interface Documentation (Python)¶
Overview¶
The TF (Transform) module provides the G02 robot with coordinate frame transformation functionality. Through the Python interface, developers can conveniently obtain the transformation relationships between the robot's various components, suitable for coordinate transformation, sensor calibration, kinematic computation, and many other scenarios.
Interface Description¶
TF Class¶
This class encapsulates the main functional interfaces for coordinate transformation.
1. get_all_tf_from_base_link()¶
- Function: Get the transformation relationships from base_link to all child coordinate frames
- Parameters: None
-
Return value:
list[TransformStamped], a list containing all transformation relationships; throws an exception on failure -
TransformStamped object attributes:
| Attribute | Type | Description | Unit |
|---|---|---|---|
frame_id |
str |
Parent coordinate frame ID | string |
child_frame_id |
str |
Child coordinate frame ID | string |
transform.translation.x |
float |
Translation X component | meters |
transform.translation.y |
float |
Translation Y component | meters |
transform.translation.z |
float |
Translation Z component | meters |
transform.rotation.x |
float |
Rotation quaternion X component | unitless |
transform.rotation.y |
float |
Rotation quaternion Y component | unitless |
transform.rotation.z |
float |
Rotation quaternion Z component | unitless |
transform.rotation.w |
float |
Rotation quaternion W component | unitless |
timestamp_ns |
int |
Timestamp | nanoseconds |
- Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Get all transformation relationships
transforms = tf.get_all_tf_from_base_link()
print(f"Obtained {len(transforms)} transformation relationships:")
for transform_stamped in transforms:
print(f"Coordinate frames: {transform_stamped.frame_id} -> {transform_stamped.child_frame_id}")
print(f" Translation: x={transform_stamped.transform.translation.x:.3f}, "
f"y={transform_stamped.transform.translation.y:.3f}, "
f"z={transform_stamped.transform.translation.z:.3f}")
print(f" Rotation: x={transform_stamped.transform.rotation.x:.3f}, "
f"y={transform_stamped.transform.rotation.y:.3f}, "
f"z={transform_stamped.transform.rotation.z:.3f}, "
f"w={transform_stamped.transform.rotation.w:.3f}")
print(f" Timestamp: {transform_stamped.timestamp_ns}")
print()
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
2. get_tf_from_base_link()¶
- Function: Get the transformation relationship from base_link to the specified child coordinate frame
- Parameters:
child_frame_id: Child coordinate frame ID (string)-
Return value: A
Transformobject, containing the transformation information; throws an exception on failure -
Transform object attributes:
| Attribute | Type | Description | Unit |
|---|---|---|---|
translation.x |
float |
Translation X component | meters |
translation.y |
float |
Translation Y component | meters |
translation.z |
float |
Translation Z component | meters |
rotation.x |
float |
Rotation quaternion X component | unitless |
rotation.y |
float |
Rotation quaternion Y component | unitless |
rotation.z |
float |
Rotation quaternion Z component | unitless |
rotation.w |
float |
Rotation quaternion W component | unitless |
- Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Get the transformation relationship for a specified coordinate frame
child_frame_id = "head_link3"
transform = tf.get_tf_from_base_link(child_frame_id)
print(f"Transform from base_link to {child_frame_id}:")
print(f" Translation: x={transform.translation.x:.3f}, "
f"y={transform.translation.y:.3f}, "
f"z={transform.translation.z:.3f}")
print(f" Rotation: x={transform.rotation.x:.3f}, "
f"y={transform.rotation.y:.3f}, "
f"z={transform.rotation.z:.3f}, "
f"w={transform.rotation.w:.3f}")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
3. get_tf_from_sensor()¶
- Function: Get the transformation relationship from base_link to the specified sensor
- Parameters:
sensor_extrinsic_type: Sensor extrinsic type (enum value)-
Return value: A
Transformobject, containing the transformation information; throws an exception on failure -
SensorExtrinsicType enum values:
| Enum value | Description |
|---|---|
kUnknown |
Unknown type |
kHeadLeftStereoToHeadRightStereo |
Head left stereo camera to right stereo camera |
kLeftHandDepthToLeftHandColor |
Left hand depth camera to color camera |
kRightHandDepthToRightHandColor |
Right hand depth camera to color camera |
kHeadDepthToHeadColor |
Head depth camera to color camera |
kHeadLeftStereoToHeadLink3 |
Head left stereo camera to head link3 |
kHeadRightStereoToHeadLink3 |
Head right stereo camera to head link3 |
kHeadLeftFisheyeToHeadLink3 |
Head left fisheye camera to head link3 |
kHeadRightFisheyeToHeadLink3 |
Head right fisheye camera to head link3 |
kHeadBackFisheyeToHeadLink3 |
Head rear fisheye camera to head link3 |
kChassisFrontLidarToBaseLink |
Chassis front lidar to base_link |
kChassisBackLidarToBaseLink |
Chassis rear lidar to base_link |
kChassisBackLidarToChassisFrontLidar |
Chassis rear lidar to front lidar |
kChassisMid360ImuToChassisMid360Lidar |
Chassis Mid360 IMU to chassis Mid360 lidar |
kChassisImuToBaseLink |
Chassis IMU to base_link |
kLeftHandRGBDToArmLEndLink |
Left hand RGBD to left arm end link |
kRightHandRGBDToArmREndLink |
Right hand RGBD to right arm end link |
kHeadRGBDToHeadLink3 |
Head RGBD to head link3 |
- Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Get the transformation relationship from the head left stereo camera to the right stereo camera
sensor_type = agibot_gdk.SensorExtrinsicType.kHeadLeftStereoToHeadRightStereo
transform = tf.get_tf_from_sensor(sensor_type)
print(f"Transform from head left stereo camera to right stereo camera:")
print(f" Translation: x={transform.translation.x:.3f}, "
f"y={transform.translation.y:.3f}, "
f"z={transform.translation.z:.3f}")
print(f" Rotation: x={transform.rotation.x:.3f}, "
f"y={transform.rotation.y:.3f}, "
f"z={transform.rotation.z:.3f}, "
f"w={transform.rotation.w:.3f}")
# Get the transformation relationship from the chassis front lidar to base_link
lidar_transform = tf.get_tf_from_sensor(agibot_gdk.SensorExtrinsicType.kChassisFrontLidarToBaseLink)
print(f"\nTransform from chassis front lidar to base_link:")
print(f" Translation: x={lidar_transform.translation.x:.3f}, "
f"y={lidar_transform.translation.y:.3f}, "
f"z={lidar_transform.translation.z:.3f}")
print(f" Rotation: x={lidar_transform.rotation.x:.3f}, "
f"y={lidar_transform.rotation.y:.3f}, "
f"z={lidar_transform.rotation.z:.3f}, "
f"w={lidar_transform.rotation.w:.3f}")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
4. lookup_transform_latest()¶
- Function: Look up the latest transformation relationship between two coordinate frames
- Parameters:
target_frame: Target coordinate frame ID (string)source_frame: Source coordinate frame ID (string)return_timestamp: Whether to return the timestamp (boolean, optional, defaults toFalse)- Return value:
- If
return_timestamp=False: returnstuple(Transform, None) - If
return_timestamp=True: returnstuple(Transform, int), where the second element is the timestamp (nanoseconds) -
Throws an exception on failure
-
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Look up the latest transform (without returning the timestamp)
transform, _ = tf.lookup_transform_latest("base_link", "arm_l_end_link")
print("Latest transform from arm_l_end_link to base_link:")
print(f" Translation: x={transform.translation.x:.3f}, "
f"y={transform.translation.y:.3f}, "
f"z={transform.translation.z:.3f}")
print(f" Rotation: x={transform.rotation.x:.3f}, "
f"y={transform.rotation.y:.3f}, "
f"z={transform.rotation.z:.3f}, "
f"w={transform.rotation.w:.3f}")
# Look up the latest transform (returning the timestamp)
transform, timestamp_ns = tf.lookup_transform_latest(
"base_link", "arm_l_end_link", return_timestamp=True
)
print(f"\nTimestamp: {timestamp_ns} ns")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
5. lookup_transform()¶
- Function: Look up the transformation relationship between two coordinate frames at a specific time (supports time interpolation)
- Parameters:
target_frame: Target coordinate frame ID (string)source_frame: Source coordinate frame ID (string)time_ns: Query time (nanosecond timestamp, integer)-
Return value: A
Transformobject, containing the transformation information; throws an exception on failure -
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Get the current timestamp (nanoseconds)
current_time_ns = tf.get_latest_timestamp("arm_l_end_link")
# Query the transform from 1 second ago
target_time_ns = current_time_ns - 1_000_000_000 # 1 second ago
transform = tf.lookup_transform("base_link", "arm_l_end_link", target_time_ns)
print(f"Transform from arm_l_end_link to base_link at time {target_time_ns}:")
print(f" Translation: x={transform.translation.x:.3f}, "
f"y={transform.translation.y:.3f}, "
f"z={transform.translation.z:.3f}")
print(f" Rotation: x={transform.rotation.x:.3f}, "
f"y={transform.rotation.y:.3f}, "
f"z={transform.rotation.z:.3f}, "
f"w={transform.rotation.w:.3f}")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
6. can_transform()¶
- Function: Check whether a transformation relationship exists between two coordinate frames
- Parameters:
target_frame: Target coordinate frame ID (string)source_frame: Source coordinate frame ID (string)-
Return value:
bool, returnsTrueif a transformation relationship exists, otherwiseFalse -
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Check whether a transform exists
if tf.can_transform("base_link", "arm_l_end_link"):
print("A transform from arm_l_end_link to base_link exists")
else:
print("No transform from arm_l_end_link to base_link exists")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
7. get_all_frame_names()¶
- Function: Get all available coordinate frame names
- Parameters: None
-
Return value:
list[str], a list containing all coordinate frame names -
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Get all coordinate frame names
frame_names = tf.get_all_frame_names()
print(f"All available coordinate frames ({len(frame_names)} total):")
for name in frame_names:
print(f" - {name}")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
8. get_latest_timestamp()¶
- Function: Get the latest timestamp for the specified coordinate frame
- Parameters:
frame_id: Coordinate frame ID (string)-
Return value:
int, the latest timestamp (nanoseconds); throws an exception on failure -
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
timestamp_ns = tf.get_latest_timestamp("arm_l_end_link")
print(f"Latest timestamp for arm_l_end_link: {timestamp_ns} ns")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
9. clear()¶
- Function: Clear all transformation relationships in the TF cache
- Parameters: None
-
Return value: None
-
Example:
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# Clear the TF cache
tf.clear()
print("TF cache cleared")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
Complete Usage Examples¶
Coordinate Frame Transformation Query Example¶
import agibot_gdk
import time
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
# 1. Get all transformation relationships
print("=== Get all transformation relationships ===")
transforms = tf.get_all_tf_from_base_link()
print(f"There are {len(transforms)} coordinate frame transformation relationships in total")
for i, transform_stamped in enumerate(transforms):
print(f"{i+1}. {transform_stamped.frame_id} -> {transform_stamped.child_frame_id}")
print(f" Translation: ({transform_stamped.transform.translation.x:.3f}, "
f"{transform_stamped.transform.translation.y:.3f}, "
f"{transform_stamped.transform.translation.z:.3f})")
print(f" Rotation: ({transform_stamped.transform.rotation.x:.3f}, "
f"{transform_stamped.transform.rotation.y:.3f}, "
f"{transform_stamped.transform.rotation.z:.3f}, "
f"{transform_stamped.transform.rotation.w:.3f})")
print()
# 2. Query the transform of a specific coordinate frame
print("=== Query specific coordinate frame transforms ===")
target_frames = ["head_camera_link", "left_hand_link", "right_hand_link"]
for frame_id in target_frames:
try:
transform = tf.get_tf_from_base_link(frame_id)
print(f"{frame_id}:")
print(f" Translation: ({transform.translation.x:.3f}, "
f"{transform.translation.y:.3f}, "
f"{transform.translation.z:.3f})")
print(f" Rotation: ({transform.rotation.x:.3f}, "
f"{transform.rotation.y:.3f}, "
f"{transform.rotation.z:.3f}, "
f"{transform.rotation.w:.3f})")
except Exception as e:
print(f"{frame_id}: retrieval failed - {e}")
print()
# 3. Query sensor extrinsics
print("=== Query sensor extrinsics ===")
sensor_types = [
(agibot_gdk.SensorExtrinsicType.kHeadLeftStereoToHeadRightStereo, "Head left stereo camera to right stereo camera"),
(agibot_gdk.SensorExtrinsicType.kHeadDepthToHeadColor, "Head depth camera to color camera"),
(agibot_gdk.SensorExtrinsicType.kChassisFrontLidarToBaseLink, "Chassis front lidar to base_link"),
(agibot_gdk.SensorExtrinsicType.kChassisImuToBaseLink, "Chassis IMU to base_link")
]
for sensor_type, sensor_name in sensor_types:
try:
transform = tf.get_tf_from_sensor(sensor_type)
print(f"{sensor_name}:")
print(f" Translation: ({transform.translation.x:.3f}, "
f"{transform.translation.y:.3f}, "
f"{transform.translation.z:.3f})")
print(f" Rotation: ({transform.rotation.x:.3f}, "
f"{transform.rotation.y:.3f}, "
f"{transform.rotation.z:.3f}, "
f"{transform.rotation.w:.3f})")
except Exception as e:
print(f"{sensor_name}: retrieval failed - {e}")
print()
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
Sensor Calibration Helper Example¶
import agibot_gdk
import time
import math
# Initialize the GDK system
if agibot_gdk.gdk_init() != agibot_gdk.GDKRes.kSuccess:
print("GDK initialization failed")
exit(1)
print("GDK initialized successfully")
tf = agibot_gdk.TF()
time.sleep(2) # Wait for TF to initialize
def quaternion_to_euler(x, y, z, w):
"""Convert a quaternion to Euler angles (radians)"""
# Roll (x-axis rotation)
sinr_cosp = 2 * (w * x + y * z)
cosr_cosp = 1 - 2 * (x * x + y * y)
roll = math.atan2(sinr_cosp, cosr_cosp)
# Pitch (y-axis rotation)
sinp = 2 * (w * y - z * x)
if abs(sinp) >= 1:
pitch = math.copysign(math.pi / 2, sinp) # use 90 degrees if out of range
else:
pitch = math.asin(sinp)
# Yaw (z-axis rotation)
siny_cosp = 2 * (w * z + x * y)
cosy_cosp = 1 - 2 * (y * y + z * z)
yaw = math.atan2(siny_cosp, cosy_cosp)
return roll, pitch, yaw
def print_transform_info(transform, name):
"""Print transform information"""
print(f"{name}:")
print(f" Translation: ({transform.translation.x:.6f}, "
f"{transform.translation.y:.6f}, "
f"{transform.translation.z:.6f}) meters")
# Convert to Euler angles
roll, pitch, yaw = quaternion_to_euler(
transform.rotation.x, transform.rotation.y,
transform.rotation.z, transform.rotation.w
)
print(f" Rotation quaternion: ({transform.rotation.x:.6f}, "
f"{transform.rotation.y:.6f}, "
f"{transform.rotation.z:.6f}, "
f"{transform.rotation.w:.6f})")
print(f" Rotation Euler angles: Roll={math.degrees(roll):.2f}°, "
f"Pitch={math.degrees(pitch):.2f}°, "
f"Yaw={math.degrees(yaw):.2f}°")
print()
# Get the transformation relationships for all cameras
print("=== Camera extrinsic calibration information ===")
camera_sensors = [
(agibot_gdk.SensorExtrinsicType.kHeadLeftStereoToHeadRightStereo, "Head left stereo camera to right stereo camera"),
(agibot_gdk.SensorExtrinsicType.kLeftHandDepthToLeftHandColor, "Left hand depth camera to color camera"),
(agibot_gdk.SensorExtrinsicType.kRightHandDepthToRightHandColor, "Right hand depth camera to color camera"),
(agibot_gdk.SensorExtrinsicType.kHeadDepthToHeadColor, "Head depth camera to color camera"),
(agibot_gdk.SensorExtrinsicType.kHeadLeftStereoToHeadLink3, "Head left stereo camera to head link3"),
(agibot_gdk.SensorExtrinsicType.kHeadRightStereoToHeadLink3, "Head right stereo camera to head link3"),
(agibot_gdk.SensorExtrinsicType.kHeadLeftFisheyeToHeadLink3, "Head left fisheye camera to head link3"),
(agibot_gdk.SensorExtrinsicType.kHeadRightFisheyeToHeadLink3, "Head right fisheye camera to head link3"),
(agibot_gdk.SensorExtrinsicType.kHeadBackFisheyeToHeadLink3, "Head rear fisheye camera to head link3")
]
for sensor_type, sensor_name in camera_sensors:
try:
transform = tf.get_tf_from_sensor(sensor_type)
print_transform_info(transform, sensor_name)
except Exception as e:
print(f"{sensor_name}: retrieval failed - {e}")
# Get the transformation relationships for other sensors
print("=== Other sensor extrinsic information ===")
other_sensors = [
(agibot_gdk.SensorExtrinsicType.kChassisFrontLidarToBaseLink, "Chassis front lidar to base_link"),
(agibot_gdk.SensorExtrinsicType.kChassisBackLidarToBaseLink, "Chassis rear lidar to base_link"),
(agibot_gdk.SensorExtrinsicType.kChassisBackLidarToChassisFrontLidar, "Chassis rear lidar to front lidar"),
(agibot_gdk.SensorExtrinsicType.kChassisMid360ImuToChassisMid360Lidar, "Chassis Mid360 IMU to lidar"),
(agibot_gdk.SensorExtrinsicType.kChassisImuToBaseLink, "Chassis IMU to base_link"),
(agibot_gdk.SensorExtrinsicType.kLeftHandRGBDToArmLEndLink, "Left hand RGBD to left arm end link"),
(agibot_gdk.SensorExtrinsicType.kRightHandRGBDToArmREndLink, "Right hand RGBD to right arm end link"),
(agibot_gdk.SensorExtrinsicType.kHeadRGBDToHeadLink3, "Head RGBD to head link3")
]
for sensor_type, sensor_name in other_sensors:
try:
transform = tf.get_tf_from_sensor(sensor_type)
print_transform_info(transform, sensor_name)
except Exception as e:
print(f"{sensor_name}: retrieval failed - {e}")
# Release GDK system resources
if agibot_gdk.gdk_release() != agibot_gdk.GDKRes.kSuccess:
print("GDK release failed")
else:
print("GDK released successfully")
Usage Notes¶
- GDK initialization: You must call
agibot_gdk.gdk_init()to initialize the GDK system before using the TF functionality - GDK release: You must call
agibot_gdk.gdk_release()to release GDK system resources before the program ends - Initialization wait: After creating a TF object, it is recommended to wait 2 seconds to ensure system initialization completes
- Coordinate frame convention: Follows the standard robot coordinate frame convention (right-handed coordinate system)
- Timestamp precision: The timestamp is in nanoseconds, so handle precision carefully
- Exception handling: All interfaces throw a
RuntimeErrorexception on failure and need to be handled appropriately - Sensor type: When querying sensor extrinsics, make sure to use the correct sensor type enum
- Transformation matrix: Rotation is represented as a quaternion, so pay attention to conversion with the rotation matrix
- Coordinate frame ID: When querying by string, make sure the coordinate frame ID is correct and exists; you can use
get_all_frame_names()to get all available coordinate frames - Real-time nature: TF data may change over time, so pay attention to data timeliness
- Transform queries:
lookup_transform_latest()queries the latest transform, whilelookup_transform()supports time-interpolated queries of historical transforms - Transform checking: Use
can_transform()to check whether a transform exists before querying, to avoid query failures - Time interpolation:
lookup_transform()supports time interpolation, allowing queries of the transformation relationship at any historical moment - Cache management: Use
clear()to clear the TF cache, useful for scenarios that need to reset transformation relationships - Timestamp query:
get_latest_timestamp()can get the latest update time for a specified coordinate frame - Return value handling:
lookup_transform_latest()returns different tuple formats depending on thereturn_timestampparameter
Application Scenarios¶
- Coordinate transformation: Obtaining the transformation relationships between the robot's various components
- Sensor calibration: Obtaining the extrinsic parameters of sensors relative to the robot body
- Kinematic computation: Providing coordinate transformation data for robot kinematic computation
- Vision processing: Providing coordinate frame information for camera image processing
- Navigation and localization: Providing coordinate frame transformations for SLAM and navigation
- Manipulator control: Providing coordinate frame information for manipulator motion planning
- Multi-sensor fusion: Unifying the coordinate frames of different sensors
- Calibration verification: Verifying the correctness of sensor calibration results