diff --git a/car/CustomAutocan.md b/car/CustomAutocan.md index 0def465..84489ed 100644 --- a/car/CustomAutocan.md +++ b/car/CustomAutocan.md @@ -6,132 +6,177 @@ AutolaborM2采用串口通讯,通讯波特率为***115200***。通讯消息分 机器人有三种急停方式:硬件开关急停、手柄远程急停、软件消息急停。三种急停均可使得车辆立即停止。其中***硬件急停优先级最高***,直接切断电机供电。在发送急停消息后,可根据查询机器人状态信息来判断是否成功进入急停。如果发现机器人进入急停状态,可根据查询消息,判定急停触发的来源。 -车辆的运动控制采用两轮自行车模型,控制量为***前轮转角和后轮转速***。其中转速为***相对速度***,需要用户根据查询到的车辆最大速度,计算出相对速度大小。比如,查询到车辆最大速度为2m/s,想要让车辆按照1m/s的速度运行,则需要发送 v = 1/2 = 0.5。 +M2底盘为阿卡曼转向结构,机器人的运动控制采用***两轮自行车模型***,控制量为***前轮转角和后轮转速***。其中转速为***相对速度***,需要用户根据查询到的车辆最大速度,计算出相对速度大小。比如,查询到车辆最大速度为2m/s,想要让车辆按照1m/s的速度运行,则需要发送 v = 1/2 = 0.5。 + +机器人速度控制时,会检查TCU,左电机ECU,右电机ECU状态,如果状态异常,则不会执行控制指令。此时,会向上位机报告异常状态,异常状态中包括急停、编码器数据异常、电流保护和机械刹车。 ## 1、两种数据消息 * 无数据域消息 - * 长度:6字节(1字节帧头0xFE + 4字节消息类型 + CRC8校验) + * 长度:6个字节(1个字节帧头FE + 4字节消息类型 + CRC8校验) + +![NoDataPackage.png](./img/NoDataPackage.png) * 有数据域消息 - * 长度:14字节(1字节帧头0xFE + 4字节消息类型 + 8字节数据 + CRC8校验) + * 长度:14个字节(1个字节帧头FE + 4字节消息类型 + 8字节数据(小端模式) + CRC8校验) + +![WithDataPackage.png](./img/WithDataPackage.png) ## 2、查询指令 -* 查询指令: - * 4字节消息类型:0x0D,0x00,消息ID,0x00 -* 反馈指令: - * 4字节消息类型:0x2D,0x00,消息ID,0x00 - * 8个字节的数据字节解析参考下面的表格,不同消息ID解析方式不同。 -* 针对不同指令,只有第三位消息ID不同。 +* 查询指令:无数据域包 +* 反馈指令:有数据域包 +| 消息ID | 内容 | 反馈数据(8字节) | 数据含义 | +|------------|---------------|---------------------------------|------------------------------------------------| +| 0D 00 80 00| 状态 | [0]运行状态[1]-[7]保留 |10:正常运行 ff:急停状态 | +| 0D 00 11 00| 剩余容量百分比 | [0] uint8 [1]-[7]保留 | [0 100]% (采样频率=1Hz) | +| 0D 00 12 00| 剩余可用时间 | [0]-[3] uint32 [4]-[7]保留 | [0 360000]s (采样频率=1Hz) | +| 0D 00 13 00| 剩余容量 | [0]-[3] uint32 [4]-[7]保留 | [0 5000000]mAh (采样频率=1Hz) | +| 0D 00 14 00| 电池电压 | [0][1] uint16 [2]-[7]保留 | [0 500000]mV (采样频率=1Hz) | +| 0D 00 15 00| 电池电流 | [0]-[3] uint32 [4]-[7]保留 |[-750000 750000]mA 正:电池充电,负:电池放电(采样频率=1Hz) | +| 0D 00 17 00| 急停开关 | [0]bool[1]-[7]保留 |0:正常 1:急停 | +| 0D 00 18 00| 查询软急停 | [0]bool[1]-[7]保留 |0:正常 1:急停 | +| 0D 00 19 00| 查询手柄急停 | [0]bool[1]-[7]保留 | 0:正常 1:急停 | +| 0D 00 1a 00| 查询最大线速度 | [0]-[3]float [4]-[7]保留 |根据车轮大小计算出的最大线速度(m/s) | +| 0D 00 1b 00| 查询最大转角 | [0]-[3]float [4]-[7]保留 |根据机械结构得到的最大转角(rad) | +| 0D 00 1c 00| 查询车辆宽度 | [0]-[3]float [4]-[7]保留 |根据机械结构得到的车宽(m) | +| 0D 00 1d 00| 查询车辆长度 | [0]-[3]float [4]-[7]保留 |根据机械结构得到的车长(m) | +| 0D 00 1e 00| 查询轮半径 | [0]-[3]float [4]-[7]保留 |根据机械结构得到的车轮半径(m) | -| 消息ID | 内容 | 格式| 读/写|备注| -| --- | --- | --- | --- | --- | -| 0x80 | 状态 |无数据域
[0]运行状态[1]-[7]保留|写
读|0x10:正常运行 0xff:急停状态| -| 0x02 | 重置里程计 |无数据域|写|里程计的方向清零,即车辆朝向清零| -| 0x11 | 剩余容量百分比 |无数据域
[0] uint8 [1]-[7]保留|写
读|
[0,100]% (采样频率=1Hz)| -| 0x12 | 剩余可用时间 |无数据域
[0][1][2][3] uint32 [4]-[7]保留|写
读|
[0,360000]s (采样频率=1Hz)| -| 0x13 | 剩余容量 |无数据域
[0][1][2][3] uint32 [4]-[7]保留|写
读|
[0,5000000]mAh (采样频率=1Hz)| -| 0x14 | 电池电压 |无数据域
[0][1] uint16 [2]-[7]保留|写
读|
[0,500000]mV (采样频率=1Hz)| -| 0x15 | 电池电流 |无数据域
[0][1][2][3] uint32 [4]-[7]保留|写
读|
[-750000,750000]mA 正:电池充电,负:电池放电(采样频率=1Hz)| -| 0x16 | 手柄数据 | 无数据域
[0]-[7]详见 [手柄消息结构定义](#gamepad-struct) |写
读| | -| 0x17 | 急停开关 | 无数据域
[0]bool[1]-[7]保留|写
读|
0:正常 1:急停 | -| 0x18 | 查询软急停 | 无数据域
[0]bool[1]-[7]保留|写
读|
0:正常 1:急停 | -| 0x19 | 查询手柄急停 | 无数据域
[0]bool[1]-[7]保留|写
读|
0:正常 1:急停 | -| 0x1a | 查询最大线速度 | 无数据域
[0]-[3]float [4]-[7]保留 |写
读| 根据车轮大小计算出的最大线速度(m/s) | -| 0x1b | 查询最大转角 | 无数据域
[0]-[3]float [4]-[7]保留 |写
读| 根据机械结构得到的最大转角(rad) | -| 0x1c | 查询车辆宽度 | 无数据域
[0]-[3]float [4]-[7]保留 |写
读| 根据机械结构得到的车宽(m) | -| 0x1d | 查询车辆长度 | 无数据域
[0]-[3]float [4]-[7]保留 |写
读| 根据机械结构得到的车长(m) | -| 0x1e | 查询轮半径 | 无数据域
[0]-[3]float [4]-[7]保留 |写
读| 根据机械结构得到的车轮半径(m) | +***查询范例*** -***范例*** +| 指令 | 单位 | 写字节流 | +|---------|------|----------------------| +| 状态查询 | | `FE 0D 00 08 00 B2`| +| 剩余容量百分比 | |`FE 0D 00 11 00 B5`| +| 剩余可用时间 | 秒 |`FE 0D 00 12 00 E0`| +| 剩余容量 | mAh | `FE 0D 00 13 00 2A`| +| 电池电压 | 10mV | `FE 0D 00 14 00 4A`| +| 电池电流 | 1mA | `FE 0D 00 15 00 8E`| +| 急停开关 | | `FE 0D 00 17 00 1F`| +| 查询软急停 | | `FE 0D 00 18 00 07` | +| 查询手柄急停 | | `FE 0D 00 19 00 C3` | +| 查询最大线速度 | m/s | `FE 0D 00 1A 00 96` | +| 查询最大转角 | rad | `FE 0D 00 1B 00 52` | +| 查询车辆宽度 | m | `FE 0D 00 1C 00 3C` | +| 查询车辆长度 | m | `FE 0D 00 1D 00 F8` | +| 查询轮半径 | m | `FE 0D 00 1E 00 AD` | -| 指令 | 单位| 写字节流 | 反馈字节流 |含义 | -| ------------- | ------------- | ------------- | ------------- | ------------- | -|状态查询||0xFE,0x0D,0x00,0x80,0x00,0xB2|0xFE,0x2D,0x00,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09| 状态正常 | -|重置编码器||0xFE,0x0D,0x00,0x02,0x00,0x0C|| -|剩余容量百分比||0xFE,0x0D,0x00,0x11,0x00,0xB5|0xFE,0x2D,0x00,0x11,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79|容量100%| -|剩余可用时间|秒|0xFE,0x0D,0x00,0x12,0x00,0xE0|0xFE,0x2D,0x00,0x12,0x00,0x50,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0xCC|剩余50000s| -|剩余容量|mAh|0xFE,0x0D,0x00,0x13,0x00,0x24|0xFE,0x2D,0x00,0x13,0x00,0x50,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x02|剩余50000mAh| -|电池电压|10mV|0xFE,0x0D,0x00,0x14,0x00,0x4A|0xFE,0x2D,0x00,0x14,0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99|1.25V| -|电池电流|1mA|0xFE,0x0D,0x00,0x15,0x00,0x8E|0xFE,0x2D,0x00,0x15,0x00,0x4D,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x5A|2.125A| -|急停开关||0xFE,0x0D,0x00,0x17,0x00,0x1F|0xFE,0x2D,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58|急停开关按下| -|查询软急停||0xFE,0x0D,0x00,0x18,0x00,0x07|0xFE,0x2D,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26|软急停触发| -|查询手柄急停||0xFE,0x0D,0x00,0x19,0x00,0xC3|0xFE,0x2D,0x00,0x19,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE8|手柄急停按下| -|查询最大线速度|m/s|0xFE,0x0D,0x00,0x1A,0x00,0x96|0xFE,0x2D,0x00,0x1A,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x94|最大线速度1.5m/s| -|查询最大转角|rad|0xFE,0x0D,0x00,0x1B,0x00,0x52|0xFE,0x2D,0x00,0x1B,0x00,0x92,0x0A,0x06,0x3F,0x00,0x00,0x00,0x00,0xBC|最大转角:0.523Rad(30度)| -|查询车辆宽度|m|0xFE,0x0D,0x00,0x1C,0x00,0x3C|0xFE,0x2D,0x00,0x1C,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x9D| 0.5m| -|查询车辆长度|m|0xFE,0x0D,0x00,0x1D,0x00,0xF8|0xFE,0x2D,0x00,0x1D,0x00,0x66,0x66,0x26,0x3F,0x00,0x00,0x00,0x00,0x83| 0.65m| -|查询轮半径|m|0xFE,0x0D,0x00,0x1E,0x00,0xAD|0xFE,0x2D,0x00,0x1E,0x00,0x9A,0x99,0x19,0x3E,0x00,0x00,0x00,0x00,0xD2| 0.15m| +***查询结果:*** + +| 指令 | 反馈字节流 | 含义 | +|---------|-----------------------------------------------------------------------|---------------| +| 状态查询 | `FE 2D 00 80 00 10 00 00 00 00 00 00 00 09` | 状态正常 | +| 剩余容量百分比 | `FE 2D 00 11 00 64 00 00 00 00 00 00 00 79` | 容量100% | +| 剩余可用时间 | `FE 2D 00 12 00 50 C3 00 00 00 00 00 00 CC` | 剩余50000s | +| 剩余容量 | `FE 2D 00 13 00 50 C3 00 00 00 00 00 00 02` | 剩余50000mAh | +| 电池电压 | `FE 2D 00 14 00 7D 00 00 00 00 00 00 00 99` | 1.25V | +| 电池电流 | `FE 2D 00 15 00 4D 08 00 00 00 00 00 00 5A` | 2.125A | +| 急停开关 | `FE 2D 00 17 00 01 00 00 00 00 00 00 00 58` | 急停开关按下 | +| 查询软急停 | `FE 2D 00 18 00 01 00 00 00 00 00 00 00 26` | 软急停触发 | +| 查询手柄急停 | `FE 2D 00 19 00 01 00 00 00 00 00 00 00 E8` | 手柄急停按下 | +| 查询最大线速度 | `FE 2D 00 1A 00 00 00 C0 3F 00 00 00 00 94` | 最大线速度1.5m/s | +| 查询最大转角 | `FE 2D 00 1B 00 92 0A 06 3F 00 00 00 00 BC` | 最大转角:0.523Rad | +| 查询车辆宽度 | `FE 2D 00 1C 00 00 00 00 3F 00 00 00 00 9D` | 0.5m | +| 查询车辆长度 | `FE 2D 00 1D 00 66 66 26 3F 00 00 00 00 83` | 0.65m | +| 查询轮半径 | `FE 2D 00 1E 00 9A 99 19 3E 00 00 00 00 D2` | 0.15m | ## 3、控制指令(有数据域消息类型) -* 运动控制(v,theta) +* 运动控制(v theta) * 运动控制具有超时机制,需要在200ms内发送一帧数据,否则会认为数据超时,车辆停止运动。 - * v: 车辆最大速度的百分比,取值范围[-1,-1],对应从倒退最大速度到前进最大速度。 + * v: 车辆最大速度的百分比,取值范围[-1 -1],对应从倒退最大速度到前进最大速度。 * theta: 前轮转角,单位rad,弧度制。车辆向左转为正。 - * 4字节消息:0x2D,0x00,0x01,0x00 + * 4字节消息类型:`2D 00 01 00` * 8字节数据:前4字节表示v,后4字节表示theta * 数据类型:float - * 范例:0xFE,0x2D,0x00,0x01,0x00,0xCD,0xCC,0xCC,0x3D,0xCD,0xCC,0x4C,0x3E,0x82 + * 范例:`FE 2D 00 01 00 CD CC CC 3D CD CC 4C 3E 82` * 指令含义:v:0.1相对速度,theta:0.2rad -* 紧急停止指令(Emergency) - * 急停触发:0xFE,0x2F,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA - * 急停解除:0xFE,0x2F,0xFF,0xFF,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53 - * 该消息可以直接关停底盘的电机输出。 +* 重置里程计 + * 4字节消息类型:`0D 00 02 00` + * 范例:`FE 0D 00 02 00 0C` +* 驻车控制 + * 发送机械刹车指令 + * 4字节消息类型: `2D 00 03 00` + * 8字节数据:第一个字节表示是否刹车,1为刹车,0为释放 + * 刹车指令:`FE 2D 00 03 00 01 00 00 00 00 00 00 00 07` + * 释放刹车:`FE 2D 00 03 00 00 00 00 00 00 00 00 00 44` + +* 调整零位 + * 4字节消息类型: `2D 00 04 00` + * 8字节数据:前4个字节表示float,偏移量 + * 逆时针偏移1度: `FE 2D 00 04 00 00 00 80 BF 00 00 00 00 D6` + * 顺时针偏移1度: `FE 2D 00 04 00 00 00 80 3F 00 00 00 00 1D` + +* 紧急停止指令(Emergency) + * 4字节消息类型:`2F FF FF 00` + * 8字节数据:第1个字节表示急停类型,FF表示急停,10表示解除急停 + * 急停触发:`FE 2F FF FF 00 FF 00 00 00 00 00 00 00 DA` + * 急停解除:`FE 2F FF FF 00 10 00 00 00 00 00 00 00 53` + * 该消息可以直接关停底盘的电机输出。 ## 4、反馈消息 反馈消息将持续发送,40ms间隔。可以使用反馈消息作为车辆连接的依据。 +* 整车速度和转角 + * 4字节消息类型:`2D 00 20 00` + * 8字节数据内容:前4字节为车辆速度v,单位m/s。后4字节为前轮转角,单位rad。 + * 数据类型:float + * 里程计xy坐标 * 车辆上电后的位置,为里程计原点,车头方向为x,车左侧为y。 - * 4字节消息类型:0x2D,0x00,0x21,0x00 - * 8字节数据内容:前4个字节为x坐标,单位m。后字节为y坐标,单位m。 + * 4字节消息类型:`2D 00 21 00` + * 8字节数据内容:前4个字节为x坐标,单位m。后4字节为y坐标,单位m。 * 数据类型为float - * 范例:0xFE,0x2D,0x00,0x21,0x00,0xCD,0xCC,0xCC,0x3D,0xCD,0xCC,0x4C,0x3E,0x1A + * 范例:`FE 2D 00 21 00 CD CC CC 3D CD CC 4C 3E 1A` * 说明:x:0.1m y:0.2m - + * 里程计朝向 - * 车辆上电后的朝向,为0方向,逆时针为正。 - * 4字节消息类型:0x2D,0x00,0x22,0x00 + * 车辆上电后的朝向为0度,逆时针为正。 + * 4字节消息类型:`2D 00 22 00` * 8字节数据内容:前4个字节为朝向角,单位为rad。 * 数据类型为float - * 范例:0xFE,0x2D,0x00,0x22,0x00,0x9A,0x99,0x99,0x3E,0x00,0x00,0x00,0x00,0xD9 + * 范例:`FE 2D 00 22 00 9A 99 99 3E 00 00 00 00 D9` * 说明:0.3rad - + * 左电机速度 - * 4字节消息类型:0x2D,0x11,0x11,0x00 + * 4字节消息类型:`2D 11 11 00` * 8字节数据内容:前4个字节为速度,单位rad/s * 数据类型:float - * 范例:0xFE,0x2D,0x11,0x11,0x00,0xCD,0xCC,0xCC,0x3D,0x00,0x00,0x00,0x00,0xC5 + * 范例:`FE 2D 11 11 00 CD CC CC 3D 00 00 00 00 C5` * 含义:0.1rad/s,如果要转换为m/s,需要乘以车轮半径 - + * 右电机速度: - * 4字节消息类型:0x2D,0x10,0x11,0x00 + * 4字节消息类型:`2D 10 11 00` * 8字节数据内容:前4个字节为速度,单位rad/s * 数据类型:float - * 范例:0xFE,0x2D,0x10,0x11,0x00,0xCD,0xCC,0x4C,0x3E,0x00,0x00,0x00,0x00,0xB4 + * 范例:`FE 2D 10 11 00 CD CC 4C 3E 00 00 00 00 B4` * 含义:0.2rad/s,如果要转换为m/s,需要乘以车轮半径 - + * 转向角度: - * 4字节消息类型:0x2D,0x20,0x11,0x00 + * 4字节消息类型:`2D 20 11 00` * 8字节数据内容:前4个字节为角度,单位rad * 数据类型:float - 范例:0xFE,0x2D,0x20,0x11,0x00,0xCD,0xCC,0xCC,0x3D,0x00,0x00,0x00,0x00,0x26 + 范例:`FE 2D 20 11 00 CD CC CC 3D 00 00 00 00 26` * 含义:0.1rad,正方向为向左转 +* 异常状态报告: + * 4字节消息:`2D 00 23 00` + * 8字节数据内容:[0]:TCU状态;[1]:左轮ECU状态 [2]:右轮ECU状态。每个字节0位为急停,1位为数据超时,2位为电流超限,3位为刹车状态 + * 范例:`FE 2D 00 23 00 01 02 05 00 00 00 00 00 0E` + * 含义:TCU节点急停状态,左轮ECU编码器数据超时,右轮ECU急停状态且电流超限。 ## 5、CRC8校验 * 使用CRC-8/MAXIM方式计算 -* 示例:在线计算crc8 +* 示例:在线计算crc8(http://www.ip33.com/crc.html) -![img](img/crc8-maxim.png) +![img](./img/crc8-maxim.png) @@ -139,24 +184,24 @@ AutolaborM2采用串口通讯,通讯波特率为***115200***。通讯消息分 ``` const uint8_t CRC8Table[]={ - 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, - 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, - 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, - 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, - 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, - 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, - 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, - 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, - 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, - 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, - 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, - 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, - 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, - 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, - 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, - 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 }; + 0 94 188 226 97 63 221 131 194 156 126 32 163 253 31 65 + 157 195 33 127 252 162 64 30 95 1 227 189 62 96 130 220 + 35 125 159 193 66 28 254 160 225 191 93 3 128 222 60 98 + 190 224 2 92 223 129 99 61 124 34 192 158 29 67 161 255 + 70 24 250 164 39 121 155 197 132 218 56 102 229 187 89 7 + 219 133 103 57 186 228 6 88 25 71 165 251 120 38 196 154 + 101 59 217 135 4 90 184 230 167 249 27 69 198 152 122 36 + 248 166 68 26 153 199 37 123 58 100 134 216 91 5 231 185 + 140 210 48 110 237 179 81 15 78 16 242 172 47 113 147 205 + 17 79 173 243 112 46 204 146 211 141 111 49 178 236 14 80 + 175 241 19 77 206 144 114 44 109 51 209 143 12 82 176 238 + 50 108 142 208 83 13 239 177 240 174 76 18 145 207 45 115 + 202 148 118 40 171 245 23 73 8 86 180 234 105 55 213 139 + 87 9 235 181 54 104 138 212 149 203 41 119 244 170 72 22 + 233 183 85 11 136 214 52 106 43 117 151 201 74 20 246 168 + 116 42 200 150 21 75 169 247 182 232 10 84 215 137 107 53 }; -uint8_t can_crc8_calculate(uint8_t *p, uint8_t counter) +uint8_t can_crc8_calculate(uint8_t *p uint8_t counter) { uint8_t crc8 = 0; for( ; counter > 0; counter--){ diff --git a/car/img/NoDataPackage.png b/car/img/NoDataPackage.png new file mode 100644 index 0000000..f670d0b Binary files /dev/null and b/car/img/NoDataPackage.png differ diff --git a/car/img/WithDataPackage.png b/car/img/WithDataPackage.png new file mode 100644 index 0000000..d9b1edb Binary files /dev/null and b/car/img/WithDataPackage.png differ