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 Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...