Ubuntu18.04下面配置阿木实验室amov仿真系统Promethus的一系列运行环境

官方安装教程
​​​​​​​​​​​​​​https://docs.amovlab.com/prometheus-wiki/#/src/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/Prometheus%E4%BB%BF%E7%9C%9F%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE_Ubuntu/Prometheus%E4%BB%BF%E7%9C%9F%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AEUbuntu

教程中有提到promethus平台适配于ubuntu20安装和18安装,通用在20下。我的电脑由于使用条件限制,只能在18下安装,本来以为适当修改一点就可以编译通过了,没想到踩了一大堆坑,现在记录总结

首先上一个结论:**promethus平台不建议在18下安装,因为在一套的代码在迭代过程中很多库版本已经不适配18,如果想用18安装应该修改其中部分代码和编译文件,相当麻烦和没必要,在20下装会省心很多。**也希望官方把这一点说明,我是沉没成本太高所以走完了整个流程,后来者非必要不在18装吧

其次虚拟机的好处就体现了,一个环境配置的库越多,框架越多,安装越容易起冲突,anaconda一类的也非常容易对各种程序编译起python冲突问题。所以直接拉一个新环境镜像会更方便

下面进入正文:

prometheus_px4配置

prometheus_px4是Prometheus项目配套使用的PX4固件,Prometheus项目的仿真模块依赖PX4固件 以及sitl_gazebo ros功能包。(如果是配置Prometheus到真实无人机上那不需要配置prometheus_px4,因为这个是用于虚拟仿真的,真实无人机不需要)

确保系统在当下版本保持最新

复制代码
sudo apt-get update
sudo apt-get upgrade

📌
如果上述操作更新不了,建议删除现有密钥再插入现有密钥,或直接找一个新密钥认证,更新效果会好一些

打开终端输入下面的命令安装prometheus_px4

复制代码
git clone https://gitee.com/amovlab/prometheus_px4.git

首次安装PX4固件时,需要安装PX4环境

复制代码
cd prometheus_px4/Tools/setup
source ./ubuntu.sh

请将示例中的{your_prometheus_px4_path}替换为prometheus_px4的安装路径。

复制代码
cd prometheus_px4
git submodule update --init --recursive #下载子模块可能会有些慢稍等,下载完可以再运行,如果下载好是不会显示什么的
pip3 install --user toml empy jinja2 packaging

编译prometheus_px4

复制代码
cd prometheus_px4

make amovlab_sitl_default gazebo_p450
报错AttributeError: module 'em' has no attribute 'RAW_OPT'

16/813\] Generating git version header ninja: build stopped: subcommand failed. Makefile:224: recipe for target 'amovlab_sitl_default' failed make: \*\*\* \[amovlab_sitl_default\] Error 1

我的python2装的是empy3.3.2,安装这个软件python3是empy4.2,那在python3环境怎么处理

复制代码
pip3 uninstall empy 
pip3 install empy==3.3.4

安装Prometheus

复制代码
git clone https://gitee.com/amovlab/Prometheus.git

安装prometheus_mavros

prometheus_mavros是Prometheus项目配套使用的MAVROS功能包,Prometheus项目与PX4连接进行数据交互依赖于MAVROS功能包。

打开终端输入以下命令安装prometheus_mavros。

复制代码
cd Prometheus/Scripts/installation/prometheus_mavros
chmod +x install_prometheus_mavros.sh
./install_prometheus_mavros.sh

安装完毕后关闭当前终端窗口,打开新的终端输入以下命令测试prometheus_mavros是否正常安装完毕以及环境变量是否正常加载。

复制代码
roscd mavros

如果出现路径为~/prometheus_mavros/src/mavros/mavros则证明安装成功。

复制代码
sudo gedit ~/.bashrc

source ~/prometheus_mavros/devel/setup.bash

报错:软件包 libgeographiclib-dev 没有可安装候选

没有可用的软件包 libgeographiclib-dev,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
然而下列软件包会取代它:
libgeographic-dev:i386 libgeographic-dev

E: 软件包 libgeographiclib-dev 没有可安装候选
ERROR: the following rosdeps failed to install
ERROR: the following rosdeps failed to install
apt: command [sudo -H apt-get install -y libgeographiclib-dev] failed

如果按照Wiki操作安装,却一直卡在

"Installing GeographicLib "

这一步时,这个是因为在下载GeographicLib,但由于国内网路限制,或者对应下载服务器不稳定,导致一直下载不下来,所以卡在这里

解决办法:

手动下载GeographicLib,它包含了三个文件夹:geoids;gravity;magnetic

可以通过下面三个链接下载

http://downloads.sourceforge.net/project/geographiclib/geoids-distrib/egm96-5.tar.bz2?use_mirror=autoselect

https://downloads.sourceforge.net/project/geographiclib/gravity-distrib/egm96.tar.bz2?use_mirror=autoselect

https://downloads.sourceforge.net/project/geographiclib/magnetic-distrib/emm2015.tar.bz2?use_mirror=autoselect

复制代码
 下载完成解压,将这三个文件夹geoids;gravity;magnetic,拷贝到 /usr/share/GeographicLib下

拷贝命令类似:sudo cp -r magnetic/ /usr/share/GeographicLib 依次将三个文件夹拷贝过去

然后重新执行安装mavros的脚本,这时候还是一样会卡在 "Installing GeographicLib " 因为他默认会联网下载,只需ctrl+c略过这bu2,因为我们已经安装完成了,然后脚本就会继续执行剩余安装,正常情况结束后mavros安装完毕

换源安装

换源你可以直接小鱼换源或者按照文件操作

复制代码
wget http://fishros.com/install -O fishros && . fishros

https://blog.csdn.net/u011198687/article/details/121103821

  • 软件源

每个LINUX的发行版,比如UBUNTU,都会维护一个自己的软件仓库,我们常用的几乎所有软件都在这里面。这里面的软件绝对安全,而且绝对的能正常安装。

那我们要怎么安装呢?在UBUNTU下,我们维护一个源列表,源列表里面都是一些网址信息,这每一条网址就是一个源,这个地址指向的数据标识着这台源服务器上有哪些软件可以安装使用。

复制代码
sudo gedit /etc/apt/sources.list

在这个文件里加入或者注释(加#)掉一些源后,保存。这时候,我们的源列表里指向的软件就会增加或减少一部分。

  • 更换软件源

备份软件源列表(以防后面使用过程中源有问题更换回来)

复制代码
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

打开软件源列表文件

复制代码
sudo vim /etc/apt/sources.list

这里如果安装了图形化界面,也可以用gedit编辑器进行编辑sudo gedit /etc/apt/sources.list

删除该文件里的全部内容,复制以下内容直接替换掉,这里提供了阿里云及其他的源,任选一个就可以,我试了阿里云这个还不错,就放到最前面了,需要其他源的可以自行百度。

  • 保存后就可以开始更新软件列表信息了,输入以下指令

    sudo apt-get update

这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑。我们在软件包管理器里看到的软件列表,都是通过update命令更新的。

  • update后,可能需要upgrade一下(慎用)。

    sudo apt-get upgrade

这个命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。如果你的软件都是最新版本,会提示:

总而言之,update是更新软件列表,upgrade是更新软件


原文链接:https://blog.csdn.net/u011198687/article/details/121103821

换源没效果
复制代码
sudo apt-get update
sudo apt-get install libgeographic-dev

这中间又进行了一些错误的试错,主要是rosdepc和rosdep相关的,就不往上贴了

基于现在构建的情况,直接跳过安装

复制代码
zeratul@zeratul-Dell-G15-5530:~$ ls /usr/share/GeographicLib
geoids  gravity  magnetic
zeratul@zeratul-Dell-G15-5530:~$ 
复制代码
我检查rosdep check --from-paths src --ignore-src,出现下面提示,那么我该如何准备,去跳过 libgeographiclib-dev的安装

System dependencies have not been satisfied:
apt    libgeographiclib-dev
executing command [sudo -H apt-get install -y libgeographiclib-dev]

这样就可以编译通过了

依赖项下载

  • 遥控器仿真驱动安装

    安装遥控器仿真驱动
    sudo apt-get install jstest-gtk

安装完成之后,可以在终端中运行如下指令确认遥控器是否正常以及摇杆和按钮的响应情况

复制代码
jstest-gtk

这个仓库是从官方仓库(https://github.com/osrf/gazebo_models)复制过来的,会定期更新

nlink_parser安装(可选)

复制代码
nlink_parser为UWB驱动功能包,目前仅支持nooploop相关UWB产品

通过git clone方式下载功能包,参考README配置该功能包

复制代码
git clone https://github.com/nooploop-dev/nlink_parser.git
  • vrpn_client_ros安装(可选)

vrpn_client_ros功能包为动捕定位系统应用所依赖的ROS功能包,如果使用动捕定位则需要下载该功能包

复制代码
sudo apt-get install ros-noetic-vrpn-client-ros

编译Prometheus

输入以下命令编译Prometheus项目。

复制代码
cd Prometheus 

# 第一次使用时需要给编译脚本文件添加可执行权限
chmod +x compile_*

# 编译控制功能模块
./compile_planning.sh

编译最后的turtol报错没有opencv,可以先不用

通过修改最后一个的cmakelist,完成编译依赖的实现

复制代码
cmake_minimum_required(VERSION 2.8.3)
project(prometheus_demo)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  rospy
  geometry_msgs
  sensor_msgs
  mavros
  nav_msgs
  std_msgs
  std_srvs
  tf2_ros
  tf2_eigen
  mavros_msgs
  prometheus_msgs
)

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)

