فهرست منبع

[feat]:终于完成第一章

鱼香ROS 3 سال پیش
والد
کامیت
f272644249

+ 1 - 1
docs/README.md

@@ -65,7 +65,7 @@ ROS2强大之处在于其生态系统,基于ROS2的软件库和工具集,针
 
 教程分为基础篇、机器人学篇、建模仿真篇、Nav2导航篇、ROS2控制篇、实体机器人篇、Moveit2机械臂篇。
 
-### 4.1 基础
+### 4.1 ROS2入门
 
 基础篇主要对ROS2的软件库和工具集进行介绍,通过基础篇的学习,你可以掌握ROS2常用工具使用,并可以通过C++或Python调用ROS2的API进行通信。
 

+ 305 - 301
docs/_sidebar.md

@@ -1,4 +1,4 @@
-- [**ROS2代码模板**](humble/codebook/README.md)
+- [代码模板](humble/codebook/README.md)
   - rclcpp
     -  [节点](humble/codebook/rclcpp/nodes.md) 
     -  [参数](humble/codebook/rclcpp/parameters.md) 
@@ -6,333 +6,337 @@
     -  [时间](humble/codebook/rclcpp/time.md) 
     -  [点云PCL](humble/codebook/rclcpp/pcl.md) 
     -  [解决方案](humble/codebook/rclcpp/workarounds.md) 
-
   - rclpy
     -  [节点](humble/codebook/rclpy/nodes.md) 
     -  [参数](humble/codebook/rclpy/parameters.md) 
     -  [tf2](humble/codebook/rclpy/tf2.md) 
     -  [时间](humble/codebook/rclpy/time.md) 
-
   - 其他相关
     -  [CMake](humble/codebook/pages/cmake.md) 
     -  [Colcon](humble/codebook/pages/colcon.md) 
     -  [Launch](humble/codebook/pages/launch.md) 
     -  [网络通讯](humble/codebook/pages/networking.md) 
     -  [功能包](humble/codebook/pages/packages.md) 
-- 第 1 章 ROS2介绍与安装 
-  - [章节导读](humble/chapt1/章节导读.md) 
-  - 基础篇-Linux基础
-    -  [1.Linux与Ubuntu系统介绍](humble/chapt1/basic/1.Linux与Ubuntu系统介绍.md) 
-    -  [2.在虚拟机中安装Ubuntu](humble/chapt1/basic/2.在虚拟机中安装Ubuntu.md) 
-    -  [3.玩转Ubuntu之常用指令](humble/chapt1/basic/3.玩转Ubuntu之常用指令.md) 
-    -  [4.玩转Ubuntu之编程工具](humble/chapt1/basic/4.玩转Ubuntu之编程工具.md) 
-    -  [5.玩转Ubuntu之常用软件](humble/chapt1/basic/5.玩转Ubuntu之常用软件.md) 
-  - [入门篇-ROS2介绍安装]()
-    -  [1.ROS与ROS2对比](humble/chapt1/get_started/2.ROS与ROS2对比.md) 
-    -  [2.ROS与ROS2对比](humble/chapt1/get_started/2.ROS与ROS2对比.md) 
-    -  [3.动手安装ROS2](humble/chapt1/get_started/3.动手安装ROS2.md) 
-    -  [4.ROS2初体验](humble/chapt1/get_started/4.ROS2初体验.md) 
-  - [进阶篇-架构与中间件]()
-    -  [1.ROS2系统架构](humble/chapt1/advanced/1.ROS2系统架构.md) 
-    -  [2.中间件DDS架构](humble/chapt1/advanced/2.中间件DDS架构.md) 
-
-- 第 2 章 ROS2第一个节点
-  - 章节导读
-  - [基础篇-编程基础]()
-    - C++编译工具之CMake
-    - Python打包工具之Setup
-    - CMake依赖查找流程
-    - Python依赖查找流程
-  - [入门篇-动手使用ROS2]()
-    - ROS2节点与工作空间
-    - ROS2编译器之Colcon
-    - ROS2客户端库知多少
-    - 使用RCLCPP编写节点
-    - 使用RCLPY编写节点
-  - [进阶篇-ROS2系统]()
-    - 五种不同的方式编写节点
-    - 生命周期节点介绍
-    - ROS2节点发现机制原理
-    - Colcon编译原理
-    - ROS2包运行原理
-    - ROS2客户端库源码导读
-- 第 3 章 ROS2通信之话题与服务
-  - 章节导读
-  - [基础篇-中间件与面向对象基础]()
-    - 常见通信方式与原理
-    - 通信中间件之DDS与ZMQ
-    - 多线程回调函数和锁
-    - 面向对象编程知多少
-  - [入门篇-话题与服务]()
-    - ROS2话题入门
-    - 话题之RCLCPP实现
-    - 话题之RCLPY实现
-    - ROS2服务入门
-    - 服务之RCLCPP实现
-    - 服务之RCLPY实现
-    - ROS2接口介绍
-    - 自定义话题接口通信
-    - 自定义服务接口通信
-  - [进阶篇-中间件进阶]()
-    - 原始数据类型与包装类型
-    - 通信质量Qos配置指南
-    - 为什么ROS2选择DDS
-    - DDS进阶之Fast-DDS环境搭建
-    - 使用DDS进行订阅发布
-- 第 4 章 ROS2通信之参数与动作
-  - 章节导读
-  - [基础篇-控制概述]()
-    - 机器人控制概述
-  - [入门篇-参数与动作]()
-    - 参数(Param)介绍
-    - 参数之RCLCPP实现
-    - 参数之RCLPY实现
-    - 动作(Action)介绍
-    - 动作之RCLCPP实现
-    - 动作之RCLPY实现
-    - 自定义动作接口通信
-    - 通信机制对比总结
-  - [进阶篇-原理进阶]()
-    - 参数机制原理
-    - 动作通信原理
-    - ROS2如何兼容多家DDS
-    - 高效的ROS2进程内通信
-    - 使用ZeroMQ进行订阅发布
-- 第 5 章 ROS2常用工具
-  - 章节导读
-  - [基础篇-相关概念]()
-    - QT是什么
-    - 仿真引擎
-    - 常见配置文件格式
-  - [入门篇-常用工具]()
-    - 命令行工具-ROS2CLI
-    - 启动管理工具-Launch
-    - 数据录播工具-rosbag
-    - 数据可视化工具-RVIZ
-    - 常用调试小工具-RQT
-    - 兼容仿真工具-Gazebo
-  - [进阶篇-工具进阶]()
-    - RVIZ2插件开发指南
-    - RQT插件开发指南
-    - 兼容仿真工具-WeBots
-    - 兼容仿真工具-Unity
 
