目前,我们正在建立一个机器人与树莓pi和AX-12 dynamixel伺服的。我们发现了一个python2库,我们目前移植到python3,我们在一个特定的方法指出了问题,给出了一个python3的错误。你知道吗
Python2的版本实际上很有魅力
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'))
现在脚本运行,遗憾的是伺服将不再工作。你知道吗
我们还尝试将字节放入字节数组中
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对输出数据的操作是不同的。我不知道应该调整什么或者改变什么。你知道吗
有人看到我现在做错了什么吗?你知道吗
您的字节不是UTF-8数据;对于您在0-127范围之外创建的任何
chr()
值,编码到UTF-8将产生两个字节。你知道吗您是从整数值创建Unicode代码点;如果您将这些值限制为0到255之间的整数,这些代码点将创建拉丁1代码点;原则上,您可以编码到
'latin1'
以再次获取字节,但首先创建字节要容易得多。你知道吗在Python3中,使用从整数列表创建的
bytes
类型:您自己的尝试没有包含
id
值,您使用的是AX_REG_WRITE
,而不是AX_WRITE_DATA
。你知道吗您还可以使用^{} object ,它允许您附加额外的字节;您可以使用它通过引用到目前为止生成的字节来计算校验和,避免重复您自己的操作(常见的错误源):
当然,您也可以使用连接(
outData = bytes([...])
,outData += bytes([checksum])
),但是bytearray
在python2中也可用,因此上面的版本与两个主要的Python版本兼容。你知道吗相关问题 更多 >
编程相关推荐