# 移除了 OpenCV,因为通常只有 advanced 里的视觉模块需要它
# find_package(OpenCV 4 REQUIRED)

################################################
## Declare ROS messages, services and actions ##
################################################

generate_messages(
  DEPENDENCIES
  geometry_msgs
  sensor_msgs
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS message_runtime
)

###########
## Build ##
###########

## Specify additional locations of header files
include_directories(
  include
  # advanced/include  <-- [已移除] 移除高级模块头文件路径
  ${catkin_INCLUDE_DIRS}
  ../common/include
  ../communication/include
  # ${OpenCV_INCLUDE_DIRS} <-- [已移除]
)

###############################
##      声明可执行cpp文件     ##
###############################

# --- Basic 模块 (保留) ---

add_executable(takeoff_land basic/takeoff_land/src/takeoff_land.cpp)
target_link_libraries(takeoff_land ${catkin_LIBRARIES})

add_executable(takeoff_land_no_rc basic/takeoff_land/src/takeoff_land_no_rc.cpp)
target_link_libraries(takeoff_land_no_rc ${catkin_LIBRARIES})

add_executable(global_pos_control basic/global_pos_control/src/global_pos_control.cpp)
target_link_libraries(global_pos_control ${catkin_LIBRARIES})

add_executable(enu_xyz_pos_control basic/enu_xyz_pos_control/src/enu_xyz_pos_control.cpp)
target_link_libraries(enu_xyz_pos_control ${catkin_LIBRARIES})

add_executable(body_xyz_pos_control basic/body_xyz_pos_control/src/body_xyz_pos_control.cpp)
target_link_libraries(body_xyz_pos_control ${catkin_LIBRARIES})

add_executable(circular_trajectory_control basic/circular_trajectory_control/src/circular_trajectory_control.cpp)
target_link_libraries(circular_trajectory_control ${catkin_LIBRARIES})

add_executable(waypoint_pos_control basic/waypoint_pos_control/src/waypoint_pos_control.cpp)
target_link_libraries(waypoint_pos_control ${catkin_LIBRARIES})

# --- Advanced 模块 (已全部移除) ---
# 包括 formation_control, swarm_control, yolov5_tracking, aruco_tracking, prosim_... 等

#############
## Install ##
#############

## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
)

## Mark other files for installation
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)

环境变量配置

打开终端输入以下命令打开.bashrc文件。

复制代码
sudo gedit ~/.bashrc

将以下内容复制到.bashrc文件中后保存退出,如果.bashrc已有相关内容,则无需重复添加。

复制代码
source /home/zeratul/proj/Prometheus/devel/setup.bash

export GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:/home/zeratul/proj/Prometheus/devel/lib
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/uav_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/ugv_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/sensor_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/scene_models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/texture

source /home/zeratul/proj/prometheus_px4/Tools/setup_gazebo.bash /home/zeratul/proj/prometheus_px4 /home/zeratul/proj/prometheus_px4/build/amovlab_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/zeratul/proj/prometheus_px4
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/zeratul/proj/prometheus_px4/Tools/sitl_gazebo

使用例程进行测试

无人机控制模块教学例程 - 起飞降落

---不用遥控器的话,可以使用脚本启动无人机解锁进入command模式

复制代码
/home/zeratul/proj/Prometheus/Scripts/simulation/NO_RC/arm_and_command.sh

---操作步骤

将遥控器开机并通过USB接口接入电脑

输入以下命令启动起飞降落仿真demo

复制代码
cd /home/zeratul/proj/Prometheus/Scripts/simulation/tutorial_demo/takeoff_land
chmod +x takeoff_land_P450.sh
./takeoff_land_P450.sh

遥控器SWA档杆向下拨解锁无人机

遥控器SWB档杆拨到中间位置将无人机控制状态切换到RC_POS_CONTROL

遥控器SWB档杆拨到最底部将无人机控制状态切换到COMMAND_CONTROL

无人机将自动起飞,到达预设高度后悬停30秒,随后自动降落

编译代码排错

复制代码
我运行roslaunch prometheus_uav_control uav_control_main_outdoor.launch
<launch>
    <arg name="uav_id" default="1"/>
    <arg name="sim_mode" default="true"/>
    <arg name="flag_printf" default="true"/>
    <!-- 如果是matlab配置为ATT_CTRL_MODE,则此处要设置为True-->
    <arg name="control/enable_external_control" default="false"/> 
    <arg name="launch_prefix" default="" />

    <!-- 启动uav_control_main -->
    <node pkg="prometheus_uav_control" type="uav_control_main" name="uav_control_main_$(arg uav_id)" output="screen" launch-prefix="$(arg launch_prefix)">
        <param name="uav_id" value="$(arg uav_id)" />
        <param name="sim_mode" value="$(arg sim_mode)" />
        <param name="flag_printf" value="$(arg flag_printf)" />
        <param name="control/enable_external_control" value="$(arg control/enable_external_control)" />
        <rosparam command="load" file="$(find prometheus_uav_control)/launch/uav_control_outdoor.yaml" />
        <rosparam command="load" file="$(find prometheus_uav_control)/launch/sensor_tf_offset.yaml" />
    </node>

    <!-- 启动虚拟摇杆驱动 -->
    <arg name="joy_enable" default="true"/>
    <group if="$(arg joy_enable)">
        <node pkg="prometheus_uav_control" type="joy_node" name="joy_node" output="screen">
            <param name="agent_num" value="$(arg uav_id)"/>
        </node>
    </group>
</launch>

产生报错:
 * /uav_control_main_1/sim_mode: True
 * /uav_control_main_1/uav_id: 1

NODES
  /
    joy_node (prometheus_uav_control/joy_node)
    uav_control_main_1 (prometheus_uav_control/uav_control_main)

ROS_MASTER_URI=http://localhost:11311

ERROR: cannot launch node of type [prometheus_uav_control/uav_control_main]: Cannot locate node of type [uav_control_main] in package [prometheus_uav_control]. Make sure file exists in package path and permission is set to executable (chmod +x)
ERROR: cannot launch node of type [prometheus_uav_control/joy_node]: Cannot locate node of type [joy_node] in package [prometheus_uav_control]. Make sure file exists in package path and permission is set to executable (chmod +x)
No processes to monitor
shutting down processing monitor...
这个该怎么解决?

首先尝试给权限

复制代码
进入节点文件所在目录:
cd ~/catkin_ws/src/prometheus_uav_control/xxx  # 对应目录
然后加执行权限:

chmod +x uav_control_main
chmod +x joy_node

不行


然后发现,执行那一个sh命令其实很多东西都没编译通过,于是开始逐个编译

编译uav_control:tf2_geometry_msgs找不到

缺少了一部分编译uav_control ,cannot launch node of type [prometheus_uav_control/uav_control_main]

复制代码
catkin_make --source Modules/uav_control --build build/uav_control

尝试单独编译,还是报错,说是缺少tf2_geometry_msgs

Could not find a package configuration file provided by "tf2_geometry_msgs"

复制代码
我执行catkin_make --source Modules/uav_control --build build/uav_control时,产生报错:

-- Using CATKIN_DEVEL_PREFIX: /home/zeratul/proj/Prometheus/devel
-- Using CMAKE_PREFIX_PATH: /home/zeratul/proj/Prometheus/devel;/home/zeratul/prometheus_mavros/devel;/home/zeratul/proj/lc_ws/devel;/opt/ros/melodic
-- This workspace overlays: /home/zeratul/proj/Prometheus/devel;/home/zeratul/prometheus_mavros/devel;/home/zeratul/proj/lc_ws/devel;/opt/ros/melodic
-- Found PythonInterp: /usr/bin/python2 (found suitable version "2.7.17", minimum required is "2") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python2
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/zeratul/proj/Prometheus/build/uav_control/test_results
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python2 (found version "2.7.17") 
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.29
-- BUILD_SHARED_LIBS is on
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- Could NOT find tf2_geometry_msgs (missing: tf2_geometry_msgs_DIR)
-- Could not find the required component 'tf2_geometry_msgs'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "tf2_geometry_msgs"
  with any of the following names:

    tf2_geometry_msgsConfig.cmake
    tf2_geometry_msgs-config.cmake

  Add the installation prefix of "tf2_geometry_msgs" to CMAKE_PREFIX_PATH or
  set "tf2_geometry_msgs_DIR" to a directory containing one of the above
  files.  If "tf2_geometry_msgs" provides a separate development package or
  SDK, be sure it has been installed.
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)


-- Configuring incomplete, errors occurred!
该怎么解决?

说是不同系统版本中的问题,尝试了方案改名

方案 A:把 tf2_geometry_msgs********替换为 tf2_ros****+**** geometry_msgs****(推荐)****

Modules/uav_control/CMakeLists.txt

找到:

find_package(tf2_geometry_msgs REQUIRED)

删掉它,并确保存在:

复制代码
find_package(catkin REQUIRED COMPONENTS
    roscpp
    tf2_ros
    geometry_msgs
    # 你的其他依赖...
)

如果你的代码中用到了:

#include <tf2_geometry_msgs/tf2_geometry_msgs.h>

放心,这个头文件在 Melodic 中仍然存在 ,它属于 tf2_ros

然后重新编译:

catkin_make --source Modules/uav_control --build build/uav_control

这是备份原始的cmakelist:
复制代码
cmake_minimum_required(VERSION 2.8.3)
project(prometheus_uav_control)

