• Stars
    star
    439
  • Rank 99,247 (Top 2 %)
  • Language
    Python
  • License
    BSD 3-Clause "New...
  • Created over 7 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Python tools to perform time-synchronization and hand-eye calibration.

Hand-Eye-Calibration

Description

Python tools to perform hand-eye calibration.

If you are using these tools, please cite our paper:

@Inbook{Furrer2017FSR,
author="Furrer, Fadri
and Fehr, Marius
and Novkovic, Tonci
and Sommer, Hannes
and Gilitschenski, Igor
and Siegwart, Roland",
editor="Siegwart, Roland
and Hutter, Marco",
title="Evaluation of Combined Time-Offset Estimation and Hand-Eye Calibration on Robotic Datasets",
bookTitle="Field and Service Robotics: Results of the 11th International Conference",
year="2017",
publisher="Springer International Publishing",
address="Cham",
isbn="978-3-319-67361-5"
}

It includes time alignment of sets of poses, the implementation of a dual-quaternion based approach to solve the hand eye calibration, pre-filtering and filtering of poses, as well as the integration of a pose refinement step using batch optimization from oomact.

There are also classes that implement quaternions and dual-quaternions a set of plotting tools that were used to generate the plots in the paper.

The datasets where these algorithms are evaluated on can be found here.

Installation

System Dependencies - Ubuntu 16.04

# Install ROS repository
sudo apt-get install software-properties-common libv4l-dev
sudo add-apt-repository "deb http://packages.ros.org/ros/ubuntu xenial main"
wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
sudo apt-get update

# Install system depdendencies [INCOMPLETE]
sudo apt-get install ros-kinetic-desktop-full doxygen python-catkin-tools

Workspace - OSX / Ubuntu 16.04 / Ubuntu 14.04

# Create catkin workspace.
export CATKIN_WS=~/catkin_ws
mkdir -p $CATKIN_WS/src
cd $CATKIN_WS
catkin init
catkin config --merge-devel
catkin config --extend /opt/ros/<YOUR_ROS_DISTRO>
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release

# Clone the repositories and its dependencies.
cd src
git clone https://github.com/ethz-asl/hand_eye_calibration.git
wstool init
wstool merge hand_eye_calibration/all_dependencies.rosinstall
wstool update -j 8

# Build hand_eye_calibration_package
catkin build hand_eye_calibration hand_eye_calibration_target_extractor hand_eye_calibration_batch_estimation

Tutorial

Formats

Our hand-eye calibration expects timestamped poses with Hamiltonian quaternions in the following format, where [.] denotes the unit:

p = [t[s], x[m], y[m], z[m], q_x, q_y, q_z, q_w]

Our scripts expect CSV files with the following format:

t, x, y, z, q_x, q_y, q_z, q_w

Frames

In our hand-eye calibration we use the following frames:

  • H: Hand — The frame of the robot end-effector (or the vicon output pose).
  • B: Base — The robot's base frame, usually the end-effector poses are expressed with respect to this frame.
  • E: Eye — The frame of the camera.
  • W: World - The frame of the target.

Usage

All our tools can either be run via ROS, using

rosrun hand_eye_calibration <tool>.py [arguments]

or directly by changing into this directory (e.g. ~/catkin_ws/src/hand_eye_calibration/hand_eye_calibration) and executing:

./bin/<tool>.py [arguments]

Step-by-Step Calibration

