news 2026/6/27 5:11:31

ROS1+RealsenseD456读取Aruco码并输出位姿

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS1+RealsenseD456读取Aruco码并输出位姿

一、准备步骤

博主用的设备是Ubuntu20.04+realsenseD456+ROS1noetic

首先需要安装相关的ealsense驱动,可以参考我的另一篇博客如何安装Realsense驱动

新建一个终端,调用如下命令检查相机是否可以正常工作:

realsense-viewer

出现如下图像即为成功:

**Aurco二维码生成的网址为:Aurco二维码

二、下载并编译Aruco_ros

**由于ROS1-noetic于2025年5月31日已经停止维护了,所以直接用sudo的命令或者git的命令去下载aruco_ros是不可行的!!

科学上网后,登陆github官网,搜索aruco_ros并找到ros-noetic分支,如下图所示:

随后,直接下载安装包并解压缩,解压缩后的文件夹放在/home/jetson/realsense_ws/src路径下。这里注意修改为自己电脑对应的路径名称。回到realsense_ws工作空间下,先调用:

rm -rf build devel install build_isolated devel_isolated install_isolated

来清除之前的编译文件,如果之间调用catkin build编译过,或者之前用过catkin_make,可能会产生不兼容的问题,所以需要先调用上述命令来清理编译结果。随后,调用catkin_make开始编译,直至成功,成功界面如下:

三、文件修改、识别及输出

参考:Realsense+ROS1+二维码识别

3.1 文件修改

对于rs_camera.launch文件,首先需要把这三行全部改为true,这样才能保证有图像话题输出,方便后续订阅。

