系统环境
原本系统是ubuntu20 + noetic,python都在/usr/bin中,一共是两个版本的python,一个是python3.8,另一个是python2.7。
问题发现
当安装anaconda后,并且将anaconda的bin目录加入到系统环境中时候,发现编译ros程序的时候会报错:
CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message):
Unable to find either executable 'empy' or Python module 'em'... try
installing the package 'python3-empy'
Call Stack (most recent call first):
/opt/ros/noetic/share/catkin/cmake/all.cmake:164 (include)
/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:20 (include)
CMakeLists.txt:58 (find_package)
应该就是跟anaconda的python版本冲突了,因为我下载的anaconda中,python版本是3.11.
解决方法
方法1. 在catkin_make的时候,报错python版本的问题
参考这篇博客 在编译ros程序的时候,需要在catkin_make 的时候,指定ros真正依赖python版本的目录。
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
一般情况下是有用的。但是,因为我ros程序需要pcl,而pcl依赖boost库,所以cmake会找到anaconda的boost库,而pcl实际依赖系统的boost库与anaconda的boost库并不一致,所以有的代码会因为boost库的不同,而编译报错,不通过。
方法2. 保存配置conda前的环境路径,在编译的时候把这个环境取出即可。(推荐方法,一劳永逸)
参考github这个方法:https://github.com/pism/pism/issues/356
- 打开~/.bashrc文件
gedit ~/.bashrc
找到配置anaconda路径的指令,在它之前加一句
export NOCONDA_PATH=$PATH
export PATH="/home/xz/anaconda3/bin:$PATH"
这个NOCONDA_PATH就是不包含anaconda库的路径。
- 这时候在需要编译的ros目录,打开终端,在编译前激活这个不包含anaconda库的路径。
PATH=$NOCONDA_PATH
这时候就可以直接进行编译
catkin_make
这时候cmake就直接找到的是系统安装的库,编译通过。
ros-noetic和anaconda联合使用
参考博客:
anaconda我安装的是当前最新的版本 conda 24.1.2,ubuntu安装noetic
因为上面保存了不包含anaconda库的路径。所以这里我可以直接在conda中,创建一个专门ros用的一个环境。
- 创建anaconda环境,noetic是依赖python3.8
conda create -n ros-noetic-virtualenv python=3.8
conda activate ros-noetic-virtualenv
- 安装ros的相关依赖
pip install rospkg rospy catkin_tools empy
- 这个时候,就可以在这个anaconda环境中,结合上面保存了不包含anaconda库的路径。就可以很轻松地在anaconda中编译ros的程序,python用的是anaconda的环境,c++的库也是链接原来系统的库!!!
总结
完工,折腾这个anaconda折腾了一下午,终于有方法搞定了。