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 t