ROS2로 카메라 캘리브레이션하기

안녕하세요, Ponkotsu_TK입니다.

소개



이번에는 ROS2(Foxy)로 카메라의 왜곡을 보정하고 싶습니다.

환경은 다음과 같습니다.


품목



우분투
20.04

ROS
Foxy


설치에 대해서는 ROS1과 ROS2의 환경 구축의 ROS2를 참조하십시오.

설치


cd ~/ros2_ws/src/
git clone https://github.com/ros-perception/image_pipeline.git
mkdir ~/ros2_ws/ros2_camera_driver/
cd ~/ros2_ws/ros2_camera_driver/
git clone https://github.com/clydemcqueen/opencv_cam.git
git clone https://github.com/ptrmu/ros2_shared.git

foxy
colcon build
foxy 명령은 이전에 작성한 환경 작성 명령입니다.

왜곡 측정



ROS2로 왜곡의 측정을 실시합니다.

검사기 보드 인쇄



3차원 공간에 형상이 알려진 물체와 화상 평면에서의 대응을 이용하여 카메라의 내부 파라미터를 추정합니다.
자세히 알고 싶은 분은 다음 논문
"A flexible new technique for camera calibration". IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.

검사기 보드는 pattern.png을 A4 크기로 인쇄하여 사용했습니다.

왜곡 추정



터미널에서 카메라를 시작합니다.
foxy
ros2 run opencv_cam opencv_cam_main --ros-args -p index:=2 -p width:=1280 -p height:=720

여기서 index:=2/dev/video2 의 장치를 참조합니다. 기본적으로 /dev/video0입니다.

다음으로 다른 터미널에서
foxy
ros2 run camera_calibration cameracalibrator --size=9x6 --square=0.024 --approximate=0.1 --no-service-check  --ros-args --remap /image:=/image_raw
size 는 교점의 수이고 square 는 매스의 한 변의 길이입니다.
자세한 내용은 터미널에서 ros2 run camera_calibration cameracalibrator -h를 실행하십시오.

터미널에서 GUI가 생성되면 측정을 시작합니다.


다양한 움직여 오른쪽 상단의 게이지를 늘리십시오. 그런 다음 CALIBRATE 를 눌러 계산을 시작합니다.
내 환경에서는 계산에 10분 정도 걸렸습니다.
SAVE를 누르면,
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

와 터미널에 출력되므로 압축 해제 및 수정합니다.
tar -xvzf /tmp/calibrationdata.tar.gz
mv ost.txt camera.ini

* ost.txt는 ini 파일로 사용할 수 있습니다.
그리고 파일을 열고 수정
vim camera.ini
[camera]       #書き換え前
  ↓
[narrow_stereo] #書き換え後

왜곡 보정



그러면 방금 작성한 파라미터를 이용하여 왜곡 보정을 합니다.

준비 (launch 파일)



왜곡 보정을 위한 launch 파일을 만듭니다.

image_proc.launch.py
# Copyright (c) 2020, Open Source Robotics Foundation, Inc.
# All rights reserved.
#
# Software License Agreement (BSD License 2.0)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#  * Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.conditions import LaunchConfigurationEquals
from launch.conditions import LaunchConfigurationNotEquals
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import ComposableNodeContainer
from launch_ros.actions import LoadComposableNodes
from launch_ros.descriptions import ComposableNode


def generate_launch_description():
    composable_nodes = [
        ComposableNode(
            package='image_proc',
            plugin='image_proc::DebayerNode',
            name='debayer_node',
        ),
        ComposableNode(
            package='image_proc',
            plugin='image_proc::RectifyNode',
            name='rectify_color_node',
            # Remap subscribers and publishers
            remappings=[
                ('image', '/usb_cam/image_raw'),
                ('camera_info', '/usb_cam/camera_info'),
                ('image_rect', 'image_rect_color')
            ],
        )
    ]

    arg_container = DeclareLaunchArgument(
        name='container', default_value='',
        description=(
            'Name of an existing node container to load launched nodes into. '
            'If unset, a new container will be created.'
        )
    )

    # If an existing container is not provided, start a container and load nodes into it
    image_processing_container = ComposableNodeContainer(
        condition=LaunchConfigurationEquals('container', ''),
        name='image_proc_container',
        namespace='',
        package='rclcpp_components',
        executable='component_container',
        composable_node_descriptions=composable_nodes,
        output='screen'
    )

    # If an existing container name is provided, load composable nodes into it
    # This will block until a container with the provided name is available and nodes are loaded
    load_composable_nodes = LoadComposableNodes(
        condition=LaunchConfigurationNotEquals('container', ''),
        composable_node_descriptions=composable_nodes,
        target_container=LaunchConfiguration('container'),
    )

    return LaunchDescription([
        arg_container,
        image_processing_container,
        load_composable_nodes,
    ])

이것으로 준비가 완료됩니다.

실행



첫 번째 터미널에서
foxy
ros2 run opencv_cam opencv_cam_main --ros-args -p index:=2 -p width:=1280 -p height:=720 --remap __ns:=/usb_cam  -p camera_info_path:=${CAMERA_PARAM_PATH}/camera.ini
${CAMERA_PARAM_PATH} 에서는 camera.ini 에 경로를 통해 주세요.

두 번째 터미널에서
foxy
ros2 launch image_proc.launch.py

세 번째 터미널에서
foxy
ros2 run  image_tools showimage  /image:=/image_rect_color

결과



다음과 같이 되었습니다.



카메라에서 보정하는 프로그램을 통해 이미지가 출력됩니다.

마지막으로


ost.txt가 ini 파일로 사용할 수 있다는 것을 기억하고 싶습니다.

질문이나 요청 등이 있으시면 본 사이트의 질문이나 트위터의 DM으로 부탁드립니다.

참고



ROS2
ROS 강좌 66 카메라 캘리브레이션하기
Akira's Study Room
clydemcqueen
opencv
image_pipeline

좋은 웹페이지 즐겨찾기