做网站好找工作吗,淘宝客建网站,房地产设计图与规划图,网站搜索页面怎么做ego-planner开源代码之启动参数介绍分析 1. 源由2. 逻辑分析3. 启动参数section 1 三维地图尺寸section 2 里程计话题映射section 3 advanced_param.xml配置section 3.1section 3.2section 3.3section 3.4section 3.5section 3.6section 3.7section 3.8 section 4 轨迹服务… ego-planner开源代码之启动参数介绍分析 1. 源由2. 逻辑分析3. 启动参数section 1 三维地图尺寸section 2 里程计话题映射section 3 advanced_param.xml配置section 3.1section 3.2section 3.3section 3.4section 3.5section 3.6section 3.7section 3.8 section 4 轨迹服务器section 5 航点生成器section 6 simulator.xml配置section 7 rviz.launch配置 4. 总结5. 附录5.1 PDCA 戴明循环5.2 相机内参5.3 Field of View 感知视野 1. 源由
ego-planner开源代码之数据流分析工作的延续。
对于算法逻辑的数据流在前面已经初步做了整理部分主要模块已经有比较清晰的认识。从数据流的角度理解模块的工作逻辑还是非常直观、简洁的。
如何从系统的角度思考问题尤其是一个系统由众多模块组成的复杂体系要能够整体的理解反而并不能一下子上手。
反之若能够将整个系统作为一个模块来理解入参和出参分别如何对应和理解呢
2. 逻辑分析
想必经历过Linux 35.5 JetPack v5.1.3ego-planner编译安装并在此基础上运行过仿真模拟甚至看过uav_simulation代码那么可以体会下整体上要在模块基础上结合各模块的数据流了解整个系统还是会有很多盲点。
为此我们另辟蹊径从仿真模拟的入参配置来看看这个游戏是如何来玩的!
从应用的角度复杂场景往往涉及诸多变量从技术的角度应用场景多就是条件输入多同时判断的变量条件就比较多从算法的角度没有算法是万万不能的但是算法也并非是万能的。只有在满足预设前提算法才能正确执行
经常会有人反馈“研发人员用用都是挺好的到了客户那里一堆问题。”
从产品的角度预研算法通常仅仅实现了“阳光”场景的逻辑。换句话说当入参在某些合理输入情况下输出是期望结果当存在异常条件时由于程序逻辑的不完善、会导致结果混乱甚至宕机发生。
因此发现问题、研究问题、排除问题、改进方法、解决问题是一种螺旋式的过程而这个过程通常在工程技术上采用PDCA的方式进行不断完善和优化。
复杂问题简单化的逻辑就是在合理范围内使用逻辑上就能复现工程技术带来的结果。或者说算法逻辑能100%复现当无法复现就需要排除或者找到对应关系提前规避确保最终用户的用户体验。
3. 启动参数
废话不多说直接上正菜
section 1 三维地图尺寸 !-- size of map, change the size inflate x, y, z according to your application --arg namemap_size_x value40.0/arg namemap_size_y value40.0/arg namemap_size_z value 3.0/参数 map_size_x、map_size_y 和 map_size_z 定义了所使用的三维地图的尺寸。每个参数的含义如下 map_size_x定义地图在 X轴 方向上的长度单位米。这里的值设置为 40.0表示地图在 X轴方向延伸40米。 map_size_y定义地图在 Y轴 方向上的宽度单位米。这里的值设置为 40.0表示地图在 Y轴方向延伸40米。 map_size_z定义地图在 Z轴 方向上的高度单位米。值为 3.0表示地图在 Z轴方向延伸3米提供了垂直方向上的规划空间。
注map_size当地图大小较大时需要修改注意目标点不要超过map_size/2相当于默认当前位置为中心点位置。高级参数里面还有参数可以设置便宜。
section 2 里程计话题映射 !-- topic of your odometry such as VIO or LIO --arg nameodom_topic value/visual_slam/odom /该参数用于告诉 ego-planner 该从哪个话题订阅里程计数据以便获取机器人或无人机的位姿信息。 注释: !-- topic of your odometry such as VIO or LIO -- 这句话表示这个参数用于指定机器人里程计的ROS话题可以是 视觉惯性里程计 (VIO, Visual-Inertial Odometry) 或 激光惯性里程计 (LIO, LiDAR-Inertial Odometry) 等。 参数定义: arg nameodom_topic value/visual_slam/odom / 这行代码定义了一个名为 odom_topic 的参数其值为 /visual_slam/odom表示里程计信息发布的ROS话题名称是 /visual_slam/odom。ego-planner 会从这个话题中订阅机器人当前的位姿位置和姿态信息用于进行路径规划。
section 3 advanced_param.xml配置 !-- main algorithm params --include file$(find ego_planner)/launch/advanced_param.xml通过这行代码advanced_param.xml 文件中的参数会被加载到当前的启动文件中这样 ego-planner 在运行时就会使用这些预先定义的主算法参数。
同时通过 和之间再次修改参数覆盖默认advanced_param.xml 文件中的参数。 注释: !-- main algorithm params -- 这句话表示接下来引入的是主算法相关的参数配置文件。即该部分包含用于控制 ego-planner 主算法的参数。 参数文件引入: include file$(find ego_planner)/launch/advanced_param.xml 这行代码表示将位于 ego_planner 包的 launch 目录中的 advanced_param.xml 文件包含到当前的 launch 文件中。 $(find ego_planner)这是 ROS 中的语法用来找到 ego_planner 包的路径。/launch/advanced_param.xml表示具体的参数文件路径。
section 3.1 arg namemap_size_x_ value$(arg map_size_x)/arg namemap_size_y_ value$(arg map_size_y)/arg namemap_size_z_ value$(arg map_size_z)/arg nameodometry_topic value$(arg odom_topic)/复用和传递参数将原本的 map_size_x、map_size_y、map_size_z 和 odom_topic 重新命名为 map_size_x_、map_size_y_、map_size_z_ 和 odometry_topic这样便可以在后续代码中使用这些新的名称来引用原始参数的值。这种做法有利于代码的清晰和模块化使参数的传递更加灵活。 map_size_x_: 通过 value$(arg map_size_x)将之前定义的 map_size_x 参数值例如 40.0赋值给新的参数 map_size_x_。 map_size_y_: 同样将 map_size_y 的值传递给新的参数 map_size_y_。 map_size_z_: 将 map_size_z 的值传递给新的参数 map_size_z_。 odometry_topic: 将之前定义的 odom_topic 参数值如 /visual_slam/odom传递给 odometry_topic。
section 3.2 !-- camera pose: transform of camera frame in the world frame --!-- depth topic: depth image, 640x480 by default --!-- dont set cloud_topic if you already set these ones! --arg namecamera_pose_topic value/pcl_render_node/camera_pose/arg namedepth_topic value/pcl_render_node/depth/定义了有关相机位姿和深度图的ROS话题参数主要用于处理相机的姿态数据和深度图像数据。 注释: !-- camera pose: transform of camera frame in the world frame --: 这句话表示相机位姿话题提供的是相机坐标系在世界坐标系中的变换即相机在世界中的位置和姿态信息。!-- depth topic: depth image, 640x480 by default --: 这句话表示深度话题提供的是深度图像默认分辨率是 640x480。!-- dont set cloud_topic if you already set these ones! --: 这句话表示如果已经设置了相机位姿和深度图像话题就不要再设置点云话题cloud_topic因为这两个信息已经足够生成点云。 参数定义: arg namecamera_pose_topic value/pcl_render_node/camera_pose/: 这个参数 camera_pose_topic 定义了相机位姿信息的话题话题名称为 /pcl_render_node/camera_pose。在ROS系统中ego-planner 或其他节点将从该话题订阅相机的位姿即相机在世界坐标系中的位置和姿态信息。 arg namedepth_topic value/pcl_render_node/depth/: 这个参数 depth_topic 定义了深度图像的话题话题名称为 /pcl_render_node/depth。系统将从这个话题订阅深度图像数据深度图像通常用于生成三维点云或者帮助路径规划时感知障碍物。
section 3.3 !-- topic of point cloud measurement, such as from LIDAR --!-- dont set camera pose and depth, if you already set this one! --arg namecloud_topic value/pcl_render_node/cloud/定义了一个点云测量话题的参数主要用于从激光雷达LiDAR或其他传感器中获取点云数据。 注释: !-- topic of point cloud measurement, such as from LIDAR --: 这句话表示 cloud_topic 是用于获取点云测量数据的ROS话题数据来源可以是 LiDAR激光雷达或者其他提供点云的传感器。!-- dont set camera pose and depth, if you already set this one! --: 这句话提醒用户如果已经设置了 cloud_topic点云话题不要再设置相机位姿和深度图像因为点云数据已经包含了三维空间信息不需要额外使用相机的位姿和深度数据。 参数定义: arg namecloud_topic value/pcl_render_node/cloud/: 这个参数 cloud_topic 定义了点云数据的话题名称为 /pcl_render_node/cloud。系统或其他节点会从该话题订阅到点云数据这些数据通常包含传感器扫描到的环境三维点的信息即障碍物的位置、形状等。
section 3.4 !-- intrinsic params of the depth camera --arg namecx value321.04638671875/arg namecy value243.44969177246094/arg namefx value387.229248046875/arg namefy value387.229248046875/定义了深度相机的内参intrinsic parameters这些参数是相机的固有属性用于描述相机的光学特性和几何关系主要包括焦距和主点光轴中心的坐标。 注释: !-- intrinsic params of the depth camera --: 这句话表示接下来定义的参数是深度相机的内参用于描述相机的内部光学和几何特性。 参数定义: arg namecx value321.04638671875/: 这是相机主点principal point在图像平面上的 X坐标。主点是相机成像平面的中心点即光轴与成像平面交点。在这段代码中主点的 X 坐标为 321.04638671875。arg namecy value243.44969177246094/: 这是相机主点在图像平面上的 Y坐标主点的 Y 坐标为 243.44969177246094。arg namefx value387.229248046875/: 这是相机在 X方向 的焦距单位为像素。焦距表示镜头的光学中心到成像平面的距离在这里 X 方向的焦距为 387.229248046875 像素。arg namefy value387.229248046875/: 这是相机在 Y方向 的焦距单位也是像素。在这里 Y 方向的焦距与 X 方向一致都是 387.229248046875 像素。
section 3.5 !-- maximum velocity and acceleration the drone will reach --arg namemax_vel value2.0 /arg namemax_acc value3.0 /定义了无人机在运行过程中能够达到的最大速度和最大加速度用于限制无人机的运动性能。 注释: !-- maximum velocity and acceleration the drone will reach --: 这句话表示接下来定义的参数是无人机的最大速度和最大加速度它们用来限制无人机在飞行时的运动性能。 参数定义: arg namemax_vel value2.0 /: 这个参数 max_vel 定义了无人机的最大速度单位是米/秒 (m/s)。这里设置的值为 2.0表示无人机的飞行速度最大可以达到 2 米/秒。arg namemax_acc value3.0 /: 这个参数 max_acc 定义了无人机的最大加速度单位是米/秒² (m/s²)。这里设置的值为 3.0表示无人机的加速度最大可以达到 3 米/秒²。
注由于飞行环境以及误差通过设置速度和加速度最大值可以减少误差增加稳定性。
最大速度 (max_vel)用于限制无人机的飞行速度确保在规划路径或执行任务时不会超过指定的速度保证飞行的稳定性和安全性。最大加速度 (max_acc)用于限制无人机在加速和减速时的变化率防止无人机出现过快的加速度变化影响飞行平稳性。
section 3.6 !--always set to 1.5 times grater than sensing horizen--arg nameplanning_horizon value7.5 / 定义了无人机路径规划中的**规划视野planning horizon**参数其值通常设置为感知视野sensing horizon的1.5倍。planning_horizon 决定了路径规划算法在做出决策时能够看到的范围。规划视野越大算法能够考虑的路径和障碍物就越多从而可能提高路径规划的准确性和有效性。通常这个值需要大于感知视野以确保规划算法可以在足够的范围内进行有效的决策。 注释: !-- always set to 1.5 times greater than sensing horizon --: 这句话表示 planning_horizon 参数的值应该设置为感知视野sensing horizon的1.5倍。感知视野是指无人机能够探测到的最大距离。 参数定义: arg nameplanning_horizon value7.5 /: 这个参数 planning_horizon 定义了路径规划的视野范围单位是米m。在这个配置中值设置为 7.5表示路径规划系统考虑的范围是 7.5 米。
QA: How to set planning_horizon, why 7.5 meters? #107
section 3.7 !-- 1: use 2D Nav Goal to select goal --!-- 2: use global waypoints below --arg nameflight_type value2 /定义了无人机的飞行模式flight_type指定了无人机如何选择飞行目标。 注释: !-- 1: use 2D Nav Goal to select goal --: 这句话表示如果 flight_type 设置为 1无人机将使用 2D 导航目标2D Nav Goal来选择飞行目标。2D 导航目标通常是用户在地图上指定的目标位置。!-- 2: use global waypoints below --: 这句话表示如果 flight_type 设置为 2无人机将使用全局航点global waypoints来进行飞行。全局航点是一系列预定义的点通常用于无人机按照预设的路径进行飞行。如果设置为 1无人机将根据用户在地图上选择的2D目标位置来进行导航。如果设置为 2无人机将按照预定义的全局航点执行飞行任务。 参数定义: arg nameflight_type value2 /: 这个参数 flight_type 定义了无人机的飞行模式其值设置为 2。根据注释中的说明值为 2 表示无人机将使用全局航点来进行飞行。
section 3.8 !-- global waypoints --!-- It generates a piecewise min-snap traj passing all waypoints --arg namepoint_num value5 /arg namepoint0_x value-15.0 /arg namepoint0_y value0.0 /arg namepoint0_z value1.0 /arg namepoint1_x value0.0 /arg namepoint1_y value15.0 /arg namepoint1_z value1.0 /arg namepoint2_x value15.0 /arg namepoint2_y value0.0 /arg namepoint2_z value1.0 /arg namepoint3_x value0.0 /arg namepoint3_y value-15.0 /arg namepoint3_z value1.0 /arg namepoint4_x value-15.0 /arg namepoint4_y value0.0 /arg namepoint4_z value1.0 /定义了无人机飞行任务中的全局航点使用这些航点生成的最小跃变轨迹将使无人机在这些点之间飞行时轨迹尽可能平滑减少急剧的加速度变化生成一条经过所有航点的平滑路径。 注释: !-- global waypoints --: 这句话表示以下参数定义了全局航点。!-- It generates a piecewise min-snap traj passing all waypoints --: 这句话表示使用这些全局航点生成一条最小跃变轨迹min-snap trajectory即生成一条平滑的、尽可能减少加速度变化的路径经过所有指定的航点。 参数定义: arg namepoint_num value5 /: 这个参数 point_num 定义了全局航点的数量这里设置为 5表示有 5 个航点。 接下来的参数定义了每个航点的坐标 arg namepoint0_x value-15.0 / arg namepoint0_y value0.0 / arg namepoint0_z value1.0 / 这三个参数定义了第一个航点的 X、Y 和 Z 坐标分别为 -15.0、0.0 和 1.0。 arg namepoint1_x value0.0 / arg namepoint1_y value15.0 / arg namepoint1_z value1.0 / 这三个参数定义了第二个航点的坐标分别为 0.0、15.0 和 1.0。 arg namepoint2_x value15.0 / arg namepoint2_y value0.0 / arg namepoint2_z value1.0 / 这三个参数定义了第三个航点的坐标分别为 15.0、0.0 和 1.0。 arg namepoint3_x value0.0 / arg namepoint3_y value-15.0 / arg namepoint3_z value1.0 / 这三个参数定义了第四个航点的坐标分别为 0.0、-15.0 和 1.0。 arg namepoint4_x value-15.0 / arg namepoint4_y value0.0 / arg namepoint4_z value1.0 / 这三个参数定义了第五个航点的坐标分别为 -15.0、0.0 和 1.0。
section 4 轨迹服务器 !-- trajectory server --node pkgego_planner nametraj_server typetraj_server outputscreenremap from/position_cmd toplanning/pos_cmd/remap from/odom_world to$(arg odom_topic)/param nametraj_server/time_forward value1.0 typedouble//node定义了一个名为 traj_server 的 ROS 节点的启动参数。 注释: !-- trajectory server --: 这句话表示接下来配置的是**轨迹服务器trajectory server**节点的启动参数。 节点定义: node pkgego_planner nametraj_server typetraj_server outputscreen: pkgego_planner指定了节点所在的 ROS 包这里是 ego_planner。nametraj_server节点的名称为 traj_server。typetraj_server节点的类型为 traj_server即节点的可执行文件名。outputscreen表示将节点的输出信息打印到控制台屏幕上以便进行调试和监控。 话题重映射: remap from/position_cmd toplanning/pos_cmd/: 这条命令将话题 /position_cmd 重映射到 planning/pos_cmd。即节点 traj_server 将订阅 planning/pos_cmd而不是原来的 /position_cmd 话题。 remap from/odom_world to$(arg odom_topic)/: 这条命令将话题 /odom_world 重映射到由 odom_topic 参数指定的话题。$(arg odom_topic) 是一个参数引用意味着 /odom_world 实际上会订阅由 odom_topic 参数定义的话题如之前配置中的 /visual_slam/odom。 参数设置: param nametraj_server/time_forward value1.0 typedouble/: 这行设置了名为 traj_server/time_forward 的参数其值为 1.0类型为 double。这个参数可能用于控制轨迹服务器的时间前瞻量即在规划轨迹时考虑的时间范围。
section 5 航点生成器 node pkgwaypoint_generator namewaypoint_generator typewaypoint_generator outputscreenremap from~odom to$(arg odom_topic)/ remap from~goal to/move_base_simple/goal/remap from~traj_start_trigger to/traj_start_trigger /param namewaypoint_type valuemanual-lonely-waypoint/ /node定义了一个名为 waypoint_generator 的 ROS 节点的启动参数确保了 waypoint_generator 节点能够正确地订阅需要的话题并按照指定的参数进行航点生成。 节点定义: node pkgwaypoint_generator namewaypoint_generator typewaypoint_generator outputscreen: pkgwaypoint_generator指定了节点所在的 ROS 包这里是 waypoint_generator。namewaypoint_generator节点的名称为 waypoint_generator。typewaypoint_generator节点的可执行文件名为 waypoint_generator。outputscreen表示将节点的输出信息打印到控制台屏幕上以便进行调试和监控。 话题重映射: remap from~odom to$(arg odom_topic)/: 这条命令将节点中的 ~odom 话题重映射到由 odom_topic 参数指定的话题。$(arg odom_topic) 是一个参数引用意味着节点将订阅由 odom_topic 参数定义的话题比如 /visual_slam/odom。 remap from~goal to/move_base_simple/goal/: 这条命令将节点中的 ~goal 话题重映射到 /move_base_simple/goal。即节点将从 /move_base_simple/goal 话题接收目标点数据。 remap from~traj_start_trigger to/traj_start_trigger /: 这条命令将节点中的 ~traj_start_trigger 话题重映射到 /traj_start_trigger。即节点将从 /traj_start_trigger 话题接收触发信号。 参数设置: param namewaypoint_type valuemanual-lonely-waypoint/: 这行设置了名为 waypoint_type 的参数其值为 manual-lonely-waypoint。这个参数可能用于定义航点生成器的工作模式或类型这里表示采用手动的孤立航点方式。
section 6 simulator.xml配置 !-- use simulator --include file$(find ego_planner)/launch/simulator.xmlarg namemap_size_x_ value$(arg map_size_x)/arg namemap_size_y_ value$(arg map_size_y)/arg namemap_size_z_ value$(arg map_size_z)/arg namec_num value200/arg namep_num value200/arg namemin_dist value1.2/arg nameodometry_topic value$(arg odom_topic) //include包含一个名为 simulator.xml 的 ROS 启动文件并传递一些参数用于覆盖默认xml文件中的参数使模拟器能够按照指定的设置进行模拟。 注释: !-- use simulator --: 这句话表示接下来配置的内容是用于启动模拟器。 包含文件: include file$(find ego_planner)/launch/simulator.xml: file$(find ego_planner)/launch/simulator.xml指定要包含的启动文件路径。$(find ego_planner) 是 ROS 的一个命令用于找到 ego_planner 包的位置然后从该位置加载 launch/simulator.xml 文件。 参数传递: arg namemap_size_x_ value$(arg map_size_x)/: 这个参数将 map_size_x_ 传递给 simulator.xml 文件其值为 $(arg map_size_x)。即map_size_x_ 的值来自于当前启动文件中的 map_size_x 参数。 arg namemap_size_y_ value$(arg map_size_y)/: 这个参数将 map_size_y_ 传递给 simulator.xml 文件其值为 $(arg map_size_y)。即map_size_y_ 的值来自于当前启动文件中的 map_size_y 参数。 arg namemap_size_z_ value$(arg map_size_z)/: 这个参数将 map_size_z_ 传递给 simulator.xml 文件其值为 $(arg map_size_z)。即map_size_z_ 的值来自于当前启动文件中的 map_size_z 参数. arg namec_num value200/: 这个参数设置 c_num 的值为 200可能表示模拟器中使用的某种元素的数量如障碍物或对象的数量。 arg namep_num value200/: 这个参数设置 p_num 的值为 200可能表示模拟器中使用的另一种元素的数量如路径点或目标点的数量。 arg namemin_dist value1.2/: 这个参数设置 min_dist 的值为 1.2可能表示模拟器中某种元素之间的最小距离或间隔。 arg nameodometry_topic value$(arg odom_topic) /: 这个参数将 odometry_topic 传递给 simulator.xml 文件其值为 $(arg odom_topic)。即odometry_topic 的值来自于当前启动文件中的 odom_topic 参数。
section 7 rviz.launch配置 include file$(find ego_planner)/launch/rviz.launch/包含一个名为 rviz.launch 的 ROS 启动文件。
4. 总结
通过这个 simple_run.launch 启动文件可以了解到除了该文件中的配置参数以外:
引用了一些基础配置文件引入了一些ROS节点
simple_run.launch├── traj_server //[ego-planner开源代码之traj_server数据流分析](https://blog.csdn.net/lida2003/article/details/142312414)├── waypoint_generator├── advanced_param.xml //[ego-planner开源代码之advanced_param.xml介绍分析](https://blog.csdn.net/lida2003/article/details/142322809)│ └── ego_planner_node //[ego-planner开源代码之ego_planner_node数据流分析](ego-planner开源代码之ego_planner_node数据流分析)├── simulator.xml //[ego-planner开源代码之simulator.xml介绍分析](https://blog.csdn.net/lida2003/article/details/142336384)│ ├── mockamap_node│ ├── quadrotor_simulator_so3│ ├── nodelet│ ├── odom_visualization│ └── pcl_render_node└── rviz.launch└── rviz└── default.rviz //[ego-planner开源代码之default.rviz介绍分析](https://blog.csdn.net/lida2003/article/details/142324456)上面标注了前面分析过的node代码正因为有这么多的代码数据流模块没有进行分析所以才导致我们在分析模拟的时候感觉总是缺了什么理不清楚来龙去脉。
后续我们将随着时间的推移逐步的分析上面node的数据流。
5. 附录
5.1 PDCA 戴明循环
PDCAPlan-Do-Check-Act循环也被称为戴明循环是一种持续改进质量管理的工具用于优化流程和解决问题。它帮助企业和个人通过反复评估和改进来达到更好的成果。以下是PDCA四个阶段的介绍 Plan计划 在这个阶段确定需要改进的问题或目标分析现状设定目标并制定一个行动计划来解决问题或实现目标。计划中应包括具体的行动步骤、时间表和所需资源。 Do执行 根据计划实施行动按照步骤执行任务。这一阶段强调小范围实验性地执行以减少潜在的风险。如果可能先在较小范围内试点验证计划的可行性。 Check检查 执行完毕后对结果进行检查和评估。通过数据和事实来衡量计划是否有效是否达到预期目标。分析执行过程中的问题和偏差并记录下来。 Act行动 如果计划有效则将其标准化并在更大范围内实施。如果计划不完全有效找出问题的根源并修改计划重新开始PDCA循环。这个阶段的关键是总结经验教训持续改进。
PDCA 循环的核心是通过反复迭代持续提升流程效率和质量。这一工具广泛应用于生产管理、质量控制、项目管理等领域。
5.2 相机内参
相机内参也称为相机内部参数或内参矩阵描述了相机成像过程中的固有特性用于将3D世界坐标转换为2D图像坐标。相机内参反映了相机的光学和几何属性用于将深度相机捕捉到的二维图像数据转化为三维空间坐标。这些参数通常在将图像坐标转换为三维坐标时使用是路径规划或3D重建等应用的关键参数。 焦距 (focal length, f)描述相机镜头的光学放大倍数。通常在图像坐标系中它以像素单位表示并分为两个分量。定义了相机成像时的缩放关系影响图像中物体的投影比例用于将像素坐标转换为物理空间中的距离。 f x f_x fx水平方向的焦距。 f y f_y fy垂直方向的焦距。 主点 (principal point)图像中光轴与成像平面的交点也就是图像的中心点。由于制造误差主点通常不在图像的正中心。表示成像平面上光轴的中心位置用于确定相机的视场中心。 c x c_x cx主点的水平坐标。 c y c_y cy主点的垂直坐标。 畸变系数 (distortion coefficients)由于镜头的光学特性图像可能会出现径向和切向畸变。内参还包括这些畸变的校正参数常见的畸变包括 径向畸变使图像中直线向外或向内弯曲。切向畸变由于镜头与成像平面不完全平行导致图像的畸变。
这些参数通常以矩阵形式表示为3x3的内参矩阵相机矩阵 K ( f x 0 c x 0 f y c y 0 0 1 ) K \begin{pmatrix} f_x 0 c_x \\ 0 f_y c_y \\ 0 0 1 \end{pmatrix} K fx000fy0cxcy1
通过相机内参矩阵3D世界坐标可以转换为2D图像平面上的像素坐标这对计算机视觉中的各种任务如立体视觉、SLAM等至关重要。
注实际标定可以通过拍摄棋盘格图像并用校准软件进行计算获取相关参数。用于立体视觉和SLAM应用的传感器设计厂家也会在传感设备出厂时进行校准和记录可通过特殊命令获取生产校准参数。
5.3 Field of View 感知视野
感知视野Field of View简称 FOV是指传感器例如相机、激光雷达等在某一时刻能够覆盖和检测到的空间范围。它描述了传感器可以“看到”或“感知”到的环境区域通常以角度或弧度来表示。感知视野在计算机视觉、机器人、无人驾驶等领域中非常重要特别是对于传感器数据的处理和环境感知。
感知视野的具体定义
水平视野 (Horizontal FOV, HFOV)传感器在水平方向上可以感知的最大角度范围。垂直视野 (Vertical FOV, VFOV)传感器在垂直方向上可以感知的最大角度范围。
感知视野可以用角度来衡量例如常见相机的水平视野可能在60度到120度之间。FOV越大表示传感器能覆盖的范围越广但较大的FOV可能会带来较大的失真特别是在边缘区域。
感知视野的影响因素
传感器的物理属性例如镜头的焦距会直接影响相机的视野大小。焦距短广角镜头会提供较大的视野而焦距长长焦镜头会提供较小的视野。安装位置和角度相机或传感器的安装高度、倾斜角度等都会改变其感知的范围和视野角度。传感器类型不同传感器的感知视野不同。例如激光雷达的FOV和相机的FOV有很大区别。
感知视野的大小影响了机器人、无人机或自动驾驶车辆的感知能力决定了它们能够覆盖多少环境信息来进行决策和控制。