首先,先明确一下与节点相关术语的含义:
Nodes:节点,一个节点即为一个可执行程序,它可以通过ROS与其他节点通信,另外,一个catkin程序包里可以有很多节点。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题,是一个载体。
Topics:话题,节点可以向话题发布消息或可以向话题订阅消息,像通信中转站一样。
Master:节点管理器,ROS名称服务。
rosout:相当于std::cout
roscore:是在运行所有ROS程序前首先要运行的命令。
运行ros节点的方法:
一般有两种:
第一种:使用rosrun,在设置完环境变量后,可以使用包名来直接运行一个包内的节点。
用法:
$rosrun [package_name] [node_name]
注意:这种方法需要新打开一个终端 运行
$roscore
第二种:使用roslaunch
用法:
$roslaunch [package] [fliename.launch]
launch是个文件,用launch文件来运行程序相对于rosrun的优点有两个
<1>可以向程序传参
<2>可以同时运行多个节点
launch文件结构
<launch> <!--第1个节点--> <node pkg="包名" type="包内可执行程序名字" name="节点名"> <!--注释内容--> <para name="程序中的数值或布尔参数" value="" /> <para name="程序中的字符串参数" value=" " type="str" /> ... <node> ... <!--第n个节点--> <node pkg="包名" type="包内可执行程序名字" name="节点名"> <!--注释内容--> ... <node> </launch>
注意:
<1>包内可执行程序名由包内CMakeLists.txt控制生成。
<2>在每个可执行程序的main里都会有定义节点的语句,这里的节点名字只是用于代码编译,和launch文件的节点名不是一回事。
比如:
int main (int argc, char **argv)
{
ros::init(argc,argv,"节点名字");
}