<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://blog.jeacsonsnake.com/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://blog.jeacsonsnake.com/</id>
  <title>JeacsonBlog</title>
  <subtitle>JeacsonBlog-一个简单的博客</subtitle>
  <icon>https://blog.jeacsonsnake.com/assets/img/favicon.ico</icon>
  <logo>https://blog.jeacsonsnake.com/assets/img/logo.png</logo>
  <updated>2026-04-13T16:19:22.838Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://blog.jeacsonsnake.com/atom.xml"/>
  <link rel="alternate" href="https://blog.jeacsonsnake.com/"/>
  <category term="Computer"/>
  <category term="robot"/>
  <category term="ROS"/>
  <category term="Skill"/>
  <category term="Network"/>
  <category term="basic"/>
  <contributor>
    <name>xxx</name>
  </contributor>
  <contributor>
    <name>不加辣先生</name>
  </contributor>
  <entry>
    <title type="text">ROS2-Z02-ROS2工具：坐标变换（EXEC2）乌龟护航案例实战</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_13.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_13.html"/>
    <updated>2026-02-13T03:00:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>本章节主要介绍如何实现 “乌龟护航” 案例。里面的大部分代码会沿用内的相关代码内容。因此建议先尝试实现上一章节的效果，再来进行本章节的实战。</p>
