[{"data":1,"prerenderedAt":1986},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian":3,"wiki-doc-items-2023-12-30-ros2-tutorial":1565,"wiki:author-members":1974},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":486,"chapterOrder":1553,"date":1554,"description":63,"docKey":1555,"docRoot":1556,"docTitle":1557,"extension":1558,"isWikiDoc":831,"isWikiIndex":1559,"meta":1560,"navigation":831,"path":1561,"seo":1562,"stem":1563,"wikiDepth":265,"__hash__":1564},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念.md","基本概念",[7],"董佳辉",{"type":9,"value":10,"toc":1534},"minimark",[11,16,31,39,42,45,48,56,66,69,169,180,183,189,191,195,200,203,206,212,215,221,227,230,234,241,254,294,305,308,310,313,316,384,394,404,418,422,425,431,446,454,457,502,505,509,516,522,534,539,541,544,627,633,646,650,653,656,662,665,668,680,685,689,692,701,707,713,727,771,774,960,969,972,978,985,989,992,997,1000,1108,1115,1118,1124,1128,1131,1134,1178,1181,1230,1233,1256,1264,1266,1270,1280,1470,1486,1489,1495,1504,1510,1522,1530],[12,13,15],"h2",{"id":14},"behavior-tree-的基本概念","Behavior Tree 的基本概念",[17,18,19],"blockquote",{},[20,21,22,23,30],"p",{},"对应 BehaviorTree.CPP 3.8 官方文档：",[24,25,29],"a",{"href":26,"rel":27},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Flearn-the-basics\u002FBT_basics\u002F",[28],"nofollow","Learn the Basic Concepts → Introduction to BTs → Basic Concepts、Types of nodes","。",[20,32,33,34,38],{},"理解行为树，先把三个问题连起来：",[35,36,37],"strong",{},"节点怎样组成树，tick 怎样驱动执行，节点怎样通过状态报告结果。"," 在此基础上，再区分控制、装饰、条件、动作四类节点。",[20,40,41],{},"本文使用通用移动机器人示例。节点逻辑用 C++ 风格伪代码表示；实际节点的继承、注册和 XML 配置将在完整程序中学习。",[43,44],"hr",{},[12,46,47],{"id":47},"节点怎样组成一棵树",[20,49,50,51,55],{},"Behavior Tree，简称 BT，是一棵由 ",[52,53,54],"code",{},"TreeNode"," 组成的层次化任务树：",[57,58,64],"pre",{"className":59,"code":61,"language":62,"meta":63},[60],"language-text","Mission                   [ControlNode]\n├── CheckBattery          [ConditionNode]\n├── Inverter              [DecoratorNode]\n│   └── IsPathBlocked     [ConditionNode]\n└── NavigateToGoal        [ActionNode]\n","text","",[52,65,61],{"__ignoreMap":63},[20,67,68],{},"树中的位置关系是：",[70,71,72,88],"table",{},[73,74,75],"thead",{},[76,77,78,82,85],"tr",{},[79,80,81],"th",{},"名称",[79,83,84],{},"含义",[79,86,87],{},"图中的例子",[89,90,91,108,129,147],"tbody",{},[76,92,93,100,103],{},[94,95,96,97],"td",{},"根节点 ",[52,98,99],{},"Root",[94,101,102],{},"树的执行入口，没有父节点",[94,104,105],{},[52,106,107],{},"Mission",[76,109,110,116,119],{},[94,111,112,113],{},"父节点 ",[52,114,115],{},"Parent",[94,117,118],{},"直接包含其他节点的节点",[94,120,121,124,125,128],{},[52,122,123],{},"Inverter"," 是 ",[52,126,127],{},"IsPathBlocked"," 的父节点",[76,130,131,137,140],{},[94,132,133,134],{},"子节点 ",[52,135,136],{},"Child",[94,138,139],{},"直接挂在另一个节点下面的节点",[94,141,142,124,144,146],{},[52,143,123],{},[52,145,107],{}," 的子节点",[76,148,149,155,158],{},[94,150,151,152],{},"叶子节点 ",[52,153,154],{},"Leaf",[94,156,157],{},"没有子节点的节点",[94,159,160,163,164,163,166],{},[52,161,162],{},"CheckBattery","、",[52,165,127],{},[52,167,168],{},"NavigateToGoal",[20,170,171,172,174,175,177,178,30],{},"同一个节点可以既是子节点，又是父节点。例如 ",[52,173,123],{}," 在 ",[52,176,107],{}," 下面，同时又包含 ",[52,179,127],{},[20,181,182],{},"上层节点组织任务，叶子节点检查条件或执行操作。叶子节点内部仍然可以调用普通函数、读取传感器数据或请求外部服务；“没有子节点”只针对行为树结构。",[20,184,185,186,188],{},"这里的 ",[52,187,107],{}," 是示例名称，没有规定具体控制规则。图中的包含关系也没有规定每次执行一定会经过哪些节点。",[43,190],{},[12,192,194],{"id":193},"tick-向下传播状态向上返回","tick 向下传播，状态向上返回",[196,197,199],"h3",{"id":198},"tick-表示让节点执行一次当前逻辑","tick 表示让节点执行一次当前逻辑",[20,201,202],{},"官方文档中的 “tick a node”，可以理解为调用这个节点的执行回调。",[20,204,205],{},"外部从根节点发起一次 tick；有子节点的节点按照自己的规则决定是否继续传播、传播给谁，以及传播多少次：",[57,207,210],{"className":208,"code":209,"language":62,"meta":63},[60],"外部程序\n   ↓ tick\n根节点\n   ↓ 按规则传播 tick\n中间节点\n   ↓ 按规则传播 tick\n叶子节点\n   ↓ 检查条件或执行操作\n",[52,211,209],{"__ignoreMap":63},[20,213,214],{},"叶子节点返回状态，中间节点处理子节点的结果，再向更上层返回自己的状态：",[57,216,219],{"className":217,"code":218,"language":62,"meta":63},[60],"根节点\n   ↑ 自己组织的任务的状态\n中间节点\n   ↑ 子节点状态\n叶子节点\n",[52,220,218],{"__ignoreMap":63},[20,222,223,226],{},[35,224,225],{},"子节点只有被父节点 tick 时，才会执行相应回调。"," 因此，一次根节点 tick 不等于遍历整棵树；树中的某些分支可能完全没有执行。",[20,228,229],{},"父节点拿到子节点结果后，也不一定原样返回。它可以继续执行其他子节点、转换结果，或者报告这部分任务仍在运行，具体取决于节点规则。",[196,231,233],{"id":232},"和-fsm-的-update-联系起来","和 FSM 的 update() 联系起来",[20,235,236,237,240],{},"在非阻塞 FSM 中，外部周期性调用 ",[52,238,239],{},"fsm.update()","，根据当前状态推进任务。行为树同样需要外部持续驱动，但内部沿树结构组织执行。",[20,242,243,244,247,248,253],{},"在 BehaviorTree.CPP 3.8 中，单次驱动树的常见入口是 ",[52,245,246],{},"tickRoot()","，可对照官方 ",[24,249,252],{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Finclude\u002Fbehaviortree_cpp_v3\u002Fbt_factory.h",[28],"3.8.7 bt_factory.h","：",[57,255,259],{"className":256,"code":257,"language":258,"meta":63,"style":63},"language-cpp shiki shiki-themes github-light github-dark","\u002F\u002F 从根节点开始一次执行，取得整棵树这次返回的状态\nBT::NodeStatus status = tree.tickRoot();\n","cpp",[52,260,261,270],{"__ignoreMap":63},[262,263,266],"span",{"class":264,"line":265},"line",1,[262,267,269],{"class":268},"sJ8bj","\u002F\u002F 从根节点开始一次执行，取得整棵树这次返回的状态\n",[262,271,273,277,281,285,288,291],{"class":264,"line":272},2,[262,274,276],{"class":275},"sScJk","BT",[262,278,280],{"class":279},"sVt8B","::NodeStatus status ",[262,282,284],{"class":283},"szBVR","=",[262,286,287],{"class":279}," tree.",[262,289,290],{"class":275},"tickRoot",[262,292,293],{"class":279},"();\n",[20,295,296,297,300,301,304],{},"实际节点执行通常经过框架的 ",[52,298,299],{},"executeTick()"," 入口，再进入节点自己的 ",[52,302,303],{},"tick()"," 等回调。\n概念上的“tick 一个节点”包含了这个调用过程，不需要业务代码绕过框架直接调用每个节点的回调。",[20,306,307],{},"外部如何安排下一次 tick，以及使用哪些循环接口，后面在完整程序中说明。",[43,309],{},[12,311,312],{"id":312},"节点通过状态报告执行结果",[20,314,315],{},"一个节点被 tick 后，正常通过以下三个状态报告本次执行结果：",[70,317,318,334],{},[73,319,320],{},[76,321,322,325,328,331],{},[79,323,324],{},"状态",[79,326,327],{},"基本含义",[79,329,330],{},"条件节点的含义",[79,332,333],{},"动作节点的含义",[89,335,336,352,368],{},[76,337,338,343,346,349],{},[94,339,340],{},[52,341,342],{},"BT::NodeStatus::SUCCESS",[94,344,345],{},"本次执行成功结束",[94,347,348],{},"条件成立",[94,350,351],{},"动作成功完成",[76,353,354,359,362,365],{},[94,355,356],{},[52,357,358],{},"BT::NodeStatus::FAILURE",[94,360,361],{},"本次执行未成功",[94,363,364],{},"条件不成立",[94,366,367],{},"动作失败结束",[76,369,370,375,378,381],{},[94,371,372],{},[52,373,374],{},"BT::NodeStatus::RUNNING",[94,376,377],{},"尚未得到最终结果",[94,379,380],{},"不允许返回",[94,382,383],{},"支持异步执行的动作仍在运行",[20,385,386,387,389,390,393],{},"例如电量不足时，",[52,388,162],{}," 返回 ",[52,391,392],{},"FAILURE","，表示“电量足够”这个条件不成立；它本身不代表程序异常，也不一定让整棵树失败。父节点还要决定如何处理。",[20,395,396,397,399,400,403],{},"对于 ",[52,398,168],{},"，返回 ",[52,401,402],{},"SUCCESS"," 则表示导航成功完成，不能仅因为导航请求已经发出，就报告已经成功到达。",[20,405,406,407,163,409,411,412,163,415,30],{},"因此，",[52,408,402],{},[52,410,392],{}," 的具体业务含义由节点职责决定，不能一概替换成布尔值 ",[52,413,414],{},"true",[52,416,417],{},"false",[196,419,421],{"id":420},"running-表示任务未结束当前调用先返回","RUNNING 表示任务未结束，当前调用先返回",[20,423,424],{},"导航需要时间，典型过程是：",[57,426,429],{"className":427,"code":428,"language":62,"meta":63},[60],"第 1 次 tick 到导航节点：启动导航     → RUNNING\n第 2 次 tick 到导航节点：检查进度     → RUNNING\n第 3 次 tick 到导航节点：已经成功到达 → SUCCESS\n",[52,430,428],{"__ignoreMap":63},[20,432,433,434,30,436,438,439,441,442,445],{},"如果最终导航失败，最后一次结果就是 ",[52,435,392],{},[52,437,402],{}," 和 ",[52,440,392],{}," 都是这次任务的结束结果，",[52,443,444],{},"RUNNING"," 则表示尚未结束。",[20,447,448,449],{},"实现非阻塞动作时，每次回调只启动任务或快速检查当前进度，然后返回。",[35,450,451,453],{},[52,452,444],{}," 表示任务还没完成，不是函数一直不返回。",[20,455,456],{},"例如，在驱动树的线程中这样等待，会卡住这次执行：",[57,458,460],{"className":256,"code":459,"language":258,"meta":63,"style":63},"\u002F\u002F 不适合直接放进非阻塞动作的 tick() 中\nwhile (!GoalReached())\n{\n    \u002F\u002F 一直等到机器人到达，导致这次 tick 无法及时返回\n}\n",[52,461,462,467,484,490,496],{"__ignoreMap":63},[262,463,464],{"class":264,"line":265},[262,465,466],{"class":268},"\u002F\u002F 不适合直接放进非阻塞动作的 tick() 中\n",[262,468,469,472,475,478,481],{"class":264,"line":272},[262,470,471],{"class":283},"while",[262,473,474],{"class":279}," (",[262,476,477],{"class":283},"!",[262,479,480],{"class":275},"GoalReached",[262,482,483],{"class":279},"())\n",[262,485,487],{"class":264,"line":486},3,[262,488,489],{"class":279},"{\n",[262,491,493],{"class":264,"line":492},4,[262,494,495],{"class":268},"    \u002F\u002F 一直等到机器人到达，导致这次 tick 无法及时返回\n",[262,497,499],{"class":264,"line":498},5,[262,500,501],{"class":279},"}\n",[20,503,504],{},"持续任务应在后续 tick 中继续检查，具体示例见下面的动作节点。",[196,506,508],{"id":507},"idle-是未执行或已重置的状态","IDLE 是未执行或已重置的状态",[20,510,511,512,515],{},"BehaviorTree.CPP 内部还有 ",[52,513,514],{},"BT::NodeStatus::IDLE","，表示节点尚未开始执行，或者已被重置回初始状态：",[57,517,520],{"className":518,"code":519,"language":62,"meta":63},[60],"IDLE → 收到 tick → RUNNING → 后续 tick → SUCCESS \u002F FAILURE\n",[52,521,519],{"__ignoreMap":63},[20,523,524,525,528,529,531,532,30],{},"可以立即完成的节点也可能从 ",[52,526,527],{},"IDLE"," 直接得到 ",[52,530,402],{}," 或 ",[52,533,392],{},[20,535,536,538],{},[52,537,527],{}," 用于表示节点生命周期中的状态，普通执行回调不应把它作为执行结果返回。以后再次执行已经结束的任务时，还涉及框架的状态重置；具体机制留到节点实现时学习。",[43,540],{},[12,542,543],{"id":543},"四类节点分别负责什么",[70,545,546,562],{},[73,547,548],{},[76,549,550,553,556,559],{},[79,551,552],{},"节点类型",[79,554,555],{},"中文含义",[79,557,558],{},"直接子节点数量",[79,560,561],{},"主要职责",[89,563,564,580,596,612],{},[76,565,566,571,574,577],{},[94,567,568],{},[52,569,570],{},"ControlNode",[94,572,573],{},"控制节点",[94,575,576],{},"1 到 N 个",[94,578,579],{},"组织子节点，决定 tick 的传播和整体结果",[76,581,582,587,590,593],{},[94,583,584],{},[52,585,586],{},"DecoratorNode",[94,588,589],{},"装饰节点",[94,591,592],{},"恰好 1 个",[94,594,595],{},"调整子节点的执行方式或返回结果",[76,597,598,603,606,609],{},[94,599,600],{},[52,601,602],{},"ConditionNode",[94,604,605],{},"条件节点",[94,607,608],{},"0 个",[94,610,611],{},"检查条件是否成立",[76,613,614,619,622,624],{},[94,615,616],{},[52,617,618],{},"ActionNode",[94,620,621],{},"动作节点",[94,623,608],{},[94,625,626],{},"执行具体操作",[20,628,629],{},[630,631],"img",{"alt":63,"src":632},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002F1792222597917-0c6d7eea.webp",[20,634,635,636,639,640,642,643,645],{},"子节点数量只计算",[35,637,638],{},"直接挂在当前节点下面的节点","。例如开头的 ",[52,641,107],{}," 有三个直接子节点；",[52,644,127],{}," 是它的后代，但不是直接子节点。",[196,647,649],{"id":648},"controlnode组织子节点","ControlNode：组织子节点",[20,651,652],{},"控制节点根据自身规则、当前状态，以及子节点返回的结果，决定 tick 哪个子节点和自己返回什么状态。",[20,654,655],{},"它可以包含条件、动作、装饰节点，也可以继续包含控制节点：",[57,657,660],{"className":658,"code":659,"language":62,"meta":63},[60],"Mission                   [ControlNode]\n├── NavigateTask          [ControlNode]\n│   ├── CheckPathClear    [ConditionNode]\n│   └── NavigateToGoal    [ActionNode]\n└── StopRobot             [ActionNode]\n",[52,661,659],{"__ignoreMap":63},[20,663,664],{},"这样就能将大任务拆成子任务，再由子任务组织更具体的检查和操作。控制节点既可以处于根部，也可以嵌套在其他节点下面。",[20,666,667],{},"控制节点的子节点是有顺序的：横向图通常从左到右表示，本教程的竖向树结构从上到下表示。这个顺序会参与具体控制规则，但不保证每次 tick 都执行全部子节点。",[20,669,670,438,673,676,677,679],{},[52,671,672],{},"Sequence",[52,674,675],{},"Fallback"," 都属于 ",[52,678,570],{},"，具体规则下一篇集中学习。",[20,681,682,684],{},[52,683,576],{}," 是这一大类的数量范围；某些具体控制节点还要求固定数量的子节点，不能把这个范围理解为所有控制节点都接受任意数量。",[196,686,688],{"id":687},"decoratornode包装一个子节点","DecoratorNode：包装一个子节点",[20,690,691],{},"装饰节点收到 tick 后，按自己的规则决定是否、何时、多少次 tick 唯一的子节点，并处理它的执行结果。",[20,693,694,695,700],{},"按照 ",[24,696,699],{"href":697,"rel":698},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Fnodes-library\u002FDecoratorNode\u002F",[28],"3.8 官方装饰节点文档","，不同装饰节点可以转换结果、重复执行，或中止子节点；每一种只提供自身规定的行为。",[20,702,703,704,706],{},"例如 ",[52,705,123],{}," 对成功、失败取反：",[57,708,711],{"className":709,"code":710,"language":62,"meta":63},[60],"Inverter                  [DecoratorNode]\n└── IsPathBlocked         [ConditionNode]\n",[52,712,710],{"__ignoreMap":63},[20,714,715,717,718,720,721,723,724,726],{},[52,716,127],{}," 检查“路径被堵住了吗”。有障碍物返回 ",[52,719,402],{},"，没有障碍物返回 ",[52,722,392],{},"；加上 ",[52,725,123],{}," 后，这部分树表达的判断就变成“路径没有被堵住吗”。",[70,728,729,739],{},[73,730,731],{},[76,732,733,736],{},[79,734,735],{},"子节点返回",[79,737,738],{},"Inverter 返回",[89,740,741,751,761],{},[76,742,743,747],{},[94,744,745],{},[52,746,402],{},[94,748,749],{},[52,750,392],{},[76,752,753,757],{},[94,754,755],{},[52,756,392],{},[94,758,759],{},[52,760,402],{},[76,762,763,767],{},[94,764,765],{},[52,766,444],{},[94,768,769],{},[52,770,444],{},[20,772,773],{},"取反逻辑可以写成：",[57,775,777],{"className":256,"code":776,"language":258,"meta":63,"style":63},"BT::NodeStatus Inverter::tick()\n{\n    \u002F\u002F 只展示状态转换，省略框架内部的状态维护\n    BT::NodeStatus child_status = child.executeTick();\n\n    if (child_status == BT::NodeStatus::SUCCESS)\n    {\n        return BT::NodeStatus::FAILURE;\n    }\n\n    if (child_status == BT::NodeStatus::FAILURE)\n    {\n        return BT::NodeStatus::SUCCESS;\n    }\n\n    \u002F\u002F 尚未完成时，保持 RUNNING\n    return BT::NodeStatus::RUNNING;\n}\n",[52,778,779,800,804,809,827,833,855,861,876,882,887,905,910,924,929,934,940,955],{"__ignoreMap":63},[262,780,781,783,786,789,792,794,797],{"class":264,"line":265},[262,782,276],{"class":275},[262,784,785],{"class":279},"::",[262,787,788],{"class":275},"NodeStatus",[262,790,791],{"class":275}," Inverter",[262,793,785],{"class":279},[262,795,796],{"class":275},"tick",[262,798,799],{"class":279},"()\n",[262,801,802],{"class":264,"line":272},[262,803,489],{"class":279},[262,805,806],{"class":264,"line":486},[262,807,808],{"class":268},"    \u002F\u002F 只展示状态转换，省略框架内部的状态维护\n",[262,810,811,814,817,819,822,825],{"class":264,"line":492},[262,812,813],{"class":275},"    BT",[262,815,816],{"class":279},"::NodeStatus child_status ",[262,818,284],{"class":283},[262,820,821],{"class":279}," child.",[262,823,824],{"class":275},"executeTick",[262,826,293],{"class":279},[262,828,829],{"class":264,"line":498},[262,830,832],{"emptyLinePlaceholder":831},true,"\n",[262,834,836,839,842,845,848,850,852],{"class":264,"line":835},6,[262,837,838],{"class":283},"    if",[262,840,841],{"class":279}," (child_status ",[262,843,844],{"class":283},"==",[262,846,847],{"class":275}," BT",[262,849,785],{"class":279},[262,851,788],{"class":275},[262,853,854],{"class":279},"::SUCCESS)\n",[262,856,858],{"class":264,"line":857},7,[262,859,860],{"class":279},"    {\n",[262,862,864,867,869,871,873],{"class":264,"line":863},8,[262,865,866],{"class":283},"        return",[262,868,847],{"class":275},[262,870,785],{"class":279},[262,872,788],{"class":275},[262,874,875],{"class":279},"::FAILURE;\n",[262,877,879],{"class":264,"line":878},9,[262,880,881],{"class":279},"    }\n",[262,883,885],{"class":264,"line":884},10,[262,886,832],{"emptyLinePlaceholder":831},[262,888,890,892,894,896,898,900,902],{"class":264,"line":889},11,[262,891,838],{"class":283},[262,893,841],{"class":279},[262,895,844],{"class":283},[262,897,847],{"class":275},[262,899,785],{"class":279},[262,901,788],{"class":275},[262,903,904],{"class":279},"::FAILURE)\n",[262,906,908],{"class":264,"line":907},12,[262,909,860],{"class":279},[262,911,913,915,917,919,921],{"class":264,"line":912},13,[262,914,866],{"class":283},[262,916,847],{"class":275},[262,918,785],{"class":279},[262,920,788],{"class":275},[262,922,923],{"class":279},"::SUCCESS;\n",[262,925,927],{"class":264,"line":926},14,[262,928,881],{"class":279},[262,930,932],{"class":264,"line":931},15,[262,933,832],{"emptyLinePlaceholder":831},[262,935,937],{"class":264,"line":936},16,[262,938,939],{"class":268},"    \u002F\u002F 尚未完成时，保持 RUNNING\n",[262,941,943,946,948,950,952],{"class":264,"line":942},17,[262,944,945],{"class":283},"    return",[262,947,847],{"class":275},[262,949,785],{"class":279},[262,951,788],{"class":275},[262,953,954],{"class":279},"::RUNNING;\n",[262,956,958],{"class":264,"line":957},18,[262,959,501],{"class":279},[20,961,962,963,965,966,968],{},"例子中的条件节点不会返回 ",[52,964,444],{},"；（一般执行起来需要一段时间的才可能返回就RUNNING，而一些能瞬间就知道结果的，不会返回RUNNING。）\n表中保留这一行，是因为 ",[52,967,123],{}," 也能包装支持持续执行的节点。",[20,970,971],{},"装饰节点可以位于根部，也可以夹在其他节点之间。它唯一的子节点既可以是叶子，也可以是一整棵子树的入口：",[57,973,976],{"className":974,"code":975,"language":62,"meta":63},[60],"Timeout                   [DecoratorNode]\n└── NavigateTask          [ControlNode]\n    ├── CheckPathClear    [ConditionNode]\n    └── NavigateToGoal    [ActionNode]\n",[52,977,975],{"__ignoreMap":63},[20,979,980,981,984],{},"这里 ",[52,982,983],{},"Timeout"," 仍然只有一个直接子节点，下面有多少后代不影响这个数量限制。超时、重试、重复等具体规则将在控制与装饰规则一篇中学习。",[196,986,988],{"id":987},"conditionnode检查条件","ConditionNode：检查条件",[20,990,991],{},"条件节点是叶子节点，没有子节点。它通常读取已有数据，快速判断当前条件是否成立。",[20,993,994],{},[35,995,996],{},"官方要求 ConditionNode 不应改变系统，也不能返回 RUNNING。",[20,998,999],{},"例如检查机器人电量：",[57,1001,1003],{"className":256,"code":1002,"language":258,"meta":63,"style":63},"BT::NodeStatus CheckBattery::tick()\n{\n    \u002F\u002F battery_level 是已经获得的电量数据，单位为百分比\n    const double minimum_battery_level = 20.0;\n\n    if (battery_level >= minimum_battery_level)\n    {\n        return BT::NodeStatus::SUCCESS;\n    }\n\n    return BT::NodeStatus::FAILURE;\n}\n",[52,1004,1005,1022,1026,1031,1051,1055,1068,1072,1084,1088,1092,1104],{"__ignoreMap":63},[262,1006,1007,1009,1011,1013,1016,1018,1020],{"class":264,"line":265},[262,1008,276],{"class":275},[262,1010,785],{"class":279},[262,1012,788],{"class":275},[262,1014,1015],{"class":275}," CheckBattery",[262,1017,785],{"class":279},[262,1019,796],{"class":275},[262,1021,799],{"class":279},[262,1023,1024],{"class":264,"line":272},[262,1025,489],{"class":279},[262,1027,1028],{"class":264,"line":486},[262,1029,1030],{"class":268},"    \u002F\u002F battery_level 是已经获得的电量数据，单位为百分比\n",[262,1032,1033,1036,1039,1042,1044,1048],{"class":264,"line":492},[262,1034,1035],{"class":283},"    const",[262,1037,1038],{"class":283}," double",[262,1040,1041],{"class":279}," minimum_battery_level ",[262,1043,284],{"class":283},[262,1045,1047],{"class":1046},"sj4cs"," 20.0",[262,1049,1050],{"class":279},";\n",[262,1052,1053],{"class":264,"line":498},[262,1054,832],{"emptyLinePlaceholder":831},[262,1056,1057,1059,1062,1065],{"class":264,"line":835},[262,1058,838],{"class":283},[262,1060,1061],{"class":279}," (battery_level ",[262,1063,1064],{"class":283},">=",[262,1066,1067],{"class":279}," minimum_battery_level)\n",[262,1069,1070],{"class":264,"line":857},[262,1071,860],{"class":279},[262,1073,1074,1076,1078,1080,1082],{"class":264,"line":863},[262,1075,866],{"class":283},[262,1077,847],{"class":275},[262,1079,785],{"class":279},[262,1081,788],{"class":275},[262,1083,923],{"class":279},[262,1085,1086],{"class":264,"line":878},[262,1087,881],{"class":279},[262,1089,1090],{"class":264,"line":884},[262,1091,832],{"emptyLinePlaceholder":831},[262,1093,1094,1096,1098,1100,1102],{"class":264,"line":889},[262,1095,945],{"class":283},[262,1097,847],{"class":275},[262,1099,785],{"class":279},[262,1101,788],{"class":275},[262,1103,875],{"class":279},[262,1105,1106],{"class":264,"line":907},[262,1107,501],{"class":279},[20,1109,1110,1111,1114],{},"这个节点只判断电量，不会顺便启动充电。如果需要执行充电操作，应交给 ",[52,1112,1113],{},"StartCharging"," 等动作节点。",[20,1116,1117],{},"条件节点只有被 tick 时才会检查。将它放在导航节点旁边，不等于它会一直在后台监控电量；下一轮是否重新检查，仍取决于父节点有没有再次 tick 它。",[20,1119,1120,1121,1123],{},"如果需求是“等待直到电量足够”，其中包含持续等待过程，应使用能表达持续执行的动作或树结构，不能让条件节点用 ",[52,1122,444],{}," 表示等待。",[196,1125,1127],{"id":1126},"actionnode执行操作","ActionNode：执行操作",[20,1129,1130],{},"动作节点也是叶子节点。它可以设置指示灯、发送停止命令，或向外部导航系统发起任务并检查结果。",[20,1132,1133],{},"判断和操作的区别，可以通过这两个节点看清：",[70,1135,1136,1149],{},[73,1137,1138],{},[76,1139,1140,1143,1146],{},[79,1141,1142],{},"节点",[79,1144,1145],{},"类型",[79,1147,1148],{},"职责",[89,1150,1151,1165],{},[76,1152,1153,1158,1162],{},[94,1154,1155],{},[52,1156,1157],{},"IsGoalReached",[94,1159,1160],{},[52,1161,602],{},[94,1163,1164],{},"判断机器人现在是否已到达目标",[76,1166,1167,1171,1175],{},[94,1168,1169],{},[52,1170,168],{},[94,1172,1173],{},[52,1174,618],{},[94,1176,1177],{},"让机器人前往目标，并报告执行结果",[20,1179,1180],{},"动作分为同步与异步两种：",[70,1182,1183,1195],{},[73,1184,1185],{},[76,1186,1187,1189,1192],{},[79,1188,1145],{},[79,1190,1191],{},"执行方式",[79,1193,1194],{},"返回状态",[89,1196,1197,1212],{},[76,1198,1199,1202,1205],{},[94,1200,1201],{},"同步动作",[94,1203,1204],{},"在当前调用内完成，树的执行等待该调用返回",[94,1206,1207,1209,1210],{},[52,1208,402],{}," \u002F ",[52,1211,392],{},[76,1213,1214,1217,1220],{},[94,1215,1216],{},"异步动作",[94,1218,1219],{},"启动任务后先返回，后续继续检查或推进",[94,1221,1222,1223,1225,1226,1209,1228],{},"可以返回 ",[52,1224,444],{},"，最终返回 ",[52,1227,402],{},[52,1229,392],{},[20,1231,1232],{},"例如能立即完成的本地指示灯设置适合同步执行；\n导航需要等待机器人移动，适合异步执行。",[20,1234,1235,1236,1239,1240,1242,1243,1245,1246,1249,1250,438,1252,1255],{},"在 3.8 中，",[52,1237,1238],{},"SyncActionNode"," 明确禁止返回 ",[52,1241,444],{},"，否则框架会抛出异常。\n",[52,1244,618],{}," 是本节使用的分类名称；\n实际 C++ 类的共同基类叫 ",[52,1247,1248],{},"ActionNodeBase","，后面常用 ",[52,1251,1238],{},[52,1253,1254],{},"StatefulActionNode"," 实现动作。",[20,1257,1258,1259,30],{},"相关接口可对照官方 ",[24,1260,1263],{"href":1261,"rel":1262},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Finclude\u002Fbehaviortree_cpp_v3\u002Faction_node.h",[28],"3.8.7 action_node.h",[43,1265],{},[12,1267,1269],{"id":1268},"用导航任务串起-tick状态与节点职责","用导航任务串起 tick、状态与节点职责",[20,1271,1272,1273,1276,1277,1279],{},"下面用一个导航动作说明持续任务怎样执行。",[52,1274,1275],{},"navigation_started"," 表示保存在节点里的成员状态，初始为 ",[52,1278,417],{},"；导航接口本身应快速返回，实际移动由外部导航系统完成。",[57,1281,1283],{"className":256,"code":1282,"language":258,"meta":63,"style":63},"BT::NodeStatus NavigateToGoal::tick()\n{\n    \u002F\u002F 第一次执行时发送请求，不在每次 tick 时重复启动\n    if (!navigation_started)\n    {\n        StartNavigation();\n        navigation_started = true;\n    }\n\n    if (NavigationFailed())\n    {\n        navigation_started = false;\n        return BT::NodeStatus::FAILURE;\n    }\n\n    if (GoalReached())\n    {\n        navigation_started = false;\n        return BT::NodeStatus::SUCCESS;\n    }\n\n    \u002F\u002F 任务仍在进行，当前调用先返回\n    return BT::NodeStatus::RUNNING;\n}\n",[52,1284,1285,1302,1306,1311,1322,1326,1333,1345,1349,1353,1364,1368,1379,1391,1395,1399,1409,1413,1423,1436,1441,1446,1452,1465],{"__ignoreMap":63},[262,1286,1287,1289,1291,1293,1296,1298,1300],{"class":264,"line":265},[262,1288,276],{"class":275},[262,1290,785],{"class":279},[262,1292,788],{"class":275},[262,1294,1295],{"class":275}," NavigateToGoal",[262,1297,785],{"class":279},[262,1299,796],{"class":275},[262,1301,799],{"class":279},[262,1303,1304],{"class":264,"line":272},[262,1305,489],{"class":279},[262,1307,1308],{"class":264,"line":486},[262,1309,1310],{"class":268},"    \u002F\u002F 第一次执行时发送请求，不在每次 tick 时重复启动\n",[262,1312,1313,1315,1317,1319],{"class":264,"line":492},[262,1314,838],{"class":283},[262,1316,474],{"class":279},[262,1318,477],{"class":283},[262,1320,1321],{"class":279},"navigation_started)\n",[262,1323,1324],{"class":264,"line":498},[262,1325,860],{"class":279},[262,1327,1328,1331],{"class":264,"line":835},[262,1329,1330],{"class":275},"        StartNavigation",[262,1332,293],{"class":279},[262,1334,1335,1338,1340,1343],{"class":264,"line":857},[262,1336,1337],{"class":279},"        navigation_started ",[262,1339,284],{"class":283},[262,1341,1342],{"class":1046}," true",[262,1344,1050],{"class":279},[262,1346,1347],{"class":264,"line":863},[262,1348,881],{"class":279},[262,1350,1351],{"class":264,"line":878},[262,1352,832],{"emptyLinePlaceholder":831},[262,1354,1355,1357,1359,1362],{"class":264,"line":884},[262,1356,838],{"class":283},[262,1358,474],{"class":279},[262,1360,1361],{"class":275},"NavigationFailed",[262,1363,483],{"class":279},[262,1365,1366],{"class":264,"line":889},[262,1367,860],{"class":279},[262,1369,1370,1372,1374,1377],{"class":264,"line":907},[262,1371,1337],{"class":279},[262,1373,284],{"class":283},[262,1375,1376],{"class":1046}," false",[262,1378,1050],{"class":279},[262,1380,1381,1383,1385,1387,1389],{"class":264,"line":912},[262,1382,866],{"class":283},[262,1384,847],{"class":275},[262,1386,785],{"class":279},[262,1388,788],{"class":275},[262,1390,875],{"class":279},[262,1392,1393],{"class":264,"line":926},[262,1394,881],{"class":279},[262,1396,1397],{"class":264,"line":931},[262,1398,832],{"emptyLinePlaceholder":831},[262,1400,1401,1403,1405,1407],{"class":264,"line":936},[262,1402,838],{"class":283},[262,1404,474],{"class":279},[262,1406,480],{"class":275},[262,1408,483],{"class":279},[262,1410,1411],{"class":264,"line":942},[262,1412,860],{"class":279},[262,1414,1415,1417,1419,1421],{"class":264,"line":957},[262,1416,1337],{"class":279},[262,1418,284],{"class":283},[262,1420,1376],{"class":1046},[262,1422,1050],{"class":279},[262,1424,1426,1428,1430,1432,1434],{"class":264,"line":1425},19,[262,1427,866],{"class":283},[262,1429,847],{"class":275},[262,1431,785],{"class":279},[262,1433,788],{"class":275},[262,1435,923],{"class":279},[262,1437,1439],{"class":264,"line":1438},20,[262,1440,881],{"class":279},[262,1442,1444],{"class":264,"line":1443},21,[262,1445,832],{"emptyLinePlaceholder":831},[262,1447,1449],{"class":264,"line":1448},22,[262,1450,1451],{"class":268},"    \u002F\u002F 任务仍在进行，当前调用先返回\n",[262,1453,1455,1457,1459,1461,1463],{"class":264,"line":1454},23,[262,1456,945],{"class":283},[262,1458,847],{"class":275},[262,1460,785],{"class":279},[262,1462,788],{"class":275},[262,1464,954],{"class":279},[262,1466,1468],{"class":264,"line":1467},24,[262,1469,501],{"class":279},[20,1471,1472,1473,1475,1476,163,1479,163,1482,1485],{},"这是执行语义的伪代码，省略了请求发送失败、取消以及框架状态重置等实现细节。实际使用 ",[52,1474,1254],{}," 时，会通过 ",[52,1477,1478],{},"onStart()",[52,1480,1481],{},"onRunning()",[52,1483,1484],{},"onHalted()"," 分别组织启动、运行检查和中止处理。",[20,1487,1488],{},"假设父节点这次选择了导航动作，执行过程是：",[57,1490,1493],{"className":1491,"code":1492,"language":62,"meta":63},[60],"外部 tick 根节点\n    ↓\n父节点按规则 tick NavigateToGoal\n    ↓\n启动或检查导航\n    ↓\nRUNNING \u002F SUCCESS \u002F FAILURE\n    ↑\n父节点处理结果，返回自己的状态\n    ↑\n外部程序取得根节点的结果\n",[52,1494,1492],{"__ignoreMap":63},[20,1496,1497,1498,1500,1501,1503],{},"导航返回 ",[52,1499,444],{}," 后，需要外部再次驱动树，并且父节点再次选择这个动作，执行才会继续到达它。",[52,1502,444],{}," 本身不会安排下一次 tick，也不会自动创建后台线程；实际工作如何继续，由节点实现和外部系统决定。",[20,1505,1506,1507,1509],{},"如果上层切换任务并中止导航，动作还需要取消尚未完成的请求、清理内部状态。\n这个过程不能只靠返回 ",[52,1508,392],{}," 代替，后面实现持续任务时再展开。",[20,1511,1512,1513,163,1515,163,1517,163,1519,1521],{},"回看整棵树：控制节点组织执行，装饰节点调整执行规则，条件节点判断，动作节点操作。",[52,1514,99],{},[52,1516,115],{},[52,1518,136],{},[52,1520,154],{}," 则描述它们的位置关系，不是额外四种节点类型；一棵只有一个动作节点的树，也可以直接以这个动作为根节点。",[20,1523,1524,1525,163,1527,1529],{},"下一篇集中学习 ",[52,1526,672],{},[52,1528,675],{}," 和常用装饰节点，用具体规则把这些节点组合起来。",[1531,1532,1533],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":63,"searchDepth":272,"depth":272,"links":1535},[1536,1537,1538,1542,1546,1552],{"id":14,"depth":272,"text":15},{"id":47,"depth":272,"text":47},{"id":193,"depth":272,"text":194,"children":1539},[1540,1541],{"id":198,"depth":486,"text":199},{"id":232,"depth":486,"text":233},{"id":312,"depth":272,"text":312,"children":1543},[1544,1545],{"id":420,"depth":486,"text":421},{"id":507,"depth":486,"text":508},{"id":543,"depth":272,"text":543,"children":1547},[1548,1549,1550,1551],{"id":648,"depth":486,"text":649},{"id":687,"depth":486,"text":688},{"id":987,"depth":486,"text":988},{"id":1126,"depth":486,"text":1127},{"id":1268,"depth":272,"text":1269},"1200-0400-0200-0100","2023-12-30","2023-12-30-ros2-tutorial","\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md",false,{},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian",{"title":5,"description":63},"wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","qFulRjYrjTulVeYNy-ZBeoECAXM-DNmcgygQU1LbEwY",[1566,1573,1579,1585,1591,1597,1603,1609,1615,1621,1627,1633,1639,1645,1651,1657,1663,1669,1675,1681,1683,1689,1695,1701,1707,1713,1719,1725,1731,1737,1743,1749,1755,1761,1767,1772,1778,1783,1789,1795,1801,1807,1813,1819,1825,1831,1837,1843,1849,1855,1861,1867,1873,1879,1885,1891,1897,1903,1909,1915,1921,1927,1933,1939,1945,1951,1957,1963,1969],{"path":1567,"stem":1568,"title":1569,"authors":1570,"date":1554,"chapterOrder":1571,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":1574,"stem":1575,"title":1576,"authors":1577,"date":1554,"chapterOrder":1578,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":1580,"stem":1581,"title":1582,"authors":1583,"date":1554,"chapterOrder":1584,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","wiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","工作空间与功能包",[7],"0300",{"path":1586,"stem":1587,"title":1588,"authors":1589,"date":1554,"chapterOrder":1590,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":1592,"stem":1593,"title":1594,"authors":1595,"date":1554,"chapterOrder":1596,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2其他通信机制",[7],"0500",{"path":1598,"stem":1599,"title":1600,"authors":1601,"date":1554,"chapterOrder":1602,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":1604,"stem":1605,"title":1606,"authors":1607,"date":1554,"chapterOrder":1608,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":1610,"stem":1611,"title":1612,"authors":1613,"date":1554,"chapterOrder":1614,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":1616,"stem":1617,"title":1618,"authors":1619,"date":1554,"chapterOrder":1620,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言",[7],"0900",{"path":1622,"stem":1623,"title":1624,"authors":1625,"date":1554,"chapterOrder":1626,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","Stage_Ros2仿真平台",[7],"1000",{"path":1628,"stem":1629,"title":1630,"authors":1631,"date":1554,"chapterOrder":1632,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":1634,"stem":1635,"title":1636,"authors":1637,"date":1554,"chapterOrder":1638,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）",[7],"1100-0200",{"path":1640,"stem":1641,"title":1642,"authors":1643,"date":1554,"chapterOrder":1644,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）",[7],"1100-0300",{"path":1646,"stem":1647,"title":1648,"authors":1649,"date":1554,"chapterOrder":1650,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","将Ign Gazebo迁移至Gz Sim",[7],"1100-0400",{"path":1652,"stem":1653,"title":1654,"authors":1655,"date":1554,"chapterOrder":1656,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":1658,"stem":1659,"title":1660,"authors":1661,"date":1554,"chapterOrder":1662,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble导航仿真",[7],"1200-0100",{"path":1664,"stem":1665,"title":1666,"authors":1667,"date":1554,"chapterOrder":1668,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy导航仿真",[7],"1200-0200",{"path":1670,"stem":1671,"title":1672,"authors":1673,"date":1554,"chapterOrder":1674,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":1676,"stem":1677,"title":1678,"authors":1679,"date":1554,"chapterOrder":1680,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","有限状态机（Finite State Machine）",[7],"1200-0400-0100",{"path":1561,"stem":1563,"title":5,"authors":1682,"date":1554,"chapterOrder":1553,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},[7],{"path":1684,"stem":1685,"title":1686,"authors":1687,"date":1554,"chapterOrder":1688,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","控制与装饰规则",[7],"1200-0400-0200-0200",{"path":1690,"stem":1691,"title":1692,"authors":1693,"date":1554,"chapterOrder":1694,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-di-yi-ge-wan-zheng-cheng-xu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-第一个完整程序","第一个完整程序",[7],"1200-0400-0200-0300",{"path":1696,"stem":1697,"title":1698,"authors":1699,"date":1554,"chapterOrder":1700,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-jie-dian-zhi-jian-chuan-shu-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-节点之间传数据","节点之间传数据",[7],"1200-0400-0200-0400",{"path":1702,"stem":1703,"title":1704,"authors":1705,"date":1554,"chapterOrder":1706,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-chi-xu-ren-wu-yu-zhong-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-持续任务与中止","持续任务与中止",[7],"1200-0400-0200-0500",{"path":1708,"stem":1709,"title":1710,"authors":1711,"date":1554,"chapterOrder":1712,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-zu-he-shi-ji-ren-wu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-组合实际任务","组合实际任务",[7],"1200-0400-0200-0600",{"path":1714,"stem":1715,"title":1716,"authors":1717,"date":1554,"chapterOrder":1718,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-xing-wei-shu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-行为树BT","行为树（BehaviorTree.CPP）",[7],"1200-0400-0200",{"path":1720,"stem":1721,"title":1722,"authors":1723,"date":1554,"chapterOrder":1724,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-fsm-yu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-FSM与BT","有限状态机FSM与行为树BT",[7],"1200-0400",{"path":1726,"stem":1727,"title":1728,"authors":1729,"date":1554,"chapterOrder":1730,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)",[7],"1200",{"path":1732,"stem":1733,"title":1734,"authors":1735,"date":1554,"chapterOrder":1736,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库",[7],"1300-0100-0100",{"path":1738,"stem":1739,"title":1740,"authors":1741,"date":1554,"chapterOrder":1742,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","ROS2 Serial Driver库",[7],"1300-0100-0200",{"path":1744,"stem":1745,"title":1746,"authors":1747,"date":1554,"chapterOrder":1748,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART串口通信",[7],"1300-0100",{"path":1750,"stem":1751,"title":1752,"authors":1753,"date":1554,"chapterOrder":1754,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN",[7],"1300-0200-0100",{"path":1756,"stem":1757,"title":1758,"authors":1759,"date":1554,"chapterOrder":1760,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN",[7],"1300-0200-0200",{"path":1762,"stem":1763,"title":1764,"authors":1765,"date":1554,"chapterOrder":1766,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN通信",[7],"1300-0200",{"path":1768,"stem":1769,"title":1734,"authors":1770,"date":1554,"chapterOrder":1771,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso",[7],"1300-0300-0100",{"path":1773,"stem":1774,"title":1775,"authors":1776,"date":1554,"chapterOrder":1777,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP通信",[7],"1300-0300",{"path":1779,"stem":1780,"title":1734,"authors":1781,"date":1554,"chapterOrder":1782,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso",[7],"1300-0400-0100",{"path":1784,"stem":1785,"title":1786,"authors":1787,"date":1554,"chapterOrder":1788,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP通信",[7],"1300-0400",{"path":1790,"stem":1791,"title":1792,"authors":1793,"date":1554,"chapterOrder":1794,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":1796,"stem":1797,"title":1798,"authors":1799,"date":1554,"chapterOrder":1800,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","机器人组成",[7],"1400-0100",{"path":1802,"stem":1803,"title":1804,"authors":1805,"date":1554,"chapterOrder":1806,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","远程开发SSH",[7],"1400-0200-0100",{"path":1808,"stem":1809,"title":1810,"authors":1811,"date":1554,"chapterOrder":1812,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","远程访问桌面",[7],"1400-0200-0200",{"path":1814,"stem":1815,"title":1816,"authors":1817,"date":1554,"chapterOrder":1818,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","工控机之远程开发环境",[7],"1400-0200",{"path":1820,"stem":1821,"title":1822,"authors":1823,"date":1554,"chapterOrder":1824,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","工控机之外接USB设备",[7],"1400-0300",{"path":1826,"stem":1827,"title":1828,"authors":1829,"date":1554,"chapterOrder":1830,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","分布式搭建",[7],"1400-0400",{"path":1832,"stem":1833,"title":1834,"authors":1835,"date":1554,"chapterOrder":1836,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":1838,"stem":1839,"title":1840,"authors":1841,"date":1554,"chapterOrder":1842,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","里程计Odom",[7],"1400-0600-0100",{"path":1844,"stem":1845,"title":1846,"authors":1847,"date":1554,"chapterOrder":1848,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","惯性计IMU",[7],"1400-0600-0200",{"path":1850,"stem":1851,"title":1852,"authors":1853,"date":1554,"chapterOrder":1854,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","激光雷达LiDAR",[7],"1400-0600-0300",{"path":1856,"stem":1857,"title":1858,"authors":1859,"date":1554,"chapterOrder":1860,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","相机Camera",[7],"1400-0600-0400",{"path":1862,"stem":1863,"title":1864,"authors":1865,"date":1554,"chapterOrder":1866,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","全球定位GNSS",[7],"1400-0600-0500",{"path":1868,"stem":1869,"title":1870,"authors":1871,"date":1554,"chapterOrder":1872,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","手柄JOY",[7],"1400-0600-0600",{"path":1874,"stem":1875,"title":1876,"authors":1877,"date":1554,"chapterOrder":1878,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","键盘控制节点",[7],"1400-0600-0700",{"path":1880,"stem":1881,"title":1882,"authors":1883,"date":1554,"chapterOrder":1884,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":1886,"stem":1887,"title":1888,"authors":1889,"date":1554,"chapterOrder":1890,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","坐标系与话题关系",[7],"1400-0700",{"path":1892,"stem":1893,"title":1894,"authors":1895,"date":1554,"chapterOrder":1896,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","轮式里程计标定",[7],"1400-0800-0100-0100",{"path":1898,"stem":1899,"title":1900,"authors":1901,"date":1554,"chapterOrder":1902,"chapterDepth":486,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","轮式里程计与IMU融合",[7],"1400-0800-0100-0200",{"path":1904,"stem":1905,"title":1906,"authors":1907,"date":1554,"chapterOrder":1908,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","轮式里程计标定与融合",[7],"1400-0800-0100",{"path":1910,"stem":1911,"title":1912,"authors":1913,"date":1554,"chapterOrder":1914,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","激光雷达工具",[7],"1400-0800-0200",{"path":1916,"stem":1917,"title":1918,"authors":1919,"date":1554,"chapterOrder":1920,"chapterDepth":272,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","相机使用进阶",[7],"1400-0800-0300",{"path":1922,"stem":1923,"title":1924,"authors":1925,"date":1554,"chapterOrder":1926,"chapterDepth":265,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","硬件平台进阶",[7],"1400-0800",{"path":1928,"stem":1929,"title":1930,"authors":1931,"date":1554,"chapterOrder":1932,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":1934,"stem":1935,"title":1936,"authors":1937,"date":1554,"chapterOrder":1938,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":1940,"stem":1941,"title":1942,"authors":1943,"date":1554,"chapterOrder":1944,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂",[7],"1600",{"path":1946,"stem":1947,"title":1948,"authors":1949,"date":1554,"chapterOrder":1950,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)",[7],"1700",{"path":1952,"stem":1953,"title":1954,"authors":1955,"date":1554,"chapterOrder":1956,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":1958,"stem":1959,"title":1960,"authors":1961,"date":1554,"chapterOrder":1962,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":1964,"stem":1965,"title":1966,"authors":1967,"date":1554,"chapterOrder":1968,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":1559},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":1556,"stem":1970,"title":1971,"authors":1972,"date":1554,"chapterOrder":1973,"chapterDepth":1572,"docKey":1555,"docRoot":1556,"docTitle":1557,"isWikiDoc":831,"isWikiIndex":831},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[1975,1977,1980,1983],{"name":7,"image":1976},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":1978,"image":1979},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":1981,"image":1982},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":1984,"image":1985},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431903159]