一、句柄的构造及命名空间
(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: 默认返回的值