<h2>案例需求&amp;分析</h2>
<p><strong>需求：</strong> 基于上一章节要求编写程序实现，以 <code>turtlesim_node</code> 节点的原生乌龟（<code>turtle1</code>）为几何中心，生成多只新的乌龟（以三只为例，即<code>turtle2</code>、<code>turtle3</code>、<code>turtle4</code>）。要求在 <code>turtle1</code> 无论是静止或是被键盘控制运动时，<code>turtle2</code> 都会以 <code>turtle1</code> 的几何中心为目标并以某种队形对其进行护航。</p>]]></summary>
    <content type="html"><![CDATA[简介 本章节主要介绍如何实现 “乌龟护航” 案例。里面的大部分代码会沿用内的相关代码内容。因此建议先尝试实现上一章节的效果，再来进行本章节的实战。 案例需求&分析 需求： 基于上一章节要求编写程序实现，以 turtlesim_node 节点的原生乌龟（turtle1）为几何中心，生成多只新的乌龟（以三只为例，即turtle2、turtle3、turtl...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-13T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-Z01-ROS2工具：坐标变换（EXEC1）乌龟跟随案例实战</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_09.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_09.html"/>
    <updated>2026-02-11T08:08:26.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>本章节主要介绍如何实现 “乌龟跟随” 案例。</p>
<h2>案例需求&amp;分析</h2>
<p><strong>需求：</strong> 编写程序实现，程序运行后会启动 <code>turtlesim_node</code> 节点，该节点会生成一个窗口，窗口中有一只原生乌龟（<code>turtle1</code>），紧接着再生成一只新的乌龟（<code>turtle2</code>）。要求在 <code>turtle1</code> 无论是静止或是被键盘控制运动时，<code>turtle2</code> 都会以 <code>turtle1</code> 为目标并向其几何中心运动。</p>]]></summary>
    <content type="html"><![CDATA[简介 本章节主要介绍如何实现 “乌龟跟随” 案例。 案例需求&分析 需求： 编写程序实现，程序运行后会启动 turtlesim_node 节点，该节点会生成一个窗口，窗口中有一只原生乌龟（turtle1），紧接着再生成一只新的乌龟（turtle2）。要求在 turtle1 无论是静止或是被键盘控制运动时，turtle2 都会以 turtle1 为目标并...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-09T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-026-ROS2工具：坐标变换（七）坐标变换工具</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_05.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_05.html"/>
    <updated>2026-02-05T09:24:04.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在 <code>TF</code> 框架中，<code>ROS2</code> 除了封装了 <strong>坐标广播与监听</strong> 功能外，还提供了一些可以帮助我们提高开发、调试效率的工具。本章节主要介绍这些工具的使用。</p>
<p>这些工具主要涉及到两个功能包：<code>tf2_ros</code> 和 <code>tf2_tools</code>。</p>
<h2>功能包介绍</h2>
<p><code>tf2_ros</code> 包中提供的常用节点如下：</p>
<ul>
<li>
<p><code>static_transform_publisher</code>：该节点用于广播静态坐标变换，在 <strong></strong> 章节中已有详细说明，不再介绍；</p>
</li>
<li>
<p><code>tf2_monitor</code>：该节点用于打印所有或特定坐标系的发布频率与网络延迟；</p>
</li>
<li>
<p><code>tf2_echo</code>：该节点用于打印特定坐标系的平移旋转关系。</p>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[简介 在 TF 框架中，ROS2 除了封装了 坐标广播与监听 功能外，还提供了一些可以帮助我们提高开发、调试效率的工具。本章节主要介绍这些工具的使用。 这些工具主要涉及到两个功能包：tf2_ros 和 tf2_tools。 功能包介绍 tf2_ros 包中提供的常用节点如下： static_transform_publisher：该节点用于广播静态坐标...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-05T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-025-ROS2工具：坐标变换（六）监听坐标点消息</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_04.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_04.html"/>
    <updated>2026-02-05T09:23:17.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>坐标变换监听</strong> 可以实现坐标点在不同坐标系之间的变换，或者不同的多个坐标系之间的变换。
针对坐标变换进行监听的前提，是必须<strong>已有不同的多个坐标系相对关系</strong>的广播，而至于是静态广播或动态广播则无要求。因为监听获取的坐标系相对关系皆为某一时刻或某一时间点。</p>
<p>在中，我们经由案例一实现了<strong>多坐标系</strong>的场景下实现<strong>不同坐标系</strong>之间的变换。在这一章节中，我们会实现案例二，即<strong>同一坐标点</strong>在<strong>不同坐标系</strong>下的变换。虽然两个案例的需求不同，但是相关算法都被封装好了，我们只需要调用相关 API 即可。</p>]]></summary>
    <content type="html"><![CDATA[简介 坐标变换监听 可以实现坐标点在不同坐标系之间的变换，或者不同的多个坐标系之间的变换。 针对坐标变换进行监听的前提，是必须已有不同的多个坐标系相对关系的广播，而至于是静态广播或动态广播则无要求。因为监听获取的坐标系相对关系皆为某一时刻或某一时间点。 在中，我们经由案例一实现了多坐标系的场景下实现不同坐标系之间的变换。在这一章节中，我们会实现案例二，...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-04T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-024-ROS2工具：坐标变换（五）坐标变换监听</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_03.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_03.html"/>
    <updated>2026-02-04T08:07:13.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>坐标变换监听</strong> 可以实现坐标点在不同坐标系之间的变换，或者不同的多个坐标系之间的变换。
针对坐标变换进行监听的前提，是必须<strong>已有不同的多个坐标系相对关系</strong>的广播，而至于是静态广播或动态广播则无要求。因为监听获取的坐标系相对关系皆为某一时刻或某一时间点。</p>
<h2>案例梳理</h2>
<p>以下有两个案例：</p>
<ol>
<li>在中，我们发布了 <code>laser</code> 相对于 <code>base_link</code>，和 <code>camra</code> 相对于 <code>base_link</code> 的坐标系关系，请基于此求解 <strong><code>laser</code> 相对于 <code>camera</code></strong> 的坐标系关系。</li>
<li>在中，我们发布了 <code>laser</code> 相对于 <code>base_link</code>的坐标系关系 和 <code>laser</code> 坐标系下一 <em>点状障碍物</em> 的坐标点数据，请基于此求解在 <code>base_link</code> 坐标系下 <strong>该点状障碍物</strong> 的坐标。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[简介 坐标变换监听 可以实现坐标点在不同坐标系之间的变换，或者不同的多个坐标系之间的变换。 针对坐标变换进行监听的前提，是必须已有不同的多个坐标系相对关系的广播，而至于是静态广播或动态广播则无要求。因为监听获取的坐标系相对关系皆为某一时刻或某一时间点。 案例梳理 以下有两个案例： 在中，我们发布了 laser 相对于 base_link，和 camra...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-03T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-023-ROS2工具：坐标变换（四）发布坐标点消息</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_02_02.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_02_02.html"/>
    <updated>2026-02-02T14:43:39.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在 里，我们介绍了<strong>静态广播</strong> 和 <strong>动态广播</strong>。本章会主要介绍如何发布坐标点消息。</p>
<h2>案例梳理</h2>
<p>以下有一案例需求：</p>
<p>有一无人车，在无人车底盘上装有 <strong>固定式</strong> 的激光雷达。车辆底盘、雷达各对应一坐标系，且各坐标系的原点取其几何中心。现该激光雷达扫描到一 <em>点状障碍物</em> 且可以定位到障碍物的坐标，请在 <strong>雷达坐标系下</strong> 发布障碍坐标点数据，并在Rviz2 中查看结果。</p>
<p>上述案例是一个简单的 <code>话题发布程序</code>，在了解用于发布坐标点信息的 <code>geometry_msgs/msg/PointStamped</code> 接口消息之后，直接通过 <strong>话题发布方</strong> 按照一定逻辑发布消息即可。</p>]]></summary>
    <content type="html"><![CDATA[简介 在 里，我们介绍了静态广播 和 动态广播。本章会主要介绍如何发布坐标点消息。 案例梳理 以下有一案例需求： 有一无人车，在无人车底盘上装有 固定式 的激光雷达。车辆底盘、雷达各对应一坐标系，且各坐标系的原点取其几何中心。现该激光雷达扫描到一 点状障碍物 且可以定位到障碍物的坐标，请在 雷达坐标系下 发布障碍坐标点数据，并在Rviz2 中查看结果。...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-02-02T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-022-ROS2工具：坐标变换（三）坐标变换广播</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_01_29.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_01_29.html"/>
    <updated>2026-02-05T09:23:17.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>坐标系相对关系主要有两种：静态坐标系相对关系与动态坐标系相对关系：</p>
<ul>
<li>
<p><code>静态坐标系相对关系</code> 是指两个坐标系之间的相对位置是 <strong>固定不变</strong> 的，比如：车辆上的雷达、摄像头等组件一般是固定式的，那么雷达坐标系相对于车辆底盘坐标系或摄像头坐标系相对于车辆底盘坐标系就是一种静态关系。</p>
</li>
<li>
<p><code>动态坐标系相对关系</code> 是指两个坐标系之间的相对位置关系是 <strong>动态改变</strong> 的，比如：车辆上机械臂的关节或夹爪、多车编队中不同车辆等都是可以运动的，那么机械臂的关节或夹爪坐标系相对车辆底盘坐标系或不同车辆坐标系的相对关系就是一种动态关系。</p>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[简介 坐标系相对关系主要有两种：静态坐标系相对关系与动态坐标系相对关系： 静态坐标系相对关系 是指两个坐标系之间的相对位置是 固定不变 的，比如：车辆上的雷达、摄像头等组件一般是固定式的，那么雷达坐标系相对于车辆底盘坐标系或摄像头坐标系相对于车辆底盘坐标系就是一种静态关系。 动态坐标系相对关系 是指两个坐标系之间的相对位置关系是 动态改变 的，比如：车...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-29T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-020-ROS2工具：坐标变换（一）简介</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_01_28.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_01_28.html"/>
    <updated>2026-02-02T14:43:18.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>我们在操作机器人时，通常会使用各种传感器感知机器人周围的物体与机器人的相对位置。不过在未针对传感器进行配置的情况下，传感器只能够返回其自身与物体的相对位置。因此我们需要通过某些特定的转换工程，才可以将该传感器的方位信息，变换物体相对于机器人系统或机器人其它组件的方位信息。在 ROS 中直接封装了相关的模块，其名称为 <code>tf(TransForm Frame)</code></p>
<h2>概念</h2>
<p>该模块允许用户随时间跟踪多个坐标系。它在拥有 <strong>时间缓冲</strong> 的 <em>树状结构</em> 中维护坐标帧之间的关系，并让用户在 <em>任何</em> 所需的时间点在 <em>任意</em> 两个坐标帧之间变换点、向量等。在ROS中已经提供了同名的库实现，并且随着ROS的迭代，该库升级为了tf2，也即第二代坐标变换库。</p>]]></summary>
    <content type="html"><![CDATA[简介 我们在操作机器人时，通常会使用各种传感器感知机器人周围的物体与机器人的相对位置。不过在未针对传感器进行配置的情况下，传感器只能够返回其自身与物体的相对位置。因此我们需要通过某些特定的转换工程，才可以将该传感器的方位信息，变换物体相对于机器人系统或机器人其它组件的方位信息。在 ROS 中直接封装了相关的模块，其名称为 tf(TransForm Fr...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-28T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-021-ROS2工具：坐标变换（二）内部常用接口消息</title>
    <id>/learningNote/Ros2_Note/coor_trans/2026_01_28_002.html</id>
    <link href="/learningNote/Ros2_Note/coor_trans/2026_01_28_002.html"/>
    <updated>2026-02-02T14:43:18.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>由来看，我们不难发现对于坐标变换的实现，其本质是基于话题通信的发布订阅模型。发布方可以发布坐标系之间的相对关系，订阅方则可以监听这些消息，并实现不同坐标系之间的变换。根据，在话题通信中，<strong>接口消息</strong> 作为数据载体在整个通信模型中是比较重要的一部分。</p>
<p>本章将会介绍坐标变换中常用的两种接口消息：<code>geometry_msgs/msg/TransformStamped</code> 和 <code>geometry_msgs/msg/PointStamped</code>。</p>
<p>前者用于描述某一时刻<strong>两个坐标系</strong>之间相对关系的接口，后者用于描述某一时刻<strong>坐标系内某个坐标点</strong>的位置的接口。在之后的坐标变换中，我们会经常性的使用到坐标系相对关系以及坐标点相关信息。</p>]]></summary>
    <content type="html"><![CDATA[简介 由来看，我们不难发现对于坐标变换的实现，其本质是基于话题通信的发布订阅模型。发布方可以发布坐标系之间的相对关系，订阅方则可以监听这些消息，并实现不同坐标系之间的变换。根据，在话题通信中，接口消息 作为数据载体在整个通信模型中是比较重要的一部分。 本章将会介绍坐标变换中常用的两种接口消息：geometry_msgs/msg/TransformSta...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-28T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2工具——坐标变换</title>
    <id>/learningNote/Ros2_Note/coor_trans/</id>
    <link href="/learningNote/Ros2_Note/coor_trans/"/>
    <updated>2026-02-02T14:43:18.000Z</updated>
    <summary type="html"><![CDATA[<h2>简述</h2>
<p>这里是我有关ROS2工具 - <strong>坐标变换</strong> 的相关笔记，包括的内容有：</p>
<ul>
<li>坐标变换的概念与应用场景</li>
<li>坐标变换的两种重要消息载体: <code>TransformStamped</code> &amp; <code>PointStamped</code> 的定义格式（基于 <em>话题通信</em> ）</li>
<li>坐标变换的通信双方（广播方与监听方）</li>
<li>坐标变换工具 （相关指令的进一步说明以及调试工具等）</li>
</ul>
<p>具体软硬件以及技术背景等细节请参考</p>]]></summary>
    <content type="html"><![CDATA[简述 这里是我有关ROS2工具 - 坐标变换 的相关笔记，包括的内容有： 坐标变换的概念与应用场景 坐标变换的两种重要消息载体: TransformStamped & PointStamped 的定义格式（基于 话题通信 ） 坐标变换的通信双方（广播方与监听方） 坐标变换工具 （相关指令的进一步说明以及调试工具等） 具体软硬件以及技术背景等细节请参考]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.004Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-019-ROS2工具：rosbag2</title>
    <id>/learningNote/Ros2_Note/launch_rosbag2/2026_01_24.html</id>
    <link href="/learningNote/Ros2_Note/launch_rosbag2/2026_01_24.html"/>
    <updated>2026-01-26T14:44:42.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>假设你有一个机器人：</p>
<blockquote>
<ul>
<li>它在日常运行时没有问题，但是在某一次运行时突然报错了。你希望即刻对此进行排查，但是这个报错只出现了一次，再次运行又没有报错了。</li>
<li>你给他重新设计了一个运动控制节点，但是调不准它的一些特定参数。如果在真实环境中直接运行可能会出现意想不到的情况。</li>
<li>你在某一次运动导航实验中意外的获得了一条导航路径，希望有什么工具把它保存下来，以便之后复现该结果。</li>
</ul>
</blockquote>
<p>针对数据的留存及其读取实现，<code>ROS2</code> 提供了专门的工具 —— <code>rosbag2</code></p>]]></summary>
    <content type="html"><![CDATA[简介 假设你有一个机器人： 它在日常运行时没有问题，但是在某一次运行时突然报错了。你希望即刻对此进行排查，但是这个报错只出现了一次，再次运行又没有报错了。 你给他重新设计了一个运动控制节点，但是调不准它的一些特定参数。如果在真实环境中直接运行可能会出现意想不到的情况。 你在某一次运动导航实验中意外的获得了一条导航路径，希望有什么工具把它保存下来，以便之...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-24T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-018-ROS2工具：启动文件 launch 的XML/YAML实现</title>
    <id>/learningNote/Ros2_Note/launch_rosbag2/2026_01_22.html</id>
    <link href="/learningNote/Ros2_Note/launch_rosbag2/2026_01_22.html"/>
    <updated>2026-01-22T10:32:15.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>有关 launch 文件的介绍，可以参考</p>
<p>除非你希望<strong>仅</strong>使用 <code>C++</code> 进行编写，否则由于 <code>XML</code> &amp; <code>YAML</code> 语言自身<strong>并无事件触发函数</strong>能进行适配，我个人并不推荐使用 <code>XML</code>/<code>YAML</code> 语言作为编写 launch 的首要语言（虽然他编写起来确实较为简便 = =）。若有实际需要，请结合<a href="https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Creating-Launch-Files.html" target="_blank" rel="noopener noreferrer">官方文档</a>进行代码的书写。</p>]]></summary>
    <content type="html"><![CDATA[简介 有关 launch 文件的介绍，可以参考 除非你希望仅使用 C++ 进行编写，否则由于 XML & YAML 语言自身并无事件触发函数能进行适配，我个人并不推荐使用 XML/YAML 语言作为编写 launch 的首要语言（虽然他编写起来确实较为简便 = =）。若有实际需要，请结合官方文档进行代码的书写。 因为代码格式相似，在下文中我们会将 XM...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-22T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-017-ROS2工具：启动文件 launch 的 python 实现</title>
    <id>/learningNote/Ros2_Note/launch_rosbag2/2025_04_29.html</id>
    <link href="/learningNote/Ros2_Note/launch_rosbag2/2025_04_29.html"/>
    <updated>2026-01-22T10:31:54.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>有关 launch 文件的介绍，可以参考</p>
<h2>Python 实现语法</h2>
<p>以下介绍在 Python 中 <strong>launch 文件</strong> 的相关语法：</p>
<h3>1. 节点设置-Node</h3>
<p>在 <strong>使用 Python 实现的 launch 文件</strong> 中，被执行的节点需要统一封装为 <code>launch_ros.actions.Node</code> 对象，并通过 <code>LaunchDescription()</code> 函数创建特定包装对象以进行返回。以下将会针对统一封装的 <code>Node</code> 对象内的参数进行说明。</p>]]></summary>
    <content type="html"><![CDATA[简介 有关 launch 文件的介绍，可以参考 Python 实现语法 以下介绍在 Python 中 launch 文件 的相关语法： 1. 节点设置-Node 在 使用 Python 实现的 launch 文件 中，被执行的节点需要统一封装为 launch_ros.actions.Node 对象，并通过 LaunchDescription() 函数创...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-01-21T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-016-ROS2工具：启动文件 launch 的介绍及其简单使用</title>
    <id>/learningNote/Ros2_Note/launch_rosbag2/2025_04_28.html</id>
    <link href="/learningNote/Ros2_Note/launch_rosbag2/2025_04_28.html"/>
    <updated>2026-01-22T10:31:54.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在机器人操作系统中，节点是程序的基本构成单元。一个完整的、系统性的功能模块由多个节点构成，在启动某个功能模块时可能需要依次启动这些节点。</p>
<p>以机器人的导航功能为例，其涉及的节点主要有以下几种：</p>
<ul>
<li>底盘驱动；</li>
<li>雷达驱动；</li>
<li>摄像头驱动；</li>
<li>imu 驱动；</li>
<li>地图服务；</li>
<li>路径规划；</li>
<li>运动控制；</li>
<li>环境感知；</li>
<li>定位；</li>
<li>etc.</li>
</ul>
<p>且不同的节点启动时，可能还会涉及到各种参数的导入、节点间执行逻辑的处理等。</p>]]></summary>
    <content type="html"><![CDATA[简介 在机器人操作系统中，节点是程序的基本构成单元。一个完整的、系统性的功能模块由多个节点构成，在启动某个功能模块时可能需要依次启动这些节点。 以机器人的导航功能为例，其涉及的节点主要有以下几种： 底盘驱动； 雷达驱动； 摄像头驱动； imu 驱动； 地图服务； 路径规划； 运动控制； 环境感知； 定位； etc. 且不同的节点启动时，可能还会涉及到各...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-04-28T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2工具——launch &amp; rosbag2</title>
    <id>/learningNote/Ros2_Note/launch_rosbag2/</id>
    <link href="/learningNote/Ros2_Note/launch_rosbag2/"/>
    <updated>2026-01-27T09:54:13.000Z</updated>
    <summary type="html"><![CDATA[<h2>简述</h2>
<p>这里是我有关 ROS2工具 - <strong>launch</strong> &amp; <strong>rosbag2</strong> 内容的相关笔记，这里所包括的内容有：</p>
<ul>
<li>launch 文件及其实现</li>
<li>rosbag2 工具的介绍与使用（序列化存储数据，实现话题消息的录制与回放）</li>
</ul>
<p>具体软硬件以及技术背景等细节请参考</p>
]]></summary>
    <content type="html"><![CDATA[简述 这里是我有关 ROS2工具 - launch & rosbag2 内容的相关笔记，这里所包括的内容有： launch 文件及其实现 rosbag2 工具的介绍与使用（序列化存储数据，实现话题消息的录制与回放） 具体软硬件以及技术背景等细节请参考]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.068Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-015-通信机制补完：通信机制工具（二）图形化工具（RQt）与总结</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_04_13.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_04_13.html"/>
    <updated>2025-04-13T09:39:55.000Z</updated>
    <summary type="html"><![CDATA[<p>上半部分见</p>
<hr>
<h2>二、图形化工具（RQt）</h2>
<h3>简述</h3>
<p><strong>RQt</strong> 是一个基于 <strong>Qt 框架</strong> 开发的 GUI 框架。它通过应用各种 “以插件形式存在的工具与接口” 实现在单个页面开发、调试与监控机器人系统，其允许用户通过配置插件灵活地与 ROS2 系统进行交互。作为通信机制工具只是其中的一种功能，在这里仅会做一些简要的入门介绍。</p>
<div class="hint-container info">
<p class="hint-container-title">拓展信息 | In case you want to know</p>
<p><strong>Qt 框架</strong> 是1991年由 <em>Qt Company</em> 开发的跨平台 C++ 图形用户界面应用程序开发框架，可构建高性能的桌面、移动及Web应用程序。</p>
<p>如果你希望更加了解其信息，你可以通过其官网进行深入了解与学习。在他官网上有专门针对初学者所设立的 <a href="https://www.qt.io/academy" target="_blank" rel="noopener noreferrer">Qt Academy</a> 可供免费在线学习。</p>
</div>]]></summary>
    <content type="html"><![CDATA[上半部分见 二、图形化工具（RQt） 简述 RQt 是一个基于 Qt 框架 开发的 GUI 框架。它通过应用各种 “以插件形式存在的工具与接口” 实现在单个页面开发、调试与监控机器人系统，其允许用户通过配置插件灵活地与 ROS2 系统进行交互。作为通信机制工具只是其中的一种功能，在这里仅会做一些简要的入门介绍。 拓展信息 | In case you w...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-04-13T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-014-通信机制补完：通信机制工具（一）综述与命令行工具</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_04_12.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_04_12.html"/>
    <updated>2025-04-12T08:07:58.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>上一章内容，我们学习了ROS2中的多种通信机制，了解了不同通信模型的实现流程、相关API以及各自的特点。在实际开发当中，我们可能会遇到一些问题：</p>
<ol>
<li>一个完整的机器人系统启动之后，其组成是比较复杂的，可能包含十几个、几十个甚至上百个节点，不同的节点可能又包含一个或多个通信对象(话题发布方、话题订阅方、服务端、客户端、动作服务端、动作客户端、参数服务端、参数客户端)，通信时还需要使用到各种各样的msg、srv或action接口消息，那么在开发过程中，如何才能方便的获取这些节点、话题、服务、动作、参数以及接口相关的信息呢？</li>
<li>编写通信实现，通信至少涉及到双方，一方编写完毕后，如何验证程序是否可以正常运行呢？</li>
<li>话题通信过程中，发布方程序中设置了消息的发布频率，如何判断实际运行中的发布频率是否和设置的频率一致呢？</li>
<li>......</li>
</ol>]]></summary>
    <content type="html"><![CDATA[简介 上一章内容，我们学习了ROS2中的多种通信机制，了解了不同通信模型的实现流程、相关API以及各自的特点。在实际开发当中，我们可能会遇到一些问题： 一个完整的机器人系统启动之后，其组成是比较复杂的，可能包含十几个、几十个甚至上百个节点，不同的节点可能又包含一个或多个通信对象(话题发布方、话题订阅方、服务端、客户端、动作服务端、动作客户端、参数服务端...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-04-12T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-013-通信机制补完：时间类 API</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_16.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_16.html"/>
    <updated>2025-03-16T07:14:43.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>假设有一个机器人，在机器人上有一个雷达。该雷达有一相关节点会发布雷达探测到的各种信息，且会被机器人内部一导航模块所属节点订阅并接收。为了减少机器人移动过程中由于通信延迟在路径规划上产生相关误差，当二者进行数据交互时，必然需要保证信息的实时性。</p>
<p>因此我们需要使用 <strong>时间类 API</strong>，在传输数据时提供相关数据产生时的时间戳使接收方能够进行相关数据时效性的判断。除此之外，雷达坐标变换或多消息融合等也需要该类 API。</p>
<h2>类型</h2>
<p>时间类 API 一共有以下几种：</p>
<ul>
<li>Rate 类</li>
<li>Time 类</li>
<li>Duration 类</li>
</ul>]]></summary>
    <content type="html"><![CDATA[简介 假设有一个机器人，在机器人上有一个雷达。该雷达有一相关节点会发布雷达探测到的各种信息，且会被机器人内部一导航模块所属节点订阅并接收。为了减少机器人移动过程中由于通信延迟在路径规划上产生相关误差，当二者进行数据交互时，必然需要保证信息的实时性。 因此我们需要使用 时间类 API，在传输数据时提供相关数据产生时的时间戳使接收方能够进行相关数据时效性的...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-16T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-012-通信机制补完：话题重名</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_15.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_15.html"/>
    <updated>2025-03-15T07:21:05.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>咱在之前聊到，那么有话题重名吗？</p>
<p>有的，dude，有的☝🤓</p>
<hr>
<p>与节点重名相同，在 ROS2 中，话题名称也可能重名。在不同的节点之间，通信都依赖于话题，当话题重名时，系统虽然不会抛出异常，但是通过 <strong>相同话题名称</strong> 关联到一起的节点可能 <strong>并不属于</strong> 同一通信逻辑，从而导致通信错乱，甚至出现异常。这种情况下可能就需要将相同的话题名称设置为不同。</p>
<p>不过与节点重名不同的是，有些场景下需要避免话题重名的情况，在有些场景下又需要将不同的话题名称修改为相同以实现某些功能。因此话题重名在某些情况下是被 <strong>允许</strong> 的。</p>]]></summary>
    <content type="html"><![CDATA[简介 咱在之前聊到，那么有话题重名吗？ 有的，dude，有的☝🤓 与节点重名相同，在 ROS2 中，话题名称也可能重名。在不同的节点之间，通信都依赖于话题，当话题重名时，系统虽然不会抛出异常，但是通过 相同话题名称 关联到一起的节点可能 并不属于 同一通信逻辑，从而导致通信错乱，甚至出现异常。这种情况下可能就需要将相同的话题名称设置为不同。 不过与节...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-15T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-011-通信机制补完：节点重名</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_14.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_14.html"/>
    <updated>2025-03-14T06:52:24.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在 ROS2 中，不同的节点可以有相同的节点名称，比如你可以启动多个节点的名称都是 turtlesim 的 turtlesim_node 节点。</p>
<p>虽然节点重名是被 <strong>允许</strong> 的，但是开发者应该 <strong>主动避免</strong> 这种情况，因为节点重名可能会导致操作上的混淆。</p>
<p>仍以启动了多个 turtlesim_node 节点为例，当使用 <strong>计算图（rqt_graph）</strong> 查看节点运行状态时，由于这些节点的名称一致，它们在计算图上会被显示为同一个节点，而实际上是有多个节点。并且节点名称也会和话题名称、服务名称、动作名称、参数等多种变量产生关联，届时也可能会导致通信逻辑上的混乱。</p>]]></summary>
    <content type="html"><![CDATA[简介 在 ROS2 中，不同的节点可以有相同的节点名称，比如你可以启动多个节点的名称都是 turtlesim 的 turtlesim_node 节点。 虽然节点重名是被 允许 的，但是开发者应该 主动避免 这种情况，因为节点重名可能会导致操作上的混淆。 仍以启动了多个 turtlesim_node 节点为例，当使用 计算图（rqt_graph） 查看节...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-14T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-010-通信机制补完：功能包重名和工作空间覆盖机制</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_13.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_13.html"/>
    <updated>2025-03-13T03:44:02.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在 ROS2 中编写功能包时，一般会在单个空间内进行编写与编译。但是当程序员需要经由多个工作空间进行不同的功能包的编写式，很可能会出现在不同的工作空间下将不同的功能包命名为同一个名字的情况。例如在 工作空间A 和 工作空间B 中都创建了一个名字叫 “C” 的功能包，假设该功能包里都有一个 “C_node” 节点，那么当我们新建终端并直接执行</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ros2</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> C</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> C_node</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[简介 在 ROS2 中编写功能包时，一般会在单个空间内进行编写与编译。但是当程序员需要经由多个工作空间进行不同的功能包的编写式，很可能会出现在不同的工作空间下将不同的功能包命名为同一个名字的情况。例如在 工作空间A 和 工作空间B 中都创建了一个名字叫 “C” 的功能包，假设该功能包里都有一个 “C_node” 节点，那么当我们新建终端并直接执行 时，...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-13T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-009-通信机制补完：元功能包 MetaPackage</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_12.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_12.html"/>
    <updated>2025-03-12T07:48:27.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在 ROS2 中编写一个大的模块时，一般需要依照不同的功能分成多个子包。例如对于一个机器人导航模块，该模块可能被分为定位、路径规划、离线地图等多个子包进行分别编写。那么当我们需要安装该模块时，需要一个个安装这些子包才可以应用全部功能吗？</p>
<h2>元功能包(MetaPackage)</h2>
<p>在 ROS2 中，其提供了一种可以将多个不同的功能子包打包成一个大的功能包的方式，当我们需要安装某个功能模块时，只需要直接调用安装这个大的功能包即可。该包又被称为 <strong>元功能包</strong> ，即 <strong>MetaPackage</strong>。</p>]]></summary>
    <content type="html"><![CDATA[简介 在 ROS2 中编写一个大的模块时，一般需要依照不同的功能分成多个子包。例如对于一个机器人导航模块，该模块可能被分为定位、路径规划、离线地图等多个子包进行分别编写。那么当我们需要安装该模块时，需要一个个安装这些子包才可以应用全部功能吗？ 元功能包(MetaPackage) 在 ROS2 中，其提供了一种可以将多个不同的功能子包打包成一个大的功能包...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-12T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2通信机制02-补充内容</title>
    <id>/learningNote/Ros2_Note/co_me_2/</id>
    <link href="/learningNote/Ros2_Note/co_me_2/"/>
    <updated>2025-04-16T06:27:29.000Z</updated>
    <summary type="html"><![CDATA[<h2>简述</h2>
<p>这里是我有关ROS2通信机制补充内容的相关笔记，这里的内容比起而言知识密度比较松散，包括的内容有：</p>
<ul>
<li>分布式框架的搭建（实现不同的 ROS2 设备间通信）</li>
<li>重名问题的处理（自定义功能包、节点、节点内话题重名的处理）</li>
<li>常用 API （定时器等时间类 API）</li>
<li>通信机制工具 （相关指令的进一步说明以及 rqt 工具箱等）</li>
</ul>
<p>具体软硬件以及技术背景等细节请参考</p>
]]></summary>
    <content type="html"><![CDATA[简述 这里是我有关ROS2通信机制补充内容的相关笔记，这里的内容比起而言知识密度比较松散，包括的内容有： 分布式框架的搭建（实现不同的 ROS2 设备间通信） 重名问题的处理（自定义功能包、节点、节点内话题重名的处理） 常用 API （定时器等时间类 API） 通信机制工具 （相关指令的进一步说明以及 rqt 工具箱等） 具体软硬件以及技术背景等细节请参考]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.118Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-008-通信机制补完：分布式通信和 ROS_DOMAIN_ID</title>
    <id>/learningNote/Ros2_Note/co_me_2/2025_03_11.html</id>
    <link href="/learningNote/Ros2_Note/co_me_2/2025_03_11.html"/>
    <updated>2025-03-11T07:29:06.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在之前的中，我们系统地学习了四种通信机制。这四种通信机制在当时的应用场景都为单个ROS设备内相关节点、话题之间的相互沟通。那么当我们涉及到多台 ROS2 设备之间的相互通信时，我们应该如何实现？</p>
<h2>分布式通信</h2>
<p>分布式通信就是这样一种 <strong>通过网络</strong> 在不同主机之间实现 <strong>数据交互</strong> 的通信策略。</p>
<p>首先我们应该了解， ROS2 本身就是一个分布式通信框架，它可以通过中间件很方便的实现不同设备之间的通信。</p>
<p>ROS2 所基于的中间件为<strong>数据分发服务（Data Distribution Service, 简称DDS）</strong>，当多台 ROS2 设备处于同一网络时，通过 DDS 的 <strong>域ID机制(ROS_DOMAIN_ID)</strong> 便可以实现分布式通信。其大致流程为：</p>]]></summary>
    <content type="html"><![CDATA[简介 在之前的中，我们系统地学习了四种通信机制。这四种通信机制在当时的应用场景都为单个ROS设备内相关节点、话题之间的相互沟通。那么当我们涉及到多台 ROS2 设备之间的相互通信时，我们应该如何实现？ 分布式通信 分布式通信就是这样一种 通过网络 在不同主机之间实现 数据交互 的通信策略。 首先我们应该了解， ROS2 本身就是一个分布式通信框架，它可...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-11T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2通信机制01-核心内容</title>
    <id>/learningNote/Ros2_Note/co_me/</id>
    <link href="/learningNote/Ros2_Note/co_me/"/>
    <updated>2025-04-16T06:27:29.000Z</updated>
    <summary type="html"><![CDATA[<h2>简述</h2>
<p>这里是有关ROS2通信机制核心内容的相关笔记,其包括了ROS2内常用的四种通信方式：</p>
<ul>
<li>Topics (话题通信)</li>
<li>Services (服务通信)</li>
<li>Actions (动作通信)</li>
<li>Parameters (参数服务)</li>
</ul>
<p>具体软硬件以及技术背景等细节请参考</p>
]]></summary>
    <content type="html"><![CDATA[简述 这里是有关ROS2通信机制核心内容的相关笔记,其包括了ROS2内常用的四种通信方式： Topics (话题通信) Services (服务通信) Actions (动作通信) Parameters (参数服务) 具体软硬件以及技术背景等细节请参考]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.121Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-007-通信机制：参数服务-分支贰：Python实现</title>
    <id>/learningNote/Ros2_Note/co_me/2025_03_07.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2025_03_07.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>动作通信的Python实现</h2>
<p>现在，我们通过针对以下案例需求进行 Python 的实现，以更加深入了解参数服务。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：有两个节点，请编写参数服务，在参数服务端（节点A）中设置一些参数，使参数客户端（节点B）可以通过访问参数服务端（节点A）对这些参数实现查看与修改，并且参数服务端（节点A）自身可以对此进行增删改查。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>参数服务端；</li>
<li>参数客户端；</li>
<li>参数本身。</li>
</ol>
<h3>流程简介</h3>]]></summary>
    <content type="html"><![CDATA[动作通信的Python实现 现在，我们通过针对以下案例需求进行 Python 的实现，以更加深入了解参数服务。 案例需求&案例分析 需求：有两个节点，请编写参数服务，在参数服务端（节点A）中设置一些参数，使参数客户端（节点B）可以通过访问参数服务端（节点A）对这些参数实现查看与修改，并且参数服务端（节点A）自身可以对此进行增删改查。 分析：在上述需求中...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-07T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-007-通信机制：参数服务-分支壹：C++实现</title>
    <id>/learningNote/Ros2_Note/co_me/2025_03_06.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2025_03_06.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>现在，我们通过针对以下案例需求进行 C++ 的实现，以更加深入了解参数服务。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：有两个节点，请编写参数服务，在参数服务端（节点A）中设置一些参数，使参数客户端（节点B）可以通过访问参数服务端（节点A）对这些参数实现查看与修改，并且参数服务端（节点A）自身可以对此进行增删改查。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>参数服务端；</li>
<li>参数客户端；</li>
<li>参数本身。</li>
</ol>
<h3>流程简介</h3>
<p>案例实现前需要先了解ROS2中参数的相关API，无论是客户端还是服务端都会使用到参数，而参数服务案例实现主要步骤如下：</p>]]></summary>
    <content type="html"><![CDATA[简介 现在，我们通过针对以下案例需求进行 C++ 的实现，以更加深入了解参数服务。 案例需求&案例分析 需求：有两个节点，请编写参数服务，在参数服务端（节点A）中设置一些参数，使参数客户端（节点B）可以通过访问参数服务端（节点A）对这些参数实现查看与修改，并且参数服务端（节点A）自身可以对此进行增删改查。 分析：在上述需求中，我们需要关注以下三个要素：...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-03-06T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-007-通信机制：参数服务</title>
    <id>/learningNote/Ros2_Note/co_me/2024_11_27.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_11_27.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>参数（Parameters）</strong> 是 ROS2 中用于节点<strong>运行时动态配置</strong>的键值对（Key-Value）存储机制。参数并不需要中心化的仓库用于存储信息，其直接被归属于节点本身。参数允许通过服务接口在该节点运行期间读写其内部相关配置，而无需修改代码或重启该节点。与话题通信（Topics）和服务通信（Services）不同，参数的交互本质是 <strong>对节点内部状态的访问与控制</strong>，而非单纯的节点间数据流通。</p>
<p>具体而言：</p>
<ul>
<li>参数直接存储在<strong>节点内部</strong>，每个节点维护独立的参数列表，通过命名空间（例如 <code>/control_node/max_speed</code>）进行隔离。</li>
<li>参数通过 ROS2 内置的<strong>参数服务接口</strong>（如 <code>/get_parameters</code> 和 <code>/set_parameters</code> 等）访问，其访问逻辑底层依赖于 ROS2 服务通信（Services）机制。</li>
<li>同一节点内的参数可被多个外部对象（如 CLI 工具、其他节点、RQT 界面等）同时访问，形成 <strong>单服务端（节点）对 多客户端</strong> 的交互模式。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[简介 参数（Parameters） 是 ROS2 中用于节点运行时动态配置的键值对（Key-Value）存储机制。参数并不需要中心化的仓库用于存储信息，其直接被归属于节点本身。参数允许通过服务接口在该节点运行期间读写其内部相关配置，而无需修改代码或重启该节点。与话题通信（Topics）和服务通信（Services）不同，参数的交互本质是 对节点内部状态...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2025-02-28T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-006-通信机制：动作通信-分支贰：Python实现</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_16_002.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_16_002.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>动作通信的Python实现</h2>
<p>现在，我们通过针对以下案例需求进行Python的实现，以更加深入了解动作通信。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：编写动作服务端，动作客户端提交一个整型数据N，动作服务端接收请求数据并累加1-N之间的所有整数，将最终结果返回给动作客户端，且每累加一次都需要计算当前运算进度并反馈给动作客户端。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>动作客户端；</li>
<li>动作服务端；</li>
<li>消息载体。</li>
</ol>
<h3>流程简介</h3>
<p>案例实现前需要自定义动作接口。</p>]]></summary>
    <content type="html"><![CDATA[动作通信的Python实现 现在，我们通过针对以下案例需求进行Python的实现，以更加深入了解动作通信。 案例需求&案例分析 需求：编写动作服务端，动作客户端提交一个整型数据N，动作服务端接收请求数据并累加1-N之间的所有整数，将最终结果返回给动作客户端，且每累加一次都需要计算当前运算进度并反馈给动作客户端。 分析：在上述需求中，我们需要关注以下三个...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-11-16T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-006-通信机制：动作通信-分支壹：C++实现</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_16.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_16.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>现在，我们通过针对以下案例需求进行C++的实现，以更加深入了解动作通信。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：编写动作通信，动作客户端提交一个整型数据N，动作服务端接收请求数据并累加1-N之间的所有整数，将最终结果返回给动作客户端，且每累加一次都需要计算当前运算进度并反馈给动作客户端。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>动作客户端；</li>
<li>动作服务端；</li>
<li>消息载体。</li>
</ol>
<h3>流程简介</h3>
<p>案例实现前需要自定义动作接口。</p>]]></summary>
    <content type="html"><![CDATA[简介 现在，我们通过针对以下案例需求进行C++的实现，以更加深入了解动作通信。 案例需求&案例分析 需求：编写动作通信，动作客户端提交一个整型数据N，动作服务端接收请求数据并累加1-N之间的所有整数，将最终结果返回给动作客户端，且每累加一次都需要计算当前运算进度并反馈给动作客户端。 分析：在上述需求中，我们需要关注以下三个要素： 动作客户端； 动作服务...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-16T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-006-通信机制：动作通信</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_15.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_15.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>动作通信(Actions)</strong> 同样是一种基于 <code>请求响应</code> 的方式，以实现不同节点之间数据传输的通信模式。其中发送请求数据的对象称为 <strong>客户端</strong>，接受请求并发送数据相应的对象称之为 <strong>服务端</strong>。为了与前文的  相区分，将这里的客户端称为动作客户端，服务端称为动作服务端。</p>
<p>在结构上，动作通信由目标、反馈和结果三个部分组成,因此和 <strong>服务通信</strong> 不同的是，<strong>动作通信</strong> 可以在请求响应过程中获取连续反馈，并且也可以向动作服务端发送任务取消请求。</p>]]></summary>
    <content type="html"><![CDATA[简介 动作通信(Actions) 同样是一种基于 请求响应 的方式，以实现不同节点之间数据传输的通信模式。其中发送请求数据的对象称为 客户端，接受请求并发送数据相应的对象称之为 服务端。为了与前文的 相区分，将这里的客户端称为动作客户端，服务端称为动作服务端。 在结构上，动作通信由目标、反馈和结果三个部分组成,因此和 服务通信 不同的是，动作通信 可以...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-15T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-006-通信机制：动作通信Extra：如何实现自定义动作通信接口消息</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_15_002.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_15_002.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>实现自定义动作接口消息的流程与的流程类似，其主要步骤如下：</p>
<ol>
<li>创建并编写 <code>.action</code> 文件；</li>
<li>编辑配置文件；</li>
<li>编译；</li>
<li>测试。</li>
</ol>
<p>因此，我们现在会在创建的接口功能包 <code>base_interfaces_demo</code> 里，尝试编写一个 <code>.action</code> 文件。该文件中包含请求数据(两个整型字段)与响应数据(一个整型字段)。</p>
<h2>创建并编辑 .action 文件</h2>
<p>在功能包 <code>base_interfaces_demo</code> 下新建 <code>action</code> 文件夹，<code>action</code> 文件夹下新建 <code>Progress.action</code> 文件，文件中输入如下内容：</p>]]></summary>
    <content type="html"><![CDATA[简介 实现自定义动作接口消息的流程与的流程类似，其主要步骤如下： 创建并编写 .action 文件； 编辑配置文件； 编译； 测试。 因此，我们现在会在创建的接口功能包 base_interfaces_demo 里，尝试编写一个 .action 文件。该文件中包含请求数据(两个整型字段)与响应数据(一个整型字段)。 创建并编辑 .action 文件 在...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-15T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">转载：一定能解决ROS系统 rosdep update 超时问题de简单方法</title>
    <id>/learningNote/Ros2_Note/2024_10_11_cpy_001.html</id>
    <link href="/learningNote/Ros2_Note/2024_10_11_cpy_001.html"/>
    <updated>2024-10-11T06:16:49.000Z</updated>
    <summary type="html"><![CDATA[<hr>
<p>版权声明：本文为博主转载文章，遵循 CC 4.0 BY 版权协议。因为自测有用转载至此，以下为原文链接👇</p>
<p>原文链接：<a href="https://blog.csdn.net/weixin_44023934/article/details/121242176" target="_blank" rel="noopener noreferrer">https://blog.csdn.net/weixin_44023934/article/details/121242176</a></p>
<hr>
<h2>rosdep update命令使用</h2>
<p>该方法是可以跳过 sudo rosdep init 初始化命令设置的，前提是<a href="https://blog.csdn.net/weixin_44023934/article/details/127510378" target="_blank" rel="noopener noreferrer">安装ros</a>，rosdep update 是安装一些依赖库，比如在 Cartographer、ORB-SLAM 等算法需要使用到一些依赖库，是必须安装的，如果不是有需要的，只是使用 ros 一般依赖，是不需要 rosdep update 的</p>]]></summary>
    <content type="html"><![CDATA[版权声明：本文为博主转载文章，遵循 CC 4.0 BY 版权协议。因为自测有用转载至此，以下为原文链接👇 原文链接：https://blog.csdn.net/weixin_44023934/article/details/121242176 rosdep update命令使用 该方法是可以跳过 sudo rosdep init 初始化命令设置的，前...]]></content>
    <author>
      <name>不加辣先生</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>不加辣先生</name>
    </contributor>
    <published>2026-04-13T16:19:23.205Z</published>
    <rights>Copyright by 不加辣先生</rights>
  </entry>
  <entry>
    <title type="text">ROS2-005-通信机制：服务通信-分支贰：Python实现</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_03_004.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_03_004.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>服务通信的Python实现</h2>
<p>现在，我们通过针对以下案例需求进行Python的实现，以更加深入了解服务通信。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：编写服务通信，客户端可以提交两个整数到服务端，服务端接收请求并解析两个整数求和，然后将结果响应回客户端。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>客户端；</li>
<li>服务端；</li>
<li>消息载体。</li>
</ol>
<h3>流程简介</h3>
<p>案例实现前需要自定义服务接口。</p>
<p>在接口准备完毕后，服务通信实现的主要步骤如下：</p>]]></summary>
    <content type="html"><![CDATA[服务通信的Python实现 现在，我们通过针对以下案例需求进行Python的实现，以更加深入了解服务通信。 案例需求&案例分析 需求：编写服务通信，客户端可以提交两个整数到服务端，服务端接收请求并解析两个整数求和，然后将结果响应回客户端。 分析：在上述需求中，我们需要关注以下三个要素： 客户端； 服务端； 消息载体。 流程简介 案例实现前需要自定义服务...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-09T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-005-通信机制：服务通信-分支壹：C++实现</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_03_003.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_03_003.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>现在，我们通过针对以下案例需求进行C++的实现，以更加深入了解服务通信。</p>
<h3>案例需求&amp;案例分析</h3>
<p>需求：编写服务通信，客户端可以提交两个整数到服务端，服务端接收请求并解析两个整数求和，然后将结果响应回客户端。</p>
<p>分析：在上述需求中，我们需要关注以下三个要素：</p>
<ol>
<li>客户端；</li>
<li>服务端；</li>
<li>消息载体。</li>
</ol>
<h3>流程简介</h3>
<p>案例实现前需要自定义服务接口。</p>
<p>在接口准备完毕后，服务通信实现的主要步骤如下：</p>
<ol>
<li>编写服务端实现；</li>
<li>编写客户端实现；</li>
<li>编辑配置文件；</li>
<li>编译；</li>
<li>执行。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[简介 现在，我们通过针对以下案例需求进行C++的实现，以更加深入了解服务通信。 案例需求&案例分析 需求：编写服务通信，客户端可以提交两个整数到服务端，服务端接收请求并解析两个整数求和，然后将结果响应回客户端。 分析：在上述需求中，我们需要关注以下三个要素： 客户端； 服务端； 消息载体。 流程简介 案例实现前需要自定义服务接口。 在接口准备完毕后，服...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-07T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-005-通信机制：服务通信</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_03.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_03.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>服务通信(Services)<strong>是一种基于 <code>请求响应</code> 的方式实现不同节点之间数据传输的通信模模式。发送请求数据的对象称为</strong>客户端</strong>，接受请求并发送数据相应的对象称之为<strong>服务端</strong>，与话题通信一样，客户端和服务端也通过话题(Topic)相关联，但是客户端和服务端可以互相进行数据传输交互。因此在服务通信中，消息的流向是双向的。</p>
<p></p>
<p>在<strong>服务通信</strong>中，服务端与客户端是一种一对多的关系。也就是说，在同一服务话题下，可以存在多个客户端，但只能存在一个服务端。每个客户端都可以向服务端发送请求，也即与该单个服务端之间建立独立的相互通信。</p>]]></summary>
    <content type="html"><![CDATA[简介 服务通信(Services)是一种基于 请求响应 的方式实现不同节点之间数据传输的通信模模式。发送请求数据的对象称为客户端，接受请求并发送数据相应的对象称之为服务端，与话题通信一样，客户端和服务端也通过话题(Topic)相关联，但是客户端和服务端可以互相进行数据传输交互。因此在服务通信中，消息的流向是双向的。 单对单发布/服务通信节点 在服务通信...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-03T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-005-通信机制：服务通信Extra：如何实现自定义服务通信接口消息</title>
    <id>/learningNote/Ros2_Note/co_me/2024_10_03_002.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_10_03_002.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>实现自定义服务接口消息的流程与的流程类似，其主要步骤如下：</p>
<ol>
<li>创建并编写 <code>.srv</code> 文件；</li>
<li>编辑配置文件；</li>
<li>编译；</li>
<li>测试。</li>
</ol>
<p>因此，我们现在会在创建的接口功能包 <code>base_interfaces_demo</code> 里，尝试编写一个 <code>.srv</code> 文件。该文件中包含请求数据(两个整型字段)与响应数据(一个整型字段)。</p>
<h2>创建并编辑 .srv 文件</h2>
<p>在功能包 <code>base_interfaces_demo</code> 下新建 <code>srv</code> 文件夹，<code>srv</code> 文件夹下新建 <code>AddInts.srv</code> 文件，文件中输入如下内容：</p>]]></summary>
    <content type="html"><![CDATA[简介 实现自定义服务接口消息的流程与的流程类似，其主要步骤如下： 创建并编写 .srv 文件； 编辑配置文件； 编译； 测试。 因此，我们现在会在创建的接口功能包 base_interfaces_demo 里，尝试编写一个 .srv 文件。该文件中包含请求数据(两个整型字段)与响应数据(一个整型字段)。 创建并编辑 .srv 文件 在功能包 base_...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-10-03T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-004-通信机制：话题通信Extra：如何实现自定义接口消息</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_25.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_25.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>实现自定义话题接口消息的流程与在功能包中编写可执行程序的流程相似，其主要步骤如下：</p>
<ol>
<li>创建并编写 <code>.msg</code> 文件；</li>
<li>编辑配置文件；</li>
<li>编译；</li>
<li>测试。</li>
</ol>
<p>因此，我们现在会在创建的接口功能包 <code>base_interfaces_demo</code> 里，尝试编写一个 <code>.msg</code> 文件。该文件中包含学生的姓名、年龄、身高等字段。</p>
<h2>创建并编辑 .msg 文件</h2>
<p>在功能包 <code>base_interfaces_demo</code> 下新建 <code>msg</code> 文件夹，<code>msg</code> 文件夹下新建 <code>Student.msg</code> 文件，文件中输入如下内容：</p>]]></summary>
    <content type="html"><![CDATA[简介 实现自定义话题接口消息的流程与在功能包中编写可执行程序的流程相似，其主要步骤如下： 创建并编写 .msg 文件； 编辑配置文件； 编译； 测试。 因此，我们现在会在创建的接口功能包 base_interfaces_demo 里，尝试编写一个 .msg 文件。该文件中包含学生的姓名、年龄、身高等字段。 创建并编辑 .msg 文件 在功能包 base...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-25T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-004-通信机制：话题通信-分支贰-自定义消息接口</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_25_002.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_25_002.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>自定义消息接口-话题通信实现</h2>
<p>在案例1中，案例1所发布的消息是一个字符串文本，其消息类型是ROS2的内置消息类型。与使用原生消息接口相比，使用自定义消息接口发布的信息所对应的信息载体并没有被预定义，因此需要我们自己进行配置。</p>
<p>接下来我们将使用 <strong>自定义消息接口</strong> 实现话题通信。如果还没有在Ubuntu中执行准备工作的，可以参考。</p>
<h3>自定义消息接口文件</h3>
<p>具体实现请参考</p>
<h3>C++</h3>
<h4>1. 发布方实现</h4>
<p>功能包 <code>cpp01_topic</code> 的 <code>src</code> 目录下，新建 C++ 文件 <code>demo03_talker_self.cpp</code>，并编辑文件，输入如下内容：</p>]]></summary>
    <content type="html"><![CDATA[自定义消息接口-话题通信实现 在案例1中，案例1所发布的消息是一个字符串文本，其消息类型是ROS2的内置消息类型。与使用原生消息接口相比，使用自定义消息接口发布的信息所对应的信息载体并没有被预定义，因此需要我们自己进行配置。 接下来我们将使用 自定义消息接口 实现话题通信。如果还没有在Ubuntu中执行准备工作的，可以参考。 自定义消息接口文件 具体实...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-25T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">在VSCode中设置自定义代码片段</title>
    <id>/learningNote/coding_skill/2024_09_23.html</id>
    <link href="/learningNote/coding_skill/2024_09_23.html"/>
    <updated>2024-09-23T08:12:47.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>在日常编写代码中，由于多个并行文件的创建，会出现许多代码重复编写的情况。例如创建 <code>.vue</code> 文件时需要分别创建 <code>script</code> 标签、 <code>template</code> 标签，或者在 <code>ROS2</code> 中创建节点文件时无论 <code>C++</code> 文件之间还是 <code>Python</code> 文件之间的代码结构，都出现基本相同的情况等等。</p>
<p>为了减少重复代码的编写，提升代码编写效率，我们可以在 VSCode 中设置自定义代码片段来自动为我们生成相应自定义片段。</p>]]></summary>
    <content type="html"><![CDATA[简介 在日常编写代码中，由于多个并行文件的创建，会出现许多代码重复编写的情况。例如创建 .vue 文件时需要分别创建 script 标签、 template 标签，或者在 ROS2 中创建节点文件时无论 C++ 文件之间还是 Python 文件之间的代码结构，都出现基本相同的情况等等。 为了减少重复代码的编写，提升代码编写效率，我们可以在 VSCode...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="Skill"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.259Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-004-通信机制：话题通信-分支壹-原生消息接口</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_22.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_22.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>原生消息接口-话题通信实现</h2>
<p>接下来我们将使用 <strong>原生消息接口</strong> 实现话题通信。如果还没有在Ubuntu中执行准备工作的，可以参考。</p>
<h3>C++</h3>
<h4>1. 发布方实现</h4>
<p>功能包 <code>cpp01_topic</code> 的 <code>src</code> 目录下，新建 C++ 文件 <code>demo01_talker_str.cpp</code>，并编辑文件，输入如下内容：</p>
<div class="language-cpp line-numbers-mode" data-highlighter="shiki" data-ext="cpp" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-cpp"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/*</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    需求：以某个固定频率发送文本“Hello World!”，且文本后缀编号，每次发送一条信息，编号递增1.</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    步骤：</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        1. 包含头文件；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        2. 初始化 ROS2 客户端</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        3. 自定义节点类：</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            3-1. 创建发布方；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            3-2. 创建定时器；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            3-3. 组织消息并发布。</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        4. 调用spin函数，并传入节点对象指针</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        5. 释放资源。</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> */</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1. 包含头文件；</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#include</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "rclcpp/rclcpp.hpp"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#include</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "std_msgs/msg/string.hpp"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">using</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> namespace</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> std::</span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">chrono_literals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 3. 自定义节点类：</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> MinimalPublisher</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> : </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> rclcpp::</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">Node</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // count_(0) 的作用是将 count_ 初始化为 0</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        MinimalPublisher</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() : </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Node</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"minimalpublisher"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">count_</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 3-1. 创建发布方；</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        /*</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            模板： 被发布的消息类型</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            参数：</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                1. 话题名称；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                2. QOS(消息队列长度)；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            返回值：发布对象指针。</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">         */</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        publisher_ </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-&gt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">create_publisher</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&lt;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">std_msgs::msg::String</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&gt;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 3-2. 创建定时器；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        /*</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            参数：</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                1. 时间间隔；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                2. 回调函数；</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            返回值：定时器对象指针。</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">         */</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        timer_ </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">create_wall_timer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">ms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, stc::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bind</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">MinimalPublisher::timer_callback, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)) </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        } </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    private:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> timer_callback</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            // 3-3. 组织消息并发布。</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> message </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> std_msgs::</span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">msg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">            message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Hello, world!"</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> std::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">to_string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(count_</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">RCLCPP_INFO</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">get_logger</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(), </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"发布的消息： '</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">%s</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">c_str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">            publisher_</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">publish</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(message); </span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        rclcpp::Publisher&lt;stdmsgs::msg::</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;::SharedPtr publisher_;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        rclcpp::TimerBase::SharedPtr timer_;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        size_t</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> count_;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> argc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">char</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">argv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 2. 初始化 ROS2 客户端</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    rclcpp::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">init</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(argc, argv);</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 4. 调用spin函数，并传入节点对象指针。</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    rclcpp::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">spin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">std</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make_shared</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">MinimalPublisher</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;());</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 5.释放资源;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    rclcpp::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">shutdown</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[原生消息接口-话题通信实现 接下来我们将使用 原生消息接口 实现话题通信。如果还没有在Ubuntu中执行准备工作的，可以参考。 C++ 1. 发布方实现 功能包 cpp01_topic 的 src 目录下，新建 C++ 文件 demo01_talker_str.cpp，并编辑文件，输入如下内容： 2. 订阅方实现 功能包 cpp01_topic 的 s...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-22T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-003-通信机制：接口简述与四种通信模型的适用接口文件</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_19.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_19.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介：什么是接口(interfaces)？</h2>
<p>在通信过程中，当节点间需要传输数据时，就必然需要以特定格式传输数据，也就是我们常用的数据载体。在ROS2中，数据载体被称之为<strong>接口(interfaces)</strong>。</p>
<h2>常用的接口文件</h2>
<p>通信时使用的数据载体一般需要使用接口文件定义。常用的接口文件有三种：<code>msg</code> 文件、<code>srv</code> 文件与 <code>action</code> 文件，分别用于对应所述的<strong>话题通信</strong>、<strong>服务通信</strong>和<strong>动作通信</strong>，并且每种文件都需要按照一定格式定义 <em>特定数据类型</em>的 “变量”。</p>]]></summary>
    <content type="html"><![CDATA[简介：什么是接口(interfaces)？ 在通信过程中，当节点间需要传输数据时，就必然需要以特定格式传输数据，也就是我们常用的数据载体。在ROS2中，数据载体被称之为接口(interfaces)。 常用的接口文件 通信时使用的数据载体一般需要使用接口文件定义。常用的接口文件有三种：msg 文件、srv 文件与 action 文件，分别用于对应所述的话...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-19T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-004-通信机制：话题通信</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_19_002.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_19_002.html"/>
    <updated>2025-03-10T10:28:15.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p><strong>话题通信(Topics)<strong>是一种以发布 <code>订阅</code> 的方式实现不同节点之间数据传输的通信模式。数据发布对象称为发布方，数据订阅对象称之为订阅方，发布方和订阅方通过话题(Topic)相关联，发布方将</strong>消息(Message)<strong>发布在话题上，订阅方则从该话题订阅</strong>消息(Message)</strong>。因此在话题通信中，消息的流向总是单向的。</p>
<p></p>
<p>但是在<strong>话题通信</strong>中发布方与订阅方是一种多对多的关系，也就是说，话题通信的同一话题下可以存在多个发布方，也可以存在多个订阅方，这意味着数据会出现交叉传输的情况。</p>]]></summary>
    <content type="html"><![CDATA[简介 话题通信(Topics)是一种以发布 订阅 的方式实现不同节点之间数据传输的通信模式。数据发布对象称为发布方，数据订阅对象称之为订阅方，发布方和订阅方通过话题(Topic)相关联，发布方将消息(Message)发布在话题上，订阅方则从该话题订阅消息(Message)。因此在话题通信中，消息的流向总是单向的。 单组发布/订阅系节点 但是在话题通信中...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-19T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-002-通信机制：节点与话题、四种通信模型的记录与分析</title>
    <id>/learningNote/Ros2_Note/co_me/2024_09_18.html</id>
    <link href="/learningNote/Ros2_Note/co_me/2024_09_18.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<h2>简介</h2>
<p>作为一种高度复杂的系统性实现，在机器人中，一个完整的机器人应用程序一般会由若干功能模块组成，其中每个功能模块可能又包含若干功能点，而不同功能模块、不同功能点之间通常需要频繁的进行数据交互。
比如以导航中的路径规划模块为例：</p>
<ul>
<li>路径规划模块需要其他功能模块将各种数据输入，并输出相应处理后的数据以便被其他模块调用；</li>
<li>输入的数据有地图服务提供的地图数据、定位模块提供的机器人位姿数据、人机交互模块提供的目标点数据等；</li>
<li>而输出的处理后的数据，即路径信息等则会被运动控制订阅或是回显在人机交互界面上。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[简介 作为一种高度复杂的系统性实现，在机器人中，一个完整的机器人应用程序一般会由若干功能模块组成，其中每个功能模块可能又包含若干功能点，而不同功能模块、不同功能点之间通常需要频繁的进行数据交互。 比如以导航中的路径规划模块为例： 路径规划模块需要其他功能模块将各种数据输入，并输出相应处理后的数据以便被其他模块调用； 输入的数据有地图服务提供的地图数据、...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-18T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2学习笔记集</title>
    <id>/learningNote/Ros2_Note/</id>
    <link href="/learningNote/Ros2_Note/"/>
    <updated>2026-01-27T09:54:13.000Z</updated>
    <summary type="html"><![CDATA[<h2>简述</h2>
<p>这里是我有关ROS2的相关笔记，这些笔记内所使用的相关软硬件配置为：</p>
<ul>
<li>ROS2 Jazzy Jalisco LTS</li>
<li>Ubuntu 24.04.3 LTS</li>
<li>Raspberry Pi 5B (4GB)</li>
</ul>
<p>这些笔记大部分参考以下网站和视频教程写成：</p>
<ul>
<li>ROS2-Jazzy官方支持文档: <a href="https://docs.ros.org/en/jazzy/" target="_blank" rel="noopener noreferrer">ROS 2 Documentation — ROS 2 Documentation: Jazzy documentation</a></li>
<li>清华大学出版社出版的《ROS机器人理论与实践》教材的主要作者赵虚左的ROS2网课: <a href="https://space.bilibili.com/1101432368/channel/collectiondetail?sid=700208" target="_blank" rel="noopener noreferrer">猛狮集训营视频合集·ROS2理论与实践核心篇</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[简述 这里是我有关ROS2的相关笔记，这些笔记内所使用的相关软硬件配置为： ROS2 Jazzy Jalisco LTS Ubuntu 24.04.3 LTS Raspberry Pi 5B (4GB) 这些笔记大部分参考以下网站和视频教程写成： ROS2-Jazzy官方支持文档: ROS 2 Documentation — ROS 2 Documen...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.286Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">ROS2-001-初始化与资源释放在程序中起到什么作用？</title>
    <id>/learningNote/Ros2_Note/2024_09_12.html</id>
    <link href="/learningNote/Ros2_Note/2024_09_12.html"/>
    <updated>2025-03-10T09:33:23.000Z</updated>
    <summary type="html"><![CDATA[<p>在ROS2节点中，当我们编写C++或Python程序时，都需要引用“初始化”与“资源释放”两个操作，例如：</p>
<p>在C++中：</p>
<div class="language-c++ line-numbers-mode" data-highlighter="shiki" data-ext="c++" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c++"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#include</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "rclcpp/rclcpp.hpp"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> MyNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> rclcpp::</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">Node</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public:</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        MyNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Node</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"hello_node_cpp"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">){</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">            RCLCPP_INFO</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">get_logger</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(), </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"helloworld"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> argc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">char</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> const</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">argv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    //初始化</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    rclcpp::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">init</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(argc, argv);</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 实例化自定义类</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> node </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> std::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make_shared</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">MyNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;();</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // ......</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 资源释放</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    rclcpp::</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">shutdown</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[在ROS2节点中，当我们编写C++或Python程序时，都需要引用“初始化”与“资源释放”两个操作，例如： 在C++中： 在Python中： 但是这两个操作在编译运行后，并没有任何可视化表现，那么这两个操作起到什么作用呢？ 答案 ROS2构建的程序可能有若干步骤或阶段组成： 初始化 -> 节点对象 -> 日志输出 -> 数据发布 -> 数据订阅 -> ...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="robot"/>
    <category term="ROS"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2024-09-12T00:00:00.000Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">可靠数据的传输原理(RDT/GBN/SR)</title>
    <id>/learningNote/Computer_Network/%E5%8F%AF%E9%9D%A0%E6%95%B0%E6%8D%AE%E7%9A%84%E4%BC%A0%E8%BE%93%E5%8E%9F%E7%90%86.html</id>
    <link href="/learningNote/Computer_Network/%E5%8F%AF%E9%9D%A0%E6%95%B0%E6%8D%AE%E7%9A%84%E4%BC%A0%E8%BE%93%E5%8E%9F%E7%90%86.html"/>
    <updated>2026-01-21T11:26:34.000Z</updated>
    <summary type="html"><![CDATA[<p>这篇博客我们将系统介绍有关在<strong>传输层</strong>中实现可靠数据传输 (Reliable Data Transfer) 的原理, 包括 rdt 的各个系列协议，在 rdt3.0 协议的基础上讨论停等协议与流水线协议的区别，并介绍两种流水线协议：GBN 协议与SR协议。</p>
<h2>从传输层开始</h2>
<p>传输层的主要功能是提供端到端的数据传输服务，例如 TCP 协议提供了可靠的、面向连接的数据传输服务。TCP使用序列号、确认应答、重传等机制来确保数据的可靠传输。因此，从<strong>抽象角度</strong>来看，我们可以将传输层之间的特定通讯视为提供了一种相对可靠的通信机制。</p>]]></summary>
    <content type="html"><![CDATA[这篇博客我们将系统介绍有关在传输层中实现可靠数据传输 (Reliable Data Transfer) 的原理, 包括 rdt 的各个系列协议，在 rdt3.0 协议的基础上讨论停等协议与流水线协议的区别，并介绍两种流水线协议：GBN 协议与SR协议。 从传输层开始 传输层的主要功能是提供端到端的数据传输服务，例如 TCP 协议提供了可靠的、面向连接的...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="Network"/>
    <category term="basic"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.299Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">如何计算UDP校验和</title>
    <id>/learningNote/Computer_Network/UDP%E6%A0%A1%E9%AA%8C%E5%92%8C.html</id>
    <link href="/learningNote/Computer_Network/UDP%E6%A0%A1%E9%AA%8C%E5%92%8C.html"/>
    <updated>2023-11-06T06:39:44.000Z</updated>
    <summary type="html"><![CDATA[<h2>如何构造校验和checksum？</h2>
<p>checksum 的构造方法比较简单，但是计算比较麻烦：将需要发送的 16-bit 二进制源数据两两相加，取从右往左数共十六位数，如果有多的位数就把该位数移到最低位再相加。如此反复将所有需要发送的数据相加完毕后对它作反码，即将这十六位数的1置0，0置1。</p>
<p>具体需要的数据以下列的表格作为例子：</p>
<table>
<tbody>
<tr>
<td colspan="4">发送端IP地址</td>
</tr>
<tr>
<td colspan="4">接收端IP地址</td>
</tr>
<tr>
<td colspan="2">UDP协议对应数(17)</td>
<td colspan="2">UDP网段总长度</td>
</tr>
<tr>
<td colspan="2">UDP源端口号</td>
<td colspan="2">UDP目的端口号</td>
</tr>
<tr>
<td colspan="2">UDP网段总长度</td>
<td colspan="2"><strong>校验和数值(在这里设为0)</strong></td>
</tr>
<tr>
<td>数据</td>
<td>数据</td>
<td>数据</td>
<td>数据</td>
</tr>
<tr>
<td>数据</td>
<td>数据</td>
<td>数据</td>
<td>数据</td>
</tr>
<tr>
<td>数据</td>
<td>数据</td>
<td>数据</td>
<td>数据</td>
</tr>
<tr>
<td>数据</td>
<td>数据</td>
<td>数据</td>
<td>数据</td>
</tr>
<tr>
<td colspan="4">......</td>
</tr>
<tr>
<td>数据</td>
<td>数据</td>
<td>数据</td>
<td>(后置位补零，有需要就加，否则不加)</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[如何构造校验和checksum？ checksum 的构造方法比较简单，但是计算比较麻烦：将需要发送的 16-bit 二进制源数据两两相加，取从右往左数共十六位数，如果有多的位数就把该位数移到最低位再相加。如此反复将所有需要发送的数据相加完毕后对它作反码，即将这十六位数的1置0，0置1。 具体需要的数据以下列的表格作为例子： 计算方式类似于下图。在下图...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="Network"/>
    <category term="basic"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.304Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">TCP与UDP与他们之间的关系</title>
    <id>/learningNote/Computer_Network/TCP%E4%B8%8EUDP%E4%B8%8E%E4%BB%96%E4%BB%AC%E7%9A%84%E5%85%B3%E7%B3%BB.html</id>
    <link href="/learningNote/Computer_Network/TCP%E4%B8%8EUDP%E4%B8%8E%E4%BB%96%E4%BB%AC%E7%9A%84%E5%85%B3%E7%B3%BB.html"/>
    <updated>2023-11-06T06:39:44.000Z</updated>
    <summary type="html"><![CDATA[<h2>UDP</h2>
<p>UDP 是一种简洁、轻量级的传输协议，只提供最基本的通讯服务。UDP 定义于 [RFC 768]，其功能与传输协议差不多。除了多路复用/解复用功能和一些轻微的错误检查功能外，它没有为 IP 增加任何功能。也就是说，如果一个应用程序开发人员选择 UDP 而不是 TCP 作为传输协议的话，那么该应用程序几乎可以被认为是在直接与 IP 对话而没有任何其他的包装。</p>
<p>UDP 是无连接的，因此在两个进程开始通信之前不需要提前握手。因此，当应用程序通过 UDP 而不是 TCP 运行时，专用于这些特定应用程序的服务器通常可以支持更多的在线客户端。</p>
<p>UDP 提供的是一种不可靠的数据传输服务，也就是说：</p>]]></summary>
    <content type="html"><![CDATA[UDP UDP 是一种简洁、轻量级的传输协议，只提供最基本的通讯服务。UDP 定义于 [RFC 768]，其功能与传输协议差不多。除了多路复用/解复用功能和一些轻微的错误检查功能外，它没有为 IP 增加任何功能。也就是说，如果一个应用程序开发人员选择 UDP 而不是 TCP 作为传输协议的话，那么该应用程序几乎可以被认为是在直接与 IP 对话而没有任何...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="Network"/>
    <category term="basic"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.304Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
  <entry>
    <title type="text">输入URL回车后发生了什么</title>
    <id>/learningNote/Computer_Network/%E8%BE%93%E5%85%A5URL%E5%9B%9E%E8%BD%A6%E5%90%8E%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88.html</id>
    <link href="/learningNote/Computer_Network/%E8%BE%93%E5%85%A5URL%E5%9B%9E%E8%BD%A6%E5%90%8E%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88.html"/>
    <updated>2023-11-05T09:53:24.000Z</updated>
    <summary type="html"><![CDATA[<p>让我们先来看看题目<sup class="footnote-ref"><a href="#footnote1">[1]</a><a class="footnote-anchor" id="footnote-ref1"></a></sup>：</p>
<p></p>
<p>翻译一下就是：</p>
<p><strong>假设你打开浏览器，并在地址栏中输入 <em><a href="http://yourbusiness.com/about.html" target="_blank" rel="noopener noreferrer">http://yourbusiness.com/about.html</a></em>, 请问从你按下回车开始到在显示网页的过程间会发生什么？请提供所使用协议的详细信息以及所交换信息的高级描述。</strong></p>]]></summary>
    <content type="html"><![CDATA[让我们先来看看题目[1]： A question asking whats_going_on_from_enterURL_to_bowser_display 翻译一下就是： 假设你打开浏览器，并在地址栏中输入 http://yourbusiness.com/about.html, 请问从你按下回车开始到在显示网页的过程间会发生什么？请提供所使用协议的详...]]></content>
    <author>
      <name>xxx</name>
    </author>
    <category term="Computer"/>
    <category term="Network"/>
    <category term="basic"/>
    <contributor>
      <name>xxx</name>
    </contributor>
    <published>2026-04-13T16:19:23.305Z</published>
    <rights>Copyright by xxx</rights>
  </entry>
</feed>