[{"data":1,"prerenderedAt":2171},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze":3,"wiki-doc-items-2023-12-30-ros2-tutorial":1750,"wiki:author-members":2159},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":366,"chapterOrder":1738,"date":1739,"description":137,"docKey":1740,"docRoot":1741,"docTitle":1742,"extension":1743,"isWikiDoc":418,"isWikiIndex":1744,"meta":1745,"navigation":418,"path":1746,"seo":1747,"stem":1748,"wikiDepth":335,"__hash__":1749},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则.md","控制与装饰规则",[7],"董佳辉",{"type":9,"value":10,"toc":1716},"minimark",[11,14,47,61,109,118,121,125,130,140,197,216,221,224,289,295,304,310,313,324,618,625,640,643,646,652,665,671,673,677,686,692,747,753,756,813,822,830,833,836,842,853,856,858,861,948,951,961,963,967,970,974,977,1051,1056,1062,1071,1079,1086,1090,1100,1145,1151,1198,1201,1207,1214,1227,1231,1237,1274,1280,1326,1337,1349,1353,1363,1400,1403,1457,1466,1476,1478,1482,1485,1491,1494,1587,1590,1641,1644,1650,1659,1665,1668,1674,1681,1684,1690,1697,1700,1702,1705,1712],[12,13,5],"h2",{"id":5},[15,16,17],"blockquote",{},[18,19,20,21,28,29,34,35,40,41,46],"p",{},"对应 BehaviorTree.CPP 3.8 官方文档：",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Flearn-the-basics\u002FBT_basics\u002F",[26],"nofollow","Learn the Basic Concepts → Introduction to BTs → Examples","，并参考 Nodes Library 中的 ",[22,30,33],{"href":31,"rel":32},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Fnodes-library\u002FSequenceNode\u002F",[26],"Sequences","、",[22,36,39],{"href":37,"rel":38},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Fnodes-library\u002FFallbackNode\u002F",[26],"Fallbacks"," 与 ",[22,42,45],{"href":43,"rel":44},"https:\u002F\u002Fwww.behaviortree.dev\u002Fdocs\u002F3.8\u002Fnodes-library\u002FDecoratorNode\u002F",[26],"Decorators","。",[18,48,49,50,34,54,34,57,60],{},"上一篇已经知道：tick 从父节点向下传播，状态由子节点向上返回。现在进一步学习，父节点拿到 ",[51,52,53],"code",{},"SUCCESS",[51,55,56],{},"FAILURE",[51,58,59],{},"RUNNING"," 后，具体怎样决定下一步。",[62,63,64,77],"table",{},[65,66,67],"thead",{},[68,69,70,74],"tr",{},[71,72,73],"th",{},"需要表达的任务关系",[71,75,76],{},"常用节点",[78,79,80,91,101],"tbody",{},[68,81,82,86],{},[83,84,85],"td",{},"前一步成功后，继续下一步",[83,87,88],{},[51,89,90],{},"Sequence",[68,92,93,96],{},[83,94,95],{},"当前方案失败后，尝试备用方案",[83,97,98],{},[51,99,100],{},"Fallback",[68,102,103,106],{},[83,104,105],{},"修改一个节点的结果、次数或时限",[83,107,108],{},"装饰节点",[18,110,111,112,114,115,117],{},"本篇先讲普通 ",[51,113,90],{},"、普通 ",[51,116,100],{}," 和常用装饰节点，使用移动机器人示例。\nC++ 是解释逻辑的伪代码；\nXML 只展示树的片段，完整工程、节点注册和 XML 文件结构后面统一学习。",[119,120],"hr",{},[12,122,124],{"id":123},"sequence依次完成一组步骤","Sequence：依次完成一组步骤",[18,126,127,129],{},[51,128,90],{}," 按子节点的排列顺序执行，只有前面的步骤成功，才继续后面的步骤：",[131,132,138],"pre",{"className":133,"code":135,"language":136,"meta":137},[134],"language-text","Sequence\n├── CheckBattery          检查电量是否足够\n├── NavigateToGoal        导航到目标\n└── ReportArrival         报告到达\n","text","",[51,139,135],{"__ignoreMap":137},[62,141,142,155],{},[65,143,144],{},[68,145,146,149,152],{},[71,147,148],{},"当前子节点返回",[71,150,151],{},"Sequence 接下来做什么",[71,153,154],{},"Sequence 的结果",[78,156,157,171,184],{},[68,158,159,163,166],{},[83,160,161],{},[51,162,53],{},[83,164,165],{},"继续 tick 下一个子节点",[83,167,168,169],{},"所有子节点成功后，返回 ",[51,170,53],{},[68,172,173,177,180],{},[83,174,175],{},[51,176,56],{},[83,178,179],{},"停止本次序列，不再 tick 后面的节点",[83,181,182],{},[51,183,56],{},[68,185,186,190,193],{},[83,187,188],{},[51,189,59],{},[83,191,192],{},"停在当前子节点，等待后续继续执行",[83,194,195],{},[51,196,59],{},[18,198,199,200,203,204,206,207,203,210,212,213,46],{},"例如 ",[51,201,202],{},"CheckBattery"," 返回 ",[51,205,56],{},"，本轮不会发送导航请求，也不会报告到达；",[51,208,209],{},"NavigateToGoal",[51,211,56],{},"，则跳过 ",[51,214,215],{},"ReportArrival",[217,218,220],"h3",{"id":219},"一次-tick-可以继续执行多个步骤","一次 tick 可以继续执行多个步骤",[18,222,223],{},"假设电量足够，导航要经过几次检查才完成：",[62,225,226,239],{},[65,227,228],{},[68,229,230,233,236],{},[71,231,232],{},"外部第几次 tick",[71,234,235],{},"本次实际执行的子节点",[71,237,238],{},"Sequence 返回",[78,240,241,259,272],{},[68,242,243,246,255],{},[83,244,245],{},"第 1 次",[83,247,248,251,252],{},[51,249,250],{},"CheckBattery → SUCCESS","，接着 ",[51,253,254],{},"NavigateToGoal → RUNNING",[83,256,257],{},[51,258,59],{},[68,260,261,264,268],{},[83,262,263],{},"第 2 次",[83,265,266],{},[51,267,254],{},[83,269,270],{},[51,271,59],{},[68,273,274,277,285],{},[83,275,276],{},"第 3 次",[83,278,279,251,282],{},[51,280,281],{},"NavigateToGoal → SUCCESS",[51,283,284],{},"ReportArrival → SUCCESS",[83,286,287],{},[51,288,53],{},[18,290,291,292,294],{},"前一步在当前调用中成功后，",[51,293,90],{}," 可以立刻继续 tick 下一步，不必等到下一轮。",[18,296,297,301,302,46],{},[298,299,300],"strong",{},"普通 Sequence 在子节点 RUNNING 时，会记住当前位置。"," 因此第 2 次 tick 会继续导航，不会重新检查前面已经成功的 ",[51,303,202],{},[18,305,306,307,309],{},"如果导航期间电量变低，这棵普通 ",[51,308,90],{}," 不会因此自动重新检查电量并中止导航。需要持续检查条件时，要使用合适的响应式结构，后面结合任务中止来学习。",[217,311,312],{"id":312},"用子节点下标理解执行位置",[18,314,315,316,319,320,323],{},"下面的 ",[51,317,318],{},"current_index"," 是节点保存的成员状态，初始为 ",[51,321,322],{},"0","：",[131,325,329],{"className":326,"code":327,"language":328,"meta":137,"style":137},"language-cpp shiki shiki-themes github-light github-dark","BT::NodeStatus Sequence::tick()\n{\n    while (current_index \u003C children.size())\n    {\n        BT::NodeStatus status = children[current_index].executeTick();\n\n        if (status == BT::NodeStatus::RUNNING)\n        {\n            \u002F\u002F 保留位置，下次继续 tick 同一个子节点\n            return BT::NodeStatus::RUNNING;\n        }\n\n        if (status == BT::NodeStatus::FAILURE)\n        {\n            ResetChildren();\n            current_index = 0;\n            return BT::NodeStatus::FAILURE;\n        }\n\n        \u002F\u002F 此处假设子节点只返回三个合法执行结果，剩下的是 SUCCESS\n        ++current_index;\n    }\n\n    ResetChildren();\n    current_index = 0;\n    return BT::NodeStatus::SUCCESS;\n}\n","cpp",[51,330,331,358,364,386,392,413,420,442,448,455,470,476,481,499,504,512,527,541,546,551,557,566,572,577,585,597,612],{"__ignoreMap":137},[332,333,336,340,344,347,350,352,355],"span",{"class":334,"line":335},"line",1,[332,337,339],{"class":338},"sScJk","BT",[332,341,343],{"class":342},"sVt8B","::",[332,345,346],{"class":338},"NodeStatus",[332,348,349],{"class":338}," Sequence",[332,351,343],{"class":342},[332,353,354],{"class":338},"tick",[332,356,357],{"class":342},"()\n",[332,359,361],{"class":334,"line":360},2,[332,362,363],{"class":342},"{\n",[332,365,367,371,374,377,380,383],{"class":334,"line":366},3,[332,368,370],{"class":369},"szBVR","    while",[332,372,373],{"class":342}," (current_index ",[332,375,376],{"class":369},"\u003C",[332,378,379],{"class":342}," children.",[332,381,382],{"class":338},"size",[332,384,385],{"class":342},"())\n",[332,387,389],{"class":334,"line":388},4,[332,390,391],{"class":342},"    {\n",[332,393,395,398,401,404,407,410],{"class":334,"line":394},5,[332,396,397],{"class":338},"        BT",[332,399,400],{"class":342},"::NodeStatus status ",[332,402,403],{"class":369},"=",[332,405,406],{"class":342}," children[current_index].",[332,408,409],{"class":338},"executeTick",[332,411,412],{"class":342},"();\n",[332,414,416],{"class":334,"line":415},6,[332,417,419],{"emptyLinePlaceholder":418},true,"\n",[332,421,423,426,429,432,435,437,439],{"class":334,"line":422},7,[332,424,425],{"class":369},"        if",[332,427,428],{"class":342}," (status ",[332,430,431],{"class":369},"==",[332,433,434],{"class":338}," BT",[332,436,343],{"class":342},[332,438,346],{"class":338},[332,440,441],{"class":342},"::RUNNING)\n",[332,443,445],{"class":334,"line":444},8,[332,446,447],{"class":342},"        {\n",[332,449,451],{"class":334,"line":450},9,[332,452,454],{"class":453},"sJ8bj","            \u002F\u002F 保留位置，下次继续 tick 同一个子节点\n",[332,456,458,461,463,465,467],{"class":334,"line":457},10,[332,459,460],{"class":369},"            return",[332,462,434],{"class":338},[332,464,343],{"class":342},[332,466,346],{"class":338},[332,468,469],{"class":342},"::RUNNING;\n",[332,471,473],{"class":334,"line":472},11,[332,474,475],{"class":342},"        }\n",[332,477,479],{"class":334,"line":478},12,[332,480,419],{"emptyLinePlaceholder":418},[332,482,484,486,488,490,492,494,496],{"class":334,"line":483},13,[332,485,425],{"class":369},[332,487,428],{"class":342},[332,489,431],{"class":369},[332,491,434],{"class":338},[332,493,343],{"class":342},[332,495,346],{"class":338},[332,497,498],{"class":342},"::FAILURE)\n",[332,500,502],{"class":334,"line":501},14,[332,503,447],{"class":342},[332,505,507,510],{"class":334,"line":506},15,[332,508,509],{"class":338},"            ResetChildren",[332,511,412],{"class":342},[332,513,515,518,520,524],{"class":334,"line":514},16,[332,516,517],{"class":342},"            current_index ",[332,519,403],{"class":369},[332,521,523],{"class":522},"sj4cs"," 0",[332,525,526],{"class":342},";\n",[332,528,530,532,534,536,538],{"class":334,"line":529},17,[332,531,460],{"class":369},[332,533,434],{"class":338},[332,535,343],{"class":342},[332,537,346],{"class":338},[332,539,540],{"class":342},"::FAILURE;\n",[332,542,544],{"class":334,"line":543},18,[332,545,475],{"class":342},[332,547,549],{"class":334,"line":548},19,[332,550,419],{"emptyLinePlaceholder":418},[332,552,554],{"class":334,"line":553},20,[332,555,556],{"class":453},"        \u002F\u002F 此处假设子节点只返回三个合法执行结果，剩下的是 SUCCESS\n",[332,558,560,563],{"class":334,"line":559},21,[332,561,562],{"class":369},"        ++",[332,564,565],{"class":342},"current_index;\n",[332,567,569],{"class":334,"line":568},22,[332,570,571],{"class":342},"    }\n",[332,573,575],{"class":334,"line":574},23,[332,576,419],{"emptyLinePlaceholder":418},[332,578,580,583],{"class":334,"line":579},24,[332,581,582],{"class":338},"    ResetChildren",[332,584,412],{"class":342},[332,586,588,591,593,595],{"class":334,"line":587},25,[332,589,590],{"class":342},"    current_index ",[332,592,403],{"class":369},[332,594,523],{"class":522},[332,596,526],{"class":342},[332,598,600,603,605,607,609],{"class":334,"line":599},26,[332,601,602],{"class":369},"    return",[332,604,434],{"class":338},[332,606,343],{"class":342},[332,608,346],{"class":338},[332,610,611],{"class":342},"::SUCCESS;\n",[332,613,615],{"class":334,"line":614},27,[332,616,617],{"class":342},"}\n",[18,619,620,621,624],{},"这段伪代码省略框架状态维护和非法状态检查。\n",[51,622,623],{},"ResetChildren()"," 表示结束本次执行并重置子节点，不能理解为撤销已经产生的业务效果。",[18,626,627,628,633,634,636,637],{},"这一行为可对照官方 ",[22,629,632],{"href":630,"rel":631},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Fsrc\u002Fcontrols\u002Fsequence_node.cpp",[26],"3.8.7 sequence_node.cpp","。\n普通 ",[51,635,90],{}," 成功或失败结束后，位置都会回到开头；如果上层以后重新执行它，会从第一个子节点开始。\n",[298,638,639],{},"返回失败不会在当前 tick 中自动从头重试。",[217,641,642],{"id":642},"后面的节点不保证一定执行",[18,644,645],{},"下面这棵树不能保证导航失败后执行停止节点：",[131,647,650],{"className":648,"code":649,"language":136,"meta":137},[134],"Sequence\n├── NavigateToGoal\n└── StopRobot\n",[51,651,649],{"__ignoreMap":137},[18,653,654,655,657,658,660,661,664],{},"导航返回 ",[51,656,56],{}," 时，",[51,659,90],{}," 立即返回失败，",[51,662,663],{},"StopRobot"," 会被跳过。",[18,666,667,668,670],{},"动作失败或被中止时需要的取消、停止和清理，应在动作及相关模块中正确实现。\n仅把清理动作放在 ",[51,669,90],{}," 最后，不能保证它在所有退出路径上执行。",[119,672],{},[12,674,676],{"id":675},"fallback按顺序尝试方案","Fallback：按顺序尝试方案",[18,678,679,681,682,685],{},[51,680,100],{}," 在其他框架中也常叫 ",[51,683,684],{},"Selector","。\n它按顺序尝试子节点，只要找到成功的方案，就结束本次选择：",[131,687,690],{"className":688,"code":689,"language":136,"meta":137},[134],"Fallback\n├── NavigateToPrimaryGoal     尝试主要目标\n└── NavigateToBackupGoal      主要目标失败后，尝试备用目标\n",[51,691,689],{"__ignoreMap":137},[62,693,694,706],{},[65,695,696],{},[68,697,698,700,703],{},[71,699,148],{},[71,701,702],{},"Fallback 接下来做什么",[71,704,705],{},"Fallback 的结果",[78,707,708,721,734],{},[68,709,710,714,716],{},[83,711,712],{},[51,713,56],{},[83,715,165],{},[83,717,718,719],{},"全部失败后，返回 ",[51,720,56],{},[68,722,723,727,730],{},[83,724,725],{},[51,726,53],{},[83,728,729],{},"不再尝试后面的子节点",[83,731,732],{},[51,733,53],{},[68,735,736,740,743],{},[83,737,738],{},[51,739,59],{},[83,741,742],{},"继续等待当前方案，不启动后面的方案",[83,744,745],{},[51,746,59],{},[18,748,749,752],{},[298,750,751],{},"RUNNING 不算失败。"," 主要目标还在导航时，不会因为“尚未到达”就立即启动备用目标。",[18,754,755],{},"例如：",[62,757,758,769],{},[65,759,760],{},[68,761,762,764,766],{},[71,763,232],{},[71,765,235],{},[71,767,768],{},"Fallback 返回",[78,770,771,784,800],{},[68,772,773,775,780],{},[83,774,245],{},[83,776,777],{},[51,778,779],{},"NavigateToPrimaryGoal → RUNNING",[83,781,782],{},[51,783,59],{},[68,785,786,788,796],{},[83,787,263],{},[83,789,790,251,793],{},[51,791,792],{},"NavigateToPrimaryGoal → FAILURE",[51,794,795],{},"NavigateToBackupGoal → RUNNING",[83,797,798],{},[51,799,59],{},[68,801,802,804,809],{},[83,803,276],{},[83,805,806],{},[51,807,808],{},"NavigateToBackupGoal → SUCCESS",[83,810,811],{},[51,812,53],{},[18,814,815,816,818,819,821],{},"普通 ",[51,817,100],{}," 在 ",[51,820,59],{}," 时同样保留当前位置。\n第 3 次继续备用导航，不会重新尝试前面已经失败的主要目标。",[18,823,824,825,46],{},"本次选择成功或全部失败结束后，它会重置位置；上层以后重新执行时，再从第一个子节点开始。具体可对照官方 ",[22,826,829],{"href":827,"rel":828},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Fsrc\u002Fcontrols\u002Ffallback_node.cpp",[26],"3.8.7 fallback_node.cpp",[217,831,832],{"id":832},"条件节点也能作为优先方案",[18,834,835],{},"例如“如果已经到达，就不用重新导航”：",[131,837,840],{"className":838,"code":839,"language":136,"meta":137},[134],"Fallback\n├── IsGoalReached\n└── NavigateToGoal\n",[51,841,839],{"__ignoreMap":137},[18,843,844,203,847,849,850,852],{},[51,845,846],{},"IsGoalReached",[51,848,53],{},"，这部分树就成功结束；返回 ",[51,851,56],{},"，才启动导航。",[18,854,855],{},"这里的成功表示“到达目标这项需求已经满足”，所以一个条件判断也可以让整段任务成功，不一定非要执行动作。",[119,857],{},[12,859,860],{"id":860},"对照两种控制规则",[62,862,863,876],{},[65,864,865],{},[68,866,867,870,873],{},[71,868,869],{},"对比项",[71,871,872],{},"普通 Sequence",[71,874,875],{},"普通 Fallback",[78,877,878,889,902,915,933],{},[68,879,880,883,886],{},[83,881,882],{},"表达的关系",[83,884,885],{},"一组都需要成功的步骤",[83,887,888],{},"一组可以依次尝试的方案",[68,890,891,894,898],{},[83,892,893],{},"哪种结果让它继续下一个子节点",[83,895,896],{},[51,897,53],{},[83,899,900],{},[51,901,56],{},[68,903,904,907,911],{},[83,905,906],{},"哪种结果让它提前结束",[83,908,909],{},[51,910,56],{},[83,912,913],{},[51,914,53],{},[68,916,917,923,929],{},[83,918,919,920,922],{},"当前子节点 ",[51,921,59],{}," 时",[83,924,925,926,928],{},"返回 ",[51,927,59],{},"，保留当前位置",[83,930,925,931,928],{},[51,932,59],{},[68,934,935,938,943],{},[83,936,937],{},"所有子节点都执行完",[83,939,940,941],{},"全部成功，返回 ",[51,942,53],{},[83,944,945,946],{},"全部失败，返回 ",[51,947,56],{},[18,949,950],{},"树结构中的前后顺序会影响结果。把子节点重新排序，可能改变先检查什么、先执行哪个方案，以及哪些节点会被跳过。",[18,952,953,954,34,957,960],{},"3.8 官方文档还介绍了 ",[51,955,956],{},"ReactiveSequence",[51,958,959],{},"ReactiveFallback"," 和带记忆的序列变体。本篇不展开它们；这里的“保留 RUNNING 位置”只是在说明普通节点的行为，不能套用到所有变体。",[119,962],{},[12,964,966],{"id":965},"装饰节点处理一个子节点的结果或执行方式","装饰节点：处理一个子节点的结果或执行方式",[18,968,969],{},"装饰节点始终只有一个直接子节点，子节点也可以是整棵子树的入口。",[217,971,973],{"id":972},"inverterforcesuccess-与-forcefailure","Inverter、ForceSuccess 与 ForceFailure",[18,975,976],{},"这三种节点主要处理子节点的返回结果：",[62,978,979,995],{},[65,980,981],{},[68,982,983,986,989,992],{},[71,984,985],{},"子节点返回",[71,987,988],{},"Inverter",[71,990,991],{},"ForceSuccess",[71,993,994],{},"ForceFailure",[78,996,997,1015,1033],{},[68,998,999,1003,1007,1011],{},[83,1000,1001],{},[51,1002,53],{},[83,1004,1005],{},[51,1006,56],{},[83,1008,1009],{},[51,1010,53],{},[83,1012,1013],{},[51,1014,56],{},[68,1016,1017,1021,1025,1029],{},[83,1018,1019],{},[51,1020,56],{},[83,1022,1023],{},[51,1024,53],{},[83,1026,1027],{},[51,1028,53],{},[83,1030,1031],{},[51,1032,56],{},[68,1034,1035,1039,1043,1047],{},[83,1036,1037],{},[51,1038,59],{},[83,1040,1041],{},[51,1042,59],{},[83,1044,1045],{},[51,1046,59],{},[83,1048,1049],{},[51,1050,59],{},[18,1052,1053,1055],{},[51,1054,988],{}," 已在上一篇用路径检查解释过。这里补充两种强制结果的用途：",[131,1057,1060],{"className":1058,"code":1059,"language":136,"meta":137},[134],"Sequence\n├── NavigateToGoal\n└── ForceSuccess\n    └── UploadArrivalLog\n",[51,1061,1059],{"__ignoreMap":137},[18,1063,1064,1065,1067,1068,1070],{},"如果“导航到达”是主要任务，而“上传到达日志”允许失败，可以只给日志动作加 ",[51,1066,991],{},"。日志最终失败时，这个装饰节点仍返回成功；日志还在上传时，仍返回 ",[51,1069,59],{},"，不会立刻跳过它。",[18,1072,1073,1075,1076,1078],{},[51,1074,994],{}," 则让已结束的子节点统一报告失败。例如，在 ",[51,1077,100],{}," 中，执行完一段诊断记录后仍希望继续下一个方案，可以用它包装这段记录。",[18,1080,1081,1082,1085],{},"强制改变的是",[298,1083,1084],{},"向父节点报告的状态","，不会让失败的操作实际成功，也不会撤销已经完成的动作。使用前要确定，这个结果是否符合父节点所代表的任务含义。",[217,1087,1089],{"id":1088},"retryuntilsuccessful失败后重新尝试","RetryUntilSuccessful：失败后重新尝试",[18,1091,1092,1093,1096,1097,323],{},"3.8 文档中的 ",[51,1094,1095],{},"RetryNode","，在 XML 中使用的注册名称是 ",[51,1098,1099],{},"RetryUntilSuccessful",[131,1101,1105],{"className":1102,"code":1103,"language":1104,"meta":137,"style":137},"language-xml shiki shiki-themes github-light github-dark","\u003CRetryUntilSuccessful num_attempts=\"3\">\n    \u003CNavigateToGoal\u002F>\n\u003C\u002FRetryUntilSuccessful>\n","xml",[51,1106,1107,1126,1136],{"__ignoreMap":137},[332,1108,1109,1111,1114,1117,1119,1123],{"class":334,"line":335},[332,1110,376],{"class":342},[332,1112,1099],{"class":1113},"s9eBZ",[332,1115,1116],{"class":338}," num_attempts",[332,1118,403],{"class":342},[332,1120,1122],{"class":1121},"sZZnC","\"3\"",[332,1124,1125],{"class":342},">\n",[332,1127,1128,1131,1133],{"class":334,"line":360},[332,1129,1130],{"class":342},"    \u003C",[332,1132,209],{"class":1113},[332,1134,1135],{"class":342},"\u002F>\n",[332,1137,1138,1141,1143],{"class":334,"line":366},[332,1139,1140],{"class":342},"\u003C\u002F",[332,1142,1099],{"class":1113},[332,1144,1125],{"class":342},[18,1146,1147,1148,323],{},"这里表示",[298,1149,1150],{},"总共最多尝试 3 次，包含第一次",[62,1152,1153,1162],{},[65,1154,1155],{},[68,1156,1157,1159],{},[71,1158,985],{},[71,1160,1161],{},"RetryUntilSuccessful 的处理",[78,1163,1164,1176,1187],{},[68,1165,1166,1170],{},[83,1167,1168],{},[51,1169,53],{},[83,1171,1172,1173,1175],{},"立即返回 ",[51,1174,53],{},"，不再重试",[68,1177,1178,1182],{},[83,1179,1180],{},[51,1181,56],{},[83,1183,1184,1185],{},"记一次失败；还有次数就重置子节点再试，用完则返回 ",[51,1186,56],{},[68,1188,1189,1193],{},[83,1190,1191],{},[51,1192,59],{},[83,1194,925,1195,1197],{},[51,1196,59],{},"，当前尝试继续，不消耗一次失败次数",[18,1199,1200],{},"例如导航结果依次为：",[131,1202,1205],{"className":1203,"code":1204,"language":136,"meta":137},[134],"第 1 次尝试：RUNNING → FAILURE\n第 2 次尝试：RUNNING → RUNNING → SUCCESS\n整体结果：SUCCESS，第 3 次尝试不会发生\n",[51,1206,1204],{"__ignoreMap":137},[18,1208,1209,1210,1213],{},"每次完整尝试可以跨越多个 tick。\n",[51,1211,1212],{},"num_attempts=\"3\""," 限制的是尝试次数，不是整个装饰节点只能被 tick 三次。",[18,1215,1216,1217,1222,1223,1226],{},"根据官方 ",[22,1218,1221],{"href":1219,"rel":1220},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Fsrc\u002Fdecorators\u002Fretry_node.cpp",[26],"3.8.7 retry_node.cpp","，\n如果子节点立即失败，下一次尝试可能在",[298,1224,1225],{},"同一次父节点 tick"," 中继续执行。\n这个节点没有自动增加重试间隔；对子节点反复检查，不等于等待环境或传感器数据变化。",[217,1228,1230],{"id":1229},"repeat成功后继续重复","Repeat：成功后继续重复",[18,1232,1233,1236],{},[51,1234,1235],{},"Repeat"," 用于重复完成一个操作：",[131,1238,1240],{"className":1102,"code":1239,"language":1104,"meta":137,"style":137},"\u003CRepeat num_cycles=\"3\">\n    \u003CCaptureObservation\u002F>\n\u003C\u002FRepeat>\n",[51,1241,1242,1257,1266],{"__ignoreMap":137},[332,1243,1244,1246,1248,1251,1253,1255],{"class":334,"line":335},[332,1245,376],{"class":342},[332,1247,1235],{"class":1113},[332,1249,1250],{"class":338}," num_cycles",[332,1252,403],{"class":342},[332,1254,1122],{"class":1121},[332,1256,1125],{"class":342},[332,1258,1259,1261,1264],{"class":334,"line":360},[332,1260,1130],{"class":342},[332,1262,1263],{"class":1113},"CaptureObservation",[332,1265,1135],{"class":342},[332,1267,1268,1270,1272],{"class":334,"line":366},[332,1269,1140],{"class":342},[332,1271,1235],{"class":1113},[332,1273,1125],{"class":342},[18,1275,1276,1277,1279],{},"这里假设 ",[51,1278,1263],{}," 每次执行会采集并保存一份观测数据。任务是成功完成 3 次采集：",[62,1281,1282,1291],{},[65,1283,1284],{},[68,1285,1286,1288],{},[71,1287,985],{},[71,1289,1290],{},"Repeat 的处理",[78,1292,1293,1304,1315],{},[68,1294,1295,1299],{},[83,1296,1297],{},[51,1298,53],{},[83,1300,1301,1302],{},"记一次成功；未到次数则重置子节点继续，达到次数后返回 ",[51,1303,53],{},[68,1305,1306,1310],{},[83,1307,1308],{},[51,1309,56],{},[83,1311,1312,1313],{},"立即停止重复，返回 ",[51,1314,56],{},[68,1316,1317,1321],{},[83,1318,1319],{},[51,1320,59],{},[83,1322,925,1323,1325],{},[51,1324,59],{},"，继续当前这次操作，不增加已完成次数",[18,1327,1328,1329,1332,1333,1336],{},"它与 Retry 的区别是：",[298,1330,1331],{},"Retry 失败后继续，Repeat 成功后继续。"," ",[51,1334,1335],{},"num_cycles=\"3\""," 同样包含第一次执行，不是先做一次再额外做三次。",[18,1338,1339,1340,1345,1346,1348],{},"官方 ",[22,1341,1344],{"href":1342,"rel":1343},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Fsrc\u002Fdecorators\u002Frepeat_node.cpp",[26],"3.8.7 repeat_node.cpp"," 也使用循环处理立即结束的子节点。\n因此，3 次快速采集可能在一次 tick 内完成；\n",[51,1347,1235],{}," 不会自动让它们分布在三个外部更新周期，也不会自动插入时间间隔。",[217,1350,1352],{"id":1351},"timeout给本次执行设置时限","Timeout：给本次执行设置时限",[18,1354,1355,1358,1359,1362],{},[51,1356,1357],{},"Timeout"," 使用 ",[51,1360,1361],{},"msec"," 指定毫秒数，例如：",[131,1364,1366],{"className":1102,"code":1365,"language":1104,"meta":137,"style":137},"\u003CTimeout msec=\"5000\">\n    \u003CNavigateToGoal\u002F>\n\u003C\u002FTimeout>\n",[51,1367,1368,1384,1392],{"__ignoreMap":137},[332,1369,1370,1372,1374,1377,1379,1382],{"class":334,"line":335},[332,1371,376],{"class":342},[332,1373,1357],{"class":1113},[332,1375,1376],{"class":338}," msec",[332,1378,403],{"class":342},[332,1380,1381],{"class":1121},"\"5000\"",[332,1383,1125],{"class":342},[332,1385,1386,1388,1390],{"class":334,"line":360},[332,1387,1130],{"class":342},[332,1389,209],{"class":1113},[332,1391,1135],{"class":342},[332,1393,1394,1396,1398],{"class":334,"line":366},[332,1395,1140],{"class":342},[332,1397,1357],{"class":1113},[332,1399,1125],{"class":342},[18,1401,1402],{},"这给本次导航设置 5 秒时限：",[62,1404,1405,1415],{},[65,1406,1407],{},[68,1408,1409,1412],{},[71,1410,1411],{},"子节点情况",[71,1413,1414],{},"Timeout 的处理",[78,1416,1417,1428,1438,1447],{},[68,1418,1419,1424],{},[83,1420,1421,1422],{},"未超时就返回 ",[51,1423,53],{},[83,1425,925,1426],{},[51,1427,53],{},[68,1429,1430,1434],{},[83,1431,1421,1432],{},[51,1433,56],{},[83,1435,925,1436],{},[51,1437,56],{},[68,1439,1440,1443],{},[83,1441,1442],{},"还在运行且未超时",[83,1444,925,1445],{},[51,1446,59],{},[68,1448,1449,1452],{},[83,1450,1451],{},"时限到达且子节点仍在运行",[83,1453,1454,1455],{},"中止子节点，随后返回 ",[51,1456,56],{},[18,1458,1459,1460,1465],{},"在 ",[22,1461,1464],{"href":1462,"rel":1463},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP\u002Fblob\u002F3.8.7\u002Finclude\u002Fbehaviortree_cpp_v3\u002Fdecorators\u002Ftimeout_node.h",[26],"3.8.7 timeout_node.h"," 中，计时从装饰节点本次执行开始，后续 tick 不会反复把这 5 秒重新计时。\n到期处理会调用子节点的中止逻辑；超时失败结果在后续执行入口中返回给父节点。",[18,1467,1468,1469,1471,1472,1475],{},"导航动作需要在中止处理中取消实际导航请求。\n",[51,1470,1357],{}," 不能替代动作的取消实现，也不能把一个长时间堵在 ",[51,1473,1474],{},"tick()"," 里的同步函数自动变成可及时中止的异步任务。",[119,1477],{},[12,1479,1481],{"id":1480},"组合示例检查电量再有限次尝试导航","组合示例：检查电量，再有限次尝试导航",[18,1483,1484],{},"把规则组合成一棵任务树：",[131,1486,1489],{"className":1487,"code":1488,"language":136,"meta":137},[134],"Sequence\n├── CheckBattery\n├── RetryUntilSuccessful [num_attempts=3]\n│   └── Timeout [msec=5000]\n│       └── NavigateToGoal\n└── ReportArrival\n",[51,1490,1488],{"__ignoreMap":137},[18,1492,1493],{},"对应的 XML 片段：",[131,1495,1497],{"className":1102,"code":1496,"language":1104,"meta":137,"style":137},"\u003CSequence>\n    \u003CCheckBattery\u002F>\n    \u003CRetryUntilSuccessful num_attempts=\"3\">\n        \u003CTimeout msec=\"5000\">\n            \u003CNavigateToGoal\u002F>\n        \u003C\u002FTimeout>\n    \u003C\u002FRetryUntilSuccessful>\n    \u003CReportArrival\u002F>\n\u003C\u002FSequence>\n",[51,1498,1499,1507,1515,1529,1544,1553,1562,1571,1579],{"__ignoreMap":137},[332,1500,1501,1503,1505],{"class":334,"line":335},[332,1502,376],{"class":342},[332,1504,90],{"class":1113},[332,1506,1125],{"class":342},[332,1508,1509,1511,1513],{"class":334,"line":360},[332,1510,1130],{"class":342},[332,1512,202],{"class":1113},[332,1514,1135],{"class":342},[332,1516,1517,1519,1521,1523,1525,1527],{"class":334,"line":366},[332,1518,1130],{"class":342},[332,1520,1099],{"class":1113},[332,1522,1116],{"class":338},[332,1524,403],{"class":342},[332,1526,1122],{"class":1121},[332,1528,1125],{"class":342},[332,1530,1531,1534,1536,1538,1540,1542],{"class":334,"line":388},[332,1532,1533],{"class":342},"        \u003C",[332,1535,1357],{"class":1113},[332,1537,1376],{"class":338},[332,1539,403],{"class":342},[332,1541,1381],{"class":1121},[332,1543,1125],{"class":342},[332,1545,1546,1549,1551],{"class":334,"line":394},[332,1547,1548],{"class":342},"            \u003C",[332,1550,209],{"class":1113},[332,1552,1135],{"class":342},[332,1554,1555,1558,1560],{"class":334,"line":415},[332,1556,1557],{"class":342},"        \u003C\u002F",[332,1559,1357],{"class":1113},[332,1561,1125],{"class":342},[332,1563,1564,1567,1569],{"class":334,"line":422},[332,1565,1566],{"class":342},"    \u003C\u002F",[332,1568,1099],{"class":1113},[332,1570,1125],{"class":342},[332,1572,1573,1575,1577],{"class":334,"line":444},[332,1574,1130],{"class":342},[332,1576,215],{"class":1113},[332,1578,1135],{"class":342},[332,1580,1581,1583,1585],{"class":334,"line":450},[332,1582,1140],{"class":342},[332,1584,90],{"class":1113},[332,1586,1125],{"class":342},[18,1588,1589],{},"阅读时，从外向内看任务约束：",[62,1591,1592,1602],{},[65,1593,1594],{},[68,1595,1596,1599],{},[71,1597,1598],{},"所在层",[71,1600,1601],{},"职责",[78,1603,1604,1614,1623,1632],{},[68,1605,1606,1611],{},[83,1607,1608,1609],{},"外层 ",[51,1610,90],{},[83,1612,1613],{},"电量检查通过后才执行导航；导航最终成功后才报告到达",[68,1615,1616,1620],{},[83,1617,1618],{},[51,1619,1099],{},[83,1621,1622],{},"导航尝试失败时重新尝试，最多 3 次",[68,1624,1625,1629],{},[83,1626,1627],{},[51,1628,1357],{},[83,1630,1631],{},"限制每次尝试的运行时间",[68,1633,1634,1638],{},[83,1635,1636],{},[51,1637,209],{},[83,1639,1640],{},"启动、检查并在必要时取消实际导航任务",[18,1642,1643],{},"一种可能的执行过程是：",[131,1645,1648],{"className":1646,"code":1647,"language":136,"meta":137},[134],"CheckBattery → SUCCESS\n    ↓\n第 1 次导航尝试 → RUNNING → 超时并取消 → FAILURE\n    ↓ Retry 重置并重新尝试\n第 2 次导航尝试 → RUNNING → SUCCESS\n    ↓ Retry 返回 SUCCESS\nReportArrival → SUCCESS\n    ↓\nSequence → SUCCESS\n",[51,1649,1647],{"__ignoreMap":137},[18,1651,1652,1653,1655,1656,1658],{},"如果 3 次都失败，Retry 返回 ",[51,1654,56],{},"，外层序列也失败，",[51,1657,215],{}," 不会执行。\n若报告动作本身失败，外层序列同样会报告失败，因此报告动作应按需求定义好“成功”的含义。",[18,1660,1661,1662,1664],{},"这里的普通 ",[51,1663,90],{}," 只在开始时检查电量，后续不会在导航或重试期间持续重查。\n这个例子用于掌握顺序、重试和超时的组合；持续监控条件及任务切换，留到响应式行为章节。",[217,1666,1667],{"id":1667},"装饰节点的内外顺序会改变含义",[131,1669,1672],{"className":1670,"code":1671,"language":136,"meta":137},[134],"RetryUntilSuccessful [3 次]\n└── Timeout [5 秒]\n    └── NavigateToGoal\n",[51,1673,1671],{"__ignoreMap":137},[18,1675,1676,1677,1680],{},"这是上面的结构：",[298,1678,1679],{},"每次尝试分别有 5 秒时限","，一次超时算一次尝试失败，Retry 可以再试。",[18,1682,1683],{},"如果交换位置：",[131,1685,1688],{"className":1686,"code":1687,"language":136,"meta":137},[134],"Timeout [5 秒]\n└── RetryUntilSuccessful [3 次]\n    └── NavigateToGoal\n",[51,1689,1687],{"__ignoreMap":137},[18,1691,1692,1693,1696],{},"则是",[298,1694,1695],{},"所有尝试共享一个 5 秒时限","。\n只有导航自身先返回失败，Retry 才能在剩余时间内重试；\n外层一旦超时，就中止整个重试子树，不再保证用完 3 次。",[18,1698,1699],{},"两种结构的节点相同，但任务约束不同。\n读树时既要看子节点顺序，也要看装饰节点包住了哪一层。",[119,1701],{},[12,1703,1704],{"id":1704},"当前学习进度",[18,1706,1707,1708,1711],{},"本篇完成了 ",[51,1709,1710],{},"Introduction to BTs"," 中 Sequence、Fallback 和装饰节点的核心规则，并补充了机器人任务常用的重试、重复与超时组合。",[1713,1714,1715],"style",{},"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 pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":137,"searchDepth":360,"depth":360,"links":1717},[1718,1719,1724,1727,1728,1734,1737],{"id":5,"depth":360,"text":5},{"id":123,"depth":360,"text":124,"children":1720},[1721,1722,1723],{"id":219,"depth":366,"text":220},{"id":312,"depth":366,"text":312},{"id":642,"depth":366,"text":642},{"id":675,"depth":360,"text":676,"children":1725},[1726],{"id":832,"depth":366,"text":832},{"id":860,"depth":360,"text":860},{"id":965,"depth":360,"text":966,"children":1729},[1730,1731,1732,1733],{"id":972,"depth":366,"text":973},{"id":1088,"depth":366,"text":1089},{"id":1229,"depth":366,"text":1230},{"id":1351,"depth":366,"text":1352},{"id":1480,"depth":360,"text":1481,"children":1735},[1736],{"id":1667,"depth":366,"text":1667},{"id":1704,"depth":360,"text":1704},"1200-0400-0200-0200","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-0200-kong-zhi-yu-zhuang-shi-gui-ze",{"title":5,"description":137},"wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","CbhqAUQnFrx1xoMCEBjm4NZGNfPDAUqBpnuBMLvuWsU",[1751,1758,1764,1770,1776,1782,1788,1794,1800,1806,1812,1818,1824,1830,1836,1842,1848,1854,1860,1866,1872,1874,1880,1886,1892,1898,1904,1910,1916,1922,1928,1934,1940,1946,1952,1957,1963,1968,1974,1980,1986,1992,1998,2004,2010,2016,2022,2028,2034,2040,2046,2052,2058,2064,2070,2076,2082,2088,2094,2100,2106,2112,2118,2124,2130,2136,2142,2148,2154],{"path":1752,"stem":1753,"title":1754,"authors":1755,"date":1739,"chapterOrder":1756,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":1759,"stem":1760,"title":1761,"authors":1762,"date":1739,"chapterOrder":1763,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":1765,"stem":1766,"title":1767,"authors":1768,"date":1739,"chapterOrder":1769,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1771,"stem":1772,"title":1773,"authors":1774,"date":1739,"chapterOrder":1775,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":1777,"stem":1778,"title":1779,"authors":1780,"date":1739,"chapterOrder":1781,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1783,"stem":1784,"title":1785,"authors":1786,"date":1739,"chapterOrder":1787,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":1789,"stem":1790,"title":1791,"authors":1792,"date":1739,"chapterOrder":1793,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":1795,"stem":1796,"title":1797,"authors":1798,"date":1739,"chapterOrder":1799,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":1801,"stem":1802,"title":1803,"authors":1804,"date":1739,"chapterOrder":1805,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1807,"stem":1808,"title":1809,"authors":1810,"date":1739,"chapterOrder":1811,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1813,"stem":1814,"title":1815,"authors":1816,"date":1739,"chapterOrder":1817,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":1819,"stem":1820,"title":1821,"authors":1822,"date":1739,"chapterOrder":1823,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1825,"stem":1826,"title":1827,"authors":1828,"date":1739,"chapterOrder":1829,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1831,"stem":1832,"title":1833,"authors":1834,"date":1739,"chapterOrder":1835,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1837,"stem":1838,"title":1839,"authors":1840,"date":1739,"chapterOrder":1841,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":1843,"stem":1844,"title":1845,"authors":1846,"date":1739,"chapterOrder":1847,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1849,"stem":1850,"title":1851,"authors":1852,"date":1739,"chapterOrder":1853,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1855,"stem":1856,"title":1857,"authors":1858,"date":1739,"chapterOrder":1859,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":1861,"stem":1862,"title":1863,"authors":1864,"date":1739,"chapterOrder":1865,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1867,"stem":1868,"title":1869,"authors":1870,"date":1739,"chapterOrder":1871,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","基本概念",[7],"1200-0400-0200-0100",{"path":1746,"stem":1748,"title":5,"authors":1873,"date":1739,"chapterOrder":1738,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},[7],{"path":1875,"stem":1876,"title":1877,"authors":1878,"date":1739,"chapterOrder":1879,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1881,"stem":1882,"title":1883,"authors":1884,"date":1739,"chapterOrder":1885,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1887,"stem":1888,"title":1889,"authors":1890,"date":1739,"chapterOrder":1891,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1893,"stem":1894,"title":1895,"authors":1896,"date":1739,"chapterOrder":1897,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1899,"stem":1900,"title":1901,"authors":1902,"date":1739,"chapterOrder":1903,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1905,"stem":1906,"title":1907,"authors":1908,"date":1739,"chapterOrder":1909,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1911,"stem":1912,"title":1913,"authors":1914,"date":1739,"chapterOrder":1915,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1917,"stem":1918,"title":1919,"authors":1920,"date":1739,"chapterOrder":1921,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1923,"stem":1924,"title":1925,"authors":1926,"date":1739,"chapterOrder":1927,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1929,"stem":1930,"title":1931,"authors":1932,"date":1739,"chapterOrder":1933,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1935,"stem":1936,"title":1937,"authors":1938,"date":1739,"chapterOrder":1939,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1941,"stem":1942,"title":1943,"authors":1944,"date":1739,"chapterOrder":1945,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1947,"stem":1948,"title":1949,"authors":1950,"date":1739,"chapterOrder":1951,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1953,"stem":1954,"title":1919,"authors":1955,"date":1739,"chapterOrder":1956,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1958,"stem":1959,"title":1960,"authors":1961,"date":1739,"chapterOrder":1962,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1964,"stem":1965,"title":1919,"authors":1966,"date":1739,"chapterOrder":1967,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1969,"stem":1970,"title":1971,"authors":1972,"date":1739,"chapterOrder":1973,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1975,"stem":1976,"title":1977,"authors":1978,"date":1739,"chapterOrder":1979,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":1981,"stem":1982,"title":1983,"authors":1984,"date":1739,"chapterOrder":1985,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1987,"stem":1988,"title":1989,"authors":1990,"date":1739,"chapterOrder":1991,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1993,"stem":1994,"title":1995,"authors":1996,"date":1739,"chapterOrder":1997,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":1999,"stem":2000,"title":2001,"authors":2002,"date":1739,"chapterOrder":2003,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2005,"stem":2006,"title":2007,"authors":2008,"date":1739,"chapterOrder":2009,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2011,"stem":2012,"title":2013,"authors":2014,"date":1739,"chapterOrder":2015,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2017,"stem":2018,"title":2019,"authors":2020,"date":1739,"chapterOrder":2021,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":2023,"stem":2024,"title":2025,"authors":2026,"date":1739,"chapterOrder":2027,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2029,"stem":2030,"title":2031,"authors":2032,"date":1739,"chapterOrder":2033,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2035,"stem":2036,"title":2037,"authors":2038,"date":1739,"chapterOrder":2039,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2041,"stem":2042,"title":2043,"authors":2044,"date":1739,"chapterOrder":2045,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2047,"stem":2048,"title":2049,"authors":2050,"date":1739,"chapterOrder":2051,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2053,"stem":2054,"title":2055,"authors":2056,"date":1739,"chapterOrder":2057,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2059,"stem":2060,"title":2061,"authors":2062,"date":1739,"chapterOrder":2063,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2065,"stem":2066,"title":2067,"authors":2068,"date":1739,"chapterOrder":2069,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":2071,"stem":2072,"title":2073,"authors":2074,"date":1739,"chapterOrder":2075,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2077,"stem":2078,"title":2079,"authors":2080,"date":1739,"chapterOrder":2081,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2083,"stem":2084,"title":2085,"authors":2086,"date":1739,"chapterOrder":2087,"chapterDepth":366,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2089,"stem":2090,"title":2091,"authors":2092,"date":1739,"chapterOrder":2093,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2095,"stem":2096,"title":2097,"authors":2098,"date":1739,"chapterOrder":2099,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2101,"stem":2102,"title":2103,"authors":2104,"date":1739,"chapterOrder":2105,"chapterDepth":360,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2107,"stem":2108,"title":2109,"authors":2110,"date":1739,"chapterOrder":2111,"chapterDepth":335,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2113,"stem":2114,"title":2115,"authors":2116,"date":1739,"chapterOrder":2117,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":2119,"stem":2120,"title":2121,"authors":2122,"date":1739,"chapterOrder":2123,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":2125,"stem":2126,"title":2127,"authors":2128,"date":1739,"chapterOrder":2129,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2131,"stem":2132,"title":2133,"authors":2134,"date":1739,"chapterOrder":2135,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\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":2137,"stem":2138,"title":2139,"authors":2140,"date":1739,"chapterOrder":2141,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":2143,"stem":2144,"title":2145,"authors":2146,"date":1739,"chapterOrder":2147,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":2149,"stem":2150,"title":2151,"authors":2152,"date":1739,"chapterOrder":2153,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":1744},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":1741,"stem":2155,"title":2156,"authors":2157,"date":1739,"chapterOrder":2158,"chapterDepth":1757,"docKey":1740,"docRoot":1741,"docTitle":1742,"isWikiDoc":418,"isWikiIndex":418},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[2160,2162,2165,2168],{"name":7,"image":2161},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":2163,"image":2164},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":2166,"image":2167},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":2169,"image":2170},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431903185]