slam学习(2)

本文介绍了如何通过2D图像信息和深度信息转换为3D点云的过程,详细解释了针孔相机模型下,空间点与图像像素坐标之间的转换公式,并给出构建点云的方法。

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

http://www.cnblogs.com/gaoxiang12/p/4652478.html
从上面学习转载

18 // 相机内参
19 const double camera_factor = 1000;
20 const double camera_cx = 325.5;
21 const double camera_cy = 253.5;
22 const double camera_fx = 518.0;
23 const double camera_fy = 519.0;

从2D到3D(数学部分),其实就是从图像信息和深度信息的2d信息转化为点云(3d信息)

  上面两个图像给出了机器人外部世界的一个局部的信息。假设这个世界由一个点云来描述: X={x1,,xn} X={x1,…,xn}. 其中每一个点呢,有  r,g,b,x,y,z r,g,b,x,y,z一共6个分量,表示它们的颜色与空间位置。颜色方面,主要由彩色图像记录; 而空间位置,可以由图像和相机模型、姿态一起计算出来。

  对于常规相机,SLAM里使用针孔相机模型(图来自http://www.comp.nus.edu.sg/~cs4243/lecture/camera.pdf ):

  简而言之,一个空间点 [x,y,z] [x,y,z]和它在图像中的像素坐标 [u,v,d] [u,v,d] ( d d指深度数据) 的对应关系是这样的:

u=xfxz+cx u=x⋅fxz+cx

v=yfyz+cy v=y⋅fyz+cy

d=zs d=z⋅s

  其中, fx,fy fx,fy指相机在 x,y x,y两个轴上的焦距, cx,cy cx,cy指相机的光圈中心, s s指深度图的缩放因子。

  小萝卜:好晕啊!突然冒出这么多个变量!

  师兄:别急啊,这已经是很简单的模型了,等你熟悉了就不觉得复杂了。 

  这个公式是从 (x,y,z) (x,y,z)推到 (u,v,d) (u,v,d)的。反之,我们也可以把它写成已知 (u,v,d) (u,v,d),推导 (x,y,z) (x,y,z)的方式。请读者自己推导一下。

  不,还是我们来推导吧……公式是这样的:

 

z=d/s z=d/s

x=(ucx)z/fx x=(u−cx)⋅z/fx

y=(vcy)z/fy y=(v−cy)⋅z/fy

  怎么样,是不是很简单呢?事实上根据这个公式就可以构建点云啦。

  通常,我们会把 fx,fy,cx,cy fx,fy,cx,cy这四个参数定义为相机的内参矩阵 C C,也就是相机做好之后就不会变的参数。相机的内参可以用很多方法来标定,详细的步骤比较繁琐,我们这里就不提了。给定内参之后呢,每个点的空间位置与像素坐标就可以用简单的矩阵模型来描述了:

suv1=CRxyz+t s⋅[uv1]=C⋅(R⋅[xyz]+t)

  其中, R R t t是相机的姿态。 R R代表旋转矩阵, t t代表位移矢量。因为我们现在做的是单幅点云,认为相机没有旋转和平移。所以,把 R R设成单位矩阵 I I,把 t t设成了零。 s s是scaling factor,即深度图里给的数据与实际距离的比例。由于深度图给的都是short (mm单位), s s通常为1000。


### 激光SLAM学习教程路线图 #### 了解基础知识 为了更好地掌握激光SLAM技术,建议从基础开始逐步深入。首先应熟悉机器人操作系统(ROS),因为大多数开源SLAM项目都基于此平台构建[^1]。 #### 掌握核心原理 接着深入了解同步定位与建图(SLAM)的核心概念及其工作流程。这不仅限于理解什么是SLAM以及它解决了哪些问题,还包括探索不同类型的传感器(如2D/3D LiDAR)如何应用于环境感知中[^2]。 #### 实践操作经验 理论联系实际非常重要,在掌握了基本理论之后应该尽快动手实践。可以通过安装并运行现有的开源框架来获得直观感受,例如GMapping, Hector SLAM 或者Cartographer等知名工具包都是不错的选择。 #### 高级主题研究 当具备了一定程度的理解后可以进一步探讨回环检测、多机器人协作等问题。值得注意的是,虽然机器学习特别是深度学习提供了强大的模式识别能力,但在实时性要求较高的场景下仍需考虑效率因素[^3]。 ```python # Python代码示例:订阅LiDAR数据并发布地图 import rospy from sensor_msgs.msg import LaserScan from nav_msgs.msg import OccupancyGrid def lidar_callback(data): # 处理接收到的LiDAR扫描消息... if __name__ == '__main__': rospy.init_node('slam_example') sub = rospy.Subscriber('/scan', LaserScan, lidar_callback) pub = rospy.Publisher('/map', OccupancyGrid, queue_size=10) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): map_msg = OccupancyGrid() # 更新地图信息... pub.publish(map_msg) rate.sleep() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值