T265+D430跟踪建图

本文详细介绍了如何配置T265和D430的launch文件,处理它们之间的坐标关系,包括imu融合,以及解决T265报错RS2_USB_STATUS_NO_DEVICE的问题。还涉及了单目相机和imu的联合标定方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

番外更新:T265和D430的联合定位建图

一、T265以及D430的launch文件,内部坐标关系及其 tf 树

我采用T265用于输出里程计信息,D430用于输出深度信息,此外为了做无人机控制还需要利用px4飞控的imu信息。三个传感器之间复杂的坐标关系很容易把人绕晕。
首先需要配置realsense2_camera 的launch文件,来同时打开T265相机和D430相机。launch文件的配置可以参考这篇文章。

<launch>
  <arg name="device_type_camera1"    			default="t265"/>
  <arg name="device_type_camera2"    			default="d430"/>		
  <arg name="serial_no_camera1"    			default="230222110093"/> 			<!-- Note: Replace with actual serial number -->
  <arg name="serial_no_camera2"    			default="140122076800"/> 			<!-- Note: Replace with actual serial number -->
  <arg name="camera1"              			default="t265"/>		<!-- Note: Replace with camera name -->
  <arg name="camera2"              			default="d430"/>		<!-- Note: Replace with camera name -->
  <arg name="tf_prefix_camera1"         	default="$(arg camera1)"/>
  <arg name="tf_prefix_camera2"         	default="$(arg camera2)"/>
  <arg name="initial_reset"             	default="false"/>
  <arg name="enable_sync"               	default="true"/>

  <!-- t265 -->
  <arg name="fisheye_width"       		default="640"/> 
  <arg name="fisheye_height"      		default="480"/>
  <arg name="fisheye_fps"         		default="-1"/>
  <arg name="gyro_fps"            		default="200"/>
  <arg name="accel_fps"           		default="200"/>
  <arg name="enable_gyro"         		default="true"/>
  <arg name="enable_accel"        		default="true"/>
  <arg name="enable_fisheye1"     		default="false"/>
  <arg name="enable_fisheye2"     		default="false"/>
  <arg name="linear_accel_cov"    		default="0.01"/>
  <arg name="unite_imu_method"    		default=""/>
  <arg name="topic_odom_in"       		default="odom_in"/>
  <arg name="calib_odom_file"     		default=""/>
  <!-- end t265 -->

  <!-- d430 -->
  <arg name="depth_width"           		default="640"/>
  <arg name="depth_height"          		default="480"/>
  <arg name="depth_fps"            		default="30"/>
  <arg name="infra_width"           		default="640"/>
  <arg name="infra_height"         		default="480"/>
  <arg name="infra_fps"                 	default="30"/>
  <arg name="enable_depth"              	value="true"/>
  <arg name="enable_color"              	value="false"/>
  <arg name="enable_infra"             	value="true"/>
  <arg name="enable_infra1"            	value="true"/>
  <arg name="enable_infra2"             	value="true"/>
  <arg name="enable_pointcloud"         	value="true"/>
  <arg name="filters"                   	value="pointcloud"/>

  <!-- end d430 -->

  <group ns="$(arg camera1)">
    <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
      <arg name="serial_no"             	value="$(arg serial_no_camera1)"/>
      <arg name="tf_prefix"         		value="$(arg tf_prefix_camera1)"/>
      

      <arg name="fisheye_width"            	value="$(arg fisheye_width)"/>
      <arg name="fisheye_height"           	value="$(arg fisheye_height)"/>
      
      <arg name="enable_fisheye1"          	value="$(arg enable_fisheye1)"/>
      <arg name="enable_fisheye2"          	value="$(arg enable_fisheye2)"/>
      <arg name="fisheye_fps"              	value="$(arg fisheye_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="enable_color"             	value="false"/>
      <arg name="enable_depth"             	value="false"/>
      <arg name="enable_pose"             	value="true"/>
      
      <arg name="linear_accel_cov"         	value="$(arg linear_accel_cov)"/>
      <arg name="initial_reset"            	value="$(arg initial_reset)"/>
      <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="enable_sync"              	value="$(arg enable_sync)"/>
    </include>
  </group>

  <group ns="$(arg camera2)">
    <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
      <arg name="serial_no"             	value="$(arg serial_no_camera2)"/>
      <arg name="tf_prefix"			value="$(arg tf_prefix_camera2)"/>
      <arg name="initial_reset"         	value="$(arg initial_reset)"/>

      <arg name="depth_width"       		value="$(arg depth_width)"/>
      <arg name="depth_height"      		value="$(arg depth_height)"/>
      <arg name="depth_fps"         		value="$(arg depth_fps)"/>
      
      <arg name="infra_width"       		value="$(arg infra_width)"/>
      <arg name="infra_height"      		value="$(arg infra_height)"/>
      <arg name="infra_fps"         		value="$(arg infra_fps)"/>
      
      <arg name="enable_depth"      		value="$(arg enable_depth)"/>
      <arg name="enable_color"      		value="$(arg enable_color)"/>
      <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="enable_pointcloud" 		value="$(arg enable_pointcloud)"/>
      <arg name="filters"           		value="$(arg filters)"/>
      <arg name="enable_sync"       		value="$(arg enable_sync)"/>

    </include>
  </group>

</launch>

打开命令行,运行rs-enumerate-devices -c,可以查看rs相机出场时标定的内外参。

