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

2 篇文章 0 订阅

在执行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')   #可以是相对/绝对路径
 

在你的错误信息中,ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost),这可能是由于ROS自带的cv_bridge只支持Python2而不是Python3导致的。为了解决这个问题,你需要编译一个适用于Python3的cv_bridge模块。 以下是解决方案: 1. 首先,确保你在系统的真实环境中操作,而不是在conda创建的虚拟环境中。打开一个新终端,并运行conda deactivate命令,确保退出所有虚拟环境。 2. 进入Python3环境并安装相关依赖包: ``` sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-melodic-cv-bridge ``` 注意,根据你使用的ROS版本可能会有略微不同的依赖包名称。 3. 创建一个工作空间用于存放待编译的cv_bridge文件: ``` mkdir -p catkin_ws_for_cvbridge/src ``` 4. 设置参数: ``` cd catkin_ws_for_cvbridge catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so ``` 注意,这里的参数根据你系统自带的Python版本进行设置,16.04使用Python3.5,18.04使用Python3.6。 5. 告诉catkin将构建的包安装到指定位置: ``` catkin config --install ``` 6. 在catkin_workspace工作空间中克隆cv_bridge: ``` git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv ``` 7. 查看适合的cv_bridge版本: ``` apt-cache show ros-melodic-cv-bridge | grep Version ``` 8. 编译cv_bridge: ``` catkin build cv_bridge ``` 如果一切顺利,应该能够成功编译cv_bridge模块。 9. 最后,确保你将编译后的cv_bridge包添加到ROS的环境变量中。 通过以上步骤,你应该能够解决ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在Python3环境中使用ROS的cv_bridge](https://download.csdn.net/download/weixin_38703794/14036198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【bug】ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)](https://blog.csdn.net/qq_36497369/article/details/128853820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值