在一个简单的ros2工作空间中,一般有一下几个文件夹,
1、src
2、install
3、build
4、log
其中,存放功能包项目的文件夹在src中,一般情况下,当我们要创建一个功能包项目的时候,要在src文件夹下输入以下命令:
ros2 create pkg +my_cpp_node(功能包项目名)
上述命令后我们会在src文件夹下面得到一个功能包项目文件夹,这个文件夹的架构是
由于四部分组成:include文件夹、src文件夹、cmakelists.txt、package.xml。
其中my_cpp_node是我们所创建的功能包项目的名称。src文件夹中的my_firsrt_node.cpp是我们写的源文件。include/my_cpp_node文件夹下放我们的hpp格式的头文件。
注意1:那么我们的节点名称在哪里命名呢?
答案是在my_firsrt_node.cpp文件中,如下所示:
我们的节点名称是 cpp_node,在终端输入 ros2 node list查看:
为了验证这一点,我们修改节点名称为cpp_node_test:
编译运行后,用命令 ros2 node list查看:
可见节点名称已经变为cpp_node_test。
注意2:那么我们的功能包的名称在哪里命名呢?
我们一开始创建功能包项目时候用的命令是:ros2 create pkg +my_cpp_node,
这里生成的my_cpp_node文件夹是功能包项目的文件夹的名称,而并不是我们功能包的名称,功能包的名称是能够在我们运行命令 ros2 run + 功能包名+ 可执行程序 这个命令调用的名称,这个功能包的名称在cmakelist.txt文件和package.xml文件中命名。
cmakelist.txt文件:
package.xml文件:
由上可知,我们把整个功能包名字命名为my_cpp_pkg22
编译后 在终端运行命令 ros2 run my_cpp_pkg22 +可执行程序名称 即可。
但是一般情况下功能包项目的名称(ros2 create pkg+功能包项目名称 创建的功能包项目)和功能包(在cmakelist.txt文件和package.xml文件中命名的功能包名称)的名称要一致!
注意三:那么我们的可执行程序在哪里命名呢?
在cmakelists.txt文件中:
编译后 运行命令:ros2 run my_cpp_pkg22 cpp_node1
理解上述就能明白功能包、可执行程序、节点之间的关系!一个功能包项目可以有好几个可执行程序,也可以包含好几个节点。节点在可执行程序基础上建立,同一个可执行程序可以通过重映射创建不同的节点,相当于给复制节点并且重命名:
在终端输入命令:
ros2 run my_cpp_pkg22 cpp_node1 ros=args --ros-args --remap __node:=cpp_node2:
查看节点:
发现节点名称改成了cpp_node2,其中,可执行程序和功能包还是原来的,只不过我们重映射了一个新的节点 名称是cpp_node2.