在ROS2中创建服务端文件,核心是创建一个Service Server节点文件,用create_service注册服务,再配合package.xml、CMakeLists.txt或setup.py完成编译与运行。 如果你刚接触ROS2,先别被“服务器端文件”这个词带偏,它通常指服务端节点源码,而不是Web服务器里的配置文件。
ROS2中怎么创建服务器端文件?先厘清服务端节点与文件组成
ROS2的“服务”采用请求-应答模型,客户端发请求,服务端处理并返回结果,据ROS 2官方文档,服务通信适合需要即时反馈、任务边界清晰的小型交互,比如加法运算、查询状态、触发校准。
服务端文件不是单个文件,而是节点源码加接口配置
一个完整的服务端通常包含这些内容:
- 服务接口文件:标准接口可直接用,自定义接口放在
srv/目录。 - 服务端节点源码:Python放在功能包同名目录,C++放在
src/目录。 - 构建配置:Python改
setup.py,C++改CMakeLists.txt和package.xml。 - 运行入口:通过
ros2 run启动节点。
常用两种实现:Python和C++
Python适合快速验证、教学和中小型任务,C++适合高频调用、实时性要求高的场景,业内专家指出,选择语言时优先看团队技术栈和性能预算,不必一开始就追求C++。
ROS2创建服务端文件详细步骤教程:Python从零到运行
下面以Ubuntu 22.04和ROS 2 Humble为例,其他版本命令接近,注意替换发行版名称。
创建功能包与目录
打开终端,依次执行:
mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create --build-type ament_python my_service_pkg --dependencies rclpy example_interfaces
example_interfaces里有现成的AddTwoInts.srv,适合第一次跑通服务端。
编写服务端节点文件
进入功能包,创建服务端文件:
cd ~/ros2_ws/src/my_service_pkg/my_service_pkg touch service_server.py
写入以下代码:
import rclpy from rclpy.node import Node from example_interfaces.srv import AddTwoInts class AddTwoIntsServer(Node): def __init__(self): super().__init__('add_two_ints_server') self.srv = self.create_service( AddTwoInts, 'add_two_ints', self.add_two_ints_callback ) def add_two_ints_callback(self, request, response): response.sum = request.a + request.b self.get_logger().info(f'收到请求: {request.a} + {request.b}') return response def main(args=None): rclpy.init(args=args) node = AddTwoIntsServer() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
关键API是create_service,它接收服务类型、服务名称和回调函数,回调函数必须返回response对象。
配置setup.py与编译运行
打开setup.py,在entry_points的console_scripts里加入:
'console_scripts': [
'service_server = my_service_pkg.service_server:main',
],
然后编译:
cd ~/ros2_ws colcon build --packages-select my_service_pkg source install/setup.bash ros2 run my_service_pkg service_server
测试服务端
另开终端,先source环境,再调用:
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 3, b: 5}"
如果返回sum: 8,说明服务端文件创建成功,再执行ros2 service list,能看到/add_two_ints。
在Ubuntu 22.04上创建ROS2服务端文件场景实操:C++版本怎么配
C++服务端文件适合嵌入产品,创建包:
cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake my_cpp_service_pkg --dependencies rclcpp example_interfaces
在src/add_two_ints_server.cpp中写节点,核心逻辑与Python一致,只是用rclcpp::Service,然后修改CMakeLists.txt:
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
ament_target_dependencies(add_two_ints_server rclcpp example_interfaces)
install(TARGETS add_two_ints_server DESTINATION lib/${PROJECT_NAME})
编译:
colcon build --packages-select my_cpp_service_pkg source install/setup.bash ros2 run my_cpp_service_pkg add_two_ints_server
两种实现对比:
| 对比项 | Python服务端 | C++服务端 |
|---|---|---|
| 开发速度 | 快,改完直接跑 | 较慢,需编译 |
| 运行性能 | 适合常规任务 | 适合高频低延迟 |
| 文件位置 | 包内同名目录 | src/目录 |
| 配置重点 | setup.py入口 |
CMakeLists.txt安装规则 |
| 调试便利性 | 较高 | 依赖编译器和gdb |
行业共识认为,原型阶段用Python,量产阶段再评估C++迁移成本。
ROS2服务端文件创建和话题订阅区别是什么
很多人把服务端和订阅者混在一起,它们都能接收消息,但行为不同。
- 服务端:收到请求后必须返回应答,用
create_service。 - 话题订阅者:持续接收消息,通常不返回结果,用
create_subscription。 - 服务端更适合“问一次答一次”,订阅者更适合“持续广播”。
- 服务端有明确的服务名称和类型,客户端通过
ros2 service call测试。 - 订阅者通过
ros2 topic echo观察消息。
如果你只需要单向数据流,别创建服务端文件,如果你需要同步结果,服务端更合适。
自定义srv接口时ROS2服务端文件怎么调整
标准接口不够用时,就要自定义srv,在功能包里新建srv/AddTwoInts.srv:
int64 a int64 b --- int64 sum
然后修改package.xml,加入接口生成依赖,修改CMakeLists.txt,调用rosidl_generate_interfaces,在C++服务端中包含生成的头文件,Python项目若依赖自定义接口,通常单独建一个ament_cmake接口包,再让Python包依赖它,这样结构更清晰。
常见报错与处理:
Service not found:忘记source,或服务名写错。Type mismatch:客户端和服务端使用的srv类型不一致。Permission denied:脚本没有执行权限,用chmod +x。- 回调阻塞:长任务放入多线程执行器,避免卡住其他回调。
ROS2服务端文件创建需要多少钱?北京ROS2开发环境创建服务端文件实操
ROS2本身开源免费,创建服务端文件不花钱,额外成本主要在开发板、传感器和云主机,云主机月费因配置差异较大,入门配置到高配机型跨度明显,如果只是学习,本地虚拟机或旧电脑就够。
北京ROS2开发环境创建服务端文件实操时,团队常用Ubuntu 22.04加ROS 2 Humble,安装后先配置软件源,再执行rosdep update,北京地区网络访问官方源可能偏慢,可换国内镜像源,创建服务端文件前,确认source /opt/ros/humble/setup.bash已写入~/.bashrc,工作空间路径建议用~/ros2_ws,避免中文路径和空格。
Q&A:ROS2中怎么创建服务器端文件延伸问题
ROS2服务端文件必须用C++写吗?
不必须,Python和C++都能创建服务端,Python用rclpy,C++用rclcpp,选择依据是性能、团队习惯和部署环境。
ROS2服务端文件和客户端文件可以放在同一个功能包吗?
可以,两者共享自定义srv接口,依赖配置一致,入口分别注册即可,注意命名区分,比如service_server.py和service_client.py。
ROS2服务端文件创建后如何验证服务已经注册?
运行节点后,执行ros2 node list查看节点名,执行ros2 service list查看服务名,再执行ros2 service type /add_two_ints确认类型,用ros2 service call发起请求,收到应答就说明服务端文件工作正常。
创建ROS2服务端文件并不复杂:选语言、建功能包、写create_service回调、配构建入口、编译运行、调用测试,把这条链路跑通,你就掌握了ROS2服务端开发的基础。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/719930.html





