172 lines
7.4 KiB
Markdown
172 lines
7.4 KiB
Markdown
# log 实训
|
||
|
||
## log简介
|
||
|
||
**log的定义**:日志是将软件运行的状态、过程等信息,输出到不同的介质中(例如:文件、控制台、显示屏等),并进行显示和保存。为软件调试、维护过程中的问题追溯、性能分析、系统监控、故障预警等功能,提供参考依据。可以说,日志的使用,几乎占用的软件生命周期的至少 80% 的时间。
|
||
|
||
**log的重要性**:对于操作系统而言,由于其软件的复杂度非常大,单步调试在一些场景下并不适合,所以日志组件在操作系统上几乎都是标配。完善的日志系统也能让操作系统的调试事半功倍.
|
||
|
||
**log的作用:**
|
||
|
||
* *** 确定程序的运行路径 *** 一个函数有没有被调用,一个 if 块有没有被执行,一个 while 循环执行了几次,到了哪一步中断了,都可以通过 输出出相关信息来查看。
|
||
|
||
* *** 查看变量的状态 *** 程序自身的报错会告诉你发生了什么错误,但你还需要找出为什么会发生错误。**通过 log输出出错语句涉及到的相关变量的值和类型**,可以帮助分析出错原因。
|
||
|
||
* *** 找出出错位置 *** 往往错误的原因并不在报错的位置,所以多输出一些标记,多 输出不同位置的变量值,**查看变量在运行过程中值的变化情况**,可以观察是在哪里发生了问题。
|
||
|
||
## px4 log使用
|
||
|
||
#### 代码添加log输出
|
||
|
||
在飞控开发过程中可以使用以下代码进行log调试,根据不同的错误级别在相应的部分插入相应的信息。不同的信息代表不同的情况,info一般用来表示重要功能完成了。warn表示发生异常但不影响系统使用,err代表使用已经影响到了系统的工作必须马上解决问题。
|
||
|
||
```c++
|
||
PX4_INFO("输出需要的数据");
|
||
PX4_WARN(" 输出警告信息");
|
||
PX4_ERR("输出错误信息" );
|
||
|
||
```
|
||
|
||
在代码的需要的位置插入这三种log输出代码,原则如下:
|
||
|
||
**多输出一些辅助信息**,方便自己查看,不然一堆数据看花眼。一般输出时会标注上**变量名,再输出变量类型,以及变量的值**
|
||
|
||
**在出错行之前输出**。报错行涉及的一些变量,把他们的数值和类型,全都输出出来,看看和预期是否一致。
|
||
|
||
**一行做一件事 **。如果你出错的一行里连续调用了多个函数或运算,要分开写,分开输出。
|
||
|
||
### nsh调试
|
||
|
||
debug方式主要分仿真器调试和真机调试,一般都是先进行软件仿真调试,再进行真机调试。二者调试时的终端都会输出log信息。根据输出的log信息可以快速定位问题所在。也可以在把编译生成的固件写入飞控之后,飞控连接[QGC地面站][http://qgroundcontrol.com/ ]之后打开mavlink console也可以运行自己所写的module.仿真器和QGC地面站都可以输入help来查看有效的命令和语法.这里以px4_simple_app为例,下图是在jmavsim仿真器运行px4_simple_app时所输出的log信息。
|
||
|
||

|
||
|
||

|
||
|
||
### 日志分析
|
||
|
||
#### logger
|
||
|
||
|
||
|
||
px4 的logger会把订阅的uorb消息记录成.ulg文件存在SD卡中.logger可以订阅任何uorb消息并且可以进行配置选择需要的消息主题和频率.logger输出保存ulog文件也可以通过mavlink向客户端发送ulog数据.这两个后台任务可以同时进行.
|
||
|
||
**logger实现**
|
||
|
||
使用两个线程:
|
||
|
||
- 主线程以固定速率运行(如果以-p参数启动的话,则轮询主题),并检查数据更新
|
||
- 写入线程,将数据写入文件
|
||
|
||
两个线程之间有一个可配置大小的写入缓存区。
|
||
|
||
logger默认情况下飞机解锁之后就会开始记录日志,飞机锁定之后停止记录日志.也可以在终端使用logger on手动开启.logger off停止记录.日志记录的主要内容为飞行数据和debug信息.记录的日志文件可以用于对飞机的系统和飞行性能的评估、调整和事故分析.日志的格式是ulog.记录的日志文件会存储成.ulg文件存在SD卡中.可以安装使用pyulog查看日志信息.
|
||
|
||
**logger 命令**
|
||
|
||
```
|
||
logger <命令> [参数...]
|
||
命令:
|
||
start
|
||
[-m <val>] 后端模式
|
||
可选: file|mavlink|all, 缺省: all
|
||
[-e] 启动后立即开始记录,直到上锁(否则只在解锁后开始记录)
|
||
[-f] 记录直到关闭为止(包含 -e)
|
||
[-t] 使用日期/时间命名日志目录和文件
|
||
[-r <val>] 记录速率,单位:Hz,值为0则不限速
|
||
缺省: 280
|
||
[-b <val>] 记录缓存大小,单位:KiB
|
||
缺省: 12
|
||
[-q <val>] mavlink模式下uORB队列大小
|
||
缺省: 14
|
||
[-p <val>] 轮询主题而不是以固定速率运行(记录速率和主题间隔将被忽略)
|
||
可选: <topic_name>
|
||
|
||
on 立即开始记录,覆盖解锁(日志系统必须在运行中)
|
||
|
||
off 立即停止记录,覆盖锁定(日志系统必须在运行中)
|
||
|
||
stop
|
||
|
||
status 打印状态信息
|
||
```
|
||
|
||
**pyulog安装方法**
|
||
|
||
```shell
|
||
git clone https://github.com/PX4/pyulog.git
|
||
|
||
cd pyulog
|
||
|
||
python setup.py build install
|
||
```
|
||
|
||
pyulog常用命令
|
||
|
||
```shell
|
||
ulog2csv sample.ulg //将sample.ulg文件转成.csv文件这些文件可以使用excel打开
|
||
ulog_messgaes sample.ulg //查看ulog中的uorb的消息
|
||
ulog_info sample.ulg //显示sample.ulg记录的信息
|
||
ulog_params sample.ulg //查看sample.ulg文件的参数
|
||
```
|
||
|
||
下方是ulg文件转成csv后的几个比较重要的文件和所记录的信息。
|
||
|
||
airspeed_0.csv 存放了飞行的指示空速和滤波前后的真空速
|
||
|
||
vehicle_attitude_0.csv 存放了四元数及pqr
|
||
|
||
vehicle_attitude_setpoint_0.csv 存放了期望的姿态角及四元数、油门信息
|
||
|
||
tecs_status_0.csv 存放了滤波后的高度、速度、加速度信息及期望的高度、速度、加速度信息以及跟总能量有关的一些参数
|
||
|
||
actuator_outputs_0.csv、actuator_outputs_1.csv 存放了输出混控器的pwm信号,其中0是main out 1是aux out分别由主处理器和协处理器输出
|
||
|
||
actuator_controls_0_0.csv 存放了输入混控器的归一化数据
|
||
|
||
ekf2 两个文件中存放着互补滤波的数据更新
|
||
|
||
home_position_0.csv 存放着地面站所在位置
|
||
|
||
日志记录的消息主题也可以自己定义的,通过创建SD卡中的etc/logging/logger_topics.txt文件可以自定义记录需要的日志消息主题.一旦使用这个文件就会自动替换全部的默认主题.文件内容格式如下.
|
||
|
||
```text
|
||
<topic_name> <interval> <instance>
|
||
```
|
||
|
||
topic_name 就是所要订阅的消息主题的名称
|
||
|
||
interval 是消息之间的间隔.如果指定了,则定义该主题的两条日志消息之间的最小间隔,单位为ms。如果不指定,则以全速率记录该主题.
|
||
|
||
instance是消息的实例,如果不指定就记录该消息主题的所有实例,指定就记录相应的实例.如果不指定就记录该消息主题的所有实例.
|
||
|
||
例子如下
|
||
|
||
```text
|
||
sensor_accel 0 0
|
||
sensor_accel 100 1
|
||
sensor_gyro 200
|
||
sensor_mag 200 1
|
||
```
|
||
|
||
使用前的记录的数据
|
||
|
||

|
||
|
||
替换后的数据
|
||
|
||

|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|