ActionClient端实现(Python)

ActionClient创建流程

1. 创建Node节点

1
rospy.init_node(nodeName, anonymous=True)

2. 创建SimpleActionClient

1
2
3
client = actionlib.ActionClient(actionName, CountNumberAction)
# 等待连接服务器
client.wait_for_server()

Tip

我们需要引入actionlib这个依赖库,添加模块导入

import actionlib

actionlib.ActionClient: Action的Client端对应的类。

第一个参数:当前action的名称

第二个参数: 当前action的消息类型

3. 发送Goal指令给Server端

1
2
3
# 发送请求
goal = CountNumberGoal(max=50, duration=0.5)
client.send_goal(goal, transition_cb=transition_cb, feedback_cb=feedback_cb)

Tip

def send_goal(self, goal, transition_cb=None, feedback_cb=None)

send_goal函数,对应了几个参数。

第一个参数goal: 对应的是发送的指令数据,server端会根据客户端的数据进行对应的逻辑。

第二个参数transition_cb:server端状态改变时,告知客户端的回调。

第三个参数feedback_cb: server端在执行操作过程中,告知客户端的进度回调。

4.完成回调

状态改变回调:

1
2
def transition_cb(goal_handle):
    rospy.loginfo("---------------transition cb---------------")

进度回调:

1
2
3
def feedback_cb(goal_handle, feedback):
    rospy.loginfo("---------------feedback cb---------------")
    rospy.loginfo(feedback)

完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# coding:utf-8

import rospy
import actionlib
from actionlib import GoalStatus
from actionlib import ClientGoalHandle
from demo_actions.msg import CountNumberAction, CountNumberGoal, CountNumberResult


def transition_cb(goal_handle):
    rospy.loginfo("---------------transition cb---------------")


def feedback_cb(goal_handle, feedback):
    rospy.loginfo("---------------feedback cb---------------")
    rospy.loginfo(feedback)


if __name__ == '__main__':
    nodeName = "CountNumberClint"
    actionName = "/count_number"

    # 创建节点
    rospy.init_node(nodeName, anonymous=True)

    # 创建客户端
    client = actionlib.ActionClient(actionName, CountNumberAction)
    # 等待连接服务器
    client.wait_for_server()

    # 发送请求
    goal = CountNumberGoal(max=50, duration=0.5)
    goal_handle = client.send_goal(goal, transition_cb=transition_cb, feedback_cb=feedback_cb)

    rospy.spin()

调试Client端

通过现有的server端进行调试。