<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>代码阅读 on ZJUDancer</title><link>https://zjudancer.github.io/docs/documents/</link><description>Recent content in 代码阅读 on ZJUDancer</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://zjudancer.github.io/docs/documents/index.xml" rel="self" type="application/rss+xml"/><item><title>Behavior 行为控制模块</title><link>https://zjudancer.github.io/docs/documents/behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/behavior/</guid><description>&lt;p&gt;&lt;strong&gt;老文档：Behavior module&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dancer-behavior&lt;/code&gt; 是我们的策略模块，其主要由以下组件组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;btree&lt;/code&gt;: 行为树 (Behavior Tree)，是我们策略的高层抽象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;core&lt;/code&gt;: 基于 &lt;code&gt;btree&lt;/code&gt; 模块，并且与我们机器人的实际相结合的底层抽象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;role&lt;/code&gt;: 机器人的角色，如 &lt;code&gt;Striker&lt;/code&gt;、&lt;code&gt;Defender&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skill&lt;/code&gt;: 机器人的技能，包含了头部与身体的技能。如 &lt;code&gt;SeekBall&lt;/code&gt;、&lt;code&gt;Kick&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;util&lt;/code&gt;: 一些实用函数或者封装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整个策略模块的运转流程如下：&lt;/p&gt;
&lt;ol start="0"&gt;
&lt;li&gt;初始化，读取 Parameter Server 中的参数，并设定初始 Role&lt;/li&gt;
&lt;li&gt;通过 ROS Topic 的订阅，接收视觉、步态、裁判盒以及队友的信息，并保存于 &lt;code&gt;DBlackboard&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;若下位机已经开机，则根据当前的 Role 与 &lt;code&gt;DBlackboard&lt;/code&gt; 中的信息，执行对应的 Skill。&lt;/li&gt;
&lt;li&gt;Skill 在执行完毕之后，会产生对应的身体动作 &lt;code&gt;BodyCommand&lt;/code&gt; 与头部动作 &lt;code&gt;HeadCommand&lt;/code&gt;，两者合成 &lt;code&gt;ActionCommand&lt;/code&gt;，并通过 ROS Topic 发送给步态模块 &lt;code&gt;dancer-motion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;一个运行周期结束，重复步骤 1-4&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;补充说明&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Voronoi 区域计算&lt;/strong&gt;&lt;br&gt;
通过 &lt;code&gt;voronoi_region&lt;/code&gt; 属性计算机器人在场上的最优区域，用于辅助团队协作与位置分配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队协作&lt;/strong&gt;&lt;br&gt;
通过 &lt;code&gt;update_team_info&lt;/code&gt; 和 &lt;code&gt;check_team_info&lt;/code&gt; 方法实现团队信息共享与任务分配，提升整体协同效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态管理&lt;/strong&gt;&lt;br&gt;
通过 &lt;code&gt;set_state&lt;/code&gt; 方法管理不同的行为状态，以支持机器人在不同场景下的动作切换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常处理&lt;/strong&gt;&lt;br&gt;
对下位机连接状态、球的可见性等关键运行信息进行监控和处理，确保系统运行的稳定性与可靠性。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="behavior-tree"&gt;Behavior Tree&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;📘 参考 Wiki：&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/libgdx/gdx-ai/wiki/Behavior-Trees" target="_blank" rel="noopener"&gt;Behavior Trees Wiki（点击查看）&lt;/a&gt;&lt;/strong&gt;
&lt;code&gt;btree&lt;/code&gt; 是该文章的完整实现。
在 Wiki 中需要重点关注的概念主要有：&lt;/p&gt;</description></item><item><title>Behavior 行为控制模块（新版草稿）</title><link>https://zjudancer.github.io/docs/documents/behavior-new/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/behavior-new/</guid><description>&lt;p&gt;&lt;strong&gt;老文档：Behavior module&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dancer-behavior&lt;/code&gt; 是我们的策略模块，其主要由以下组件组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;btree&lt;/code&gt;: 行为树 (Behavior Tree)，是我们策略的高层抽象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;core&lt;/code&gt;: 基于 &lt;code&gt;btree&lt;/code&gt; 模块，并且与我们机器人的实际相结合的底层抽象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;role&lt;/code&gt;: 机器人的角色，如 &lt;code&gt;Striker&lt;/code&gt;、&lt;code&gt;Defender&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skill&lt;/code&gt;: 机器人的技能，包含了头部与身体的技能。如 &lt;code&gt;SeekBall&lt;/code&gt;、&lt;code&gt;Kick&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;util&lt;/code&gt;: 一些实用函数或者封装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整个策略模块的运转流程如下：&lt;/p&gt;
&lt;ol start="0"&gt;
&lt;li&gt;初始化，读取 Parameter Server 中的参数，并设定初始 Role&lt;/li&gt;
&lt;li&gt;通过 ROS Topic 的订阅，接收视觉、步态、裁判盒以及队友的信息，并保存于 &lt;code&gt;DBlackboard&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;若下位机已经开机，则根据当前的 Role 与 &lt;code&gt;DBlackboard&lt;/code&gt; 中的信息，执行对应的 Skill&lt;/li&gt;
&lt;li&gt;Skill 在执行完毕之后，会产生对应的身体动作 &lt;code&gt;BodyCommand&lt;/code&gt; 与头部动作 &lt;code&gt;HeadCommand&lt;/code&gt;，两者合成 &lt;code&gt;ActionCommand&lt;/code&gt;，并通过 ROS Topic 发送给步态模块 &lt;code&gt;dancer-motion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;一个运行周期结束，重复步骤 1-4&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="behavior-tree"&gt;Behavior Tree&lt;/h2&gt;
&lt;p&gt;参照 &lt;a href="https://github.com/libgdx/gdx-ai/wiki/Behavior-Trees" target="_blank" rel="noopener"&gt;Wiki&lt;/a&gt;。btree 是该文章的完整实现。&lt;/p&gt;
&lt;p&gt;在 Wiki 需要关注的概念主要有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leaf task: Action 与 Condition&lt;/li&gt;
&lt;li&gt;Branch task: Sequence、Selector 与 Parallel&lt;/li&gt;
&lt;li&gt;Decorator&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;了解了基本概念之后，可以看 &lt;code&gt;dancer-behavior/src/dbehavior/btree&lt;/code&gt; 中的示例。&lt;/p&gt;</description></item><item><title>Planner 路径规划模块</title><link>https://zjudancer.github.io/docs/documents/planner/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/planner/</guid><description>&lt;h2 id="先明确这些变量的意义"&gt;先明确这些变量的意义：&lt;/h2&gt;
&lt;p&gt;代码块&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; see_ball&lt;span style="color:#f92672"&gt;=&lt;/span&gt; false;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; ball_field &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 球在机器人坐标系下的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; ball_global &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 球在全局坐标系下的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; ball_velocity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 球在机器人坐标系下的速度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; robot_global &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 机器人全局坐标系下的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; action_global &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 目标点在全局坐标系下的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; vel_cmd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;}; &lt;span style="color:#75715e"&gt;// 规划出来，用于发布的速度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; obstacles; &lt;span style="color:#75715e"&gt;// 障碍物信息，每个障碍物包含 x, y, radius，存储多个障碍物
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; gait_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 步态类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; kick_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 踢球类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; kick_flag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; false; &lt;span style="color:#75715e"&gt;// 是否处于踢球准备阶段的标志
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; dribble_flag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; false; &lt;span style="color:#75715e"&gt;// 是否处于盘球阶段的标志
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; ball_field_distance; &lt;span style="color:#75715e"&gt;//球在机器人坐标系下的距离
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; ball_field_angle; &lt;span style="color:#75715e"&gt;//球在机器人坐标系下的角度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; robot_angle_error &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 朝向目标点 - 现在的朝向
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="先看主函数"&gt;先看主函数：&lt;/h2&gt;
&lt;h3 id="1-节点初始化与-ros-通信配置-line-413---434"&gt;1. 节点初始化与 ROS 通信配置 (Line 413 - 434)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;环境变量区分机器人&lt;/strong&gt;：通过读取环境变量 &lt;code&gt;ZJUDANCER_ROBOTID&lt;/code&gt;，为话题 (Topic) 加上特定的前缀，从而在一台电脑或仿真环境中区分控制不同的机器人个体。&lt;/li&gt;
&lt;li&gt;有个DWA的实例，但还没用上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布与订阅 (Pub &amp;amp; Sub)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;订阅视觉信息 &lt;code&gt;VisionInfo&lt;/code&gt;：获取机器人全局坐标、球的局部和全局坐标、球速等。&lt;/li&gt;
&lt;li&gt;订阅行为指令 &lt;code&gt;ActionCommand&lt;/code&gt;：接收上层决策层下发的指令（包含目标坐标 &lt;code&gt;bodyCmd.x, y, t&lt;/code&gt; 以及期望的步态类型 &lt;code&gt;gait_type&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;发布速度指令 &lt;code&gt;cmd_vel&lt;/code&gt; (&lt;code&gt;geometry_msgs::Twist&lt;/code&gt;)：发布计算后的平移和旋转速度控制底盘（全向移动底盘）。&lt;/li&gt;
&lt;li&gt;发布手柄指令 &lt;code&gt;/joy_msg&lt;/code&gt;：通过模拟手柄行为来发送诸如“左脚踢球”、“右脚踢球”、“向左扑救”等特殊动作触发指令。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-控制参数初始化-line-436---470"&gt;2. 控制参数初始化 (Line 436 - 470)&lt;/h3&gt;
&lt;p&gt;定义了一系列控制动作时使用的常量，包括：&lt;/p&gt;</description></item><item><title>Vision 视觉处理模块</title><link>https://zjudancer.github.io/docs/documents/vision/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/vision/</guid><description>&lt;h2 id="一代码功能框架包含主要功能"&gt;一、代码功能框架（包含主要功能）&lt;/h2&gt;
&lt;p&gt;注：本部分仅对代码功能进行概括，所提到的关键方法将在下一部分进行详细解读&lt;/p&gt;
&lt;h3 id="核心模块"&gt;核心模块&lt;/h3&gt;
&lt;h4 id="相机输入"&gt;相机输入&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ZED 相机&lt;/li&gt;
&lt;li&gt;GstCamera（GStreamer驱动）
&lt;ul&gt;
&lt;li&gt;管道初始化（ &lt;code&gt;init()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;缓冲区回调（ &lt;code&gt;onBuffer()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;图像尺寸获取（ &lt;code&gt;GetWidth()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;V4L2Camera（备选驱动，&lt;strong&gt;已弃用&lt;/strong&gt;，仅作参考）&lt;/li&gt;
&lt;li&gt;输入源适配（图像文件夹/视频文件）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="帧处理与投影"&gt;帧处理与投影&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;图像数据封装（Frame）&lt;/li&gt;
&lt;li&gt;逆投影映射（IPM）
&lt;ul&gt;
&lt;li&gt;3D+2D投影（ &lt;code&gt;project()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;2D+3D反投影（ &lt;code&gt;inverseProject()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;坐标转换与航向矫正（Projection）
&lt;ul&gt;
&lt;li&gt;航向偏移计算（ &lt;code&gt;CalcHeadingOffset()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="目标检测"&gt;目标检测&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基类 IDetector （统一接口）&lt;/li&gt;
&lt;li&gt;中心圆检测（CircleDetector）
&lt;ul&gt;
&lt;li&gt;卡尔曼滤波优化（ &lt;code&gt;Update()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;场地坐标输出（ &lt;code&gt;result_circle()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;障碍物检测（ObstacleDetector）
&lt;ul&gt;
&lt;li&gt;二值图生成（ &lt;code&gt;GetBinary()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;障碍物特征提取（ &lt;code&gt;Process()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;角点检测（CornerDetector）
&lt;ul&gt;
&lt;li&gt;交叉点分类（ &lt;code&gt;classifyIntx()&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;定位特征生成（ LandMark ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;球检测（BallDetector）&lt;/li&gt;
&lt;li&gt;球门检测（GoalDetector）&lt;/li&gt;
&lt;li&gt;线段分类（LineClassifier）
&lt;ul&gt;
&lt;li&gt;航向偏差计算（ &lt;code&gt;CalYawBias()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="定位与导航"&gt;定位与导航&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;AMCL
&lt;ul&gt;
&lt;li&gt;粒子集管理（SampleSet）&lt;/li&gt;
&lt;li&gt;KdTree聚类（ &lt;code&gt;ClusterNode()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tracker（目标跟踪）
&lt;ul&gt;
&lt;li&gt;相机角度控制（ &lt;code&gt;Process()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="控制中枢"&gt;控制中枢&lt;/h3&gt;
&lt;h4 id="多线程调度"&gt;多线程调度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;step1：图像捕获与预处理&lt;/li&gt;
&lt;li&gt;step2：检测与定位&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ros通信"&gt;ROS通信&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;订阅运动、行为信息&lt;/li&gt;
&lt;li&gt;发布视觉结果、图像&lt;/li&gt;
&lt;li&gt;服务：AMCL控制等&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="状态管理"&gt;状态管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;位姿计算&lt;/li&gt;
&lt;li&gt;初始化（ &lt;code&gt;InitVisionYaw()&lt;/code&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="辅助部分"&gt;辅助部分&lt;/h3&gt;
&lt;h4 id="配置参数"&gt;配置参数&lt;/h4&gt;
&lt;h4 id="工具类"&gt;工具类&lt;/h4&gt;
&lt;h4 id="测试程序"&gt;测试程序&lt;/h4&gt;
&lt;h2 id="二代码功能解读包含主要类与关键方法"&gt;二、代码功能解读（包含主要类与关键方法）&lt;/h2&gt;
&lt;p&gt;注：以下对关键方法的解读不包含对函数所需传参的解读，只列出函数名&lt;/p&gt;</description></item><item><title>Network 网络通信模块</title><link>https://zjudancer.github.io/docs/documents/network/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/network/</guid><description>&lt;h2 id="1-模块概述"&gt;1. 模块概述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dnetwork&lt;/code&gt; 是整个机器人系统（ZJUDancer）的网络通信中枢。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对内（ROS 节点）：&lt;/strong&gt; 它是各个本地算法模块（视觉 Vision、动作 Motion、行为 Behavior）的信息聚合器和分发器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对外（UDP 网络）：&lt;/strong&gt; 它是机器人与外界（队友机器人、裁判盒、外部监控端）进行物理数据包交换的唯一接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该模块高度依赖底层的两个基础库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dprocess&lt;/code&gt;：&lt;/strong&gt; 提供多线程和定时循环调度的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dtransmit&lt;/code&gt;：&lt;/strong&gt; 提供对底层 UDP Socket 的高度封装（异步接收、回调绑定、组播/单播发送）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-目录结构与核心入口"&gt;2. 目录结构与核心入口&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dnetwork&lt;/code&gt; 的核心文件包含头文件与源文件两部分，核心依赖标准 RoboCup 的协议头文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dnetwork/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── include/dnetwork/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── RoboCup/RoboCupGameControlData.h # 国际 RoboCup 官方定义的裁判盒数据结构
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── gamecontroller.hpp # 裁判盒通信类头文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── team.hpp # 队内通信类头文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── src/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── gamecontroller.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── main.cpp # ROS 节点入口
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── team.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="21-模块启动-maincpp"&gt;2.1 模块启动 (&lt;code&gt;main.cpp&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;作为独立的 ROS 节点，程序入口非常简洁。初始化 ROS 后，实例化 &lt;code&gt;Team&lt;/code&gt; 和 &lt;code&gt;GameController&lt;/code&gt;。由于它们均继承自 &lt;code&gt;dprocess::DProcess&lt;/code&gt;，调用 &lt;code&gt;spin()&lt;/code&gt; 后会分别在独立的子线程中启动网络监听和定时发送的循环，最后主线程通过 &lt;code&gt;join()&lt;/code&gt; 阻塞等待。&lt;/p&gt;</description></item><item><title>IO 输入输出模块</title><link>https://zjudancer.github.io/docs/documents/io/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/io/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dio&lt;/code&gt; (dancer-io) 是一个以 ROS 节点 (&lt;code&gt;IntegratedNode&lt;/code&gt;) 运行的状态汇聚与指令转换模块。它负责监听机器人的传感器数据与运动指令，在内部进行里程计解算和稳定性评估，并向外发布综合运动状态（&lt;code&gt;MotionInfo&lt;/code&gt;）和关节控制指令（&lt;code&gt;JointState&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;整个模块的运转流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;状态感知&lt;/strong&gt;：读取 IMU 数据和头部电机的当前位置与速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稳定性评估&lt;/strong&gt;：根据 IMU 的 Roll/Pitch 角度判断机器人是否稳定，并记录前倾或后倾状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;里程计解算&lt;/strong&gt;：结合 &lt;code&gt;/cmd_vel&lt;/code&gt; 的线速度与 IMU 的偏航角（Yaw），计算机器人在平面内的相对坐标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令桥接与保护&lt;/strong&gt;：接收行为模块下发的头部动作指令，在机器人稳定时进行角度单位转换并透传；在失稳时强制输出固定的保护姿态角度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态广播&lt;/strong&gt;：将综合状态打包为 &lt;code&gt;MotionInfo&lt;/code&gt; 并发布，同时广播里程计 TF 变换。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="核心功能架构"&gt;核心功能架构&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dio&lt;/code&gt; 模块的内部逻辑主要分为三个核心子系统：状态与稳定性监测、里程计解算、指令桥接与保护。&lt;/p&gt;
&lt;div class="mermaid" align="center"&gt;graph TD
classDef L1 fill:#2B3A35,color:#fff,stroke:#333,stroke-width:1px;
classDef L2 fill:#6C9A8C,color:#fff,stroke:#333,stroke-width:1px;
classDef L3 fill:#A3C3B2,color:#000,stroke:#333,stroke-width:1px;
classDef L4 fill:#D8D8D8,color:#000,stroke:#333,stroke-width:1px;
DIO[dio 模块 IntegratedNode] --&gt; StateMonitor[状态与稳定性监测]
DIO --&gt; OdomCalc[里程计解算]
DIO --&gt; CmdBridge[指令桥接与保护]
StateMonitor --&gt; IMUData[IMU 姿态解析]
StateMonitor --&gt; FallDetect[跌倒检测与恢复]
OdomCalc --&gt; VelInteg[速度积分]
OdomCalc --&gt; TFPub[TF 坐标系发布]
CmdBridge --&gt; HeadCtrl[头部关节控制]
CmdBridge --&gt; SafeMode[跌倒保护姿态]
class DIO L1;
class StateMonitor,OdomCalc,CmdBridge L2;
class IMUData,FallDetect,VelInteg,TFPub,HeadCtrl,SafeMode L3;&lt;/div&gt;
&lt;h3 id="1-状态与稳定性监测"&gt;1. 状态与稳定性监测&lt;/h3&gt;
&lt;p&gt;该部分&lt;code&gt;checkStability&lt;/code&gt;通过订阅 &lt;code&gt;/imu/data&lt;/code&gt; 提取欧拉角（Roll, Pitch, Yaw）。&lt;/p&gt;</description></item><item><title>Config 配置管理模块</title><link>https://zjudancer.github.io/docs/documents/config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/config/</guid><description>&lt;hr&gt;
&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dconfig&lt;/code&gt; 是我们的集中配置仓库，承担两项核心职责：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;静态常量定义&lt;/strong&gt;：通过 C++ 头文件 &lt;code&gt;dconstant.hpp&lt;/code&gt; 提供编译期可用的场地几何参数与网络参数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态配置热更新&lt;/strong&gt;：通过 Python 脚本 &lt;code&gt;config_watchdog.py&lt;/code&gt; 监听配置文件目录，在 YAML 文件发生变化时自动调用 &lt;code&gt;rosparam load&lt;/code&gt; 并向对应模块发布通知。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;模块的目录结构如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dconfig/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── include/dconfig/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── dconstant.hpp # 编译期常量（场地几何 + 网络参数）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── launch/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── dconfig.launch # 启动 config_watchdog 节点
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── matlab/ # MATLAB 脚本
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── config_watchdog.py # 配置热更新守护进程
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── global.yml # 全局运行参数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── 1/ 2/ 3/ 4/ 5/ 6/ 10/ # 各机器人个体配置目录
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── dancer_io/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── dmotion/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── dvision/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="二静态常量dconstanthpp"&gt;二、静态常量：&lt;code&gt;dconstant.hpp&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;该头文件使用 &lt;code&gt;#pragma once&lt;/code&gt; 保护，定义了两个命名空间下的编译期 &lt;code&gt;const&lt;/code&gt; 常量。&lt;/p&gt;</description></item><item><title>Launch 启动脚本模块</title><link>https://zjudancer.github.io/docs/documents/launch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/documents/launch/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dlaunch&lt;/code&gt; 模块通过一系列 &lt;code&gt;.launch&lt;/code&gt; 文件，将 &lt;code&gt;dvision&lt;/code&gt;、&lt;code&gt;dmotion&lt;/code&gt;、&lt;code&gt;dbehavior&lt;/code&gt;、&lt;code&gt;dnetwork&lt;/code&gt;、&lt;code&gt;dancer_io&lt;/code&gt; 等子系统进行组合。从代码实现来看，该模块依赖 ROS 原生的 &lt;code&gt;&amp;lt;include&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;node&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;param&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;rosparam&amp;gt;&lt;/code&gt; 以及 &lt;code&gt;&amp;lt;env&amp;gt;&lt;/code&gt; 标签来组织节点启动与参数加载逻辑。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="核心启动文件"&gt;核心启动文件&lt;/h2&gt;
&lt;p&gt;根据文件内部的标签结构与包含关系，可将这些启动文件划分为以下几类：&lt;/p&gt;
&lt;h3 id="1-纯模块组合-include-主导"&gt;1. 纯模块组合 (&lt;code&gt;&amp;lt;include&amp;gt;&lt;/code&gt; 主导)&lt;/h3&gt;
&lt;p&gt;这类文件主要通过 &lt;code&gt;&amp;lt;include&amp;gt;&lt;/code&gt; 标签加载其他包的启动文件，不显式声明具体的节点（&lt;code&gt;&amp;lt;node&amp;gt;&lt;/code&gt;）参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;game.launch&lt;/code&gt;&lt;/strong&gt;：包含 &lt;code&gt;dvision/launch/default.launch&lt;/code&gt;、&lt;code&gt;dancer_io/launch/motion_io.launch&lt;/code&gt;（&lt;code&gt;game.launch&lt;/code&gt;中有引用，但robocup_ws中未直接包含）、&lt;code&gt;dmotion/launch/motion_hub.launch&lt;/code&gt; （类似的，未直接包含源文件）以及 &lt;code&gt;dnetwork/launch/default.launch&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;piplus.launch&lt;/code&gt;&lt;/strong&gt;：包含 &lt;code&gt;dvision/launch/zed_default.launch&lt;/code&gt;、&lt;code&gt;dio/launch/dancer-io.launch&lt;/code&gt;、&lt;code&gt;dplanner/launch/default.launch&lt;/code&gt;、&lt;code&gt;dnetwork/launch/default.launch&lt;/code&gt; 以及 &lt;code&gt;dbehavior/launch/default.launch&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mv.launch&lt;/code&gt;&lt;/strong&gt;：包含 &lt;code&gt;dconfig/dconfig.launch&lt;/code&gt;、&lt;code&gt;dvision/launch/default.launch&lt;/code&gt; 和 &lt;code&gt;dmotion/launch/default.launch&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sim_default.launch&lt;/code&gt;&lt;/strong&gt;：包含 &lt;code&gt;dvision/launch/default.launch&lt;/code&gt;、&lt;code&gt;dmotion/launch/default.launch&lt;/code&gt;、&lt;code&gt;dnetwork/launch/default.launch&lt;/code&gt;，并设置参数 &lt;code&gt;/ZJUDancer/Simulation&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;get_image_180.launch&lt;/code&gt;&lt;/strong&gt;：包含 &lt;code&gt;dconfig/launch/default.launch&lt;/code&gt;、&lt;code&gt;dmotion/launch/default.launch&lt;/code&gt;、&lt;code&gt;dvision/launch/default.launch&lt;/code&gt;、&lt;code&gt;dnetwork/launch/default.launch&lt;/code&gt;，并加载 &lt;code&gt;global.yml&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-仿真实例与集群编排"&gt;2. 仿真实例与集群编排&lt;/h3&gt;
&lt;p&gt;通过参数服务器注入 &lt;code&gt;&amp;lt;param name=&amp;quot;/ZJUDancer/Simulation&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;/code&gt;，并组合特定编号的文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单体实例 (&lt;code&gt;sim_1.launch&lt;/code&gt; - &lt;code&gt;sim_6.launch&lt;/code&gt;)&lt;/strong&gt;：分别包含 &lt;code&gt;dvision&lt;/code&gt;、&lt;code&gt;dmotion&lt;/code&gt; 和 &lt;code&gt;dnetwork&lt;/code&gt; 目录下对应编号（1-6）的 &lt;code&gt;.launch&lt;/code&gt; 文件，同时设置 &lt;code&gt;/ZJUDancer/BroadcastMVInfo&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群组合 (&lt;code&gt;2.launch&lt;/code&gt;, &lt;code&gt;3.launch&lt;/code&gt;, &lt;code&gt;4.launch&lt;/code&gt;)&lt;/strong&gt;：通过嵌套包含多个 &lt;code&gt;sim_X.launch&lt;/code&gt; 文件来实现组合。例如 &lt;code&gt;4.launch&lt;/code&gt; 内部直接包含了 &lt;code&gt;sim_1.launch&lt;/code&gt; 到 &lt;code&gt;sim_4.launch&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-数据录制与回放-rosbag"&gt;3. 数据录制与回放 (&lt;code&gt;rosbag&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;利用 &lt;code&gt;rosbag&lt;/code&gt; 节点处理数据流，并通过参数标记状态：&lt;/p&gt;</description></item></channel></rss>