ROS1教程 5:Roslaunch与ROS1计算图
1. Roslaunch与launch文件
1.1 需求
一个程序中可能需要启动多个节点,例如:
ROS1
内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动roscore
、乌龟界面节点、键盘控制节点。如果每次都调用rosrun
逐一启动,显然效率低下,如何优化?
官方给出的优化策略是使用 launch
文件,可以一次性启动多个 ROS1
节点。
1.2 实现
下面我们举一个使用launch
运行前面的hello_world
例程,同时运行turtlesim
小乌龟例程
ROS1
的文件系统中要求,所有launch
文件要放在功能包的launch
文件夹下,因此在选定的功能包中添加launch
文件夹
cd 工作目录/src
catkin_create_pkg launch_test rospy roscpp std_msgs
mkdir launch_test/launch
touch launch_test/launch/tuetle.launch
然后编辑turtle.launch
文件
<launch>
<node pkg="helloworld" type="hello" name="hello" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
</launch>
其中:
node
:xml
标签,表示要运行一个节点pkg
:要运行的节点所在的功能包type
:要运行的节点的可执行文件name
:运行后节点的名称output
设置日志的输出目标
运行之后:
2. ROS1计算图
2.1 计算图简介
前面介绍的ROS1
文件结构,是磁盘上ROS1
程序的存储结构,是静态的,而ROS1
程序运行之后,以节点表现出来的进程之间的关系是错综复杂的,ROS1
中提供了一个实用的工具:rqt_graph
来方便我们直观的看到各个节点之间的关系。
rqt_graph
能够创建一个显示当前系统运行情况的动态图形。ROS1
分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph
是rqt
程序包中的一部分。
2.2 计算图安装
如果前面安装ROS1
的时候,把所有的功能包(package
)都已经安装完成,则直接在终端窗口中输入
rosrun rqt_graph rqt_graph
就可以运行。如果未安装则在终端中输入下面的命令进行安装:
sudo apt install ROS1-<distro>-rqt
sudo apt install ROS1-<distro>-rqt-common-plugins
如果遇到没有PyQt5
、PySide2
的报错的话,则运行下面的命令进行安装
python -m pip install PyQt5
python -m pip install PySide2
因为PyQt
和PySide
两个都是用于显示GUI
窗口的库,因此没有的话肯定就会报错,所以安装一下就行
如果报错没有Pydot
也是一样的,安装即可
python -m pip install pydot
因为rqt_graph
需要显示由一个一个节点组成的节点图,具体来说,rqt_graph
通过Graphviz
来显示节点图。而Graphviz
是一个开源的,专门用于图的可视化的库。PyDot
就是Graphviz
的Python
前端。
安装完了之后,就可以正常运行rqt_graph
了。但是有一个问题,主要是因为ROS1
中的rqt_graph
功能包和当前的环境中的Python
里的PyQt
版本存在不兼容的问题,所以如果按照
rosrun rqt_graph rqt_graph
来运行的话,就会调用当前环境中的Python
来运行rqt_graph
包中的Python
代码,则此时就会因为当前环境的Python
的PyQt
版本问题,会有一个报错:
ValueError: PyCapsule_GetPointer called with incorrect name
这个就是因为后续新版本的PyQt5
该了API
的名字,所以有一个报错。但是这个报错不影响功能,就是会显示一个圆圈。
但是看着真的不舒服,所以直接运行rqt_graph
来使用ROS1
自带的Python
rqt_graph
2.3 显示计算图
接下来以ROS1
内置的小乌龟案例来演示计算图
首先,按照前面所示,运行小乌龟例程
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
然后,启动新终端:
rosrun rqt_graph rqt_graph
或者
rqt_graph
按照上面说的,如果第一种方式报错的话,就运行第二种即可。可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。