A typical use case consists of the following steps (here using ROS):

  • Extract poses from tf (ROS transformation type) messages (with time stamps):
    rosrun hand_eye_calibration tf_to_csv.py --bag calibration.bag --tf_source_frame end_effector --tf_target_frame base_link --csv_output_file tf_poses_timestamped.csv
  • Extract poses from images (with time stamps):
    rosrun hand_eye_calibration target_extractor_interface.py \
      --bag calibration.bag \
      --calib_file_camera calib/camera_intrinsics.yaml \
      --calib_file_target calib/target.yaml \
      --image_topic /camera/rgb/image_raw \
      --output_file camera_poses_timestamped.csv
  • Time alignment of the poses and interpolate the two sets at given time stamps:
    rosrun hand_eye_calibration compute_aligned_poses.py \
      --poses_B_H_csv_file tf_poses_timestamped.csv \
      --poses_W_E_csv_file camera_poses_timestamped.csv \ --aligned_poses_B_H_csv_file tf_aligned.csv \
      --aligned_poses_W_E_csv_file camera_aligned.csv \
      --time_offset_output_csv_file time_offset.csv
  • Perform the dual-quaternion-based hand-eye calibration:
    rosrun hand_eye_calibration compute_hand_eye_calibration.py \
      --aligned_poses_B_H_csv_file tf_aligned.csv  \
      --aligned_poses_W_E_csv_file camera_aligned.csv \
      --time_offset_input_csv_file time_offset.csv \
      --calibration_output_json_file calibration.json \
      --visualize True
  • Run optimization to refine the calibration:
 rosrun hand_eye_calibration_batch_estimation batch_estimator \
   --v 1 \
   --pose1_csv tf_poses_timestamped.csv \
   --pose2_csv camera_poses_timestamped.csv \
   --init_guess_file calibration.json \
   --output_file calibration_optimized.json

End-to-End Calibration

If you already have the CSV files ready as described above you can use the end-to-end calibration script as follows:

rosrun hand_eye_calibration compute_complete_handeye_calibration.sh \
poses_B_H.csv poses_W_E.csv

Running the Tests

Tests are all python unittests and can be run with the following command:

python test/test_<test_filename>.py

or you can directly invoke the tests with catkin:

catkin run_tests hand_eye_calibration

More Repositories

1

kalibr

The Kalibr visual-inertial calibration toolbox
C++
4,357
star
2

maplab

A Modular and Multi-Modal Mapping Framework
C++
2,610
star
3

voxblox

A library for flexible voxel-based mapping, mainly focusing on truncated and Euclidean signed distance fields.
C++
1,336
star
4

rotors_simulator

RotorS is a UAV gazebo simulator
C++
1,245
star
5

okvis

OKVIS: Open Keyframe-based Visual-Inertial SLAM.
C++
1,158
star
6

rovio

C++
1,126
star
7

segmap

A map representation based on 3D segments
C++
1,070
star
8

ethzasl_msf

MSF - Modular framework for multi sensor fusion based on an Extended Kalman Filter (EKF)
C++
985
star
9

lidar_align

A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose sensor
C++
836
star
10

hfnet

From Coarse to Fine: Robust Hierarchical Localization at Large Scale with HF-Net (https://arxiv.org/abs/1812.03506)
Python
739
star
11

mav_active_3d_planning

Modular framework for online informative path planning.
C++
564
star
12

mav_trajectory_generation

Polynomial trajectory generation and optimization, especially for rotary-wing MAVs.
C++
548
star
13

polygon_coverage_planning

Coverage planning in general polygons with holes.
C++
528
star
14

aerial_mapper

Real-time Dense Point Cloud, Digital Surface Map (DSM) and (Ortho-)Mosaic Generation for UAVs
C++
524
star
15

voxgraph

Voxblox-based Pose graph optimization
C++
513
star
16

robust_point_cloud_registration

Robust Point Cloud Registration Using Iterative Probabilistic Data Associations ("Robust ICP")
C++
513
star
17

mav_voxblox_planning

MAV planning tools using voxblox as the map representation.
Makefile
463
star
18

dynablox

Real-time detection of diverse dynamic objects in complex environments.
C++
436
star
19

voxblox-plusplus

A volumetric object-level semantic mapping framework.
C++
409
star
20

mav_control_rw

Control strategies for rotary wing Micro Aerial Vehicles using ROS
C
350
star
21

ethzasl_sensor_fusion

time delay single and multi sensor fusion framework based on an EKF
C++
327
star
22

nbvplanner

A real-time capable exploration and inspection path planner (next best view planning)
C++
295
star
23

panoptic_mapping

A flexible submap-based framework towards spatio-temporally consistent volumetric mapping and scene understanding.
C++
275
star
24

ethzasl_icp_mapping

3D mapping tools for robotic applications
C++
268
star
25

okvis_ros

OKVIS: Open Keyframe-based Visual-Inertial SLAM (ROS Version)
C++
256
star
26

versavis

An Open Versatile Multi-Camera Visual-Inertial Sensor Suite
C++
256
star
27

kitti_to_rosbag

Dataset tools for working with the KITTI dataset raw data ( http://www.cvlibs.net/datasets/kitti/raw_data.php ) and converting it to a ROS bag. Also allows a library for direct access to poses, velodyne scans, and images.
C++
248
star
28

laser_slam

This package provides an end-to-end system to laser-based graph SLAM using laser point clouds.
C++
248
star
29

geodetic_utils

Simple library for converting coordinates to/from several geodetic frames (lat/lon, ECEF, ENU, NED, etc.)
C++
247
star
30

COIN-LIO

🪙 COIN-LIO: Complementary Intensity-Augmented LiDAR Inertial Odometry (ICRA 2024)
C++
245
star
31

image_undistort

A compact package for undistorting images directly from kalibr calibration files. Can also perform dense stereo estimation
C++
245
star
32

ethzasl_ptam

Modified version of Parallel Tracking and Mapping (PTAM)
C++
235
star
33

wavemap

Fast, efficient and accurate multi-resolution, multi-sensor 3D occupancy mapping
C++
226
star
34

cblox

Voxblox-based submapping
C++
207
star
35

aslam_cv2

C++
196
star
36

glocal_exploration

Efficient local and global exploration on submap collections with changing past pose estimates.
C++
186
star
37

volumetric_mapping

A repository for 3D volumetric (occupancy) maps, providing a generic interface for disparity map and pointcloud insertion, and support for custom sensor error models.
C++
186
star
38

vgn

Real-time 6 DOF grasp detection in clutter.
Python
181
star
39

hierarchical_loc

Deep image retrieval for efficient 6-DoF localization
Python
172
star
40

orb_slam_2_ros

ROS interface for ORBSLAM2!!
C++
171
star
41

mav_dji_ros_interface

Interface of DJI autopilot based on its OSDK (3.2)
C++
156
star
42

lidar_undistortion

Catkin package that provides lidar motion undistortion based on an external 6DoF pose estimation input.
C++
145
star
43

programming_guidelines

This repository contains style-guides, discussions, eclipse/emacs auto-formatter for commonly used programming languages
Emacs Lisp
139
star
44

tsdf-plusplus

TSDF++: A Multi-Object Formulation for Dynamic Object Tracking and Reconstruction
C++
135
star
45

odom_predictor

Integrates an IMU to predict future odometry readings
C++
134
star
46

depth_segmentation

A collection of segmentation methods working on depth images
C++
133
star
47

grid_map_geo

Geolocalization for grid map using GDAL.
C++
129
star
48

neuralblox

Real-time Neural Representation Fusion for Robust Volumetric Mapping
Python
127
star
49

StructuralInspectionPlanner

ASL Structural Inspection Planner
C++
108
star
50

phaser

A robust pointcloud registration pipeline based on correlation.
C++
106
star
51

eth_supermegabot

Instructions for ETH center for robotics summer school 2019.
Python
102
star
52

terrain-navigation

Repository for Safe Low Altitude Navigation in steep terrain for fixed-wing Aerial Vehicles
C++
98
star
53

waypoint_navigator

Stand-alone waypoint navigator
C++
96
star
54

ethzasl_xsens_driver

Driver for xsens IMUs
Python
96
star
55

mav_tools_public

General launch files, parameters and wiki entries on our systems and related issues
95
star
56

data-driven-dynamics

Data Driven Dynamics Modeling for Aerial Vehicles
Python
94
star
57

reinmav-gym

Reinforcement Learning framework for MAVs using the OpenAI Gym environment
Python
93
star
58

cuckoo_time_translator

algorithms for synchronizing clocks
C++
88
star
59

minkindr

A minimal library for transformations, following the kindr interface. Uses active quaternions of rotation in Hamilton notation.
C++
88
star
60

unreal_airsim

Simulation interface to Unreal Engine 4 based on the AirSim plugin.
C++
87
star
61

waverider

RMPs on multi-resolution occupancy maps for efficient reactive collision avoidance
87
star
62

ethz_piksi_ros

ROS drivers for the Piksi RTK GPS module
C++
85
star
63

sl_sensor

SL Sensor: An open-source, real-time and ROS-based structured light sensor for high accuracy construction robotic applications
C++
84
star
64

voxblox_ground_truth

Create ground truth voxblox maps from Gazebo worlds or .ply files
C++
83
star
65

vicon_bridge

This is a driver providing data from VICON motion capture systems. It is based on the vicon_mocap package from the starmac stacks. Additionally, it can handle multiple subjects / segments and allows to calibrate an origin of the vehicle(s) as this is somehow tedious with the VICON Tracker.
C++
80
star
66

ros-system-monitor

System monitoring tools for ROS.
Python
80
star
67

navrep

Python
73
star
68

curves

A library of curves for estimation.
C++
72
star
69

schweizer_messer

Programming tools for robotics.
C++
65
star
70

time_autosync

Automatically syncs a camera to a rigidly attached IMUs time frame
C++
63
star
71

unreal_cv_ros

Unreal CV ROS Perception Simulator
Python
62
star
72

ai_for_robotics

Programming Exercises Accompanying the Lecture "Artificial Intelligence for Robotics"
Python
60
star
73

lcd

Line Clustering and Description for Place Recognition
C++
59
star
74

trajectory_toolkit

Python tool for analyzing and evaluating trajectory data
Python
59
star
75

dataset_tools

Loader for the generic ASL dataset formats.
MATLAB
58
star
76

rl-navigation

OpenEdge ABL
57
star
77

asl-student-templates

Templates and overview information for student projects at ASL
PostScript
56
star
78

libseekthermal

Driver library for Seek Thermal imaging devices
C++
55
star
79

reactive_avoidance

Reactive obstacle avoidance using raytracing or lidars
C++
52
star
80

plotty

matplotlib-cpp with Eigen interfaces.
C++
52
star
81

forest_gen

Generates randomized Poisson forests to use for UAV collision avoidance evaluations.
Python
49
star
82

3d_vsg

3D Variable Scene Graphs for long-term semantic scene change prediction.
Python
49
star
83

sampling_based_control

Jupyter Notebook
47
star
84

mav_comm

This repository contains message and service definitions used for mavs. All future message definitions go in here, existing ones in other stacks should be moved here where possible.
C++
46
star
85

tmplanner

Terrain monitoring planner
C++
45
star
86

3d3l

Deep Learned Keypoint Detection and Description for 3D LiDARs
Python
44
star
87

fgsp

Jupyter Notebook
44
star
88

autolabel

A project for computing high-quality ground truth training examples for RGB-D data.
Python
43
star
89

mav_gtsam_estimator

A GTSAM based state estimation framework.
C++
43
star
90

visensor_node

Visual inertial SLAM sensor ROS node.
C++
43
star
91

Learn-to-Calibrate

We utilize deep reinforcement learning to obtain favorable trajectories for visual-inertial system calibration.
C++
43
star
92

cvae_exploration_planning

Learning informed sampling distributions and information gains for efficient exploration planning.
Python
42
star
93

active_grasp

Closed-loop next-best view planning for grasp detection in clutter.
Python
41
star
94

two_state_information_filter

C++
41
star
95

ssc_exploration

Incremental 3D Scene Completion for Safe and Efficient Exploration Mapping and Planning
41
star
96

maplab_rovio

Hard-fork of ROVIO to integrate localization.
C++
40
star
97

rtklibros

rtklib with ros interfacing and adapted feedback from external Kalman filter
C
40
star
98

libvisensor

Low level hardware driver for the visual inertial SLAM sensor.
C++
39
star
99

3dsnet

3DSNet: Unsupervised Shape-to-shape 3D Style Transfer
C++
39
star
100

mav_system_identification

Matlab scripts to perform system identification for muti-rotor systems
MATLAB
38
star