webots仿真——多机器人通信(C语言代码)

Webots中提供了无线通信模块:

  •  Emitter:通信发射模块
  •  Receiver:通信接收模块

Emitter

Emitter用来发射无线电、串口或红外通信信号。只能发送数据,不能接收数据。

使用方法:

Step1:添加一个robot节点,在robot节点的children子节点下添加emitter节点。

Step2:在emitter节点的children子节点下添加shape,为发射器建立一个三维外形。 (该步骤可以不做)

Step3:配置发射器参数

  •  type:用来设置信号的类型。“radio”指无线电(即最常用的无线通信),“serial”指串口通信,“infra-red”指红外通信。默认为无线电模式。其中红外通信会受到障碍物遮挡,无线电不受障碍物影响。
  •  range:通信距离,以米为单位。当该项为-1时,通信距离无穷远。
  •  channel:通信通道,整数。接收器和发送器的通信通道号必须一致,才能建立通信。当该项为-1时,发射器在所有通道进行广播。
  •  baudRate:波特率,影响数据传输速度。当为-1时,传输速度无限快,数据包瞬间到达。

Step4:命名。在emitter节点下的name项,命名为“emitter”。该命名将会在控制器程序中使用。

Step5:编写发送程序。本例程使用C语言编写。

首先引用头文件

#include <webots/emitter.h>

然后获取发送器的名称

char emitterd[9] = "emitter";
WbDeviceTag emitter = wb_robot_get_device(emitterd);

 最后发送数据

float a = 0.0001;
wb_emitter_send(emitter,&a,sizeof(float));

Receiver

Receiver用来接收无线电、串口或红外通信信号。只能接收数据,不能发送数据。

使用方法:

Step1:添加一个robot节点,在robot节点的children子节点下添加receiver节点。

 Step2:在receiver节点的children子节点下添加shape,为接收器建立一个三维外形。 (该步骤可以不做)

 Step3:配置接收器参数

  •  type:用来设置信号的类型。“radio”指无线电(即最常用的无线通信),“serial”指串口通信,“infra-red”指红外通信。默认为无线电模式。其中红外通信会受到障碍物遮挡,无线电不受障碍物影响。
  •  range:通信距离,以米为单位。当该项为-1时,通信距离无穷远。
  •  channel:通信通道,整数。接收器和发送器的通信通道号必须一致,才能建立通信。当该项为-1时,接收器监听所有通道的数据。
  •  baudRate:波特率,影响数据传输速度。当为-1时,传输速度无限快,数据包瞬间到达。

Step4:命名。在receiver节点下的name项,命名为“receiver”。该命名将会在控制器程序中使用。

Step5:编写接收程序。本例程使用C语言编写。

首先引用头文件

#include <webots/receiver.h>

然后获取接收器名称

char receiverd[10] = "receiver";
WbDeviceTag receiver = wb_robot_get_device(receiverd);

激活接收器

wb_receiver_enable(receiver,10);

 接收数据

while(wb_receiver_get_queue_length(receiver)>0){
    const char *message = wb_receiver_get_data(receiver);
    float *p = (float* )message;
    wb_receiver_next_packet(receiver);
}

 其中接收数据代码中,涉及到几个函数:wb_receiver_get_queue_length()、wb_receiver_get_data()和wb_receiver_next_packet()。解释如下。

例如,发送器连续调用三个wb_emitter_send函数,发送了三个float数:1.1,2.2,3.0。接收器以队列的形式接收数据,如下图。

wb_receiver_get_queue_length() 用来读取队列长度,wb_receiver_get_data()用来读取当前包的数据,wb_receiver_next_packet()用来跳到下一个包。当队列长度为0,表示队列已经读取完毕。


多机器人通信的情况

当环境中有多于两个机器人时,即存在多个接收器和发射器时,依旧可以进行通信。当一个发射器以channel 1 发送数据时,所有监听channel 1 的接收器们都能收到这一数据。

当进行完全异步的通信时,由于通信数据发送的时间是未知的,因此webots提供了三个机制,保证通信可靠性:

  •  接收数据队列机制,缓存到达的数据;
  •  webots保证按照发送的顺序接收数据,不会乱序;
  •  多机器人按照顺序执行控制器程序,即一个机器人运行一个循环后下一个机器人再运行,因此一个机器人连发三个数据的过程不会被打断。

因此,在多个机器人通信时,可以在一串数据之前发送一个机器人id,以标识该条数据由哪个机器人发送而来。

 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值