<launch> <arg name="serial_no" default=""/> <arg name="usb_port_id" default=""/> <arg name="device_type" default=""/> <arg name="json_file_path" default=""/> <arg name="camera" default="camera"/> <arg name="tf_prefix" default="$(arg camera)"/> <arg name="external_manager" default="false"/> <arg name="manager" default="realsense2_camera_manager"/> <arg name="output" default="screen"/> <arg name="respawn" default="false"/> <arg name="fisheye_width" default="-1"/> <arg name="fisheye_height" default="-1"/> <arg name="enable_fisheye" default="false"/> <arg name="depth_width" default="-1"/> <arg name="depth_height" default="-1"/> <arg name="enable_depth" default="true"/> <arg name="confidence_width" default="-1"/> <arg name="confidence_height" default="-1"/> <arg name="enable_confidence" default="true"/> <arg name="confidence_fps" default="-1"/> <arg name="infra_width" default="848"/> <arg name="infra_height" default="480"/> <arg name="enable_infra" default="true"/> <arg name="enable_infra1" default="true"/> <arg name="enable_infra2" default="true"/> <arg name="infra_rgb" default="false"/> <arg name="color_width" default="-1"/> <arg name="color_height" default="-1"/> <arg name="enable_color" default="true"/> <arg name="fisheye_fps" default="-1"/> <arg name="depth_fps" default="-1"/> <arg name="infra_fps" default="30"/> <arg name="color_fps" default="-1"/> <arg name="gyro_fps" default="-1"/> <arg name="accel_fps" default="-1"/> <arg name="enable_gyro" default="false"/> <arg name="enable_accel" default="false"/> <arg name="enable_pointcloud" default="false"/> <arg name="pointcloud_texture_stream" default="RS2_STREAM_COLOR"/> <arg name="pointcloud_texture_index" default="0"/> <arg name="allow_no_texture_points" default="false"/> <arg name="ordered_pc" default="false"/> <arg name="enable_sync" default="false"/> <arg name="align_depth" default="false"/> <arg name="publish_tf" default="true"/> <arg name="tf_publish_rate" default="0"/> <arg name="filters" default=""/> <arg name="clip_distance" default="-2"/> <arg name="linear_accel_cov" default="0.01"/> <arg name="initial_reset" default="false"/> <arg name="reconnect_timeout" default="6.0"/> <arg name="wait_for_device_timeout" default="-1.0"/> <arg name="unite_imu_method" default=""/> <arg name="topic_odom_in" default="odom_in"/> <arg name="calib_odom_file" default=""/> <arg name="publish_odom_tf" default="true"/> <arg name="stereo_module/exposure/1" default="7500"/> <arg name="stereo_module/gain/1" default="16"/> <arg name="stereo_module/exposure/2" default="1"/> <arg name="stereo_module/gain/2" default="16"/> <group ns="$(arg camera)"> <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml"> <arg name="tf_prefix" value="$(arg tf_prefix)"/> <arg name="external_manager" value="$(arg external_manager)"/> <arg name="manager" value="$(arg manager)"/> <arg name="output" value="$(arg output)"/> <arg name="respawn" value="$(arg respawn)"/> <arg name="serial_no" value="$(arg serial_no)"/> <arg name="usb_port_id" value="$(arg usb_port_id)"/> <arg name="device_type" value="$(arg device_type)"/> <arg name="json_file_path" value="$(arg json_file_path)"/> <arg name="enable_pointcloud" value="$(arg enable_pointcloud)"/> <arg name="pointcloud_texture_stream" value="$(arg pointcloud_texture_stream)"/> <arg name="pointcloud_texture_index" value="$(arg pointcloud_texture_index)"/> <arg name="enable_sync" value="$(arg enable_sync)"/> <arg name="align_depth" value="$(arg align_depth)"/> <arg name="fisheye_width" value="$(arg fisheye_width)"/> <arg name="fisheye_height" value="$(arg fisheye_height)"/> <arg name="enable_fisheye" value="$(arg enable_fisheye)"/> <arg name="depth_width" value="$(arg depth_width)"/> <arg name="depth_height" value="$(arg depth_height)"/> <arg name="enable_depth" value="$(arg enable_depth)"/> <arg name="confidence_width" value="$(arg confidence_width)"/> <arg name="confidence_height" value="$(arg confidence_height)"/> <arg name="enable_confidence" value="$(arg enable_confidence)"/> <arg name="confidence_fps" value="$(arg confidence_fps)"/> <arg name="color_width" value="$(arg color_width)"/> <arg name="color_height" value="$(arg color_height)"/> <arg name="enable_color" value="$(arg enable_color)"/> <arg name="infra_width" value="$(arg infra_width)"/> <arg name="infra_height" value="$(arg infra_height)"/> <arg name="enable_infra" value="$(arg enable_infra)"/> <arg name="enable_infra1" value="$(arg enable_infra1)"/> <arg name="enable_infra2" value="$(arg enable_infra2)"/> <arg name="infra_rgb" value="$(arg infra_rgb)"/> <arg name="fisheye_fps" value="$(arg fisheye_fps)"/> <arg name="depth_fps" value="$(arg depth_fps)"/> <arg name="infra_fps" value="$(arg infra_fps)"/> <arg name="color_fps" value="$(arg color_fps)"/> <arg name="gyro_fps" value="$(arg gyro_fps)"/> <arg name="accel_fps" value="$(arg accel_fps)"/> <arg name="enable_gyro" value="$(arg enable_gyro)"/> <arg name="enable_accel" value="$(arg enable_accel)"/> <arg name="publish_tf" value="$(arg publish_tf)"/> <arg name="tf_publish_rate" value="$(arg tf_publish_rate)"/> <arg name="filters" value="$(arg filters)"/> <arg name="clip_distance" value="$(arg clip_distance)"/> <arg name="linear_accel_cov" value="$(arg linear_accel_cov)"/> <arg name="initial_reset" value="$(arg initial_reset)"/> <arg name="reconnect_timeout" value="$(arg reconnect_timeout)"/> <arg name="wait_for_device_timeout" value="$(arg wait_for_device_timeout)"/> <arg name="unite_imu_method" value="$(arg unite_imu_method)"/> <arg name="topic_odom_in" value="$(arg topic_odom_in)"/> <arg name="calib_odom_file" value="$(arg calib_odom_file)"/> <arg name="publish_odom_tf" value="$(arg publish_odom_tf)"/> <arg name="stereo_module/exposure/1" value="$(arg stereo_module/exposure/1)"/> <arg name="stereo_module/gain/1" value="$(arg stereo_module/gain/1)"/> <arg name="stereo_module/exposure/2" value="$(arg stereo_module/exposure/2)"/> <arg name="stereo_module/gain/2" value="$(arg stereo_module/gain/2)"/> <arg name="allow_no_texture_points" value="$(arg allow_no_texture_points)"/> <arg name="ordered_pc" value="$(arg ordered_pc)"/> </include> </group> </launch>

随后,注意修改aurco工作空间下的single.launch文件(因为我用的single.launch文件来做测试,所以只修改了这个文件,如果要用到该工作空间下的别的文件也要同步修改)

有6个地方着重修改,分别是:
a. <arg name="markerId" default="123"/>,default后面的值需要改成自己生成的Aurco二维码的ID。

b. <arg name="markerSize" default="0.034"/> <!-- in m -->,default后面的值需要改成自己生成的Aurco二维码的size(也是物理边长),单位是m。

c. <arg name="eye" default="infra1"/>,default后面的值需要改成realsense相机发布的话题,注意这里不是整个话题,eye参数只是话题中的某一节,所以default并没有改为整个话题名称。

