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>&);
- https://github.com/ros/ros_comm/blob/060fd7653450de9c411a90a5a22188b4e06d2b90/clients/roscpp/include/ros/subscription_callback_helper.h#L144
- https://github.com/ros/ros_comm/blob/060fd7653450de9c411a90a5a22188b4e06d2b90/clients/roscpp/include/ros/parameter_adapter.h#L56-L66
使用 M::ConstPtr
(又名 shared_ptr<const M>
)而不是 const M&
可能更有效,因为如果您想存储整个消息并在以后使用它,您只需复制 shared_ptr。在您的示例中,由于您只是访问 msg.data
,所以这无关紧要。如果您的回调采用 M
而不是 const M&
,那么 ROS 将被迫复制消息。
为什么在 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>&);
- https://github.com/ros/ros_comm/blob/060fd7653450de9c411a90a5a22188b4e06d2b90/clients/roscpp/include/ros/subscription_callback_helper.h#L144
- https://github.com/ros/ros_comm/blob/060fd7653450de9c411a90a5a22188b4e06d2b90/clients/roscpp/include/ros/parameter_adapter.h#L56-L66
使用 M::ConstPtr
(又名 shared_ptr<const M>
)而不是 const M&
可能更有效,因为如果您想存储整个消息并在以后使用它,您只需复制 shared_ptr。在您的示例中,由于您只是访问 msg.data
,所以这无关紧要。如果您的回调采用 M
而不是 const M&
,那么 ROS 将被迫复制消息。