find_package(catkin REQUIRED COMPONENTS
  message_generation  
  roscpp
  geometry_msgs
  nav_msgs
  sensor_msgs
  mavros
  std_msgs
  std_srvs
  tf
  tf2_ros
  tf2_eigen
  mavros_msgs
  prometheus_msgs
  tf2_geometry_msgs
)

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
find_package(mavlink REQUIRED)

################################################
## Declare ROS messages, services and actions ##
################################################

## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  geometry_msgs 
  nav_msgs
  sensor_msgs
  std_msgs
  prometheus_msgs
)

catkin_package(
  INCLUDE_DIRS include
  CATKIN_DEPENDS message_runtime
)
###########
## Build ##
###########
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  include/Position_Controller
  ../common/include
  ../communication/include
  ${mavlink_INCLUDE_DIRS}
)

###############################
##      声明可执行cpp文件     ##
###############################
add_library(uav_controller src/uav_controller.cpp ../communication/src/param_manager.cpp)
add_library(uav_estimator src/uav_estimator.cpp)
target_link_libraries(uav_estimator ${catkin_LIBRARIES})

add_executable(uav_control_main src/uav_control_node.cpp)
add_dependencies(uav_control_main prometheus_uav_control_gencpp)
target_link_libraries(uav_control_main ${catkin_LIBRARIES})
target_link_libraries(uav_control_main uav_controller)
target_link_libraries(uav_control_main uav_estimator)

add_executable(uav_command_pub utils/uav_command_pub.cpp)
add_dependencies(uav_command_pub prometheus_uav_control_gencpp)
target_link_libraries(uav_command_pub ${catkin_LIBRARIES})

add_executable(rc_test utils/rc_test.cpp)
add_dependencies(rc_test prometheus_uav_control_gencpp)
target_link_libraries(rc_test ${catkin_LIBRARIES})

add_executable(joy_node utils/joy_node.cpp)
target_link_libraries(joy_node ${catkin_LIBRARIES})

## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
)

## Mark other files for installation (e.g. launch and bag files, etc.)
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)
继续报错fatal error: tf2_geometry_msgs/tf2_geometry_msgs.h: 没有那个文件或目录
复制代码
[ 50%] Building CXX object CMakeFiles/uav_command_pub.dir/utils/uav_command_pub.cpp.o
In file included from /home/zeratul/proj/Prometheus/Modules/uav_control/src/uav_estimator.cpp:1:
/home/zeratul/proj/Prometheus/Modules/uav_control/include/uav_estimator.h:11:10: fatal error: tf2_geometry_msgs/tf2_geometry_msgs.h: 没有那个文件或目录
   11 | #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/uav_estimator.dir/build.make:62: recipe for target 'CMakeFiles/uav_estimator.dir/src/uav_estimator.cpp.o' failed
make[2]: *** [CMakeFiles/uav_estimator.dir/src/uav_estimator.cpp.o] Error 1
CMakeFiles/Makefile2:810: recipe for target 'CMakeFiles/uav_estimator.dir/all' failed
make[1]: *** [CMakeFiles/uav_estimator.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
[ 50%] Built target prometheus_uav_control_generate_messages_eus
/home/zeratul/proj/Prometheus/Modules/uav_control/utils/joy_node.cpp:97:51: warning: ignoring attributes on template argument 'int (*)(DIR*)' {aka 'int (*)(__dirstream*)'} [-Wignored-attributes]
   97 |   typedef std::unique_ptr<DIR, decltype(&closedir)> dir_ptr;
      |                                                   ^
[ 57%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/prometheus_uav_control/rc_test

[ 64%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/prometheus_uav_control/joy_node
[ 64%] Built target joy_node
[ 71%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/prometheus_uav_control/uav_command_pub
In file included from /home/zeratul/proj/Prometheus/Modules/uav_control/include/uav_controller.h:36,
                 from /home/zeratul/proj/Prometheus/Modules/uav_control/src/uav_controller.cpp:1:
/home/zeratul/proj/Prometheus/Modules/uav_control/../common/include/math_utils.h: In function 'float sign_function(float)':
/home/zeratul/proj/Prometheus/Modules/uav_control/../common/include/math_utils.h:112:1: warning: control reaches end of non-void function [-Wreturn-type]
  112 | }
      | ^
/home/zeratul/proj/Prometheus/Modules/uav_control/src/uav_controller.cpp: In member function 'Eigen::Vector4d UAV_controller::get_cmd_from_controller()':
/home/zeratul/proj/Prometheus/Modules/uav_control/src/uav_controller.cpp:439:1: warning: control reaches end of non-void function [-Wreturn-type]
  439 | }
      | ^
[ 71%] Built target uav_command_pub
[ 78%] Linking CXX shared library /home/zeratul/proj/Prometheus/devel/lib/libuav_controller.so
[ 78%] Built target uav_controller
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j20 -l20" failed
修改之后又产生上述报错,什么原因

再重新整理了一遍问题,给gpt,发现是它对第一个问题的判断有误,不是ubuntu18名字不是这个,而是根本没有安装好这个库,只需要把这个库安装上即可!!

这里正确的解决方案

💡

复制代码
sudo apt-get update
sudo apt-get install ros-melodic-tf2-geometry-msgs

环境变量里面有重复的,注释掉

编译ego_planner_swarm:mutex、void depthCallback函数报错

单独编译

复制代码
catkin_make --source Modules/ego_planner_swarm --build build/ego_planner_swarm

首先互斥锁报错,另外emplace_back也产生报错,说是没有这个功能

复制代码
这个编译报错:catkin_make --source Modules/ego_planner_swarm --build build/ego_planner_swarm
[ 54%] Built target su17_rvl_decoder
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:19:6: error: 'mutex' in namespace 'std' does not name a type
   19 | std::mutex mtx; // 全局互斥锁
      |      ^~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:14:1: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
   13 | #include <pcl/filters/voxel_grid.h>
  +++ |+#include <mutex>
   14 | // 配置参数
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp: In lambda function:
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:30: error: 'lock_guard' is not a member of 'std'
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                              ^~~~~~~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:30: note: 'std::lock_guard' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:46: error: 'mutex' is not a member of 'std'
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                              ^~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:46: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:58: error: 'mtx' was not declared in this scope
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                                          ^~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:53: error: 'lock' was not declared in this scope; did you mean 'boost::lock'?
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                                     ^~~~
      |                                                     boost::lock
In file included from /usr/include/boost/thread/locks.hpp:10,
                 from /usr/include/boost/thread.hpp:21,
                 from /usr/include/pcl-1.8/pcl/io/boost.h:51,
                 from /usr/include/pcl-1.8/pcl/io/file_io.h:43,
                 from /usr/include/pcl-1.8/pcl/io/pcd_io.h:44,
                 from /opt/ros/melodic/include/pcl_conversions/pcl_conversions.h:70,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:10:
/usr/include/boost/thread/lock_algorithms.hpp:253:8: note: 'boost::lock' declared here
  253 |   void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
      |        ^~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:182:36: error: 'class pcl::PointCloud<pcl::PointXYZ>' has no member named 'emplace_back'
  182 |                         raw_cloud->emplace_back(p.x(), p.y(), p.z());
      |                                    ^~~~~~~~~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp: In member function 'void Depth_Pointcloud::depth_to_point(const ConstPtr&)':
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:185:14: error: invalid initialization of reference of type 'const cv::ParallelLoopBody&' from expression of type 'Depth_Pointcloud::depth_to_point(const ConstPtr&)::<lambda(const cv::Range&)>'
  185 |             });
      |              ^
In file included from /usr/include/opencv2/core.hpp:3216,
                 from /usr/include/opencv2/core/core.hpp:48,
                 from /opt/ros/melodic/include/cv_bridge/cv_bridge.h:43,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:4:
/usr/include/opencv2/core/utility.hpp:478:75: note: in passing argument 2 of 'void cv::parallel_for_(const cv::Range&, const cv::ParallelLoopBody&, double)'
  478 | CV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body, double nstripes=-1.);
      |                                                   ~~~~~~~~~~~~~~~~~~~~~~~~^~~~
