この記事はROS×Python勉強会用です。今回はActionLibを使いウェイポイントナビゲーションのプログラムを作りましょう。これを応用するだけで、つくばチャレンジに出場できますよ。
まずは、以下のROSチュートリアルを読みましょう。
次のソースコードはこれのPython版です。
ソース
#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import tf import actionlib from actionlib_msgs.msg import * from geometry_msgs.msg import Pose, PoseWithCovarianceStamped, Point, Quaternion\ , Twist from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal from math import pi class WpNavi(): def __init__(self): # コンストラクタ # ノードの初期化 rospy.init_node('wp_navi') # シャットダウン時の処理 rospy.on_shutdown(self.shutdown) # アクションクライアントの生成 self.ac = actionlib.SimpleActionClient('move_base', MoveBaseAction) # アクションサーバーが起動するまで待つ。引数はタイムアウトの時間(秒) while not self.ac.wait_for_server(rospy.Duration(5)): rospy.loginfo("Waiting for the move_base action server to come up") rospy.loginfo("The server comes up"); # ゴールの生成 self.goal = MoveBaseGoal() self.goal.target_pose.header.frame_id = 'map' # 地図座標系 self.goal.target_pose.header.stamp = rospy.Time.now() # 現在時刻 way_point = [[-2.0, 3.0,-0.5 * pi], [ 3.0, 3.0, 0.0 * pi], [ 3.0,-4.5, 0.5 * pi],[ 0.0,-4.5, 1.0 * pi], [0.0, 0.0, 0.0 * pi], [999, 999, 999]] # メインループ。ウェイポイントを順番に通過 i = 0 while not rospy.is_shutdown(): # ROSではロボットの進行方向がx座標、左方向がy座標、上方向がz座標 self.goal.target_pose.pose.position.x = way_point[i][0] self.goal.target_pose.pose.position.y = way_point[i][1] if way_point[i][0] == 999: break q = tf.transformations.quaternion_from_euler(0, 0, way_point[i][2]) self.goal.target_pose.pose.orientation = Quaternion(q[0],q[1],q[2],q[3]) rospy.loginfo("Sending goal: No" + str(i+1)) # サーバーにgoalを送信 self.ac.send_goal(self.goal); # 結果が返ってくるまで30.0[s] 待つ。ここでブロックされる。 succeeded = self.ac.wait_for_result(rospy.Duration(30)); # 結果を見て、成功ならSucceeded、失敗ならFailedと表示 state = self.ac.get_state(); if succeeded: rospy.loginfo("Succeeded: No."+str(i+1)+"("+str(state)+")") else: rospy.loginfo("Failed: No."+str(i+1)+"("+str(state)+")") i = i + 1 def shutdown(self): rospy.loginfo("The robot was terminated") # ゴールをキャンセル self.ac.cancel_goal() if __name__ == '__main__': try: WpNavi() rospy.spin() except rospy.ROSInterruptException: rospy.loginfo("WP navigation finished.")
演習
- 上のソースコードをエディタで以下の要領でファイルwp_navigation.pyに保存する。
- $ mkdir -p ~/catkin_ws/src/wp_navigation/scripts
- $ cd ~/catkin_ws/src/wp_navigation/scripts
- 次のコマンドでgeditを開き、上のソースコードをコピペして保存する。
$ gedit ~/catkin_ws/src/wp_navigation/scripts/wp_navigation.py
- wp_navigation.pyを次の要領で実行しよう。
- $ roslaunch turtlebot_gazebo turtlebot_world.launch
- $ roslaunch turtlebot_gazebo amcl_demo.launch map_file:=/opt/ros/indigo/share/turtlebot_gazebo/maps/playground.yaml
- $ roslaunch turtlebot_rviz_launchers view_navigation.launch
- $ rosrun wp_navigation wp_navigation.py
終わり
コメント