在OpenCV-3.4.9的环境中编译 Prometheus 和prometheus_px4(填坑实录)

从 opencv-3.2.0 到 opencv-3.4.9 的代码更改

基本步骤

参考链接:

AMOV Lab 官方链接

第一步、更新系统

打开一个终端,更新一下当前系统。

sudo apt-get update

第二步,下载编译

下载prometheus_px4:

打开一个终端(ctrl+alt+t),执行如下的下载指令:

git clone https://gitee.com/amovlab/prometheus_px4.git
编译prometheus_px4

进入到 prometheus_px4 路径之下,先更新子模块,再编译软件在环代码,指令如下:

cd ~/ && ./install_requirements.sh
cd prometheus_px4/
make submodulesclean # 更新子模块,时间稍微久一点(5 分钟)
# (或者使用 git submodules update --init --recursive)
make amovlab_sitl_default # 编译指令
下载Prometheus代码

打开一个新的终端(ctrl+alt+t),下载指令如下:

git clone https://gitee.com/amovlab/Prometheus.git
编译Prometheus代码

进入到 Prometheus 代码目录之下,执行编译指令如下:

cd Prometheus/
./compile_all.sh

如果下载编译均正常执行完成,所打开的终端也可以全部关闭。

第三步、测试系统是否正常

测试prometheus_px4

打开一个新的终端,进入到 prometheus_px4 路径之下,运行启动 gazebo 仿真,指令执行 如下:

roscd px4/
make amovlab_sitl gazebo_p450

如果顺利打开了 gazebo,并有 p450 模型的加载,就表示正常,使用 ctrl+c 关闭终端。

随后打开一个新的终端,利用 roslaunch 启动启动 gazebo+mavros+prometheus_px4 仿真,运行指令如下:

roslaunch px4 mavros_posix_sitl.launch

如果顺利打开了 gazebo,并有 p450 模型的加载,就表示正常,使用 ctrl+c 关闭终端。接下来就可以进行 Prometheus 的测试啦!

测试 Prometheus

prometheus 的正常运行是依赖 prometheus_px4 的正常运行,打开一个新的终端,执行指 令如下:

roslaunch prometheus_gazebo sitl_control.launch

等待 gazeborviz 全部正常启动之后,在终端中如果选择 0 进入终端指令操控,根据终端指令提示,可以进行 Prometheus 系统的仿真了。

小技巧:

Ubuntu下安装deb软件包的方式

sudo dpkg -i xxx.deb

上述步骤,是基于 ubuntu 18.0.4 + ros melodic + opencv-3.2.0 环境的。如果系统的 opencv 版本并非 opencv-3.2.0版本,则需要做以下的操作来完成仿真环境的配置。

0. 相关依赖安装

ROS(省略)、mavros包、建图模块、激光SLAM依赖项、NLopt、OMPL等

### mavros
sudo apt-get install ros-melodic-mavros ros-melodic-mavros-extras
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
sudo chmod 777 ./install_geographiclib_datasets.sh
sudo ./install_geographiclib_datasets.sh
### 建图模块 RTAB-map, OCTO-map
sudo apt-get install ros-melodic-rtabmap*
sudo apt-get install ros-melodic-octomap-*
### 激光SLAM依赖项 cartographer
sudo apt-get install ros-melodic-cartographer*
### 优化相关模块
git clone git://github.com/stevengj/nlopt  
cd nlopt  
mkdir build  
cd build  
cmake -D CMAKE_BUILD_TYPE=release \
      -D CMAKE_INSTALL_PREFIX=/usr/local/nlopt \
	  ..
make  
sudo make install
### 规划相关模块
sudo apt install ros-melodic-ompl*

2. 编译 complie_detection.sh 中的问题

1.1 问题1

~/Prometheus/Modules/object_detection/src/ellipse_lib/spire_ellipsedetector.cpp:1182:25: error: conversion from ‘cv::Mat’ to non-scalar type ‘CvMat’ requested
  CvMat temp = src;

更改代码:

	CvMat c_src = src;
    CvMat c_dst = _edges.getMat();
    CvMat c_dx = _sobel_x.getMat();
    CvMat c_dy = _sobel_y.getMat();

为新的标准方式:

	CvMat c_src = cvMat(src);
	CvMat c_dst = cvMat(_edges.getMat());
	CvMat c_dx = cvMat(_sobel_x.getMat());
	CvMat c_dy = cvMat(_sobel_y.getMat());

相应的,如果有 IplImage Ipi_z = z 则需要更改为 IplImage Ipi_z = cvIplImage(z)

1.2 问题2

~/Prometheus/Modules/object_detection/src/darknet_ros/src/YoloObjectDetector.cpp:579:49: error: no matching function for call to ‘_IplImage::_IplImage(cv::Mat&)’
   IplImage* ROS_img = new IplImage(camImageCopy_);       

更改代码:

  IplImage* ROS_img = new IplImage(camImageCopy_);

