一、准备步骤博主用的设备是Ubuntu20.04realsenseD456ROS1noetic首先需要安装相关的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开始编译直至成功成功界面如下三、文件修改、识别及输出参考RealsenseROS1二维码识别3.1 文件修改对于rs_camera.launch文件首先需要把这三行全部改为true这样才能保证有图像话题输出方便后续订阅。launch arg nameserial_no default/ arg nameusb_port_id default/ arg namedevice_type default/ arg namejson_file_path default/ arg namecamera defaultcamera/ arg nametf_prefix default$(arg camera)/ arg nameexternal_manager defaultfalse/ arg namemanager defaultrealsense2_camera_manager/ arg nameoutput defaultscreen/ arg namerespawn defaultfalse/ arg namefisheye_width default-1/ arg namefisheye_height default-1/ arg nameenable_fisheye defaultfalse/ arg namedepth_width default-1/ arg namedepth_height default-1/ arg nameenable_depth defaulttrue/ arg nameconfidence_width default-1/ arg nameconfidence_height default-1/ arg nameenable_confidence defaulttrue/ arg nameconfidence_fps default-1/ arg nameinfra_width default848/ arg nameinfra_height default480/ arg nameenable_infra defaulttrue/ arg nameenable_infra1 defaulttrue/ arg nameenable_infra2 defaulttrue/ arg nameinfra_rgb defaultfalse/ arg namecolor_width default-1/ arg namecolor_height default-1/ arg nameenable_color defaulttrue/ arg namefisheye_fps default-1/ arg namedepth_fps default-1/ arg nameinfra_fps default30/ arg namecolor_fps default-1/ arg namegyro_fps default-1/ arg nameaccel_fps default-1/ arg nameenable_gyro defaultfalse/ arg nameenable_accel defaultfalse/ arg nameenable_pointcloud defaultfalse/ arg namepointcloud_texture_stream defaultRS2_STREAM_COLOR/ arg namepointcloud_texture_index default0/ arg nameallow_no_texture_points defaultfalse/ arg nameordered_pc defaultfalse/ arg nameenable_sync defaultfalse/ arg namealign_depth defaultfalse/ arg namepublish_tf defaulttrue/ arg nametf_publish_rate default0/ arg namefilters default/ arg nameclip_distance default-2/ arg namelinear_accel_cov default0.01/ arg nameinitial_reset defaultfalse/ arg namereconnect_timeout default6.0/ arg namewait_for_device_timeout default-1.0/ arg nameunite_imu_method default/ arg nametopic_odom_in defaultodom_in/ arg namecalib_odom_file default/ arg namepublish_odom_tf defaulttrue/ arg namestereo_module/exposure/1 default7500/ arg namestereo_module/gain/1 default16/ arg namestereo_module/exposure/2 default1/ arg namestereo_module/gain/2 default16/ group ns$(arg camera) include file$(find realsense2_camera)/launch/includes/nodelet.launch.xml arg nametf_prefix value$(arg tf_prefix)/ arg nameexternal_manager value$(arg external_manager)/ arg namemanager value$(arg manager)/ arg nameoutput value$(arg output)/ arg namerespawn value$(arg respawn)/ arg nameserial_no value$(arg serial_no)/ arg nameusb_port_id value$(arg usb_port_id)/ arg namedevice_type value$(arg device_type)/ arg namejson_file_path value$(arg json_file_path)/ arg nameenable_pointcloud value$(arg enable_pointcloud)/ arg namepointcloud_texture_stream value$(arg pointcloud_texture_stream)/ arg namepointcloud_texture_index value$(arg pointcloud_texture_index)/ arg nameenable_sync value$(arg enable_sync)/ arg namealign_depth value$(arg align_depth)/ arg namefisheye_width value$(arg fisheye_width)/ arg namefisheye_height value$(arg fisheye_height)/ arg nameenable_fisheye value$(arg enable_fisheye)/ arg namedepth_width value$(arg depth_width)/ arg namedepth_height value$(arg depth_height)/ arg nameenable_depth value$(arg enable_depth)/ arg nameconfidence_width value$(arg confidence_width)/ arg nameconfidence_height value$(arg confidence_height)/ arg nameenable_confidence value$(arg enable_confidence)/ arg nameconfidence_fps value$(arg confidence_fps)/ arg namecolor_width value$(arg color_width)/ arg namecolor_height value$(arg color_height)/ arg nameenable_color value$(arg enable_color)/ arg nameinfra_width value$(arg infra_width)/ arg nameinfra_height value$(arg infra_height)/ arg nameenable_infra value$(arg enable_infra)/ arg nameenable_infra1 value$(arg enable_infra1)/ arg nameenable_infra2 value$(arg enable_infra2)/ arg nameinfra_rgb value$(arg infra_rgb)/ arg namefisheye_fps value$(arg fisheye_fps)/ arg namedepth_fps value$(arg depth_fps)/ arg nameinfra_fps value$(arg infra_fps)/ arg namecolor_fps value$(arg color_fps)/ arg namegyro_fps value$(arg gyro_fps)/ arg nameaccel_fps value$(arg accel_fps)/ arg nameenable_gyro value$(arg enable_gyro)/ arg nameenable_accel value$(arg enable_accel)/ arg namepublish_tf value$(arg publish_tf)/ arg nametf_publish_rate value$(arg tf_publish_rate)/ arg namefilters value$(arg filters)/ arg nameclip_distance value$(arg clip_distance)/ arg namelinear_accel_cov value$(arg linear_accel_cov)/ arg nameinitial_reset value$(arg initial_reset)/ arg namereconnect_timeout value$(arg reconnect_timeout)/ arg namewait_for_device_timeout value$(arg wait_for_device_timeout)/ arg nameunite_imu_method value$(arg unite_imu_method)/ arg nametopic_odom_in value$(arg topic_odom_in)/ arg namecalib_odom_file value$(arg calib_odom_file)/ arg namepublish_odom_tf value$(arg publish_odom_tf)/ arg namestereo_module/exposure/1 value$(arg stereo_module/exposure/1)/ arg namestereo_module/gain/1 value$(arg stereo_module/gain/1)/ arg namestereo_module/exposure/2 value$(arg stereo_module/exposure/2)/ arg namestereo_module/gain/2 value$(arg stereo_module/gain/2)/ arg nameallow_no_texture_points value$(arg allow_no_texture_points)/ arg nameordered_pc value$(arg ordered_pc)/ /include /group /launch随后注意修改aurco工作空间下的single.launch文件因为我用的single.launch文件来做测试所以只修改了这个文件如果要用到该工作空间下的别的文件也要同步修改有6个地方着重修改分别是a. arg namemarkerId default123/default后面的值需要改成自己生成的Aurco二维码的ID。b. arg namemarkerSize default0.034/ !-- in m --default后面的值需要改成自己生成的Aurco二维码的size也是物理边长单位是m。c. arg nameeye defaultinfra1/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 namecamera_frame value/camera_link/这里default后面一定要改成/camera/link该link可以融合相机携带的其他传感器以下面两张图为例说明这里的参数怎么填。打开Aurco二维码生成二维码Dictionary选Original ArUco为aruco_ros的默认第一张图可以看出a中markerId的值应该是123b中markerSize应该是34mm也就是0.034m。第二张图可以看出c中参数eye可以选infra1其实也可以infra2或者colord和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设置为offrosrun 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垂直纸面向里如下图所示:
ROS1+RealsenseD456读取Aruco码并输出位姿
一、准备步骤博主用的设备是Ubuntu20.04realsenseD456ROS1noetic首先需要安装相关的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开始编译直至成功成功界面如下三、文件修改、识别及输出参考RealsenseROS1二维码识别3.1 文件修改对于rs_camera.launch文件首先需要把这三行全部改为true这样才能保证有图像话题输出方便后续订阅。launch arg nameserial_no default/ arg nameusb_port_id default/ arg namedevice_type default/ arg namejson_file_path default/ arg namecamera defaultcamera/ arg nametf_prefix default$(arg camera)/ arg nameexternal_manager defaultfalse/ arg namemanager defaultrealsense2_camera_manager/ arg nameoutput defaultscreen/ arg namerespawn defaultfalse/ arg namefisheye_width default-1/ arg namefisheye_height default-1/ arg nameenable_fisheye defaultfalse/ arg namedepth_width default-1/ arg namedepth_height default-1/ arg nameenable_depth defaulttrue/ arg nameconfidence_width default-1/ arg nameconfidence_height default-1/ arg nameenable_confidence defaulttrue/ arg nameconfidence_fps default-1/ arg nameinfra_width default848/ arg nameinfra_height default480/ arg nameenable_infra defaulttrue/ arg nameenable_infra1 defaulttrue/ arg nameenable_infra2 defaulttrue/ arg nameinfra_rgb defaultfalse/ arg namecolor_width default-1/ arg namecolor_height default-1/ arg nameenable_color defaulttrue/ arg namefisheye_fps default-1/ arg namedepth_fps default-1/ arg nameinfra_fps default30/ arg namecolor_fps default-1/ arg namegyro_fps default-1/ arg nameaccel_fps default-1/ arg nameenable_gyro defaultfalse/ arg nameenable_accel defaultfalse/ arg nameenable_pointcloud defaultfalse/ arg namepointcloud_texture_stream defaultRS2_STREAM_COLOR/ arg namepointcloud_texture_index default0/ arg nameallow_no_texture_points defaultfalse/ arg nameordered_pc defaultfalse/ arg nameenable_sync defaultfalse/ arg namealign_depth defaultfalse/ arg namepublish_tf defaulttrue/ arg nametf_publish_rate default0/ arg namefilters default/ arg nameclip_distance default-2/ arg namelinear_accel_cov default0.01/ arg nameinitial_reset defaultfalse/ arg namereconnect_timeout default6.0/ arg namewait_for_device_timeout default-1.0/ arg nameunite_imu_method default/ arg nametopic_odom_in defaultodom_in/ arg namecalib_odom_file default/ arg namepublish_odom_tf defaulttrue/ arg namestereo_module/exposure/1 default7500/ arg namestereo_module/gain/1 default16/ arg namestereo_module/exposure/2 default1/ arg namestereo_module/gain/2 default16/ group ns$(arg camera) include file$(find realsense2_camera)/launch/includes/nodelet.launch.xml arg nametf_prefix value$(arg tf_prefix)/ arg nameexternal_manager value$(arg external_manager)/ arg namemanager value$(arg manager)/ arg nameoutput value$(arg output)/ arg namerespawn value$(arg respawn)/ arg nameserial_no value$(arg serial_no)/ arg nameusb_port_id value$(arg usb_port_id)/ arg namedevice_type value$(arg device_type)/ arg namejson_file_path value$(arg json_file_path)/ arg nameenable_pointcloud value$(arg enable_pointcloud)/ arg namepointcloud_texture_stream value$(arg pointcloud_texture_stream)/ arg namepointcloud_texture_index value$(arg pointcloud_texture_index)/ arg nameenable_sync value$(arg enable_sync)/ arg namealign_depth value$(arg align_depth)/ arg namefisheye_width value$(arg fisheye_width)/ arg namefisheye_height value$(arg fisheye_height)/ arg nameenable_fisheye value$(arg enable_fisheye)/ arg namedepth_width value$(arg depth_width)/ arg namedepth_height value$(arg depth_height)/ arg nameenable_depth value$(arg enable_depth)/ arg nameconfidence_width value$(arg confidence_width)/ arg nameconfidence_height value$(arg confidence_height)/ arg nameenable_confidence value$(arg enable_confidence)/ arg nameconfidence_fps value$(arg confidence_fps)/ arg namecolor_width value$(arg color_width)/ arg namecolor_height value$(arg color_height)/ arg nameenable_color value$(arg enable_color)/ arg nameinfra_width value$(arg infra_width)/ arg nameinfra_height value$(arg infra_height)/ arg nameenable_infra value$(arg enable_infra)/ arg nameenable_infra1 value$(arg enable_infra1)/ arg nameenable_infra2 value$(arg enable_infra2)/ arg nameinfra_rgb value$(arg infra_rgb)/ arg namefisheye_fps value$(arg fisheye_fps)/ arg namedepth_fps value$(arg depth_fps)/ arg nameinfra_fps value$(arg infra_fps)/ arg namecolor_fps value$(arg color_fps)/ arg namegyro_fps value$(arg gyro_fps)/ arg nameaccel_fps value$(arg accel_fps)/ arg nameenable_gyro value$(arg enable_gyro)/ arg nameenable_accel value$(arg enable_accel)/ arg namepublish_tf value$(arg publish_tf)/ arg nametf_publish_rate value$(arg tf_publish_rate)/ arg namefilters value$(arg filters)/ arg nameclip_distance value$(arg clip_distance)/ arg namelinear_accel_cov value$(arg linear_accel_cov)/ arg nameinitial_reset value$(arg initial_reset)/ arg namereconnect_timeout value$(arg reconnect_timeout)/ arg namewait_for_device_timeout value$(arg wait_for_device_timeout)/ arg nameunite_imu_method value$(arg unite_imu_method)/ arg nametopic_odom_in value$(arg topic_odom_in)/ arg namecalib_odom_file value$(arg calib_odom_file)/ arg namepublish_odom_tf value$(arg publish_odom_tf)/ arg namestereo_module/exposure/1 value$(arg stereo_module/exposure/1)/ arg namestereo_module/gain/1 value$(arg stereo_module/gain/1)/ arg namestereo_module/exposure/2 value$(arg stereo_module/exposure/2)/ arg namestereo_module/gain/2 value$(arg stereo_module/gain/2)/ arg nameallow_no_texture_points value$(arg allow_no_texture_points)/ arg nameordered_pc value$(arg ordered_pc)/ /include /group /launch随后注意修改aurco工作空间下的single.launch文件因为我用的single.launch文件来做测试所以只修改了这个文件如果要用到该工作空间下的别的文件也要同步修改有6个地方着重修改分别是a. arg namemarkerId default123/default后面的值需要改成自己生成的Aurco二维码的ID。b. arg namemarkerSize default0.034/ !-- in m --default后面的值需要改成自己生成的Aurco二维码的size也是物理边长单位是m。c. arg nameeye defaultinfra1/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 namecamera_frame value/camera_link/这里default后面一定要改成/camera/link该link可以融合相机携带的其他传感器以下面两张图为例说明这里的参数怎么填。打开Aurco二维码生成二维码Dictionary选Original ArUco为aruco_ros的默认第一张图可以看出a中markerId的值应该是123b中markerSize应该是34mm也就是0.034m。第二张图可以看出c中参数eye可以选infra1其实也可以infra2或者colord和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设置为offrosrun 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垂直纸面向里如下图所示: