ROS NodeHandle 句柄

  • Post author:
  • Post category:其他


一、句柄的构造及命名空间


(1)阐述:


1.

ros基本组件分为nodes、Parameters、Topics和Services。每个组件都带有一个命名空间。

2.Ros命名空间规则如下:

组件名格式是:第一级名字/第二级名字/第三级名字/第四级名字。对于一个具体的Parameters、Topics和Services可以没有第二和第三级名字。

(1) 第一级名字由命名空间<name_space>负责,如果句柄不是private的,且有<NodeHandle_name>,那么命名空间为<name_space>/<NodeHandle_name>

(2) 第二级名字在句柄被声明为private的条件下使用,当NodeHandle被声明为私有时,命名空间为<node_namespace>/<node_name>/<NodeHandle_name>。

(3)第三级名字就是<NodeHandle_name>,仅声明这个”~”表示无<NodeHandle_name>, 有<NodeHandle_name>的这样声明”~/<NodeHandle_name>”。

(4)第四级名字由{Parameters,Topics,Services}名字确定。

(2)具体实例

注意node_namespace 和node_name的区别。

// node_namespace 在launch文件中声明,这里表示为node_namespace

// 声明节点名字
ros::init(argc,argv,"node_name");


//(1)直接生成句柄
//命名空间为/node_namespace
ros::NodeHandle n;

//父句柄和子句柄
//命名空间为/node_namespace/sub
ros::NodeHandle n1("sub");
//命名空间为/node_namespace/sub/sub2
ros::NodeHandle n2(n1,"sub2");
//这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。

//命名空间为/node_namespace/node_name
ros::NodeHandle pn1("~");

// pn2和pn3两种声明方式一样
//命名空间为/node_namespace/node_name/sub
ros::NodeHandle pn2("~sub");
//命名空间为/node_namespace/node_name/sub
ros::NodeHandle pn3("~/sub");

//使用"/"来声明全局
//命名空间为/node_namespace
ros::NodeHandle gn("/global");

二、NodeHandle::param()

param()函数从参数服务器取参数值给变量。如果无法获取,则将默认值赋给变量。

ros::nodehandle::param(const std::string & param_name,T & param_val,const T & default_val )

此方法尝试从参数服务器检索指示的参数值,并将结果存储在param_val中。 如果无法从服务器检索该值,则使用default_val。

三、NodeHandle::advertise()

Publisher ros::NodeHandle::advertise(
const std::string & topic, 
uint32_t queue_size,
const SubscriberStatusCallback & connect_cb, 
const SubscriberStatusCallback & disconnect_cb = SubscriberStatusCallback(), 
const VoidConstPtr & tracked_object = VoidConstPtr(), 
bool latch= false)


用来创建一个Publisher,发布话题,返回Publisherr。


topic:话题名称


queue_size:用于存储话题信息的队列容量


connect_cb:当有subscriber订阅到这个话题后,要调用的回调函数。


disconnect_cb:当有subscriber与订阅话题失去连接后,要调用的回调函数。


tracked_object:


latch:如果设置为true,那么这个话题发布的最后一个消息,将会被保存起来,并且后续如果有subscriber订阅的话,会发送最后一个消息。

四、NodeHandle::subscribe()

Subscriber ros::NodeHandle::subscribe(
const std::string & topic, 
uint32_t queue_size, void(T::*)(M) fp, 
T* obj, 
const TransportHints & transport_hints = TransportHints())


用来创建一个subscriber,订阅话题,返回subscriber。


topic:订阅的话题


queue_size:消息缓冲队列长度


fp:消息到达时的回调函数,


transport_hints:


五、NodeHandle::param()

bool ros::NodeHandle::param(
const std::string & param_name,
T & param_val,
const T & default_val) const 
    


c++ 函数前面和后面 使用const 的作用:

  • 前面使用const 表示返回值为const
  • 后面加 const表示函数不可以修改class的成员

尝试从parameter server处获取参数,参数保存到param_val中,没有则返回默认值

param_name: 参数名

param_val: 传入参数的变量

default_val: 默认返回的值



版权声明:本文为qq_29703971原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。