我正在使用OS X Yosemite并尝试使用pip和python 2.7设置pymavlink。键入sudo pip install pymavlink
,它安装得很漂亮。试图用
from pymavlink import mavlinkv10 as mavlink
并且解释器抛出此错误:
文件“/Library/Python/2.7/site-packages/pymavlink/mavlinkv10.py”,第10行,在 from ... generator.mavcrc import x25crc ValueError:尝试相对导入超出toplevel包
我想我理解错误并可以通过将包的隐式导入“... generator”更改为显式“pymavlink.generator”来手动“修复”它。我的问题是,使用pip安装和导入此软件包的正确方法是什么。我不能成为第一个遇到这个问题的人:)
答案 0 :(得分:4)
看起来没有人会在教科书上回答这个问题,所以我将继续发布如何在Raspberry Pi上拼凑丛林联盟python mavlink安装而且,希望有人会在未来发布一个合法的解决方案,以便如何正确地使用PIP。欢迎任何评论/修复!
通过输入" sudo pip install pymavlink"来安装pymavlink。这会将pymavlink模块(以及您必须修改的mavlinkv10.py文件)安装到pi" /usr/local/lib/python2.7/dist-packages/pymavlink/&上的以下目录中#34;
在你的python代码开头使用以下行导入pymavlink模块"从pymavlink import mavlinkv10导入mavlink"
当从pymavlink存储库运行pymavlink示例代码时,解释器将首先抛出以下错误:
File "/Library/Python/2.7/site-packages/pymavlink/mavlinkv10.py"
in from ...generator.mavcrc import x25crc
ValueError: Attempted relative import beyond toplevel package
看起来mavlinkv10.py试图从3个父目录进行相对导入" up" (我认为?)。自"发电机"目录实际上是mavlinkv10.py所在的子目录,我在mavlinkv10.py中更改了以下内容:
changed this: from ...generator.mavcrc import x25crc
to this: from generator.mavcrc import x25crc
接下来,当你运行试图创建(编码)新的mavlink消息的python mavlink代码时,解释器将抛出以下错误:
File "/usr/local/lib/python2.7/dist-packages/pymavlink/mavlinkv10.py", line 1053, in pack
return MAVLink_message.pack(self, mav, 137, struct.pack('<QI', self.time_unix_usec, self.time_boot_ms))
File "/usr/local/lib/python2.7/dist-packages/pymavlink/mavlinkv10.py", line 110, in pack
crc.accumulate(chr(crc_extra))
File "/usr/local/lib/python2.7/dist packages/pymavlink/generator/mavcrc.py", line 18, in accumulate
tmp = b ^ (accum & 0xff)
TypeError: unsupported operand type(s) for ^: 'str' and 'int'
看来mavlinkv10在pack()函数中的额外crc计算失败了。你可以修复&#34;通过关闭mavlinkv10的pack()函数中的额外crc内容来解决此错误。在mavlinkv10.py中注释掉这两行:
#if True: # using CRC extra
# crc.accumulate(chr(crc_extra))
最后一件事。您还需要在mavlinkv10.py的decode()函数中禁用crc2计算。在mavlinkv10.py中注释掉这些行:
#if True: # using CRC extra
# crc2.accumulate(chr(crc_extra))
#if crc != crc2.crc:
# raise MAVError('invalid MAVLink CRC in msgID
此时,你应该可以运行pymavlink示例代码,虽然我不清楚如何禁用额外的CRC&#34;计算将影响mavlink可靠性(可能不是积极的)。
答案 1 :(得分:2)
而不是使用
from pymavlink import mavlinkv10 as mavlink
试
from pymavlink.dialects.v10 import common as mavlink
用您可能需要的任何方言替换common
(有关所有选项,请参阅https://github.com/mavlink/mavlink/tree/master/message_definitions/v1.0中的XML文件)