ros回调函数参数解释

Ros callback function parameter explained

为什么在 ROS 中调用回调函数时会出现 header 如下所示:

void error_sub(const std_msgs::UInt16::ConstPtr& msg);

来自以下定义

void error_sub(const std_msgs::UInt16::ConstPtr& msg)
 {
    ROS_INFO("I heard: [%d]", msg->data);
    error = msg->data;
 }

如果你只是delcare它,问题出在哪里:

void error_sub(const std_msgs::UInt16& msg);

并将其定义为:

void error_sub(const std_msgs::UInt16& msg)
 {
    ROS_INFO("I heard: [%d]", msg.data);
    error = msg.data;
 }

两者都可以,因为 ParameterAdapter 是如何调用订阅回调的。其实回调函数签名有很多种:

void callback(const boost::shared_ptr<M const>&);  // (const M::ConstPtr&)
void callback(const boost::shared_ptr<M>&);        // (const M::Ptr&)
void callback(boost::shared_ptr<M const>);         // (M::ConstPtr)
void callback(boost::shared_ptr<M>);               // (M::Ptr)
void callback(const M&);
void callback(M);
void callback(const MessageEvent<M const>&);
void callback(const MessageEvent<M>&);

使用 M::ConstPtr(又名 shared_ptr<const M>)而不是 const M& 可能更有效,因为如果您想存储整个消息并在以后使用它,您只需复制 shared_ptr。在您的示例中,由于您只是访问 msg.data,所以这无关紧要。如果您的回调采用 M 而不是 const M&,那么 ROS 将被迫复制消息。