浏览代码

修改3.4,3.5

fishros 3 年之前
父节点
当前提交
8e6ae73277

+ 3 - 0
docs/.vscode/settings.json

@@ -0,0 +1,3 @@
+{
+    "liveServer.settings.port": 5503
+}

+ 1 - 0
docs/README.md

@@ -120,6 +120,7 @@ ROS2作为第二代机器人操作系统,比ROS更加的强大,有一些在R
 
 
 - ROS2官方文档:http://docs.ros.org/en/foxy/index.html
 - ROS2官方文档:http://docs.ros.org/en/foxy/index.html
 - ROS2教学视频:https://www.bilibili.com/video/BV19U4y1n7CQ
 - ROS2教学视频:https://www.bilibili.com/video/BV19U4y1n7CQ
+- 项目源码地址:https://github.com/fishros/ros2_town
 
 
 
 
 
 

+ 7 - 2
docs/_sidebar.md

@@ -26,12 +26,17 @@
   - [3.2 ROS2工作空间与功能包](chapt3/3.2ROS2工作空间介绍.md)
   - [3.2 ROS2工作空间与功能包](chapt3/3.2ROS2工作空间介绍.md)
   - [3.3 ROS2的编译器Colcon](chapt3/3.3ROS2的编译器Colcon.md)
   - [3.3 ROS2的编译器Colcon](chapt3/3.3ROS2的编译器Colcon.md)
     - [小练习:下载编译-小乌龟求偶大作战](chapt3/3.4小游戏_小乌龟求偶大作战.md) 
     - [小练习:下载编译-小乌龟求偶大作战](chapt3/3.4小游戏_小乌龟求偶大作战.md) 
-  - [3.5 手撸一个节点Python版本](chapt3/3.5手撸一个节点Python版本.md) 
+  - [3.4 手撸一个节点Python版本](chapt3/3.5手撸一个节点Python版本.md) 
     -  [1.创建工作空间和功能包](chapt3/3.5.1创建工作空间和功能包.md) 
     -  [1.创建工作空间和功能包](chapt3/3.5.1创建工作空间和功能包.md) 
     -  [2.使用非OOP方法编写一个节点并测试](chapt3/3.5.2使用非OOP方法编写一个节点并测试.md) 
     -  [2.使用非OOP方法编写一个节点并测试](chapt3/3.5.2使用非OOP方法编写一个节点并测试.md) 
     -  [3.OOP介绍](chapt3/3.5.3OOP介绍.md) 
     -  [3.OOP介绍](chapt3/3.5.3OOP介绍.md) 
     -  [4.使用OOP方法编实现作家李四](chapt3/3.5.4使用OOP方法编实现作家李四.md) 
     -  [4.使用OOP方法编实现作家李四](chapt3/3.5.4使用OOP方法编实现作家李四.md) 
-  - [3.6 手撸一个节点C++版](chapt3/3.6手撸一个节点C++版.md) 
+  - [3.5 手撸一个节点C++版](chapt3/3.6手撸一个节点C++版.md) 
+    - [1.创建一个C++功能包](chapt3/3.6.1创建一个C++功能包.md) 
+    - [2.POP方法编写C++节点并测试](chapt3/3.6.2POP方法编写C++节点并测试.md) 
+    - [3.OOP方式编写一个节点](chapt3/3.6.3OOP方式编写一个节点.md) 
+  - 扩展资料
+    -  [扩展资料1:本章CLI工具总结](chapt3/3.7扩展阅读.md) 
 - 第 4 章 通信机制上(话题与服务)
 - 第 4 章 通信机制上(话题与服务)
   - [章节介绍](chapt4/章节介绍.md) 
   - [章节介绍](chapt4/章节介绍.md) 
   - [4.1 ROS2话题介绍](chapt4/4.1ROS2话题介绍.md) 
   - [4.1 ROS2话题介绍](chapt4/4.1ROS2话题介绍.md) 

+ 1 - 1
docs/chapt3/3.5.1创建工作空间和功能包.md

