本案例采用ROS1提供的示例,程序进行演示。


本系列用时7天,博主也是从零开始,尽力去写的,如果发现了错误一定要私信告诉我呀。这么努力的博主,关注一下吧。

作者:杨丝儿
座右铭:始于兴趣,源于热爱,成于投入。
介绍:爱丁堡大学 人工智能专业。技术兴趣点集中在机器人、人工智能可解释性、数学、物理等等。
聊天吹水QQ群:兔叽的魔术工房 (942848525)
个人博客discover304.top
个人B站账号杨丝儿今天也在科学修仙(UP主跨站求个三连加关注)


:star:运行方法

  1. 执行$roscore来启动roscore
  2. 包下执行运行:$rosrun <包名> <包内可执行程序/python脚本> [<其他参数>]

:star:重命名

本来我以为重命名是个多么困难的任务,实践之后发现,这是个超级简单的小技巧。

一个机器人总会有很多重复的组件,像是两条手臂或者两对轮子,亦或是前后左右四个摄像头。我们可以采用重命名的方式对每一个组件上运行的程序进行整理,便于软件的开发和管理。

ROS中的重命名有三种,修改命名空间、修改节点名、修改主题/消息名。


:sparkles:命名的概念

首先了解ROS中的命名。ROS中的消息或者节点名称的规划类似计算机系统的路径的形式,使用反斜杠”/“隔开。

计算机中的文件夹对应ROS命名中的命名空间,计算机中的文件对应ROS命名中的节点名称。


:sparkles:命名效果

未命名的运行情况

1
2
3
4
5
6
7
8
9
10
11
12
# 终端1
rosmaster
# 终端2
rosrun rospy_tutorials talker
# 终端3
rosrun rospy_tutorials listener
# 终端4
rosrun rospy_tutorials talker
# 终端5
rosrun rospy_tutorials listener
# 终端6
rqt_graph

命名后的运行情况

1
2
3
4
5
6
7
8
9
10
11
12
# 终端1
rosmaster
# 终端2
rosrun rospy_tutorials talker __ns:=first __name:=talker
# 终端3
rosrun rospy_tutorials listener __ns:=first __name:=listener chatter:=/second/chatter
# 终端4
rosrun rospy_tutorials talker __ns:=second __name:=talker
# 终端5
rosrun rospy_tutorials listener __ns:=second __name:=listener chatter:=/first/chatter
# 终端6
rqt_graph

结构清晰,同时实现了两个命名空间的沟通。


:sparkles:重命名方法

在程序运行指令后按照下面的格式添加重命名规则。

  1. 命名空间重映射$rosrun <包名> <程序名> __ns:=<新命名空间名称>
  2. 节点重命名$rosrun <包名> <程序名> __name:=<新节点名>
  3. 消息重命名$rosrun <包名> <程序名> <消息名>:=<新消息名>

重点:以上三个语法可以同时使用。

如果当前路径下存在python代码程序,也可以直接使用$./<程序名> [<同上>]替换上面的指令。


:star:ROS Launch 启动

每次启动ROS的一个系统都需要走上面这么多的步骤,未免太繁琐了。

当然,你也可以把这些写成一个.bash脚本,一键启动。不过ROS为我们提供了自动化启动的方法叫做roslaunch。

不同于上文中的启动指令rosrun,这里我们使用roslaunch指令启动,语法是:$roslaunch <包名> <.launch文件名>


:sparkles:文件结构

.launch文件本质还是一个xml文件,基本结构如下

1
2
3
4
5
6
7
8
9
10
- launch
- node
- name="<节点名称>"
- ns="<命名空间>"
- pkg="<包名>"
- type="<软件名>"
- output="screen",这是一个调试的方法,输出到终端。调试完成后可以去掉,以保证终端的干净。
- 其他命名
- node
- ···

:sparkles:文件示例

本案例使用代码来自于:【机器人】ROS工程案例:基础部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<launch>
<node
name="publisher" ns="first"
pkg="communicate_bot" type="topic_publisher.py"
output="screen"/>
<node
name="subscriber" ns="first"
pkg="communicate_bot" type="topic_subscriber.py"
output="screen"/>
<node
name="publisher" ns="second"
pkg="communicate_bot" type="topic_publisher.py"
output="screen"/>
<node
name="subscriber" ns="second"
pkg="communicate_bot" type="topic_subscriber.py"
output="screen"/>
</launch>

:sparkles:运行效果

1
2
source devel/setup.bash
roslaunch communicate_bot communicate.launch

需要注意一个点,roslaunch在没有rosmaster的时候会自动启动一个,但因为这样做存在丢失master节点的风险,所以在真正部署的时候建议另起终端启动rosmaster。


:star:参考