E-PUCK2-WIFI协议标准

通信基于TCP;机器人将创建一个TCP服务器并等待连接。默认端口:1000

每个数据包都由一个ID(1字节)标识。

以下ID用于将数据从机器人发送到计算机:

  • 0x00 =保留
  • 0x01 = QQVGA彩色图像数据包(仅第一段包含此ID);数据包大小(无ID)= 38400字节; 图像格式= RGB565
  • 0x02 =传感器数据包;数据包大小(无ID)= 104字节;返回值的格式基于高级sercom协议,并且与e-puck1.x兼容:

  • Acc:原始轴值,介于-1500和1500之间,分辨率为+ -2g
  • 加速:加速幅度,在0.0到2600.0(〜3.46 g)之间
  • 方向:0.0至360.0度之间

            0.0度         90.0度        180度            270度

              

  • 倾斜度:0.0至90.0度(在任何方向倾斜时)

             0.0度        90.0度

          

  • 陀螺仪(Gyro):原始轴值,介于-32768和32767之间,范围为+ -250dps
  • 磁力计(Magnetometer):原始轴值以浮点数表示,范围为+ -4912.0 uT(磁通密度以微特斯拉表示)
  • 温度(Temp):以摄氏度为单位的温度
  • 红外接近度:0(未检测到物体)和4095(传感器附近的物体)之间
  • 红外环境:0(强光)至4095(黑暗)
  • ToF距离(ToF):以毫米为单位给出的距离
  • 麦克风音量:0到4095之间
  • 电机步数:每转1000步
  • 电池(Battery):电池电压ADC值
  • uSD状态(uSD):如果存在micro sd且可以读取/写入,则为1,否则为0
  • 电视远程数据(TV remote):RC5协议
  • 选择器位置(Selector):0到15之间
  • 地面接近度:介于0(完全没有表面或没有反射表面,例如黑色)和1023(非常反射表面,例如白色)之间
  • 地面环境:0(强光)和1023(黑暗)之间
  • 按钮状态(Button):按下1个按钮,释放0个按钮
  • 保留(Reserved)0x03 =空数据包(仅发送ID);当没有传感器且没有图像请求时,这用作命令包的确认

以下ID用于将数据从计算机发送到机器人:

  •    0x80 =命令包;数据包大小(无id)= 20字节:

  • 请求(Request):
    • bit0:0 =停止图像流;1 =开始图像流
    • bit1:0 =停止传感器流;1 =启动传感器流
  • 设置(Settings):
    • bit0:1 =校准红外接近传感器
    • bit1:0 =禁用机载避障;1 =启用机载避障功能(尚未实施)
    • bit2:0 =设置电动机速度;1 =设置电机步进(位置)
  • 左右:当Settings的bit2为0时,则为所需的电动机速度(-1000..1000);这时1将被设置为电动机位置(步长)的值
  • LED:0 =熄灭; 1 =开
    • bit0:0 = LED1熄灭; 1 = LED1亮
    • bit1:0 = LED3熄灭; 1 = LED3亮
    • bit2:0 = LED5熄灭;1 = LED5亮
    • bit3:0 = LED7熄灭; 1 = LED7亮
    • bit4:0 =身体LED熄灭;1 =身体LED亮
    • bit5:0 =前LED熄灭;1 =前LED亮
  • RGB LED:对于每个LED,依次指定红色绿色蓝色(0 ... 100)的值
  • 声音ID:0x01 = MARIO,0x02 = UNDERWOLRD,0x04 = STARWARS,0x08 = 4KHz,0x10 = 10KHz,0x20 =停止声音

例如,要接收摄像机图像(流),需要执行以下步骤:
1)通过TCP连接到机器人
2)发送命令包:

0x80 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

3)读取ID(1字节)和QQVGA彩色图像包(38400字节)
4)转到步骤3

 

一段上位机控制机器人运动的代码:

void CommThread::connected()
{
    qDebug() << "connected...";
    emit updateUiState(UI_STATE_ROBOT_CONNECTED);

    output_buffer[0] = 0x80;
    output_buffer[1] = 0x02; // Bit0: start/stop image stream; bit1: start/stop sensors stream.
    output_buffer[2] = 0x00; // Behavior / others
    output_buffer[3] = 0x00; // Left speed LSB
    output_buffer[4] = 0x00; // Left speed MSB
    output_buffer[5] = 0x00; // Right speed LSB
    output_buffer[6] = 0x00; // Right speed MSB
    output_buffer[7] = 0x00; // LEDs
    output_buffer[8] = 0x00; // LED2 red
    output_buffer[9] = 0x00; // LED2 green
    output_buffer[10] = 0x00; // LED2 blue
    output_buffer[11] = 0x00; // LED4 red
    output_buffer[12] = 0x00; // LED4 green
    output_buffer[13] = 0x00; // LED4 blue
    output_buffer[14] = 0x00; // LED6 red
    output_buffer[15] = 0x00; // LED6 green
    output_buffer[16] = 0x00; // LED6 blue
    output_buffer[17] = 0x00; // LED8 red
    output_buffer[18] = 0x00; // LED8 green
    output_buffer[19] = 0x00; // LED8 blue
    output_buffer[20] = 0x00; // sound

    next_request = output_buffer[1];

    socket->skip(MAX_BUFF_SIZE); // Flush input buffer.
    socket->write((char*)&output_buffer[0], OUTPUT_BUFFER_SIZE);
}

  附录2:机器人底层接收部分

case 15:
	switch(demo15_state) {
		case 0:
			if(cam_advanced_config(FORMAT_COLOR, 0, 0, 640, 480, SUBSAMPLING_X4, SUBSAMPLING_X4) != MSG_OK) {
				set_led(LED1, 1);
			}
			cam_set_exposure(512, 0); // Fix the exposure to have a stable framerate.

			dcmi_set_capture_mode(CAPTURE_ONE_SHOT);

			if(dcmi_prepare() < 0) {
				set_led(LED5, 1);
			}

			spi_image_transfer_enable();

			//mpu9250_magnetometer_setup();

			// Flush the uart input to avoid interpreting garbage as real commands.
			while(chnReadTimeout(&SD3, (uint8_t*)&temp_rx, 1, MS2ST(1)>0)) {
				chThdSleepMilliseconds(1);
			}

			demo15_state = 1;
			break;

		case 1:
			run_asercom2();
			stop_loop = 1;
			break;
	}
	break;

  

示例:

1.前进

80 02 00 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  

原文地址:https://www.cnblogs.com/kay2018/p/12145187.html