Skip to main content

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

Support

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)

Table of built distributions (wheels) for telekinesis-axon 0.2.2
File
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

Release history Release notifications | RSS feed

This release

0.2.2 This release

4 release files

0.2.1

4 release files

0.2.0

4 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page