+- (一)​ROS2入门篇
+  - 第 1 章 ROS2介绍与安装
+    - [章节导读](humble/chapt1/章节导读.md) 
+    - 基础篇-Linux基础
+      -  [1.Linux与Ubuntu系统介绍](humble/chapt1/basic/1.Linux与Ubuntu系统介绍.md) 
+      -  [2.在虚拟机中安装Ubuntu](humble/chapt1/basic/2.在虚拟机中安装Ubuntu.md) 
+      -  [3.玩转Ubuntu之常用指令](humble/chapt1/basic/3.玩转Ubuntu之常用指令.md) 
+      -  [4.玩转Ubuntu之编程工具](humble/chapt1/basic/4.玩转Ubuntu之编程工具.md) 
+      -  [5.玩转Ubuntu之常用软件](humble/chapt1/basic/5.玩转Ubuntu之常用软件.md) 
+    - 入门篇-ROS2介绍安装
+      -  [1.ROS与ROS2对比](humble/chapt1/get_started/2.ROS与ROS2对比.md) 
+      -  [2.ROS与ROS2对比](humble/chapt1/get_started/2.ROS与ROS2对比.md) 
+      -  [3.动手安装ROS2](humble/chapt1/get_started/3.动手安装ROS2.md) 
+      -  [4.ROS2初体验](humble/chapt1/get_started/4.ROS2初体验.md) 
+    - 进阶篇-架构与中间件
+      -  [1.ROS2系统架构](humble/chapt1/advanced/1.ROS2系统架构.md) 
+      -  [2.中间件DDS架构](humble/chapt1/advanced/2.中间件DDS架构.md) 
+  - 第 2 章 ROS2第一个节点
+    - 章节导读
+    - 基础篇-编程基础
+      - C++编译工具之CMake
+      - Python打包工具之Setup
+      - CMake依赖查找流程
+      - Python依赖查找流程
+    - 入门篇-动手使用ROS2
+      - ROS2节点与工作空间
+      - ROS2编译器之Colcon
+      - ROS2客户端库知多少
+      - 使用RCLCPP编写节点
+      - 使用RCLPY编写节点
+    - 进阶篇-ROS2系统
+      - 五种不同的方式编写节点
+      - 生命周期节点介绍
+      - ROS2节点发现机制原理
+      - Colcon编译原理
+      - ROS2包运行原理
+      - ROS2客户端库源码导读
+  - 第 3 章 ROS2通信之话题与服务
+    - 章节导读
+    - 基础篇-中间件与面向对象基础
+      - 常见通信方式与原理
+      - 通信中间件之DDS与ZMQ
+      - 多线程回调函数和锁
+      - 面向对象编程知多少
+    - 入门篇-话题与服务
+      - ROS2话题入门
+      - 话题之RCLCPP实现
+      - 话题之RCLPY实现
+      - ROS2服务入门
+      - 服务之RCLCPP实现
+      - 服务之RCLPY实现
+      - ROS2接口介绍
+      - 自定义话题接口通信
+      - 自定义服务接口通信
+    - 进阶篇-中间件进阶
+      - 原始数据类型与包装类型
+      - 通信质量Qos配置指南
+      - 为什么ROS2选择DDS
+      - DDS进阶之Fast-DDS环境搭建
+      - 使用DDS进行订阅发布
+  - 第 4 章 ROS2通信之参数与动作
+    - 章节导读
+    - 基础篇-控制概述
+      - 机器人控制概述
+    - 入门篇-参数与动作
+      - 参数(Param)介绍
+      - 参数之RCLCPP实现
+      - 参数之RCLPY实现
+      - 动作(Action)介绍
+      - 动作之RCLCPP实现
+      - 动作之RCLPY实现
+      - 自定义动作接口通信
+      - 通信机制对比总结
+    - 进阶篇-原理进阶
+      - 参数机制原理
+      - 动作通信原理
+      - ROS2如何兼容多家DDS
+      - 高效的ROS2进程内通信
+      - 使用ZeroMQ进行订阅发布
+  - 第 5 章 ROS2常用工具
+    - 章节导读
+    - 基础篇-相关概念
+      - QT是什么
+      - 仿真引擎
+      - 常见配置文件格式
+    - 入门篇-常用工具
+      - 命令行工具-ROS2CLI
+      - 启动管理工具-Launch
+      - 数据录播工具-rosbag
+      - 数据可视化工具-RVIZ
+      - 常用调试小工具-RQT
+      - 兼容仿真工具-Gazebo
+    - 进阶篇-工具进阶
+      - RVIZ2插件开发指南
+      - RQT插件开发指南
+      - 兼容仿真工具-WeBots
+      - 兼容仿真工具-Unity
 
