Python 位操作以从激光雷达传感器中获取可用数据

Python bit manipulation to get usable data out of a lidar sensor

我正在尝试为激光雷达传感器编写一个 python 驱动程序,该传感器只有 package 用于机器人 OS。

我能够在 Raspberry Pi 上进行通信,并且我正在获取我需要的数据。

我以前从未真正使用过 bytearrays,甚至 python 对我来说都是新手。

The received data looks like this (png), but you can take a look at the documentation (pdf) 还有。

所以如果我没记错的话,我必须像这样将三个位组合成两个:

[0x5D, 0xC7, 0xD0] => [0x5DC, 0x7D0]

我认为前面提到的机器人 OS 库可以做到这一点 here,但我的 c++ 甚至比我的 python 更糟糕 :)

获得正确的数据后,我想将其排序为二维数组,但这不是问题。

你能给我指出正确的方向吗,或者只是建议如何寻找解决方案?

感谢您的帮助

所以这是一个解决方案(可能不是最干净的,但它是位操作所以...):

arr = [0x5D, 0xC7, 0xD0]
byte_0 = arr[0] << 4 | (arr[1] >> 4)
byte_1 = (arr[1] & 0xF) << 8 | arr[2]

我会尝试一步一步地复习这个。这三个字节,用二进​​制表示是:

0b0101_1101
0b1100_0111
0b1101_0000

<< 运算符是移位运算符。它将位向左移动指定的数量。将其应用于第一个字节会产生: 0b0101_1101 << 4 = 0b0101_1101_0000,有效地在末尾附加了四个零。 >> 运算符基本上等同于 << 运算符,只是将其反过来。当位低于位置 0 时,它会丢弃位: 0b1100_0111 >> 4 = 0b1100 最后,| 运算符是逻辑 'or' 运算符。它执行按位或操作,其中如果一个或两个初始位为“1”,则每个结果位为“1”。只有当两位都为“0”时,它才为“0”。到目前为止,我们可以利用它来'override'我们结果的低四位的内容。请注意,为简单起见,我省略了前导零,但这里是用零填充的数字 0b0101_1101_0000 | 0b0000_0000_1100 = 0b0101_1101_1100。你有你的第一个号码。现在请注意,这不是一个字节,而是您现在需要 12 位来表示数字。

第二个字节也是如此。这里唯一的新东西是逻辑与运算符 (&)。仅当两位都为“1”时,此运算符才产生“1”。我们可以用它来屏蔽字节的一部分感兴趣的部分: 0b1100_0111 & 0x1111 = 0b0111