首先,开始游戏之前不要着急,身为ROS界的大侦探,请先掌握如下基础知识,仔细阅读了解我们的ROS世界观才能生存。(前情回顾有点长,请一定要坚持到最后呀)
$roscore
首先打开节点管理器master,建立了一个日志输出节点\rosout 记录error,warning写入log文件,参数服务器进行参数配置。
然后我们就可以启动节点,一个package可以有多个可执行文件,TA们是静态的,而节点代表着进程,TA们是动态的,一般以功能来划分的。启动node的方法如下
$rosrun [package_name] [node_name]
易错点:容易出现找不到package的情况,在rosrun之前一定要记得运行脚本文件让工作空间环境变量有效。
$ source ~/ros/devel/setup.bash
命令 | 功能 |
---|---|
rosnode list | 列出当前运行节点列表 |
rosnode info [node_name] | 列出节点信息 |
rosnode kill [node_name] | 终止一个进程 |
当然,如果存在多个节点的时候,一个一个rosrun打开我们也太难了。所以我们要升级学习roslaunch,roslaunch 可以启动一个节点管理器和多个节点。launch文件是描述一组节点及其话题重映射和参数的XML文件。根据规范,这些文件的后缀都是.launch
$ roslaunch [pkg_name] [file_name.launch]
我们需要在启动文件里面配置好我们要启动的规则,launch文件和package文件一样都要符合标签语言的规范。
RLException: [part1.launch] is neither a launch file in package [swarm] nor is [swarm] a launch file name
The traceback for the exception was written to the log file
运行launch出错也要提前设置环境变量,至少可以换一个错误显示,比如语法错误。
RLException: Invalid roslaunch XML syntax: mismatched tag: line 24, column 2
The traceback for the exception was written to the log file
下面来进行launch 文件的使用说明。
<group ns="bluesim">
<node pkg="swarm" type="swarm_behavior" name="leader_swarm" clear_params="true" >
</group>
<group ns="redsim">
<node pkg="swarm" type="swarm_behavior" name="leader_swarm" clear_params="true" >
</group>
在这里我们创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为bluesim,另一个名为redsim,两个组里面都使用相同的swarm_behavior节点并命名为’leader_swarm’。这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。(当然如果直接用不同的命名也是可以的,比如一个叫blue_leader,一个叫red_leader,这样也可以同时多次启动同一节点).
remap标签
在launch文件中重新命名:使用 remap 元素:
<remap from="original-name" to="new-name" />
如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。
node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch 命令行工具的–screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。
$ roslaunch --screen package-name launch-file-name
作为一个初学者,如何在不改变src里面源代码的情况下编写一个launch文件?
The « capture_key » package. It contains a single type of node. Such a node reads the keyboard and publishes the ASCII code of the characters that are typed. We will use this node to trigger random motions of swarm leaders.
我们通过终端了解这个package信息
$ rosrun capture_key capture_key_node
[ INFO] [1587440555.878273452]: Node capture_key_node connected to roscore
kkey: 107
bkey: 98
dkey: 100
jkey: 106
tkey: 116
pkey: 112
skey: 115
gkey: 103
ckey: 99
The « swarm » package, which contains two types of nodes:
• « swarm_node » to simulate a bird of the swarm.
• « swarm_behavior » to randomly set a new position for the virtual leader.
我们把节点都运行了一遍后,就要开始探究这看似毫无关系的三个节点之间究竟究竟隐藏着什么不可告人的秘密了。【案情触发中…】
三位犯罪嫌疑人资料调查中…
Node [/capture_key_node]
Publications:
Subscriptions: None
调查进度33%
Node [/swarm_behavior]
Publications:
Subscriptions:
Subscriptions:
通过我们对线索的整合,我们发现了一点蛛丝马迹,也就是暗号
-Node [/capture_key_node]Publications: /key_typed [std_msgs/Int16],
-Node [/swarm_behavior]Subscriptions:== /key_hit== [unknown type]
-Node [/swarm_behavior]Publications: /leader [geometry_msgs/Point]
-Node [/swarm_node]Subscriptions: /leader_pos [unknown type]
两个节点之间分别订阅发布了不同的Topic(这是一种异步通信方式),犯罪嫌疑人是怎么对上暗号相互觉察到消息的呢?原来他们用到了remap。
>
>
我们侦探的第一次思路是这样的,
>
>
<!--The teleoperation node-->
>
<!--blue swarm group-->
>
>
>
>
>
>
>
>
>
>
>
<!--red swarm group-->
>
>
>
>
>
>
>
>
>
>
从图片上观察,我们的launch文件是整体缺少环节链接的。问题出现在什么地方?实际上我们的重新映射没有映射好的原因。
通过rostopic rosnode 来检查,会发现我们当前的rostopic list 里面并没有自己区分出来的订阅主题/leader_posb或者/leader_posr 然后我们出现的问题在于remap部分,重新整理一边线索更正。
>
>
<!--The teleoperation node-->
>
<!--blue swarm group-->
>
>
>
>
>
>
>
>
>
>
>
<!--red swarm group-->
>
>
>
>
>
>
>
>
>
>
>