[ 55%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/drone_detect/drone_detect
[ 55%] Built target drone_detect
[ 57%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/plan_env/obj_generator
[ 57%] Built target obj_generator
plan_env/CMakeFiles/su17_depth_to_cloud.dir/build.make:62: recipe for target 'plan_env/CMakeFiles/su17_depth_to_cloud.dir/src/su17_depth_to_cloud.cpp.o' failed
make[2]: *** [plan_env/CMakeFiles/su17_depth_to_cloud.dir/src/su17_depth_to_cloud.cpp.o] Error 1
CMakeFiles/Makefile2:1477: recipe for target 'plan_env/CMakeFiles/su17_depth_to_cloud.dir/all' failed
make[1]: *** [plan_env/CMakeFiles/su17_depth_to_cloud.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
[ 59%] Linking CXX shared library /home/zeratul/proj/Prometheus/devel/lib/libtraj_utils.so
[ 59%] Built target traj_utils
[ 61%] Linking CXX shared library /home/zeratul/proj/Prometheus/devel/lib/libplan_env.so
[ 61%] Built target plan_env
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j20 -l20" failed
Base path: /home/zeratul/proj/Prometheus
Source space: /home/zeratul/proj/Prometheus/Modules/motion_planning
Build space: /home/zeratul/proj/Prometheus/build/motion_planning
Devel space: /home/zeratul/proj/Prometheus/devel
Install space: /home/zeratul/proj/Prometheus/install

gpt给的建议是

把:
raw_cloud->emplace_back(p.x(), p.y(), p.z());
改成:
raw_cloud->points.emplace_back(p.x(), p.y(), p.z()); // 有时这个也不行
或者最稳妥:
pcl::PointXYZ pt(p.x(), p.y(), p.z());
raw_cloud->points.push_back(pt);

互斥锁让我自己导入命名空间


另有一个报错:

复制代码
[ 49%] Built target traj_utils_generate_messages_eus
Scanning dependencies of target traj_utils_generate_messages
[ 49%] Built target traj_utils_generate_messages
In file included from /opt/ros/melodic/include/ros/ros.h:40,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:1:
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp: In function 'void depthCallback(const ImageConstPtr&)':
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:60:19: warning: format '%zu' expects argument of type 'size_t', but argument 8 has type 'prometheus_msgs::DepthCompressed_<std::allocator<void> >::_height_type' {aka 'unsigned int'} [-Wformat=]
   60 |         ROS_DEBUG("Encoded %zux%zu -> %zu bytes",
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   61 |                  compressed_msg.height, compressed_msg.width, compressed_data.size());
      |                  ~~~~~~~~~~~~~~~~~~~~~
      |                                 |
      |                                 prometheus_msgs::DepthCompressed_<std::allocator<void> >::_height_type {aka unsigned int}
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:60:30: note: format string is defined here
   60 |         ROS_DEBUG("Encoded %zux%zu -> %zu bytes",
      |                            ~~^
      |                              |
      |                              long unsigned int
      |                            %u
In file included from /opt/ros/melodic/include/ros/ros.h:40,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:1:
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:60:19: warning: format '%zu' expects argument of type 'size_t', but argument 9 has type 'prometheus_msgs::DepthCompressed_<std::allocator<void> >::_width_type' {aka 'unsigned int'} [-Wformat=]
   60 |         ROS_DEBUG("Encoded %zux%zu -> %zu bytes",
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   61 |                  compressed_msg.height, compressed_msg.width, compressed_data.size());
      |                                         ~~~~~~~~~~~~~~~~~~~~
      |                                                        |
      |                                                        prometheus_msgs::DepthCompressed_<std::allocator<void> >::_width_type {aka unsigned int}
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_rvl_encoder.cpp:60:34: note: format string is defined here
   60 |         ROS_DEBUG("Encoded %zux%zu -> %zu bytes",
      |                                ~~^
      |                                  |
      |                                  long unsigned int
      |                                %u
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/traj_utils/src/planning_visualization.cpp: In member function 'void ego_planner::PlanningVisualization::displayMultiInitPathList(std::vector<std::vector<Eigen::Matrix<double, 3, 1> > >, double)':
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/traj_utils/src/planning_visualization.cpp:186:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<Eigen::Matrix<double, 3, 1> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  186 |     for ( int id=0; id<init_trajs.size(); id++ )
      |                     ~~^~~~~~~~~~~~~~~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/obj_predictor.cpp: In member function 'void fast_planner::ObjHistory::poseCallback(const PoseStampedConstPtr&)':
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/obj_predictor.cpp:56:23: warning: comparison of integer expressions of different signedness: 'std::__cxx11::list<Eigen::Matrix<double, 4, 1> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   56 |   if (history_.size() > queue_size_) history_.pop_front();
      |       ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
[ 50%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/plan_env/su17_rvl_encoder
[ 50%] Built target su17_rvl_encoder
[ 52%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/plan_env/laser_to_pointcloud
[ 54%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/plan_env/su17_rvl_decoder
[ 54%] Built target laser_to_pointcloud
[ 54%] Built target su17_rvl_decoder
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:19:6: error: 'mutex' in namespace 'std' does not name a type
   19 | std::mutex mtx; // 全局互斥锁
      |      ^~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:14:1: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
   13 | #include <pcl/filters/voxel_grid.h>
  +++ |+#include <mutex>
   14 | // 配置参数
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp: In lambda function:
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:30: error: 'lock_guard' is not a member of 'std'
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                              ^~~~~~~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:30: note: 'std::lock_guard' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:46: error: 'mutex' is not a member of 'std'
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                              ^~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:46: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:58: error: 'mtx' was not declared in this scope
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                                          ^~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:181:53: error: 'lock' was not declared in this scope; did you mean 'boost::lock'?
  181 |                         std::lock_guard<std::mutex> lock(mtx); // 加锁
      |                                                     ^~~~
      |                                                     boost::lock
In file included from /usr/include/boost/thread/locks.hpp:10,
                 from /usr/include/boost/thread.hpp:21,
                 from /usr/include/pcl-1.8/pcl/io/boost.h:51,
                 from /usr/include/pcl-1.8/pcl/io/file_io.h:43,
                 from /usr/include/pcl-1.8/pcl/io/pcd_io.h:44,
                 from /opt/ros/melodic/include/pcl_conversions/pcl_conversions.h:70,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:10:
/usr/include/boost/thread/lock_algorithms.hpp:253:8: note: 'boost::lock' declared here
  253 |   void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
      |        ^~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:182:36: error: 'class pcl::PointCloud<pcl::PointXYZ>' has no member named 'emplace_back'
  182 |                         raw_cloud->emplace_back(p.x(), p.y(), p.z());
      |                                    ^~~~~~~~~~~~
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp: In member function 'void Depth_Pointcloud::depth_to_point(const ConstPtr&)':
/home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:185:14: error: invalid initialization of reference of type 'const cv::ParallelLoopBody&' from expression of type 'Depth_Pointcloud::depth_to_point(const ConstPtr&)::<lambda(const cv::Range&)>'
  185 |             });
      |              ^
In file included from /usr/include/opencv2/core.hpp:3216,
                 from /usr/include/opencv2/core/core.hpp:48,
                 from /opt/ros/melodic/include/cv_bridge/cv_bridge.h:43,
                 from /home/zeratul/proj/Prometheus/Modules/ego_planner_swarm/plan_env/src/su17_depth_to_cloud.cpp:4:
/usr/include/opencv2/core/utility.hpp:478:75: note: in passing argument 2 of 'void cv::parallel_for_(const cv::Range&, const cv::ParallelLoopBody&, double)'
  478 | CV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body, double nstripes=-1.);
      |                                                   ~~~~~~~~~~~~~~~~~~~~~~~~^~~~
[ 55%] Linking CXX executable /home/zeratul/proj/Prometheus/devel/lib/drone_detect/drone_detect

总结来说。核心在于opencv版本不正确和冲突,我没有那个版本opencv也不想装,都是定位在一个su17_depth_to_cloud.cpp里面,所以直接选择这个cpp不参与编译了,也用不到。修改相应的cmakelist就可以

复制代码
cmake_minimum_required(VERSION 2.8.3)
project(plan_env)

set(CMAKE_BUILD_TYPE "Release")
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

find_package(OpenCV REQUIRED)


find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  visualization_msgs
  cv_bridge
  message_filters
  laser_geometry
  sensor_msgs
  prometheus_msgs
)

find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)

catkin_package(
 INCLUDE_DIRS include
 LIBRARIES plan_env
 CATKIN_DEPENDS roscpp std_msgs prometheus_msgs
 DEPENDS OpenCV
#  DEPENDS system_lib
)

include_directories( 
    SYSTEM 
    include 
    /home/amov/Prometheus/devel/include/prometheus_msgs/ParamSettings.h
    ${catkin_INCLUDE_DIRS}
    ${Eigen3_INCLUDE_DIRS} 
    ${PCL_INCLUDE_DIRS}
    ${OpenCV_INCLUDE_DIRS}
)

link_directories(${PCL_LIBRARY_DIRS})

add_library( plan_env 
    src/grid_map.cpp 
    src/raycast.cpp
    src/obj_predictor.cpp 
    )
target_link_libraries( plan_env
    ${catkin_LIBRARIES} 
    ${PCL_LIBRARIES}
    ${OpenCV_LIBS}
    )  

add_executable(obj_generator
    src/obj_generator.cpp 
)
target_link_libraries(obj_generator 
    ${catkin_LIBRARIES}
    )

add_executable(laser_to_pointcloud
    src/laser_to_pointcloud.cpp 
)
target_link_libraries(laser_to_pointcloud 
    ${catkin_LIBRARIES}
    )
add_executable(su17_depth_to_cloud
    src/su17_depth_to_cloud.cpp 
)
target_link_libraries(su17_depth_to_cloud 
    ${catkin_LIBRARIES}
    ${OpenCV_LIBRARIES}
    ${PCL_LIBRARIES}
    )
    
add_executable(su17_rvl_encoder src/su17_rvl_encoder.cpp)
target_link_libraries(su17_rvl_encoder
  ${catkin_LIBRARIES}
  ${OpenCV_LIBS}
  ${PCL_LIBRARIES}
)

add_executable(su17_rvl_decoder src/su17_rvl_decoder.cpp)
target_link_libraries(su17_rvl_decoder
  ${catkin_LIBRARIES}
  ${OpenCV_LIBS}
  ${PCL_LIBRARIES}
)    
上述过程,可否不编译su17_depth_to_cloud.cpp ,该如何处理能不编译这个代码,编译其他的

直接注释掉对应代码就行

编译simulator_utils:gazebo_msgs/ModelState.h: 没有那个文件或目录

单独编译指令:

复制代码
catkin_make --source Modules/simulator_utils --build build/simulator_utils

产生报错fatal error: gazebo_msgs/ModelState.h: 没有那个文件或目录

复制代码
我执行catkin_make --source Modules/simulator_utils --build build/simulator_utils报错:
zeratul@zeratul-Dell-G15-5530:~/proj/Prometheus$ catkin_make --source Modules/simulator_utils --build build/simulator_utils
Base path: /home/zeratul/proj/Prometheus
Source space: /home/zeratul/proj/Prometheus/Modules/simulator_utils
Build space: /home/zeratul/proj/Prometheus/build/simulator_utils
Devel space: /home/zeratul/proj/Prometheus/devel
Install space: /home/zeratul/proj/Prometheus/install
####
#### Running command: "make cmake_check_build_system" in "/home/zeratul/proj/Prometheus/build/simulator_utils"
####
####
#### Running command: "make -j20 -l20" in "/home/zeratul/proj/Prometheus/build/simulator_utils"
####
[  7%] Building CXX object CMakeFiles/fake_uav.dir/fake_odom/fake_uav.cpp.o
[ 21%] Built target plan_visual
[ 35%] Built target map_generator
[ 50%] Built target laser_sim_node
[ 64%] Built target min_snap_visual
[ 78%] Built target map_generator_node
In file included from /home/zeratul/proj/Prometheus/Modules/simulator_utils/fake_odom/fake_uav.cpp:1:
/home/zeratul/proj/Prometheus/Modules/simulator_utils/include/fake_uav.h:11:10: fatal error: gazebo_msgs/ModelState.h: 没有那个文件或目录
   11 | #include <gazebo_msgs/ModelState.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/fake_uav.dir/build.make:62: recipe for target 'CMakeFiles/fake_uav.dir/fake_odom/fake_uav.cpp.o' failed
make[2]: *** [CMakeFiles/fake_uav.dir/fake_odom/fake_uav.cpp.o] Error 1
CMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/fake_uav.dir/all' failed
make[1]: *** [CMakeFiles/fake_uav.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j20 -l20" failed

缺少的gazebo_msgs/ModelState.h在另一个工作空间下,如/home/zeratul/proj/lc_ws下有gazebo_msgs

这个就是编译使用外部库(这里还是lc下面的),找不到路径,所以把这个gazebomsg包含进去,就可以编译通过

编译tutorial_demo不通过

也会报错,直接编译一半,只编译basic

复制代码
cmake_minimum_required(VERSION 2.8.3)
project(prometheus_demo)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS
  message_generation
  roscpp
  rospy
  geometry_msgs
  sensor_msgs
  mavros
  nav_msgs
  std_msgs
  std_srvs
  tf2_ros
  tf2_eigen
  mavros_msgs
  prometheus_msgs
)

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)

# 移除了 OpenCV,因为通常只有 advanced 里的视觉模块需要它
# find_package(OpenCV 4 REQUIRED)

################################################
## Declare ROS messages, services and actions ##
################################################

generate_messages(
  DEPENDENCIES
  geometry_msgs
  sensor_msgs
  std_msgs
)

catkin_package(
  CATKIN_DEPENDS message_runtime
)

###########
## Build ##
###########

## Specify additional locations of header files
include_directories(
  include
  # advanced/include  <-- [已移除] 移除高级模块头文件路径
  ${catkin_INCLUDE_DIRS}
  ../common/include
  ../communication/include
  # ${OpenCV_INCLUDE_DIRS} <-- [已移除]
)

###############################
##      声明可执行cpp文件     ##
###############################

# --- Basic 模块 (保留) ---

add_executable(takeoff_land basic/takeoff_land/src/takeoff_land.cpp)
target_link_libraries(takeoff_land ${catkin_LIBRARIES})

add_executable(takeoff_land_no_rc basic/takeoff_land/src/takeoff_land_no_rc.cpp)
target_link_libraries(takeoff_land_no_rc ${catkin_LIBRARIES})

add_executable(global_pos_control basic/global_pos_control/src/global_pos_control.cpp)
target_link_libraries(global_pos_control ${catkin_LIBRARIES})

add_executable(enu_xyz_pos_control basic/enu_xyz_pos_control/src/enu_xyz_pos_control.cpp)
target_link_libraries(enu_xyz_pos_control ${catkin_LIBRARIES})

add_executable(body_xyz_pos_control basic/body_xyz_pos_control/src/body_xyz_pos_control.cpp)
target_link_libraries(body_xyz_pos_control ${catkin_LIBRARIES})

add_executable(circular_trajectory_control basic/circular_trajectory_control/src/circular_trajectory_control.cpp)
target_link_libraries(circular_trajectory_control ${catkin_LIBRARIES})

add_executable(waypoint_pos_control basic/waypoint_pos_control/src/waypoint_pos_control.cpp)
target_link_libraries(waypoint_pos_control ${catkin_LIBRARIES})

# --- Advanced 模块 (已全部移除) ---
# 包括 formation_control, swarm_control, yolov5_tracking, aruco_tracking, prosim_... 等

#############
## Install ##
#############

## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
)

## Mark other files for installation
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)

