侧边栏壁纸
  • 累计撰写 129 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录
ROS   

ROS回调函数的形参传递过程

例子

我们先随便看一个订阅器的回调函数:

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& 也可以理解为“引用一个指向(可修改的)消息的共享指针”。
这样的设计主要用于避免数据量较大的参数传递过程中拷贝析构函数进行复制操作。

0

评论区