空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

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

rospy.init_node('sample_server')
action_sample = actionlib.SimpleActionServer('sample', sampleAction, execute_sample, False)
action_sample.start()
rospy.spin()

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

クライアント

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でフィードバックを受け取るコールバック関数を指定することができる