运行./takeoff_land_P450.sh解决系列报错:

cd ~/Prometheus/Scripts/simulation/tutorial_demo/takeoff_land

对应的根本launch文件

roslaunch prometheus_gazebo sitl_outdoor_1uav_P450.launch

起初的报错:

这个报错提出了解决方法,修改launch文件的启动方式

gazebo_ros_pkgs使用外部库排查

一开始排查发现是路径的有些问题,使用的外部库

复制代码
/home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model
roslaunch gazebo_ros empty_world.launch
which spawn_model
看 ROS 实际在调用哪个 spawn_model

测试上面几个命令,确实不一样。所以把使用的库删除,再安装ros的官方库

复制代码
Melodic:
sudo apt update
sudo apt install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-control


安装完会自动恢复:

/opt/ros/melodic/share/gazebo_ros/


以及官方 spawn_model:

/opt/ros/melodic/lib/gazebo_ros/spawn_model


然后重新编译你的工作空间:

cd ~/proj/lc_ws
catkin_make

没删除lc的.结果还是

复制代码
zeratul@zeratul-Dell-G15-5530:~/proj/Prometheus$ roscd gazebo_ros_pkgs
zeratul@zeratul-Dell-G15-5530:~/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros_pkgs$ 
为什么还是这个

所以把老库删除,只使用官方库

官方gazebo_ros_pkgs报错:ERROR: cannot launch node of type [gazebo_ros/gzserver]。。
复制代码
安装完后使用报错:
ERROR: cannot launch node of type [gazebo_ros/gzserver]: Cannot locate node of type [gzserver] in package [gazebo_ros]. Make sure file exists in package path and permission is set to executable (chmod +x)
ERROR: cannot launch node of type [gazebo_ros/gzclient]: Cannot locate node of type [gzclient] in package [gazebo_ros]. Make sure file exists in package path and permission is set to executable (chmod +x)
process[uav1/sitl_1-3]: started with pid [10699]
ERROR: cannot launch node of type [gazebo_ros/spawn_model]: Cannot locate node of type [spawn_model] in package [gazebo_ros]. Make sure file exists in package path and permission is set to executable (chmod +x)

执行一系列测试指令定位这三个找不到的包

复制代码
which gzserver
which gzclient
rospack find gazebo_ros
roscd gazebo_ros
ls -l
cd $(rospack find gazebo_ros)/scripts

--实际都是在的

测试是不是几个包没有权限

复制代码
sudo chmod +x /opt/ros/melodic/lib/gazebo_ros/spawn_model
sudo chmod +x /usr/bin/gzserver
sudo chmod +x /usr/bin/gzclient

--实际有权限

gazebo --version

复制代码
zeratul@zeratul-Dell-G15-5530:~$ which gzserver
/usr/bin/gzserver
zeratul@zeratul-Dell-G15-5530:~$ which gzclient
/usr/bin/gzclient
zeratul@zeratul-Dell-G15-5530:~$ rospack find gazebo_ros
/opt/ros/melodic/share/gazebo_ros
zeratul@zeratul-Dell-G15-5530:~$ roscd gazebo_ros
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ ls -l
总用量 16
drwxr-xr-x 2 root root 4096 12月 12 18:18 cmake
drwxr-xr-x 2 root root 4096 12月 12 18:18 launch
-rw-r--r-- 1 root root 1441 5月   2  2020 package.xml
drwxr-xr-x 2 root root 4096 12月 12 18:18 test
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ cd $(rospack find gazebo_ros)/scripts
bash: cd: /opt/ros/melodic/share/gazebo_ros/scripts: 没有那个文件或目录
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ gazebo --version
Gazebo multi-robot simulator, version 9.19.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org


Gazebo multi-robot simulator, version 9.19.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org
我又进行了
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ sudo chmod +x /opt/ros/melodic/lib/gazebo_ros/spawn_model
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ sudo chmod +x /usr/bin/gzserver
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ sudo chmod +x /usr/bin/gzclient
还是不管用

然后尝试了重新安装ros_pkgs包

复制代码
sudo apt remove ros-melodic-gazebo-*
sudo apt autoremove
sudo apt install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-control

定位spawn的位置

复制代码
dpkg -L ros-melodic-gazebo-ros-pkgs | grep spawn
dpkg -L ros-melodic-gazebo-ros | grep spawn
rospack find gazebo_ros
ls /opt/ros/melodic/share/gazebo_ros

zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ dpkg -L ros-melodic-gazebo-ros | grep spawn
/opt/ros/melodic/lib/gazebo_ros/spawn_model

zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ rospack find gazebo_ros
/opt/ros/melodic/share/gazebo_ros

zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ ls /opt/ros/melodic/share/gazebo_ros
cmake  launch  package.xml  test

通过这一系列测试,定位到了根本问题,官方的gazebo_ros 包不完整

重新安装一个完整的官方版本不可预见性会比较大,问了已经配置好的,使用xtdrone对应的完整版gazebo_ros_pkgs就可以

