:TCP、雷达数据与 Qt 图形界面的完整整合)
前面的四篇实战文章中我们已经完成了第一篇Qt 项目架构设计第二篇TCP 通信与自定义文本协议第三篇雷达目标模型与坐标转换第四篇QPainter 绘制 PPI 雷达界面但是这些模块目前还是相对独立的。一个完整的雷达模拟器需要将控制命令、雷达数据、界面显示真正连接起来。这一篇将把 RadarSimulator 的核心数据流程进行完整整合。1. RadarSimulator 整体数据流程一个完整的数据链路如下图1 RadarSimulator 整体数据流架构其中TCP Client 负责发送控制命令RadarServer 负责 TCP 通信和协议解析RadarSimulation 负责生成和更新雷达数据RadarWidget 负责将数据转换为可视化界面这种分层设计可以让网络通信、数据处理和界面绘制相互独立。2. TCP 命令如何影响雷达状态在第二篇文章中我们实现了基于 TCP 的自定义文本协议。客户端发送的控制命令会首先进入 RadarServer。经过协议解析后进一步改变雷达系统当前状态。例如客户端发送START_SCANRadarServer 接收到命令后会经过以下流程图2 TCP命令到雷达状态的处理流程RadarServer 的职责并不是绘制界面而是接收客户端请求解析协议修改雷达状态返回处理结果这样可以避免网络通信代码和 Qt 界面代码混在一起。3. 雷达数据如何传递到 Qt 界面第三篇文章中我们介绍了雷达目标模型以及坐标转换过程。雷达系统内部保存的并不是屏幕坐标而是距离、方位角等雷达参数。雷达目标通常包含距离 Range方位角 Azimuth速度 Speed例如structTarget{doublerange;doubleazimuth;doublespeed;};RadarSimulation 负责维护这些数据。RadarWidget 不负责产生数据而是读取当前状态。整体关系图3 雷达数据与界面显示关系这种设计符合 Qt 中常见的数据模型与界面显示分离原则。4. 雷达坐标到屏幕坐标的转换RadarSimulation 保存的是雷达坐标。例如目标距离目标方位角但是 Qt 界面使用的是屏幕像素坐标。因此需要进行坐标转换。首先计算目标在 PPI 中的显示半径r s r a n g e m a x R a n g e × R r_s \frac{range}{maxRange}\times RrsmaxRangerange×R其中r s r_srs为屏幕显示半径r a n g e rangerange为目标实际距离m a x R a n g e maxRangemaxRange为最大显示距离R RR为 PPI 圆盘半径然后计算目标屏幕坐标x c x r s sin ( θ ) xc_xr_s\sin(\theta)xcxrssin(θ)y c y − r s cos ( θ ) yc_y-r_s\cos(\theta)ycy−rscos(θ)其中( c x , c y ) (c_x,c_y)(cx,cy)为雷达中心坐标θ \thetaθ为目标方位角经过转换以后RadarWidget 就可以直接使用 QPainter 绘制目标。5. Qt 动态刷新机制雷达界面不是静态图片。扫描角度、目标位置以及历史航迹都会不断变化。因此需要周期刷新。整体流程图4 Qt雷达界面动态刷新流程其中update()并不会立即执行绘制。Qt 会将重绘请求加入事件队列并在事件循环中触发paintEvent()完成界面刷新。6. paintEvent 只负责绘制第四篇文章中我们介绍了使用 QPainter 绘制 PPI 雷达界面的过程。其中一个重要原则paintEvent()只负责绘制不负责业务逻辑。如果将数据更新逻辑放入paintEvent()会导致数据更新依赖界面刷新绘制频率影响业务逻辑程序难以测试和维护正确方式图5 数据更新与界面绘制分离数据层负责产生和维护状态。界面层只负责读取数据并显示。这样即使界面暂时停止刷新雷达数据仍然保持正确状态。7. TCP、雷达数据与 PPI 的完整闭环经过整合以后RadarSimulator 的完整流程如下图6 RadarSimulator完整运行闭环最终实现TCP 控制雷达状态雷达数据实时更新PPI 界面动态显示目标和历史航迹同步变化8. 最终运行效果经过前面的整合以后RadarSimulator 已经能够把网络命令、雷达数据和 Qt 图形界面连接起来形成一个完整的运行系统。下面展示 RadarSimulator 的实际运行效果。图7 RadarSimulator实际运行效果从最终效果来看项目已经具备了以下几个核心能力可以通过 TCP 命令控制雷达运行状态可以维护并更新目标数据可以将雷达坐标转换为屏幕坐标可以在 PPI 界面中动态绘制扫描波束、目标和历史航迹这也意味着前面介绍的几个关键模块已经真正形成了完整联动。总结到这里RadarSimulator 已经完成了从 TCP 通信、雷达数据处理、坐标转换到 PPI 图形显示的完整链路整合。前面的模块不再是独立功能而是通过数据流连接起来形成了一个完整运行的 Qt 雷达模拟系统。后续如果继续扩展可以围绕当前结构逐步完善更复杂的目标运动轨迹模拟多目标管理与显示雷达参数配置功能数据记录与回放更完善的测试与工程化设计项目源码RadarSimulator 完整源码已经开源Gitee仓库GitHub仓库项目包含 Qt6 界面、TCP通信、自定义协议、雷达数据模拟以及 PPI 绘制等模块。欢迎交流学习。