orb_slam2坐标系的理解

本文深入探讨了SLAM(同步定位与地图构建)中涉及的像素坐标系、图像坐标系、相机坐标系和世界坐标系之间的关系。通过解析不同坐标系间的转换公式,帮助读者理解相机内参和外参的意义,以及它们如何影响图像处理和机器人定位。

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

原因:orb_slam2学习过程中,会遇到许多关于相机pose和图片的转化问题,想要理解他们的原理,需要缕清各种坐标系之间的关系。

介绍:slam中涉及到四个常用坐标系,包括 像素坐标系(u,v)、图像坐标系(x,y)、相机坐标系(Xc,Yc,Zc)和世界坐标系(Xw,Yw,Zw)

1.像素坐标系与图像坐标系

像素坐标系以图像左上角为原点建立以像素为单位的直接坐标系u-v。(在OpenCV中u对应x,v对应y)

                                                                                                    

                                                                                                         图1 图像坐标系

由于(u,v)只代表像素的列数与行数,而像素在图像中的位置并没有用物理单位表示出来,所以,我们还要建立以物理单位(如毫米)表示的图像坐标系x-y。将相机光轴与图像平面的交点(一般位于图像平面的中心处,也称为图像的主点(principal point)定义为该坐标系的原点O1,且x轴与u轴平行,y轴与v轴平行,假设(u0,v0)代表O1在u-v坐标系下的坐标dx与dy分别表示每个像素在横轴x和纵轴y上的物理尺寸,则图像中的每个像素在u-v坐标系中的坐标和在x-y坐标系中的坐标之间都存在如下的关系:

                                                                                                            

其中,我们假设物理坐标系中的单位为毫米那么dx的的单位为:毫米/像素。那么x/dx的单位就是像素了,即和u的单位一样都是像素。为了使用方便,可将上式用矩阵形式表示为:

                                                                                                                                               

2.相机坐标系与图像坐标系

相机成像的几何关系可由图2表示。其中O点为摄像机光心(投影中心),Xc轴和Yc轴与成像平面坐标系的x轴和y轴平行,Zc轴为摄像机的光轴,和图像平面垂直。光轴与图像平面的交点为图像的主点O1,由点O与Xc,Yc,Zc轴组成的直角坐标系称为摄像机的坐标系OO1为摄像机的焦距

                                                                                                              

                                                                                图2 相机坐标系与世界坐标系,OwXwYwZw即为世界坐标系

相机内参中的fx与fy,计算点在相机坐标系的坐标

当我们用OpenCV相机标定函数去标定相机时,我们能得到一个相机的内部参数,简称“内参”。内参是一个3×3的矩阵,

                                                                                                             

其中cx和cy可以理解为u0和v0,它们表示相机光轴在图像坐标系中的偏移量,以像素为单位。但对于焦距fx和fy就不是很直观了。其中f是相机的焦距,以像素为单位d为物体到相机的距离,单位为米x是物体在图像中的宽度,w为物体的实际宽度;y是物体在图像中的高度,而h是物体的实际高度。而对于一张矩形的图像,则有

                                                                    fx / d = x / w = 1 / dx  => fx = d / dx

                                                                    fy / d = y / h = 1 / dy  => fy = d / dy

三角形相似性:

                                                                     d / Zc = x / Xc

                                                                    由 x = ( u - cx ) * dx; => Xc =( u - cx )* dx * Zc / d; 

                                                                     =>  Xc = ( u - cx ) * Zc / fx;

                                                                     =>  Yc = ( v - cy ) * Zc / fy;

3.世界坐标系

世界坐标系是为了描述相机的位置而被引入的。平移向量t和旋转矩阵R可以用来表示相机坐标系与世界坐标系的关系。所以,假设空间点P在世界坐标系下的坐标是(Xw,Yw,Zw,1)T,(这里T是上标转置),在相机坐标下的坐标是(Xc,Yc,Zc,1)T,则存在如下的关系:

                                                                                                             

其中,R是3×3的正交单位矩阵(也成为旋转矩阵),t是三维的平移向量,矢量,M1是4×4矩阵。

PS:参考资料

像素坐标_百度百科

关于相机内参中的焦距fx和fy - zipeilu - 博客园

<think>好的,我现在需要帮助用户在ROS Noetic中配置和运行TurtleBot3仿真的ORB_SLAM2算法。首先,我需要理清楚整个流程的步骤,确保每个环节都正确无误。 首先,用户的环境是ROS Noetic,而ORB_SLAM2可能原本是针对较早版本的ROS设计的,比如Melodic。所以,我需要考虑兼容性问题。可能需要检查依赖库的版本,例如Pangolin、OpenCV、Eigen3等是否支持Noetic。另外,TurtleBot3的仿真通常使用Gazebo,所以需要确认Gazebo的版本是否与Noetic兼容。 接下来是ORB_SLAM2的安装。根据引用[2]的信息,ORB_SLAM3已经支持ROS版本和非ROS版本,但用户明确提到ORB_SLAM2,所以可能需要从源码编译。需要确保所有依赖项正确安装,比如Boost、OpenCV等。可能需要修改CMakeLists.txt中的路径,尤其是ROS Noetic可能将库文件放在不同的位置。 然后是TurtleBot3的仿真环境配置。用户需要安装TurtleBot3的包,可能包括turtlebot3、turtlebot3_msgs、turtlebot3_simulations等。需要确认这些包是否在Noetic中有官方支持,或者是否需要从源码编译。同时,需要设置环境变量,比如TURTLEBOT3_MODEL,可能为burger或waffle。 接下来是集成ORB_SLAM2到ROS中。ORB_SLAM2通常通过ROS的相机话题接收图像数据,比如/camera/rgb/image_raw。需要确保TurtleBot3的仿真环境正确发布这些话题。可能需要使用RGB-D相机或双目相机,根据ORB_SLAM2的模式(单目、双目、RGBD)来配置。例如,如果使用RGBD,可能需要同时订阅图像和深度话题。 然后需要修改ORB_SLAM2的启动文件,确保话题名称与TurtleBot3仿真发布的一致。比如,在ros_mono.cc或ros_rgbd.cc中,修改订阅的话题为/camera/rgb/image_raw和/camera/depth/image_raw。此外,可能需要调整相机参数文件,如TUM1.yaml或EuRoC.yaml,根据TurtleBot3相机的内参进行修改,或者在仿真中获取实际的相机参数。 接下来是运行步骤。用户需要同时启动Gazebo仿真环境、ORB_SLAM2节点,以及可能的RViz来可视化地图和机器人位置。可能需要编写launch文件来简化启动过程,同时确保各个节点的正确启动顺序。 在调试过程中,可能会遇到问题,比如话题不匹配、依赖库缺失、ORB_SLAM2崩溃等。需要检查ROS话题列表,使用rostopic list和rostopic echo来确认数据是否正确发布。此外,查看ORB_SLAM2的输出日志,是否有特征点提取、跟踪失败的情况,可能需要调整ORB_SLAM2的参数,如特征点数量、金字塔层数等。 另外,需要注意坐标变换的问题。ORB_SLAM2输出的相机位姿需要与TurtleBot3的base_link或odom坐标系进行转换,可能需要使用TF静态变换或通过robot_state_publisher来发布正确的坐标系关系。 最后,用户可能需要实现SLAM功能,这涉及到地图的构建和机器人的自主导航。ORB_SLAM2本身主要完成定位和稀疏地图构建,如果需要导航,可能需要集成到ROS的导航栈(move_base、amcl等),这可能需要进一步的工作,比如将稀疏地图转换为占用栅格地图,或者使用其他SLAM算法生成的地图。 总结步骤大致如下: 1. 安装ROS Noetic和必要依赖。 2. 安装并编译ORB_SLAM2,解决兼容性问题。 3. 配置TurtleBot3仿真环境,确保发布正确的传感器话题。 4. 修改ORB_SLAM2的话题订阅和相机参数。 5. 启动仿真和ORB_SLAM2,进行测试和调试。 6. 集成SLAM结果到导航或其他功能中。 现在需要将这些步骤详细化,给出具体的命令和修改点,确保用户能一步步操作。同时,注意可能出现的常见问题,比如依赖缺失、话题名称不匹配、参数错误等,提供解决方案。</think>### 在ROS Noetic中配置TurtleBot3仿真与ORB_SLAM2的步骤 #### 1. 环境准备 - **安装ROS Noetic**: 确保已完整安装ROS Noetic及常用工具: ```bash sudo apt install ros-noetic-desktop-full ros-noetic-turtlebot3* ros-noetic-gazebo-ros-pkgs ``` - **配置依赖项**: ORB_SLAM2需要以下依赖: ```bash sudo apt install libboost-all-dev libopencv-dev libeigen3-dev libglew-dev cmake ``` - **安装Pangolin (v0.6)**: 需使用兼容版本,避免最新版导致编译错误: ```bash git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin && git checkout v0.6 mkdir build && cd build cmake .. && make -j4 sudo make install ``` #### 2. 编译ORB_SLAM2 - **下载源码并修改兼容性**: ```bash git clone https://github.com/raulmur/ORB_SLAM2.git cd ORB_SLAM2 # 修改CMakeLists.txt中的C++标准为14(默认可能为11) sed -i 's/-std=c++11/-std=c++14/g' CMakeLists.txt # 修改ROS部分的CMakeLists(在Examples/ROS/ORB_SLAM2目录下) # 将find_package(OpenCV 3.0 QUIET)改为find_package(OpenCV 4 QUIET) ``` - **编译ROS模块**: ```bash chmod +x build.sh ./build.sh chmod +x build_ros.sh ./build_ros.sh ``` #### 3. 配置TurtleBot3仿真 - **设置环境变量**: 在`~/.bashrc`中添加: ```bash export TURTLEBOT3_MODEL=burger export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/noetic/share/turtlebot3_gazebo/models ``` - **启动仿真环境**: ```bash roslaunch turtlebot3_gazebo turtlebot3_world.launch ``` #### 4. 修改ORB_SLAM2配置 - **调整话题订阅**: 在`Examples/ROS/ORB_SLAM2/src/ros_mono.cc`中修改订阅话题为TurtleBot3的摄像头话题: ```cpp // 原代码 ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabImage, &igb); // 修改为 ros::Subscriber sub = nodeHandler.subscribe("/camera/rgb/image_raw", 1, &ImageGrabber::GrabImage, &igb); ``` - **更新相机参数文件**: 在`Examples/RGB-D/TUM1.yaml`中替换为TurtleBot3的摄像头内参(仿真中可通过`rostopic echo /camera/camera_info`获取): ```yaml Camera.fx: 554.254691 Camera.fy: 554.254691 Camera.cx: 320.5 Camera.cy: 240.5 ``` #### 5. 运行与调试 - **启动ORB_SLAM2**: ```bash rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ``` - **可视化结果**: 在RViz中添加`/orb_slam2/frame`话题显示特征点,或使用`tf`树查看机器人位姿。 #### 6. 常见问题解决 - **话题不匹配**: 使用`rostopic list`检查仿真发布的话题名称,确保与ORB_SLAM2订阅的一致。 - **依赖库冲突**: 若出现`undefined reference`错误,检查Pangolin和OpenCV版本,必要时重新编译。 - **特征跟踪失败**: 在低纹理场景中,需调整ORB_SLAM2参数(如`ORBextractor.nFeatures=2000`)。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默老曹

老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值