34 if (
debug) std::cout <<
"RRT::extend("<< qRand <<
", " << reverse <<
")" 40 tree->findNearestNode(qRand, minNode, min);
41 if (
debug) std::cout <<
"nearest : pos = (" << minNode->position()
42 <<
"), d = " << min << std::endl;
44 if (minNode != NULL) {
50 if (
debug) std::cout <<
"qRand = (" << qRand <<
")" << std::endl;
51 if (mobility->
distance(minNode->position(), qRand) > min){
52 std::cout <<
"distance didn't decrease" << std::endl;
53 std::cout <<
"qRandOrg : (" << qRandOrg <<
"), d = " << min
55 std::cout <<
"qRand : (" << qRand <<
"), d = " 56 << mobility->
distance(minNode->position(), qRand)
65 if (mobility->
isReachable(qRand, minNode->position())){
67 tree->addNode(newNode);
68 tree->addEdge(newNode, minNode);
70 if (
debug) std::cout <<
"reached(" << qRand <<
")"<< std::endl;
74 if (
debug) std::cout <<
"advanced(" << qRand <<
")" << std::endl;
78 if (
debug) std::cout <<
"trapped" << std::endl;
82 if (mobility->
isReachable(minNode->position(), qRand)){
84 tree->addNode(newNode);
85 tree->addEdge(minNode, newNode);
87 if (
debug) std::cout <<
"reached(" << qRand <<
")"<< std::endl;
91 if (
debug) std::cout <<
"advanced(" << qRand <<
")" << std::endl;
95 if (
debug) std::cout <<
"trapped" << std::endl;
105 if (
debug) std::cout <<
"RRT::connect(" << qNew <<
")" << std::endl;
111 ret =
extend(tree, q, reverse);
127 if (!startMidNode || !goalMidNode)
return;
134 o_path.insert(o_path.begin(), node->position());
135 node = node->parent(0);
136 }
while (node != NULL);
144 o_path.push_back(node->position());
145 node = node->child(0);
146 }
while (node != NULL);
149 startMidNode->children_.push_back(goalMidNode);
150 goalMidNode->parent_ = startMidNode;
177 if (ret ==
Reached)
return true;
180 std::cout <<
"this case is not implemented" << std::endl;
188 if (
verbose_) std::cout <<
"RRT::calcPath" << std::endl;
197 std::cout <<
"times:" <<
times_ << std::endl;
198 std::cout <<
"eps:" <<
eps_ << std::endl;
205 Tgoal_ ->addNode(goalNode);
207 bool isSucceed =
false;
212 printf(
"%5d/%5dtrials : %5d/%5dnodes\r",
i+1, times_,
Tstart_->nNodes(),
Tgoal_->nNodes());
222 std::cout << std::endl <<
"fin.(calcPath), retval = " << isSucceed << std::endl;
virtual double distance(const Configuration &from, const Configuration &to) const =0
Configuration random()
generate random position
RoadmapPtr roadmap_
ロードマップ
ConfigurationSpace * getConfigurationSpace()
コンフィギュレーション空間設定を取得する
static int min(int a, int b)
bool checkCollision()
現在の状態で干渉検出を行う
RTC::ReturnCode_t ret(RTC::Local::ReturnCode_t r)
RoadmapPtr Tstart_
RRT-connect において、初期位置からのツリー
RoadmapPtr Tgoal_
RRT-connect において、終了位置からのツリー
extraConnectionCheckFunc extraConnectionCheckFunc_
std::map< std::string, std::string > properties_
プロパティ
int connect(RoadmapPtr tree, const Configuration &qNew, bool reverse=false)
RRT-connect の connect 関数。伸ばせなくなるまで extend する
void extractPath()
計画した経路を抽出し、path_にセットする
Mobility * getMobility()
移動能力を取得する
int extend(RoadmapPtr tree, Configuration &qRand, bool reverse=false)
ランダムな点に向かってツリーを伸ばす。
boost::shared_ptr< RoadmapNode > RoadmapNodePtr
void setBackwardTree(RoadmapPtr tree)
ゴールからのツリーを設定する
RoadmapPtr TlastExtended_
a tree extened in the last phase
RRT(PathPlanner *planner)
コンストラクタ
std::vector< Configuration > path_
計画された経路
bool ignoreCollisionAtStart_
bool isReachable(Configuration &from, Configuration &to, bool checkCollision=true) const
fromからtoへ干渉なしに移動可能であるかどうか
boost::function1< bool, const Configuration & > extraConnectionCheckFunc
RoadmapPtr Ta_
ツリーの交換のために用いる変数。どちらか一方がTstart_をもう一方がTgoal_を指す
PathPlanner * planner_
計画経路エンジン
void setExtraConnectionCheckFunc(extraConnectionCheckFunc i_func)
スタートからのツリーとゴールからのツリーが接続できたかの追加チェックを行うユーザ関数を設定する ...
boost::shared_ptr< Roadmap > RoadmapPtr
void setForwardTree(RoadmapPtr tree)
スタートからのツリーを設定する
bool calcPath()
親クラスのドキュメントを参照
bool ignoreCollisionAtGoal_
bool extendOneStep()
ツリーを伸ばす処理を1回だけ行う
virtual Configuration interpolate(const Configuration &from, const Configuration &to, double ratio) const =0