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

文章目录

  • 前言
  • 驱动安装
    • 下载安装
      • 方式一:
      • 方式二:
    • 相机检测
    • 配置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-formatsioctl: VIDIOC_ENUM_FMTIndex       : 0Type        : Video CapturePixel Format: 'YUYV'Name        : YUYV 4:2:2Index       : 1Type        : Video CapturePixel Format: 'H264' (compressed)Name        : H.264Index       : 2Type        : Video CapturePixel Format: 'MJPG' (compressed)Name        : Motion-JPEG# 查看摄像头所有参数
$ sudo v4l2-ctl -d  /dev/video0 --all
Driver Info (not using libv4l2):Driver name   : uvcvideoCard type     : EP28WDBus info      : usb-fe380000.usb-1.3Driver version: 4.4.167Capabilities  : 0x84A00001Video CaptureStreamingExtended Pix FormatDevice CapabilitiesDevice Caps   : 0x04200001Video CaptureStreamingExtended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:Width/Height      : 640/480Pixel Format      : 'YUYV'Field             : NoneBytes per Line    : 1280Size Image        : 614400Colorspace        : DefaultTransfer Function : DefaultYCbCr Encoding    : DefaultQuantization      : DefaultFlags             :
Crop Capability Video Capture:Bounds      : Left 0, Top 0, Width 640, Height 480Default     : Left 0, Top 0, Width 640, Height 480Pixel 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     : timeperframeFrames per second: 25.000 (25/1)Read buffers     : 0brightness (int)    : min=-64 max=64 step=1 default=0 value=0contrast (int)    : min=0 max=64 step=1 default=36 value=36saturation (int)    : min=0 max=128 step=1 default=64 value=64hue (int)    : min=-40 max=40 step=1 default=0 value=0white_balance_temperature_auto (bool)   : default=1 value=1gamma (int)    : min=72 max=500 step=1 default=100 value=100gain (int)    : min=0 max=100 step=1 default=0 value=0power_line_frequency (menu)   : min=0 max=2 default=1 value=1white_balance_temperature (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactivesharpness (int)    : min=0 max=6 step=1 default=3 value=3backlight_compensation (int)    : min=0 max=2 step=1 default=1 value=1exposure_auto (menu)   : min=0 max=3 default=3 value=3exposure_absolute (int)    : min=1 max=5000 step=1 default=157 value=157 flags=inactiveexposure_auto_priority (bool)   : default=0 value=1# 查看摄像头所支持的分辨率sudo v4l2-ctl --list-framesizes=MJPG -d /dev/video0ioctl: VIDIOC_ENUM_FRAMESIZESSize: Discrete 640x480   # Width/HeightSize: Discrete 800x600Size: Discrete 1280x720Size: Discrete 1280x960Size: Discrete 1920x1080Size: Discrete 1600x1200Size: Discrete 2048x1536Size: Discrete 2592x1944Size: Discrete 3264x2448

配置config文件

/**:ros__parameters:video_device: "/dev/video2"framerate: 30.0io_method: "mmap"frame_id: "camera"pixel_format: "mjpeg2rgb"  # see usb_cam/supported_formats for list of supported formatsav_device_format: "YUV422P"image_width: 1280image_height: 720camera_name: "camera"camera_info_url: "package://apriltag_setup/config/camera/camera_info_1.yaml"brightness: -1contrast: -1saturation: -1sharpness: -1gain: -1auto_white_balance: truewhite_balance: 4000autoexposure: trueexposure: 100autofocus: falsefocus: -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 directory39 | #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 directory38 | #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
1280height
720[narrow_stereo]camera matrix
1252.939987 0.000000 717.707169
0.000000 1255.088980 296.773594
0.000000 0.000000 1.000000distortion
0.022550 -0.006805 -0.013298 -0.002952 0.000000rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000projection
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: 3cols: 3data: [1252.93999,    0.     ,  717.70717,0.     , 1255.08898,  296.77359,0.     ,    0.     ,    1.     ]
distortion_model: plumb_bob
distortion_coefficients:rows: 1cols: 5data: [0.022550, -0.006805, -0.013298, -0.002952, 0.000000]
rectification_matrix:rows: 3cols: 3data: [1., 0., 0.,0., 1., 0.,0., 0., 1.]
projection_matrix:rows: 3cols: 4data: [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=Releaseros2 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.rhkb.cn/news/416659.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI中IC-Light节点的Detail Transfer节点参数测试

&#x1f386;背景 ic-light是一个能重绘画面光影的节点&#xff0c;但是在重绘的过程中&#xff0c;难免会将图像本身的细节进行重绘&#xff0c;尤其是在电商的场景中&#xff0c;文字和商品的细节很多时候会被重绘的乱七八糟。 针对这种情况&#xff0c;Comfyui-IC-Light节…

Java Web全栈开发技术指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Java Web开发涉及前端JavaScript、后端Java Servlet、JSP等技术。本指南涵盖了JavaScript、JSP、Servlet、MVC模式、Web容器、HTML/CSS/JS、AJAX、RESTful API、JSON、前后端分离、数据库连接和操作以及安全性等…

Mysql8.0安装以及递归表达式使用

mysql安装 以centos7为例安装&#xff01; 安装wget yum install wget -y 给CentOS添加rpm源&#xff0c;并且选择较新的源 官网地址 wget dev.mysql.com/get/mysql84-community-release-el7-1.noarch.rpm 下载安装的rpm源文件 yum install mysql84-community-release-el7-1.no…

国有企业如何高效开展虚假贸易排查?

▶虚假贸易排查最新动向 2023年10月&#xff0c;有关文件提出“十不准”&#xff0c;严禁央企开展各类虚假贸易业务。 2024年5月&#xff0c;明确表示将依法加大对排斥限制潜在投标人、规避招标、串通投标、以行贿手段谋取中标等违法犯罪行为的惩处力度。 2024年7月&#xf…

深智城基于超融合数据库MatrixOne的一站式交通大数据平台改造

在智慧交通应用中&#xff0c;数据处理需求极为复杂&#xff0c;涉及人、车辆、道路和环境等多个方面&#xff0c;产生了大量异构数据。交通管理人员需要对这些数据进行实时分析和决策&#xff0c;以应对各种交通事件。然而&#xff0c;在实际生产中会发现数据处理缺陷、管理复…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…

信息安全发展阶段与形式

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;信息安全的发展阶段 信息安全的发展阶段可以参照下面的思维导图&#xff1a; 0x02&#xff1a;我国的信息安全形式 2013 年&#xff0c;“棱镜门” 事件在全球持续发酵&#xf…

idea配置连接数据库的操作方法(适配不同版本)

文章目录 一、IDEA找不到database图标的解决方法二、链接数据库 一、IDEA找不到database图标的解决方法 首先很多小伙伴说我左右侧边栏都找了找不到数据库图标 解决办法&#xff1a; 第一种&#xff1a;选择 View --> Tool Windows --> Database 如果你的idea版本在这里…

ASP源码 发布站改制最终版 原来3000ok网通大站的源程序

ASP源码 新服发布站改制最终版 原来3000ok网通大站的源程序 这个是非常完整 兼容性很强的。 后台地址&#xff1a;http://你的域名/admin 账号&#xff1a;admin 密码&#xff1a;admin 会员发布地址&#xff1a;http://你的域名/gamevip 源码下载&#xff1a;https://downlo…

Splasthop 安全远程访问帮助企业对抗 Cobalt Strike 载荷网络攻击

一、背景 根据 FreeBuf&#xff08;标题为&#xff1a;潜藏系统2个月未被发现&#xff0c;新型网络攻击瞄准中国高价值目标&#xff09;和 The Hacker News&#xff08;标题为&#xff1a;New Cyberattack Targets Chinese-Speaking Businesses with Cobalt Strike Payloads&a…

『功能项目』项目优化【21】

我们打开上一篇20主角身旁召唤/隐藏坐骑的项目&#xff0c; 本章要做的事情如以下几点&#xff1a; 1.优化资源包Resources下的层级分类 2.优化脚本包Scripts下的脚本分类 3.地形Terrain的优化&#xff08;只让主角点击地面移动跳过其他石头山树等其他物体&#xff09; 首…

Windows系统下的Spark环境配置

一&#xff1a;Spark的介绍 Apache Spark 是一个开源的分布式大数据处理引擎&#xff0c;它提供了一整套开发API&#xff0c;包括流计算和机器学习。Spark 支持批处理和流处理&#xff0c;其显著特点是能够在内存中进行迭代计算&#xff0c;从而加快数据处理速度。尽管 Spark …

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要&#xff0c;保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…

0.3 学习Stm32经历过的磨难

文章目录 用库函数传参 能否按位或STM32库函数XXX_GetFlagStatus和XXX_GetITStatus的区别关于MDK导入文件后报错 Browse information of one files is not available 用库函数传参 能否按位或 答案是看清况&#xff0c;而不是一股脑的写&#xff01;&#xff08;血泪的经验啊&…

以太网通信之UDP

免责声明&#xff1a; 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…

DML、DQL、DCL的基础介绍

1.DML、DQL、DCL 1.1DML-介绍 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改操作 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除数据&#xff08;DEL…

github中action作用和讲解

1&#xff0c;简介 GitHub Actions 是 GitHub 的一个自动化功能&#xff0c;它允许你在 GitHub 仓库中自动执行软件开发工作流程。你可以使用 GitHub Actions 来执行各种任务&#xff0c;比如&#xff1a; 自动测试&#xff1a;每当代码被推送到仓库时&#xff0c;自动运行测试…

SpringBoot2:RESTFUL风格接口开发及源码解读

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…

开源vscode AI插件

1、twinny - AI Code Completion and Chat 2、Continue - Codestral, Claude, and more 3、Cody: AI Coding Assistant with Autocomplete & Ch

报错:java:程序包org.springframework.boot不存在

Date: 2024.08.31 18:01:20 author: lijianzhan 简述&#xff1a;关于java:程序包org.springframework.boot不存在问题如何进行修复。 操作如下&#xff1a; 点击左侧菜单栏选择设置&#xff0c;弹框内选择构建,执行&#xff0c;部署----->构建工具点击Maven按键&#xf…