ego-planner开源代码之数据流分析
1. 源由
《Ardupilot开源飞控之FollowMe验证平台》改进的飞机马上要回来了。
鉴于实际原因,我们需要加速数据流分析:
- 工期的排程比较赶了;
- 前面介绍了灰盒测试角度分析,这次直接从白盒角度切入;
ego-planner
看了下除了模拟部分外,输入/输出貌似接口不是非常复杂;
因此,后续 ego-planner 的相关数据流分析采用白盒、或者灰盒整理出来。
本章将是一个汇总文件,后续逐步将数据流分析 或者 其他参数配置的理解分门别类的整理出来。
2. 测试策略
黑盒测试、灰盒测试和白盒测试是软件测试中的三种不同策略,主要区别在于测试人员对系统内部结构的了解程度。
测试类型 | 测试人员了解程度 | 测试对象 | 关注点 |
---|---|---|---|
黑盒测试 | 不了解系统内部实现 | 功能接口 | 功能性、外部行为 |
灰盒测试 | 了解部分内部结构 | 功能接口+内部实现 | 功能性与部分内部流程 |
白盒测试 | 完全了解系统内部实现 | 源代码 | 代码逻辑、实现细节、效率 |
这三种测试方法各有优缺点,通常会结合使用,以确保软件的各个层面都能得到充分的测试。
2.1 黑盒测试(Black Box Testing)
黑盒测试是一种不考虑内部实现的测试方法,测试人员只需要知道输入和期望的输出,而不关注代码的具体实现细节。测试的重点是验证系统的功能和行为是否符合预期。
特点:
- 测试者不需要了解代码实现或系统内部结构。
- 主要关注的是功能测试,以确保软件按照需求规范运行。
- 常用的测试技术包括等价类划分、边界值分析和错误推测等。
适用场景:
- 用户界面测试、功能测试、集成测试等。
优点:
- 测试覆盖了实际使用场景,能有效找到功能性缺陷。
缺点:
- 无法发现系统内部的设计缺陷或效率问题。
示例:
在黑盒测试中,测试人员输入不同的用户名和密码组合来测试登录功能是否正确工作,而无需关心背后的验证逻辑如何实现。
2.2 灰盒测试(Gray Box Testing)
灰盒测试是一种介于黑盒和白盒之间的测试方法。测试人员部分了解系统的内部结构,并使用这些信息来设计测试用例。这种测试方法既考虑系统的功能,也会在一定程度上关注内部流程和数据流。
特点:
- 测试者了解部分内部实现,但不深入到每个细节。
- 结合功能测试和结构测试的优点,通过了解系统内部来设计更具针对性的测试用例。
适用场景:
- 安全测试、集成测试、回归测试等场景。
优点:
- 通过了解系统内部状态,能够设计更高效的测试用例。
- 能够找到一些深层次的缺陷,比如边界条件问题。
缺点:
- 比黑盒测试更复杂,需要测试者具备一定的系统知识。
示例:
测试人员通过了解系统的数据库结构,结合输入数据,设计测试用例以确保系统能正确处理异常的数据库输入。
2.3 白盒测试(White Box Testing)
白盒测试是基于系统内部实现的测试方法。测试人员需要了解系统的源代码,并根据代码逻辑进行详细的测试。测试的目标是覆盖代码中的每条语句、分支和路径,以确保系统内部的逻辑和实现是正确的。
特点:
- 测试者完全了解代码的结构和实现。
- 主要进行代码级别的测试,如语句覆盖、分支覆盖和路径覆盖。
- 关注代码的正确性、性能和安全性。
适用场景:
- 单元测试、代码审查、性能优化等。
优点:
- 能够发现隐藏的代码缺陷、逻辑错误和安全漏洞。
- 覆盖了系统内部的实现细节,测试更全面。
缺点:
- 测试需要高度的技术能力,测试用例维护成本较高。
- 可能忽略系统外部的集成和使用场景。
示例:
白盒测试人员可能会通过单元测试工具,直接测试代码中的每个函数、条件分支、循环等,确保系统内部逻辑无误。
3. 后续汇总
- ego-planner开源代码之ego_planner_node数据流分析
- ego-planner开源代码之traj_server数据流分析
- To be continued … …
4. 参考资料
【1】Ardupilot开源飞控之FollowMe验证平台搭建
【2】VINS-Fusion开源代码之vins_node数据流分析
【3】VINS-Fusion开源代码之loop_fusion_node数据流分析
5. 附录
5.1 rosbag命令操作详细解释和举例
rosbag
是 ROS(Robot Operating System)中的一个工具,用来记录、播放和管理机器人传感器数据和消息。它可以将 ROS 的话题数据保存为文件,也可以从文件中回放这些数据,非常适合调试和数据分析。
以下是一些常用的 rosbag
命令及其详细解释和示例。
1. 记录数据:rosbag record
rosbag record
命令用于记录 ROS 系统中的消息。你可以指定想要记录的特定话题,也可以记录所有话题的数据。
常用选项:
-a
:记录所有话题。-O <filename>
:将输出文件命名为<filename>.bag
。-e <regex>
:通过正则表达式匹配话题并记录。--duration=<seconds>
:指定录制持续的时间。--split
:根据设定的文件大小或持续时间,将录制内容分割为多个bag文件。
示例:
-
记录所有话题:
rosbag record -a
该命令将记录所有话题,并生成一个
.bag
文件。 -
记录特定话题:
rosbag record -O my_bag /camera/image_raw /odom
该命令记录
/camera/image_raw
和/odom
两个话题,并将输出保存为my_bag.bag
文件。 -
通过正则表达式匹配并记录话题:
rosbag record -e "/camera/.*"
该命令会记录所有匹配
/camera/.*
的话题。 -
记录一段时间:
rosbag record -a --duration=60
该命令记录所有话题,持续时间为 60 秒。
2. 播放数据:rosbag play
rosbag play
命令用于回放 .bag
文件中保存的消息。它将数据重新发布到 ROS 话题上。
常用选项:
-r <factor>
:改变回放速率(例如 2 表示 2 倍速播放,0.5 表示半速播放)。-s <seconds>
:从指定时间开始播放。-l
:循环播放。-q
:静默模式,不输出控制信息。
示例:
-
简单回放 bag 文件:
rosbag play my_bag.bag
该命令将回放
my_bag.bag
文件中的所有消息。 -
2 倍速回放:
rosbag play -r 2 my_bag.bag
该命令将以 2 倍速率回放
my_bag.bag
文件。 -
从第 10 秒开始播放:
rosbag play -s 10 my_bag.bag
该命令从
my_bag.bag
文件的第 10 秒开始播放。 -
循环播放:
rosbag play -l my_bag.bag
该命令将循环播放
my_bag.bag
文件中的数据。
3. 查看 bag 文件信息:rosbag info
rosbag info
命令用于查看 .bag
文件的概要信息,例如记录的话题、消息数量、文件大小和时间范围等。
示例:
查看 bag 文件信息:
rosbag info my_bag.bag
该命令将显示 my_bag.bag
文件的概要信息。
4. 过滤和导出 bag 文件:rosbag filter
和 rosbag decompress/compress
rosbag filter
:用于根据条件筛选bag
文件中的消息,生成新的bag
文件。
示例:
过滤 /odom
话题:
rosbag filter input.bag output.bag 'topic == "/odom"'
该命令会将 input.bag
中 /odom
话题的消息提取到 output.bag
。
5. 压缩和解压 bag 文件:
- 压缩:
rosbag compress
用于压缩.bag
文件,减小文件大小。rosbag compress my_bag.bag
- 解压:
rosbag decompress
用于解压.bag
文件。rosbag decompress my_bag.bag
5.2 rostopic 接口参数查询
在 ROS 中,rostopic
是一个非常有用的命令行工具,用于与 ROS 话题进行交互,例如查看话题的信息、发布数据或查看消息的流动。要查看话题的参数结构,即话题的消息类型和各个字段的详细信息,常用以下几种命令:
rostopic type <topic>
:获取话题的消息类型。rosmsg show <msg_type>
:查看消息类型的具体结构。rostopic echo <topic>
:查看实时消息的内容。
1. rostopic type
rostopic type
命令用于显示某个话题的消息类型。
示例:
rostopic type /odom
这个命令会显示 /odom
话题的消息类型,例如 nav_msgs/Odometry
。
2. rosmsg show
一旦知道话题的消息类型,可以使用 rosmsg show
命令来查看该类型的具体结构,包括所有字段及其数据类型。
示例:
rosmsg show nav_msgs/Odometry
这个命令会输出 nav_msgs/Odometry
消息的完整结构,例如:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
float64[36] covariance
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twist twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
float64[36] covariance
这会显示 Odometry
消息的结构,包括每个字段的数据类型以及嵌套的消息类型。
3. 综合步骤:查看话题的参数结构
可以通过以下步骤查看任意话题的参数结构:
-
使用
rostopic list
查看当前活动的话题列表:rostopic list
-
使用
rostopic type <topic>
获取某个话题的消息类型:rostopic type /camera/image_raw
-
使用
rosmsg show <msg_type>
查看该消息类型的详细结构:rosmsg show sensor_msgs/Image
4. 直接查看话题的消息数据:rostopic echo
如果想查看话题的实时数据,使用 rostopic echo
命令可以打印出消息的具体内容。
示例:
rostopic echo /odom
这个命令会打印出 /odom
话题的实时消息内容,展示消息中的每个字段及其对应的值。