环境:
- Ubuntu20.04
- ROS noetic
- Anaconda
现象:rospy导入
tf2_geometry_msgs
时报错ModuleNotFoundError: No module named 'PyKDL'
这个报错原因很容易理解,就是当前虚拟环境中不存在PyKDL
,PyKDL
在装ROS
的时候是默认安装的,可以看系统路径/usr/local/lib/python3/dist-packages
中默认的PyKDL.so
文件。
但是当我们使用虚拟环境时,python版本可能和ROS中的python版本不统一——这导致不能直接复制这个PyKDL.so
到虚拟环境中。另外,PyKDL
不提供pip
或conda
安装方式,只能源码安装,这导致环境配置很麻烦。
首先,下载源码
git clone https://github.com/orocos/orocos_kinematics_dynamics.git
cd ./orocos_kinematics_dynamics/python_orocos_kdl
git clone https://github.com/pybind/pybind11.git
接着编译C++库,因为PyKDL
底层是C++实现,所以必须先安装C++版的KDL库。cd
到./orocos_kinematics_dynamics/orocos_kdl
执行
mkdir build
cd build
cmake ../
make
sudo make install
接着编译Python接口,这里需要修改一下CMakeLists.txt
,将
find_package(Python ${PYTHON_VERSION} COMPONENTS Interpreter Development REQUIRED)
注释掉,防止CMake
自动调用不正确的Python版本。然后执行
mkdir build
cd build
cmake ../ -DPYTHON_EXECUTABLE=/home/winter/Project/anaconda3/envs/multi-nav/bin/python3.6m
make
sudo make install
必须注意DPYTHON_EXECUTABLE
是项目所在虚拟环境的python路径,编译后将/orocos_kinematics_dynamics/python_orocos_kdl/build/devel/lib/python3/dist-packages/PyKDL.so
复制到虚拟环境的包地址即可,以我的环境举例,是复制到.../anaconda3/envs/multi-nav/lib/python3.6/site-packages
路径上
最后验证一下
# conda activate multi-nav
import PyKDL
不报错就是安装好了
本文收录于《告别Bug》专栏,该专栏记录人工智能领域中各类Bug以备复查,文章形式为:问题背景 + 问题探索 + 问题解决,订阅专栏+关注博主后可通过下方名片联系我进入AI技术交流群帮忙解决问题
更多精彩专栏: