49.在ROS中實現(xiàn)local planner(2)- 實現(xiàn)Purepersuit(純跟蹤)算法

48.在ROS中實現(xiàn)local planner(1)- 實現(xiàn)一個可以用的模板實現(xiàn)了一個模板咕痛,接下來我們將實現(xiàn)一個簡單的純跟蹤控制茉贡,也就是沿著固定的路徑運動,全局規(guī)劃已經(jīng)規(guī)劃出路徑點腔丧,基于該路徑輸出相應(yīng)的控制速度

1. Pure Pursuit

Pure Pursuit路徑跟隨便是基于受約束移動機(jī)器人圓周運動的特性所開發(fā)出來的運動控制方式作烟。原理十分簡單,如圖所示拿撩,移動機(jī)器人有一個前視的搜索半徑,與機(jī)器人規(guī)劃的路徑有一個焦點,假設(shè)機(jī)器人從當(dāng)前位置到路徑焦點的運動為圓周運動错邦。其中的前視距離便是圖1中的L型宙。根據(jù)幾何關(guān)系便可以計算機(jī)器人的運動半徑。

受約束的機(jī)器人模型(不能橫向運動)可由兩個控制量組成早歇,即運動參考點的線速度v與角速度w讨勤。在極短的運行周期中,機(jī)器人都是以固定的線速度與角速度運動潭千。因此機(jī)器人的運動可以視為圓周運動(w=0時為直線運動)。

2. 運動半徑推算

如圖所示的機(jī)器人便是繞著一個旋轉(zhuǎn)中心進(jìn)行圓周運動屉来,于是移動機(jī)器人的運動控制可視為求解其在運動過程中的實時旋轉(zhuǎn)半徑。圖中茄靠,r為移動機(jī)器人的旋轉(zhuǎn)半徑。

我們以base坐標(biāo)系為例慨绳,及當(dāng)前機(jī)器人為坐標(biāo)原點真竖,x軸為前方,y軸為左方恢共,即ROS的坐標(biāo)系,(x,y)為目標(biāo)點讨韭, L為距離目標(biāo)點的距離(前視距離),如下計算狰闪,容易求得旋轉(zhuǎn)半徑r

由圖可得d = {r - y}
d^2+x^2 = r^2
即:r^2-2ry+y^2+x^2 = r^2
即:x^2+y^2 = 2ry
即:L^2 = 2ry
即:r = L^2/2y

運動半徑=前視距離的平方/兩倍的y

我們知道r=v/w 即我們只需要給定v/w為固定的值即可

因v與L相關(guān) 我們?nèi)∫淮侮P(guān)系
v=aL a為長數(shù)項
可得w=v/r=a*2y/L

3. 坐標(biāo)轉(zhuǎn)換

我們知道setPlan下發(fā)的坐標(biāo)一般使用的是map坐標(biāo)系蹬铺,我們計算的時候需要轉(zhuǎn)換為base坐標(biāo)系

我們可以使用init接口提供的tf::TransformListener即可完成, (1.14.0版本后接口更新,使用新的接口)


geometry_msgs::PoseStamped PurepursuitPlanner::goalToBaseFrame(const geometry_msgs::PoseStamped& goal_pose_msg) {

#if ROS_VERSION_GE(ROS_VERSION_MAJOR, ROS_VERSION_MINOR, ROS_VERSION_PATCH, 1, 14, 0)

  geometry_msgs::PoseStamped goal_pose, base_pose_msg;

  goal_pose = goal_pose_msg;

  goal_pose.header.stamp = ros::Time(0.0);

  try {

    base_pose_msg = tf_->transform(goal_pose, "base_link");

  } catch (tf2::TransformException& ex) {

    ROS_WARN("transform err");

    return base_pose_msg;

  }

#else

  geometry_msgs::PoseStamped base_pose_msg;

  tf::Stamped<tf::Pose> goal_pose, base_pose;

  poseStampedMsgToTF(goal_pose_msg, goal_pose);

  goal_pose.stamp_ = ros::Time();

  try {

    tf_->transformPose(costmap_ros_->getBaseFrameID(), goal_pose, base_pose);

  } catch (tf::TransformException& ex) {

    ROS_WARN("transform err");

    return base_pose_msg;

  }

  tf::poseStampedTFToMsg(base_pose, base_pose_msg);

#endif

  return base_pose_msg;

}

