如何解决ROS环境下运行Adafruit GPS时的PyInit__tf2报错
报错原因
这个错误本质是Python版本不匹配导致的:你使用的ROS Melodic版本默认适配Python2,官方源安装的tf2相关依赖都是基于Python2编译的动态库,你当前运行ROS节点时默认调用了Python3解释器,Python3无法识别Python2编译的动态链接库,因此抛出了ImportError: dynamic module does not define module export function (PyInit__tf2)的错误。
解决方案
方案一:临时指定Python2运行节点
直接运行如下命令即可启动节点:
python2 /home/bot/catkin_ws/src/nmea_navsat_driver/scripts/nmea_serial_driver _port:=/dev/ttyUSB0 _baud:=115200
方案二:永久修改脚本默认解释器
修改nmea_serial_driver脚本的首行shebang配置:
- 打开脚本文件:
nano /home/bot/catkin_ws/src/nmea_navsat_driver/scripts/nmea_serial_driver - 将第一行的
#!/usr/bin/env python修改为#!/usr/bin/env python2 - 保存退出后,即可正常用rosrun命令启动节点:
rosrun nmea_navsat_driver nmea_serial_driver _port:=/dev/ttyUSB0 _baud:=115200
方案三:编译Python3版本的tf2依赖
如果你确实需要使用Python3运行该节点,可手动编译适配Python3的tf2相关功能包:
- 先安装Python3依赖:
sudo apt install python3-catkin-pkg-modules python3-rospkg-modules python3-empy
- 进入工作空间根目录,指定Python3参数重新编译:
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so
- 编译完成后重新source工作空间配置:
source devel/setup.bash
补充注意事项
如果运行节点时出现串口权限报错,可执行如下命令将当前用户加入串口权限组,重启后生效:
sudo usermod -aG dialout $USER
内容的提问来源于stack exchange,提问作者BlueSky
相关产品推荐
相关产品推荐

