关于订阅器无法接收发送器发送的第一个数据
发布器最好在程序一开始就设置好,否则可能会出现数据无法准确被接收的情况。如以下程序所示,我把发布器的定义放在了server的回调函数中,会出现第一次发布的数据无法被订阅器接收到的情况,但接下来发布的数据却可以被准确接收到。可能的原因是在第一次发布数据时,该发布器还没有完成与master
的交互(时间太快),因此master
无法建立发布器与订阅器之间的正确连接。
class TurtleControlService
{
private:
ros::NodeHandle n_;
ros::ServiceServer service_;
ros::Publisher pub_;
public:
TurtleControlService()
{
// 创建一个名为/turtle_control的服务,注册回调函数turtleControlCallback
service_ = n_.advertiseService("/turtle_control", &TurtleControlService::turtleControlCallback, this);
}
// service回调函数,输入参数req,输出参数res
bool turtleControlCallback(mytursim::TurtleControl::Request &req, mytursim::TurtleControl::Response &res)
{
// 创建一个Publisher,发布名为/is_start的topic,消息类型为mytursim::TurtleControlMsg
pub_ = n_.advertise<mytursim::TurtleControlMsg>("/is_start", 10);
...
}
};
-
解决办法1:把发布器定义放在程序的最开始,以程序为例,可以放在类的构造函数中。如此问题就解决了;
-
解决方法2:在定义发布器后,可以使用延时函数延时一段时间,让发布器顺利地在
master
登记。可以使用以下函数延迟:ros::Duration(0.5).sleep(); // 延迟0.5s
加入延时函数后,问题解决了。这也从侧面说明了是时间不够的问题。