自定义通信接口例子中 SystemStatus.msg构建功能包时报错 CMakeLists.txt:16 (rosidl_generate_interfaces),哪位i大神能否指点下?非常感谢
-
自定义通信接口例子,SystemStatus.msg 构建功能包时,命令行
colcon build --packages-select status_interfaces报错信息如下:
Starting >>> status_interfaces
--- stderr: status_interfaces
CMake Error at /opt/ros/jazzy/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:234 (list):
list index: 1 out of range (-1, 0)
Call Stack (most recent call first):
CMakeLists.txt:16 (rosidl_generate_interfaces)CMake Error at /opt/ros/jazzy/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:234 (list):
list index: 1 out of range (-1, 0)
Call Stack (most recent call first):
CMakeLists.txt:16 (rosidl_generate_interfaces)CMake Error at /opt/ros/jazzy/share/rosidl_generator_type_description/cmake/rosidl_generator_type_description_generate_interfaces.cmake:68 (message):
Target dependency
'/ROS2/pkg_ws/build/status_interfaces/rosidl_adapter/status_interfaces/msg/SystemStatus.idl'
does not exist
Call Stack (most recent call first):
/opt/ros/jazzy/share/ament_cmake_core/cmake/core/ament_execute_extensions.cmake:48 (include)
/opt/ros/jazzy/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:280 (ament_execute_extensions)
CMakeLists.txt:16 (rosidl_generate_interfaces)操作步骤如下:
1.使用下面命令创建工作区间后
ros2 pkg create status_interfaces --build-type ament_cmake --dependencies rosidl_default_generators builtin_interfaces --license Apache-2.02.建立文件 status_interfaces/msg/SystemStatus.msg
3.CMLists.txt内容如下
cmake_minimum_required(VERSION 3.8)
project(status_interfaces)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)find_package(builtin_interfaces REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/SystemStatus.msg"
DEPENDENCIES builtin_interfaces
)if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)the following line skips the linter which checks for copyrights
comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
the following line skips cpplint (only works in a git repo)
comment the line when this package is in a git repo and when
a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()ament_package()
4.package.xml内容如下
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>status_interfaces</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="d@todo.todo">d</maintainer>
<license>Apache-2.0</license><buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<depend>builtin_interfaces</depend><test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend><export>
<build_type>ament_cmake</build_type>
</export>
</package> -
从你提供的错误信息和构建步骤来看,这里有几个潜在的问题和改进点:
-
CMakeLists.txt 中的依赖项:
- 你在
CMakeLists.txt
中包含了find_package(rclcpp REQUIRED)
和find_package(std_msgs REQUIRED)
,但这两个包在生成消息接口时并不是必需的。rclcpp
是用于 ROS 2 客户端库的,而std_msgs
包含了标准消息类型。对于你的自定义消息包,这些依赖是不必要的。
- 你在
-
错误的依赖声明:
- 在
rosidl_generate_interfaces
调用中,你指定了DEPENDENCIES builtin_interfaces
。这通常是正确的,但错误可能源于其他配置问题或版本不兼容。
- 在
-
CMake 和 ROS 2 版本兼容性:
- 错误信息中提到了列表索引超出范围,这可能是由于 ROS 2 的某个版本与你的 CMakeLists.txt 配置不兼容。确保你的 ROS 2 环境是最新的,或者至少是与你的教程或示例代码兼容的版本。
-
清理和重建:
- 有时候,旧的构建文件可能会导致问题。尝试完全清理你的工作空间(删除
build
和install
文件夹),然后重新构建。
- 有时候,旧的构建文件可能会导致问题。尝试完全清理你的工作空间(删除
-
检查
SystemStatus.msg
文件:- 确保
SystemStatus.msg
文件格式正确,没有语法错误。
- 确保
-
更新
package.xml
:- 你的
package.xml
中包含了不必要的依赖,如rclcpp
和std_msgs
。这些应该只在需要使用这些库的功能时才包含。
- 你的
下面是一个简化和更新的
CMakeLists.txt
和package.xml
示例:CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(status_interfaces) # 默认设置编译选项 if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # 查找必需的包 find_package(ament_cmake REQUIRED) find_package(rosidl_default_generators REQUIRED) find_package(builtin_interfaces REQUIRED) # 生成接口 rosidl_generate_interfaces(${PROJECT_NAME} "msg/SystemStatus.msg" DEPENDENCIES builtin_interfaces ) install(TARGETS ${PROJECT_NAME}__msg__target DESTINATION lib/${PROJECT_NAME} ) ament_package()
package.xml
<package format="3"> <name>status_interfaces</name> <version>0.0.0</version> <description>The status_interfaces package</description> <maintainer email="your_email@todo.todo">your_name</maintainer> <license>Apache-2.0</license> <buildtool_depend>ament_cmake</buildtool_depend> <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> <depend>builtin_interfaces</depend> <export> <build_type>ament_cmake</build_type> </export> </package>
请确保你的 ROS 2 环境设置正确,并且所有依赖项都已正确安装。然后尝试再次构建你的包。如果问题仍然存在,请检查 ROS 2 的版本和任何已知的兼容性问题。
以上为生成回答,仅供参考~
-