关于订阅器无法接收发送器发送的第一个数据

关于订阅器无法接收发送器发送的第一个数据

发布器最好在程序一开始就设置好,否则可能会出现数据无法准确被接收的情况。如以下程序所示,我把发布器的定义放在了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
    

    加入延时函数后,问题解决了。这也从侧面说明了是时间不够的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值