日期 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及以后内容,就好了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