4. 前視距離

我們不斷根據(jù)當(dāng)前位置秋泄,更新前視距離,通過前面的接算恒序,給定速度

4.1 前視距離大小設(shè)置

前世距離可以根據(jù)V我們預(yù)設(shè)速度相關(guān)

  • 如果前世距離較大,相當(dāng)于路徑采樣間隔較大歧胁,跟蹤路徑與規(guī)劃路徑的偏差會大。

  • 如果前世距離較小喊巍,機(jī)器人容易抖動

4.2 前視距離更新策略

如果當(dāng)前距離路徑中前視距離的點后的n個點的距離小于前世距離,則更新前視距離
即如果當(dāng)前前視距離的點在路徑索引為n崭参,則判斷n+m索引距離當(dāng)前點位置是否小于預(yù)設(shè)前視距離值

5. 速度限制

一般機(jī)器人小車,線速度是>0的即奄喂,只能前進(jìn),無法后退跨新。這就需要我們新增當(dāng)前前視點角度判斷, 如果角度超過90域帐,即在車的后方「┦鳎可以對速度修正強(qiáng)制旋轉(zhuǎn)

  auto target_yaw_diff = atan2(goal.pose.position.y, goal.pose.position.x);  // 當(dāng)前目標(biāo)點相對機(jī)器人的角度
  
.... // 計算半徑 速度

    // 當(dāng)前目標(biāo)點相對機(jī)器人的角度 相差較大(即目標(biāo)點在機(jī)器人后面)贰盗, 需要直發(fā)角速度(即原地旋轉(zhuǎn)), 轉(zhuǎn)向目標(biāo)點
    if (target_yaw_diff > PI*0.5) {
      cmd_vel.linear.x = 0;
      cmd_vel.angular.z = 0.8;
    } else if (target_yaw_diff < -PI*0.5) {
      cmd_vel.linear.x = 0;
      cmd_vel.angular.z = -0.8;
    }

6. 完成判斷

我們在前視點到達(dá)規(guī)劃路徑的最后一個時舵盈,且當(dāng)前點與該最后一點距離差小于預(yù)設(shè)的容忍差,強(qiáng)制輸出0速度

  if (got && l < GOAL_TOERANCE_XY) {
    goal_reached_ = true;
    cmd_vel.angular.z = 0;
    cmd_vel.linear.x = 0;
  }

7. 測試

  • 修改move_base配置文件move_base_params.yaml
# base_local_planner: "dwa_local_planner/DWAPlannerROS"
base_local_planner: pure_pursuit_local_planner/PurepursuitPlanner

dwa_local_planner/DWAPlannerROS--->pure_pursuit_local_planner/PurepursuitPlanner

  • 啟動模擬器
pibot_simulator
  • 啟動rviz
pibot_view
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秽晚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菩浙,更是在濱河造成了極大的恐慌,老刑警劉巖劲蜻,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異先嬉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疫蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岔乔,“玉大人拗小,你說我怎么就攤上這事樱哼“Ь牛” “怎么了阅束?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長息裸。 經(jīng)常有香客問我沪编,道長,這世上最難降的妖魔是什么蚁廓? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮相嵌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饭宾。我一直安慰自己,他們只是感情好看铆,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著否淤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叹括。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天净嘀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死变屁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膜眠。 我是一名探鬼主播溜嗜,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辟躏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捎琐,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤裹匙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后概页,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绰沥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了零截。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡涧衙,死狀恐怖哪工,靈堂內(nèi)的尸體忽然破棺而出雁比,到底是詐尸還是另有隱情,我是刑警寧澤撤嫩,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站茴她,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丈牢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一己沛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧申尼,春花似錦、人聲如沸晶姊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钾怔。三九已至,卻和暖如春宗侦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾利。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留男旗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓察皇,卻偏偏與公主長得像泽台,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怀酷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容