ROS2+OpenCV综合应用--10. AprilTag标签码追踪

devtools/2025/1/8 13:30:37/

1. 简介

        apriltag标签码追踪是在apriltag标签码识别的基础上,增加了小车摄像头云台运动的功能,摄像头会保持标签码在视觉中间而运动,根据这一特性,从而实现标签码追踪功能。

2. 启动

2.1 程序启动前的准备

        本次apriltag标签码使用的是TAG36H11格式,出厂已配套相关标签码,并贴在积木块上,需要将积木块拿出来放置到摄像头画面识别。

2.2 程序说明

        程序启动后,摄像头捕获到图像,将标签码放入摄像头画面,系统会识别并框出标签码的四个顶点,并显示标签码的ID号。然后缓慢移动积木块的位置,摄像头云台会跟着积木块移动。

注意:积木块移动时,标签码要对着摄像头,并且移动速度不可以太快,避免摄像头云台跟不上。

2.3 程序启动

打开一个终端输入以下指令进入docker,

./docker_ros2.sh

出现以下界面就是进入docker成功

image-20240814152903441

在docker终端输入以下命令启动程序

ros2 launch yahboomcar_apriltag apriltag_tracking.launch.py

3. 源码

#!/usr/bin/env python3
# encoding: utf-8
import cv2 as cv
import time
from dt_apriltags import Detector
from yahboomcar_apriltag.vutils import draw_tags
import logging
import yahboomcar_apriltag.logger_config as logger_config
import rclpy
from rclpy.node import Node
from std_msgs.msg import String, Float32MultiArray
​
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import yahboomcar_apriltag.fps as fps
import numpy as np
from yahboomcar_apriltag.vutils import draw_tags
from dt_apriltags import Detector
from yahboomcar_apriltag.PID import PositionalPID
from Raspbot_Lib import Raspbot
import math
​
class TagTrackingNode(Node):def __init__(self):super().__init__('tag_tracking_node')# 初始化 Raspbot 实例self.bot = Raspbot()self.bridge = CvBridge()self.xservo_pid = PositionalPID(0.6, 0.2, 0.01)  # PID控制器用于X轴self.yservo_pid = PositionalPID(0.8, 0.6, 0.01)  # PID控制器用于Y轴self.numx=self.numy=1target_servox = 90target_servoy = 25self.bot.Ctrl_Servo(1,target_servox)self.bot.Ctrl_Servo(2,target_servoy)self.at_detector = Detector(searchpath=['apriltags'],families='tag36h11',nthreads=8,quad_decimate=2.0,quad_sigma=0.0,refine_edges=1,decode_sharpening=0.25,debug=0)self.fps = fps.FPS()  # 帧率统计器
​self.subscription = self.create_subscription(Image,'/image_raw',self.image_callback,100)self.subscription  
​def image_callback(self, ros_image):# cv_bridge try:cv_image = self.bridge.imgmsg_to_cv2(ros_image, desired_encoding='bgr8')except Exception as e:self.get_logger().error(f"Failed to convert image: {e}")return
​# 使用 AprilTags 检测器tags = self.at_detector.detect(cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY), False, None, 0.025)tags = sorted(tags, key=lambda tag: tag.tag_id)
​# 绘制标签result_image = draw_tags(cv_image, tags, corners_color=(0, 0, 255), center_color=(0, 255, 0))
​# 处理 AprilTagsif len(tags) == 1:x, y, w, h = tags[0].bboxif math.fabs(180 - (x + w/2)) > 20:#调试方块半径    Debug Block Radiusself.xservo_pid.SystemOutput = x + w/2self.xservo_pid.SetStepSignal(350)self.xservo_pid.SetInertiaTime(0.01, 0.1)target_valuex =  int(1000+self.xservo_pid.SystemOutput)target_servox = int((target_valuex)/10)#self.get_logger().info('x = {}'.format([x + w/2]))#self.get_logger().info('joints_x = {} {}'.format([target_servox],[target_valuex]))if target_servox > 180:target_servox = 180if target_servox < 0:target_servox = 0self.bot.Ctrl_Servo(1, target_servox)
​if math.fabs(180 - (y + h/2)) > 20: #调试方块半径    Debug Block Radiusself.yservo_pid.SystemOutput = y + h/2self.yservo_pid.SetStepSignal(220)self.yservo_pid.SetInertiaTime(0.01, 0.1)target_valuey = int(650+self.yservo_pid.SystemOutput)target_servoy = int((target_valuey)/10)#self.get_logger().info('joints_y = {} {}'.format([target_servoy],[target_valuey]))                if target_servoy > 110:target_servoy = 110if target_servoy < 0:target_servoy = 0self.bot.Ctrl_Servo(2, target_servoy)# 更新并显示 FPSself.fps.update()self.fps.show_fps(result_image)cv2.imshow("result_image", result_image)key = cv2.waitKey(1)if key != -1:cv2.destroyAllWindows()
​
def main(args=None):rclpy.init(args=args)
​tag_tracking_node = TagTrackingNode()
​try:rclpy.spin(tag_tracking_node)except KeyboardInterrupt:tag_tracking_node.bot.Ctrl_Servo(1, 90)tag_tracking_node.bot.Ctrl_Servo(2, 25)pass
​
if __name__ == '__main__':main()


