make_planサービスにおけるROSの使用

経路計画:一点から別の、最適なルートを計画します。サービスを使用します。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

 

おすすめ

転載: www.cnblogs.com/sea-stream/p/11129987.html
おすすめ