你好!我是Jeacson, 一个依然在求知路上的大学生。
在ROS2节点中,当我们编写C++或Python程序时,都需要引用“初始化”与“资源释放”两个操作,例如:
在C++中:
#include "rclcpp/rclcpp.hpp"
class MyNode: public rclcpp::Node{
public:
MyNode():Node("hello_node_cpp"){
RCLCPP_INFO(this->get_logger(), "helloworld");
}
};
int main(int argc, char const *argv[])
{
//初始化
rclcpp::init(argc, argv);
// 实例化自定义类
auto node = std::make_shared<MyNode>();
// ......
// 资源释放
rclcpp::shutdown();
return 0;
}
简述
这里是我有关ROS2的相关笔记,这些笔记内所使用的相关软硬件配置为:
- ROS2 Jazzy Jalisco LTS
- Ubuntu 24.04.1 LTS
- Raspberry Pi 5B (4GB)
这些笔记大部分参考以下网站和视频教程写成:
- ROS2-Jazzy官方支持文档: ROS 2 Documentation — ROS 2 Documentation: Jazzy documentation
- 清华大学出版社出版的《ROS机器人理论与实践》教材的主要作者赵虚左的ROS2网课: 猛狮集训营视频合集·ROS2理论与实践核心篇
这篇博客我们将系统介绍有关在传输层中实现可靠数据传输 (Reliable Data Transfer) 的原理, 包括 rdt 的各个系列协议,在 rdt3.0 协议的基础上讨论停等协议与流水线协议的区别,并介绍两种流水线协议:GBN 协议与SR协议。
从传输层开始
传输层的主要功能是提供端到端的数据传输服务,例如 TCP 协议提供了可靠的、面向连接的数据传输服务。TCP使用序列号、确认应答、重传等机制来确保数据的可靠传输。因此,从抽象角度来看,我们可以将传输层之间的特定通讯视为提供了一种相对可靠的通信机制。
如何构造校验和checksum?
checksum 的构造方法比较简单,但是计算比较麻烦:将需要发送的 16-bit 二进制源数据两两相加,取从右往左数共十六位数,如果有多的位数就把该位数移到最低位再相加。如此反复将所有需要发送的数据相加完毕后对它作反码,即将这十六位数的1置0,0置1。
具体需要的数据以下列的表格作为例子:
发送端IP地址 | |||
接收端IP地址 | |||
UDP协议对应数(17) | UDP网段总长度 | ||
UDP源端口号 | UDP目的端口号 | ||
UDP网段总长度 | 校验和数值(在这里设为0) | ||
数据 | 数据 | 数据 | 数据 |
数据 | 数据 | 数据 | 数据 |
数据 | 数据 | 数据 | 数据 |
数据 | 数据 | 数据 | 数据 |
...... | |||
数据 | 数据 | 数据 | (后置位补零,有需要就加,否则不加) |
UDP
UDP 是一种简洁、轻量级的传输协议,只提供最基本的通讯服务。UDP 定义于 [RFC 768],其功能与传输协议差不多。除了多路复用/解复用功能和一些轻微的错误检查功能外,它没有为 IP 增加任何功能。也就是说,如果一个应用程序开发人员选择 UDP 而不是 TCP 作为传输协议的话,那么该应用程序几乎可以被认为是在直接与 IP 对话而没有任何其他的包装。
UDP 是无连接的,因此在两个进程开始通信之前不需要提前握手。因此,当应用程序通过 UDP 而不是 TCP 运行时,专用于这些特定应用程序的服务器通常可以支持更多的在线客户端。
UDP 提供的是一种不可靠的数据传输服务,也就是说:
翻译一下就是:
假设你打开浏览器,并在地址栏中输入 http://yourbusiness.com/about.html, 请问从你按下回车开始到在显示网页的过程间会发生什么?请提供所使用协议的详细信息以及所交换信息的高级描述。
介绍
SMTP(Simple Mail Transfer Protocol, 简单邮件传输协议) 是一种提供可靠且有效的电子邮件传输的协议,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
基本操作
为了说明 SMTP 的基本操作,让我们来假设一个常见的场景。假设 Alice 想要给 Bob 发送一条简单的 ASCII 消息:
- Alice 调用其电子邮件用户代理,编写邮件,在提供 Bob 的电子邮件地址 (例如[email protected]) 后指示该用户代理发送邮件;
- Alice 的用户代理将信息发送到她的邮件服务器,该信息会被放入邮件服务器的信息队列中;
- 在 Alice 的邮件服务器上运行的 SMTP 客户端会发现被提交到该信息队列中的信息。于是这个 SMTP 客户端在找到收件人 Bob 的邮件地址后,尝试与运行在收件人 Bob 邮件服务器上的 SMTP 服务器建立 TCP 连接;
- 经过一些初始 SMTP 握手后,SMTP 客户端通过 TCP 连接将 Alice 的邮件发送到 Bob 的邮件服务器上;
- Bob 的 SMTP 服务器端接收到该信息后,邮件服务器会将信息放入 Bob 的邮箱;
- 最后当 Bob 调用他的用户代理时,他便可以在任意时间阅读邮件了。
这里存放了一些自动控制原理相关的知识。
S-Z变换表 (Table of s- and z-transforms)
$f(t)$ | $F(s)$ | $f(kT)$ or $f(k)$ | $F(z)$ | name | |
---|---|---|---|---|---|
1 | $\delta (t)$ | $1$ | $\delta(k)$ | 1 | 单位冲激 (unit impulse) |
2 | $\delta (t-t_d)$ | $e^{-t_ds}$ | $\delta (k-n)$ | $z^{-n}$ | 时延单位冲激(delayed unit impluse) |
3 | $u(t) = 1$ | $1 \over s$ | $u(k) = 1$ | ${z} \over {z-1}$ | 单位阶跃(unit step) |
4 | $t$ | $1 \over {s^2}$ | $kT$ | ${zT} \over {(z-1)^2}$ | 斜坡函数(ramp) |
5 | $t^2$ | $2\over{s^3}$ | $(kT)^2$ | ${z(z+1)T^2} \over {(z-1)^3}$ | 抛物线函数(parabola) |
6 | $a^k$ | $z \over {z-a}$ | 几何序列(geometric sequence) | ||
7 | $e^{-at}$ | ${1} \over {s+a}$ | $e^{-akT}$ | ${z} \over {z-e^{-aT}}$ | 自然指数(natural exponential) |
8 | $1-e^{-at}$ | ${1} \over {s(s+a)}$ | $1-e^{-akT}$ | ${(1-e^{-aT})z} \over {(z-1)(z-e^{-aT})}$ | 单位阶跃指数(unit step exponential) |
9 | $te^{-at}$ | ${1} \over {(s+a)^2}$ | $kTe^{-akT}$ | ${Tze^{-aT}} \over {(z-e{-aT})2}$ | |
10 | $ka^{k-1}$ | ${z} \over {(z-a)^2}$ | |||
11 | $ak-bk$ | ${(a-b)z} \over {(z-a)(z-b)}$ | |||
12 | $sin \omega t$ | ${\omega} \over {s2+\omega2}$ | $sin \omega kT$ | ${z sin \omega T}\over{ z^2 - 2zcos\omega T + 1}$ | sine |
13 | $cos \omega t$ | ${s} \over {s2+\omega2}$ | $cos \omega kT$ | ${z(z - cos \omega T)}\over{ z^2 - 2zcos\omega T + 1}$ | cosine |
14 | $e^{-at}sin \omega t$ | ${s} \over {(s+a)2+\omega2}$ | $e^{-akT}sin \omega kT$ | ${ze^{-aT} sin \omega T}\over{ z^2 - 2ze^{-aT}cos\omega T + e^{-2aT}}$ | 自然欠阻尼(natural underdamped) |
15 | ${df}\over{dt}$ | $sF(s) - f(0)$ | (空置) | (空置) | 一阶导($1^{st}$ derivative) |
16 | ${d2f}\over{dt2}$ | $s^2F(s) - sf(0) - \frac{df(0)}{dt}$ | (空置) | (空置) | 二阶导($2^{nd}$ derivative) |
17 | $f(k-n)$ | $z^{-n}F(z)$ | 左移n时位(backward shift of n) | ||
18 | $f(t-t_d)$ | $e^{t_ds}F(s)$ | 时延(time delay) | ||
19 | (空置) | (空置) | $f(k+1)$ | $zF(s) - f(0)$ | 右移1时位(forward shift of one) |
20 | (空置) | (空置) | $f(k+2)$ | $sF(s) - f(0)$ | 右移2时位(forward shift of two) |
21 | $f(0)$ | $\lim\limits_{s\rightarrow\infin}sF(s)$ | $f(0)$ | $\lim\limits_{z\rightarrow\infin}F(z)$ | 初值(initial value) |
22 | $f(\infin)$ | $\lim\limits_{s\rightarrow 0}sF(s)$ | $f(\infin)$ | $\lim\limits_{z\rightarrow 1}(z-1)F(z)$ | 终值(final value) |
简述
一些在markdown-it踩坑后的总结向文章。
一、在 vuepress 中引入 markdown-it 的插件
背景:在书写自动化控制原理相关表格时希望将表格进行合并,但是普通的Markdown并没有针对复杂表格的处理能力。