|
@@ -2,7 +2,7 @@
|
|
|
|
|
|
大家好,我是小鱼。今天我们来讲一讲launch文件。
|
|
|
|
|
|
-## 一、为什么需要launch文件
|
|
|
+## 1.为什么需要launch文件
|
|
|
### 1.1 需要启动的节点太多
|
|
|
看过小鱼[动手学ROS2](https://d2lros2.fishros.com/)教程的同学都知道,我们每启动一个节点的时候,都是先打开一个新的终端,然后使用下面这种方式来启动节点:
|
|
|
```shell
|
|
@@ -26,7 +26,7 @@ ros2 run package-name execute-name
|
|
|
> 在ROS1中launch文件只有一种格式以.launch结尾的xml文档,不熟悉的同学写起来被xml语法折磨的死去活来。不过在ROS2中不要担心,因为在ROS2你可以使用Python代码来编写launch文件
|
|
|
|
|
|
|
|
|
-## 二、编写第一个ROS2的launch文件
|
|
|
+## 2.编写第一个ROS2的launch文件
|
|
|
### 2.1 三种编写launch文件的方法
|
|
|
ROS2的launch文件有三种格式,python、xml、yaml。其中ROS2官方推荐的时python方式编写launch文件。
|
|
|
原因在于,相较于XML和YAML,**Python是一个编程语言,更加的灵活,我们可以利用Python的很多库来做一些其他工作**(比如创建一些初始化的目录等)。
|
|
@@ -145,13 +145,89 @@ ros2 launch village_wang village.launch.py
|
|
|

|
|
|
|
|
|
|
|
|
-## 三、将参数加入launch文件
|
|
|
+## 3.将参数加入launch文件
|
|
|
|
|
|
当我们启动节点时,可以对该节点的参数进行赋值,比如我们可以尝试在启动节点时修改李四写书的速度,改变王二卖书的价格。
|
|
|
|
|
|
+在node中给param赋值即可。
|
|
|
|
|
|
|
|
|
+```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",
|
|
|
+ output='screen', #四个可选项
|
|
|
+ parameters=[{'write_timer_period': 1}]
|
|
|
+ )
|
|
|
+ # 创建Actions.Node对象wang2_node,标明王二所在位置
|
|
|
+ wang2_node = Node(
|
|
|
+ package="village_wang",
|
|
|
+ executable="wang2_node",
|
|
|
+ output='screen', #四个可选项
|
|
|
+ parameters=[{'novel_price': 2}]
|
|
|
+ )
|
|
|
+ # 创建LaunchDescription对象launch_description,用于描述launch文件
|
|
|
+ launch_description = LaunchDescription([li4_node,wang2_node])
|
|
|
+ # 返回让ROS2根据launch描述执行节点
|
|
|
+ return launch_description
|
|
|
+```
|
|
|
+
|
|
|
+大家自行运行尝试。
|
|
|
+
|
|
|
+## 4.命名空间修改
|
|
|
+
|
|
|
+我们可以修改命名空间,这样就可以区分两个同名节点。
|
|
|
+
|
|
|
+```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",
|
|
|
+ output='screen', #四个可选项
|
|
|
+ parameters=[{'write_timer_period': 1}]
|
|
|
+ )
|
|
|
+ # 创建Actions.Node对象wang2_node,标明王二所在位置
|
|
|
+ wang2_node = Node(
|
|
|
+ package="village_wang",
|
|
|
+ executable="wang2_node",
|
|
|
+ parameters=[{'novel_price': 2}]
|
|
|
+ )
|
|
|
+
|
|
|
+ # 创建另外一个命名空间下的,创建Actions.Node对象li_node,标明李四所在位置
|
|
|
+ li4_node2 = Node(
|
|
|
+ package="village_li",
|
|
|
+ namespace="mirror_town",
|
|
|
+ executable="li4_node",
|
|
|
+ parameters=[{'write_timer_period': 2}]
|
|
|
+ )
|
|
|
+ # 创建另外一个命名空间下的,Actions.Node对象wang2_node,标明王二所在位置
|
|
|
+ wang2_node2 = Node(
|
|
|
+ package="village_wang",
|
|
|
+ namespace="mirror_town",
|
|
|
+ executable="wang2_node",
|
|
|
+ parameters=[{'novel_price': 1}]
|
|
|
+ )
|
|
|
|
|
|
+ # 创建LaunchDescription对象launch_description,用于描述launch文件
|
|
|
+ launch_description = LaunchDescription([li4_node,wang2_node,wang2_node2,li4_node2])
|
|
|
+ # 返回让ROS2根据launch描述执行节点
|
|
|
+ return launch_description
|
|
|
+```
|
|
|
|
|
|
## 四、小总结
|
|
|
今天只是简单讲了下,使用launch文件来同时启动多个接待年,但对节点的一些参数也可以在launch中配置
|