1. カメラ内部基準校正
カメラは 4mm 広角カメラを使用しており、カメラの内部パラメータは最も一般的なチェッカーボード方式を使用して調整されています。まず、ROS に付属するパッケージをインストールします
sudo apt install ros-melodic-camera-calibration
usb_cam でカメラを起動した後、キャリブレーションを行います。
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.06 image:=/uab_cam/image_raw camera:=/camera --no-service-check
--size:キャリブレーションボードの長さ X 幅
--square: チェス盤の小さなグリッドの辺の長さ (m)
image:=/... : 画像トピックをサブスクライブします
Camera:=/camera: カメラ名
キャリブレーション後、内部参照ファイルが生成されます。Intrinsic はカメラ マトリックス、Distortion は歪みマトリックスです。
Intrinsic:
[430.229,0,306.853],[0,437.83,248.373],[0,0,1]
Distortion:
[0.156215,-0.156542,-0.004833,-0.001379]
2. Cam2lidar 外部パラメータの校正
私は外部基準の校正に自動 + 手動の方法を使用し、最初に自動登録のアルゴリズムを使用し、次に手動校正を使用して修正します。
自動キャリブレーション アルゴリズムは livox_camera_calib アルゴリズムを使用します
GitHub - hku-mars/livox_camera_calib: このリポジトリは、ターゲットのないシーンでの高解像度 LiDAR とカメラ間の自動キャリブレーションに使用されます。
この方法はうまく機能しますが、特定の場面が必要になるため、テスト後は、廊下などの奥行き差が大きいシーンと平坦なシーンをデータ収集用に選択します。
自動キャリブレーション アルゴリズムは特にデータのシーンに依存しており、良好なシーンでは良好なキャリブレーション効果が得られます。次に、SensorsCalibration を使用して、手動でさらなる補正を行います。このキャリブレーション ライブラリには、ほとんどのセンサー間のキャリブレーションが含まれています。
https://github.com/PJLab-ADG/SensorsCalibration
最終的なキャリブレーション結果を下の図に示します。
キャリブレーション後、外部パラメータマトリックスが生成されます
Extrinsic:
[-0.00650189,-0.999724,-0.0225309,0.0946092],[0.0035881,0.0225079,-0.999741,0.162664],[0.999972,-0.00658104,0.00344083,-0.00686066],[0,0,0,1]
3. ロスバッグを記録する
その後、データを収集できます。注意すべき点の 1 つは、異なるセンサー間の時刻同期です。LIVOX は、ROS システム時間ではなく、デフォルトで LIDAR の開始からの時間を計算するためです。データが直接記録される場合は、走らない。以下に 2 つの解決策を示します。
- LIDAR 接続に対応するネットワーク カードをシステム時刻と同期します。
ifconfig ネットワーク ポートを確認します。たとえば、ネットワーク ポートは eno1 です。
次のプロンプトが表示された場合は、ハードウェア同期「hardware-raw- Clock (SOF_TIMESTAMPING_RAW_HARDWARE)」
「hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)」
「hardware-recive (SOF_TIMESTAMPING_RX_HARDWARE)」を使用できます。
sudo apt install ptpd
sudo ptpd -M -i eno1 -C
最適なマスターが現れたらWiresharkで確認し、
Wireshark -- eno1 -- 検索ボックスで ptp を検索 -- 同期メッセージ信号が表示されます
その後、LIDAR を再度起動すると、タイムスタンプがローカル マシンと同期されます。
- R3LIVE の作者が提供する LIVOX ドライバーを直接使用します
GitHub - ziv-lin/livox_ros_driver_for_R2LIVE
作成者はソース コードのタイムスタンプを変更したため、このドライバーを使用して直接データの記録を開始できるようになりました。記録する前に、livox_lidar_config.json ファイルで時刻同期機能をオンにする必要があります。そしてインターフェース名を選択します。ここではカメラのインターフェースを選択します。
データを記録する場合、画像トピックを usb_cam/image_raw/compressed などの圧縮形式で記録すると、rosbag が小さくなります。
4. R3LIVE のインストールとコンパイル
https://github.com/hku-mars/r3live
公式ウェブサイトの Reademe に従ってください。作者が詳しく書いています。
5. 走行結果
主に yaml ファイルを変更し、取得したカメラの内部パラメータ、外部パラメータ、歪みマトリックスを入力する必要があります。3*3 回転行列は、4*4 変換行列の左上の 3*3 部分の転置であることに注意してください。次に、起動ファイルのトピックを独自のものに変更します。
r3live_vio:
image_width: 640
image_height: 480
camera_intrinsic:
[460.799008, 0.000000, 280.624145,
0.000000, 459.386391, 167.344099,
0.0, 0.0, 1.0]
camera_dist_coeffs: [-0.107372, 0.087416, 0.001676, -0.001356, 0.000000] #k1, k2, p1, p2, k3
# Fine extrinsic value. form camera-LiDAR calibration.
#转置矩阵
camera_ext_R:
[-0.00650189,0.0035881,0.999972,
-0.999724,0.0225079,-0.00658104,
-0.0225309, -0.999741, 0.00344083]
# camera_ext_t: [0.050166, 0.0474116, -0.0312415]
camera_ext_t: [0.0946092,0.162664,-0.00686066]
<launch>
<!-- Subscribed topics -->
<param name="LiDAR_pointcloud_topic" type="string" value= "/laser_cloud_flat" />
<param name="IMU_topic" type="string" value= "/livox/imu" />
<param name="Image_topic" type="string" value= "/usb_cam/image_raw" />
<param name="r3live_common/map_output_dir" type="string" value="$(env HOME)/r3live_output" />
<rosparam command="load" file="$(find r3live)/../config/my_data_r3live_config.yaml" />
<node pkg="r3live" type="r3live_LiDAR_front_end" name="r3live_LiDAR_front_end" output="screen" required="true"/>
<node pkg="r3live" type="r3live_mapping" name="r3live_mapping" output="screen" required="true" />
<arg name="rviz" default="1" />
<group if="$(arg rviz)">
<node name="rvizvisualisation" pkg="rviz" type="rviz" output="log" args="-d $(find r3live)/../config/rviz/r3live_rviz_config.rviz" />
</group>
</launch>
実行後、マップを構築できます。
roslaunch r3live my_data_r3live_bag.launch