LivoxのカメラとLiDARのキャリブレーションROSパッケージの日本語ドキュメントです。
画像と点群データから非リアルタイムなキャリブレーションを行います。
なお、パッケージではLivox製LiDARのみをサポートしています。
サンプルデータを使う場合、ws_livox内に展開してください。
ubuntu20.04での動作を確認済み。パッケージはubuntu16.04で開発されています。
ubuntu20.04の場合は、Livox-SDKの代わりにLivox-SDK2をインストールしてください。
また、LiDARとの接続テストは各リポジトリを参照してください。
# Livox_SDKのインストール
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
cd build && cmake ..
make
sudo make install
# Livox_SDK2のインストール
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd ./Livox-SDK2/
mkdir build
cd build
cmake .. && make -j
sudo make install
# livox_ros_driverのインストール
mkdir ws_livox
cd ws_livox && mkdir src
git clone https://github.com/Livox-SDK/livox_ros_driver.git ./src
catkin_make
# install camera/lidar calibration package
cd src
git clone https://github.com/CIT-Autonomous-Robot-Lab/livox_camera_lidar_calibration.git
cd ..
catkin build
source devel/setup.bash
以下のキャリブレーションボードを印刷し、厚紙などに貼り付けてください。
その後、キャリブレーションボードの写真を撮影してください。少なくとも20枚の写真が必要です。
MATLABを使用する方法か、このパッケージを用いた方法のいずれかを行ってください。
MATLABのツール「cameraCalibrator」を使用してキャリブレーションできます。「RadialDistortion」「TangentialDistortion」「K」のパラメータが必要です。
パッケージ内のノードを使用してキャリブレーションできます。 txtファイルに使用する写真の名前を保存してください。写真名を書き込む際には、以下のシェルスクリプトが有効です。
#! /bin/bash
rm in.txt && touch in.txt
for ((i=0; i<=31; i++))
do
echo -e "$i.png" >> in.txt
done
camera_in_pathで写真の名前が書き込まれたファイル、camera_folder_pathで写真が保存された場所、result_pathで結果を保存するファイル、row_numberでキャリブレーションボードの行数、col_numberで列数、widthとheightでグリッドの幅と高さを指定してください。
「row_number」と「col_number」は実際の数値から1引いたものを設定するとうまく動作する気がします。
roslaunch camera_lidar_calibration cameraCalib.launch camera_in_path:="$(rospack find camera_lidar_calibration)/../../data/camera/in.txt" camera_folder_path:="$(rospack find camera_lidar_calibration)/../../data/camera/photos/" result_path:="$(rospack find camera_lidar_calibration)/../../data/camera/result.txt" row_number:="9" col_number:="6" width:="20" height:="20"
得られたパラメータは次の形式でtxtファイルに書き込んでください。distortionの数値のうち、左の2つがRadialDistortionで、右の3つがTangentialDistortionです。
キャリブレーションを行うシーンを準備します。ターゲットポイントを選択するため開けた環境と、写真と点群で目印になるものを用意してください。このステップでもLiDARとカメラを目印から3m離してください。以下の写真は千葉工業大学津田沼キャンパス2号館3階で撮影されたものです。
キャリブレーションボードの点群が表示されているかをコマンドで確認します。
roslaunch livox_ros_driver livox_lidar_rviz.launch
rosbag記録時はこちらのコマンドを使用します。
roslaunch livox_ros_driver livox_lidar_msg.launch
次のリンクを参照して、「customMsg」形式のデータが含まれていることを確認してください。確認できたら、カメラを準備してください。
- 写真を取る
- 点群を記録
roslaunch livox_ros_driver livox_lidar_msg.launch
rosbag record /livox/lidar
- データごとに写真とrosbagを10秒記録します。
起動ファイルを実行します。intrinsic_pathでカメラのパラメータを保存したファイル、input_photo_folder_pathで使用する写真の場所、output_pathで結果を保存するファイルを指定してください。
roslaunch camera_lidar_calibration cornerPhoto.launch intrinsic_path:="$(rospack find camera_lidar_calibration)/../../data/parameters/intrinsic.txt" input_photo_folder_path:="$(rospack find camera_lidar_calibration)/../../data/photo" output_path:="$(rospack find camera_lidar_calibration)/../../data/corner_photo.txt"
写真が表示されたら、写真上でターゲットポイントを選択します。通常キャリブレーションボードの左上隅から反時計回りに選択します。ポイントを4つ選択したら、最後に適当なポイントを選択して完了です。座標を記録し直す場合は、保存した座標を消去してからやり直してください。
rosbagをpcdファイルに変換します。input_bag_pathでrosbagが保存された場所、output_pcd_pathでpcdファイルを保存する場所、data_numでrosbagファイルの数を指定してください。
roslaunch camera_lidar_calibration pcdTransfer.launch input_bag_path:="$(rospack find camera_lidar_calibration)/../../data/lidar/" output_pcd_path:="$(rospack find camera_lidar_calibration)/../../data/pcdFiles/" data_num:="1"
pcdファイルを開き、写真と同じ順序でポイントを選択します。shift+左クリックでポイントを選択できます。
pcl_viewer -use_point_picking xx.pcd
取得した座標はtxtファイルに書き込んでください。
以下のコマンドを実行して、外部パラメータを計算します。intrinsic_pathでカメラのパラメータを保存したファイル、extirnsic_pathで結果を保存するファイル、input_lidar_pathで点群の座標を記録したファイル、input_photo_pathでカメラの座標を記録したファイルを指定してください。
roslaunch camera_lidar_calibration getExt1.launch intrinsic_path:="$(rospack find camera_lidar_calibration)/../../data/parameters/intrinsic.txt extrinsic_path:="$(rospack find camera_lidar_calibration)/../../data/parameters/extrinsic.txt input_lidar_path:="$(rospack find camera_lidar_calibration)/../../data/corner_lidar.txt" input_photo_path:="$(rospack find camera_lidar_calibration)/../../data/corner_photo.txt" error_threshold:="12"
誤差が大きいデータは端末に出力されます。
コマンドを実行してrvizで確認します。intrinsic_pathでカメラのパラメータを保存したファイル、extirnsic_pathで外部パラメータを保存したファイル、input_bag_pathでrosbagファイル、input_photo_pathで写真を指定してください。
roslaunch camera_lidar_calibration colorLidar.launch intrinsic_path:="$(rospack find camera_lidar_calibration)/../../data/parameters/intrinsic.txt" extrinsic_path:="$(rospack find camera_lidar_calibration)/../../data/parameters/extrinsic.txt" input_bag_path:="$(rospack find camera_lidar_calibration)/../../data/lidar/0.bag" input_photo_path:="$(rospack find camera_lidar_calibration)/../../data/photo/0.png"