http://www.ppmy.cn/devtools/148270.html

相关文章

信创云之天翼云:引领信创云时代的先锋力量

数据显示&#xff0c;2024年中国云服务市场规模已达到4242.5亿元&#xff0c;显示出各行业对信息技术软硬件的依赖程度不断加深。在国家政策的持续支持下&#xff0c;数字化转型为云服务行业带来了前所未有的发展机遇。预计到2025年&#xff0c;中国云服务市场规模将突破4795.4…

《Opencv》基础操作详解(4)

目录 22、图像形态学操作 &#xff08;1&#xff09;、顶帽&#xff08;原图-开运算&#xff09; 公式&#xff1a; 应用场景&#xff1a; 代码示例&#xff1a; &#xff08;2&#xff09;、黑帽&#xff08;闭运算-原图&#xff09; 公式&#xff1a; 应用场景&#x…

【LLM】概念解析 - Tensorflow/Transformer/PyTorch

背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面&#xff0c;对深度学习框架 TensorFlow、PyTorch 和基于深度学习的模型 Transformer 进行比较。主要作用是基础概念扫盲。 一、 算法原理对比 Transformer Transformer 是一种基于深度学习的…

wordpress主题开发之function.php的10大作用

文章目录 1. 添加自定义功能2. 启用或禁用功能支持3. 添加自定义样式和脚本4. 过滤和修改默认行为5. 添加自定义短代码6. 注册自定义管理功能7. 添加 REST API 扩展8. 优化性能9. 集成第三方服务10. 创建自定义功能模块注意事项 在 WordPress 中&#xff0c; functions.php 文…

golang 编程规范 - 项目目录结构

原文&#xff1a;https://makeoptim.com/golang/standards/project-layout 目录结构 Go 目录 cmdinternalpkgvendor 服务端应用程序目录 api Web 应用程序目录 web 通用应用程序目录 buildconfigsdeploymentsinitscriptstest 其他目录 assetsdocsexamplesgithooksthird_par…

基于单片机的仓库环境无线监测系统(论文+源码)

1 系统方案设计 根据系统功能的设计要求&#xff0c;展开仓库环境无线监测系统设计。系统以STM32单片机作为主控核心&#xff0c;通过DHT11温湿度传感器、CO2传感器、光敏电阻实现仓储环境数据的温度、湿度、CO2浓度、光照强度监测&#xff0c;监测数据不仅能够通过OLED液晶实时…

你喜欢看哪类的网上视频教程?

作为前端开发&#xff0c;我通常喜欢看以下几类网上视频教程&#xff1a; 技术框架和库教程&#xff1a;例如React、Vue、Angular等前端框架的教程。这些教程能帮助我深入了解这些框架的工作原理&#xff0c;以及如何高效地使用它们来开发Web应用。 CSS和JavaScript高级技巧&a…

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…