@@ -1,4 +1,4 @@
-# 3.5.1 创建工作空间和功能包
+# 3.4.1 创建工作空间和功能包
 
 
 节点需要存在于功能包当中、功能包需要存在于工作空间当中。所以我们要想创建节点,就要先创建一个工作空间,再创建功能包。
 节点需要存在于功能包当中、功能包需要存在于工作空间当中。所以我们要想创建节点,就要先创建一个工作空间,再创建功能包。
 
 

+ 8 - 10
docs/chapt3/3.5.2使用非OOP方法编写一个节点并测试.md

@@ -1,8 +1,8 @@
-# 3.5.2 使用非OOP方法编写一个节点
+# 3.4.2 使用非OOP方法编写一个节点
 
 
 创建好了`li.py`,接着我们就可以正式编写代码。大家看到我们的标题是使用非OOP方法编写节点,OOP就是所谓的面向对象编程,如果你不理解也没关系,小鱼下面会跟大家一一讲解。
 创建好了`li.py`,接着我们就可以正式编写代码。大家看到我们的标题是使用非OOP方法编写节点,OOP就是所谓的面向对象编程,如果你不理解也没关系,小鱼下面会跟大家一一讲解。
 
 
-1.开始编写程序
+## 1.开始编写程序
 
 
 打开li4.py,接着我们开始编写代码。跟着小鱼一起边理解输入下面的代码,注释不用输。
 打开li4.py,接着我们开始编写代码。跟着小鱼一起边理解输入下面的代码,注释不用输。
 
 
@@ -13,11 +13,11 @@ from rclpy.node import Node
 
 
 def main(args=None):
 def main(args=None):
     """
     """
-    ros2运行该节点的入口函数
+    ros2运行该节点的入口函数,可配置函数名称
     """
     """
     rclpy.init(args=args) # 初始化rclpy
     rclpy.init(args=args) # 初始化rclpy
-    node = Node("li4")  # 新建一个节点名字叫li4
-    node.get_logger().info("大家好,我是艳娘传奇作者李四!")
+    node = Node("li4")  # 新建一个节点
+    node.get_logger().info("大家好,我是作家li4.")
     rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
     rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
     rclpy.shutdown() # rcl关闭
     rclpy.shutdown() # rcl关闭
 ```
 ```
@@ -39,7 +39,7 @@ def main(args=None):
 
 
 
 
 
 
-## 3.编译运行节点
+## 2.编译运行节点
 
 
 打开vscode终端,进入`town_ws`
 打开vscode终端,进入`town_ws`
 
 
@@ -65,14 +65,12 @@ ros2 run village_li li4_node
 
 
 ![image-20210727134002735](3.5.2使用非OOP方法编写一个节点并测试/imgs/image-20210727134002735.png)
 ![image-20210727134002735](3.5.2使用非OOP方法编写一个节点并测试/imgs/image-20210727134002735.png)
 
 
-## 4.总结
+## 3.总结
 
 
 当节点运行起来后,可以再尝试使用`ros2 node list `指令来查看现有的节点。这个时候你应该能看到:
 当节点运行起来后,可以再尝试使用`ros2 node list `指令来查看现有的节点。这个时候你应该能看到:
 
 
 ![image-20210727135236470](3.5.2使用非OOP方法编写一个节点并测试/imgs/image-20210727135236470.png)
 ![image-20210727135236470](3.5.2使用非OOP方法编写一个节点并测试/imgs/image-20210727135236470.png)
 
 
-这说明你的节点已经运行起来了,并且被其他节点感知到了
+这说明你的节点已经运行起来了。
 
 
 
 
-
-这一节,小鱼带你一起使用Python完成了python节点的编写,成功创建出来一个li4的节点。下一节小鱼带你一起去王家村,来创建单身汉王二,让我们一起加油吧~

+ 1 - 1
docs/chapt3/3.5.3OOP介绍.md