-- 第 6 章 运动学基础
-  - 章节导读
-  - [基础篇-数学基础]()
-    - 矩阵与矩阵运算
-    - MiniConda与Jupyter介绍安装
-  - [入门篇-机器人运动学]()
-    - 空间坐标描述
-    - 姿态的多种表示
-    - 齐次坐标变换
-    - 两轮差速运动学
-    - 机械臂运动学
-  - [进阶篇-运动学进阶]()
-    - 动力学基础-力与速度
+- (二)机器人学篇
+  - 第 6 章 运动学基础
+    - 章节导读
+    - 基础篇-数学基础
+      - 矩阵与矩阵运算
+      - MiniConda与Jupyter介绍安装
+    - 入门篇-机器人运动学
+      - 空间坐标描述
+      - 姿态的多种表示
+      - 齐次坐标变换
+      - 两轮差速运动学
+      - 机械臂运动学
+    - 进阶篇-运动学进阶
+      - 动力学基础-力与速度
 
-- 第 7 章 ROS2运动学
-  - 章节导读
-  - [基础篇-常用工具]()
-    - MiniConda与Jupyter介绍安装
-  - [入门篇-机器人运动学]()
-    - TF2介绍
-    - 坐标变换发布监听Python实现
-    - 坐标变换发布监听C++实现
-    - 坐标变换可视化
-  - [进阶篇-时间机制]()
-    - ROS2时间机制
+  - 第 7 章 ROS2运动学
+    - 章节导读
+    - 基础篇-常用工具
+      - MiniConda与Jupyter介绍安装
+    - 入门篇-机器人运动学
+      - TF2介绍
+      - 坐标变换发布监听Python实现
+      - 坐标变换发布监听C++实现
+      - 坐标变换可视化
+    - 进阶篇-时间机制
+      - ROS2时间机制
 
 
-- 第 8 章 机器人建模
-  - 章节导读
-  - [基础篇-概念]()
-    - 常见机器人构型
-    - 常见建模软件及工具
-  - [入门篇-机器人建模]()
-    - URDF建模介绍
-    - RVIZ2可视化URDF模型
-    - 创建一个两轮差速模型
-    - 两轮差速可视化及关节控制
-    - 创建一个机械臂模型
-    - 机械臂可视化及关节控制
-  - [进阶篇-其他建模方式]()
-    - Xacro介绍
-    - 使用Xacro简化机器人模型
-    - RVIZ2可视化机器人模型原理
-    - SolidWorks导出URDF
-    - 机械臂建模之DH参数
+- (三)建模仿真篇
+  - 第 8 章 机器人建模
+    - 章节导读
+    - 基础篇-概念
+      - 常见机器人构型
+      - 常见建模软件及工具
+    - 入门篇-机器人建模
+      - URDF建模介绍
+      - RVIZ2可视化URDF模型
+      - 创建一个两轮差速模型
+      - 两轮差速可视化及关节控制
+      - 创建一个机械臂模型
+      - 机械臂可视化及关节控制
+    - 进阶篇-其他建模方式
+      - Xacro介绍
+      - 使用Xacro简化机器人模型
+      - RVIZ2可视化机器人模型原理
+      - SolidWorks导出URDF
+      - 机械臂建模之DH参数
 
