背景知识
- Linux 系统下当前用户在打开一个终端的时候,默认调用
~/.bashrc
脚本来初始化,ROS 即是在该脚本最后添加一行命令来加入初始化配置 - ROS 添加的这一行命令,作用是运行
/opt/ros/{ROS_VERSION}/
目录下的setup.bash
脚本,在该脚本(及该脚本对其它脚本的调用)中添加了多项环境变量 - 在终端中输入
env
命令可以查看当前终端的所有环境变量 source xx
命令:在当前 shell 环境下从指定文件读取和执行命令export xx=yy
命令:设置 shell 变量,即环境变量,仅在当前终端有效
问题常见形式
- 由于缺失 Python 包地址导致找不到 rospy:
ModuleNotFoundError: No module named 'rospy'
- 由于缺失 C++ 库地址导致找不到 libroscpp.so:
OSError: cannot load library 'xxx/yyy.so': libroscpp.so: cannot open shared object file: No such file or directory.
等等。
这些问题都是因为 ROS 的环境变量没有被成功导入 Sublime Text,进而找不到对应的包或库文件。以下为两种解决方案。
解决方式一
Sublime Text 在每次打开的时候,会从系统中载入当前的环境变量并在内部缓存。在这里,不同的打开方式会造成不同的结果:
-
如果通过直接点击图标的方式打开,则无法读取用户 shell 环境下的环境变量
-
在终端用命令行的方式打开,则可以读取到该终端下当前用户的环境变量:
subl [path or dir]
因此,如果要在 Sublime Text 中加载 ROS 的环境变量,用命令行的方式输入subl
打开软件即可。
解决方式二
还可以手动修改 Sublime Text 的配置文件,显式添加需要的环境变量,这样无论哪种打开方式都可以读取到所需的环境变量。
在 Linux 系统下,Sublime Text 的配置文件保存在以下两个目录:
~/.config/sublime-text
(用户配置)/opt/sublime_text
(系统配置)
在第二个系统配置目录下,找到./Packages/Python.sublime-package
,这是一个 zip 压缩包。修改压缩包里面的Python.sublime-build
文件,在env
一项中添加如下两行:
"env": {
"PYTHONIOENCODING": "utf-8",
"PYTHONPATH": "/opt/ros/melodic/lib/python2.7/dist-packages", // ROS Python 相关包所在目录
"LD_LIBRARY_PATH": "/opt/ros/melodic/lib", // 运行程序时的链接库文件在此
},
NOTE1: 上面是 Python 环境的配置文件,配置C++文件应该是同理的,因为暂时不需要所以未尝试。
NOTE2: Ubuntu 在图形界面下双击打开压缩包,编辑修改其中内容后可以直接更新,但是在/opt/
目录下可能会因为权限问题更新失败,注意先添加写入权限再修改。
参考
Environment Variables - Sublime Forum
Python path and $PYTHONPATH - Sublime Forum
在sublime-text3和pycharm无法import-rospy等ros-Python库