以srv文件的创建和调用为例,msg相同。
一、创建srv文件
1.新建一个功能包A(--build_type ament_cmake),并在功能包根目录创建srv/Addsum.srv文件,注意.srv文件名首字母需要大写。
int64 a
int64 b
--- #注意得是3个‘-’
int64 sum
2.修改CMakeLists.txt文件
cmake_minimum_required(VERSION 3.8)
project(A) #######需要将A修改你自己的功能包名
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(rosidl_default_generators REQUIRED) ########添加的依赖项
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
rosidl_generate_interfaces(${PROJECT_NAME} ########添加自定义的srv文件或msg文件,以此类推。
"srv/Addsum.srv"
"msg/xx.msg"
"srv/xx.srv"
)
ament_package()
3.修改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>A</name> #######需要将A修改你自己的功能包名
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="dadong2@todo.todo">dadong2</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend> #######添加依赖1
<exec_depend>rosidl_default_runtime</exec_depend> #######添加依赖2
<member_of_group>rosidl_interface_packages</member_of_group> #######添加依赖3
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
4.编译自定义的srv文件
#参数--allow-overriding 用于重复编译覆盖旧的
#A为创建的功能包名
colcon build --packages-select --allow-overriding A
5.查看编译结果
ros2 interface show A/srv/Addsum.srv
二、调用(srv文件与代码文件不能是同一个功能包,同包调用不知能怎么搞)
1.代码内调用
//c++:
#include "A/srv/addsum.hpp" //头文件引用,A为功能包名,addsum为自定义的srv文件名,注意需要全部字母小写
A::srv::Addsum //代码内调用格式
//python:
from A.srv import Addsum
2.修改CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(rclcpp_pkg) #######1
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
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(rclcpp REQUIRED)
find_package(A REQUIRED) #######A为自定义的srv文件所在的功能包
add_executable(main src/main.cpp)
ament_target_dependencies(main rclcpp A) #######A为自定义的srv文件所在的功能包
install(TARGETS ########2
main
DESTINATION lib/${PROJECT_NAME})
ament_package()
注:python功能包不涉及cmakelists文件,所以不需要修改。
3.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>rclcpp_pkg</name> #####1
<version>0.9.3</version>
<description>Contains message and service definitions used by the examples.</description>
<maintainer email="mabel@openrobotics.org">Mabel Zhang</maintainer>
<license>Apache License 2.0</license>
<author email="dthomas@openrobotics.org">Dirk Thomas</author>
<author email="jacob@openrobotics.org">Jacob Perron</author>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>A</depend> ######2
<export>
<build_type>ament_cmake</build_type>
<ros1_bridge mapping_rules="mapping_rules.yaml"/>
</export>
</package>
python在package.xml中添加“<exec_depend>A</exec_depend>”