ROS节点检测ArUco标签并记录空间坐标

本文涉及的产品
资源编排,不限时长
简介: 利用Realsense D435i相机检测ArUco标签,使用Python程序订阅相机的ROS话题,记录Time和标签的XYZ值,储存在一个csv文件中;当出现识别不到标签或者反馈坐标为0,0,0的情况时,不进行记录。

实验目的:

利用Realsense D435i相机检测ArUco标签,使用Python程序订阅相机的ROS话题,记录Time和标签的XYZ值,储存在一个csv文件中;当出现识别不到标签或者反馈坐标为0,0,0的情况时,不进行记录。

程序内容:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import csv
from sensor_msgs.msg import Image, CameraInfo
from geometry_msgs.msg import PointStamped
from cv_bridge import CvBridge
import cv2
import os
from datetime import datetime
aruco_pub = None
camera_info = None
depth_image_msg = None
csv_data = []
def detect_aruco(image):
    global csv_data
    aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_ARUCO_ORIGINAL)
    cv_image = CvBridge().imgmsg_to_cv2(image, "bgr8")
    gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
    parameters = cv2.aruco.DetectorParameters_create()
    corners, ids, _ = cv2.aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
    if ids is None:
        rospy.loginfo("No ArUco marker found in the image.")
    else:
        for i in range(len(ids)):
            aruco_id = ids[i][0]
            aruco_center_x = int((corners[i][0][0][0] + corners[i][0][1][0] + corners[i][0][2][0] + corners[i][0][3][0]) / 4)
            aruco_center_y = int((corners[i][0][0][1] + corners[i][0][1][1] + corners[i][0][2][1] + corners[i][0][3][1]) / 4)
            try:
                depth_image_msg = rospy.wait_for_message("/camera/depth/image_rect_raw", Image, timeout=1.0)
            except rospy.ROSException:
                rospy.logwarn("Failed to get depth image.")
                return
            depth_image = CvBridge().imgmsg_to_cv2(depth_image_msg, "passthrough")
            aruco_center_x = min(max(0, aruco_center_x), depth_image.shape[1] - 1)
            aruco_center_y = min(max(0, aruco_center_y), depth_image.shape[0] - 1)
            depth = depth_image[aruco_center_y, aruco_center_x]
            if depth != 0:
                if camera_info is not None:
                    K = camera_info.K
                    Z = depth / 1000.0
                    X = (aruco_center_x - K[2]) * Z / K[0]
                    Y = (aruco_center_y - K[5]) * Z / K[4]
                    rospy.loginfo("Detected ArUco marker with ID: {}. 3D Coordinates: ({}, {}, {})".format(aruco_id, X, Y, Z))
                    # 记录数据到csv_data列表
                    csv_data.append([rospy.Time.now().to_sec(), X, Y, Z])
def image_callback(data):
    global depth_image_msg
    detect_aruco(data)
def camera_info_callback(data):
    global camera_info
    camera_info = data
def main():
    global aruco_pub, csv_data
    rospy.init_node('aruco_detection_node', anonymous=True)
    image_sub = rospy.Subscriber("/camera/color/image_raw", Image, image_callback)
    camera_info_sub = rospy.Subscriber("/camera/color/camera_info", CameraInfo, camera_info_callback)
    # 不再发布3D坐标信息到话题/aruco_info,因此这里不需要创建Publisher了
    rospy.spin()
    # 保存数据到csv文件
    if csv_data:
        folder_path = "aruco_tracks"
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
        file_name = datetime.now().strftime("%Y%m%d_%H%M%S") + ".csv"
        file_path = os.path.join(folder_path, file_name)
        with open(file_path, mode='w') as file:
            writer = csv.writer(file)
            writer.writerow(['Time', 'X', 'Y', 'Z'])
            writer.writerows(csv_data)
if __name__ == "__main__":
    try:
        main()
    except rospy.ROSInterruptException:
        pass
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
存储 缓存 算法
【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍
相较于之前的通信模型,参数服务器是最为简单的。在之前的模型中,ROSMASTER都是扮演一个帮二者连接在一起的桥梁。
343 0
|
5月前
|
传感器 自然语言处理 机器人
ROS2教程03 ROS2节点
本文是关于ROS2(机器人操作系统2)节点的教程,涵盖了节点的概念、特性、使用方法,以及如何编写、测试和使用ROS2节点相关的命令行工具。文章介绍了节点的独立性、任务执行、跨硬件分布和多语言编写能力。详细解释了如何启动节点、查看节点信息、编写节点代码(包括面向过程和面向对象的方法),以及如何为功能包添加依赖和入口点。此外,还探讨了重映射节点名称和使用节点命令行工具的方法,如 `ros2 node info` 和 `ros2 node list`。适合已安装ROS2 Humble和Ubuntu 22.04操作系统,并具有Shell基础知识的读者学习。
166 1
|
5月前
|
机器人 Python
ROS2教程 03 节点Node
本文是关于ROS2(机器人操作系统2)的教程,介绍了ROS2的节点概念、与ROS1的区别、节点的编写和基本流程、ros2的node相关命令,以及如何对节点名进行重映射,旨在帮助读者理解ROS2中节点的创建和操作。
144 0
|
5月前
|
缓存 数据可视化 机器人
07 ROS的TF坐标管理工具
本文详细介绍了ROS(机器人操作系统)中TF(Transform)坐标管理工具的使用方法,包括如何监听和广播坐标变换消息,使用相关命令行工具查看TF关系,以及如何通过编写节点代码来创建TF广播器和监听器,并展示了如何在launch文件中配置TF相关的节点。
136 0
|
6月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
8月前
|
C++ Python
[ROS2] --- 手动编写一个节点
[ROS2] --- 手动编写一个节点
152 1
|
消息中间件 算法 机器人
【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信
比较常用的目前就这一些,之后的命令现用现学就好了
283 1
|
算法 中间件 C语言
【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信
在ros中,一个节点想要获取某种服务(例如:一个节点想要获取此时的相机数据,节点就需要向相机发送一个请求,而相机接收到请求后可以根据消息类型将数据类型返回),这就是基本的服务通信使用场景。
179 0
【3. 初学ROS,年轻人的第一个Node节点】
【3. 初学ROS,年轻人的第一个Node节点】
109 0
|
Shell
奥比中光ROS启动节点运行异常退出:[camera/driver-2] process has finished cleanly
奥比中光ROS启动节点运行异常退出:[camera/driver-2] process has finished cleanly
514 0
奥比中光ROS启动节点运行异常退出:[camera/driver-2] process has finished cleanly

推荐镜像

更多