ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MT9V03X摄像头与逐飞库调试避坑:三大细节与TFT显示优化

MT9V03X摄像头与逐飞库调试避坑:三大细节与TFT显示优化 搞智能车竞赛或者刚入门机器视觉的朋友对逐飞开源库应该不陌生。它把MT9V03X这种灰度摄像头的寄存器配置、DMA采集、图像裁剪这些底层操作基本都封装好了确实省了不少事。但我当年从K60切到RT1064的时候以为“直接调库就行”结果真到调车阶段问题一个接一个——图像上半部分发花、画面偶尔跳帧、TFT刷得跟PPT一样。连续排查了几个晚上才定位到问题全是些库里没有明说、但实际工程中必须特别注意的细节。这篇文章想把这几处坑仔细讲清楚。内容主要针对三个方面MT9V03X摄像头在使用逐飞库时的三个常见细节问题以及TFT屏幕显示调试画面的优化技巧。适合正在调智能车摄像头的同学也适合用逐飞库做视觉入门项目的开发者。即便你用的是别的摄像头、别的屏幕只要思路相通这些排查方法和优化手段一样能迁移过去。1. 内容整体设计与思路拆解1.1 MT9V03X和逐飞库的组合到底解决了什么问题MT9V03X系列是灰度图像传感器输出的是数字并行灰度数据在智能车赛道识别场景里它有几个不可替代的优点分辨率适中、帧率可以拉得比较高、动态范围宽即使光照变化很大也能拿到相对稳定的灰度图。但代价是它需要SCCB接口配置寄存器输出时序有PCLK、HREF、VSYNC等多路信号再加上DMA搬运整套初始化流程对新手来说并不友好。逐飞库的价值就是把这一套固定流程封装成现成接口。比如初始化摄像头、配置输出分辨率、开启DMA采集、等待一帧图像完成基本就是几个函数调用。对用户来说你不需要去查数据手册里寄存器每一位的含义也不需要自己写DMA描述符库已经做了统一封装。所以很多同学上手之后的第一感觉是简单、快、能用。但“能用”和“调通”是两个概念。封装好的库默认面向的是通用场景它会在初始化里把寄存器、DMA通道、中断这些都配好可它无法知道你实际电路上摄像头的供电是否稳定、复位时序是否满足要求、DMA缓冲区的大小是否和你的分辨率匹配、中断处理和主循环之间的竞争关系是怎么安排的。这些才是工程里真正影响稳定性的因素。1.2 为什么这三个细节值得单独拿出来讲我在实际调车过程中踩过的坑比较典型。第一个问题是摄像头在冷启动时偶尔画面全黑或者图像只有下半部分正常第二个问题是图像上会周期性出现横纹像是有规律地覆盖了一层花屏第三个最折磨人画面偶尔会整体上下错位看起来像“割裂”了。这三种现象玩过视觉的基本都遇到过。多数人第一反应是换一个摄像头试试或者在代码里反复重置寄存器但实际上都和初始化流程、DMA配置、场中断处理这三处细节有关。逐飞库本身没问题它已经把通用逻辑做了可在我们具体应用时硬件差异和任务差异会把隐藏问题暴露出来。因此这篇文章的核心思路就是先从底层原理讲明白再给出可以直接落地的检查方法和修改建议最后把TFT显示这块的实际优化手段也放进来让调试流程整体更顺畅。1.3 适用场景与文档预设如果你使用的是逐飞库那么下面所有环节你都可以直接对照代码验证如果你使用的是其他厂商的库或者自己动手写摄像头驱动的这篇文章同样有参考价值因为很多问题是硬件相关和时序相关的和库本身关系不大。在开始前先说明一下我的调试环境免得思路对不上主控芯片是NXP RT1064摄像头型号是MT9V034屏幕是2.0寸IPS TFT通过SPI接口连接使用逐飞库进行摄像头初始化与采集TFT屏幕刷新使用我自己的优化代码。不同平台API有一定差异但排查逻辑完全可复用。2. 三个容易忽略的细节你以为初始化好了实际上没搞定这一部分我把三个坑分别展开每个坑都按“现象描述——原因分析——检查与修改方案”的方式来写。如果时间紧可以直接看每个小节最后的检查清单。2.1 细节一摄像头上电时序和复位引脚处理不当冷启动会有概率出图异常MT9V03X是典型的模拟与数字混合电路摄像头虽然它输出的是数字信号但内部有模拟信号处理链路、PLL锁相环、寄存器配置逻辑。这类器件对电源稳定性和上电时序非常敏感。逐飞库的初始化函数会配置引脚、初始化SCCB、写寄存器、开启DMA可如果摄像头本身还没有进入稳定工作状态后续所有配置都可能被忽略或者部分配置写进去了但芯片内部尚未完成自校准导致输出图像异常。我遇到的现象是断电后再上电偶尔出现整幅图像全黑如果频繁复位单片机有时候画面只显示半幅下半部分正常、上半部分全黑或者条纹状花屏。这种问题在实验室调试时可能几天才出现一次比赛现场一旦出现就很致命。排查时要紧盯复位引脚和电源纹波。逐飞库通常会把摄像头的复位引脚接到主控GPIO上初始化时输出一段低电平复位脉冲。这个脉冲长度、上电时GPIO状态都有讲究。如果初始化函数执行太快电源电压还没有爬到传感器最低工作电压此时无论怎么复位寄存器配置都可能是无效的。解决思路并不复杂但需要结合硬件实际情况做好三点在初始化函数之前加一个延时常见做法是延时50ms到100ms确保摄像头供电稳定。手动把复位引脚拉低至少1ms再拉高并等待一段时间给传感器内部PLL留出锁定时间然后再执行逐飞库的初始化接口。检查摄像头供电引脚处的滤波电容。常规设计建议在电源和地之间放置一个10uF钽电容、一个100nF陶瓷电容两个电容靠近摄像头引脚放置。如果用的是排线连接建议在摄像头端PCB上就近放置效果最好。如果你用的是逐飞库可以直接看mt9v03x_init函数里的实现大部分版本会包含复位引脚操作。但不要完全依赖它因为库执行时不会主动等待很长的上电稳定时间这是为了缩短冷启动时间可在可靠性要求高的场合宁可增加50ms延时换稳定。我个人的做法是在外部封装一个camera_init_ext函数内部逻辑是先延时100ms再手动操作复位引脚拉低10ms、拉高50ms最后调用逐飞库中的mt9v03x_init。从测试结果看连续上下电100次没有再出现过黑屏或半屏问题。2.2 细节二DMA缓冲区与分辨率配置不匹配画面出现周期性横纹MT9V03X的图像采集链路通常是摄像头PCLK输出像素时钟每来一个像素时钟DMA搬运一个字节灰度图一像素一字节到内存缓冲区。逐飞库在初始化时会根据预设的行数、列数分配内部缓冲区。问题出在很多同学会在初始化之前修改图像分辨率比如为了提升帧率把图像从188x120改成188x80或者为了视野更大改成376x240却忽略了几处和分辨率强相关的配置。有一个非常典型的现象是图像上出现固定间隔的横条纹条纹位置不随摄像头挪动而变化而是固定在画面某些行。用示波器看波形很难直接发现问题但如果对照DMA描述符和缓冲区地址就会发现问题往往出在行偏移和DMA传输长度上。MT9V03X输出一帧图像时除了有效图像行还包括同步头、消隐行、消隐列等无效区域。逐飞库为了方便用户在采集时通常采用DMA连续搬运一整帧时序然后再把有效图像区域从缓冲区里裁剪出来。如果你只修改了图像宽高而没有同步调整DMA搬运的长度上限或者裁剪时依赖的起始偏移量已经失效就会导致每一行数据错位。排查方法比较直接检查库中关于图像宽高的宏定义检查是否有行偏移量检查DMA描述符配置时每行传输的字节数是否等于“有效行宽行消隐”。如果这些参数不一致画面就会呈现周期性错位。举个例子把窗口宽度从188改到376后DMA每行传输字节数没有乘2DMA搬运完一行后下一行起始位置就提前了最终每行都会向右或向左偏移视觉上就是斜条纹或横纹。还有一种常见问题是缓冲区溢出。缓冲区大小仍然是188x120的但你实际配置的图像是376x240DMA写入的数据量远超过缓冲区大小就会覆盖其他内存区域轻则图像被破坏重则程序跑飞进入HardFault。建议的操作流程统一修改分辨率入口。不要直接改库文件里的宏而是先确认库有没有提供mt9v03x_set_resolution之类的接口有的话优先使用。确认DMA描述符中的传输目标是循环模式还是单次模式。逐飞库常用于连续采集在帧率较高时建议保持循环模式避免一帧传输完成后DMA停止再重启造成帧间隔不稳定。打开编译器的内存检查或使用芯片的MPU保护功能把摄像头缓冲区限定在固定内存段一旦越界会立即触发异常方便第一时间意识到分辨率问题。我遇到过最隐蔽的情况是图像宽度和高度配置没问题但误改了PCLK采样边沿。摄像头输出数据是在PCLK上升沿还是下降沿有效是通过寄存器配置决定的如果库默认配置与传感器实际输出的相位不匹配DMA就会采到错误的数据表现为画面噪声明显增加尤其在边缘处出现重影。这种问题不影响帧率也不容易让人联想到DMA配置所以很多人会排查半天最后怀疑摄像头坏了。建议在调分辨率时确认一下采样沿是否跟着变了。2.3 细节三场中断处理和主循环之间存在竞争画面偶尔“割裂”摄像头图像是连续不断产生的。正常工作时DMA会把每帧图像不断搬运到缓冲区主循环处理完当前帧后再获取下一帧数据。这里如果不加帧同步控制只靠“缓冲区里现在是什么数据”来判断就很容易出现读取到一帧中间态的情况上半部分是上一帧的数据下半部分是这一帧的数据画面看起来像是被拦腰斩断。逐飞库通常会提供一个判断新帧到来的接口实现方式可以是检测VSYNC场中断标志位也可以是DMA中断标志。这是一个很方便的设计但正因为方便很多人会忽略一个关键点中断处理函数里做了什么。我最初犯的错是在场中断中直接拷贝图像。场中断触发频率等于摄像头帧率比如150帧每秒就是每6.6毫秒中断一次。如果中断函数里把整幅图像从采集缓冲区拷贝到处理缓冲区那么这个拷贝过程会占用大量CPU时间。DMA搬运一幅188x120图像可能只需要几百微秒但拷贝同样大小时CPU耗时也差不多在几百微秒级别。在中断处理期间如果恰好又来了其他中断或者主循环正在处理数据就可能出现不同步。更隐蔽的竞争是“正在读图像时下一帧DMA已经开始写入”。如果场中断标志只是简单地置一个变量主循环检测到变量被置位后再去读取图像而此时DMA已经在往同一片缓冲区写入新数据那么读取操作就会和写入操作并发。图像被撕裂的概率相当高且很难复现因为在单片机主频较高时这种竞争窗口可能只有几十微秒。正确做法一般分两步第一步在DMA完成后立刻将采集缓冲区地址切换为“下一帧缓冲区块”或者等待DMA完全停止后在极短时间内读取图像。逐飞库比较常用的方式是“第一帧缓冲”和“第二帧缓冲”交替使用即双缓冲机制。第二步不要在中断函数里拷贝整幅图像。中断里最好只做“帧完成标志置位”和“缓冲区切换指针”两个操作。真正的图像处理放在主循环里完成如果担心同一缓冲区被DMA覆盖就要保证在主循环读取期间DMA指向的是另一个缓冲区。我个人的实现方案是维护两个buffer指针active_buffer和working_buffer。DMA写完active_buffer后在中断中把采集指针切到另一个空闲buffer并把working_buffer指向刚写满的那块同时置位“帧就绪”标志。主循环看到标志后直接处理working_buffer里的数据处理完毕后等下一帧。这样DMA写入和图像处理永远不同时操作同一块内存彻底避免了画面撕裂。还有一个容易忽略的细节是中断优先级。逐飞库中摄像头中断一般可以被设置成较高优先级但如果你的系统里有无线模块、按键扫描、定时器等中断就要特别注意优先级顺序。摄像头中断如果优先级过低在高负载时可能丢失场中断标志造成画面卡住如果优先级过高而且中断服务函数耗时较长又会挤压其他任务时间。建议给摄像头中断设置一个“仅次于临界服务”的优先级并且保证中断函数本身足够精简。2.4 小结三个细节的快速自查表为了方便你在自己工程里快速排查我整理了一张表格把对应问题和处理办法放在一起。细节典型现象核心原因快速处理办法上电时序与复位冷启动黑屏、半屏花屏供电未稳定、复位脉冲不足初始化前延时50-100ms手动拉低复位引脚10ms后再拉高检查电源滤波DMA与分辨率匹配周期性横纹、画面错位、HardFault宽高修改后缓冲区、行偏移、DMA长度没同步改统一使用库提供的分辨率修改接口检查每行传输字节数开启MPU保护场中断与主循环竞争画面撕裂、偶发卡帧中断里拷贝图像或读写同一缓冲区中断只置标志和切换指针使用双缓冲合理设置中断优先级3. TFT显示优化技巧让调试画面跑得更流畅摄像头图像调出来之后接下来就是如何把它显示到TFT屏幕上。屏幕上图像流畅程度直接决定调试体验。如果画面刷新率低赛道弯道等动态变化看起来就一卡一卡的很容易误判算法效果。这部分我分享几个我自己实测有效的优化方式。3.1 局部刷新不要每次都刷整屏只刷真正变化区域很多新手用TFT显示摄像头图像时最简单粗暴的方式是每帧都调用一次全屏写图函数把整幅图像所有像素点全部写到屏幕。这样做虽然效果直观但代价很大。假设图像分辨率是188x120也就是22560个像素点。TFT屏幕常用SPI接口即使SPI时钟跑到40MHz传输一个像素数据也需要8到9个时钟周期再加上命令开销一帧全屏刷新通常要10ms左右。摄像头帧率如果是150帧每秒那么全屏刷新就会占掉大量带宽而且人眼能感知的流畅度上限通常在60帧左右过度刷新并没有实际意义。优化方案是多级局部刷新。第一种最简单直接降低刷新帧率比如每隔一帧刷新一次这样能够节省一半时间。第二种方案是只刷有效区域有些摄像头图像的左右或上下有无效区域把这些区域裁剪掉不刷新。第三种方案是区域差分刷新只刷新设置变化比较大的区域比如通过比较两帧图像像素是否有变化只更新变化的像素点。但这在单片机上逐像素比较耗时也不小所以考虑到性价比我通常只做到前两种。以188x120图像为例如果刷新尺寸缩小到188x80也就是只刷有效赛道区域刷一帧时间能减少大约三分之一。再配合隔帧刷新实际肉眼感受依然流畅但CPU占用大幅下降留给算法计算的时间就更多了。3.2 灰度拉升和伪彩色显示细节立刻清楚MT9V03X输出的是灰度图但不同场景下灰度值分布差异很大。比如在室内灯光下赛道灰度可能集中在100到180之间如果直接把灰度值映射到TFT的RGB565颜色空间会看到画面灰蒙蒙一团赛道边缘细节很难分辨。这不是摄像头灵敏度问题而是显示时没有做灰度拉伸。优化方法是在图像显示前对灰度数据进行线性映射把实际灰度最小值映射到0最大值映射到255。这样能够利用整个灰度范围让画面层次感更强。实现方式很简单遍历当前帧所有像素统计Min和Max然后对每个像素做一次线性变换。如果觉得每帧都统计太费时间可以每隔几帧统计一次或者直接根据环境固定一组映射区间。伪彩色是另一个提升效果的手段。灰度图虽然信息完整但人眼对灰度的分辨能力远不如对颜色。把低灰度值映射成蓝色、高灰度值映射成红色中间值用渐变过渡这样赛道边界、障碍物轮廓会非常直观。逐飞库的任务里很多队伍都用伪彩色来区分赛道元素尤其在做坡道识别和十字路口识别时伪彩色对边缘检测帮助很大。伪彩色实现时有一点要注意不要把映射表建太大。灰度范围是0到255只需要准备256个RGB565颜色值就够了。提前生成一个静态查表数组放在Flash里显示时直接查表这样效率远高于每次实时计算。3.3 用硬件SPI DMA刷屏把CPU解放出来TFT显示还有一个容易被忽略的瓶颈即使你用SPI接口发送数据时如果采用轮询方式CPU会在等待每个字节发送完成的循环里干耗。188x120的图像有22560个像素点每个点RGB565需要两个字节所以一帧图像数据就有将近45KB。如果用轮询SPI一个字节一个字节地发送即便不计算其他开销其中的CPU空转都不可接受。正确思路是使用SPI DMA发送。把图像数据按行组织好放入发送缓冲区然后启动SPI DMA传输CPU就可以去做图像处理或者算法计算等DMA传输完成后再发送下一行。如果用RT1064这类带DMA的处理器效果非常明显原本满帧刷新需要10msCPU参与部分可以压缩到极短。配合双缓冲使用效果更好。DMA发送当前帧的同时主循环在后台准备下一帧数据。准备数据时要调整好字节序RGB565在TFT上通常是高字节在前因此从灰度转RGB565时需要把高低字节正确组合。很多同学在TFT显示时看到颜色错乱、花屏往往就是因为RGB565字节序反了。另外一个值得注意的技巧是使用TFT屏幕的显存窗口模式。刷屏前先设置写入窗口为整个显示区域然后连续发送像素数据避免每写一个像素都要重新发送坐标命令。这样能显著减少命令开销。逐飞库提供的TFT接口很多都支持窗口设置要用起来不要一个点一个点地画否则性能差距很大。3.4 实际效果对比与屏幕选择建议我把自己优化前和优化后的效果对比一下供大家参考。以188x120灰度图显示在2.0寸IPS TFT上为例SPI时钟为30MHz时优化前使用逐飞库默认的单像素写点函数整幅图像刷下来大概需要30ms以上优化后使用窗口模式加SPI DMA发送将数据按行打包后批量发送一帧刷新时间可以缩短到8ms左右再配合隔帧刷新策略实际每两帧显示一次平均每帧显示耗时降到4ms。这样画面看起来非常流畅而且CPU占用率显著下降。在选择屏幕时IPS TFT确实是调试首选。原因很简单IPS面板可视角度大侧着看画面颜色不会失真这在架摄像头支架或者调试时非常有必要。如果买的是普通TN屏视角一偏图像颜色就会变浅灰度图上的一些细节很容易被误判。另外优先选带电平转换模块的屏幕尤其当主控是3.3V系统时尽量不要直接接5V屏幕避免逻辑电平不匹配产生通信错误。4. 常见问题与排查技巧实录调摄像头和TFT显示真正让人头疼的不是大问题而是那些时有时无、间歇性出现的疑难杂症。这一部分我把自己遇到过的典型问题整理出来方便大家按图索骥。4.1 画面间歇性黑屏或者卡在最后一帧这种现象一般不是DMA中断标志丢失就是缓冲区被意外改写。先检查场中断函数是否放在了RAM中执行有的芯片Flash读取慢会导致中断处理延迟再检查中断服务函数是否被其他高优先级中断长时间抢占。如果排除了这两个问题就去看看是否有数组越界把新的帧标志覆盖了。这类问题有一个比较实用的排查手段在中断函数里放一个调试计数器主循环每处理一帧打印一次计数器的值。如果计数器出现连续几帧不增长再增长时数值跳变很大就说明中间丢失了中断。此时优先检查中断优先级设置以及是否有其他中断持续占用CPU导致摄像头中断无法及时响应。4.2 图像整体偏亮或偏暗调节曝光寄存器没有反应很可能是SCCB通信不稳定。MT9V03X的寄存器配置依赖SCCB接口如果上拉电阻太大或者线太长通信时序就可能出错导致寄存器写入无效。检查SCCB引脚是否有合适的上下拉电阻一般10k到4.7k比较合适同时尽量缩短摄像头排线长度。另外如果你先后初始化了两个摄像头或者多次初始化同一个摄像头要注意SCCB总线竞争。第二次初始化时传感器可能因为上一次掉电不彻底而处于异常状态此时要先彻底断电而不是直接重新写寄存器。4.3 TFT屏幕出现花色条纹颜色明显不对先说最常见的原因RGB565字节顺序反了。灰度转彩色时高字节和低字节如果排列错误画面会出现类似“蓝红色块错位”的现象。检查一下你往SPI发送数据时是低字节在前还是高字节在前不同屏幕驱动芯片可能有差异。其次检查SPI模式。TFT屏幕通常使用SPI Mode 0或者Mode 3具体看数据手册。SPI极性配置错误时屏幕能收到数据但数据显示会不稳定甚至出现随机条纹。这种问题靠肉眼很难排查建议用逻辑分析仪抓取SPI波形确认数据输出时序是否符合屏幕要求。4.4 图像有规律的黑白横线类似扫描线这种情况多数和PCLK采样边沿有关。逐飞库默认配置了一个采样模式但如果你的摄像头型号是MT9V034和MT9V032在部分寄存器配置上存在细微差异库可能检测不到这种差异需要在初始化后主动设置PCLK采样沿。建议在逐飞库提供的寄存器配置函数后再手动写入建议值试一试反复对比画面变化。4.5 屏幕闪烁严重能看到刷新过程这是TFT刷新的经典问题。SPI刷新整屏时如果没有用窗口模式而是一个点一个点地画屏幕扫描速度跟不上画面上半部分已经擦除、下半部分还没开始写就会看到明显的“上位撕裂”现象。解决思路是窗口模式加双缓冲让屏幕始终显示完整的帧而不是边写边清。如果使用内置显存的TFT屏幕还要注意写显存时要关闭屏幕刷新等所有数据写完后再开启显示。有些屏幕控制器支持这种操作开启后闪烁立刻消失。逐飞库的TFT驱动里可能没有默认打开这个功能需要看屏幕具体芯片型号手动加一条命令。5. 调试技巧经验补充5.1 用图像直方图辅助判断曝光很多同学调节摄像头曝光参数时喜欢一遍遍看屏幕画面。这个方法不太可靠因为屏幕本身的亮度映射和观察环境影响判断。更好的做法是直接采集一帧图像统计灰度直方图看看灰度分布是否集中在低区间、高区间还是中间区间。如果直方图峰值靠近255说明曝光偏高画面发白靠近0说明曝光偏低画面过暗。这个数据远比肉眼判断准确。逐飞库一般提供了读取某一帧图像数据的接口拿到数据后自己写一个简单的直方图统计函数只需要一次遍历非常快捷。加上串口或者TFT上显示几个关键统计量配合调节曝光寄存器调整效率会高很多。5.2 固定帧率策略摄像头采集帧率如果不固定算法在不同帧率下的表现可能不一致。例如转弯处理时如果有时拿到的是10ms前拍的图像有时是30ms前拍的控制效果会出现周期性的滞后。建议在摄像头初始化时直接把输出窗口和帧率锁定不要使用最高帧率之外的动态帧率。锁帧率最直接的方式是固定曝光时间曝光越长帧率越低但同时会导致动态模糊。尽可能在光线足够的前提下选择中等曝光时间和较高帧率让采到的图像既清晰又稳定。5.3 内存不足时的规划思路当图像分辨率较大比如376x240时一帧灰度数据约90KB再加上TFT刷新缓冲区和其他算法数据小容量芯片的内存会非常紧张。这时候不要一味地缩小DMA缓冲区而是要考虑在算法层面减少内存依赖。比如图像裁剪到只保留赛道区域或者降低副采样率。DMA缓冲区尽量保持与采集分辨率一致否则容易踩到第二个坑中提到的横纹问题。如果确实需要同时处理两帧以上数据建议把摄像头缓冲区和图像处理缓冲区分开定义在链接脚本中固定地址避免堆栈增长时互相覆盖。检查实际内存占用可以看编译器的map文件里面会清楚列出各段内存使用情况。6. 写在最后的体会我调试MT9V03X摄像头时踩过最深的坑就是过于依赖封装好的库忽视了它封装的只是通用逻辑而工程里的硬件差异、时序差异、并发冲突是库里没帮你兜底的。很多时候问题不在库本身而在于使用者没有完全理解一组初始化动作在物理层面到底意味着什么。上电稳定、复位可靠、DMA配置自洽、中断处理精简这些看似琐碎的细节恰恰决定了整个视觉系统是否稳定。如果你手头的摄像头或者屏幕和逐飞库默认配置差异很大不要惧怕改库代码更不要惧怕在调试中发现库的某个函数对你来说不够用。拿来主义没有错但要在理解原理的基础上改造成适合自己的版本。逐飞库本身也是开源的把它当成一个高质量参考实现去阅读比单纯把它当成工具去调用收获会大得多。下次再遇到灵异画面先别着急换硬件按照上面这些点从供电、时序、DMA、中断、刷新方式逐项排查大概率能在半小时内找到问题根源。如果还有没覆盖到的疑难杂症欢迎带着具体现象来交流我会把自己知道的相关线索都补进来。
返回列表