-- 第 9 章 机器人仿真
-  - 章节导读
-  - [基础篇-概念]()
-    - 刚体及其动力学参数
-  - [入门篇-机器人仿真]()
-    - 仿真软件Gazebo介绍与安装
-    - 给两轮差速机器人添加物理参数
-    - 在Gazebo加载机器人模型
-    - Gazebo仿真插件之IMU
-    - Gazebo仿真插件之激光雷达
-    - Gazebo仿真插件之两轮差速
-  - [进阶篇]()
-    - Gazebo仿真插件之超声波
-    - Gazebo仿真插件之深度相机
+  - 第 9 章 机器人仿真
+    - 章节导读
+    - 基础篇-概念
+      - 刚体及其动力学参数
+    - 入门篇-机器人仿真
+      - 仿真软件Gazebo介绍与安装
+      - 给两轮差速机器人添加物理参数
+      - 在Gazebo加载机器人模型
+      - Gazebo仿真插件之IMU
+      - Gazebo仿真插件之激光雷达
+      - Gazebo仿真插件之两轮差速
+    - 进阶篇
+      - Gazebo仿真插件之超声波
+      - Gazebo仿真插件之深度相机
 
-- 第 10 章 SLAM建图
-  - 章节导读
-  - [基础篇-图像基础]()
-    - 图像常见格式及存储
-    - 栅格地图介绍
-  - [入门篇-SLAM建图]()
-    - SLAM前世今生
-    - Gazebo仿真环境搭建
-    - Carto介绍及安装
-    - 配置FishBot进行建图
-    - SLAM地图概述
-    - ROS2地图加载与编辑
-  - [进阶篇-Carto与地图处理]()
-    - 使用OPENCV加载地图
-    - 使用纯雷达定位建图
-    - Carto纯定位模式
+- (四)Nav2导航篇
+  - 第 10 章 SLAM建图
+    - 章节导读
+    - 基础篇-图像基础
+      - 图像常见格式及存储
+      - 栅格地图介绍
+    - 入门篇-SLAM建图
+      - SLAM前世今生
+      - Gazebo仿真环境搭建
+      - Carto介绍及安装
+      - 配置FishBot进行建图
+      - SLAM地图概述
+      - ROS2地图加载与编辑
+    - 进阶篇-Carto与地图处理
+      - 使用OPENCV加载地图
+      - 使用纯雷达定位建图
+      - Carto纯定位模式
 
-- 第 11 章 Nav2导航仿真实战
-  - 章节导读
-  - [基础篇-基础知识]()
-    - 行为树是什么
-  - [入门篇-SLAM建图]()
-    - Nav2导航参数介绍
-    - Gazebo仿真环境搭建
-    - Carto介绍及安装
-    - 配置FishBot进行建图
-    - SLAM地图概述
-    - Nav2导航API
-  - [进阶篇-Carto与地图处理]()
-    - 使用OPENCV加载地图
-    - 使用纯雷达定位建图
-    - Carto纯定位模式
+  - 第 11 章 Nav2导航仿真实战
+    - 章节导读
+    - 基础篇-基础知识
+      - 行为树是什么
+    - 入门篇-SLAM建图
+      - Nav2导航参数介绍
+      - Gazebo仿真环境搭建
+      - Carto介绍及安装
+      - 配置FishBot进行建图
+      - SLAM地图概述
+      - Nav2导航API
+    - 进阶篇-Carto与地图处理
+      - 使用OPENCV加载地图
+      - 使用纯雷达定位建图
+      - Carto纯定位模式
 
-- 第 12 章 Nav2进阶实践
-  - 章节导读
-  - [基础篇-路径搜索]()
-    - 搜索之A星算法
-  - [入门篇-自定义Nav2插件]()
-    - Nav2插件介绍
-    - 自定义规划器插件
-    - 自定义代价地图层
-  - [进阶篇-优化配置]()
-    - 使用Carto纯定位替换AMCL
+  - 第 12 章 Nav2进阶实践
+    - 章节导读
+    - 基础篇-路径搜索
+      - 搜索之A星算法
+    - 入门篇-自定义Nav2插件
+      - Nav2插件介绍
+      - 自定义规划器插件
+      - 自定义代价地图层
+    - 进阶篇-优化配置
+      - 使用Carto纯定位替换AMCL
 
