ROS2 2D相机基于AprilTag实现3D空间定位最简流程

news2024/9/22 11:29:26

文章目录

  • 前言
  • 驱动安装
    • 下载安装
      • 方式一:
      • 方式二:
    • 相机检测
    • 配置config文件
    • 编译、运行程序
    • 注意
  • 内参标定
    • 标定板
    • 运行程序
  • apriltag空间定位
    • 标签打印
    • 下载安装
    • 可视化结果

前言

AprilTag是一种高性能的视觉标记系统,广泛应用于机器人导航、增强现实和自动化领域。类似于二维码,AprilTag标记由黑白图案组成,但其设计旨在提供更高的精度和更强的鲁棒性。通过相机识别和解码这些标记,可以实现精确的位置和姿态估计,从而使机器人或计算机视觉系统能够准确地感知和定位自身在环境中的位置。AprilTag因其高效性和可靠性,在现代机器人技术和自动化应用中扮演着重要角色。

本篇文章主要做了该套代码整体实现,整体架构如下:

本项目源代码在gitee1可以找到。

camera calibrate
usb camera
ROS2 tote detect app
apriltag ros2

驱动安装

下载安装

方式一:

使用v4l2-camera2,在 ROS 2 中使用 V4L2 相机,你可以使用 v4l2_camera 包。这个包提供了对 V4L2 设备的支持,使得你可以在 ROS 2 中轻松地读取和处理来自 USB 摄像头或其他视频设备的图像。

sudo apt-get install ros-${ROS_DISTRO}-v4l2-camera
sudo apt-get install ros-${ROS_DISTRO}-rqt-image-view

方式二:

使用usb-cam3包,在 ROS 2 中使用 USB 摄像头,可以使用 usb_cam 包。usb_cam 是一个常用的 ROS 节点,用于从 USB 摄像头读取图像并发布到 ROS 2 的图像话题中。下面是如何在 ROS 2 中安装和使用 usb_cam 包的步骤。

sudo apt-get install ros-${ROS_DISTRO}-usb-cam
sudo apt-get install ros-${ROS_DISTRO}-camera-calibration-parsers
sudo apt-get install ros-${ROS_DISTRO}-camera-info-manager
sudo apt-get install ros-${ROS_DISTRO}-rqt-image-view
sudo apt-get install ros-${ROS_DISTRO}-launch-testing-ament-cmake

本文采用方式二。

相机检测

# 安装V4l2工具包
$ sudo apt install v4l-utils
 
# 通过v4l2查看摄像头设备
$ sudo v4l2-ctl --list-devices
EP28WD (usb-fe380000.usb-1.3):
        /dev/video0
        /dev/video1
        
# 查看当前摄像头支持的视频压缩格式
$ sudo v4l2-ctl -d /dev/video0 --list-formats
        ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
 
        Index       : 1
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264
 
        Index       : 2
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
 