为新的标准方式:

  // IplImage* ROS_img = &cvIplImage(camImageCopy_);   	// ERROR: taking address of temporary [-fpermissive]
  IplImage tmp_img = cvIplImage(camImageCopy_);
  IplImage* ROS_img = &tmp_img;

1.3 问题3

~/Prometheus/Modules/planning/FastPlanner/plan_env/ThirdParty/sdf_tools/src/sdf_tools/sdf_builder.cpp: In member function ‘bool sdf_tools::SDF_Builder::BuildInternalPlanningScene()’:
~/Prometheus/Modules/planning/FastPlanner/plan_env/ThirdParty/sdf_tools/src/sdf_tools/sdf_builder.cpp:87:134: error: no matching function for call to ‘planning_scene::PlanningScene::PlanningScene(boost::shared_ptr<urdf::Model>&, boost::shared_ptr<srdf::Model>&)’
         planning_scene_ptr_ = std::shared_ptr<planning_scene::PlanningScene>(new planning_scene::PlanningScene(urdf_model, srdf_model));
                                                                                                                                      ^

解决办法,更改代码:

        boost::shared_ptr<urdf::Model> urdf_model(new urdf::Model());
        urdf_model->initString(GenerateSDFComputeBotURDFString());
        // Make the SRDF model
        boost::shared_ptr<srdf::Model> srdf_model(new srdf::Model());
        srdf_model->initString(*urdf_model, GenerateSDFComputeBotSRDFString());
        // Make the planning scene
        planning_scene_ptr_.reset();
        planning_scene_ptr_ = std::shared_ptr<planning_scene::PlanningScene>(new planning_scene::PlanningScene(urdf_model, srdf_model));

为新的标准方式:

    	auto urdf_model = std::make_shared<urdf::Model>();
    	urdf_model->initString(GenerateSDFComputeBotURDFString());
    	// Make the SRDF model
    	auto srdf_model = std::make_shared<srdf::Model>();
    	srdf_model->initString(*urdf_model, GenerateSDFComputeBotSRDFString());
		// Make the planning scene
		planning_scene_ptr_ = std::make_shared<planning_scene::PlanningScene>(urdf_model, srdf_model);
总结1~3问题:

(1)由于OpenCV的版本从 opencv2 到 opencv3 再到 opencv4 的升级过程中,对于 cv::Mat, CvMatIplImage 之间的相互转换关系操作一直在变化中。源码编译的时候,需要根据实际的编译环境 opencv 的版本来调整相应的代码。
(2)由于C++语言的标准一直变化中,一些与之相关的代码也可能需要调整。例如关于指针尤其是指针模板的定义和使用。

1.4 问题4

又再次遇到奇葩的问题。

~/Prometheus/Modules/swarm_control/src/ego_traj_to_cmd.cpp:21:10: fatal error: quadrotor_msgs/PositionCommand.h: No such file or directory
 #include "quadrotor_msgs/PositionCommand.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

网络上的方式是重新编译相关的功能包。但是,对于我来讲还是非常的迷惑!
https://www.freesion.com/article/76371450240/

cd ~/fast-planer_ws  //fast-planer_ws为我存放该工程的工作空间
catkin_make
source devel/setup.bash 

重新在另外一个网页上找到了看起来比较靠谱的办法。
https://www.freesion.com/article/16841452429/

step 1:在CMakeList.txt文件中,find_package() 里添加quadrotor_msgs如下

find_package( #...
  quadrotor_msgs # 添加的
)

step 2:同样在此CMakeList.txt中,include_directories里添加${catkin_INCLUDE_DIRS}如下:

include_directories(include ${catkin_INCLUDE_DIRS})

在更改这个 CMakeList.txt 的时候发现,他的一些依赖与ego_planner 有关,于是事先编译一下 ego_planner.

~/Prometheus$ ./complie_ego.sh

然后再次编译 swarm 模块。

~/Prometheus$ ./complie_swarm.sh

结果得到一个新的错误提示。

CMake Error at  ~/Prometheus/devel/share/quadrotor_msgs/cmake/quadrotor_msgsConfig.cmake:173 (message):
  Project 'prometheus_swarm_control' tried to find library 'encode_msgs'.
  The library is neither a target nor built/installed properly.  Did you
  compile project 'quadrotor_msgs'? Did you find_package() it before the
  subdirectory containing its code is included?

很迷的一个错误提示。然后再次编译 ego 模块。
也可能是期间,同时在安装的 ompl 功能模块起作用了。

sudo apt install ros-melodic-ompl*

不管他,继续了。

~/Prometheus$ ./complie_ego.sh

出现了一个错误提示如下。