@@ -1,4 +1,4 @@
-# 3.5.2 OOP介绍
+# 3.4.3 OOP介绍
 
 
 除了使用上节中的只定义一个main函数就完成编写一个Python节点外,还有另外两种方式。
 除了使用上节中的只定义一个main函数就完成编写一个Python节点外,还有另外两种方式。
 
 

+ 9 - 16
docs/chapt3/3.5.4使用OOP方法编实现作家李四.md

@@ -1,12 +1,6 @@
-## 2.开始编写节点
+## 3.4.4 使用OOP方法编实现作家李四
 
 
-接下来我们开始编写一个python节点,首先在`__init__.py`同级别目录下创建一个叫做`li4.py`的文件(在vscode中右击新建就行)。
-
-创建完成后的目录结构长这样子
-
-![image-20210727125908746](3.5.4使用OOP方法编实现作家李四/imgs/image-20210727125908746.png)
-
-打开li4.py,接着我们开始编写代码。跟着小鱼一起边理解输入下面的代码,注释不用输。
+打开li4.py,接着我们开始修改代码。跟着小鱼一起边理解输入下面的代码,注释不用输。
 
 
 ```
 ```
 #!/usr/bin/env python3
 #!/usr/bin/env python3
@@ -14,14 +8,13 @@ import rclpy
 from rclpy.node import Node
 from rclpy.node import Node
 
 
 
 
-class Li4Node(Node):
+class WriterNode(Node):
     """
     """
-    创建一个李四节点,并在初始化时输出一句
+    创建一个作家节点,并在初始化时输出一个
     """
     """
-    def __init__(self):
-        super().__init__("li4") #给节点一个名字 li4
-        self.get_logger().info("大家好,我是艳娘传奇作者李四!") #来个自我介绍
-
+    def __init__(self,name):
+        super().__init__(name)
+        self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
 
 
 
 
 def main(args=None):
 def main(args=None):
@@ -29,11 +22,11 @@ def main(args=None):
     ros2运行该节点的入口函数,可配置函数名称
     ros2运行该节点的入口函数,可配置函数名称
     """
     """
     rclpy.init(args=args) # 初始化rclpy
     rclpy.init(args=args) # 初始化rclpy
-    node = Li4Node()  # 新建一个节点
+    node = WriterNode("li4")  # 新建一个节点
     rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
     rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
     rclpy.shutdown() # rcl关闭
     rclpy.shutdown() # rcl关闭
-```
 
 
+```
 
 
 
 
 代码编写完成用Crtl+S进行保存。接着修改`setup.py`
 代码编写完成用Crtl+S进行保存。接着修改`setup.py`

+ 2 - 4
docs/chapt3/3.5手撸一个节点Python版本.md

@@ -1,10 +1,8 @@
-# 3.5 带你手撸一个Python节点
+# 3.4 带你手撸一个Python节点
 
 
 各位小伙伴大家好,我是小鱼,本节课我们开始动手来撸一个ROS2的Python节点~
 各位小伙伴大家好,我是小鱼,本节课我们开始动手来撸一个ROS2的Python节点~
 
 
-上一节的小游戏,相信你已经运行起来了。这一节小鱼就从上一节的小游戏说起,带你一起手撸一个python版本的节点。
-
-带着你的好奇心,小鱼带你一起手撸一个节点。
+上一节的小游戏,相信你已经运行起来了,这一节课带着你的好奇心,小鱼和你一起手撸一个Python节点。
 
 
 
 
 
 

+ 25 - 0
docs/chapt3/3.6.1创建一个C++功能包.md

@@ -0,0 +1,25 @@
+# 3.5.1创建一个C++功能包
+
+## 1.创建王家村功能包
+
+王二居住在王家村,王家村和李家村不一样,是使用ament-cmake作为编译类型的。
+
+所以王家村建立指令像下面这样,只不过依赖变成了rclcpp
+
+```
+ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp
+```
+
+打开终端,进入`town_ws/src`运行上面的指令,创建完成后的目录结构如下:
+
+![image-20210727193256467](3.6.1创建一个C++功能包/imgs/image-20210727193256467.png)
+
+
+
+
+
+## 2.创建节点
+
+接着我们在`village_wang/src`下创建一个`wang2.cpp`文件,创建完成后的目录结构如下:
+
+![image-20210727201535444](3.6.1创建一个C++功能包/imgs/image-20210727201535444.png)

