ompl python binding on Ubuntu 22.04
·
日期 2026-03-05
try ompl python binding on Ubuntu 22.04 in Docker
真的是坑很多了;(
最开始时可以import ompl但from ompl import base 会出现segmentation fault,
发现是ompl python bind没有正确编译好的原因
参考jijihttps://ompl.kavrakilab.org/installation.ht指示进行安装,此时默认的ompl版本是1.7.0,但是py_binding会报错,查阅ompl仓库issues之后为了控制变量退回了1.6.0版本:
#!/bin/bash
set -e
if [ `id -u` == 0 ]; then
export SUDO=
export DEBIAN_FRONTEND=noninteractive
# export PIP_ARGS=--break-system-packages
else
SUDO="sudo -H"
fi
install_common_dependencies()
{
# install most dependencies via apt-get
${SUDO} apt-get -y update && \
${SUDO} apt-get -y install \
clang \
cmake \
libboost-filesystem-dev \
libboost-program-options-dev \
libboost-serialization-dev \
libboost-system-dev \
libboost-test-dev \
libeigen3-dev \
libexpat1 \
libtriangle-dev \
ninja-build \
pkg-config \
wget
export CXX=clang++
}
install_python_binding_dependencies()
{
${SUDO} apt-get -y install \
castxml \
libboost-numpy-dev \
libboost-python-dev \
python3-celery \
python3-dev \
python3-flask \
python3-numpy \
python3-opengl \
python3-pip \
python3-pyqt5.qtopengl \
pypy3 \
wget && \
# install additional python dependencies via pip
${SUDO} pip3 install ${PIP_ARGS} -vU https://github.com/CastXML/pygccxml/archive/develop.zip pyplusplus
}
install_app_dependencies()
{
${SUDO} apt-get -y install \
freeglut3-dev \
libassimp-dev \
libccd-dev \
libfcl-dev
}
install_ompl()
{
if [ -z $APP ]; then
wget -O - https://github.com/ompl/ompl/archive/1.6.0.tar.gz | tar zxf -
cd ompl-1.6.0
else
wget -O - https://github.com/ompl/omplapp/releases/download/1.6.0/omplapp-1.6.0-Source.tar.gz | tar zxf -
cd omplapp-1.6.0-Source
fi
cmake \
-G Ninja \
-B build \
-DPYTHON_EXEC=/usr/bin/python3 \
-DOMPL_REGISTRATION=OFF \
-DCMAKE_INSTALL_PREFIX=/usr && \
cmake --build build -t update_bindings && \
cmake --build build && \
${SUDO} cmake --install build
}
for i in "$@"
do
case $i in
-a|--app)
APP=1
PYTHON=1
shift
;;
-p|--python)
PYTHON=1
shift
;;
*)
# unknown option -> show help
echo "Usage: `basename $0` [-p] [-a]"
echo " -p: enable Python bindings"
echo " -a: enable OMPL.app (implies '-p')"
echo " -g: install latest commit from main branch on GitHub"
;;
esac
done
install_common_dependencies
if [ ! -z $PYTHON ]; then
install_python_binding_dependencies
fi
if [ ! -z $APP ]; then
install_app_dependencies
fi
install_ompl
cmake --build build -t update_bindings这一步开始会报错
然后把pygccxml退回到2.2.1并安装yaml-cpp
apt-get install libyaml-cpp-dev
pip install pygccxml==2.2.1
这时还是无法正常编译
主要报错是
Traceback (most recent call last):
File "/home/gabriel/Downloads/ompl/py-bindings/generate_bindings.py", line 950, in <module>
globals()['ompl_'+module+'_generator_t']()
File "/home/gabriel/Downloads/ompl/py-bindings/generate_bindings.py", line 878, in __init__
code_generator_t.__init__(self, 'util', None, replacement, 1)
File "/home/gabriel/Downloads/ompl/py-bindings/ompl/bindings_generator.py", line 146, in __init__
self.filter_declarations()
File "/home/gabriel/Downloads/ompl/py-bindings/generate_bindings.py", line 893, in filter_declarations
self.std_ns.class_('vector< std::string >').include()
File "/home/gabriel/.local/lib/python3.10/site-packages/pygccxml/declarations/scopedef.py", line 554, in class_
recursive=recursive)
File "/home/gabriel/.local/lib/python3.10/site-packages/pygccxml/declarations/scopedef.py", line 464, in _find_single
found = matcher.get_single(decl_matcher, decls, False)
File "/home/gabriel/.local/lib/python3.10/site-packages/pygccxml/declarations/scopedef.py", line 90, in get_single
raise runtime_errors.declaration_not_found_t(decl_matcher)
pygccxml.declarations.runtime_errors.declaration_not_found_t: Unable to find declaration. Matcher: [(decl type==class_t) and (name==vector< std::string >)]
推测应该是跟pygccxml和castxml兼容的问题,
找到了https://github.com/ompl/ompl/pull/980这个pr,参考他把py-bindings/generate_bindings.py中的
self.ompl_ns.class_(f'SpecificParam< {self.string_decl} >').rename('SpecificParamString')
替换成
try:
self.ompl_ns.class_(f'SpecificParam< std::string >').rename('SpecificParamString')
except:
self.ompl_ns.class_(f'SpecificParam< std::basic_string< char > >').rename('SpecificParamString')
再运行.sh中cmake --build build -t update_bindings及以后内容,就好了。
更多推荐



所有评论(0)