Browse Source

添加6.123

sangxin 3 years ago
parent
commit
00a5b4615b

+ 148 - 2
docs/chapt6/6.1ROS2接点管理之launch文件.md

@@ -1,4 +1,150 @@
-6.1ROS2接点管理之launch文件
+# 6.1 ROS2节点管理之launch文件
 
-待更新,欢迎关注微信公众号《鱼香ROS》,第一时间获取更新。
+大家好,我是小鱼。今天我们来讲一讲launch文件。
+
+## 一、为什么需要launch文件
+### 1.1 需要启动的节点太多
+看过小鱼[动手学ROS2](https://d2lros2.fishros.com/)教程的同学都知道,我们每启动一个节点的时候,都是先打开一个新的终端,然后使用下面这种方式来启动节点:
+```shell
+ros2 run package-name  execute-name
+```
+如果只启动一个节点的确没有问题,一行`ros2 run`指令就完成了,但是如果我们要启动三个甚至更多的节点,重复的动作做很多遍?是不是就很浪费生命。
+
+### 1.2 节点之间有依赖关系管理
+我们在前面的章节中学习客户端服务端通信时,客户端李三要找服务端李四借钱吃麻辣烫,假设李四节点没启动(这个人还不存在),我们先启动李三节点,李三节点直接不检查李四服务是否存在就发送了请求,这个时候肯定是会请求失败的。
+
+再比如我们想在原有的导航地图上设置一个虚拟墙(原本不存在墙,人为加上,不让机器人过去),如果地图服务都没启动,在地图上设置虚拟墙肯定会失败。
+
+从上面的例子我们可以得出,节点之间的启动有时会有依赖关系。
+
+
+### 1.3 秘密武器-launch介绍
+可不可以编写一个类似于脚本的文件来管理节点的启动呢?ROS2设计时就为我们想好了,为我们设计了一套完整的语法和规则的文件来帮助我们组织节点的启动,这个武器就叫launch文件。
+
+**launch文件允许我们同时启动和配置多个包含 ROS 2 节点的可执行文件**
+
+> 在ROS1中launch文件只有一种格式以.launch结尾的xml文档,不熟悉的同学写起来被xml语法折磨的死去活来。不过在ROS2中不要担心,因为在ROS2你可以使用Python代码来编写launch文件
+
+
+## 二、编写第一个ROS2的launch文件
+### 2.1 三种编写launch文件的方法
+ROS2的launch文件有三种格式,python、xml、yaml。其中ROS2官方推荐的时python方式编写launch文件。
+原因在于,相较于XML和YAML,**Python是一个编程语言,更加的灵活,我们可以利用Python的很多库来做一些其他工作**(比如创建一些初始化的目录等)。
+
+> 除了灵活还有另外一个原因是ros2/launch(一般launch共功能)和ros2/launch_ros(ROS 2 launch的特性)是用 Python 编写的,我们使用python编写launch文件可以使用 XML 和 YAML 中不能用的launch功能。
+> 要说使用python版本的launch有什么坏处,那就是写起来比yaml要冗余
+
+### 2.2 使用Python同时启动李四和王二节点
+这里举例的是小鱼动手学ROS2课程中的程序,相关源码获取
+```
+git clone https://github.com/fishros/ros2_town.git -b charpter3
+```
+我们的目标是编写一个launch文件,最后使用launch指令,同时启动李四和王二节点。
+
+#### 2.2.1 创建文件
+在功能包`village_li`和`village_wang`目录下创建`launch`文件夹。
+
+![创建完成后的目录](6.1ROS2接点管理之launch文件/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_11,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.2 编写launch文件
+
+接着我们开始编写`launch`文件,在`village_li`目录下创建`village.launch.py`文件。
+我们需要导入两个库,一个叫做LaunchDescription,用于对launch文件内容进行描述,一个是Node,用于声明节点所在的位置。
+
+接着我们就可以编写代码了,注意这里要定一个名字叫做`generate_launch_description`的函数,ROS2会对该函数名字做识别。
+
+```python
+# 导入库
+from launch import LaunchDescription
+from launch_ros.actions import Node
+
+# 定义函数名称为:generate_launch_description
+def generate_launch_description():
+    # 创建Actions.Node对象li_node,标明李四所在位置
+    li4_node = Node(
+        package="village_li",
+        executable="li4_node"
+        )
+    # 创建Actions.Node对象wang2_node,标明王二所在位置
+    wang2_node = Node(
+        package="village_wang",
+        executable="wang2_node"
+        )
+    # 创建LaunchDescription对象launch_description,用于描述launch文件
+    launch_description = LaunchDescription([li4_node,wang2_node])
+    # 返回让ROS2根据launch描述执行节点
+    return launch_description
+```
+
+#### 2.2.3 修改setup.py将launch文件拷贝到安装目录
+如果你编写完成后直接编译你会发现install目录下根本没有你编写的launch文件,后续launch自然也找不到这个launch文件。
+
+```python
+from setuptools import setup
+from glob import glob
+import os
+
+package_name = 'village_li'
+
+setup(
+    name=package_name,
+    version='0.0.0',
+    packages=[package_name],
+    data_files=[
+        ('share/ament_index/resource_index/packages',
+            ['resource/' + package_name]),
+        ('share/' + package_name, ['package.xml']),
+        (os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
+    ],
+    install_requires=['setuptools'],
+    zip_safe=True,
+    maintainer='ros2',
+    maintainer_email='sangxin2014@sina.com',
+    description='TODO: Package description',
+    license='TODO: License declaration',
+    tests_require=['pytest'],
+    entry_points={
+        'console_scripts': [
+            "li4_node = village_li.li4:main",
+            "li3_node = village_li.li3:main"
+        ],
+    },
+)
+
+```
+
+#### 2.2.4编译测试
+使用colcon指令编译我们的程序
+
+```python
+colcon build
+```
+编译完成后,我们source以下工作空间,就可以运行我们的village.launch.py文件了
+
+```sheel
+source install/setup.bash
+ros2 launch village_li village.launch.py
+```
+运行结果如下,可以看到李四和王二在统一终端和大家打了招呼,我们也可以使用,ros2 node list 看一看两个节点是否都存在。
+
+![运行结果](6.1ROS2接点管理之launch文件/imgs/8e2f813fa4a44ccabe7a4c1ca2e00849-163336469393520.png)
+
+### 2.3 cmake编译类型功能包的launch文件安装
+如果是ament_cmake或者是cmake类型的功能包,我们需要在CmakeLists.txt中添加安装指令,将launch文件夹安装到install目录。
+
+```cmake
+install(DIRECTORY launch
+  DESTINATION share/${PROJECT_NAME})
+```
+将village_li/launch目录下的village.launch.py复制到village_wang/launch下,接着我们编译运行试一试
+
+```
+colcon build
+ros2 launch village_wang village.launch.py 
+```
+![c++功能包测试](6.1ROS2接点管理之launch文件/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+## 三、小总结
+今天只是简单讲了下,使用launch文件来同时启动多个接待年,但对节点的一些参数也可以在launch中配置
+
+最近在紧张的录制课程,比较忙,大家的一些问题回答没那么及时,今天就到这里,欢迎大家点赞分享~
 

BIN
docs/chapt6/6.1ROS2接点管理之launch文件/imgs/8e2f813fa4a44ccabe7a4c1ca2e00849-163336469393520.png


BIN
docs/chapt6/6.1ROS2接点管理之launch文件/imgs/8e2f813fa4a44ccabe7a4c1ca2e00849.png


BIN
docs/chapt6/6.1ROS2接点管理之launch文件/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_11,color_FFFFFF,t_70,g_se,x_16.png


BIN
docs/chapt6/6.1ROS2接点管理之launch文件/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png


+ 129 - 2
docs/chapt6/6.2时光记录仪之rosbag2.md

@@ -1,3 +1,130 @@
-6.2时光记录仪之rosbag2
+# 6.2时光记录仪之rosbag2
+
+本节我们来介绍ROS2中常用的一个CLI工具——rosbag2,这个工具用于记录话题的数据(就像小鱼录视频一样)。
+
+比如前面的章节中李四写《艳娘传奇》的话题数据,我们就可以使用这个指令将其存储为文件 ,后续我们无需启动李四,直接可以将bag文件里的话题数据发布出来。
+
+> 这个工具在我们做一个真实机器人的时候非常有用,比如我们可以录制一段机器人发生问题的话题数据,录制完成后可以多次发布出来进行测试和实验,也可以将话题数据分享给别人用于验证算法等。
+
+我们尝试使用bag工具来记录sexy_girl话题数据,并二次重放。
+
+## 一、安装
+当我们安装ROS2的时候,这个命令行工具已经为我们自动安装了,这里我们就不需要再次安装。
+
+但是如果你需要一些新的功能:则可以用过源码获取:https://github.com/ros2/rosbag2/tree/foxy-future
+
+## 二、记录
+### 2.1 常用指令
+#### 2.1.1 记录某一个话题
+`/sexy_girl` 为话题名字
+
+```bash
+ros2 bag record /sexy_girl
+```
+
+#### 2.1.2 记录多个话题的数据
+
+```bash
+ros2 bag record topic-name1  topic-name2
+```
+
+#### 2.1.3 记录所有话题
+```bash
+ros2 bag record -a
+```
+
+#### 2.1.4其他选项
+##### -o name 自定义输出文件的名字
+```bash
+ros2 bag record -o file-name topic-name
+```
+##### -s 存储格式
+目前仅支持sqllite3,其他还带拓展,后续更新小鱼再更新。
+
+
+### 2.2 录制小说
+#### 2.2.1 启动李四
+
+进入我们的`town_ws`,运行李四节点
+
+```bash
+cd  town_ws/
+source install/setup.bash
+ros2 run village_li li4_node
+```
+![李四正在发布小说](6.2时光记录仪之rosbag2/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+
+#### 2.2.2 录制
+接着使用像下面的指令就可以进行话题数据的录制了
+
+```bash
+ros2 bag record /sexy_girl
+```
+
+![录制话题数据](6.2时光记录仪之rosbag2/imgs/bf524fb3605a4ce4bf7c308aba7efc70.png)
+
+如何停止录制呢?我们直接在终端中使用`Ctrl+C`指令打断录制即可
+
+接着你会在终端中发现多处一个文件夹,名字叫做`rosbag2_xxxxxx.db3 `
+
+打开文件夹,可以看到内容
+
+![文件内容](6.2时光记录仪之rosbag2/imgs/7d32470a2c12477f8c90a397a9af339a.png)
+
+这样我们就完成了录制。
+
+
+
+## 三、查看录制出话题的信息
+我们在播放一个视频前,可以通过文件信息查看视频的相关信息,比如话题记录的时间,大小,类型,数量
+
+```bash
+ros2 bag info bag-file
+```
+![话题信息](6.2时光记录仪之rosbag2/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+## 四、播放
+### 4.1 播放话题数据
+接着我们就可以重新的播放数据,使用下面的指令可以播放数据
+
+```bash
+ros2 bag play xxx.db3
+```
+
+
+![play](6.2时光记录仪之rosbag2/imgs/55cc1e8605554ae79490ba345b33fccb.png)
+
+接着我们关闭李四,使用ros2的topic的指令来查看数据
+
+```bash
+ros2 topic echo /sexy_girl
+```
+![播放话题信息](6.2时光记录仪之rosbag2/imgs/a78e638365ac4868bed8ff16cef1eb7e.png)
+### 4.2 播放选项
+### 4.2.1 倍速播放 -r 
+-r选项可以修改播放速率,比如 -r 值,比如 -r 10,就是10倍速,十倍速播放话题
+
+```bash
+ros2 bag play rosbag2_2021_10_03-15_31_41_0.db3 -r 10
+```
+
+### 4.2.2 -l  循环播放
+单曲循环就是它了
+
+```bash
+ros2 bag play rosbag2_2021_10_03-15_31_41_0.db3  -l
+```
+
+### 4.2.3 播放单个话题
+
+```bash
+ros2 bag play rosbag2_2021_10_03-15_31_41_0.db3 --topics /sexy_girl
+```
+
+
+
+## 五、总结
+
+相信你已经掌握了ROS2的bag工具,下一节我们来学习下,如何ROS2的RQT工具~
 
-待更新,欢迎关注微信公众号《鱼香ROS》,第一时间获取更新。

BIN
docs/chapt6/6.2时光记录仪之rosbag2/imgs/55cc1e8605554ae79490ba345b33fccb.png


BIN
docs/chapt6/6.2时光记录仪之rosbag2/imgs/7d32470a2c12477f8c90a397a9af339a.png


BIN
docs/chapt6/6.2时光记录仪之rosbag2/imgs/a78e638365ac4868bed8ff16cef1eb7e.png


BIN
docs/chapt6/6.2时光记录仪之rosbag2/imgs/bf524fb3605a4ce4bf7c308aba7efc70.png


BIN
docs/chapt6/6.2时光记录仪之rosbag2/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png


+ 72 - 2
docs/chapt6/6.3RQT工具.md

@@ -1,4 +1,74 @@
-6.3RQT工具
+# 6.3RQT工具
 
-待更新,欢迎关注微信公众号《鱼香ROS》,第一时间获取更新。
+大家好,我是小鱼,今天来说说ROS2的RQT工具。
+
+前面小鱼介绍过rqt_graph这个工具,我们在平时编写ROS2程序中经常使用,除了rqt_graph,ROS2中还有很多非常易用的RQT工具,一起来体验下
+
+
+## 一、RQT是什么
+RQT是一个GUI框架,通过插件的方式实现了各种各样的界面工具。
+
+强行解读下:RQT就像插座,任何电器只要符合插座的型号就可以插上去工作。
+
+> 说到这里你应该对ROS2的插件化设计感到无比震撼,上节的bag话题录制的存储格式也是插件式的。
+
+
+
+## 二、体验RQT工具
+没有复杂的指令,一句命令行就可以调出rqt界面。
+
+```bash
+rqt
+```
+打开之后的窗口如下图,空空如也,不要担心,因为我们没有选插件的原因。
+
+![RQT](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+### 2.1 选择插件
+这里我们可以选择现有的几个RQT插件来试一试,可以看到和话题、参数、服务、动作四大通信组件相关的工具都有,还有一些可视化、日志和系统计算图等相关的。
+
+![ROS2自带插件](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+我们按照比较常用的几个来看一下,其他的大家有个印象,后续用到再用。
+
+### 2.2 插件大观
+
+#### 2.2.1 Introspection / Node Graph
+
+第一个是肯定是rqt_graph,插件名字叫做Node Graph,这个名字小鱼觉得更加的贴切,用rqt_graph更多的是为了延续ROS1中的用法,这个**插件用于查看节点和节点之间的关系的**。
+
+![NodeGraph](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.2 Introspection / Process Monitor
+这个插件可以看到所有与ROS2相关的进程
+
+![Process Monitor](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.3 Topic/ Message Publisher
+可以图形化发布话题数据
+
+![Message Publisher](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.4 Service /Service Caller
+图形化调用服务工具
+
+![在这里插入图片描述](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.5 Visualization / Image View
+看图像话题数据的Image View
+
+![V](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+#### 2.2.6 Visualization / MatPlot
+话题数据图形化工具MqtPlot,小鱼就是用这个工具来调PID的
+
+![MatPlot](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+
+#### 2.2.7 Configuration / Parameter Reconfigure
+
+![Parameter Reconfigure](6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png)
+
+### 三、总结
+小鱼准备有时间开发一些RQT工具来满足平时的一些特殊场景的使用,到时写一个教程出来,下一节我们一起学习ROS2中的RVIZ2工具。
 

BIN
docs/chapt6/6.3RQT工具/imgs/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bG86aaZUk9T,size_20,color_FFFFFF,t_70,g_se,x_16.png


+ 1 - 1
docs/chapt6/6.4RVIZ2.md

@@ -1,4 +1,4 @@
 6.4RVIZ2
 
-待更新,欢迎关注微信公众号《鱼香ROS》,第一时间获更新。
+待更新,欢迎关注微信公众号《鱼香ROS》,第一时间获更新。