# 查看摄像头所有参数
$ sudo v4l2-ctl -d  /dev/video0 --all
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : EP28WD
        Bus info      : usb-fe380000.usb-1.3
        Driver version: 4.4.167
        Capabilities  : 0x84A00001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 640/480
        Pixel Format      : 'YUYV'
        Field             : None
        Bytes per Line    : 1280
        Size Image        : 614400
        Colorspace        : Default
        Transfer Function : Default
        YCbCr Encoding    : Default
        Quantization      : Default
        Flags             :
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 640, Height 480
        Default     : Left 0, Top 0, Width 640, Height 480
        Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 25.000 (25/1)
        Read buffers     : 0
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=64 step=1 default=36 value=36
                     saturation (int)    : min=0 max=128 step=1 default=64 value=64
                            hue (int)    : min=-40 max=40 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=72 max=500 step=1 default=100 value=100
                           gain (int)    : min=0 max=100 step=1 default=0 value=0
           power_line_frequency (menu)   : min=0 max=2 default=1 value=1
      white_balance_temperature (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=0 max=6 step=1 default=3 value=3
         backlight_compensation (int)    : min=0 max=2 step=1 default=1 value=1
                  exposure_auto (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute (int)    : min=1 max=5000 step=1 default=157 value=157 flags=inactive
         exposure_auto_priority (bool)   : default=0 value=1
         
    
 # 查看摄像头所支持的分辨率
 sudo v4l2-ctl --list-framesizes=MJPG -d /dev/video0
 ioctl: VIDIOC_ENUM_FRAMESIZES
    Size: Discrete 640x480   # Width/Height
    Size: Discrete 800x600
    Size: Discrete 1280x720
    Size: Discrete 1280x960
    Size: Discrete 1920x1080
    Size: Discrete 1600x1200
    Size: Discrete 2048x1536
    Size: Discrete 2592x1944
    Size: Discrete 3264x2448

配置config文件

/**:
    ros__parameters:
      video_device: "/dev/video2"
      framerate: 30.0
      io_method: "mmap"
      frame_id: "camera"
      pixel_format: "mjpeg2rgb"  # see usb_cam/supported_formats for list of supported formats
      av_device_format: "YUV422P"
      image_width: 1280
      image_height: 720
      camera_name: "camera"
      camera_info_url: "package://apriltag_setup/config/camera/camera_info_1.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

pixel_format有如下种类:

  • rgb8:
    RGB8 是最常见的彩色图像格式之一,表示每个像素由红、绿、蓝三个通道组成,每个通道占用 8 位(共 24 位)。
    适用于大多数彩色图像处理任务。
  • yuyv:
    YUYV 是一种 YUV 格式,用于压缩视频流。其中 Y 表示亮度,U 和 V 表示色度。
    通常用于视频编码和传输,因为它可以节省带宽。
  • yuyv2rgb:
    这是一个转换格式,表示从 YUYV 格式转换为 RGB 格式。
    用于在接收 YUYV 数据后将其转换为 RGB 格式以便进一步处理。
  • uyvy:
    UYVY 是另一种 YUV 格式,与 YUYV 类似,但顺序不同。
    也用于视频编码和传输。
  • uyvy2rgb:
    这是一个转换格式,表示从 UYVY 格式转换为 RGB 格式。
    用于在接收 UYVY 数据后将其转换为 RGB 格式以便进一步处理。
  • mono8:
    Mono8 是单通道灰度图像格式,每个像素占用 8 位。
    适用于灰度图像处理任务,如机器视觉和图像识别。
  • mono16:
    Mono16 是单通道灰度图像格式,每个像素占用 16 位。
    提供更高的精度,适用于需要高动态范围的应用。
  • y102mono8:
    这个格式不太常见,可能表示从 Y10(10 位 YUV)格式转换为 Mono8 格式。
    用于特定的图像处理任务。
  • raw_mjpeg:
    MJPEG(Motion JPEG)是一种基于 JPEG 的视频编码格式。
    通常用于低带宽环境下传输视频,因为它可以提供较好的压缩比。
  • mjpeg2rgb:
    这是一个转换格式,表示从 MJPEG 格式转换为 RGB 格式。
    用于在接收 MJPEG 数据后将其解码为 RGB 格式以便进一步处理。
  • m4202rgb:
    这个格式可能表示从 YUV420P 格式转换为 RGB 格式。
    用于在接收 YUV420P 数据后将其转换为 RGB 格式以便进一步处理。

选择哪种格式取决于你的具体应用场景和需求:

  • RGB8: 如果你需要彩色图像处理,可以选择 RGB8 格式。
  • YUYV/UYVY: 如果你需要压缩视频流以节省带宽,可以选择 YUYV 或 UYVY 格式。
  • Mono8/Mono16: 如果你需要灰度图像处理,可以选择 Mono8 或 Mono16 格式。
  • MJPEG: 如果你需要在低带宽环境下传输视频,可以选择 MJPEG 格式。

其中av_device_format选择YUV422P说明如下:

{stringify(AV_PIX_FMT_YUV422P), AV_PIX_FMT_YUV422P}, ///< planar YUV 4:2:2, 16bpp,
///< (1 Cr & Cb sample per 2x1 Y
///< samples)

源码中更多种类可以看github4库中的代码。

编译、运行程序

# 编译
colcon build --packages-up-to apriltag_bringup --cmake-args -DCMAKE_BUILD_TYPE=Release

# 运行
ros2 launch apriltag_bringup camera.launch.py

注意

若输出如下异常

--- stderr: image_publisher
/home/dev/workspace/cali_usb_cam/image_pipeline/image_publisher/src/image_publisher.cpp:39:10: fatal error: cv_bridge/cv_bridge.hpp: No such file or directory
   39 | #include "cv_bridge/cv_bridge.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

则安装

sudo apt-get install ros-${ROS_DISTRO}-cv-bridge

若输出如下异常

--- stderr: depth_image_proc
In file included from /home/dev/workspace/cali_usb_cam/image_pipeline/depth_image_proc/src/conversions.cpp:32:
/home/dev/workspace/cali_usb_cam/image_pipeline/depth_image_proc/include/depth_image_proc/conversions.hpp:38:10: fatal error: image_geometry/pinhole_camera_model.hpp: No such file or directory
   38 | #include "image_geometry/pinhole_camera_model.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

则安装

sudo apt-get install ros-${ROS_DISTRO}-image-geometry

内参标定

标定板

根据自己的标定板下载,博主这里通过官网在线生成6x9边长45mm的棋盘格

在这里插入图片描述

运行程序

棋盘格虽然为6x9但是在launch时–size写5x8,在launch usb camera的基础上,运行标定节点:

ros2 run camera_calibration cameracalibrator --size 5x8 --square 0.045 --ros-args --remap /image:=/camera1/image_raw --ros-args --remap /camera:=/camera1

移动到不同的位置,采集足够的图片,后点击CALIBRATE后生成如下:

在这里插入图片描述

点击SAVE保存文件到/tmp/calibrationdata.tar.gz,解压后如下:

在这里插入图片描述

*** Added sample 80, p_x = 0.571, p_y = 0.386, p_size = 0.294, skew = 0.260
**** Calibrating ****
mono pinhole calibration...
D = [0.02255013468344289, -0.0068047149118532135, -0.013297997856020293, -0.0029520999960376574, 0.0]
K = [1252.9399874377705, 0.0, 717.7071690172635, 0.0, 1255.0889798056107, 296.7735944722159, 0.0, 0.0, 1.0]
R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P = [1268.94091796875, 0.0, 713.5385965108289, 0.0, 0.0, 1264.5770263671875, 288.0021457495968, 0.0, 0.0, 0.0, 1.0, 0.0]
None
# oST version 5.0 parameters


[image]

width
1280

height
720

[narrow_stereo]

camera matrix
1252.939987 0.000000 717.707169
0.000000 1255.088980 296.773594
0.000000 0.000000 1.000000

distortion
0.022550 -0.006805 -0.013298 -0.002952 0.000000

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
1268.940918 0.000000 713.538597 0.000000
0.000000 1264.577026 288.002146 0.000000
0.000000 0.000000 1.000000 0.000000

('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

其中ost.yaml是最终标定的结果,内容如下:

image_width: 1280
image_height: 720
camera_name: narrow_stereo
camera_matrix:
  rows: 3
  cols: 3
  data: [1252.93999,    0.     ,  717.70717,
            0.     , 1255.08898,  296.77359,
            0.     ,    0.     ,    1.     ]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.022550, -0.006805, -0.013298, -0.002952, 0.000000]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1., 0., 0.,
         0., 1., 0.,
         0., 0., 1.]
projection_matrix:
  rows: 3
  cols: 4
  data: [1268.94092,    0.     ,  713.5386 ,    0.     ,
            0.     , 1264.57703,  288.00215,    0.     ,
            0.     ,    0.     ,    1.     ,    0.     ]

保存该数据到apriltag_setup/config/camera/camera_info_1.yaml中。

apriltag空间定位

标签打印

April Tag generator (chaitanyantr.github.io)

在这里插入图片描述

在这里插入图片描述

下载安装

git clone https://github.com/AprilRobotics/apriltag.git

# 编译
cmake -B build -DCMAKE_BUILD_TYPE=Release
# 安装
sudo cmake --build build --target install
git clone https://github.com/Adlink-ROS/apriltag_ros.git
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release

ros2 launch apriltag_ros tag_realsense.launch.py camera_name:=/camera1 image_topic:=image_raw

ros2-gbp/apriltag_msgs-release at release/humble/apriltag_msgs (github.com)

此文章包含对于定位精度的分析:ROS学习笔记(实践二)–AprilTag_ros包的使用_apriltag ros-CSDN博客

可视化结果

在这里插入图片描述


  1. AprilTag usb cam: 本文用来记录全套配置usb相机如何实现连接,标定,apriltag空间定位全流程。 (gitee.com) ↩︎

  2. ROS2下进行单目相机标定_海康 humble-CSDN博客 ↩︎

  3. GitHub - ros-drivers/usb_cam: A ROS Driver for V4L2 USB Cameras ↩︎

  4. usb_cam/include/usb_cam/formats/av_pixel_format_helper.hpp at ros2 · ros-drivers/usb_cam · GitHub ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简述CCS平面线性光源

光源在机器视觉系统中起着重要作用&#xff0c;不同环境、场景及应用合适光源都不一样&#xff0c;今天我们来看看LFX3-PT系列平面线性光源。它是最适合检测镜面物体的凹凸,外壳小巧的光源。备有根据检测条件可选的2种线间距。1mm型&#xff08;型号末尾&#xff1a;A&#xff…

【ArcGIS Pro第一期】界面简介

ArcGIS Pro简介 ArcGIS Pro界面简介1.1 打开工程1.2 使用功能区上的工具 参考 ArcGIS Pro 是一种基于功能区的应用程序。 ArcGIS Pro 窗口顶部的功能区有许多命令可供选择&#xff0c;而根据需要打开的各个窗格&#xff08;可停靠窗口&#xff09;中则提供了更为高级或专用的功…

erlang学习:用ETS和DETS存储数据

作用 ets和dets是两个系统模块&#xff0c;可以用来高效存储海量的Erlang数据。 ETS和DETS执行的任务基本相同&#xff1a;它们提供大型的键值查询表。ETS常驻内存&#xff0c;DETS则常驻磁盘。ETS是相当高效的&#xff1a;可以用它存储海量的数据&#xff08;只要有足够的内…

ACM模式 输入输出练习

牛客-练习地址 第一题 let cnt readline(); while(cnt--){let input readline()let arr input.split( ).map(Number)console.log(arr[0]arr[1]) }第二题 let cnt readline(); while(cnt--){let input readline()let arr input.split( ).map(Number)console.log(arr[0]ar…

Web攻防之应急响应(二)

目录 前提 &#x1f354;学习Java内存马前置知识 内存马 内存马的介绍 内存马的类型众多 内存马的存在形式 Java web的基础知识&#xff1a; Java内存马的排查思路&#xff1a; &#x1f354;开始查杀之前的需要准备 1.登录主机启动服务器 2.生成jsp马并连接成功 …

vivado 创建时间约束1

步骤3&#xff1a;创建时间约束 在此步骤中&#xff0c;您打开合成的设计并使用AMD Vivado™定时约束 男巫定时约束向导分析门级网表并发现缺失 约束。使用“定时约束”向导为此设计生成约束。 1.在“流导航器”中&#xff0c;单击“打开综合设计”。 2.当综合设计打开时&#…

六、MySQL高级—架构介绍(1)

&#x1f33b;&#x1f33b; 目录 一、Mysql 简介1.1 概述1.2 Mysql 高手是怎样炼成的 二、Mysql Linux 版的安装2.1 mysql5.52.2 mysql5.7 三、Mysql 的用户与权限管理3.1 MySQL的用户管理3.2 权限管理3.3 通过工具远程访问 四、 Mysql的一些杂项配置(了解)五、 Mysql 逻辑架构…

[UVM]3.核心基类 uvm_object 域的自动化 copy() compare() print() pack unpack

1.核心基类&#xff1a;uvm_object &#xff08;1&#xff09;虚类只能声明&#xff0c;不能例化。 &#xff08;2&#xff09;uvm_object提供的方法 2.域的自动化&#xff08;field automation&#xff09; &#xff08;1&#xff09;简述 &#xff08;2&#xff09;示例 格…

JVM5-垃圾回收

自动垃圾回收 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏&#xff0c;称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收 内存泄漏指的是不再…

进一步了解CSS布局——WEB开发系列29

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。 一、正常布局流&#xff08;Normal Flow&#xff09; CSS的布局基础是“正常流”&#xff0c;也就是页面元素在没有特别指定布局方式时的默认排列…

OPenCV结构分析与形状描述符(3)计算一个点集的最小外接矩形的函数boundingRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算一个点集的最小右上边界矩形或灰度图像中的非零像素。 该函数计算并返回指定点集或灰度图像中非零像素的最小右上边界矩形。 在OpenCV中&am…

[项目][CMP][项目介绍及知识铺垫]详细讲解

目录 1.这个项目做的是什么&#xff1f;2.此项目涉及知识面3.什么是内存池&#xff1f;1.池化技术2.内存池3.内存池主要解决的问题 4.理解malloc 1.这个项目做的是什么&#xff1f; 实现一个高并发内存池&#xff0c;参考原型为Google的一个开源项目tcmalloc(Thread-Caching M…

61、Python之函数高级:为函数添加方法,实现属性可变的装饰器

引言 今天文章的标题&#xff0c;初读起来可能有些拗口&#xff0c;什么叫“为函数添加方法”&#xff1f;但是&#xff0c;如果真正对“Python函数也是对象”这个理念有清晰的理解的话&#xff0c;其实&#xff0c;也是不难理解的&#xff0c;本质上就是给一个对象新增一个自…

通用代码生成器还可以这么用,将MariaDB数据库连数据迁徙到PostgreSQL

通用代码生成器是一种非常方便的软件开发工具&#xff0c;除了简单直接的生成代码&#xff0c;制作快速原型以外。通用代码生成器还可以应用在各种场景上。比如可以使用通用代码生成器&#xff0c;将MariaDB数据库连数据迁徙到PostgreSQL。操作并不复杂&#xff0c;却十分适用。…

【学习笔记】SSL证书之混合加密(Hybrid Encryption)与签名(Signatures)

1、非对称密钥对可以用来进行加密&#xff08;Confidentiality保密性&#xff09; 举个栗子&#xff0c;现在有2个人&#xff0c;Pam和Jim&#xff0c;两人之间需要通过非对称密钥对来给另一方发送数据。Pam通过某种途径将公钥分享给Jim&#xff0c;两人都各自保存着自己的私钥…

算法打卡 Day29(回溯算法)-复原 IP 地址 + 子集 + 子集 Ⅱ

文章目录 Leetcode 93-复原 IP 地址题目描述解题思路 Leetcode 78-子集题目描述解题思路 Leetcode 90-子集 Ⅱ题目描述解题思路 Leetcode 93-复原 IP 地址 题目描述 https://leetcode.cn/problems/restore-ip-addresses/description/ 解题思路 这是一道切割问题&#xff0c;…

【ShuQiHere】“初识人工智能:智能机器的基础入门”

1.1. 引言 (Introduction) &#x1f9e0;&#x1f916; 人工智能&#xff08;Artificial Intelligence, AI&#xff09; 是计算机科学的一个分支&#xff0c;目标是让计算机或机器具备像人类一样的智能。自计算机发明以来&#xff0c;计算机执行各种任务的能力呈指数增长。随着…

思科IP访问控制列表2

#网络安全技术实现# #任务二标准访问控制列表的控制2# #1配置计算机的IP 地址、子网掩码和网关 #2配置Router-A的主机名称和接口IP地址 Router>enable Router#config t Router(config)#hostname Router-A Router-A(config)#int g0/0 Router-A(config-if)#ip add 192.1…

iKun主页 最新2.0版本 无需数据库 带页面音乐版本~

源码介绍 iKun主页 最新2.0版本 无需数据库 带页面音乐版本~ 无需数据库&#xff0c;没有后台 记事本修改里面的内容即可 效果预览 源码获取 iKun主页 最新2.0版本 无需数据库 带页面音乐版本~

Seataf分布式事务的使用

一、事务的四大特征&#xff08;面试题&#xff09; 原子性&#xff1a;一个事务是不可分割的&#xff0c;要不都做&#xff0c;要不都不做一致性&#xff1a;事务必须是使数据库从一个一致性变成另一个一致性状态隔离性&#xff1a;一个事务的执行不被其他事务干扰&#xff0…