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,以标识该条数据由哪个机器人发送而来。