ROS、C++、py、编译工程学习及报错记录

1. src里面有多个main函数编译不通过

原因:trajectory_monitor.cpp已经有main函数,try函数中不能再有了。

1.2  一个可执行文件中有多个main函数的情况,导致编译报错

问题是由于在多个文件中定义了多个 main 函数。在C++中,每个可执行文件只能有一个 main 函数。为了解决这个问题,你需要确保在每个可执行文件中只有一个 main 函数。

假设你有两个文件 aeb_system.cppfollow.cpp,其中每个文件都包含一个 main 函数。在构建过程中,链接器会报错因为它找到了多个 main 函数。

你可以通过以下几种方式来解决这个问题:

  1. 拆分可执行文件:确保每个可执行文件只有一个 main 函数。

  2. 修改 CMakeLists.txt 文件:在 CMakeLists.txt 文件中,确保每个可执行文件只包含一个 main 函数的源文件。

下面是一个示例 CMakeLists.txt 文件,假设你想创建两个可执行文件 aeb_system_nodefollow_node

cmake_minimum_required(VERSION 3.0.2)
project(aeb_system)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  common_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES aeb_system
#  CATKIN_DEPENDS roscpp std_msgs
#  DEPENDS system_lib
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

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

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

# Install
install(TARGETS aeb_system_node follow_node
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

确保你的 src 目录下有两个文件 aeb_system.cppfollow.cpp,并且每个文件都有它们自己的 main 函数

例如:

aeb_system.cpp

#include <ros/ros.h>
#include <common_msgs/CICV_Location.h>
#include <common_msgs/Lane.h>
#include <common_msgs/Lanes.h>
#include <common_msgs/Perceptionobjects.h>
#include <common_msgs/Perceptionobject.h>
#include <std_msgs/String.h>
#include <common_msgs/Control_Test.h>
#include <cmath>

// 类定义省略...

int main(int argc, char **argv) {
    ros::init(argc, argv, "aeb_system_node");
    ros::NodeHandle nh;

    SensorData sensor_data(nh);
    Control control(nh);
    AEBSystem aeb_system(nh, sensor_data, control);
    std::cout << "ok, begin" << std::endl;
    ros::Rate rate(10); // 10 Hz
    while (ros::ok()) {
        ros::spinOnce(); // 处理回调函数
        aeb_system.checkAEB(); // 检查AEB触发逻辑
        rate.sleep();
    }

    return 0;
}

follow.cpp

#include <ros/ros.h>
// 其他必要的包含文件

int main(int argc, char **argv) {
    ros::init(argc, argv, "follow_node");
    ros::NodeHandle nh;

    // 你的 follow 节点的代码

    return 0;
}

通过这种方式,你可以确保每个可执行文件只有一个 main 函数,并且能够独立构建和运行

1.3 可执行文件命名和main函数节点初始化的关系

        可执行文件的命名是在 CMakeLists.txt 文件中指定的,而不是在 main 函数里面。CMakeLists.txt 文件控制了你的构建过程,它会指定你的源文件、目标名称(可执行文件的名称)、依赖关系等。

    add_executable 指令中的可执行文件名应该与 main 函数中 ros::init 的节点名称一致,以确保节点启动时使用正确的名称。

具体来说:

  • CMakeLists.txt 文件中:
add_executable(aeb_system_node src/aeb_system.cpp)
target_link_libraries(aeb_system_node ${catkin_LIBRARIES})

aeb_system.cpp 中:

int main(int argc, char **argv) {
    ros::init(argc, argv, "aeb_system_node");  // 这里的节点名称与可执行文件名称一致
    ros::NodeHandle nh;

    SensorData sensor_data(nh);
    Control control(nh);
    AEBSystem aeb_system(nh, sensor_data, control);
    std::cout << "ok, begin" << std::endl;
    ros::Rate rate(10); // 10 Hz
    while (ros::ok()) {
        ros::spinOnce(); // 处理回调函数
        aeb_system.checkAEB(); // 检查AEB触发逻辑
        rate.sleep();
    }

    return 0;
}

确保每个节点名称(aeb_system_nodefollow_node)在 CMakeLists.txt 和对应的源文件中保持一致。

2. 一个src多个cpp文件编译时,写了多个dd_executable(trajectory_monitor……)导致编译错误

修改,应如途中所是,把多与的add去掉,一个工程包写一个。

3. 无法启动节点map_server

sudo apt install ros-noetic-map-server

4. 找不到头文件

5. roscore not found……(没有source)

        如果是编译后运行roslaunch 时候,出现这种情况,肯呢故事变异后未source  这时候,应在src上一级目录(和变异同一级目录)进行source

        注意:错误直接指向ros/noetic/share……目录,是没有source

 

如果没有在同级目录source是不对的,有以下错误

6. ububtu编译后为什么要进行source

        在Ubuntu中使用ROS时,执行`source`命令是非常重要的。这是因为ROS使用了一些环境变量来配置系统,包括设置ROS_MASTER_URI、ROS_PACKAGE_PATH和其他重要的ROS参数。这些环境变量需要在每个新终端会话中重新配置,以确保系统能够正确地与ROS系统通信。

        执行`source`命令时,实际上是运行一个脚本(通常是`setup.bash`),该脚本设置了所有必要的环境变量。这样可以确保您的ROS软件包在构建和运行时能够找到ROS的相关库和依赖项。

        在构建后执行`source`命令的操作通常是为了确保新的或更改后的环境变量生效。这样您的项目就能够在新的终端会话中正确地使用ROS环境。

        因此,在Ubuntu中,如果您构建了一个ROS项目,最好是在构建后执行`source`命令,以便在新的终端会话中能够正确地使用ROS环境。

7. 为什么source后面的路径通常会不一样

        在ROS中,`source`命令后面跟着的路径通常不一样,是因为路径中的脚本文件是根据您的ROS安装位置和工作空间的配置而定的。

        在ROS中,`source`命令用于运行一个脚本文件,通常是`setup.bash`。这个脚本文件设置了ROS的各种环境变量,包括ROS_MASTER_URI、ROS_PACKAGE_PATH和其他ROS参数。运行`source`命令以后,这些环境变量会被配置并生

        路径中的具体位置取决于您的ROS安装和工作空间的设置。下面是一些可能的路径示例:

        1. 对于全局安装的ROS,通常是在`/opt/ros/<distro>/setup.bash`路径下,其中`<distro>`是ROS的版本(如`melodic`、`noetic`等)。

        2. 对于源码安装的ROS,路径可能不同,取决于您在哪个位置进行了源码安装。

        3. 对于您自己的ROS工作空间,路径是由您的工作空间名称和`devel/setup.bash`构成。

        因此,您如果在每个新的终端会话中执行`source`命令,所使用的路径就会根据您的安装和设置情况而不同。

        需要注意的是,确保在执行`source`命令时,使用了正确的路径,以使ROS环境正确配置,并能够找到ROS的相关库和依赖项。

8. 自己的ROS工作空间,路径是由您的工作空间名称和devel/setup.bash构成

        ROS工作空间的路径由工作空间的名称和devel/setup.bash文件组成。这是因为在ROS中,工作空间是一个独立的目录,用于存放您自己的ROS软件包,并与ROS系统中其他软件包进行交互。

您可以按照以下步骤创建一个ROS工作空间:

1. 创建一个新的目录,作为您的ROS工作空间的主目录。例如,可以在某个位置创建一个名为"catkin_ws"的目录。

2. 进入这个目录,并创建一个名为"src"的子目录。这将是您存放ROS软件包的地方。

3. 在"src"目录中,可以使用"catkin_create_pkg"命令创建一个新的ROS软件包,或者将现有的软件包复制到这个目录中。

4. 在工作空间主目录下,使用"catkin_make"命令来构建工作空间。这将为您的软件包生成构建和安装所需的目录和文件。

完成上述步骤后,您的ROS工作空间路径将由工作空间的名称和devel/setup.bash文件构成。例如,在上述示例中,工作空间路径将为"catkin_ws/devel/setup.bash"。您可以通过运行"source"命令来加载这个路径下的setup.bash文件,以确保ROS系统能够找到您的ROS软件包。

在每个新的终端窗口中,您都需要运行"source <工作空间路径>/devel/setup.bash"来加载工作空间,并使其成为当前终端中ROS软件包的可用路径。

总结来说,您的ROS工作空间路径由工作空间的名称和devel/setup.bash文件组成,并通过运行"source"命令加载这个路径下的setup.bash文件来使其在ROS系统中可用。

注意:工作空间source时候,要进行正确的路径

"source <工作空间路径>/devel/setup.bash"可以在catkin_ws目录里面运行,但是如果你要是放在~/.bashrc里面,就要有前面的路径,请看下图

值得注意的是:home后面的是sun,是你的用户名或者计算机名

9. 编译 source后的rospack profile \    是什么意思

        "rospack profile"是一个用于ROS的命令,用于更新ROS软件包路径的环境变量。当您在ROS中构建和安装软件包后,您需要确保系统能够正确识别和使用这些软件包。

        当您使用"rospack profile"命令时,它会遍历您的系统上的所有ROS软件包,并根据其位置更新ROS软件包路径(ROS_PACKAGE_PATH)环境变量。这样,ROS系统就能够找到和使用这些软件包。

        具体来说,"rospack profile"命令会在当前环境中使用`rosstack`工具(已废弃)或`rospack`工具来查找和识别ROS软件包,并将其路径添加到ROS_PACKAGE_PATH环境变量中。该命令会根据已安装的软件包目录结构在系统中查找软件包。一旦执行完该命令,ROS系统就能够找到并使用这些软件包。

        需要注意的是,当您安装或删除ROS软件包时,需要重新运行"rospack profile"命令来更新ROS软件包路径。这样才能确保ROS系统能够正确地找到和使用这些软件包。

总结来说,"rospack profile"命令是用于更新ROS软件包路径的环境变量,以确保ROS系统能够正确识别和使用已安装的软件包

10 ros一键安装

wget http://fishros.com/install -O fishros && . fishros

11 ros未安装,cmake错误

12 XXXX.h: 没有那个文件或目录 #include <XXXX.h> ^~~~~~~~

12.1 系统包依赖,且cmakelist和package可以不用加进去的情况

解决

sudo apt-get install libpcap-dev

12.2 自定义mag消息类型包,单独包可以编译唱功但是总体编译出错

 12.2.1编译过程冲显示没有那个目录或文件

而且单独编译消息包是可以的  catkin build perception_msgs
原因:在trajectory_monitor项目中的cpp文件头文件调用了perception_msgs中的头文件,然而在cmakelist和package.xml中没有相应的内容,导致变异的售后依赖关系缺失

12.2.2 fatal error: usb2can_core.h: 没有那个文件或目录5 | #include "usb2can_core.h"

<< cmd_trans:make /home/sun/control/Controller/logs/cmd_trans/build.make.001.log

/home/sun/control/Controller/src/cmd_trans/src/ros2ecu.cpp:5:10: fatal error: usb2can_core.h: 没有那个文件或目录

5 | #include "usb2can_core.h"

| ^~~~~~~~~~~~~~~~

这种原因是在/home/sun/control/Controller/src/cmd_trans/src/ros2ecu.cpp:5:10: fatal error: usb2can_core.h: 没有那个文件或目录

5 | #include "usb2can_core.h"

| ^~~~~~~~~~~~~~~~

compilation terminated.

make[2]: *** [CMakeFiles/ros2ecu.dir/build.make:63:CMakeFiles/ros2ecu.dir/src/ros2ecu.cpp.o] 错误 1

make[1]: *** [CMakeFiles/Makefile2:180:CMakeFiles/ros2ecu.dir/all] 错误 2

make: *** [Makefile:141:all] 错误 2

CMakeFiles里面路径不对,进入对应项目对应的文件里,修改以下目录为对应位置

12.3 #include <std_msg/Float32.h>有那个文件或目录

13 Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages  E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。 E: 无法更正依赖关系

但实际中会遇到这样的问题

14 python版本不对导致roscore出现问题

Traceback (most recent call last):

  File "/opt/ros/kinetic/bin/roscore", line 36, in <module>

    from rosmaster.master_api import NUM_WORKERS

  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosmaster/__init__.py", line 35, in <module>

  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosmaster/util.py", line 48, in <module>

    from defusedxml.xmlrpc import monkey_patch

ImportError: No module named 'defusedxml

原文链接:https://blog.csdn.net/bulletstart/article/details/129474074

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1

sudo update-alternatives --config python

13.1 ubuntu中更改py版本

 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1

 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2

# 注意后面的数字1和2,他们将是你以后更换版本的选项

update-alternatives --list python

 update-alternatives --config python

15 ubuntu系统下查理pcd文件

16 文件内有其他文件,要先编译子项目文件,编译以后,再编译总体文件

先编译

再总编译

17 std::cout和std::endl\

语法忘记了,没有namespace std的时候,忘记了后者

18 catkin:未找到命令解决方法

19 ubuntu显卡驱动安装

重启后要做选择

20 安装了conda环境,在base下编译出现catkin_pkg编译问

21 Could not find a package configuration file provided by "xxxx_msgs"with any of the following names:

21.1

解决方法:

sudo apt-get install ros-noetic-uuid-msgs

或者

sudo apt-get install ros-melodic-uuid-msgs

21.2

sudo apt-get install ros-noetic-vision-msgs

sudo apt-get install ros-melodic-vision-msgs

21.3

先单独编译waypoint_msgs这个包,再整体编译

catkin build waypoint_msgs

catkin build

21.4

解决方法:

sudo apt-get install ros-noetic-ackermann-msgs

或者

sudo apt-get install ros-melodic-ackermann-msgs

21.5

Could not find a package configuration file provided by "dwa_local_planner" with any of the following names:

分析:这个是编译过程中出现的pkg无法找到的问题,使用sudo apt-get install ros-noetic-pkgname即可

下面是出现的错误

  1. 指令中包的名字不是下划线,是短线连接

  2. config和后面的cmake不在包名字内,包名是前面的那些

22 sprt用法错误

23 Callback回调函数用法错误、

24 解压文件的指令

 24 osqp求解器错误

24.1 Autodriving中osqp报错

 原因:sqp版本不对,用0.5.0版本,或者修改代码,当然小白可能不熟悉C++不会改。所以还是仔细对照博客的每一个步骤,里面有提版本问题。还有,install_qp_oases.sh不是安装osqp求解器,是安装qpoases求解器,有些新手估计会搞混。

 解决方法

git clone https://gitee.com/xiacanming/osqp-0.5.0.git

cd osqp-0.5.0
mkdir build && cd build
cmake ../
make
sudo make install

git clone https://gitee.com/xiacanming/osqp-eigen-0.4.1.git
cd osqp-eigen-0.4.1
mkdir build && cd build
cmake ../
make
sudo make install

位置在这里

24.2 cicv_2024比赛中给的planner_tracking中用的osqp求解器不一样

错误

还用原先那个,会报错,导致规划模块启动不起来

ERROR in validate_data: n must be positive and m nonnegative; n = 0, m = 141843184
ERROR in osqp_setup: Data validation returned failure
[planner_tracking-1] process has died [pid 619571, exit code -11, cmd /home/zxy/.local/share/Trash/files/planner_tracking/install/lib/planner_tracking/planner_tracking __name:=planner_tracking __log:=/home/zxy/.ros/log/99fee61a-4a62-11ef-a25c-977d0c26209d/planner_tracking-1.log].
log file: /home/zxy/.ros/log/99fee61a-4a62-11ef-a25c-977d0c26209d/planner_tracking-1*.log
 

解决方法

卸载掉原先的osqp求解器,安装新的求解器、

原先安装位置

新的安装位置

tar zxvf osqp.tar.gz
cd osqp
mkdir build
cd build
cmake -G "Unix Makefiles" ..
cmake --build .
sudo make install

24.3 Auto_drving源码上更改osqp使用版本

 

25 roscore 节点没有打开,导致rosbag包播放失败

 26.ConstPtr的作用

编译错误

由于没有加ConstPtr,导致出现消息类型不匹配的情况

错误信息表明你的回调函数和消息类型之间存在不匹配的情况。你可能在定义订阅器时错误地使用了错误的消息类型。确保你在订阅器和回调函数中使用的是正确的消息类型。



2

27. ros::NodeHandle::advertise 方法不支持发布 std::string 类型的消息

ros::NodeHandle::advertise 方法不支持发布 std::string 类型的消息。ROS 中的消息类型需要是已经定义好的 ROS 消息类型,例如 std_msgs::String。我们需要将 std::string 类型更改为 std_msgs::String

错误地方

28 [aeb5_system_node-2]  出现了 exit code -11 的问题,通常意味着程序崩溃了。这可能是由于段错误(segmentation fault)导致的。在ROS中,段错误通常是由于指针问题或未正确初始化的变量。

最终结果是没有这个条件语句导致,错误 

GPT回答

出现了 exit code -11 的问题,通常意味着程序崩溃了。这可能是由于段错误(segmentation fault)导致的。在ROS中,段错误通常是由于指针问题或未正确初始化的变量。

为了进一步诊断问题,可以查看日志文件 /home/zxy/.ros/log/5b2f02c4-4e56-11ef-b108-dbb7ba0c4d7c/aeb5_system_node-2.log,了解更多详细信息。

这里是一些可能的调试步骤和改进建议:

  1. 检查日志文件:首先查看日志文件,获取更多关于崩溃的具体信息。

  2. 初始化检查:确保所有变量和对象在使用前已经正确初始化。

  3. 添加更多日志输出:在代码的关键部分添加更多的日志输出,以便了解程序运行时的状态。

  4. 使用调试工具:使用GDB等调试工具来运行程序,捕获崩溃时的堆栈信息。

  5. 独立测试各部分功能:将代码分解,逐一测试各个模块(如SensorDataControlAEBsystem等),确保各个模块单独运行时没有问题。

  6. 检查订阅和发布的消息类型:确保订阅和发布的消息类型完全匹配。

29 未设置 respawn 参数报错

错误信息表明你的启动文件 lqr.launch 需要设置 respawn 参数。roslaunch 通常用于启动一组 ROS 节点,并且 respawn 参数可以用于在节点崩溃时自动重新启动它们。

你需要在启动文件中添加 respawn 参数。下面是一个示例,展示了如何在 lqr.launch 文件中添加 respawn 参数。

假设你的 lqr.launch 文件如下所示:

<launch>
  <node pkg="lqr_controller" type="lqr_controller_node" name="lqr_controller_node" output="screen"/>
</launch>

你可以通过添加 respawn 参数进行修改,如下所示:

<launch>
  <arg name="respawn" default="false"/>
  <node pkg="lqr_controller" type="lqr_controller_node" name="lqr_controller_node" output="screen" respawn="$(arg respawn)"/>
</launch>

这样你可以在启动文件中传递 respawn 参数。如果你想在启动时设置 respawntrue,可以在运行 roslaunch 命令时传递该参数:

roslaunch lqr_controller lqr.launch respawn:=true

错误2

roslaunch 报错提示你的 lqr.launch 文件还需要设置 respawn_delay 参数。可以类似地在启动文件中添加这个参数。

下面是修改后的 lqr.launch 文件,增加了 respawnrespawn_delay 参数

<launch>
  <arg name="respawn" default="false"/>
  <arg name="respawn_delay" default="5"/>
  <node pkg="lqr_controller" type="lqr_controller_node" name="lqr_controller_node" output="screen" respawn="$(arg respawn)" respawn_delay="$(arg respawn_delay)"/>
</launch>

这个启动文件包含了 respawnrespawn_delay 参数,默认情况下 respawn 设置为 falserespawn_delay 设置为 5 秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值