d. <remap from="/camera_info" to="/camera/$(arg eye)/camera_info" />,default后面的值需要改成相机发布的话题,这里看到c中的参数eye被传过来了,也就解释了为什么eye会那样设置

e. <remap from="/image" to="/camera/$(arg eye)/image_rect_raw" />,

**f. <param name="camera_frame" value="/camera_link"/>,这里default后面一定要改成/camera/link,该link可以融合相机携带的其他传感器

以下面两张图为例,说明这里的参数怎么填。打开Aurco二维码生成二维码,Dictionary选Original ArUco,为aruco_ros的默认

第一张图可以看出,a中markerId的值应该是123,b中markerSize应该是34mm,也就是0.034m。第二张图可以看出,c中参数eye可以选infra1(其实也可以infra2或者color),d和e的参数要改成/camera/($arg eye)/camera_info和/camera/($arg eye)/image_rect_raw,最后f的参数要改成/camera/link。

3.2 启动对应的launch文件,并打印输出

首先启动roscore,随后调用如下命令启动相机,

roslaunch realsense2_camera rs_camera.launch

(可选)关闭结构光,即emitter_enabled设置为off

rosrun rqt_reconfigure rqt_reconfigure

启动二维码识别

roslaunch aruco_ros single.launch

可视化结果输出

rosrun image_view image_view image:=/aruco_single/result

结果输出如下:

可以看到对已有的二维码,可以读取其ID号以及二维码的坐标系

最后打印位姿信息,调用如下命令:

rostopic echo /aruco_single/pose

位姿信息输出如下:

左侧终端的右下角即为输出的位姿信息。之所以可以通过单目相机输出该信息,是因为在single.launch文件中传入了实际二维码的size,所以可以调用算法直接输出位姿信息了。该位姿信息是二维码在相机坐标系下的位姿。相机目视前方时(看向垂直纸面向里的方向),左侧相机的坐标系应该是,X水平向左,Y垂直向上,Z垂直纸面向里,如下图所示:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/27 5:09:00

2026河道治理选杉木桩,源头厂家这样挑才放心

近年来&#xff0c;随着国内水利工程与生态修复项目的持续推进&#xff0c;河道治理领域对杉木桩的需求显著增长。作为一种兼具经济性与实用性的天然建材&#xff0c;杉木桩凭借其良好的韧性、适中的硬度以及天然耐腐特性&#xff0c;在护坡、固堤、打桩等环节中得到广泛应用。…

作者头像 李华
网站建设 2026/6/27 5:08:01

1.5A,30VIN,XZ4120,降压恒流LED驱动芯片

产品概述这是一款降压、恒流、高效率的高亮度LED 驱动器。特别适合宽输入电压和宽负载范围的应用&#xff0c;输入电压范围从8V 到30V&#xff0c;负载输出电压可从3V 到28V。通过外接电阻可以设定输出电流&#xff0c;输出电流可达1.5A&#xff0c;且恒流精度高。只需很少的外…

作者头像 李华
网站建设 2026/6/27 4:58:08

工装采购如何筛选靠谱厂商?一文说透

工装采购如何筛选靠谱厂商&#xff1f;一文说透做采购的朋友都懂&#xff0c;工装采购真的很麻烦。 不同场景要求不一样&#xff0c;出问题全是采购担责。 真被罚一次就肉疼&#xff0c;谁也不想平白背锅。别乱找&#xff0c;优先选全品类一站式供应厂商别急&#xff0c;我接触…

作者头像 李华
网站建设 2026/6/27 4:55:36

AI Agent × iPaaS 集成落地实战:制造企业如何让智能体真正跑起来

一、问题本质&#xff1a;三层架构断点解析 AI Agent与iPaaS集成的落地难点&#xff0c;集中在三层架构的断点上&#xff1a; 1.模型层→连接层断点 Agent通过MCP协议调用外部工具&#xff0c;但企业系统中绝大多数API不符合MCP规范——REST接口缺少标准化描述、SOAP服务没有…

作者头像 李华
网站建设 2026/6/27 4:49:39

【课程设计/毕业设计】基于 SpringBoot+Vue 的酷听音乐检索与在线播放系统的设计与实现 基于 SpringBoot 的酷听音乐用户互动管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/27 4:40:41

数据中台投入产出比低?深度拆解四大核心痛点与解决方案

摘要&#xff1a; 据 Gartner 统计&#xff0c;超过 60% 的数据中台项目未能达到预期目标[1]。大量企业在完成数据接入、可视化大屏和报表产出后&#xff0c;仍面临一个终极难题——投入产出比无法量化。本文从数据质量、业务协同、交付周期和价值度量四个维度&#xff0c;深度…

作者头像 李华