ros中一个cpp可以写两个节点不

ros中一个cpp可以写两个节点不,第1张

yright © 1999-2020, CSDN.NET, All Rights Reserved

c++

打开APP

Atarasin

关注

ROS:关于节点和节点句柄以及命名空间 原创

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}

)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11532153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存