経路計画:一点から別の、最適なルートを計画します。サービスを使用します。make_plan(nav_msgs / GetPlan)
move_base_node / make_planと呼ばれるサービス、
nav_msgs / GetPlan API:
#計画取得からゴールまでの現在位置がポーズ スタート#を提起するための計画の geometry_msgs / スタートPoseStamped #目標位置の最終ポーズ geometry_msgs / PoseStamped目標 目標は場合は#をさプランナーができますどのように多くのメートル、妨げ #リラックス制約に失敗する前に、xとy。 float32寛容 --- nav_msgs / 経路計画 コンパクトメッセージ定義 geometry_msgs / スタートPoseStamped geometry_msgs / PoseStamped目標を float32トレランス nav_msgsを /経路計画
今すぐ使用する方法を学ぶ
新しいワークスペースパッケージをnavigation_example
CD〜/ catkin_ws / SRC
catkin_create_pkg navigation_example std_msgs rospy roscpp TF actionlib
次CMakeList.txt find_package
find_package(尾状花必要なコンポーネント
actionlib
roscpp
rospy
std_msgs
TF
)
srcディレクトリの新make_plan.cpp
/ * * make_plan.cpp * *作成した上:2016年8月10日 *著者:ユニコーン * / // 路线规划代码 する#include <ROS / ros.h> の#include <nav_msgs / GetPlan.h> の#include <geometry_msgs / PoseStamped .H> の#include < ストリング > の#include <ブースト/ foreachの .HPP> の#defineのforEach BOOST_FOREACH 空隙 fillPathRequest(nav_msgs :: GetPlan ::要求&リクエスト) { request.start.header.frame_idは = " マップ" 。 request.start.pose.position.x = 12.378; // 初期位置のx座標 request.start.pose.position.y = 28.638 ; // 初期位置y座標 request.start.pose.orientation.w = 1.0 ; // 方向 request.goal.header.frame_id = " 地図" ; request.goal.pose.position.x = 18.792 ; // 終点座標 request.goal.pose.position.y = 29.544 ; request.goal.pose.orientation.w = 1.0 ; request.tolerance = 0.5 ; // あなたがターゲット、制約に利用可能な最新に到達できない場合 } // ルート計画結果のコールバック のボイドcallPlanningService(ROS&ServiceClient ServiceClient ::、:: GetPlan nav_msgs&SRV) { // 実際のパスプランナーコールの実行 //は、実際の経路計画を実行し たIF (serviceClient.call(SRV)){ // srv.response.plan.posesコンテナの結果を保存し、トラバース取ら IF(!srv.response.plan.poses.empty()){ forEachの(CONST geometry_msgs :: PoseStamped&P、srv.response.plan.poses){ ROS_INFO(" X = F% 、Y =%F "p.pose.position.x、p.pose.position.y); } } 他{ ROS_WARNは(" 空の計画を得ました" ); } } 他{ ROS_ERROR(" %sのサービスを呼び出すことができませんでした-ロボットが移動している?" 、 serviceClient.getService()c_str())。 } } int型のmain(int型 ARGC、チャー ** ARGV) { ROS :: INIT(ARGC、ARGV、" make_plan_node " )。 ROS :: NodeHandle NH; // メイク計画の初期化サービスクエリ // 初始化路径规划服务、服务名称为"move_base_node / make_plan" のstd :: 文字列 SERVICE_NAME = " move_base_node / make_plan " ; //サービスがすでに実行されている場合無料サービスを待っている、それは実行の最後まで待機します。 しばらく(!ROS ::サービス:: waitForService(SERVICE_NAME、ROS ::期間(3.0 ))){ ROS_INFO(" サービスmove_base / make_planが使用可能になるのを待っています" ); } / * 初始化客户端、(nav_msgs / GetPlan) 所与の計画を要求する外部ユーザーは、そのプランを実行するmove_baseを引き起こすことなくmove_baseからポーズできます。 允许用户从move_base请求一个計画、并不会导致move_base执行此計画 * / ROS :: serviceClient serviceClient = nh.serviceClient <nav_msgs :: GetPlan>(SERVICE_NAME、真の); もし(!serviceClient){ ROS_FATAL(" %sのからGET計画サービスを初期化できませんでした"、 serviceClient.getService()c_str())。 戻る - 1 。 } nav_msgs :: GetPlan SRV。 // 请求服务:规划路线 fillPathRequest(srv.request)。 もし(!serviceClient){ ROS_FATAL(" %sの持続的なサービス接続に失敗しました" 、 。serviceClient.getService()c_str()); 戻る - 1 。 } ROS_INFO(" %sにconntect " 、serviceClient.getService()c_str())。 callPlanningService(serviceClient、SRV)。 }
CMakeListを追加しました
add_executable(make_plan SRC / make_plan.cpp)
target_link_libraries(make_plan
$ {catkin_LIBRARIES}
)
コンパイルして実行します。
CD〜/ catkin_wsの catkin_makeの ソースのdevel / setup.bash rosrun navigation_example make_plan
結果:
1。
2。
参考:
https://blog.csdn.net/yiranhaiziqi/article/details/52891312
https://blog.csdn.net/u013158492/article/details/50483123
https://blog.csdn.net/jack_20/article/details/80292601
http://ask.zol.com.cn/x/5428696.html