ROS 教程之navigation: 用程序设定导航目标点
?? ? ? 在做導航的過程中,目的地都是通過RViz界面手動設置的,很麻煩。那么能否通過程序設置目標點,讓機器人自動在幾個目標點之間來回循環(huán)呢?答案是肯定的,《Ros by Example volumn1》8.5.3節(jié)中也給出了答案。但是,本文給出一個更簡單的例子,在機器人前方1m處設定目標點,文章內容幾乎來自ROS navigation 官方wiki文檔。
? ? ? ?在進行下面的試驗之前,希望你已經在自己的機器人上完成了使用move_base進行控制的任務。
? ? ? ?第一步:創(chuàng)建用于發(fā)布目標點的package,包名稱為simple_navigation_goals:
$ catkin_create_pkg simple_navigation_goals move_base_msgs actionlib roscpp 如果你不想創(chuàng)建一個包,而是在已有的package下創(chuàng)建一個節(jié)點,那必須修改這個package的package.xml文件:
在相應位置處添加上如下幾行:
<bulid_depend>move_base_msgs</bulid_depend> <bulid_depend>actionlib</bulid_depend>以及:
<run_depend>move_base_msgs</run_depend> <run_depend>actionlib</run_depend> ? ? ? ? 第二步:在這個package下的src文件下用文本編輯器創(chuàng)建一個cpp文件send_goal.cpp。如果還沒有src文件夾,自己手動創(chuàng)建一個。將下列代碼復制進去: #include <ros/ros.h> #include <move_base_msgs/MoveBaseAction.h> #include <actionlib/client/simple_action_client.h>typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;int main(int argc, char** argv){ros::init(argc, argv, "simple_navigation_goals");//tell the action client that we want to spin a thread by defaultMoveBaseClient ac("move_base", true);//wait for the action server to come upwhile(!ac.waitForServer(ros::Duration(5.0))){ROS_INFO("Waiting for the move_base action server to come up");}move_base_msgs::MoveBaseGoal goal;//we'll send a goal to the robot to move 1 meter forwardgoal.target_pose.header.frame_id = "base_link";goal.target_pose.header.stamp = ros::Time::now();goal.target_pose.pose.position.x = 1.0;goal.target_pose.pose.orientation.w = 1.0;ROS_INFO("Sending goal");ac.sendGoal(goal);ac.waitForResult();if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)ROS_INFO("Hooray, the base moved 1 meter forward");elseROS_INFO("The base failed to move forward 1 meter for some reason");return 0; } 代碼解讀:
? ? 1. 注意代碼中用的是action,不是服務service。ROS中的服務service是一問一答的形式,你來查詢了,我就返給你要的信息。action也有服務的概念,但是它不一樣的地方是不是一問一答,而多了一個反饋,它會不斷反饋項目進度。如這里,你設定了目標點,反饋信息可能是機器人在規(guī)劃路徑上的即時位姿,直到機器人到達目標點,返回SUCCEEDED消息。有關actionlib的具體知識請參加ROS官方wiki。
? ? 2.這段程序的目的是是移動機器人前進1m。注意程序中:
這里設定目標點goal所在的坐標系base_link,因此目標點位姿position.x = 1 的含義是在當前base_link中前進1m。當然你可將目標點設定在絕對坐標系中,如在map坐標系。至于在map坐標系中,具體的目標點參數如何得到?可以使用RViz中的navigation goal,點擊地圖中相應點進行查看。
? ? ? 第三步:編譯并運行
? ? ? 要使得上述程序會生成可執(zhí)行文件,還需要對package的CMakeList.txt文件進行修改:
add_executable(send_goal src/send_goal.cpp) target_link_libraries(send_goal ${catkin_LIBRARIES}) 接下來可以編譯了: $ cd ~/catkin_ws $ catkin_make
? ? ? ?運行:
? ? ? ?注意,如果你程序中使用的是map坐標系,和定位導航一樣,應該在RViz中設定機器人初始位姿以后,才開始執(zhí)行這個發(fā)送目標點的節(jié)點,這樣做的目的是滿足機器人的定位要求,使得amcl包能正確運行。如果是base_link坐標系則關系不大,因為目標點是相對機器人的,運行程序以后,你將看到機器人前進1m。
? ? ??
? ??
(轉載請注明作者和出處:http://blog.csdn.net/heyijia0327?未經允許請勿用于商業(yè)用途)
總結
以上是生活随笔為你收集整理的ROS 教程之navigation: 用程序设定导航目标点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm 升级所有依赖包
- 下一篇: Java 正则表达式