通信基于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 =停止声音
- 请求(Request):
例如,要接收摄像机图像(流),需要执行以下步骤:
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