GitHub • LinkedIn • X • Discord
Telekinesis Axon
Telekinesis Axon is a camera calibration library for the Telekinesis ecosystem, with a C++ core (targets, calibration, geometry, quality) exposed to Python via pybind11. It supports intrinsic calibration, eye-in-hand (hand-eye) extrinsic calibration, multi-camera extrinsic calibration, and benchmarking, built on OpenCV.
The hardware-driving runtime layer (DataCollector, PerturbationSampler) stays pure Python — camera/robot SDKs are inherently async/IO-bound and don't benefit from a native rewrite.
Installation
pip install telekinesis-axon
Ships as a prebuilt wheel (Linux/Windows, Python 3.11/3.12) from Telekinesis's private package registry — no C++ toolchain needed. If you're building from source instead (e.g. contributing to axon itself), see DEVELOPMENT.md.
Targets
Define your calibration board once and pass it to any calibrator:
from telekinesis.axon.targets import ChessboardTarget, CharucoTarget, ArucoTarget
chessboard = ChessboardTarget(size=(9, 6), square_size=0.025) # meters
charuco = CharucoTarget(
squares_x=6,
squares_y=9,
square_length=0.012,
marker_length=0.009,
aruco_dict_id="DICT_4X4_1000", # or the raw cv2.aruco.DICT_4X4_1000 int
)
aruco = ArucoTarget(
board_size=(5, 7),
marker_length=0.025,
marker_separation=0.005,
)
Intrinsic Calibration
A single IntrinsicCalibrator dispatches on the target type you pass it — no more separate ArucoIntrinsicCalibrator / CharucoIntrinsicCalibrator subclasses or an IntrinsicBackend indirection:
from telekinesis.axon import IntrinsicCalibrator, IntrinsicOptions
from telekinesis.axon.targets import CharucoTarget
target = CharucoTarget(squares_x=6, squares_y=9, square_length=0.012, marker_length=0.009)
options = IntrinsicOptions()
options.per_view_error_threshold = 0.8
calibrator = IntrinsicCalibrator(target, options)
result = calibrator.calibrate(images)
result.ok # bool
result.intrinsic_matrix # (3, 3) np.ndarray
result.distortion_coefficients
result.reprojection_error
result.successful_indices
result.low_view_error_indices
Eye-in-Hand Calibration
Calibrate the transform between the camera and the robot TCP. Requires images of a calibration board alongside the robot's TCP pose (robot_T_tcp as 4×4 homogeneous matrices) for each frame.
from telekinesis.axon import EyeInHandCalibrator
from telekinesis.axon.targets import CharucoTarget
target = CharucoTarget(squares_x=6, squares_y=9, square_length=0.012, marker_length=0.009)
calibrator = EyeInHandCalibrator(target)
result = calibrator.calibrate(
robot_T_tcp_list=robot_poses, # list of (4, 4) np.ndarray
image_list=images,
method="TSAI",
)
result.ok # bool
result.tcp_T_camera # (4, 4) np.ndarray
result.intrinsic_matrix
result.distortion_coefficients
result.reprojection_error
result.consistency # TargetConsistencyStats, when result.has_consistency
Pass pre-computed per-frame poses
If you have camera_T_target transforms from an external source, pass them via camera_T_target_list to skip EyeInHandCalibrator's internal solvePnP. The caller is responsible for aligning robot_T_tcp_list and image_list to it.
result = calibrator.calibrate(
robot_T_tcp_list=robot_poses,
image_list=images,
camera_T_target_list=external_camera_T_target_list,
intrinsic_matrix=K,
distortion_coefficients=d,
)
Multi-Camera Calibration
Calibrate N ≥ 2 synchronized cameras against a reference camera via pairwise cv::stereoCalibrate, with an automatic triangulation validation pass:
from telekinesis.axon import MultiCameraCalibrator
from telekinesis.axon.targets import CharucoTarget
target = CharucoTarget(squares_x=6, squares_y=9, square_length=0.012, marker_length=0.009)
calibrator = MultiCameraCalibrator(target, num_cameras=3, reference_index=1)
result = calibrator.calibrate(image_lists) # image_lists[cam][frame]
result.ok # True iff every non-reference pair solved
result.reference_T_camera_list # per-camera (4, 4) np.ndarray
result.intrinsic_matrices
result.pair_reprojection_errors
Benchmarking
Cross-validate a target/IntrinsicOptions configuration and, optionally, a hand-eye round trip:
from telekinesis.axon import CalibrationBenchmark, IntrinsicOptions
from telekinesis.axon.targets import CharucoTarget
target = CharucoTarget(squares_x=6, squares_y=9, square_length=0.012, marker_length=0.009)
bench = CalibrationBenchmark()
result = bench.run(
images=my_images,
target=target,
options=IntrinsicOptions(),
robot_poses=my_robot_poses, # optional — enables the round-trip metric
eye_in_hand_options=IntrinsicOptions(), # optional
n_splits=5,
)
CalibrationBenchmark.save_json([result], "calibration_benchmark.json")
print(CalibrationBenchmark.format_results([result]))
Output (calibration_benchmark.json):
{
"run_timestamp": "2026-05-18T...",
"results": [
{
"backend_name": "OpenCV",
"reprojection_error": 0.42,
"held_out_reprojection_error": 0.61,
"hand_eye_roundtrip_error": 1.3,
"camera_matrix": [[fx, 0, cx], [0, fy, cy], [0, 0, 1]],
"dist_coeffs": [...]
}
]
}
Resources
- Examples — Telekinesis Examples
- Documentation — Telekinesis Documentation
Support
- Open an issue on GitHub
- Contact the team at support@telekinesis.ai or on Discord
License
Proprietary — © Telekinesis. All rights reserved.
Metadata
Release files for telekinesis-axon 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| telekinesis_axon-0.2.2-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| telekinesis_axon-0.2.2-cp312-cp312-manylinux_2_39_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.39+ x86-64 | Details |
| telekinesis_axon-0.2.2-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| telekinesis_axon-0.2.2-cp311-cp311-manylinux_2_39_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.39+ x86-64 | Details |
Total release size: 263.8 MB
Release files / telekinesis_axon-0.2.2-cp312-cp312-win_amd64.whl
| Download URL | telekinesis_axon-0.2.2-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 54.8 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a536670577f3c5e68b0eaac1605a3f9a227828319c3ce54fb78d6a4853506a02
|
|
BLAKE2b-256 checksum How to use checksums |
9e7794ccc40e39d2e1b82c15e774de985c4a35b47b22fb11702e51f8938df5d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / telekinesis_axon-0.2.2-cp312-cp312-manylinux_2_39_x86_64.whl
| Download URL | telekinesis_axon-0.2.2-cp312-cp312-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 77.1 MB |
| Tags | CPython 3.12 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
eaa245e9a40c6455bc2c3fb0482481e010db2a309317b581c6af9d8789bf7df6
|
|
BLAKE2b-256 checksum How to use checksums |
4dc9e3bf235e1d0d51ab2fe433e906696c3615111a16d3fc8899ea1f875f4d77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / telekinesis_axon-0.2.2-cp311-cp311-win_amd64.whl
| Download URL | telekinesis_axon-0.2.2-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 54.8 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0cf49505fc37a688606d072a2ca5540d99249724e4b8663fc73c0dd3991d8838
|
|
BLAKE2b-256 checksum How to use checksums |
ec7f524fcb611029e30d1e012ca1e5bcafdf54104880fb383007b13002e9010f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / telekinesis_axon-0.2.2-cp311-cp311-manylinux_2_39_x86_64.whl
| Download URL | telekinesis_axon-0.2.2-cp311-cp311-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 77.1 MB |
| Tags | CPython 3.11 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
10163ad5966a9d4a500008b29b386cbe4d864044e8227d3b50ea5584cbdfa692
|
|
BLAKE2b-256 checksum How to use checksums |
68fee65423c742546e8f220d62775719338e6991c3730480578237c2ffc22f8c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|