-- 第 13 章 ROS2-Control
-  - 章节导读
-  - [基础篇-传感器与执行器]()
-    - 硬件传感器
-    - 机器人执行器
-  - [入门篇-ROS2Control]()
-    - ROS2Control是什么
-    - 控制器及CLI介绍
-    - 机械臂轨迹控制器配置
-    - 两轮差速控制器配置
-  - [进阶篇-架构原理]()
-    - ROS2Control架构剖析
-    - 提高ROS2-Control实时性
+- (五)ROS2控制硬件篇
+  - 第 13 章 ROS2-Control
+    - 章节导读
+    - 基础篇-传感器与执行器
+      - 硬件传感器
+      - 机器人执行器
+    - 入门篇-ROS2Control
+      - ROS2Control是什么
+      - 控制器及CLI介绍
+      - 机械臂轨迹控制器配置
+      - 两轮差速控制器配置
+    - 进阶篇-架构原理
+      - ROS2Control架构剖析
+      - 提高ROS2-Control实时性
 
-- 第 14 章 MicroROS
-  - 章节导读
-  - [基础篇-微处理器]()
-    - MCU微处理器介绍
-    - RTOS系统介绍
-  - [入门篇-MicroROS]()
-    - MicroROS介绍
-  - [进阶篇-原理解析]()
-    - MiCroROS架构原理
+  - 第 14 章 MicroROS
+    - 章节导读
+    - 基础篇-微处理器
+      - MCU微处理器介绍
+      - RTOS系统介绍
+    - 入门篇-MicroROS
+      - MicroROS介绍
+    - 进阶篇-原理解析
+      - MiCroROS架构原理
 
+  - 第 15 章 ROS2控制硬件实战
+    - 章节导读
+    - 基础篇-ESP32开发
+      - 舵机介绍及控制
+      - ESP32开发环境搭建
+      - ESP32第一行代码
+    - 入门篇-ROS2控制硬件实战
+      - ESP32配置MicroROS
+      - ESP32实现订阅发布
+      - ESP32实现舵机控制
+      - 配置ROS2Control实现舵机控制
+    - 进阶篇-实战演练
+      - 通过ROS2控制灯的开关
+      - ROS2-ESP32多舵机驱动
+      - 做一个三自由度机械臂
 
-- 第 15 章 ROS2控制硬件实战
-  - 章节导读
-  - [基础篇-ESP32开发]()
-    - 舵机介绍及控制
-    - ESP32开发环境搭建
-    - ESP32第一行代码
-  - [入门篇-ROS2控制硬件实战]()
-    - ESP32配置MicroROS
-    - ESP32实现订阅发布
-    - ESP32实现舵机控制
-    - 配置ROS2Control实现舵机控制
-  - [进阶篇-实战演练]()
-    - 通过ROS2控制灯的开关
-    - ROS2-ESP32多舵机驱动
-    - 做一个三自由度机械臂
 
-- 第 16 章 实体机器人硬件搭建
-  - 章节导读
-  - [基础篇-硬件基础篇]()
-    - 电机及电机驱动板
-    - IMU模块介绍
-    - 超声波传感器介绍
-  - [入门篇-实体机器人硬件搭建]()
-    - 硬件架构介绍
-    - 硬件选型
-    - 硬件搭建
-  - [进阶篇-进阶实战]()
-    - 使用CRC校验增加数据
+- (六)实体机器人搭建篇
+  - 第 16 章 实体机器人硬件搭建
+    - 章节导读
+    - 基础篇-硬件基础篇
+      - 电机及电机驱动板
+      - IMU模块介绍
+      - 超声波传感器介绍
+    - 入门篇-实体机器人硬件搭建
+      - 硬件架构介绍
+      - 硬件选型
+      - 硬件搭建
+    - 进阶篇-进阶实战
+      - 使用CRC校验增加数据
 
-- 第 17 章 嵌入式控制及通信开发
-  - 章节导读
-  - [基础篇-ESP32开发]()
-    - 电脑是如何控制硬件的
-    - PID理论介绍
-  - [入门篇-嵌入式控制及通信开发]()
-    - 使用ESP32驱动电机
-    - 使用ESP32读取编码器数据
-    - 使用ESP32读取IMU数据
-    - 通信设计(待定)
-    - 上位机SDK开发
-  - [进阶篇-实战演练]()
-    - EKF融合里程计和IMU数据
+  - 第 17 章 嵌入式控制及通信开发
+    - 章节导读
+    - 基础篇-ESP32开发
+      - 电脑是如何控制硬件的
+      - PID理论介绍
+    - 入门篇-嵌入式控制及通信开发
+      - 使用ESP32驱动电机
+      - 使用ESP32读取编码器数据
+      - 使用ESP32读取IMU数据
+      - 通信设计(待定)
+      - 上位机SDK开发
+    - 进阶篇-实战演练
+      - EKF融合里程计和IMU数据
 