rospack find gazebo_ros,使用xtdrone的
复制代码
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros$ roscd gazebo_ros
roscd: No such package/stack 'gazebo_ros'
我在另一个目录下/home/zeratul/proj/xtdrone_ws/src/gazebo_ros_pkgs/gazebo_ros有这个包并编译通过了,怎么使用这个

使用这个包的方法是直接source对应的目录,如果想编译需要这个包的代码,那么对应终端提前source,要么是直接在环境变量中设置。以下是编译指令:

复制代码
source /home/zeratul/proj/xtdrone_ws/devel/setup.bash
catkin_make --source Modules/simulator_utils --build build/simulator_utils

source /home/zeratul/proj/xtdrone_ws/devel/setup.bash
roslaunch prometheus_gazebo sitl_outdoor_1uav_P450.launch

编译另一个包会报错

复制代码
zeratul@zeratul-Dell-G15-5530:/opt/ros/melodic/share/gazebo_ros_pkgs$ catkin_make --source Modules/simulator_utils --build build/simulator_utils
The specified base path "/opt/ros/melodic/share/gazebo_ros_pkgs" does not exist

这是覆盖source的原因,有顺序,xtdrone在前,pro在后

source的顺序决定了,谁是基础的依赖环境,在前的更重要

UnicodeEncodeError: 'ascii' codec can't encode characters in position

之前排查问题,相当于绕了一个大圈子,使用原来的rospkgs没问题,还是集中解决launch报错

复制代码
运行roslaunch prometheus_gazebo sitl_outdoor_1uav_P450.launch报错:

NODES
  /
    gazebo (gazebo_ros/gzserver)
    gazebo_gui (gazebo_ros/gzclient)
  /uav1/
    mavros (mavros/mavros_node)
    p450_1_spawn (gazebo_ros/spawn_model)
    sitl_1 (px4/px4)

ROS_MASTER_URI=http://localhost:11311

process[gazebo-1]: started with pid [21558]
process[gazebo_gui-2]: started with pid [21561]
process[uav1/sitl_1-3]: started with pid [21581]
INFO  [px4] Creating symlink /home/zeratul/proj/prometheus_px4/ROMFS/px4fmu_common -> /home/zeratul/.ros/sitl_amov_0/etc

PX4 SIM HOST: localhost
INFO  [simulator] Waiting for simulator to accept connection on TCP port 4560
[INFO] [1765532258.583246]: Loading model XML from ros parameter sdf_p450_0
Traceback (most recent call last):
  File "/home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model", line 239, in <module>
    exit_code = sm.run()
  File "/home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model", line 149, in run
    xml_parsed = xml.etree.ElementTree.fromstring(model_xml)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1311, in XML
    parser.feed(text)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1657, in feed
    self._parser.Parse(data, 0)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 16486-16488: ordinal not in range(128)
[uav1/p450_1_spawn-4] process has died [pid 21613, exit code 1, cmd /home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model -sdf -param sdf_p450_0 -model p450_0 -x 0.0 -y 0.0 -z 0.15 -Y 0.0 __name:=p450_1_spawn __log:=/home/zeratul/.ros/log/2f1ed458-d73e-11f0-a567-e0d04591e3e9/uav1-p450_1_spawn-4.log].
log file: /home/zeratul/.ros/log/2f1ed458-d73e-11f0-a567-e0d04591e3e9/uav1-p450_1_spawn-4*.log
[ INFO] [1765532258.938727136]: waitForService: Service [/gazebo/set_physics_properties] is now available.
[ INFO] [1765532258.948871574]: Physics dynamic reconfigure ready.

这是什么原因?

Traceback (most recent call last):
File "/home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model", line 239, in <module>
exit_code = sm.run()
File "/home/zeratul/proj/lc_ws/src/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model", line 149, in run
xml_parsed = xml.etree.ElementTree.fromstring(model_xml)
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1311, in XML
parser.feed(text)
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1657, in feed
self._parser.Parse(data, 0)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 16486-16488: ordinal not in range(128)

给出的建议比较模糊

复制代码
执行:
rosparam get /uav1/sdf_p450_0 > /tmp/p450.sdf


然后:
file /tmp/p450.sdf


如果显示:
UTF-8 Unicode text, with BOM
UTF-8 Unicode text, with non-ASCII characters
那就找到了问题。

也可以:
grep --color='auto' -P -n "[\x80-\xFF]" /tmp/p450.sdf
看到的都是非 ASCII 字符(中文/特殊符号)。

<arg name="sdf_path" default="/tmp/p450_$(arg ID).sdf"/>
<param command="$(arg cmd) > $(arg sdf_path)" name="tmp"/>

<node ... type="spawn_model"
    args="-sdf -file /PATH/TO/GENERATED/FILE.sdf ..."/>

首先是关键无人机配置launch文件

复制代码
<launch>
    <!-- 启动 PX4 SITL -->
    <!-- 相关文件: -->
    <!-- PX4 SITL rcS启动脚本路径:~/prometheus_px4/ROMFS/px4fmu_common/init.d-posix/rcS -->
    <!-- PX4 SITL 无人机模型文件:~/prometheus_px4/ROMFS/px4fmu_common/init.d-posix/1046_p230 或 1045_p450-->

    <!-- vehicle model and config -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="p450"/>

    <!-- 仿真模型,对应不同的模型文件 -->
    <env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
    <!-- ekf2 使用GPS作为定位来源-->
    <env name="PX4_ESTIMATOR" value="ekf2" />
    <!-- 仿真速度因子 1.0代表与真实时间同步,大于1加快仿真速度,小于1则减慢 (电脑性能较差,可选择减小该参数)-->
    <env name="PX4_SIM_SPEED_FACTOR" value="1.0" />

    <!-- 无人机ID号 -->
    <arg name="uav_id" default="1"/>
    
    <!-- 初始位置,Yaw为偏航角 -->
    <arg name="uav_init_x" default="0.0"/>
    <arg name="uav_init_y" default="0.0"/>
    <arg name="uav_init_z" default="0.15"/>
    <arg name="uav_init_yaw" default="0.0"/>
    
    <!-- arg name="ID" default="1"/ -->
    <!-- env name="PX4_SIM_MODEL" value="$(arg vehicle)" / -->
    <!-- env name="PX4_ESTIMATOR" value="$(arg est)" / -->
    <!-- arg name="mavlink_udp_port" default="14560"/ -->
    <!-- arg name="mavlink_tcp_port" default="4560"/ -->
    
    <!-- 无人机编号说明 -->
    <!-- uav_id为Prometheus系统中对无人机编号的定义,从1开始 -->
    <!-- ID为本文件中对无人机编号的定义,从0开始 -->
    <!-- MAV_SYS_ID为PX4中无人机编号的定义,在rcS文件中可以发现:MAV_SYS_ID = ID + 1,即从1开始--> 
    <!-- 端口号说明 -->
    <!-- 仿真器端口号(用于飞控与Gazebo进行通讯): SDF文件中的mavlink_tcp_port与rcS文件中的simulator_tcp_port应当一致,并随着无人机编号递增 -->
    <!-- mavlink_tcp_port = simulator_tcp_port = 4560 + ID -->
    <!-- Offboard端口号(用于飞控与Mavros进行通讯) udp_offboard_port_local = 14580 + ID -->
    <!-- Offboard端口号(用于飞控与Mavros进行通讯) udp_offboard_port_remote = 14540 + ID -->
    <!-- 备注:PX4 SITL原生最多只支持10架无人机仿真,具体原因见rcS启动文件-->

    <!-- 使用group标签来对不同的无人机进行分组,因此,不同无人机的话题会带上前缀,如/uav0、/uav1等 -->
    <group ns="/uav$(arg uav_id)">
        <!-- ID编号 -->
        <arg name="ID" value="$(eval arg('uav_id') - 1)"/>
        <arg name="mavlink_id" value="$(eval 1 + arg('ID'))" />
        <arg name="mavlink_udp_port" default="$(eval 14560 + arg('ID'))"/>
        <arg name="mavlink_tcp_port" default="$(eval 4560 + arg('ID'))"/>
        <!-- 启动PX4 SITL,此处参数配置不可删除 -->
        <arg name="interactive" default="true"/>
        
        <!-- generate sdf vehicle model -->
        <arg name="cmd" default="$(find prometheus_gazebo)/scripts/jinja_gen.py --stdout --mavlink_id=$(arg mavlink_id) --mavlink_udp_port=$(arg mavlink_udp_port) --mavlink_tcp_port=$(arg mavlink_tcp_port) $(find prometheus_gazebo)/gazebo_models/uav_models/$(arg vehicle)/$(arg vehicle).sdf.jinja $(find prometheus_gazebo)"/>
        <param command="$(arg cmd)" name="sdf_$(arg vehicle)_$(arg ID)"/>
        
        
        <arg unless="$(arg interactive)" name="px4_command_arg1" value=""/>
        <arg     if="$(arg interactive)" name="px4_command_arg1" value="-d"/>
        <node name="sitl_$(arg uav_id)" pkg="px4" type="px4" output="screen" 
            args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg ID) -w sitl_amov_$(arg ID) $(arg px4_command_arg1)">
        </node>
        <!-- 启动Gazebo模型 -->
        <node name="$(arg vehicle)_$(arg uav_id)_spawn" pkg="gazebo_ros" type="spawn_model" output="screen"
            args="-sdf -param sdf_$(arg vehicle)_$(arg ID) -model $(arg vehicle)_$(arg ID) -x $(arg uav_init_x) -y $(arg uav_init_y) -z $(arg uav_init_z) -Y $(arg uav_init_yaw)">
        </node>
        
        <!-- 启动MAVROS -->
        <arg name="udp_offboard_port_remote" value="$(eval 14540 + arg('ID'))"/>
        <arg name="udp_offboard_port_local" value="$(eval 14580 + arg('ID'))"/>
        <node pkg="mavros" type="mavros_node" name="mavros" output="screen">
            <param name="fcu_url" value="udp://:$(arg udp_offboard_port_remote)@localhost:$(arg udp_offboard_port_local)"/>
            <param name="gcs_url" value="" />
            <param name="target_system_id" value="$(eval 1 + arg('ID'))"/>
            <param name="target_component_id" value="1" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_config_outdoor.yaml" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_pluginlists_outdoor.yaml" />
        </node>
    </group>
