文章目录
- 环境配置
- 安装wxPython
- 下载编译
- 测试
- 报错1
- 问题描述
- 问题分析
- 问题解决
- 参考
环境配置
Ubuntu20.04,python3.8.10,boost自带的1.71
sudo apt update
sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-noetic-vision-opencv ros-noetic-image-transport-plugins ros-noetic-cmake-modules python3-software-properties software-properties-common libpoco-dev python3-matplotlib python3-scipy python3-git python3-pip libtbb-dev libblas-dev liblapack-dev libv4l-dev python3-catkin-tools python3-igraph libsuitesparse-dev
安装wxPython
先下载 wxPython-4.2.1-cp38-cp38-linux_x86_64.whl
pip3 install wxPython-4.2.1-cp38-cp38-linux_x86_64.whl
下载编译
mkdir ~/kalibr_ws/src
cd ~/kalibr_ws/src
git clone --recursive https://github.com/ori-drs/kalibr
cd ~/kalibr_ws
source /opt/ros/noetic/setup.bash
catkin init
catkin config --extend /opt/ros/noetic
catkin config --merge-devel # Necessary for catkin_tools >= 0.4.
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin build -DCMAKE_BUILD_TYPE=Release -j16 # 比较耗时,5-6分钟吧,可以喝杯茶。
测试
damon@damon-virtual-machine:/opt/kalibr_ws$ source devel/setup.bash
damon@damon-virtual-machine:/opt/kalibr_ws$ devel/lib/kalibr/kalibr_calibrate_cameras --help
importing libraries
Calibrate the intrinsics and extrinsics of a camera system with non-shared overlapping field of view.
usage:
Example usage to calibrate a camera system with two cameras using an aprilgrid.
cam0: omnidirection model with radial-tangential distortion
cam1: pinhole model with equidistant distortion
kalibr_calibrate_cameras --models omni-radtan pinhole-equi --target aprilgrid.yaml \
--bag MYROSBAG.bag --topics /cam0/image_raw /cam1/image_raw
。。。。。。
报错1
问题描述
在使用 Kalibr 的 kalibr_calibrate_cameras 脚本时,执行命令时遇到以下错误:
damon@damon-virtual-machine:~/kalibr_ws$ devel/lib/kalibr/kalibr_calibrate_cameras --help
importing libraries
Traceback (most recent call last):
File "devel/lib/kalibr/kalibr_calibrate_cameras", line 15, in <module>
exec(compile(fh.read(), python_script, 'exec'), context)
File "/home/damon/kalibr_ws/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 6, in <module>
import sm
File "/home/damon/kalibr_ws/devel/lib/python3/dist-packages/sm/__init__.py", line 34, in <module>
exec(__fh.read())
File "<string>", line 4, in <module>
ImportError: /home/damon/kalibr_ws/devel/lib/python3/dist-packages/sm/libsm_python.so: undefined symbol: _ZN5boost6python15instance_holder8allocateEP7_objectmmm
damon@damon-virtual-machine:~/kalibr_ws$
问题分析
这个错误表明,libsm_python.so 文件中依赖的符号 _ZN5boost6python15instance_holder8allocateEP7_objectmmm
无法解析。该符号属于 Boost.Python 库,通常用于处理 Python 和 C++ 之间的交互。
问题解决
1.验证 Boost 版本
检查 /usr/include/boost/version.hpp,确保显示的版本是系统默认版本(1.71):
damon@damon-virtual-machine:~/kalibr_ws$ cat /usr/include/boost/version.hpp | grep BOOST_LIB_VERSION
// BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
#define BOOST_LIB_VERSION "1_71"
damon@damon-virtual-machine:~/kalibr_ws$
- 检查是否安装
boost-python
damon@damon-virtual-machine:~/kalibr_ws$ dpkg -l | grep libboost-python
ii libboost-python-dev 1.71.0.0ubuntu2 amd64 Boost.Python Library development files (default version)
ii libboost-python1.71-dev 1.71.0-6ubuntu6 amd64 Boost.Python Library development files
ii libboost-python1.71.0 1.71.0-6ubuntu6 amd64 Boost.Python Library
damon@damon-virtual-machine:~/kalibr_ws$
从输出可以看出,系统中已经正确安装了 boost-python 和与 Boost 1.71 匹配的相关开发包:
- libboost-python-dev:默认的开发文件(与系统的 Boost 版本保持一致)。
- libboost-python1.71-dev:Boost 1.71 版本的开发文件。
- libboost-python1.71.0:Boost 1.71 版本的运行时库。
这些包都已经安装完毕,说明 boost-python 的安装环境是正常的。
- 检查 boost-python 的库文件是否存在
运行以下命令查看 boost-python 的动态库:
ls /usr/lib | grep boost_python
输出中应包含类似以下内容:
libboost_python1.71.so
libboost_python-py38.so
但运行ls /usr/lib | grep boost_python
,没有输出
从输出可以看出,boost-python 的动态库文件似乎未正确安装或未找到。尽管 dpkg 显示相关开发包已经安装,但动态库文件 (libboost_python*.so) 并未出现在 /usr/lib 目录中。
- 确认动态库文件的实际位置
有时动态库可能安装到了其他路径(例如 /usr/lib/x86_64-linux-gnu)。运行以下命令搜索 libboost_python 文件:
damon@damon-virtual-machine:~/kalibr_ws$ sudo find /usr -name "libboost_python*.so"
[sudo] damon 的密码:
/usr/lib/x86_64-linux-gnu/libboost_python1.71.so
/usr/lib/x86_64-linux-gnu/libboost_python38.so
damon@damon-virtual-machine:~/kalibr_ws$
从输出可以看出,boost-python 的动态库文件已正确安装并位于路径 /usr/lib/x86_64-linux-gnu/ 中。具体包括以下文件:
- /usr/lib/x86_64-linux-gnu/libboost_python1.71.so:Boost Python 1.71 的主动态库。
- /usr/lib/x86_64-linux-gnu/libboost_python38.so:适配 Python 3.8 的 Boost Python 动态库。
这些文件是正确的,说明 boost-python 已安装成功。
。。。。比较多,不整理了
- 创建测试代码文件
在当前目录创建 my_program.cpp
#include <boost/python.hpp>
#include <iostream>
// 定义普通函数
std::string greet() {
return "Hello, Python!";
}
// 模块初始化
BOOST_PYTHON_MODULE(example) {
using namespace boost::python;
def("greet", greet); // 绑定函数
}
int main() {
std::cout << "Boost Python test program compiled successfully!" << std::endl;
return 0;
}
编译命令
g++ -shared -fPIC -I/usr/include/python3.8 -o example.so my_program.cpp /usr/lib/x86_64-linux-gnu/libboost_python1.71.so
加载并测试模块:
python3.8 -c "import example; print(example.greet())"
预期输出:
Hello, Python!
参考
Ubuntu20.04安装kalibr