python实现自定义动作action
写在最前
此篇博客为vscode开发系列ros第11篇vscode开发ROS(11)-ROS动作通信机制(action)的python实现版本, 请对照进行查看.
自定义动作
此处是直接采用第11篇中的, 自定义heatWater.action
服务, 具体过程, 请查看该篇, 此处不再赘述.
新建Server节点
1, 在scripts文件夹中, 新建pyHeatWaterServer.py
文件.
2, 粘贴以下代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
import actionlib #导入动作库
import time
from ros_test.msg import heatWaterAction,heatWaterGoal,heatWaterResult,heatWaterFeedback #导入自定义动作
def execute(goal):#动作服务回调
feedback = heatWaterFeedback() #反馈
result = heatWaterResult() #最终结果
rospy.loginfo("目标水温[%f]℃."%goal.tempTarget) #打印目标温度
TTemp = goal.tempTarget #目标温度
NTemp = 0 #临时变量
deltaTemp = 5.5 #增量
while(True):
time.sleep(1) #模拟加热耗时
NTemp+=deltaTemp #加热
feedback.tempNow = NTemp #更新反馈
if NTemp > TTemp : #如果达到目标温度
result.tempFinal = NTemp #给最终结果赋值
break
action_server.publish_feedback(feedback) #反馈中间结果
rospy.loginfo("水烧开了...") #提示
action_server.set_succeeded(result) #反馈最终结果
rospy.init_node("heatWaterServer") #初始化节点
action_server=actionlib.SimpleActionServer("heatWater",heatWaterAction,execute,auto_start=False)#初始化动作服务,动作名heatWaterAction,回调函数execute
action_server.start()#启动动作服务
rospy.spin() #循环等待
新建Client节点
1, 在scripts文件夹中, 新建pyHeatWaterClient.py
文件.
2, 粘贴以下代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
import actionlib#导入动作库
from ros_test.msg import heatWaterAction,heatWaterGoal,heatWaterResult,heatWaterFeedback#导入自定义动作
#激活动作回调
def active():
rospy.loginfo("开始烧水....")
#动作服务完成回调
def done(d,result):
rospy.loginfo("水烧开了,开水温度[%f]"%result.tempFinal)
#中间过程回调
def feedback(msg):
rospy.loginfo("当前水温[%f]℃"%msg.tempNow)
def client():
rospy.init_node("heatWaterClient") #初始化节点
action_client=actionlib.SimpleActionClient("heatWater",heatWaterAction)#初始化动作客户端
rospy.loginfo("等待烧水服务...")
action_client.wait_for_server() #等待动作服务
rospy.loginfo("烧水服务已启用...")
goal = heatWaterGoal() #目标
goal.tempTarget = 100 #设置目标温度
action_client.send_goal(goal,done,active,feedback)#申请服务
rospy.spin() #循环等待
if __name__ == '__main__':
try:
client()
except rospy.ROSInterruptException:
pass
3, 具体介绍请看注释, 同样比较简单.
4, 使用vscode的终端中cd命令,定位到pyHeatWaterClient.py
,pyHeatWaterServer.py
文件
cd src/ros_test/scripts/
5, 执行指令, 这一步是为了让pyHeatWaterClient.py pyHeatWaterServer.py
文件具有可执行权限, 不可缺少
chmod 0777 pyHeatWaterClient.py pyHeatWaterServer.py
运行Server和Client
1, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入roscore
,启用整个ROS总节点。
2, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test pyHeatWaterServer.py
,启用talker节点。
3, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test pyHeatWaterClient.py
,启用listener节点,
后记
更多机器人, ROS相关,公-众-号搜索 ”机器人小站"。