二进制
docs/chapt3/3.6.1创建一个C++功能包/imgs/image-20210727193256467.png


二进制
docs/chapt3/3.6.1创建一个C++功能包/imgs/image-20210727201535444.png


+ 86 - 0
docs/chapt3/3.6.2POP方法编写C++节点并测试.md

@@ -0,0 +1,86 @@
+# 3.5.2 POP方法编写C++节点并测试
+
+## 1.编写代码
+
+继续跟着小鱼一起输入代码,输入的时候可以边输边理解。
+
+```cpp
+#include "rclcpp/rclcpp.hpp"
+
+
+int main(int argc, char **argv)
+{
+    rclcpp::init(argc, argv);
+    /*产生一个Wang2的节点*/
+    auto node = std::make_shared<rclcpp::Node>("wang2");
+    // 打印一句自我介绍
+    RCLCPP_INFO(node->get_logger(), "大家好,我是单身狗wang2.");
+    /* 运行节点,并检测退出信号*/
+    rclcpp::spin(node);
+    rclcpp::shutdown();
+    return 0;
+}
+```
+
+主函数中首先初始化rclcpp,然后新建了一个Node节点的对象,命名为`wang2`,接着使用rclcpp让这个节点暴露在外面,并检测退出信号(Ctrl+C),检测到退出信号后,就会执行`rcl.shutdown()`关闭节点。
+
+### 添加到CmakeLists
+
+在wang2.cpp中输入上面的内容后,还需要修改一下CmakeLists.txt。
+
+在CmakeLists.txt最后一行加入下面两行代码。
+
+```
+add_executable(wang2_node src/wang2.cpp)
+ament_target_dependencies(wang2_node rclcpp)
+```
+
+添加这两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译。接着在上面两行代码下面添加下面的代码。
+
+```
+install(TARGETS
+  wang2_node
+  DESTINATION lib/${PROJECT_NAME}
+)
+```
+
+这个是C++比Python要麻烦的地方,需要手动将编译好的文件安装到`install/village_wang/lib/village_wang`下
+
+## 2.编译运行节点
+
+打开vscode终端,进入`town_ws`
+
+### 编译节点
+
+```
+colcon build
+```
+
+### source环境
+
+```
+source install/setup.bash
+```
+
+### 运行节点
+
+```
+ros2 run village_wang wang2_node
+```
+
+不出意外,你可以看到王二的自我介绍。
+
+![image-20210727204912006](3.6.2POP方法编写C++节点并测试/imgs/image-20210727204912006.png)
+
+
+
+## 3.测试
+
+当节点运行起来后,可以再尝试使用`ros2 node list `指令来查看现有的节点。这个时候你应该能看到:
+
+![image-20210727205020561](3.6.2POP方法编写C++节点并测试/imgs/image-20210727205020561.png)
+
+
+
+至此,相信你已经掌握了如何编写一个C++版本的ros2节点,下一章中,作家李四将会开始编写艳娘传奇,我们到时候可以帮单身狗王二编写代码,订阅艳娘传奇。
+

二进制
docs/chapt3/3.6.2POP方法编写C++节点并测试/imgs/image-20210727201535444.png


二进制
docs/chapt3/3.6.2POP方法编写C++节点并测试/imgs/image-20210727204912006.png


二进制
docs/chapt3/3.6.2POP方法编写C++节点并测试/imgs/image-20210727205020561.png


+ 104 - 0
docs/chapt3/3.6.3OOP方式编写一个节点.md

