<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ZJUDancer</title><link>https://zjudancer.github.io/</link><description>Recent content on ZJUDancer</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 08 Jun 2010 08:06:25 +0600</lastBuildDate><atom:link href="https://zjudancer.github.io/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>足球赛标准操作流程</title><link>https://zjudancer.github.io/docs/tutorials/football-rule/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/football-rule/</guid><description>&lt;h2 id="0gamecontroller裁判盒下载"&gt;0、GameController（裁判盒）下载&lt;/h2&gt;
&lt;h3 id="前提"&gt;前提&lt;/h3&gt;
&lt;p&gt;电脑已安装nodejs  npm  Rust&lt;/p&gt;
&lt;h3 id="检查安装"&gt;检查安装&lt;/h3&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustc -V  &lt;span style="color:#75715e"&gt;#大写V&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装nodejs"&gt;安装nodejs&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;访问Node.js官网：&lt;a href="https://nodejs.org/%ef%bc%88%e6%8e%a8%e8%8d%90LTS%e9%95%bf%e6%9c%9f%e6%94%af%e6%8c%81%e7%89%88%ef%bc%89%ef%bc%8c%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85windows%e5%ae%89%e8%a3%85%e7%a8%8b%e5%ba%8f" target="_blank" rel="noopener"&gt;https://nodejs.org/（推荐LTS长期支持版），下载安装windows安装程序&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行安装包，务必勾选“Add to PATH”选项（默认会勾选，不要取消），然后按提示完成安装。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装完成后，重新打开命令行窗口输入 npm -v，能显示版本号即安装成功。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果Node.js已安装，但npm仍提示找不到，需要手动将Node.js的安装路径添加到系统环境变量：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;找到Node.js的安装路径（默认路径通常是：C:\Program Files\nodejs\ 或 C:\Users[你的用户名]\AppData\Roaming\npm）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开环境变量配置界面，在“系统变量”中找到Path，点击“编辑”：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;  - 点击“新建”，粘贴Node.js的安装路径（比如 C:\Program Files\nodejs\）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击“确定”保存所有设置，必须关闭所有命令行窗口并重新打开，环境变量才会生效。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="安装rust"&gt;安装Rust&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开浏览器访问：&lt;a href="https://www.rust-lang.org/zh-CN/tools/install%ef%bc%9b" target="_blank" rel="noopener"&gt;https://www.rust-lang.org/zh-CN/tools/install；&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击“下载Rustup-init.exe”（一般是x64版本），运行该安装程序；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装过程中会弹出命令行窗口，直接按回车选择默认安装；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等待安装完成，安装器会自动配置环境变量，但需要重启命令行生效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意：安装时可能会提示缺少C++编译工具（如MSVC），按提示安装即可（通常会引导你安装Visual Studio Build Tools），这是Rust编译本地依赖必需的。&lt;/p&gt;
&lt;h3 id="安装裁判盒"&gt;安装裁判盒&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装libclang (for bindgen)&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install LLVM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set LIBCLANG_PATH &lt;span style="color:#e6db74"&gt;&amp;#39;C:\Program Files\LLVM\bin\&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;克隆代码&amp;amp;编译&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/RoboCup-HumanoidSoccerLeague/GameController.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd frontend
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm ci
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo build -r
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="启动裁判盒子"&gt;启动裁判盒子&lt;/h3&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="一裁判盒使用方法"&gt;一、裁判盒使用方法&lt;/h2&gt;
&lt;p&gt;支持平台：windows / ubuntu / mac 均可&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>新机器人基础配置指南</title><link>https://zjudancer.github.io/docs/tutorials/new-robot-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/new-robot-config/</guid><description>&lt;p&gt;拿到一台新机器人后，按照下面步骤依次完成基础配置、联网和常用软件安装。
前提条件：启动机器人，（可参考 &lt;code&gt;机器人开关机及手柄操作&lt;/code&gt;），然后给机器人用HDMI线连接到显示屏&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-连接网络"&gt;1. 连接网络&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;连接 Wi-Fi：&lt;code&gt;ZJUDancer26_loT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;zjudancer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-配置固定-ip"&gt;2. 配置固定 IP&lt;/h2&gt;
&lt;p&gt;进入如下路径进行设置：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;设置&lt;/code&gt; → 点击 &lt;code&gt;ZJUDancer26_loT&lt;/code&gt; 网络右侧的齿轮 → &lt;code&gt;IPv4&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="配置方式"&gt;配置方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;Method&lt;/code&gt; 改成：&lt;code&gt;Manual&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;Address&lt;/code&gt; 第一行依次填写：&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IP 地址&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.50.23x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;子网掩码&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网关&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.50.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;其中 &lt;code&gt;x&lt;/code&gt; 为机器人编号。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="其他设置"&gt;其他设置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DNS&lt;/code&gt; 保持 &lt;code&gt;Automatic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Apply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;断开网络后重新连接&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-安装-clash-verge"&gt;4. 安装 Clash Verge&lt;/h2&gt;
&lt;p&gt;将包含 &lt;code&gt;clash-verge&lt;/code&gt; 的 &lt;code&gt;.deb&lt;/code&gt; 文件通过 U 盘拷贝到机器人中。&lt;/p&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg -i xxxxxxxxxx.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后，先退出clash面板，再运行：&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBKIT_DISABLE_COMPOSITING_MODE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; clash-verge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="后续操作"&gt;后续操作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;打开 Clash 面板&lt;/li&gt;
&lt;li&gt;导入自己机场的节点链接，或者找其他队员要一个&lt;/li&gt;
&lt;li&gt;设置中打开系统代理和开启自启动&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="5-安装-todesk"&gt;5. 安装 ToDesk&lt;/h2&gt;
&lt;h3 id="下载方式"&gt;下载方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在浏览器中搜索 &lt;code&gt;ToDesk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;下载 &lt;strong&gt;arm64 版本&lt;/strong&gt; 的 &lt;code&gt;.deb&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="todesk.png" alt="ToDesk 下载界面" /&gt;
&lt;h3 id="安装命令"&gt;安装命令&lt;/h3&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg -i xxxxxxxxxx.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装后设置"&gt;安装后设置&lt;/h3&gt;
&lt;p&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>使用 ToDesk 连接机器人</title><link>https://zjudancer.github.io/docs/tutorials/todesk/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/todesk/</guid><description>&lt;h2 id="使用-todesk-连接机器人"&gt;使用 ToDesk 连接机器人&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;给想连接的机器人插入显卡欺骗器，或者连上显示屏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在大群里找到最近的一条机器人账号/密码的记录（关键词：&lt;code&gt;device&lt;/code&gt;），输入账号密码，连接。&lt;br&gt;
如果没有找到，说明机器人还没有完成初始化配置，可以参考 &lt;code&gt;新机器人基础配置指南&lt;/code&gt; 里面的 ToDesk 部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此时可以操作机器人自身的文件。包括在完成基础配置的时候，可以在下好 ToDesk 之后，在自己的电脑上用 ToDesk 直接连接机器人，在自己的电脑上完成接下来的部分。这样比坐在地上操控鼠标和键盘要方便很多（我是这么想的），虽然可能会比较卡 TOT。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;终端运行 &lt;code&gt;./zed_explorer&lt;/code&gt;（存疑），此时会显示机器人相机画面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以抬起机器人转圈，观察画面是否跟着转动。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以看看画面中的足球是否有被白框标记。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果都满足，基本可以确认机器人摄像头无问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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>用 SSH 连接机器人</title><link>https://zjudancer.github.io/docs/tutorials/ssh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/ssh/</guid><description>&lt;h2 id="用ssh连接机器人"&gt;用SSH连接机器人&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;本地选择 ZJUDancer26_loT 网络，密码：zjudancer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vscode 先安装 ssh 插件：remote-ssh&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="43c16ccc2ecf4f6ace60eb0e326e267d.png" alt="用SSH连接机器人" /&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;安装完后点击左侧侧边栏的远程资源管理器，光标挪到 ssh 上，点击右侧显示的 &lt;code&gt;+&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入：&lt;code&gt;ssh nvidia@192.168.50.23x&lt;/code&gt;（x 为机器人编号），按 &lt;code&gt;Enter&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="51fd8e996b9ad0a5560807cf5e646da7.png" alt="用SSH连接机器人" /&gt;
&lt;ol start="5"&gt;
&lt;li&gt;
&lt;p&gt;选择第一个选项，一般是 &lt;code&gt;xxx/home/config&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此时左侧列表里已经能出现机器人 IP 地址了，&lt;code&gt;192.168.50.23x&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;鼠标挪到 IP 地址那一行，右侧会出现“当前窗口连接”或“新窗口连接”，都可以使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入密码：&lt;code&gt;nvidia&lt;/code&gt;，按 &lt;code&gt;Enter&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="c6f636bd547fbb121492b8a75f943292.png" alt="用SSH连接机器人" /&gt;
&lt;ol start="9"&gt;
&lt;li&gt;
&lt;p&gt;此时一般已经连上机器人了。假如显示连接失败，可能有以下原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实验室网络问题，容易断连&lt;/li&gt;
&lt;li&gt;机器人网卡驱动有问题，可以左右拨机器人背后的小操纵杆，调到 IP 地址的界面（在电池界面附近，是一个有正方形方框的界面），观察是否显示 &lt;code&gt;192.168.50.23x&lt;/code&gt;（记得插网卡）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后点击左侧侧边栏或顶栏的“文件” → “打开文件夹”，选择 &lt;code&gt;robocup_ws&lt;/code&gt;（需要 git clone 到 home 目录下），打开&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果想退出远程连接状态，点击左下角的蓝色小方框，然后选择“关闭远程连接”即可&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Git 基本知识</title><link>https://zjudancer.github.io/docs/tutorials/git-basics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/git-basics/</guid><description>&lt;h2 id="1-初始配置与-ssh-密钥"&gt;1. 初始配置与 SSH 密钥&lt;/h2&gt;
&lt;p&gt;在开始编写代码之前，我们需要配置 Git 的用户信息以及 SSH 密钥，以便在拉取和推送代码时免去频繁输入密码的步骤。&lt;/p&gt;
&lt;h3 id="11-配置个人信息"&gt;1.1 配置个人信息&lt;/h3&gt;
&lt;p&gt;打开 VSCode 的终端（快捷键 &lt;code&gt;Ctrl + ~&lt;/code&gt; 或通过顶部菜单栏 &lt;code&gt;终端 -&amp;gt; 新建终端&lt;/code&gt;），输入以下命令。配置个人信息是为了在代码提交历史中留下准确的记录，方便团队成员确认代码的作者。请务必填写你的名字或常用昵称：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VSCode 终端 (Terminal)&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.name &lt;span style="color:#e6db74"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.email &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="image-2.png" alt="终端截图" /&gt;
&lt;h3 id="12-生成与添加-ssh-密钥"&gt;1.2 生成与添加 SSH 密钥&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生成密钥&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t rsa -C &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查看并复制密钥&lt;/strong&gt;：运行以下命令，将终端输出的以 &lt;code&gt;ssh-rsa&lt;/code&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ~/.ssh/id_rsa.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="image-5.png" alt="SSH密钥生成成功" /&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;添加到托管平台&lt;/strong&gt;：登录团队的 GitHub 或 GitLab，进入 &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;SSH and GPG keys&lt;/code&gt;，点击 &lt;code&gt;New SSH key&lt;/code&gt;，将复制的内容粘贴进去并保存。&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="image-3.png" alt="SSH密钥导入成功" /&gt;
&lt;hr&gt;
&lt;h2 id="2-克隆代码仓库-git-clone"&gt;2. 克隆代码仓库 (Git Clone)&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>编译 lib 和 core</title><link>https://zjudancer.github.io/docs/tutorials/compile-lib-core/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/compile-lib-core/</guid><description>&lt;h2 id="编译lib和core"&gt;编译lib和core&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按照readme下载好robocup_ws，并一键切换分支，下载到机器人的home目录下&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开主目录下.bashrc文件，将最后类似的几行替换成对应代码&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ROS_MASTER_URI&lt;span style="color:#f92672"&gt;=&lt;/span&gt;http://127.0.0.1:11311
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ROS_IP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ROBOT_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pai
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/local/cuda/bin:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LD_LIBRARY_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/local/cuda/lib64:$LD_LIBRARY_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export CUDA_HOME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/local/cuda
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#export Torch_DIR=/home/nvidia/.local/lib/python3.8/site-packages/torch/share/cmake/Torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PKG_CONFIG_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/local/cuda/bin:/usr/src/tensorrt/bin/:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#export PATH=/home/nvidia/.local/bin:/home/nvidia/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#export OTA_HOME=&amp;#34;/home/nvidia/workspace/ota-client&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#export PATH=/home/nvidia/.local/bin:/home/nvidia/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#export PATH=/home/nvidia/.local/bin:/home/nvidia/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ZJUDANCER_GPU&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LD_LIBRARY_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/lib/aarch64-linux-gnu:/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ZJUDANCER_ROBOTID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /home/nvidia/robocup_ws/lib/devel/setup.bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /home/nvidia/robocup_ws/core/devel/setup.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中倒数第三行的ROBOTID，根据实际情况修改，改成当前机器人的编号即可&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;用vscode，在robocup文件夹下直接打开终端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用cd命令切换到lib文件夹&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行命令catkin_make&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编译成功后，运行命令source devel/setup.bash，设置环境变量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cd命令切换到core文件夹&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行命令catkin_make&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;假如编译失败，可以先在lib文件夹下运行rm -rf build devel,在运行catkin_make，然后回到core文件夹，重复该步骤&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果依旧失败，再查看之前的步骤，有无遗漏&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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>机器人开关机及手柄操作</title><link>https://zjudancer.github.io/docs/tutorials/power-controller/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/power-controller/</guid><description>&lt;ol&gt;
&lt;li&gt;找到一个电量充足的电池，捏住卡扣，将电池推入机器人前胸的电池舱。&lt;/li&gt;
&lt;li&gt;握住机器人肩膀，提起机器人，观察机器人大腿与大臂上的热熔胶圈标记是否向前，若否，旋转机器人大腿或大臂，保证热熔胶圈标记向前。&lt;/li&gt;
&lt;li&gt;握住机器人肩膀，将你的右脚插入机器人两脚之间，将你的左脚放在机器人左脚左侧，使机器人左脚脚尖向前；将你的左脚插入机器人两脚之间，将你的右脚放在机器人右脚右侧，使机器人右脚脚尖向前。保证机器人双脚脚尖向前，相距约15cm。&lt;/li&gt;
&lt;li&gt;握住机器人肩膀，将你的右膝弯曲，将机器人的右膝向前顶；将你的左膝弯曲，将机器人的左膝向前顶。将你握住机器人肩膀的手慢慢下移，使机器人慢慢蹲下，将机器人的胸壳架在机器人的大腿上。个别机器人没有胸壳，可以将机器人大腿适当向内掰，减小机器人大腿的间距，将机器人电池舱在机器人的大腿上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;谨慎松手，如果机器人保持蹲姿，恭喜你！你已经完成了最难学的一步。如果机器人侧翻倒地，很正常！请重复第2、3、4步&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;扶住机器人把手，先短按、后长按电池电源，打开电池。若电池正确打开，一定出现的现象是电池上的有流水灯效，通常出现的现象是听到风扇声。等待流水灯效停止，查看电池剩余电量。若电池上亮起的蓝灯少于2个，必须充电。在机器人运行过程中，必须时刻关注电量。&lt;/li&gt;
&lt;li&gt;看向机器人后背，长按小电源，打开上位机；短按大电源，打开下位机。等待显示屏显示“Default”。&lt;/li&gt;
&lt;li&gt;扶住机器人把手，用USB线连接手柄。&lt;/li&gt;
&lt;li&gt;长按手柄上圆形的按键，直到感受到手柄上的振动，这表示手柄连接成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;这个圆形的按键只有“连接”的作用，没有“取消连接”的作用，因此如果你觉得手柄接触不良，可以放心无限次地按这个圆形的按键。若手柄电量不足，会频繁接触不良，此时如果你要按其他按键，可以在按其他按键之前先按这个圆形的按键，并且预判手柄振动的时长，在你预判振动即将停止之前，按下你要按的按键。
预判较难，不能过早，也不能过晚，可以多试几次，或者放弃，并给手柄充电。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接下来，我们将手柄按键最多的一面称为“顶面”，将有4个按键的一面称为“前面”。&lt;/p&gt;
&lt;p&gt;翻转手柄，使“前面”向上，你会看到LT、RT、LB、RB。如果你熟悉计算机视觉，就会知道这是左上（Left Top）、右上（Right Top）、左下（Left Bottom）、右下（Right Bottom）的简称。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在学习手柄操作时，大部分同学都会把“LT、RT、LB”连起来记，并且不太注意食指与中指的位置。我在寒假里发现了一种超级简单的记忆方法：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;你可能听说过造纸厂有一种切纸机，为了防止工人切到手，必须双手同时按住两个按钮，才能启动切纸。对于手柄操作，许多都要同时按3个键，并且其中2个键是“LT、RT”，你不妨认为这是为了防止误操作，并且养成习惯：只用左右手中指按“LT、RT”，不要其中一只手用食指。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如无特殊说明，下文的手柄操作都要按住左右手中指。&lt;/p&gt;
&lt;ol start="10"&gt;
&lt;li&gt;右手拇指按“顶面”的“Start”键，让机器人起立。&lt;/li&gt;
&lt;li&gt;左手食指按下，给机器人解锁，可以看到机器人轻轻向前晃一下，且提起机器人后机器人会挣扎。&lt;/li&gt;
&lt;li&gt;操纵推杆，控制机器人的平移和旋转。&lt;strong&gt;操纵推杆需松开左右手中指&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;右手食指按下，让机器人蹲下。&lt;/li&gt;
&lt;li&gt;如果机器人蹲下后，你又想让机器人起立，但是右手拇指按“顶面”的“Start”键，机器人没有反应，可以观察机器人后背显示屏是否显示“Default”，若否，右手拇指按“顶面”的“A”键，直至机器人后背显示屏显示“Default”。如果是老机器人，可能需要按“顶面”的“←”“→”键，直至机器人后背显示屏显示“Default”。当然，如果你懒得记住这些，可以短按大电源，关闭下位机，再短按大电源，打开下位机，此时器人后背显示屏一般会显示“Default”。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;注意：&lt;/em&gt; 永远不要按“顶面”的“B”键，否则机器人会掉电摔倒。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start="15"&gt;
&lt;li&gt;如果你体验完了，打算关闭机器人，可以短按大电源，关闭下位机；长按小电源，关闭上位机。然后先短按、后长按电池电源，关闭电池。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;养成习惯：每次关闭电池之后，立刻取出电池，拿去充电，并让机器人在场边蹲好。&lt;/p&gt;
&lt;/blockquote&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><item><title>调试启动</title><link>https://zjudancer.github.io/docs/tutorials/debug-startup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/debug-startup/</guid><description>&lt;h2 id="调试启动"&gt;调试启动&lt;/h2&gt;
&lt;p&gt;在 /core 终端下（可以多开）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;kill 手柄节点命令：&lt;code&gt;rosnode kill joy_teleop&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动机器人命令：&lt;code&gt;roslaunch dlaunch piplus.launch&lt;/code&gt;
（停止是 &lt;code&gt;Ctrl + C&lt;/code&gt;，最好等到机器人停止移动，在转头的时候停止运行）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以再开一个终端，备好零点复位命令，在机器人原地转头的时候运行，停下机器人：&lt;br&gt;
&lt;code&gt;rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;若无法启动机器人可以注意启动五个分启动文件，查看报错信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动裁判盒命令：在 &lt;code&gt;GameController&lt;/code&gt; 路径下，运⾏ &lt;code&gt;cargo run&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>裁判盒</title><link>https://zjudancer.github.io/docs/tutorials/referee-box/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/referee-box/</guid><description>&lt;h2 id="1-安装-nodejs"&gt;1. 安装 Node.js&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下载安装包：&lt;a href="https://nodejs.org/zh-cn/download" target="_blank" rel="noopener"&gt;https://nodejs.org/zh-cn/download&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;运行安装包，手动勾选“Add to PATH”。&lt;/li&gt;
&lt;li&gt;检查安装：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Windows CMD / Windows Powershell / Ubuntu Bash&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-安装-rust"&gt;2. 安装 Rust&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href="https://www.rust-lang.org/tools/install" target="_blank" rel="noopener"&gt;https://www.rust-lang.org/tools/install&lt;/a&gt; 下载并运行 rustup-init。&lt;/li&gt;
&lt;li&gt;按提示默认安装（直接回车）。若提示缺少 C++ 编译工具，请按引导安装 Visual Studio Build Tools。&lt;/li&gt;
&lt;li&gt;检查安装：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Windows CMD / Windows Powershell / Ubuntu Bash&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rustc -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-安装裁判盒"&gt;3. 安装裁判盒&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安装 libclang (用于 bindgen)：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Windows CMD&lt;/strong&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-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install LLVM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; LIBCLANG_PATH=C:\Program Files\LLVM\bin\
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Windows Powershell&lt;/strong&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-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install LLVM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$env:LIBCLANG_PATH=&lt;span style="color:#e6db74"&gt;&amp;#34;C:\Program Files\LLVM\bin\&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Ubuntu Bash&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install llvm libclang-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;克隆代码并编译：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Windows CMD / Windows Powershell&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>比赛启动（文档维护中）</title><link>https://zjudancer.github.io/docs/tutorials/match-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/match-start/</guid><description>&lt;p&gt;该文档仍在维护中。&lt;/p&gt;
&lt;p&gt;比赛启动流程整理完成后会在这里补充。&lt;/p&gt;</description></item><item><title>标定内外参</title><link>https://zjudancer.github.io/docs/tutorials/calibration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/calibration/</guid><description>&lt;h2 id="step-1-让机器站起来并保证项能够正常作"&gt;Step 1 ：让机器⼈站起来并保证项⽬能够正常⼯作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;短按+⻓按电源，开启前部电源（确保⼀格以上）；&lt;/li&gt;
&lt;li&gt;短按+⻓按开启上位机，短按开启下位（关机顺序相反）&lt;/li&gt;
&lt;li&gt;在机器⼈⾝上插上遥控器usb接收器，开启遥控器&lt;/li&gt;
&lt;li&gt;等机器⼈背屏进⼊DEFAULT模式后，按LT+RT+START使得机器⼈站⽴；&lt;/li&gt;
&lt;li&gt;重新插拔机器⼈的双⽬摄像头接线，保证ZED work&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-2--连接机器"&gt;Step 2 : 连接机器⼈&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ssh nvidia@192.168.50.22X&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;x为机器人编号&lt;/p&gt;
&lt;p&gt;随后可以进⼊机器⼈上的ubuntu系统，对机器⼈的调试都在ssh环境中进⾏。&lt;/p&gt;
&lt;h2 id="step-3--先修改机器的内参数据"&gt;Step 3 : 先修改机器⼈的内参数据&lt;/h2&gt;
&lt;p&gt;在当前⼯作空间下，找到&lt;br&gt;
&lt;code&gt;robocup_ws/core/src/dvision/src/camera/source/zed_camera.cpp&lt;/code&gt;&lt;br&gt;
⽂件，确认camera_resolution的格式，是1080还是HD720还是其他？记住它！&lt;/p&gt;
&lt;p&gt;在机器⼈ubuntu系统中，找到&lt;br&gt;
&lt;code&gt;/usr/local/zed/settings&lt;/code&gt;，⾥⾯有SN.conf⽂件。&lt;/p&gt;
&lt;p&gt;如果此时有不同编号的conf⽂件，怎么确定哪个⽂件才是正确的？可以跑&lt;br&gt;
&lt;code&gt;/usr/local/zed/samples&lt;/code&gt;&lt;br&gt;
下⾯的tutorial-Hello ZED,不过需要⾃⼰编译⼀下&lt;br&gt;
然后运⾏会在终端输出当前ZED的serial number，就可以找到对应的SN.conf⽂件。打开对应的SN.conf⽂件，根据刚才看到的camera_resolution,把对应的内参数据记住，fx,fy,cx,cy还有⼏个畸变系数。&lt;/p&gt;
&lt;p&gt;重新回到⼯作空间，找到&lt;br&gt;
&lt;code&gt;robocup_ws/core/src/dconfig/1/division/camera.yml&lt;/code&gt;，这个就是机器⼈相机的配置⽂件（不⼀定要1，但是我们默认使⽤1这个⽂件夹，后续标外参的时候需要机器⼈编号也输⼊1即可）&lt;/p&gt;
&lt;p&gt;（1）需要修改width height frameRate根据zed相机分辨率和帧率来改，如果不知道，可以打开⼀个终端运⾏ZED_Explorer，应该可以查看相关数据，如果不全，上⽹搜搜查询⽅法&lt;/p&gt;
&lt;p&gt;（2）把刚刚的内参数据填⼊到这个yml⽂件中，即projection下的fx fy cx cy和distcoeff矩阵，这个discoeff是畸变系数和⼀些数据，SN.conf⽂件应该只有⼀部分，ZED_Explorer也能看到⼀部分，需要对应填进去，具体的discoeff矩阵可以问问ai。&lt;/p&gt;
&lt;p&gt;⾄此，内参处理完。&lt;/p&gt;
&lt;h2 id="step-4-外参标定过程"&gt;Step 4： 外参标定过程&lt;/h2&gt;
&lt;p&gt;摊开那个标定⽩布，展平，然后如图所⽰，把机器⼈放在细线交叉点（红圈处，⾯朝⽩布），注意图中右上⻆那个图案需要被遮起来
&lt;img src="image.png" alt="image"&gt;
然后打开新的终端运⾏calib_ext，终端提⽰时输⼊机器⼈位置A，机器⼈编号1（如果没有请忽略），机器⼈应该会⾃⼰运转；&lt;/p&gt;
&lt;p&gt;⼤概运⾏五分钟左右，即可关闭tmux的两个终端；&lt;/p&gt;
&lt;p&gt;找到最外层的&lt;br&gt;
&lt;code&gt;~/dancer-camera&lt;/code&gt;&lt;br&gt;
⽂件夹，会看到⽂件名为 &lt;code&gt;bot1_ext_A.txt&lt;/code&gt; （外参标定数据）与&lt;br&gt;
&lt;code&gt;bot1_in.txt&lt;/code&gt; （去畸变后的内参矩阵），这两个⽂件，把它下载到⾃⼰电脑上。&lt;/p&gt;
&lt;p&gt;接着在&lt;br&gt;
&lt;code&gt;robocup_ws/core/src/dconfig&lt;/code&gt;&lt;br&gt;
下找到⼀个名为matlab的⽂件夹，把这个⽂件夹也⼀同下载到你的电脑⾥。&lt;/p&gt;
&lt;p&gt;打开你电脑上的matlab,导⼊这个⽂件夹，以及 &lt;code&gt;bot1_ext_A.txt&lt;/code&gt; （外参标定数据）与 &lt;code&gt;bot1_in.txt&lt;/code&gt; （去畸变后的内参矩阵）这两个⽂件，在运⾏之前，需要改⼀下main.m程序，如下图把lb和ub数组⾥z这⼀列都改成50,会有更好地效果。然后点击运⾏，等待⼀会⼉你就能看到终端输出了⼀个外参矩阵，然后会出现⼀张图，如果图中的红点分布⾮常集中，且全部在蓝点附近，则效果⽐较好，如果没有，则要思考哪⾥出现了问题。
&lt;img src="image-1.png" alt="image"&gt;
把matalb终端⾥⽣成的外参矩阵复制粘贴到刚刚的&lt;br&gt;
&lt;code&gt;robocup_ws/core/src/dconfig/1/division/camera.yml&lt;/code&gt;，替换原有的extrinsic parameters矩阵，就在最底下，应该很清楚能够看到。&lt;/p&gt;
&lt;h2 id="step-5--检验标定效果"&gt;Step 5 : 检验标定效果：&lt;/h2&gt;
&lt;p&gt;在&lt;br&gt;
&lt;code&gt;robocup_ws/core/src/dvision/src/detector/ball_detector.cpp&lt;/code&gt;&lt;br&gt;
这个⽂件，找到这⼀⾏&lt;/p&gt;</description></item><item><title>高擎例程安装</title><link>https://zjudancer.github.io/docs/tutorials/highengine/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/highengine/</guid><description>&lt;p&gt;使用 HDMI 线接入机器人背板进入可视化界面，同时插上键盘鼠标直接在机器人小电脑上进行控制，参照下方顺序：&lt;/p&gt;
&lt;h2 id="步骤一环境准备"&gt;步骤一：环境准备&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击右上角进行网络连接&lt;/li&gt;
&lt;li&gt;鼠标右键桌面打开终端，输入 &lt;code&gt;code .&lt;/code&gt; 打开 VSCode&lt;/li&gt;
&lt;li&gt;在右下角的终端输入下载代码指令：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/HighTorque-Robotics/RoboCup_Workspace.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;在左侧的文件结构找到 &lt;code&gt;.bashrc&lt;/code&gt; 文件，打开后将下方代码粘贴至 &lt;code&gt;.bashrc&lt;/code&gt; 文件内容末尾：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ZJUDANCER_GPU&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LD_LIBRARY_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/lib/aarch64-linux-gnu:/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export ZJUDANCER_ROBOTID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source /home/nvidia/RoboCup_Workspace/core/devel/setup.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;粘贴后保存文件。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="步骤二编译代码"&gt;步骤二：编译代码&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在现有终端里输入命令：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再依次进入 &lt;code&gt;lib&lt;/code&gt; 和 &lt;code&gt;core&lt;/code&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd lib/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;catkin_make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;等待加载到 100% 后编译完成。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;接下来依次输入：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ../core
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;catkin_make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译后的代码才能正常执行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="步骤三检查相机连接"&gt;步骤三：检查相机连接&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;开机后，需插拔机器人顶部相机线，然后终端输入：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsusb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会显示找到了 &lt;code&gt;ZED-M&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果显示的是 &lt;code&gt;ZED Hid device&lt;/code&gt;，则相机连接不正常，需要检查接线。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后有两种显示相机画面的方法（要求通过显示器或 todesk 看到机器人的可视化界面）：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(1)&lt;/strong&gt; 终端输入 &lt;code&gt;ZED_Explorer&lt;/code&gt;（ZED 官方的测试程序），如果出现正常不闪动的相机画面，则相机功能正常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2)&lt;/strong&gt; 终端输入 &lt;code&gt;roslaunch dvision zed_detect.launch&lt;/code&gt;（视觉识别测试程序），如果出现相机画面，画面中有足球时有方框框起来，则相机功能正常。&lt;/p&gt;</description></item><item><title>机器人上常用软件安装</title><link>https://zjudancer.github.io/docs/tutorials/robot-software/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://zjudancer.github.io/docs/tutorials/robot-software/</guid><description>&lt;h2 id="todesk"&gt;Todesk&lt;/h2&gt;
&lt;p&gt;在官网下载 arm 架构的 deb 安装包，按照教程操作即可。todesk 连接时需要在机器人的 HDMI 口插入显卡欺骗器（找现场工程师领取，用完插在机器人上一起归还即可）&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href="https://www.todesk.com" target="_blank" rel="noopener"&gt;ToDesk远程桌面软件-免费安全流畅的远程连接电脑手机&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;Debian/Ubuntu/Mint (arm64)&lt;/code&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb package: https://dl.todesk.com/linux/todesk-v4.8.5.1-arm64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install ./todesk-vx.x.x-arm64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;todesk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="clash-verge"&gt;Clash Verge&lt;/h2&gt;
&lt;p&gt;安装包在群里发过：&lt;code&gt;clash-verge_1.7.3_arm64.deb&lt;/code&gt;&lt;/p&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg -i clash-verge_1.7.3_arm64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装后直接点击应用图标不能正常启动。&lt;/p&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBKIT_DISABLE_COMPOSITING_MODE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; clash-verge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;才能正常启动，启动后导入自己的订阅地址 URL，开启&amp;quot;系统代理&amp;quot;和&amp;quot;开机自启&amp;quot;即可，之后每次开机会自动处于翻墙状态。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="搜狗拼音输入法"&gt;搜狗拼音输入法&lt;/h2&gt;
&lt;p&gt;在官网搜索 linux arm64 版本，按照官网教程操作即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 注意：教程里提到的以下两行命令一定要执行：&lt;/p&gt;
&lt;/blockquote&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install libgsettings-qt1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>