[ 86%] Building CXX object ego-planner-swarm/src/uav_simulator/Utils/rviz_plugins/CMakeFiles/rviz_plugins.dir/src/probmap_display.cpp.o
[ 87%] Building CXX object ego-planner-swarm/src/uav_simulator/Utils/rviz_plugins/CMakeFiles/rviz_plugins.dir/src/aerialmap_display.cpp.o
ego-planner-swarm/src/planner/traj_utils/CMakeFiles/traj_utils.dir/build.make:94: recipe for target 'ego-planner-swarm/src/planner/traj_utils/CMakeFiles/traj_utils.dir/src/polynomial_traj.cpp.o' failed
make[2]: *** [ego-planner-swarm/src/planner/traj_utils/CMakeFiles/traj_utils.dir/src/polynomial_traj.cpp.o] Error 1
CMakeFiles/Makefile2:5100: recipe for target 'ego-planner-swarm/src/planner/traj_utils/CMakeFiles/traj_utils.dir/all' failed
make[1]: *** [ego-planner-swarm/src/planner/traj_utils/CMakeFiles/traj_utils.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

暂时忽略它,继续编译 swarm 模块。

~/Prometheus$ ./complie_swarm.sh

完美通过。

总结4问题:

此过程中由于 prometheus 编译过程中有相互的关联需求,而且其中还夹杂着因为缺少相应的功能包而出现的一些问题。总体思路是(1)调整编译的顺序;(2)安装相关依赖。

1.5 问题5

使用阿木实验室的Prometheus项目专用的PX4仓库来安装 prometheus_px4,安装方法如下:

git clone https://gitee.com/amovlab/prometheus_px4.git
cd prometheus_px4
git submodule update --init --recursive
pip3 install --user toml empy jinja2 packaging
make amovlab_sitl_default gazebo

cd prometheus_px4/Tools/setup
source ./ubuntu.sh

其中,在进行到 make amovlab_sitl_default gazebo 的时候可能有报错(实际没有碰到),解决办法:

make clean
make px4_sitl gazebo

sudo apt-get install libprotobuf-dev libprotoc-dev protobuf-compiler libeigen3-dev libxml2-utils python-rospkg python-jinja2
sudo apt-get install libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly -y

在运行 cd prometheus_px4/Tools/setup && source ./ubuntu.sh 的时候可能会遇到找不到 cc1 等库文件的问题。解决办法:
首先,通过gcc -v查看 gcc 的路径。

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8.4.0-1ubuntu1~18.04' --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared 
Thread model: posix
gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04) 

~/.bash.bashrc 中添加

export LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/8:$LIBRARY_PATH

然后再次运行 source ./ubuntu.sh 即可。
另外,
还需要在 ~/.bash.bashrc 中添加如下指令(以下若存在已添加过的命令,请勿重复添加),其中${your prometheus path}为Prometheus项目路径,${your px4 path}为安装PX4固件即prometheus_px4的路径。

source ${your prometheus path}/Prometheus/devel/setup.bash
export GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:${your prometheus path}/Prometheus/devel/lib
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:${your prometheus path}/Prometheus/Simulator/gazebo_simulator/models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:${your prometheus path}/Prometheus/Simulator/gazebo_simulator/amov_models
source ${your px4 path}/prometheus_px4/Tools/setup_gazebo.bash ${your px4 path}/prometheus_px4 ${your px4 path}/prometheus_px4/build/amovlab_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:${your px4 path}/prometheus_px4
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:${your px4 path}/prometheus_px4/Tools/sitl_gazebo

然后可以继续安装 gazebo 中仿真所需的 3Dlidaroctomap 以及 Turtlebot3 等插件。

sudo apt-get install ros-melodic-velodyne-gazebo-plugins
sudo apt-get install ros-melodic-octomap-rviz-plugins
sudo apt-get install ros-melodic-turtlebot3-*

Gazebo仿真运行测试:

roslaunch prometheus_gazebo sitl.launch

一共启动了三个终端。
第一个终端同时运行了gazeboMavrospx4_pos_estimatorpx4_pos_controller四个节点,第二个终端则运行了ground_station节点,第三个终端则运行了pos_estimator 节点。因此,若第一个终端无报错,第二个终端显示[Connected]并能够查看到飞机状态,且Gazebo成功运行,代表成功运行。

NODES
  /
    gazebo (gazebo_ros/gzserver)
    gazebo_gui (gazebo_ros/gzclient)
    ground_station (prometheus_station/ground_station)
    ground_station_msg (prometheus_station/ground_station_msg)
    mavros (mavros/mavros_node)
    px4_pos_estimator (prometheus_control/px4_pos_estimator)
    px4_sender (prometheus_control/px4_sender)
    sitl (px4/px4)
    tf_2Dlidar (tf/static_transform_publisher)
    tf_3Dlidar (tf/static_transform_publisher)
    tf_realsense_camera (tf/static_transform_publisher)
    tf_slam2map (tf/static_transform_publisher)
    tf_world_map (tf/static_transform_publisher)
    vehicle_spawn_UX303L_3799_8995328815101938340 (gazebo_ros/spawn_model)

运行如下指令启动终端控制节点,并根据终端提示输入指令:

rosrun prometheus_control terminal_control

到这就成功了。也可以在第一个终端中,使用 help 以及 commander help 来学习使用命令操控无人机。
不用重启系统而关闭 gazebo 的命令。

killall gzserver
killall gzclient

你可能感兴趣的:(VSLAM,环境配置,opencv,人工智能,计算机视觉)