- 首先就是选择single return模式,这样你在解析时就按照single模式进行拆包
- 其次就是选择转速600 rev/min,这样你的分辨率就确定了(即在设置页面设置频率)
- single模式返回如图:
激光雷达的参数,Laser ID不是ring
里面的数字是Laser_id
4.关于大端模式与小端模式:
struct FiringData
{
uint16_t flag; //!< 0xFFEE or 0xFFDD
uint16_t azimuth; //!< 比例因子 = 0.01deg
DistanceIntensity points[32]; //!< 32个激光器的距离和光强值
};
struct ScanPacket
{
//! 状态类型,仅对HDL-64E有效
enum StatusType
{
HOURS = 72,
MINUTES = 77,
SECONDS = 83,
DATE = 68,
MONTH = 78,
YEAR = 89,
GPS_STATUS = 71,
TEMPERATURE = 84,
FIRMWARE_VERSION = 86,
};
FiringData firing_data_blocks[12]; //!< 每帧数据包含12次发射
uint32_t timestamp; //!< 从当前小时开始,经历的微秒数,同步到GPS时间
/** 返回模式
* 0x37=最强回波, 0x38=最后一次回波, 0x39=两次回波
*/
uint8_t factory_byte1;
/** 设备类型
* 0x21=HDL-32E, 0x22=VLP-16/Punk LITE, 0x24=Puck Hi-Res
* 0x28=VLP-32C, 0x31=Velarray, 0xA1=VLS-128
*/
uint8_t factory_byte2;
uint8_t padding[2]; // 补丁字节,对齐用
};
memcpy(&scan_packets_[count], &data, 1206); // 读一个1206一次memcopy很重要 copy151次后 拿走去解析(memocopy共享指针给另一个线程
// 常见电脑是x86架构,因为激光雷达发过来小端格式,你可以直接Memory copy过去
// 要是大端格式读过来的数据不能直接Memory copy
// 比如小端格式存 unsigned int value = ox12345678
usigned char buf[4] ;
buf[3] = 12 buf[2] = 34 buf[1] = 56 buf[0] = 78(低地址存低字节)
// 所以 memcpy 从data[0]低地址中存的低字节开始 1206-> 给 scan_packets_[0]的低地址
// 即 scan_packets_[0]的低地址存低字节,那么
// azimuth = static_cast<float>(firing_data_block.azimuth); // 直接这样给值