</launch>
给出的修改后的初版为:
复制代码
<launch>
    <!-- 启动 PX4 SITL -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="p450"/>

    <env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
    <env name="PX4_ESTIMATOR" value="ekf2" />
    <env name="PX4_SIM_SPEED_FACTOR" value="1.0" />

    <arg name="uav_id" default="1"/>
    
    <!-- 初始位置 -->
    <arg name="uav_init_x" default="0.0"/>
    <arg name="uav_init_y" default="0.0"/>
    <arg name="uav_init_z" default="0.15"/>
    <arg name="uav_init_yaw" default="0.0"/>

    <group ns="/uav$(arg uav_id)">
        <arg name="ID" value="$(eval arg('uav_id') - 1)"/>
        <arg name="mavlink_id" value="$(eval 1 + arg('ID'))" />
        <arg name="mavlink_udp_port"  default="$(eval 14560 + arg('ID'))"/>
        <arg name="mavlink_tcp_port"  default="$(eval 4560  + arg('ID'))"/>
        <arg name="interactive" default="true"/>

        <!-- ==============================
             生成 SDF 文件到 /tmp 下
           ============================== -->
        <arg name="sdf_output"
             default="/tmp/$(arg vehicle)_$(arg ID).sdf"/>

        <arg name="cmd"
             default="$(find prometheus_gazebo)/scripts/jinja_gen.py \
                --mavlink_id=$(arg mavlink_id) \
                --mavlink_udp_port=$(arg mavlink_udp_port) \
                --mavlink_tcp_port=$(arg mavlink_tcp_port) \
                $(find prometheus_gazebo)/gazebo_models/uav_models/$(arg vehicle)/$(arg vehicle).sdf.jinja \
                $(find prometheus_gazebo) \
                > $(arg sdf_output)" />

        <param command="$(arg cmd)" name="gen_sdf_$(arg vehicle)_$(arg ID)" />


        <!-- ==============================
             启动 PX4 SITL
           ============================== -->
        <arg unless="$(arg interactive)" name="px4_command_arg1" value=""/>
        <arg if="$(arg interactive)"    name="px4_command_arg1" value="-d"/>

        <node name="sitl_$(arg uav_id)" pkg="px4" type="px4" output="screen"
              args="$(find px4)/ROMFS/px4fmu_common \
                    -s etc/init.d-posix/rcS \
                    -i $(arg ID) \
                    -w sitl_amov_$(arg ID) \
                    $(arg px4_command_arg1)">
        </node>


        <!-- ==============================
             改动核心:使用 -file,而非 -param
           ============================== -->
        <node name="$(arg vehicle)_$(arg uav_id)_spawn"
              pkg="gazebo_ros" type="spawn_model" output="screen"
              args="-sdf \
                    -file $(arg sdf_output) \
                    -model $(arg vehicle)_$(arg ID) \
                    -x $(arg uav_init_x) \
                    -y $(arg uav_init_y) \
                    -z $(arg uav_init_z) \
                    -Y $(arg uav_init_yaw)">
        </node>


        <!-- ==============================
             MAVROS
           ============================== -->
        <arg name="udp_offboard_port_remote" value="$(eval 14540 + arg('ID'))"/>
        <arg name="udp_offboard_port_local"  value="$(eval 14580 + arg('ID'))"/>

        <node pkg="mavros" type="mavros_node" name="mavros" output="screen">
            <param name="fcu_url"
                   value="udp://:$(arg udp_offboard_port_remote)@localhost:$(arg udp_offboard_port_local)"/>
            <param name="gcs_url" value="" />
            <param name="target_system_id"   value="$(eval 1 + arg('ID'))"/>
            <param name="target_component_id" value="1" />
            <rosparam command="load"
                      file="$(find prometheus_gazebo)/config/mavros_config/px4_config_outdoor.yaml"/>
            <rosparam command="load"
                      file="$(find prometheus_gazebo)/config/mavros_config/px4_pluginlists_outdoor.yaml"/>
        </node>
    </group>
</launch>
改写报错jinja_gen.py: error: unrecognized arguments:
复制代码
<launch>
    <!-- 启动 PX4 SITL -->
    <!-- 相关文件: -->
    <!-- PX4 SITL rcS启动脚本路径:~/prometheus_px4/ROMFS/px4fmu_common/init.d-posix/rcS -->
    <!-- PX4 SITL 无人机模型文件:~/prometheus_px4/ROMFS/px4fmu_common/init.d-posix/1046_p230 或 1045_p450-->

    <!-- vehicle model and config -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="p450"/>

    <!-- 仿真模型,对应不同的模型文件 -->
    <env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
    <!-- ekf2 使用GPS作为定位来源-->
    <env name="PX4_ESTIMATOR" value="ekf2" />
    <!-- 仿真速度因子 1.0代表与真实时间同步,大于1加快仿真速度,小于1则减慢 (电脑性能较差,可选择减小该参数)-->
    <env name="PX4_SIM_SPEED_FACTOR" value="1.0" />

    <!-- 无人机ID号 -->
    <arg name="uav_id" default="1"/>
    
    <!-- 初始位置,Yaw为偏航角 -->
    <arg name="uav_init_x" default="0.0"/>
    <arg name="uav_init_y" default="0.0"/>
    <arg name="uav_init_z" default="0.15"/>
    <arg name="uav_init_yaw" default="0.0"/>
    
    <!-- arg name="ID" default="1"/ -->
    <!-- env name="PX4_SIM_MODEL" value="$(arg vehicle)" / -->
    <!-- env name="PX4_ESTIMATOR" value="$(arg est)" / -->
    <!-- arg name="mavlink_udp_port" default="14560"/ -->
    <!-- arg name="mavlink_tcp_port" default="4560"/ -->
    
    <!-- 无人机编号说明 -->
    <!-- uav_id为Prometheus系统中对无人机编号的定义,从1开始 -->
    <!-- ID为本文件中对无人机编号的定义,从0开始 -->
    <!-- MAV_SYS_ID为PX4中无人机编号的定义,在rcS文件中可以发现:MAV_SYS_ID = ID + 1,即从1开始--> 
    <!-- 端口号说明 -->
    <!-- 仿真器端口号(用于飞控与Gazebo进行通讯): SDF文件中的mavlink_tcp_port与rcS文件中的simulator_tcp_port应当一致,并随着无人机编号递增 -->
    <!-- mavlink_tcp_port = simulator_tcp_port = 4560 + ID -->
    <!-- Offboard端口号(用于飞控与Mavros进行通讯) udp_offboard_port_local = 14580 + ID -->
    <!-- Offboard端口号(用于飞控与Mavros进行通讯) udp_offboard_port_remote = 14540 + ID -->
    <!-- 备注:PX4 SITL原生最多只支持10架无人机仿真,具体原因见rcS启动文件-->

    <!-- 使用group标签来对不同的无人机进行分组,因此,不同无人机的话题会带上前缀,如/uav0、/uav1等 -->
    <group ns="/uav$(arg uav_id)">
        <!-- ID编号 -->
        <arg name="ID" value="$(eval arg('uav_id') - 1)"/>
        <arg name="mavlink_id" value="$(eval 1 + arg('ID'))" />
        <arg name="mavlink_udp_port" default="$(eval 14560 + arg('ID'))"/>
        <arg name="mavlink_tcp_port" default="$(eval 4560 + arg('ID'))"/>
        <!-- 启动PX4 SITL,此处参数配置不可删除 -->
        <arg name="interactive" default="true"/>
        
<!-- ==============================
             生成 SDF 文件到 /tmp 下
           ============================== -->
        <arg name="sdf_output"
             default="/tmp/$(arg vehicle)_$(arg ID).sdf"/>

        <arg name="cmd"
             default="$(find prometheus_gazebo)/scripts/jinja_gen.py \
                --mavlink_id=$(arg mavlink_id) \
                --mavlink_udp_port=$(arg mavlink_udp_port) \
                --mavlink_tcp_port=$(arg mavlink_tcp_port) \
                $(find prometheus_gazebo)/gazebo_models/uav_models/$(arg vehicle)/$(arg vehicle).sdf.jinja \
                $(find prometheus_gazebo) \
                > $(arg sdf_output)" />

        <param command="$(arg cmd)" name="gen_sdf_$(arg vehicle)_$(arg ID)" />


        <!-- ==============================
             启动 PX4 SITL
           ============================== -->
        <arg unless="$(arg interactive)" name="px4_command_arg1" value=""/>
        <arg if="$(arg interactive)"    name="px4_command_arg1" value="-d"/>

        <node name="sitl_$(arg uav_id)" pkg="px4" type="px4" output="screen"
              args="$(find px4)/ROMFS/px4fmu_common \
                    -s etc/init.d-posix/rcS \
                    -i $(arg ID) \
                    -w sitl_amov_$(arg ID) \
                    $(arg px4_command_arg1)">
        </node>


        <!-- ==============================
             改动核心:使用 -file,而非 -param
           ============================== -->
        <node name="$(arg vehicle)_$(arg uav_id)_spawn"
              pkg="gazebo_ros" type="spawn_model" output="screen"
              args="-sdf \
                    -file $(arg sdf_output) \
                    -model $(arg vehicle)_$(arg ID) \
                    -x $(arg uav_init_x) \
                    -y $(arg uav_init_y) \
                    -z $(arg uav_init_z) \
                    -Y $(arg uav_init_yaw)">
        </node>
        
        <!-- 启动MAVROS -->
        <arg name="udp_offboard_port_remote" value="$(eval 14540 + arg('ID'))"/>
        <arg name="udp_offboard_port_local" value="$(eval 14580 + arg('ID'))"/>
        <node pkg="mavros" type="mavros_node" name="mavros" output="screen">
            <param name="fcu_url" value="udp://:$(arg udp_offboard_port_remote)@localhost:$(arg udp_offboard_port_local)"/>
            <param name="gcs_url" value="" />
            <param name="target_system_id" value="$(eval 1 + arg('ID'))"/>
            <param name="target_component_id" value="1" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_config_outdoor.yaml" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_pluginlists_outdoor.yaml" />
        </node>
    </group>
