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

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

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

Emitter

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

webots仿真——多机器人通信(C语言代码)_第1张图片

使用方法:

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

webots仿真——多机器人通信(C语言代码)_第2张图片

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

Step3:配置发射器参数

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

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

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

首先引用头文件

#include 

然后获取发送器的名称

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

 最后发送数据

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

Receiver

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

webots仿真——多机器人通信(C语言代码)_第3张图片

使用方法:

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

webots仿真——多机器人通信(C语言代码)_第4张图片

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

 Step3:配置接收器参数

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

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

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

首先引用头文件

#include 

然后获取接收器名称

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。接收器以队列的形式接收数据,如下图。

webots仿真——多机器人通信(C语言代码)_第5张图片

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


多机器人通信的情况

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

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

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

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

 

你可能感兴趣的:(Webots机器人仿真)