【问题标题】:Accepting multiple data packets on a single receiver in WeBots在 WeBot 的单个接收器上接受多个数据包
【发布时间】:2023-02-22 03:55:48
【问题描述】:

我正在尝试对 e-puck 机器人上的接收器模块进行编程,以从多个发射器模块接收数据包及其相关信号强度。

我面临的问题是,当接收到新数据时,以前的数据包(尚未读取)丢失了(请参阅https://cyberbotics.com/doc/reference/receiver#field-summary 中的 bufferSize)。这意味着当 Webots 运行接收器模块的控制器时,只有来自最新发射器的数据存储在缓冲区中,并且所有其他数据(来自其他发射器)在控制器甚至有机会读取之前就已经丢失。

我尝试了几个不同的选项,但似乎都不起作用:

异步运行接收器控制器(通过将控制器的 SYNCHRONIZATION 设置为 FALSE)以更频繁地运行它并独立于 Webots 时间步长,以便它也有机会从其他发射器读取数据。似乎没有任何区别。

安排发射器一次发送一个数据,以便接收器可以处理信息。这可行,但它使系统对动态变化的响应非常缓慢。对于上下文,我正在尝试将接收器与至少 7 个发射器连接。

当任何数据被添加到接收器的缓冲区时,我考虑过有一个中断服务例程,但我找不到任何关于在 Webots 控制器中实现中断的相关文档。

我尝试减少接收器控制器的时间步长,以便它可以更频繁地运行并丢失更少的数据,但是 Webots 要求控制器时间步长是模拟时间步长的整数倍。这意味着接收器将始终与最新的发射器同时运行——让我们回到同样的问题。

我认为为了让我的模拟工作,我将不得不以比发射器快 7 倍(例如)的方式运行接收器,这样它每次运行时都会从每个发射器读取数据。或者,以某种方式更改接收器模块的缓冲区设置,以免丢失先前传输的数据。任何和所有建议表示赞赏。

TIA!

【问题讨论】:

    标签: c controller webots


    【解决方案1】:

    注意事项:

    1. 我是不是熟悉webots
    2. 我是轻微地熟悉ROS但远非专家。
    3. 我的 ROS 体验(在一个商业机器人项目上)是“边做边学 ROS”

      当我的进程“订阅”一个已发布的流时,基于我得到的“控制器”,控制器创建了一个“隐藏”线程,该线程在recv et 上循环。阿尔。并从流中保存最新状态。

      我的线程可以轮询控制器的状态。但是,它经常会说“没有新数据”。我的循环会查看时间戳,并尝试计算在发布新数据后它应该休眠到被唤醒的时间。

      这充满了问题,类似于你的问题。

      这是完成的,AFAICT,所以我的线程将是“同步的”。

      我想要的是“成为”处理所有传入消息的线程。我一直在寻找一种方法来从每个传入消息的隐藏线程中获取异步回调。不幸的是,这个项目在我想清楚之前就结束了。

      但是,我的感觉是我必须修改控制器以提供回调 [如果没有标准的机制来做到这一点——我没有机会找到]。

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多