ROS arbotix踩坑:‘rospkg‘、except UnicodeDecodeError, exc、dynamic module does not define init function

在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。
报错No module named 'rospkg'

经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。
查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有rospkg这个包。
使用pip install rospkg。安装成功了,但是发现dist-packages还是没有安装成功这个包。
安装成功

实在没辙。通过搜索发现usr/lib/python2.7/dist-packages中有一个rospkg文件夹。把他复制到opt/ros/melodic/lib/python2.7/dist-packages中,就解决问题了。看样子应该是import的路径不对,导致找不到rospkg文件夹。

后续来了。。。。这个rospkg是解决了,但是后边一大堆import问题。每个包都要复制一遍,还出现“ROS:ImportError: dynamic module does not define module export function (PyInit__tf2)”这种复制包都没有用的错误,真是无奈。

所以,最后问题还是集中在import的路径上。一定要把路径给改回来。先用python文件a.py:

import sys
print(sys.path)

然后分别在终端及pycharm中运行:
在终端中:

$python a.py

或者执行使用命令:

export | grep PATH

发现ubuntu中依赖的路径缺少:usr/lib/python2.7/dist-packages,要在ubuntu中增加依赖路径。

$vim ~/.bashrc

在.bashrc最后加入一句:

export PYTHONPATH="/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/yaml:$PYTHONPATH"

(后边报yaml找不到,所以加上yaml的路径)
语法:export PYTHONPATH=目录1:/目录2:$PYTHONPATH

 $ source ~/.bashrc 

再运行,就不会报这些库的错误了。

当然,还有其他不是import的错误,等待后续吧

接上一段,终于添加了/usr/lib/python2.7/dist-packages作为依赖路径,消除了所有import的问题。却出现语法问题:except UnicodeDecodeError, exc
except UnicodeDecodeError, exc

大意就是语法问题。在python3.6不支持这种语法,我可是明明添加了python2.7啊喂???
感谢@Eric_Pxz 提供的思路:
1、找出报错的源头,没错就是"/home/box/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_drive.py
2、直接把他的环境从python3改为python2.7
改为python2.7
修改完毕,不报语法错误:except UnicodeDecodeError, exc:。特喵的又报:ImportError:dynamic module does not define init function (init_tf2)
在这里插入图片描述
仔细一看,是/home/box/catkin_ws/devel/lib/python3/dist-packages/tf2_py/init.py"报的错。可是我已经把python3的路径给去掉啦??
再打印一下路径

['/home/box/\xe5\xad\xa6\xe4\xb9\xa0\xe6\x96\x87\xe6\xa1\xa3', 
**'/home/box/catkin_ws/devel/lib/python3/dist-packages',** 
'/usr/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages/yaml', 
'/opt/ros/melodic/lib/python2.7/dist-packages', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk', 
 '/usr/lib/python2.7/lib-old', 
 '/usr/lib/python2.7/lib-dynload',
  '/home/box/.local/lib/python2.7/site-packages',
   '/usr/local/lib/python2.7/dist-packages', 
   '/usr/lib/python2.7/dist-packages/gtk-2.0', 
   '/usr/lib/python2.7/dist-packages/wx-3.0-gtk3']

唯一存在的python3路径就是:’/home/box/catkin_ws/devel/lib/python3/dist-packages’, 果然还在。
不知道怎么修改路径,就直接把整个文件夹/home/box/catkin_ws/devel/lib/python3给删除掉。再运行,就ok了:
运行ok
阿弥陀佛,研究了一个星期,终于debug完毕。
总结:
1、一定要明白ros中每个文件夹的用途。比如devel是库文件。其中有python2、3的库。如果依赖python2的程序,使用的是python3的路径,那么就会报错。
2、学会修改import的路径,debug的过程中还有一些improt问题没有写出来。总之就是用$vim ~/.bashrc修改import的路径。
3、对python的import用法要熟悉,遇到import问题可以快速明白是哪里的错误。正好这次遇到python2、3的Import问题,很是暴露出知识点的缺漏
4、学会查看终端的报错信息。本次也是通过报错信息,确定问题点。

顺便总结一下import的方法,因为遇到引用同一个文件夹中的error文件:from error import *,这句也能报错,见鬼了。所以重新总结:
import对象在同一个文件夹下
1、第一种:

import py文件

例:在一个文件夹中有a.py、b.py。
在b中就可以import a
然后x = a.函数1()

2、第二种:

from py文件 import 函数

例:在一个文件夹中有a.py、b.py。
在b中就可以from a import 函数1
然后x = 函数1()
3、第三种:

from py文件  import *

例:在一个文件夹中有a.py、b.py
在b中就可以from a import *。可以直接使用a中所有的函数了
然后x = 函数1() y = 函数2()
【建议使用第一种,防止重名的问题】

import对象在不同文件夹下
在不同的文件夹下:
1、第一种:

from   文件夹   import   py文件

2、第二种:

from 文件夹.py文件  import  函数1

3、第三种:

from 文件夹.py文件  import  *

4、若搜索不到该文件夹,则临时添加其路径:

sys.path.append('/home/model')   #可以是相对/绝对路径
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值