-- 第 18 章 上位机建图及导航
-  - 章节导读
-  - [基础篇-ESP32开发]()
-  - [入门篇-上位机建图及导航]()
-    - 真机建图导航指南
-    - 上位机驱动封装
-    - Carto真机建图
-    - Nav2真机导航及配置
-  - [进阶篇-实战演练]()
-    - 使用纯激光进行导航
+  - 第 18 章 上位机建图及导航
+    - 章节导读
+    - 基础篇-ESP32开发
+    - 入门篇-上位机建图及导航
+      - 真机建图导航指南
+      - 上位机驱动封装
+      - Carto真机建图
+      - Nav2真机导航及配置
+    - 进阶篇-实战演练
+      - 使用纯激光进行导航
 
-- 第 19 章 Moveit2仿真
-  - 章节导读
-  - [基础篇-运动学]()
-    - 机械臂正逆运动学
-  - [入门篇-Moveit2仿真]()
-    - Moveit2框架介绍
-    - 通过URDF配置Moveit2
-    - 通过键盘控制机械臂运动
-    - Moveit2-API控制机械臂
-    - 给机械臂添加夹爪控制器
-  - [进阶篇-架构]()
-    - Moveit2架构剖析
+- (七)Moveit2机械臂篇
+  - 第 19 章 Moveit2仿真
+    - 章节导读
+    - 基础篇-运动学
+      - 机械臂正逆运动学
+    - 入门篇-Moveit2仿真
+      - Moveit2框架介绍
+      - 通过URDF配置Moveit2
+      - 通过键盘控制机械臂运动
+      - Moveit2-API控制机械臂
+      - 给机械臂添加夹爪控制器
+    - 进阶篇-架构
+      - Moveit2架构剖析
 
-- 第 20 章 Moveit2进阶
-  - 章节导读
-  - [基础篇-算法]()
-    - 路径搜索之RRT算法
-    - 路径平滑算法
-  - [入门篇-Moveit2进阶]()
-    - 自定义规划器
-    - 自定义运动学求解器
-  - [进阶篇-实战演练]()
-    - 暂定
+  - 第 20 章 Moveit2进阶
+    - 章节导读
+    - 基础篇-算法
+      - 路径搜索之RRT算法
+      - 路径平滑算法
+    - 入门篇-Moveit2进阶
+      - 自定义规划器
+      - 自定义运动学求解器
+    - 进阶篇-实战演练
+      - 暂定
 
-- 第 21 章 Moveit2真机控制
-  - 章节导读
-  - [基础篇-动力学]()
-    - 三次/五次样条插值
-  - [入门篇-Moveit2真机控制]()
-    - 机械臂硬件架构
-    - 自制机械臂控制及ROS2Control配置
-    - 使用Moveit2控制真实机械臂
-  - [进阶篇-实战演练]()
-    - 使用真实机械臂完成抓取
+  - 第 21 章 Moveit2真机控制
+    - 章节导读
+    - 基础篇-动力学
+      - 三次/五次样条插值
+    - 入门篇-Moveit2真机控制
+      - 机械臂硬件架构
+      - 自制机械臂控制及ROS2Control配置
+      - 使用Moveit2控制真实机械臂
+    - 进阶篇-实战演练
+      - 使用真实机械臂完成抓取

+ 89 - 2
docs/humble/chapt1/advanced/1.ROS2系统架构.md