</launch>

运行上面的代码报错:
zeratul@zeratul-Dell-G15-5530:~$ roslaunch prometheus_gazebo sitl_outdoor_1uav_P450.launch
... logging to /home/zeratul/.ros/log/7d7ca644-d74c-11f0-a567-e0d04591e3e9/roslaunch-zeratul-Dell-G15-5530-22342.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
WARNING: disk usage in log directory [/home/zeratul/.ros/log] is over 1GB.
It's recommended that you use the 'rosclean' command.

usage: jinja_gen.py [-h] [--mavlink_tcp_port MAVLINK_TCP_PORT]
                    [--mavlink_udp_port MAVLINK_UDP_PORT]
                    [--serial_enabled SERIAL_ENABLED]
                    [--serial_device SERIAL_DEVICE]
                    [--serial_baudrate SERIAL_BAUDRATE] [--hil_mode HIL_MODE]
                    [--output-file OUTPUT_FILE] [--stdout]
                    [--mavlink_id MAVLINK_ID]
                    [--cam_component_id CAM_COMPONENT_ID]
                    [--gst_udp_port GST_UDP_PORT] [--video_uri VIDEO_URI]
                    [--mavlink_cam_udp_port MAVLINK_CAM_UDP_PORT]
                    [--generate_ros_models GENERATE_ROS_MODELS]
                    filename env_dir
jinja_gen.py: error: unrecognized arguments:     /home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/uav_models/p450/p450.sdf.jinja   /home/zeratul/proj/Prometheus/Simulator/gazebo_simulator   > /tmp/p450_0.sdf
RLException: while processing /home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/launch_basic/sitl_px4_outdoor.launch:
Invalid <param> tag: Cannot load command parameter [gen_sdf_p450_0]: command [['/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/scripts/jinja_gen.py', ' ', '--mavlink_id=1', ' ', '--mavlink_udp_port=14560', ' ', '--mavlink_tcp_port=4560', ' ', '/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator/gazebo_models/uav_models/p450/p450.sdf.jinja', ' ', '/home/zeratul/proj/Prometheus/Simulator/gazebo_simulator', ' ', '>', '/tmp/p450_0.sdf']] returned with code [2]. 

Param xml is <param command="$(arg cmd)" name="gen_sdf_$(arg vehicle)_$(arg ID)"/>
The traceback for the exception was written to the log file
该怎么解决

核心报错的是不必要的空白字符,自己检查效率低,又把这个文件给gpt重新生成了一下

已改写的可直接运行 Launch 文件
复制代码
<?xml version="1.0"?>
<launch>
    <!-- Fixed PX4 SITL + Gazebo + MAVROS launch for 1 UAV (p450)
         - Avoids shell redirection (>) by using jinja_gen.py --output-file
         - Cleaned command args (no stray spaces)
         - Keeps original structure and comments from user
    -->

    <!-- vehicle model and config -->
    <arg name="est" default="ekf2"/>
    <arg name="vehicle" default="p450"/>

    <!-- 仿真模型,对应不同的模型文件 -->
    <env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
    <!-- ekf2 使用GPS作为定位来源-->
    <env name="PX4_ESTIMATOR" value="ekf2" />
    <!-- 仿真速度因子 -->
    <env name="PX4_SIM_SPEED_FACTOR" value="1.0" />

    <!-- 无人机ID号 -->
    <arg name="uav_id" default="1"/>

    <!-- 初始位置,Yaw为偏航角 -->
    <arg name="uav_init_x" default="0.0"/>
    <arg name="uav_init_y" default="0.0"/>
    <arg name="uav_init_z" default="0.15"/>
    <arg name="uav_init_yaw" default="0.0"/>

    <!-- 使用group标签来对不同的无人机进行分组 -->
    <group ns="/uav$(arg uav_id)">
        <!-- ID编号(从0开始) -->
        <arg name="ID" value="$(eval arg('uav_id') - 1)"/>
        <arg name="mavlink_id" value="$(eval 1 + arg('ID'))" />
        <arg name="mavlink_udp_port" default="$(eval 14560 + arg('ID'))"/>
        <arg name="mavlink_tcp_port" default="$(eval 4560 + arg('ID'))"/>

        <!-- 启动PX4 SITL,此处参数配置不可删除 -->
        <arg name="interactive" default="true"/>

        <!-- ==============================
             生成 SDF 文件到 /tmp 下(通过 jinja_gen.py --output-file)
           ============================== -->
        <arg name="sdf_output" default="/tmp/$(arg vehicle)_$(arg ID).sdf"/>

        <!-- 调用 jinja_gen.py 生成 sdf 文件,注意:不要使用 shell 重定向 -->
        <arg name="cmd" default="$(find prometheus_gazebo)/scripts/jinja_gen.py --mavlink_id=$(arg mavlink_id) --mavlink_udp_port=$(arg mavlink_udp_port) --mavlink_tcp_port=$(arg mavlink_tcp_port) --output-file=$(arg sdf_output) $(find prometheus_gazebo)/gazebo_models/uav_models/$(arg vehicle)/$(arg vehicle).sdf.jinja $(find prometheus_gazebo)" />

        <!-- 执行生成命令(不要使用 shell 重定向) -->
        <param name="gen_sdf_$(arg vehicle)_$(arg ID)" command="$(arg cmd)"/>


        <!-- ==============================
             启动 PX4 SITL
           ============================== -->
        <arg unless="$(arg interactive)" name="px4_command_arg1" value=""/>
        <arg if="$(arg interactive)"    name="px4_command_arg1" value="-d"/>

        <node name="sitl_$(arg uav_id)" pkg="px4" type="px4" output="screen"
              args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg ID) -w sitl_amov_$(arg ID) $(arg px4_command_arg1)">
        </node>


        <!-- ==============================
             使用 -file 而非 -param 启动 spawn_model
           ============================== -->
        <node name="$(arg vehicle)_$(arg uav_id)_spawn" pkg="gazebo_ros" type="spawn_model" output="screen"
              args="-sdf -file $(arg sdf_output) -model $(arg vehicle)_$(arg ID) -x $(arg uav_init_x) -y $(arg uav_init_y) -z $(arg uav_init_z) -Y $(arg uav_init_yaw)">
        </node>

        <!-- 启动MAVROS -->
        <arg name="udp_offboard_port_remote" value="$(eval 14540 + arg('ID'))"/>
        <arg name="udp_offboard_port_local" value="$(eval 14580 + arg('ID'))"/>
        <node pkg="mavros" type="mavros_node" name="mavros" output="screen">
            <param name="fcu_url" value="udp://:$(arg udp_offboard_port_remote)@localhost:$(arg udp_offboard_port_local)"/>
            <param name="gcs_url" value="" />
            <param name="target_system_id" value="$(eval 1 + arg('ID'))"/>
            <param name="target_component_id" value="1" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_config_outdoor.yaml" />
            <rosparam command="load" file="$(find prometheus_gazebo)/config/mavros_config/px4_pluginlists_outdoor.yaml" />
        </node>
    </group>
</launch>

gpt还是牛逼

相关推荐
yuhaiqun19892 小时前
SQL+VSCode实战指南:AI赋能高效数据库操作
数据库·人工智能·经验分享·vscode·sql·学习·学习方法
Pyeako2 小时前
opencv计算机视觉--传参方法&银行卡识别&身份证识别案例
人工智能·python·opencv·计算机视觉·身份证识别·银行卡识别·传参方法
数字化顾问2 小时前
(133页PPT)大型集团管控业财一体化基于SAP锂电池数字化转型总体蓝图架构设计解决方案(附下载方式)
大数据·人工智能
SAP工博科技3 小时前
装备制造SAP Cloud ERP实施指南:基于海铑机电的全流程落地方案
大数据·人工智能·制造
视***间3 小时前
视程空间算力模块Jetson AGX 275TOPS应用到人形机器人上
大数据·人工智能·边缘计算·ai算力开发板
weixin_437497773 小时前
部分LLM小参数模型特征汇总
人工智能·语言模型
科技云报道3 小时前
科技云报到:2026,AI开启“共生智能”新纪元
大数据·人工智能·科技
综合热讯3 小时前
中国企业追光科技亮相CES 2026,聚焦消费电子低碳供能
人工智能·科技
byzh_rc3 小时前
[深度学习网络从入门到入土] 神经网络发展脉络
人工智能·深度学习·神经网络