程序调用ros2动作
时间: 2025-08-19 14:22:46 浏览: 1
在ROS 2中,Action是一种支持长时间运行任务的通信机制,允许客户端发送目标(goal),服务器提供反馈(feedback)并最终返回结果(result)。调用Action编程接口涉及编写客户端和服务端代码,使用ROS 2提供的动作接口函数如`get_goal()`、`succeed(result)`、`publish_feedback(feedback)`等[^3]。
### ROS 2 Action 客户端编程
在ROS 2中,客户端通常使用`rclpy`或`rclcpp`库进行开发。以下是一个Python客户端示例,用于发送目标并接收反馈和结果:
```python
import rclpy
from rclpy.action import ActionClient
from example_interfaces.action import Fibonacci # 示例Action接口
class FibonacciActionClient(rclpy.node.Node):
def __init__(self):
super().__init__('fibonacci_action_client')
self._action_client = ActionClient(self, Fibonacci, 'fibonacci')
def send_goal(self, order):
goal_msg = Fibonacci.Goal()
goal_msg.order = order
self.get_logger().info('等待服务端启动...')
future = self._action_client.send_goal_async(goal_msg)
rclpy.spin_until_future_complete(self, future)
goal_handle = future.result()
if not goal_handle:
self.get_logger().error('目标请求失败')
return
self.get_logger().info('目标已接受,等待结果...')
result_future = goal_handle.get_result_async()
rclpy.spin_until_future_complete(self, result_future)
result = result_future.result().result
self.get_logger().info(f'收到结果: {result.sequence}')
def main(args=None):
rclpy.init()
action_client = FibonacciActionClient()
action_client.send_goal(10)
action_client.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
### ROS 2 Action 服务端编程
服务端负责接收目标、处理任务、发布反馈并最终返回结果。以下是对应的服务端实现示例:
```python
import rclpy
from rclpy.action import ActionServer
from rclpy.node import Node
from example_interfaces.action import Fibonacci # 示例Action接口
class FibonacciActionServer(Node):
def __init__(self):
super().__init__('fibonacci_action_server')
self._action_server = ActionServer(
self,
Fibonacci,
'fibonacci',
self.execute_callback)
def execute_callback(self, goal_handle):
self.get_logger().info(f'接收到目标: {goal_handle.request.order}')
feedback_msg = Fibonacci.Feedback()
result = Fibonacci.Result()
sequence = [0, 1]
for i in range(1, goal_handle.request.order):
sequence.append(sequence[i] + sequence[i - 1])
feedback_msg.partial_sequence = sequence
self.get_logger().info(f'反馈: {feedback_msg.partial_sequence}')
goal_handle.publish_feedback(feedback_msg)
result.sequence = sequence
goal_handle.succeed()
self.get_logger().info(f'任务完成,结果为: {result.sequence}')
return result
def main(args=None):
rclpy.init()
action_server = FibonacciActionServer()
rclpy.spin(action_server)
action_server.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
### 关键API说明
- `send_goal_async(goal_msg)`:异步发送目标到服务端。
- `get_result_async()`:获取目标执行后的结果。
- `publish_feedback(feedback)`:在服务端向客户端发送进度反馈。
- `succeed(result)`:表示目标成功完成,并返回结果。
- `get_goal()`:获取客户端发送的目标信息。
这些接口使得ROS 2中的Action通信具有良好的交互性和可扩展性,适用于需要长期运行的任务,如导航、路径规划等场景[^3]。
---
阅读全文
相关推荐




















