目前,我们正在构建带有覆盆子pi和AX-12 dynamixel Servo的机器人。我们找到了一个当前正在移植到python3的python2库,我们用一种在python3中给出错误的特定方法来找出问题所在。
Python 2版本实际上就像一个魅力
AX_GOAL_LENGTH = 5
AX_WRITE_DATA = 3
AX_GOAL_POSITION_L = 30
AX_START = 255
AX_REG_WRITE = 4
def move(self, id, position):
self.direction(Ax12.RPI_DIRECTION_TX)
Ax12.port.flushInput()
p = [position&0xff, position>>8]
checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff
outData = chr(Ax12.AX_START)
outData += chr(Ax12.AX_START)
outData += chr(id)
outData += chr(Ax12.AX_GOAL_LENGTH)
outData += chr(Ax12.AX_WRITE_DATA)
outData += chr(Ax12.AX_GOAL_POSITION_L)
outData += chr(p[0])
outData += chr(p[1])
outData += chr(checksum)
Ax12.port.write(outData)
我们尝试过的是调整此变量:
Ax12.port.write(bytes(outData,'utf-8'))
现在脚本已运行,可悲的是Servo将不再起作用。
我们还尝试将字节放置在字节数组中
result = bytes([Ax12.AX_START, Ax12.AX_START,
Ax12.AX_GOAL_LENGTH,Ax12.AX_REG_WRITE,
Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum
])
Ax12.port.write(result)
脚本运行,但伺服器不运行。
我相信,在python3和python2中对outData进行的操作是不同的。我找不到应该调整或不同的内容。
有人看到我目前在做错什么吗?
您的字节不是UTF-8数据;对于chr()
您在0-127范围之外创建的任何值,编码为UTF-8会生成两个字节。
您正在从整数值创建Unicode代码点。如果将它们限制为0到255之间的整数,它们会创建Latin-1代码点;原则上,您可以进行编码以'latin1'
再次获取字节,但是首先创建字节要容易得多。
在Python 3中,使用bytes
从整数列表创建的类型:
def move(self, id, position):
self.direction(Ax12.RPI_DIRECTION_TX)
Ax12.port.flushInput()
p = [, position>>8]
checksum = (~(id + Ax12.AX_GOAL_LENGTH + Ax12.AX_WRITE_DATA + Ax12.AX_GOAL_POSITION_L + p[0] + p[1]))&0xff
outData = bytes([
Ax12.AX_START, Ax12.AX_START, id,
Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA,
Ax12.AX_GOAL_POSITION_L, p[0], p[1], checksum])
Ax12.port.write(outData)
您自己的尝试未包含该id
值,而是使用AX_REG_WRITE
而不是AX_WRITE_DATA
。
您也可以使用bytearray()
object,它可以让您追加其他字节;您可以通过引用到目前为止产生的字节来使用该值来计算校验和,从而避免重复自己(常见的错误来源):
def move(self, id, position):
self.direction(Ax12.RPI_DIRECTION_TX)
Ax12.port.flushInput()
outData = bytearray([
Ax12.AX_START, Ax12.AX_START, id,
Ax12.AX_GOAL_LENGTH, Ax12.AX_WRITE_DATA,
Ax12.AX_GOAL_POSITION_L, position & 0xff, position >> 8])
checksum = ~sum(outData[2:]) & 0xff
outData.append(checksum)
Ax12.port.write(outData)
当然outData = bytes([...])
,您也可以使用串联(outData += bytes([checksum])
),但bytearray
在Python 2中也可以使用串联,因此上述版本与两个主要的Python版本都兼容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句