ROS2로 카메라 캘리브레이션하기
소개
이번에는 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
Reference
이 문제에 관하여(ROS2로 카메라 캘리브레이션하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ponkotsu_TK/items/bf05569c50f53d78058f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Reference
이 문제에 관하여(ROS2로 카메라 캘리브레이션하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ponkotsu_TK/items/bf05569c50f53d78058f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
foxy
ros2 run opencv_cam opencv_cam_main --ros-args -p index:=2 -p width:=1280 -p height:=720
foxy
ros2 run camera_calibration cameracalibrator --size=9x6 --square=0.024 --approximate=0.1 --no-service-check --ros-args --remap /image:=/image_raw
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
tar -xvzf /tmp/calibrationdata.tar.gz
mv ost.txt camera.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
Reference
이 문제에 관하여(ROS2로 카메라 캘리브레이션하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ponkotsu_TK/items/bf05569c50f53d78058f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ost.txt
가 ini 파일로 사용할 수 있다는 것을 기억하고 싶습니다.질문이나 요청 등이 있으시면 본 사이트의 질문이나 트위터의 DM으로 부탁드립니다.
참고
ROS2
ROS 강좌 66 카메라 캘리브레이션하기
Akira's Study Room
clydemcqueen
opencv
image_pipeline
Reference
이 문제에 관하여(ROS2로 카메라 캘리브레이션하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ponkotsu_TK/items/bf05569c50f53d78058f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(ROS2로 카메라 캘리브레이션하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ponkotsu_TK/items/bf05569c50f53d78058f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)