ego-planner开源代码之启动参数介绍分析
ego-planner开源代码之启动参数介绍&分析
- 1. 源由
- 2. 逻辑分析
- 3. 启动参数
- section 1 三维地图尺寸
- section 2 里程计话题映射
- section 3 advanced_param.xml配置
- section 3.1
- section 3.2
- section 3.3
- section 3.4
- section 3.5
- section 3.6
- section 3.7
- section 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.3@ego-planner编译安装,并在此基础上运行过仿真模拟,甚至看过uav_simulation代码,那么可以体会下整体上,要在模块基础上,结合各模块的数据流了解整个系统,还是会有很多盲点。
为此,我们另辟蹊径,从仿真模拟的入参配置来看看,这个游戏是如何来玩的!
- 从应用的角度,复杂场景,往往涉及诸多变量;
- 从技术的角度,应用场景多,就是条件输入多,同时判断的变量条件就比较多;
- 从算法的角度,没有算法是万万不能的,但是算法也并非是万能的。只有在满足预设前提,算法才能正确执行;
经常会有人反馈:“研发人员用用都是挺好的,到了客户那里一堆问题。”
从产品的角度:预研算法通常仅仅实现了“阳光”场景的逻辑。换句话说:当入参在某些合理输入情况下,输出是期望结果;当存在异常条件时,由于程序逻辑的不完善、会导致结果混乱甚至宕机发生。
因此,发现问题、研究问题、排除问题、改进方法、解决问题是一种螺旋式的过程,而这个过程通常在工程技术上采用PDCA的方式进行不断完善和优化。
复杂问题简单化的逻辑,就是在合理范围内使用,逻辑上就能复现工程技术带来的结果。或者说算法逻辑能100%复现,当无法复现就需要排除或者找到对应关系,提前规避,确保最终用户的用户体验。
3. 启动参数
废话不多说,直接上正菜!
section 1 三维地图尺寸
<!-- size of map, change the size inflate x, y, z according to your application --><arg name="map_size_x" value="40.0"/><arg name="map_size_y" value="40.0"/><arg name="map_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 name="odom_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 name="odom_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 name="map_size_x_" value="$(arg map_size_x)"/><arg name="map_size_y_" value="$(arg map_size_y)"/><arg name="map_size_z_" value="$(arg map_size_z)"/><arg name="odometry_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 --><!-- don't set cloud_topic if you already set these ones! --><arg name="camera_pose_topic" value="/pcl_render_node/camera_pose"/><arg name="depth_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。<!-- don't set cloud_topic if you already set these ones! -->: 这句话表示如果已经设置了相机位姿和深度图像话题,就不要再设置点云话题(cloud_topic),因为这两个信息已经足够生成点云。
-
参数定义:
-
<arg name="camera_pose_topic" value="/pcl_render_node/camera_pose"/>: 这个参数camera_pose_topic定义了相机位姿信息的话题,话题名称为/pcl_render_node/camera_pose。在ROS系统中,ego-planner 或其他节点将从该话题订阅相机的位姿(即相机在世界坐标系中的位置和姿态)信息。 -
<arg name="depth_topic" value="/pcl_render_node/depth"/>: 这个参数depth_topic定义了深度图像的话题,话题名称为/pcl_render_node/depth。系统将从这个话题订阅深度图像数据,深度图像通常用于生成三维点云或者帮助路径规划时感知障碍物。
-
section 3.3
<!-- topic of point cloud measurement, such as from LIDAR --><!-- don't set camera pose and depth, if you already set this one! --><arg name="cloud_topic" value="/pcl_render_node/cloud"/>
定义了一个点云测量话题的参数,主要用于从激光雷达(LiDAR)或其他传感器中获取点云数据。
-
注释:
<!-- topic of point cloud measurement, such as from LIDAR -->: 这句话表示cloud_topic是用于获取点云测量数据的ROS话题,数据来源可以是 LiDAR(激光雷达)或者其他提供点云的传感器。<!-- don't set camera pose and depth, if you already set this one! -->: 这句话提醒用户,如果已经设置了cloud_topic(点云话题),不要再设置相机位姿和深度图像,因为点云数据已经包含了三维空间信息,不需要额外使用相机的位姿和深度数据。
-
参数定义:
<arg name="cloud_topic" value="/pcl_render_node/cloud"/>: 这个参数cloud_topic定义了点云数据的话题名称为/pcl_render_node/cloud。系统或其他节点会从该话题订阅到点云数据,这些数据通常包含传感器扫描到的环境三维点的信息(即障碍物的位置、形状等)。
section 3.4
<!-- intrinsic params of the depth camera --><arg name="cx" value="321.04638671875"/><arg name="cy" value="243.44969177246094"/><arg name="fx" value="387.229248046875"/><arg name="fy" value="387.229248046875"/>
定义了深度相机的内参(intrinsic parameters),这些参数是相机的固有属性,用于描述相机的光学特性和几何关系,主要包括焦距和主点(光轴中心)的坐标。
-
注释:
<!-- intrinsic params of the depth camera -->: 这句话表示接下来定义的参数是深度相机的内参,用于描述相机的内部光学和几何特性。
-
参数定义:
<arg name="cx" value="321.04638671875"/>: 这是相机主点(principal point)在图像平面上的 X坐标。主点是相机成像平面的中心点(即光轴与成像平面交点)。在这段代码中,主点的 X 坐标为321.04638671875。<arg name="cy" value="243.44969177246094"/>: 这是相机主点在图像平面上的 Y坐标,主点的 Y 坐标为243.44969177246094。<arg name="fx" value="387.229248046875"/>: 这是相机在 X方向 的焦距,单位为像素。焦距表示镜头的光学中心到成像平面的距离,在这里 X 方向的焦距为387.229248046875像素。<arg name="fy" value="387.229248046875"/>: 这是相机在 Y方向 的焦距,单位也是像素。在这里 Y 方向的焦距与 X 方向一致,都是387.229248046875像素。
section 3.5
<!-- maximum velocity and acceleration the drone will reach --><arg name="max_vel" value="2.0" /><arg name="max_acc" value="3.0" />
定义了无人机在运行过程中能够达到的最大速度和最大加速度,用于限制无人机的运动性能。
-
注释:
<!-- maximum velocity and acceleration the drone will reach -->: 这句话表示接下来定义的参数是无人机的最大速度和最大加速度,它们用来限制无人机在飞行时的运动性能。
-
参数定义:
<arg name="max_vel" value="2.0" />: 这个参数max_vel定义了无人机的最大速度,单位是米/秒 (m/s)。这里设置的值为2.0,表示无人机的飞行速度最大可以达到 2 米/秒。<arg name="max_acc" value="3.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 name="planning_horizon" value="7.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 name="planning_horizon" value="7.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 name="flight_type" value="2" />
定义了无人机的飞行模式(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 name="flight_type" value="2" />: 这个参数flight_type定义了无人机的飞行模式,其值设置为2。根据注释中的说明,值为2表示无人机将使用全局航点来进行飞行。
section 3.8
<!-- global waypoints --><!-- It generates a piecewise min-snap traj passing all waypoints --><arg name="point_num" value="5" /><arg name="point0_x" value="-15.0" /><arg name="point0_y" value="0.0" /><arg name="point0_z" value="1.0" /><arg name="point1_x" value="0.0" /><arg name="point1_y" value="15.0" /><arg name="point1_z" value="1.0" /><arg name="point2_x" value="15.0" /><arg name="point2_y" value="0.0" /><arg name="point2_z" value="1.0" /><arg name="point3_x" value="0.0" /><arg name="point3_y" value="-15.0" /><arg name="point3_z" value="1.0" /><arg name="point4_x" value="-15.0" /><arg name="point4_y" value="0.0" /><arg name="point4_z" value="1.0" />
定义了无人机飞行任务中的全局航点,使用这些航点生成的最小跃变轨迹将使无人机在这些点之间飞行时,轨迹尽可能平滑,减少急剧的加速度变化,生成一条经过所有航点的平滑路径。
-
注释:
<!-- global waypoints -->: 这句话表示以下参数定义了全局航点。<!-- It generates a piecewise min-snap traj passing all waypoints -->: 这句话表示使用这些全局航点生成一条最小跃变轨迹(min-snap trajectory),即生成一条平滑的、尽可能减少加速度变化的路径,经过所有指定的航点。
-
参数定义:
-
<arg name="point_num" value="5" />: 这个参数point_num定义了全局航点的数量,这里设置为5,表示有 5 个航点。 -
接下来的参数定义了每个航点的坐标:
-
<arg name="point0_x" value="-15.0" /> -
<arg name="point0_y" value="0.0" /> -
<arg name="point0_z" value="1.0" />- 这三个参数定义了第一个航点的 X、Y 和 Z 坐标,分别为
-15.0、0.0和1.0。
- 这三个参数定义了第一个航点的 X、Y 和 Z 坐标,分别为
-
<arg name="point1_x" value="0.0" /> -
<arg name="point1_y" value="15.0" /> -
<arg name="point1_z" value="1.0" />- 这三个参数定义了第二个航点的坐标,分别为
0.0、15.0和1.0。
- 这三个参数定义了第二个航点的坐标,分别为
-
<arg name="point2_x" value="15.0" /> -
<arg name="point2_y" value="0.0" /> -
<arg name="point2_z" value="1.0" />- 这三个参数定义了第三个航点的坐标,分别为
15.0、0.0和1.0。
- 这三个参数定义了第三个航点的坐标,分别为
-
<arg name="point3_x" value="0.0" /> -
<arg name="point3_y" value="-15.0" /> -
<arg name="point3_z" value="1.0" />- 这三个参数定义了第四个航点的坐标,分别为
0.0、-15.0和1.0。
- 这三个参数定义了第四个航点的坐标,分别为
-
<arg name="point4_x" value="-15.0" /> -
<arg name="point4_y" value="0.0" /> -
<arg name="point4_z" value="1.0" />- 这三个参数定义了第五个航点的坐标,分别为
-15.0、0.0和1.0。
- 这三个参数定义了第五个航点的坐标,分别为
-
-
section 4 轨迹服务器
<!-- trajectory server --><node pkg="ego_planner" name="traj_server" type="traj_server" output="screen"><remap from="/position_cmd" to="planning/pos_cmd"/><remap from="/odom_world" to="$(arg odom_topic)"/><param name="traj_server/time_forward" value="1.0" type="double"/></node>
定义了一个名为 traj_server 的 ROS 节点的启动参数。
-
注释:
<!-- trajectory server -->: 这句话表示接下来配置的是**轨迹服务器(trajectory server)**节点的启动参数。
-
节点定义:
<node pkg="ego_planner" name="traj_server" type="traj_server" output="screen">:pkg="ego_planner":指定了节点所在的 ROS 包,这里是ego_planner。name="traj_server":节点的名称为traj_server。type="traj_server":节点的类型为traj_server,即节点的可执行文件名。output="screen":表示将节点的输出信息打印到控制台屏幕上,以便进行调试和监控。
-
话题重映射:
<remap from="/position_cmd" to="planning/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 name="traj_server/time_forward" value="1.0" type="double"/>:- 这行设置了名为
traj_server/time_forward的参数,其值为1.0,类型为double。这个参数可能用于控制轨迹服务器的时间前瞻量(即在规划轨迹时考虑的时间范围)。
- 这行设置了名为
section 5 航点生成器
<node pkg="waypoint_generator" name="waypoint_generator" type="waypoint_generator" output="screen"><remap from="~odom" to="$(arg odom_topic)"/> <remap from="~goal" to="/move_base_simple/goal"/><remap from="~traj_start_trigger" to="/traj_start_trigger" /><param name="waypoint_type" value="manual-lonely-waypoint"/> </node>
定义了一个名为 waypoint_generator 的 ROS 节点的启动参数,确保了 waypoint_generator 节点能够正确地订阅需要的话题,并按照指定的参数进行航点生成。
-
节点定义:
<node pkg="waypoint_generator" name="waypoint_generator" type="waypoint_generator" output="screen">:pkg="waypoint_generator":指定了节点所在的 ROS 包,这里是waypoint_generator。name="waypoint_generator":节点的名称为waypoint_generator。type="waypoint_generator":节点的可执行文件名为waypoint_generator。output="screen":表示将节点的输出信息打印到控制台屏幕上,以便进行调试和监控。
-
话题重映射:
<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 name="waypoint_type" value="manual-lonely-waypoint"/>:- 这行设置了名为
waypoint_type的参数,其值为manual-lonely-waypoint。这个参数可能用于定义航点生成器的工作模式或类型,这里表示采用手动的孤立航点方式。
- 这行设置了名为
section 6 simulator.xml配置
<!-- use simulator --><include file="$(find ego_planner)/launch/simulator.xml"><arg name="map_size_x_" value="$(arg map_size_x)"/><arg name="map_size_y_" value="$(arg map_size_y)"/><arg name="map_size_z_" value="$(arg map_size_z)"/><arg name="c_num" value="200"/><arg name="p_num" value="200"/><arg name="min_dist" value="1.2"/><arg name="odometry_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 name="map_size_x_" value="$(arg map_size_x)"/>:- 这个参数将
map_size_x_传递给simulator.xml文件,其值为$(arg map_size_x)。即,map_size_x_的值来自于当前启动文件中的map_size_x参数。
- 这个参数将
<arg name="map_size_y_" value="$(arg map_size_y)"/>:- 这个参数将
map_size_y_传递给simulator.xml文件,其值为$(arg map_size_y)。即,map_size_y_的值来自于当前启动文件中的map_size_y参数。
- 这个参数将
<arg name="map_size_z_" value="$(arg map_size_z)"/>:- 这个参数将
map_size_z_传递给simulator.xml文件,其值为$(arg map_size_z)。即,map_size_z_的值来自于当前启动文件中的map_size_z参数.
- 这个参数将
<arg name="c_num" value="200"/>:- 这个参数设置
c_num的值为200,可能表示模拟器中使用的某种元素的数量,如障碍物或对象的数量。
- 这个参数设置
<arg name="p_num" value="200"/>:- 这个参数设置
p_num的值为200,可能表示模拟器中使用的另一种元素的数量,如路径点或目标点的数量。
- 这个参数设置
<arg name="min_dist" value="1.2"/>:- 这个参数设置
min_dist的值为1.2,可能表示模拟器中某种元素之间的最小距离或间隔。
- 这个参数设置
<arg name="odometry_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 戴明循环
PDCA(Plan-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有很大区别。
感知视野的大小影响了机器人、无人机或自动驾驶车辆的感知能力,决定了它们能够覆盖多少环境信息来进行决策和控制。
相关文章:
ego-planner开源代码之启动参数介绍分析
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 轨迹服务…...
828 华为云征文|华为 Flexus 云服务器打造 Laverna 在线笔记应用
一、引言 在当今数字化时代,高效的笔记管理工具对于学习、工作和生活都至关重要。Laverna 作为一款功能强大的开源在线笔记应用,提供了 Markdown 编辑、加密支持等特性,是替代 Evernote 的绝佳选择。在 2024 年 9 月 14 日这个充满创新的日子…...
数据结构与算法-Trie树添加与搜索
trie树的使用场景 我们若需要制作一个通讯录的软件,使用常规树结构查询的复杂度为O(logn),但trie树的复杂度确与数据多少无关,与单词长度有关,这就大大缩减的查询的时间复杂度。 trie树的基本实现 基础结构 package com.study.trieDemo;i…...
AIGC专栏15——CogVideoX-Fun详解 支持图文生视频 拓展CogVideoX到256~1024任意分辨率生成
AIGC专栏15——CogVideoX-Fun详解 支持图&文生视频 拓展CogVideoX到256~1024任意分辨率生成 学习前言项目特点生成效果相关地址汇总源码下载地址 CogVideoX-Fun详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3EasyAnimate-I2V 算法细节算法组成InPa…...
BFS 解决多源最短路问题
文章目录 多源BFS542. 01 矩阵题目解析算法原理代码实现 1020. 飞地的数量题目解析算法原理 1765. 地图中的最高点题目解析算法原理代码实现 1162. 地图分析题目解析算法原理代码实现 多源BFS 单源最短路: 一个起点、一个终点 多源最短路: 可以多个起点…...
论文笔记:交替单模态适应的多模态表征学习
整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation)论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比,MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…...
鸿蒙OS 线程间通信
鸿蒙OS 线程间通信概述 在开发过程中,开发者经常需要在当前线程中处理下载任务等较为耗时的操作,但是又不希望当前的线程受到阻塞。此时,就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制,…...
执行 npm报错 Cannot find module ‘../lib/cli.js‘
报错 /usr/local/node/node-v18.20.4-linux-x64/bin/npm node:internal/modules/cjs/loader:1143 throw err; ^ Error: Cannot find module ../lib/cli.js Require stack: - /usr/local/node/node-v18.20.4-linux-x64/bin/npm at Module._resolveFilename (node:inter…...
基于SpringBoot+Vue+MySQL的国产动漫网站
系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步,动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而,市场上现有的动漫平台大多以国外动漫为主,对国产动漫的推广和展示存在不…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制
目录 前言 知识储备 什么是气动控制: 气动控制基础知识 一、气动元件 二、气路设计 三、气动控制系统 气动控制系统构成图 气动控制系统基本组成功能图 几种常见的气动执行元件实物图 常用气动压力控制阀实物图 常用气动流动控制阀实物图 电磁控制换向发实物图 部…...
Ubuntu 20.04 内核升级后网络丢失问题的解决过程
在 Ubuntu 系统中,内核升级是一个常见的操作,旨在提升系统性能、安全性和兼容性。然而,有时这一操作可能会带来一些意外的副作用,比如导致网络功能的丧失。 本人本来是想更新 Nvidia 显卡的驱动,使用 ubuntu-drivers …...
论文解读《LaMP: When Large Language Models Meet Personalization》
引言:因为导师喊我围绕 “大语言模型的个性化、风格化生成” 展开研究,所以我就找相关论文,最后通过 ACL 官网找到这篇,感觉还不错,就开始解读吧! “说是解读,其实大部分都是翻译哈哈哈&#x…...
Excel VLOOKUP函数怎么用?vlookup函数的使用方法及案例
大家好,这里是效率办公指南! 🔎 在Excel的世界里,VLOOKUP函数无疑是查询和数据分析中的明星。无论是从庞大的数据表中提取特定信息,还是进行数据的快速匹配,VLOOKUP都能大显身手。今天,我们将深…...
专为汽车功能应用打造的 MLX90376GGO、MLX90377GGO、MLX90377GDC-ADB-280 Triaxis®磁位置传感器 IC
一、MLX90376 Triaxis堆叠式高性能位置传感器芯片(模拟/PWM/SENT/SPC) MLX90376GGO-ABA-600 MLX90376GGO-ABA-630 MLX90376GGO-ABA-680 MLX90376是一款磁性绝对位置传感器芯片,适用于要求具备抗杂散磁场干扰性能的360旋转汽车应用。它提供…...
34.贪心算法1
0.贪心算法 1.柠檬水找零(easy) . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元:直接收下…...
DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包
在现代数据驱动的业务环境中,数据迁移和集成是常见的需求。DataX,作为阿里云开源的数据集成工具,提供了强大的数据同步能力,支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…...
Axure设计之表格列冻结(动态面板+中继器)
在Web端产品设计中,复杂的表格展示是常见需求,尤其当表格包含大量列时,如何在有限的屏幕空间内优雅地展示所有信息成为了一个挑战。用户通常需要滚动查看隐藏列,但关键信息列(如ID、操作按钮等)在滚动时保持…...
WPF DataGrid 动态修改某一个单元格的样式
WPF DataGrid 动态修改某一个单元格的样式 <DataGrid Name"main_datagrid_display" Width"1267" Height"193" Grid.Column"1"ItemsSource"{Binding DataGridModels}"><DataGrid.Columns><!--ElementStyle 设…...
如何安装部署kafka
安装和部署Apache Kafka需要以下几个步骤,包括下载 Kafka、配置 ZooKeeper(或者使用 Kafka 自带的 Kafka Raft 模式替代 ZooKeeper),以及启动 Kafka 服务。以下是一个但基于 Linux 的典型安装流程,可以根据需要改装到其…...
Centos7-rpm包管理器方式安装MySQL 5.7.25
前言 本文用于学习通过Mysql压缩包在centos7中安装和配置的过程以及过程中碰到的Bug解决。 Mysql安装包下载和上传 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/访问Mysql官方下载站,选择对应的…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
