1.6.1 单目相机使用
单目相机品牌型号众多,大家可自行采购,在ROS2中,单目相机的使用流程大致如下:
- 硬件准备;
- 软件安装;
- 功能包简介;
- 功能包使用。
1.硬件准备
首先将USB相机连接你的计算机(如果连接的是虚拟机,请注意相关设置)。
2.软件准备
安装USB摄像头相关功能包,调用指令如下:
sudo apt install ros-${ROS_DISTRO}-usb-cam
想要了解源码,也可以继续从 github 直接下载源码到工作空间的src目录:
git clone https://github.com/ros-drivers/usb_cam.git -b ros2
然后自行构建。
3.功能包简介
在usb_cam功能包中包含一个名为usb_cam_node_exe
的可执行文件和一个名为camera.launch.py
的launch文件,调用者可以通过二者启动相机驱动,其中,前者可以使用默认设置运行,或者也可以通过命令行设置特定参数,而后者则会直接加载默认参数文件:usb_cam/config/params.yaml,我们也可以根据需要自行修改此文件。
(1).启动相机节点
方式1:启动相机节点,可以直接调用如下指令。
ros2 run usb_cam usb_cam_node_exe
或可以指定参数(通过参数文件可以设置相机的一些属性信息):
ros2 run usb_cam usb_cam_node_exe --ros-args --params-file 参数文件路径
比如:
ros2 run usb_cam usb_cam_node_exe --ros-args --params-file /path/to/colcon_ws/src/usb_cam/config/params.yaml
或
ros2 run usb_cam usb_cam_node_exe --ros-args --params-file `ros2 pkg prefix --share usb_cam`/config/params.yaml
方式2:调用launch文件启动相机节点。
ros2 launch usb_cam camera.launch.py
(2).显示数据
启动rviz2
,添加image
插件,并将话题设置为:/image_raw
,如下图所示:
4.功能包使用
为了方便使用,我们还可以自行创建功能包。具体实现如下:
(1).新建功能包
调用如下指令,新建功能包:
ros2 pkg create mycar_cam --build-type ament_cmake --dependencies usb_cam
在功能包下新建launch与params目录,并修改功能包下的CMakeLists.txt文件,添加如下代码:
install(DIRECTORY params launch DESTINATION share/${PROJECT_NAME})
(2).编写launch文件
在launch目录下新建名为usb_cam.launch.py的launch文件,并输入如下内容:
import argparse
import os
from pathlib import Path # noqa: E402
import sys
# Hack to get relative import of .camera_config file working
dir_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(dir_path)
from camera_config import CameraConfig, USB_CAM_DIR # noqa: E402
from launch import LaunchDescription # noqa: E402
from launch.actions import GroupAction # noqa: E402
from launch_ros.actions import Node # noqa: E402
CAMERAS = []
CAMERAS.append(
CameraConfig(
name='camera1',
param_path=Path(USB_CAM_DIR, 'config', 'params_1.yaml'),
)
# Add more Camera's here and they will automatically be launched below
)
def generate_launch_description():
ld = LaunchDescription()
parser = argparse.ArgumentParser(description='usb_cam demo')
parser.add_argument('-n', '--node-name', dest='node_name', type=str,
help='name for device', default='usb_cam')
camera_nodes = [
Node(
package='usb_cam', executable='usb_cam_node_exe', output='screen',
name=camera.name,
namespace=camera.namespace,
parameters=[camera.param_path],
remappings=camera.remappings
)
for camera in CAMERAS
]
camera_group = GroupAction(camera_nodes)
ld.add_action(camera_group)
return ld
另外在launch目录下还需新建名为camera_config.py的文件,并输入如下内容:
from pathlib import Path
from typing import List, Optional
from ament_index_python.packages import get_package_share_directory
from pydantic import BaseModel, root_validator, validator
USB_CAM_DIR = get_package_share_directory('mycar_cam')
class CameraConfig(BaseModel):
name: str = 'camera1'
param_path: Path = Path(USB_CAM_DIR, 'config', 'params_1.yaml')
remappings: Optional[List] = None
namespace: Optional[str] = None
@validator('param_path')
def validate_param_path(cls, value):
if value and not value.exists():
raise FileNotFoundError(f'Could not find parameter file: {value}')
return value
@root_validator(skip_on_failure=True)
def validate_root(cls, values):
name = values.get('name')
remappings = values.get('remappings')
if name and not remappings:
# Automatically set remappings if name is set
remappings = [
('image_raw', f'{name}/image_raw'),
('image_raw/compressed', f'{name}/image_compressed'),
('image_raw/compressedDepth', f'{name}/compressedDepth'),
('image_raw/theora', f'{name}/image_raw/theora'),
('camera_info', f'{name}/camera_info'),
]
values['remappings'] = remappings
return values
(3).编写配置文件
在params目录下新建两个文件,分别名为:params_1.yaml和camera_info.yaml,在params_1.yaml中输入如下内容:
/**:
ros__parameters:
video_device: "/dev/video0"
framerate: 30.0
io_method: "mmap"
frame_id: "camera"
# pixel_format: "mjpeg2rgb" # see usb_cam/supported_formats for list of supported formats
pixel_format: "yuyv" # see usb_cam/supported_formats for list of supported formats
image_width: 640
image_height: 480
camera_name: "test_camera"
camera_info_url: "package://mycar_cam/config/camera_info.yaml"
brightness: -1
contrast: -1
saturation: -1
sharpness: -1
gain: -1
auto_white_balance: true
white_balance: 4000
autoexposure: true
exposure: 100
autofocus: false
focus: -1
在camera_info.yaml中输入如下内容:
image_width: 640
image_height: 480
camera_name: test_camera
camera_matrix:
rows: 3
cols: 3
data: [438.783367, 0.000000, 305.593336, 0.000000, 437.302876, 243.738352, 0.000000, 0.000000, 1.000000]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.361976, 0.110510, 0.001014, 0.000505, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [0.999978, 0.002789, -0.006046, -0.002816, 0.999986, -0.004401, 0.006034, 0.004417, 0.999972]
projection_matrix:
rows: 3
cols: 4
data: [393.653800, 0.000000, 322.797939, 0.000000, 0.000000, 393.653800, 241.090902, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
小提示:
在配置文件中包含了相机标定的部分信息,但是这部分内容在后面章节才有涉及,部分内容是直接复用了usb_cam中的内容。
(4).构建并执行
功能包构建后,执行launch文件即可,执行完毕即可在rviz2中查看图像信息。