1. src里面有多个main函数编译不通过
原因:trajectory_monitor.cpp已经有main函数,try函数中不能再有了。
1.2 一个可执行文件中有多个main函数的情况,导致编译报错
问题是由于在多个文件中定义了多个 main
函数。在C++中,每个可执行文件只能有一个 main
函数。为了解决这个问题,你需要确保在每个可执行文件中只有一个 main
函数。
假设你有两个文件 aeb_system.cpp
和 follow.cpp
,其中每个文件都包含一个 main
函数。在构建过程中,链接器会报错因为它找到了多个 main
函数。
你可以通过以下几种方式来解决这个问题:
-
拆分可执行文件:确保每个可执行文件只有一个
main
函数。 -
修改
CMakeLists.txt
文件:在CMakeLists.txt
文件中,确保每个可执行文件只包含一个main
函数的源文件。
下面是一个示例 CMakeLists.txt
文件,假设你想创建两个可执行文件 aeb_system_node
和 follow_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.cpp
和 follow.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_node
和 follow_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编译过程冲显示没有那个目录或文件
原因:在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\
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即可
下面是出现的错误
指令中包的名字不是下划线,是短线连接
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
,了解更多详细信息。
这里是一些可能的调试步骤和改进建议:
-
检查日志文件:首先查看日志文件,获取更多关于崩溃的具体信息。
-
初始化检查:确保所有变量和对象在使用前已经正确初始化。
-
添加更多日志输出:在代码的关键部分添加更多的日志输出,以便了解程序运行时的状态。
-
使用调试工具:使用GDB等调试工具来运行程序,捕获崩溃时的堆栈信息。
-
独立测试各部分功能:将代码分解,逐一测试各个模块(如
SensorData
、Control
、AEBsystem
等),确保各个模块单独运行时没有问题。 -
检查订阅和发布的消息类型:确保订阅和发布的消息类型完全匹配。
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
参数。如果你想在启动时设置 respawn
为 true
,可以在运行 roslaunch
命令时传递该参数:
roslaunch lqr_controller lqr.launch respawn:=true
错误2
roslaunch
报错提示你的 lqr.launch
文件还需要设置 respawn_delay
参数。可以类似地在启动文件中添加这个参数。
下面是修改后的 lqr.launch
文件,增加了 respawn
和 respawn_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>
这个启动文件包含了 respawn
和 respawn_delay
参数,默认情况下 respawn
设置为 false
,respawn_delay
设置为 5 秒。