例子
我们先随便看一个订阅器的回调函数:
void gpsCallback(const topic_demo::gps::ConstPtr &msg)
{
//计算离原点(0,0)的距离
std_msgs::Float32 distance;
distance.data = sqrt(pow(msg->x,2)+pow(msg->y,2));
//float distance = sqrt(pow(msg->x,2)+pow(msg->y,2));
ROS_INFO("Listener: Distance to origin = %f, state: %s",distance.data,msg->state.c_str());
}
开始的时候难以理解对于形参的传入方式。
个人理解
const topic_demo::gps::ConstPtr &msg
我们先来看没见过的 ::ConstPtr
的定义
typedef boost::shared_ptr< ::topic_demo::gps_<ContainerAllocator> > Ptr;
typedef boost::shared_ptr< ::topic_demo::gps_<ContainerAllocator> const> ConstPtr;
这是一对类型定义,::ConstPtr
可以理解为“指向常量消息的共享指针”,::Ptr
也可以理解为“指向(可修改)消息的共享指针”。它只是一种基于智能指针的轻量级消息传递方式。根据传递消息的接收者是否需要修改消息来选择正确的。
而 ::ConstPtr&
可以理解为“引用一个指向常量消息的共享指针”,::Ptr&
也可以理解为“引用一个指向(可修改的)消息的共享指针”。
这样的设计主要用于避免数据量较大的参数传递过程中拷贝析构函数进行复制操作。
评论区