在这里插入图片描述
T265出厂参数给出的各坐标系关系如图,其中值得注意的是Pose坐标系,经过rs2_camera驱动会自动输出为ROS下的北西天坐标系。其位置关系可以通过出厂参数获取。
然后,命令行运行rosrun rqt_tf_tree rqt_tf_tree可以查看各相机的tf坐标树。
运行rosrun tf tf_echo tf_1 tf_2可以查看两个tf之间的关系。

对于D430:
D430_link <-固连-> D430_depth_frame <-固连-> D430_infra1_frame
对于T265:
t265_odom_frame <-不固连-> t265_pose_frame <-固连-> t265_link
对于px4:
base_link

我们可以通过单目+imu联合标定的方法,获取D430_link、t265_link、base_link之间的坐标关系,即可完成三个传感器的数据融合。

二、单目相机+imu联合标定

通过上面的步骤可以发现,D430的基础系、深度系都是固连在左目系上的,因此可以考虑使用kalibrate来获取D430和px4imu的外参。并且T265的imu到Pose的位置关系我们也是知道的,那么也可以用联合标定的方式搞定D430和T265的外参。
相机和imu联合标定可以看这篇帖子:jetson xavier nx 安装系统+ros+opencv-gpu+VINS-GPU+vins标定
详细的标定过程可能后面会开一个新帖专门来记录一下。

三、T265报错:RS2_USB_STATUS_NO_DEVICE

运行:

sudo cp ~/.99-realsense-libusb.rules /etc/udev/rules.d/99-realsense-libusb.rules 
sudo udevadm control --reload-rules && udevadm trigger

成功解决。

<think>好的,用户想获取D430相机的内参校准信息。首先,我需要回忆一下Intel RealSense SDK的相关知识。记得librealsense库提供了获取内参的方法,特别是通过rs2::sensor和rs2::video_stream_profile类。内参通常包括焦距(fx, fy)和光心坐标(cx, cy),还可能包括畸变系数。 接下来,我应该分步骤说明如何操作。首先需要安装SDK,然后连接设备。用户可能需要确认相机是否被正确识别。然后通过代码示例展示如何获取内参,可能需要使用C++或Python,但根据用户提供的示例中的Python代码,可能更倾向于Python。不过librealsense的Python接口有时候不如C++全面,需要确认是否支持获取内参。 另外,用户可能需要知道实时获取和从录制文件获取两种方式。还要提醒他们可能需要处理多个传感器,比如深度传感器和RGB传感器。此外,校准参数可能随固件版本变化,议用户保持固件更新。 还需要考虑用户可能遇到的问题,比如找不到对应的函数或属性,这时候需要检查SDK版本是否正确,或者是否有权限访问设备。另外,提供命令行工具作为替代方法,比如rs-enumerate-devices,可能对不熟悉编程的用户有帮助。 最后,确保引用来源正确,参考用户提供的引用[1],确认信息一致性。需要验证步骤是否准确,例如rs2::video_stream_profile的get_intrinsics()方法是否存在,以及Python绑定中是否有对应的函数。如果有不确定的地方,可能需要查阅最新的librealsense文档或社区讨论来确认。</think>### 获取Intel® RealSense™ D430相机内参的步骤 #### 1. **安装Intel® RealSense™ SDK** - 从[官方GitHub仓库](https://github.com/IntelRealSense/librealsense)下载并安装librealsense SDK,支持Windows/Linux/macOS。 - 确保相机通过USB 3.0接口连接,并更新到最新固件[^1]。 #### 2. **通过代码获取内参** 使用librealsense提供的API直接读取内参。以下是Python示例代码: ```python import pyrealsense2 as rs pipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) profile = pipeline.start(config) depth_sensor = profile.get_device().first_depth_sensor() depth_scale = depth_sensor.get_depth_scale() # 获取深度流内参 depth_profile = profile.get_stream(rs.stream.depth).as_video_stream_profile() intrinsics = depth_profile.get_intrinsics() print(f"焦距 (fx, fy): {intrinsics.fx}, {intrinsics.fy}") print(f"光心 (cx, cy): {intrinsics.ppx}, {intrinsics.ppy}") print(f"畸变模型: {intrinsics.model}") print(f"畸变系数: {intrinsics.coeffs}") pipeline.stop() ``` #### 3. **从录制文件提取内参** 若使用录制的`.bag`文件,可通过以下方式读取: ```python config.enable_device_from_file("recorded.bag") profile = pipeline.start(config) # 后续步骤同上 ``` #### 4. **使用命令行工具** - 运行SDK自带的`rs-enumerate-devices`工具,可直接列出设备参数: ```bash rs-enumerate-devices -c ``` ### 关键参数说明 - **内参组成**: - 焦距:$f_x$, $f_y$(单位为像素) - 光心坐标:$c_x$, $c_y$ - 畸变模型(如Brown-Conrady/Kannala-Brandt) - 畸变系数:$k_1, k_2, p_1, p_2, k_3$ 等 - **坐标系关系**:内参用于将像素坐标 $(u, v)$ 转换为3D坐标系中的点 $(X, Y, Z)$,公式为: $$ Z \cdot \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} $$ ### 注意事项 - **多传感器支持**:D430包含红外/深度传感器和可选RGB模块,需分别获取内参。 - **动态校准**:若启用自动校准功能(如`rs.auto_calibrator`),参数可能动态变化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值