@@ -0,0 +1,104 @@
+# 3.5.3 OOP方式编写一个节点
+
+## 1. 编写代码
+
+继续跟着小鱼一起输入代码,输入的时候可以边输边理解。
+
+```cpp
+
+#include "rclcpp/rclcpp.hpp"
+
+/*
+    创建一个类节点,名字叫做SingleDogNode,继承自Node.
+*/
+class SingleDogNode : public rclcpp::Node
+{
+
+public:
+    // 构造函数,有一个参数为节点名称
+    SingleDogNode(std::string name) : Node(name)
+    {
+        // 打印一句自我介绍
+        RCLCPP_INFO(this->get_logger(), "大家好,我是单身狗%s.",name.c_str());
+    }
+
+private:
+   
+};
+
+int main(int argc, char **argv)
+{
+    rclcpp::init(argc, argv);
+    /*产生一个Wang2的节点*/
+    auto node = std::make_shared<SingleDogNode>("wang2");
+    /* 运行节点,并检测退出信号*/
+    rclcpp::spin(node);
+    rclcpp::shutdown();
+    return 0;
+}
+```
+
+上面的代码声明了一个叫做`SingleDogNode`的类,并在类的初始化函数中,输出了一句话。主函数中首先初始化rclcpp,然后新建了一个`SingleDogNode`节点的对象,接着使用rclcpp让这个节点暴露在外面,并检测退出信号(Ctrl+C),检测到退出信号后,就会执行`rcl.shutdown()`关闭节点。
+
+### 添加到CmakeLists
+
+在wang2.cpp中输入上面的内容后,还需要修改一下CmakeLists.txt。
+
+在CmakeLists.txt最后一行加入下面两行代码。
+
+```
+add_executable(wang2_node src/wang2.cpp)
+ament_target_dependencies(wang2_node rclcpp)
+```
+
+
+
+添加这两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译。接着在上面两行代码下面添加下面的代码。
+
+```
+install(TARGETS
+  wang2_node
+  DESTINATION lib/${PROJECT_NAME}
+)
+```
+
+这个是C++比Python要麻烦的地方,需要手动将编译好的文件安装到`install/village_wang/lib/village_wang`下
+
+## 2.编译运行节点
+
+打开vscode终端,进入`town_ws`
+
+### 编译节点
+
+```
+colcon build
+```
+
+### source环境
+
+```
+source install/setup.bash
+```
+
+### 运行节点
+
+```
+ros2 run village_wang wang2_node
+```
+
+不出意外,你可以看到王二的自我介绍。
+
+![image-20210727204912006](3.6.3OOP方式编写一个节点/imgs/image-20210727204912006.png)
+
+
+
+## 3.测试
+
+当节点运行起来后,可以再尝试使用`ros2 node list `指令来查看现有的节点。这个时候你应该能看到:
+
+![image-20210727205020561](3.6.3OOP方式编写一个节点/imgs/image-20210727205020561.png)
+
+
+
+至此,相信你已经掌握了如何编写一个C++版本的ros2节点,下一章中,作家李四将会开始编写艳娘传奇,我们到时候可以帮单身狗王二编写代码,订阅艳娘传奇。
+

二进制
docs/chapt3/3.6.3OOP方式编写一个节点/imgs/image-20210727201535444.png


二进制
docs/chapt3/3.6.3OOP方式编写一个节点/imgs/image-20210727204912006.png


二进制
docs/chapt3/3.6.3OOP方式编写一个节点/imgs/image-20210727205020561.png


+ 6 - 123
docs/chapt3/3.6手撸一个节点C++版.md

@@ -1,131 +1,14 @@
-# 3.6小鱼带你手撸一个C++节点
+# 3.5 手撸一个C++节点
 
 
-李四来到了李家村后,到了第4章就要开始进行写小说了,所以本节我们要使用C++给李四创建一个读者节点王二。
+作家李四来到了李家村后,下一章就要开始写小说了,光有作者没有读者可不行,所以本节我们要使用C++给李四创建一个读者节点单身汉王二。
 
 
 
 
 
 
-## 1.创建王家村功能包
-
-王二居住在王家村,王家村和李家村不一样,是使用ament-cmake作为编译类型的。
-
-所以王家村建立指令像下面这样,只不过依赖变成了rclcpp
-
-```
-ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp
-```
-
-打开终端,进入`town_ws/src`运行上面的指令,创建完成后的目录结构如下:
-
-![image-20210727193256467](3.6手撸一个节点C++版/imgs/image-20210727193256467.png)
-
-
-
-## 2.编写节点
-
-接着我们在`village_wang/src`下创建一个`wang2.cpp`文件,创建完成后的目录结构如下:
-
-![image-20210727201535444](3.6手撸一个节点C++版/imgs/image-20210727201535444.png)
-
-### 编写代码
-
-继续跟着小鱼一起输入代码,输入的时候可以边输边理解。
-
-```cpp
-#include "rclcpp/rclcpp.hpp"
-
-/*
-    创建一个类节点,名字叫做Wang2Node,继承自Node.
-*/
-class Wang2Node : public rclcpp::Node
-{
-public:
-    Wang2Node() : Node("wang2")
-    {
-        // 打印一句自我介绍
-        RCLCPP_INFO(this->get_logger(), "大家好,我是单身汉王二.");
-    }
-};
-
-int main(int argc, char **argv)
-{
-	/*初始化rclcpp*/
-    rclcpp::init(argc, argv);
-    /*产生一个Wang2的节点*/
-    auto node = std::make_shared<Wang2Node>();
-    /* 运行节点,并检测退出信号*/
-    rclcpp::spin(node);
-    /*接收到退出信号,关闭rclcpp*/
-    rclcpp::shutdown();
-    return 0;
-}
-```
-
-上面的代码声明了一个叫做Wang2Node的类,并在类的初始化函数中,输出了一句话。主函数中首先初始化rclcpp,然后新建了一个Wang2Node节点的对象,接着使用rclcpp让这个节点暴露在外面,并检测退出信号(Ctrl+C),检测到退出信号后,就会执行`rcl.shutdown()`关闭节点。
-
-### 添加到CmakeLists
-
-在wang2.cpp中输入上面的内容后,还需要修改一下CmakeLists.txt。
-
-在CmakeLists.txt最后一行加入下面两行代码。
-
-```
-add_executable(wang2_node src/wang2.cpp)
-ament_target_dependencies(wang2_node rclcpp)
-```
-
-
-
-添加这两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译。接着在上面两行代码下面添加下面的代码。
-
-```
-install(TARGETS
-  wang2_node
-  DESTINATION lib/${PROJECT_NAME}
-)
-```
-
-这个是C++比Python要麻烦的地方,需要手动将编译好的文件安装到`install/village_wang/lib/village_wang`下
-
-
-## 3.编译运行节点
-
-打开vscode终端,进入`town_ws`
-
-### 编译节点
-
-```
-colcon build
-```
-
-### source环境
-
-```
-source install/setup.bash
-```
-
-### 运行节点
-
-```
-ros2 run village_wang wang2_node
-```
-
-不出意外,你可以看到王二的自我介绍。
-
-![image-20210727204912006](3.6手撸一个节点C++版/imgs/image-20210727204912006.png)
-
-
-
-## 4.总结
-
-当节点运行起来后,可以再尝试使用`ros2 node list `指令来查看现有的节点。这个时候你应该能看到:
-
-![image-20210727205020561](3.6手撸一个节点C++版/imgs/image-20210727205020561.png)
-
-
-
-至此,相信你已经掌握了如何编写一个C++版本的ros2节点,下一章中,作家李四将会开始编写艳娘传奇,我们到时候可以帮单身狗王二编写代码,订阅艳娘传奇。
-
+通过本节课的学习你将有以下收获:
 
 
+1. 学会创建一个C++功能包
+2. 使用非OOP方法编写一个C++节点
+3. 使用OOP方法编写一个C++节点
 
 
 
 
 
 

+ 1 - 1
docs/chapt3/3.7扩展阅读.md

@@ -1,4 +1,4 @@
-# 3.5 扩展阅读
+# 扩展资料1-本章CLI工具总结
 
 
 ## 1.ros2功能包相关指令
 ## 1.ros2功能包相关指令