ROSアクションのお勉強
rosアクションの復習
アクションの作成
型の定義
$ roscd sample $ mkdir action $ cd action $ touch sample.action
sample.actionの中身↓
uint16[] freqs --- bool finished --- uint32 steps
上からGoal,Result,Feedbackのmsgになる
設定
package.xmlに以下を追加
<build_depend>actionlib_msgs</build_depend> <run_depend>actionlib_msgs</run_depend>
CMakeLists.txtに以下を追加
find_package(catkin REQUIRED COMPONENTS rospy std_msgs message_generation # 追加 actionlib_msgs # 追加 )
add_action_files( FILES sample.action # 追加 )
generate_message( DEPENDENCIES actionlib_msgs # 追加 std_msgs )
actionの実装例
サーバー
import rospy, actionlib from sample.msg import sampleAction, sampleResult, sampleFeedback def execute_sample(goal): result = sampleResult() feedback = sampleFeedback() feedback.steps = = len(goal.freqs) #feedback = sampleFeedback(steps = len(goal.freqs)) action_sample.publish_feedback(feedback) # FEEDBACK if action_sample.is_preempt_requested(): result.finished = Flase action_sample.set_preempted(result) # 中断された時 return result.finished = True action_sample.set_succeeded(result) # RESULT rospy.init_node('sample_server') action_sample = actionlib.SimpleActionServer('sample', sampleAction, execute_sample, False) action_sample.start() rospy.spin()
クライアント
import rospy, actionlib from sample.msg import sampleAction, sampleResult, sampleFeedback, sampleGoal action_sample_client = actionlib.SimpleActionClient('sample', sampleAction) def do_sample(): goal = sampleGoal() goal.freqs = [100, 200, 0, 0] action_sample_client.wait_for_server() action_sample_client.send_goal(goal,feedback_cb=feedback_cb) action_sample_client.wait_for_result() result = action_sample.get_result() if result.finished is True: print "Goal" else: print "Not Goal" def feedback_cb(feedback): print feedback if __name__ == '__main__': rospy.init_node('sample_client') do_sample()
send_goalでフィードバックを受け取るコールバック関数を指定することができる