c++
打开APP
Atarasin
关注
2021-02-22 19:12:36
25点赞
Atarasin
码龄4年
关注
ROS:关于节点和节点句柄以及命名空间
参考资料:ROS官方文档
首先,我们需要明确的是 节点 和 节点句柄 是不同的。一般而言,一个cpp文件只能启动一个ROS节点,但作为该节点的句柄却可以设置多个。
The ros::NodeHandle class serves two purposes. First, it provides RAII-style startup and shutdown of the internal node inside a roscpp program. Second, it provides an extra layer of namespace resolution that can make writing subcomponents easier.
如上所言,节点句柄类有两个作用:
在一个roscpp程序中,节点句柄可以启动或关闭一个ROS内部节点;
节点句柄可以增加一层命名空间,可以为编写组件提供便利。
1.启动或关闭节点
创建一个节点句柄最简单的方式如下所示:
ros::NodeHandle nh
1
1
在创建节点句柄时,若内部节点还未启动,则创建的句柄会启动该节点。一旦该节点所有的句柄实例(同一个cpp程序下创建的都是同一个节点的句柄)都被销毁,则该节点也会自动关闭。这句话也从侧面说明了,一个节点可以创建多个句柄。
On creation, if the internal node has not been started already, ros::NodeHandle will start the node. Once all ros::NodeHandle instances have been destroyed, the node will be automatically shutdown.
2.命名空间
节点句柄的另一个构造函数形式可以让我们自定义命名空间:
ros::NodeHandle nh("my_ns") // <node_namespace>/my_ns
1
1
若存在节点命名空间,如在launch文件中启动该节点时加入ns="node_ns",则命名空间为node_ns/my_ns;
若不存在节点命名空间,则为my_ns。
另外也可以创建多个节点句柄,然后为某个句柄设置父节点句柄:
ros::NodeHandle nh1("ns1") // <node_namespace>/ns1
ros::NodeHandle nh2(nh1, "ns2") // <node_namespace>/ns1/ns2
1
2
1
2
此外,还有两种命名方式:
全局命名
ros::NodeHandle nh("/my_global_namespace") // /my_global_namespace(不受外部命名影响)
1
1
注意:在ROS的命名中,加或不加/是存在区别的。 若加上/,说明这是一个全局命名,则无法再被放入一个命名空间当中;若不加/,则可以通过如launch中设置ns,使得该命名被放入到该命名空间当中。比如,我定义了两个发布器,发布话题分别为/cmd_vel与cmd_vel,此外若外部还存在一个命名空间为dwa_planner,则它们的命名分别变为
/cmd_vel =>/cmd_vel
cmd_vel =>/dwa_planner/cmd_vel
私有命名
// 1.~+name
ros::NodeHandle nh("~my_private_ns")
ros::Subscriber sub = nh.subscribe("my_private_topic", ...) // <node_namespace>/<node_name>/my_private_ns/my_private_topic
// 2.~
ros::NodeHandle nh("~")
ros::Subscriber sub = nh.subscribe("my_private_topic", ...) // <node_namespace>/<node_name>/my_private_topic
1
2
3
4
5
6
7
1
2
3
4
5
6
7
私有命名与上述提到的命名都不同,它会把原本命名放入到<node_name>下。因此,上面订阅器的话题的命名如下:
使用ros_qtc_plugin插件新建项目使用插件新建项目Import ROS
Workspace选项仅新建工作空间导入现工作空间新建文件ROS面Package、Basic
Node等选项创建package节点、launch文件、urdf文件等
现我创建新catkin工作空间,并且面创建package
1、新建项目
文件——新建文件或项目选择Import ROS Workspace——choose图
填写catkin工作空间名字位置图
我Namecatkin工作空间文件夹名字相同(同)名catkin_new选择浏览——创建文件夹创建名catkin_new文件夹图按车再选择打
现框询问新建工作空间未初始化否执行初始化我选择yes
相于执行catkin_init_workspace命令使工作空间初始化
点击Generate Project File再点击步
项目管理步骤配置版本控制系统我选择完图
建工作空间catkin_new空图
2、创建package
接我工作空间创建新package
catkin_new面src右键单击选择添加新文件图
选择ROS——package——choose
填写package名字test1
填写作者(Authors)维护者(Maintainers)Qt环境部没配置文支持请要用文否则新建package或者新建package面package.xml空文件
DependenciesCatkin栏填写依赖通用C++写节点需要添加roscpp依赖
图
点击完
3、添加新节点
目前package空没任何节点
我test1src文件夹右键单击选择添加新文件
选择ROS——Basic Node——choose创建节点新建.cpp文件
节点名称写node1则名node1.cpp源文件
用ROS模板新建node1.cpp源文件图自Hello World程序
4、编译节点
让编译执行文件我需要编辑test1makefile图
test1CMakeLists.txt加面几行意思node1.cpp编译名node1节点
add_executable(node1 src/node1.cpp)
target_link_libraries(node1
${catkin_LIBRARIES}
)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)