@@ -1,4 +1,92 @@
-**内容还在更新中,请关注公众号鱼香ROS,提前解锁新章节。**
+# 1.ROS2系统架构
+
+本节小鱼主要从ROS2的整个框架上来带你进一步的了解它。
+
+## 1.架构图
+
+![image-20220602204152352](1.ROS2系统架构/imgs/image-20220602204152352.png)
+
+看完架构图小鱼带你一层层的来看。
+
+## 2.操作系统层
+
+操作系统层比较好理解,ROS2本身就是基于Linux、Windows或者macOS系统建立的,驱动计算机硬件、底层网络通信等实现都是交由操作系统来实现的。
+
+## 3.DDS实现层
+
+要想理解这一层就需要你了解DDS是什么? 以及为什么ROS2框架中会有多个DDS的实现。
+
+### 3.1 DDS是什么?
+
+- [一文读懂“数据分发服务DDS”(Data Distribution Service,RTPS,OMG)_DDS数据分发服务的博客-CSDN博客_corba dds](https://blog.csdn.net/DDS_CSIT/article/details/104607476)
+
+DDS,全称 Data Distribution Service (数据分发服务)。是由对象管理组 (OMG) 于 2003 年发布并于 2007 年修订的开分布式系统标准。
+
+通过类似于ROS中的话题发布和订阅形式来进行通信,同时提供了丰富的服务质量管理来保证可靠性、持久性、传输设置等。
+
+### 3.2 DDS实现层用来做什么
+
+DDS实现层其实就是对不同常见的DDS接口进行再次的封装,让其保持统一性,为DDS抽象层提供统一的API。
+
+## 4. 抽象DDS层-RMW
+
+这一层将DDS实现层进一步的封装,使得DDS更容易使用。原因在于DDS需要大量的设置和配置(分区,主题名称,发现模式,消息创建,...),这些设置都是在ROS2的抽象层中完成的。
+
+## 5.ROS2客户端库 RCL
+
+RCL(ROS Client Library)ROS客户端库,其实就是ROS的一种API,提供了对ROS话题、服务、参数、Action等接口。
+
+> #### GUI和CLI
+>
+> - GUI(Graphical User Interface)就是平常我们说的图形用户界面,大家用的Windows是就是可视化的,我们可以通过鼠标点击按钮等图形化交互完成任务。
+> - CLI(Command-Line Interface)就是命令行界面了,我们所用的终端,黑框框就是命令行界面,没有图形化。
+>
+> 很久之前电脑还是没有图形化界面的,所有的交互都是通过命令行实现,就学习机器人而言,命令行操作相对于图形化优势更加明显。
+>
+> #### API是什么
+>
+> 知道了CUI和CLI是根据是否有图形界面划分的,那API又是什么?
+>
+> API( Application Programming Interface)应用程序编程接口。比如你写了一个库,里面有很多函数,如果别人要使用你这个库,但是并不知道每个函数内部是怎么实现的。使用的人需要看你的文档或者注释才知道这个函数的入口参数和返回值或者这个函数是用来做什么的。对于使用者来说来说 ,你的这些函数就是API。(摘自知乎)
+>
+> API在不同语言中的表现形式不同,在C和C++表现为头文件,在Python中表现为Python文件。
+
+
+
+
+### 5.1 ROS2客户端库
+
+ROS的客户端库就是上面所说的RCL,不同的语言对应着不同的rcl,但基本功能都是相同的。
+
+比如Python语言提供了rclpy来操作ROS2的节点话题服务等,而C++则使用rclcpp提供API操作ROS2的节点话题和服务等。
+
+所以后面我们使用Python和C++来编写ROS2节点实现通讯等功能时,我们就会引入rclpy和rclcpp的库。
+![rcl与rmw](1.ROS2系统架构/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+上面这张图时ROS2,API的实现层级,最新下面的是第三方的DDS,rmw(中间件接口)层是对各家DDS的抽象层,基于rmw实现了rclc,有了rclc,我们就可以实现各个语言的库,大家都知道C语言是各个语言的鼻祖(汇编除外)所以基于rclc,ROS2官方实现了rclpy和rclcpp.
+
+
+基于rclpy和rclcpp我们就可以实现上层的应用了,这张ros2的内部api架构图小鱼也算大概说清楚了。
+
+有的同学可能还想着既然基于rclc可以实现多个语言的ROS2的库那rcljava有没有,有的:https://github.com/esteve/ros2_java,还有很多,小用户这里搜集放一下,说不定大家以后会用得到,比如在AndroidAPP上或者在Web上开发可以使用rcljava或rclnodejs。
+
+| 语言              | 地址                                           |
+| ----------------- | ---------------------------------------------- |
+| python-rclpython  | https://github.com/ros2/rclpy                  |
+| c++ - rclcpp      | https://github.com/ros2/rclcpp                 |
+| java-rcljava      | https://github.com/esteve/ros2_java            |
+| rust-rclrust      | https://github.com/ros2-rust/ros2_rust         |
+| node.js-rclnodejs | https://github.com/RobotWebTools/rclnodejs     |
+| go-rclgo          | https://github.com/juaruipav/rclgo             |
+| lua-rcllua        | https://github.com/jbbjarnason/rcllua          |
+| kotlin-rclkin     | https://github.com/ros2java-alfred/ros2_kotlin |
+| swift-rclswift    | https://github.com/atyshka/ros2_swift          |
+| c#-rclcs          | https://github.com/RobotecAI/ros2cs            |
+
+## 6.应用层
+
+应用层就是我们写代码以及ROS2开发的各种常用的机器人相关开发工具所在的层了。后面我们写的所有代码其实都是属于这一层的。
+
+
 
 --------------
 
@@ -7,5 +95,4 @@
 - **微信公众号及交流群:鱼香ROS**
 - **小鱼微信:AiIotRobot**
 - **QQ交流群:139707339**
-
 - 版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划

BIN
docs/humble/chapt1/advanced/1.ROS2系统架构/imgs/image-20220602204152352.png


BIN
docs/humble/chapt1/advanced/1.ROS2系统架构/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png


+ 96 - 1
docs/humble/chapt1/advanced/2.中间件DDS架构.md

@@ -1,4 +1,99 @@
-**内容还在更新中,请关注公众号鱼香ROS,提前解锁新章节。**
+# 2.ROS2中间件DDS架构
+
+本文主要带你了解DDS是什么、ROS2使用DDS所带来的优缺点,以及ROS2为了让DDS在机器人开发上变得简单做了哪些努力。
+
+## 1. 中间件
+
+### 1.1 中间件是什么
+
+**顾名思义**
+
+中间件就是**介于某两个或者多个节点中间的组件**。干嘛用的呢?
+
+就是**提供多个节点中间通信**用的。
+
+官方解释就比较玄乎了:
+
+> 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
+
+小鱼看完表示
+
+![img](2.中间件DDS架构/imgs/v2-e6dbd2aa59c57d6bda2fcb25d83f1a34_b-16541732577251.png)
+
+
+
+### 1.2 ROS中间件VS ROS2中间件
+
+话不多说先上图
+
+![img](2.中间件DDS架构/imgs/v2-471abbce0a08b249637dc603f56dc9cf_b-16541732577252.png)
+
+> ROS/ROS2中间件对比
+>
+> 此图来自论文Exploring the Performance of ROS2,小鱼已经收录到了公众号
+
+#### 1.2.1 ROS1中间件
+
+ROS1的中间件是ROS组织自己基于TCP/UDP机制建立的,为了维护该部分ROS1组织花费了大量的精力,但是依然存在很多问题。
+
+#### 1.2.2 ROS2中间件
+
+ROS2采用了第三方的DDS作为中间件,将DDS服务接口进行了一层抽象,保证了上层应用层调用接口的统一性。
+
+基于DDS的互相发现协议,ROS2终于干掉了ROS1中的Master节点。
+
+## 2. DDS和ROS2架构
+
+ROS2为每家DDS供应商都开发了对应的DDS_Interface即DDS接口层,然后通过DDS Abstract抽象层来统一DDS的API。
+
+![image-20220602210643322](2.中间件DDS架构/imgs/image-20220602210643322.png)
+
+ROS2架构中的DDS部分
+
+![image-20220602210849072](2.中间件DDS架构/imgs/image-20220602210849072.png)
+
+
+
+## 3. DDS 通信模型
+
+DDS的模型是非常容易理解,我们可以定义话题的数据结构(类似于ROS2中的接口类型)。下图中的例子:
+
+- Pos:一个编号id的车子的位置x,y
+
+DDS的参与者(Participant)通过发布和订阅主题数据进行通信。
+
+![图片](2.中间件DDS架构/imgs/640.png)
+
+DDS的应用层通过DDS进行数据订阅发布,DDS通过传输层进行数据的收发。
+
+![image-20220602205852087](2.中间件DDS架构/imgs/image-20220602205852087.png)
+
+## 4. DDS的优势与劣势
+
+### 4.1 优势
+
+- 发布/订阅模型:简单解耦,可以轻松实现系统解耦
+- 性能:在发布/订阅模式中,与请求/回复模式相比,延迟更低,吞吐量更高。
+- 远程参与者的自动发现:此机制是 DDS 的主要功能之一。通信是匿名的、解耦的,开发者不必担心远程参与者的本地化。
+- 丰富的 Qos 参数集,允许调整通信的各个方面:可靠性、持久性、冗余、寿命、传输设置、资源......
+- 实时发布订阅协议 ( RTPS ):该协议几乎可以通过任何传输实现,允许在 UDP、TCP、共享内存和用户传输中使用 DDS,并实现不同 DDS 实现之间的真正互操作性。
+
+### 4.2 劣势
+
+-  API复杂,DDS 的灵活性是以复杂性为代价的。
+-  系统开销相对较大,小鱼实际体会,待数据论证。
+-  社区支持问题,但ROS2近两年来使用DDS后社区表现还是不错的。
+
+
+
+### 5. ROS2使用DDS的几个理由
+
+1. DDS已经应用在军事、潜艇各个领域,稳定性实时性经过实际检验。
+2. 使用DDS需要维护的代码要少得多,可以让ROS2开发人员腾出手专注机器人开发。
+3. DDS有定义好的行为和规范并且有完善的文档。
+4. DDS提供了推荐的用例和软件API,有较好的语言支持。
+
+
 
 --------------
 

BIN
docs/humble/chapt1/advanced/2.中间件DDS架构/imgs/2020093021.png


BIN
docs/humble/chapt1/advanced/2.中间件DDS架构/imgs/640.png


BIN
docs/humble/chapt1/advanced/2.中间件DDS架构/imgs/image-20220602205852087.png


BIN
docs/humble/chapt1/advanced/2.中间件DDS架构/imgs/image-20220602210643322.png


BIN
docs/humble/chapt1/advanced/2.中间件DDS架构/imgs/image-20220602210849072.png


+ 1 - 1
docs/index.html

@@ -14,7 +14,7 @@
 </head>
 <body>
   <nav>
-      <a href="https://fishros.com">首页</a>
+      <a href="https://fishros.com/d2lros2foxy">动手学ROS2-Foxy版</a>
       <a href="https://fishros.com">鱼香ROS</a>
   </nav>
   <div id="app"></div>