[{"data":1,"prerenderedAt":2009},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm":3,"wiki-doc-items-2023-12-30-ros2-tutorial":1588,"wiki:author-members":1997},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":152,"chapterOrder":1576,"date":1577,"description":24,"docKey":1578,"docRoot":1579,"docTitle":1580,"extension":1581,"isWikiDoc":223,"isWikiIndex":1582,"meta":1583,"navigation":223,"path":1584,"seo":1585,"stem":1586,"wikiDepth":145,"__hash__":1587},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM.md","有限状态机（Finite State Machine）",[7],"董佳辉",{"type":9,"value":10,"toc":1571},"minimark",[11,15,19,26,29,45,49,53,56,59,111,127,130,133,684,687,786,793,796,799,1485,1488,1567],[12,13,5],"h2",{"id":14},"有限状态机finite-state-machine",[16,17,18],"p",{},"FSM就是：把任务分成几个状态，并规定遇到什么事件时切换状态。",[16,20,21],{},[22,23],"img",{"alt":24,"src":25},"","https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002F1792130577390-9a49b9ec.webp",[16,27,28],{},"重点理解四件事：",[30,31,32,36,39,42],"ul",{},[33,34,35],"li",{},"状态： 当前任务在做什么，例如“前往目标”。",[33,37,38],{},"事件／条件： 发生了什么，例如导航返回成功。",[33,40,41],{},"转移： 从“前往目标”切到“到点等待”。",[33,43,44],{},"进入／退出动作： 进入导航状态时发送一次目标；中途退出时取消尚未完成的目标。\n状态机通常围绕“当前处于哪个状态，什么时候切换”组织逻辑；BT围绕条件检查和动作组合组织逻辑。两者都能做任务决策。",[46,47,48],"h3",{"id":48},"例子",[50,51,52],"h4",{"id":52},"例子1",[16,54,55],{},"做一个小例子：",[16,57,58],{},"首先定义四个状态：",[60,61,62,75],"table",{},[63,64,65],"thead",{},[66,67,68,72],"tr",{},[69,70,71],"th",{},"状态",[69,73,74],{},"表示什么",[76,77,78,87,95,103],"tbody",{},[66,79,80,84],{},[81,82,83],"td",{},"待机",[81,85,86],{},"还没有任务",[66,88,89,92],{},[81,90,91],{},"导航中",[81,93,94],{},"已发送目标，正在等待结果",[66,96,97,100],{},[81,98,99],{},"已完成",[81,101,102],{},"导航成功",[66,104,105,108],{},[81,106,107],{},"异常",[81,109,110],{},"导航失败",[16,112,113,114,118,119,118,121,118,123,126],{},"再定义事件：",[115,116,117],"code",{},"开始任务","、",[115,120,102],{},[115,122,110],{},[115,124,125],{},"重置","。",[16,128,129],{},"状态是“现在处于什么阶段”，事件是“刚刚发生了什么”。",[16,131,132],{},"状态机根据这两项决定下一步。",[134,135,139],"pre",{"className":136,"code":137,"language":138,"meta":24,"style":24},"language-cpp shiki shiki-themes github-light github-dark","\u002F\u002F 定义任务可能处于的状态\nenum class State {\n    IDLE,        \u002F\u002F 待机：还没有开始任务\n    NAVIGATING,  \u002F\u002F 导航中：已经发送目标，正在等待结果\n    COMPLETED,   \u002F\u002F 已完成：导航成功\n    ERROR        \u002F\u002F 异常：导航失败\n};\n\n\u002F\u002F 定义可能收到的事件\nenum class Event {\n    START,          \u002F\u002F 收到“开始任务”指令\n    NAV_SUCCEEDED,  \u002F\u002F 导航模块报告成功\n    NAV_FAILED,     \u002F\u002F 导航模块报告失败\n    RESET           \u002F\u002F 收到“重置任务”指令\n};\n\n\u002F\u002F 保存当前状态，初始状态为待机\nState current_state = State::IDLE;\n\n\u002F\u002F 函数声明：暂时代表发送A点目标，具体实现以后再写\nvoid sendGoalA();\n\n\u002F\u002F 每次发生事件时，调用这个函数\nvoid handleEvent(Event event)\n{\n    \u002F\u002F 先判断任务当前处于哪个状态\n    switch (current_state) \n    {\n\n        case State::IDLE:\n            \u002F\u002F 待机状态下，收到开始指令才启动导航\n            if (event == Event::START) \n            {\n                current_state = State::NAVIGATING;\n                sendGoalA();  \u002F\u002F 发送一次导航目标\n            }\n            break;  \u002F\u002F 跳出switch，本次事件处理结束\n\n        case State::NAVIGATING:\n            \u002F\u002F 导航中，根据导航结果切换状态\n            if (event == Event::NAV_SUCCEEDED) \n            {\n                current_state = State::COMPLETED;\n            } else if (event == Event::NAV_FAILED) \n            {\n                current_state = State::ERROR;\n            }\n\n            \u002F\u002F 如果收到START等其他事件，保持当前状态\n            break;\n\n        \u002F\u002F 已完成和异常状态，共用下面的重置逻辑\n        case State::COMPLETED:\n        case State::ERROR:\n            if (event == Event::RESET) \n            {\n                current_state = State::IDLE;\n            }\n            break;\n    }\n}\n","cpp",[115,140,141,150,168,181,192,203,212,218,225,231,243,254,265,276,285,290,295,301,315,320,326,338,343,349,370,376,382,391,397,402,413,419,436,442,455,467,473,485,490,500,506,520,525,537,558,563,575,580,585,591,599,604,610,620,630,644,649,660,665,672,678],{"__ignoreMap":24},[142,143,146],"span",{"class":144,"line":145},"line",1,[142,147,149],{"class":148},"sJ8bj","\u002F\u002F 定义任务可能处于的状态\n",[142,151,153,157,160,164],{"class":144,"line":152},2,[142,154,156],{"class":155},"szBVR","enum",[142,158,159],{"class":155}," class",[142,161,163],{"class":162},"sScJk"," State",[142,165,167],{"class":166},"sVt8B"," {\n",[142,169,171,175,178],{"class":144,"line":170},3,[142,172,174],{"class":173},"sj4cs","    IDLE",[142,176,177],{"class":166},",",[142,179,180],{"class":148},"        \u002F\u002F 待机：还没有开始任务\n",[142,182,184,187,189],{"class":144,"line":183},4,[142,185,186],{"class":173},"    NAVIGATING",[142,188,177],{"class":166},[142,190,191],{"class":148},"  \u002F\u002F 导航中：已经发送目标，正在等待结果\n",[142,193,195,198,200],{"class":144,"line":194},5,[142,196,197],{"class":173},"    COMPLETED",[142,199,177],{"class":166},[142,201,202],{"class":148},"   \u002F\u002F 已完成：导航成功\n",[142,204,206,209],{"class":144,"line":205},6,[142,207,208],{"class":173},"    ERROR",[142,210,211],{"class":148},"        \u002F\u002F 异常：导航失败\n",[142,213,215],{"class":144,"line":214},7,[142,216,217],{"class":166},"};\n",[142,219,221],{"class":144,"line":220},8,[142,222,224],{"emptyLinePlaceholder":223},true,"\n",[142,226,228],{"class":144,"line":227},9,[142,229,230],{"class":148},"\u002F\u002F 定义可能收到的事件\n",[142,232,234,236,238,241],{"class":144,"line":233},10,[142,235,156],{"class":155},[142,237,159],{"class":155},[142,239,240],{"class":162}," Event",[142,242,167],{"class":166},[142,244,246,249,251],{"class":144,"line":245},11,[142,247,248],{"class":173},"    START",[142,250,177],{"class":166},[142,252,253],{"class":148},"          \u002F\u002F 收到“开始任务”指令\n",[142,255,257,260,262],{"class":144,"line":256},12,[142,258,259],{"class":173},"    NAV_SUCCEEDED",[142,261,177],{"class":166},[142,263,264],{"class":148},"  \u002F\u002F 导航模块报告成功\n",[142,266,268,271,273],{"class":144,"line":267},13,[142,269,270],{"class":173},"    NAV_FAILED",[142,272,177],{"class":166},[142,274,275],{"class":148},"     \u002F\u002F 导航模块报告失败\n",[142,277,279,282],{"class":144,"line":278},14,[142,280,281],{"class":173},"    RESET",[142,283,284],{"class":148},"           \u002F\u002F 收到“重置任务”指令\n",[142,286,288],{"class":144,"line":287},15,[142,289,217],{"class":166},[142,291,293],{"class":144,"line":292},16,[142,294,224],{"emptyLinePlaceholder":223},[142,296,298],{"class":144,"line":297},17,[142,299,300],{"class":148},"\u002F\u002F 保存当前状态，初始状态为待机\n",[142,302,304,307,310,312],{"class":144,"line":303},18,[142,305,306],{"class":166},"State current_state ",[142,308,309],{"class":155},"=",[142,311,163],{"class":162},[142,313,314],{"class":166},"::IDLE;\n",[142,316,318],{"class":144,"line":317},19,[142,319,224],{"emptyLinePlaceholder":223},[142,321,323],{"class":144,"line":322},20,[142,324,325],{"class":148},"\u002F\u002F 函数声明：暂时代表发送A点目标，具体实现以后再写\n",[142,327,329,332,335],{"class":144,"line":328},21,[142,330,331],{"class":155},"void",[142,333,334],{"class":162}," sendGoalA",[142,336,337],{"class":166},"();\n",[142,339,341],{"class":144,"line":340},22,[142,342,224],{"emptyLinePlaceholder":223},[142,344,346],{"class":144,"line":345},23,[142,347,348],{"class":148},"\u002F\u002F 每次发生事件时，调用这个函数\n",[142,350,352,354,357,360,363,367],{"class":144,"line":351},24,[142,353,331],{"class":155},[142,355,356],{"class":162}," handleEvent",[142,358,359],{"class":166},"(",[142,361,362],{"class":162},"Event",[142,364,366],{"class":365},"s4XuR"," event",[142,368,369],{"class":166},")\n",[142,371,373],{"class":144,"line":372},25,[142,374,375],{"class":166},"{\n",[142,377,379],{"class":144,"line":378},26,[142,380,381],{"class":148},"    \u002F\u002F 先判断任务当前处于哪个状态\n",[142,383,385,388],{"class":144,"line":384},27,[142,386,387],{"class":155},"    switch",[142,389,390],{"class":166}," (current_state) \n",[142,392,394],{"class":144,"line":393},28,[142,395,396],{"class":166},"    {\n",[142,398,400],{"class":144,"line":399},29,[142,401,224],{"emptyLinePlaceholder":223},[142,403,405,408,410],{"class":144,"line":404},30,[142,406,407],{"class":155},"        case",[142,409,163],{"class":162},[142,411,412],{"class":166},"::IDLE:\n",[142,414,416],{"class":144,"line":415},31,[142,417,418],{"class":148},"            \u002F\u002F 待机状态下，收到开始指令才启动导航\n",[142,420,422,425,428,431,433],{"class":144,"line":421},32,[142,423,424],{"class":155},"            if",[142,426,427],{"class":166}," (event ",[142,429,430],{"class":155},"==",[142,432,240],{"class":162},[142,434,435],{"class":166},"::START) \n",[142,437,439],{"class":144,"line":438},33,[142,440,441],{"class":166},"            {\n",[142,443,445,448,450,452],{"class":144,"line":444},34,[142,446,447],{"class":166},"                current_state ",[142,449,309],{"class":155},[142,451,163],{"class":162},[142,453,454],{"class":166},"::NAVIGATING;\n",[142,456,458,461,464],{"class":144,"line":457},35,[142,459,460],{"class":162},"                sendGoalA",[142,462,463],{"class":166},"();",[142,465,466],{"class":148},"  \u002F\u002F 发送一次导航目标\n",[142,468,470],{"class":144,"line":469},36,[142,471,472],{"class":166},"            }\n",[142,474,476,479,482],{"class":144,"line":475},37,[142,477,478],{"class":155},"            break",[142,480,481],{"class":166},";",[142,483,484],{"class":148},"  \u002F\u002F 跳出switch，本次事件处理结束\n",[142,486,488],{"class":144,"line":487},38,[142,489,224],{"emptyLinePlaceholder":223},[142,491,493,495,497],{"class":144,"line":492},39,[142,494,407],{"class":155},[142,496,163],{"class":162},[142,498,499],{"class":166},"::NAVIGATING:\n",[142,501,503],{"class":144,"line":502},40,[142,504,505],{"class":148},"            \u002F\u002F 导航中，根据导航结果切换状态\n",[142,507,509,511,513,515,517],{"class":144,"line":508},41,[142,510,424],{"class":155},[142,512,427],{"class":166},[142,514,430],{"class":155},[142,516,240],{"class":162},[142,518,519],{"class":166},"::NAV_SUCCEEDED) \n",[142,521,523],{"class":144,"line":522},42,[142,524,441],{"class":166},[142,526,528,530,532,534],{"class":144,"line":527},43,[142,529,447],{"class":166},[142,531,309],{"class":155},[142,533,163],{"class":162},[142,535,536],{"class":166},"::COMPLETED;\n",[142,538,540,543,546,549,551,553,555],{"class":144,"line":539},44,[142,541,542],{"class":166},"            } ",[142,544,545],{"class":155},"else",[142,547,548],{"class":155}," if",[142,550,427],{"class":166},[142,552,430],{"class":155},[142,554,240],{"class":162},[142,556,557],{"class":166},"::NAV_FAILED) \n",[142,559,561],{"class":144,"line":560},45,[142,562,441],{"class":166},[142,564,566,568,570,572],{"class":144,"line":565},46,[142,567,447],{"class":166},[142,569,309],{"class":155},[142,571,163],{"class":162},[142,573,574],{"class":166},"::ERROR;\n",[142,576,578],{"class":144,"line":577},47,[142,579,472],{"class":166},[142,581,583],{"class":144,"line":582},48,[142,584,224],{"emptyLinePlaceholder":223},[142,586,588],{"class":144,"line":587},49,[142,589,590],{"class":148},"            \u002F\u002F 如果收到START等其他事件，保持当前状态\n",[142,592,594,596],{"class":144,"line":593},50,[142,595,478],{"class":155},[142,597,598],{"class":166},";\n",[142,600,602],{"class":144,"line":601},51,[142,603,224],{"emptyLinePlaceholder":223},[142,605,607],{"class":144,"line":606},52,[142,608,609],{"class":148},"        \u002F\u002F 已完成和异常状态，共用下面的重置逻辑\n",[142,611,613,615,617],{"class":144,"line":612},53,[142,614,407],{"class":155},[142,616,163],{"class":162},[142,618,619],{"class":166},"::COMPLETED:\n",[142,621,623,625,627],{"class":144,"line":622},54,[142,624,407],{"class":155},[142,626,163],{"class":162},[142,628,629],{"class":166},"::ERROR:\n",[142,631,633,635,637,639,641],{"class":144,"line":632},55,[142,634,424],{"class":155},[142,636,427],{"class":166},[142,638,430],{"class":155},[142,640,240],{"class":162},[142,642,643],{"class":166},"::RESET) \n",[142,645,647],{"class":144,"line":646},56,[142,648,441],{"class":166},[142,650,652,654,656,658],{"class":144,"line":651},57,[142,653,447],{"class":166},[142,655,309],{"class":155},[142,657,163],{"class":162},[142,659,314],{"class":166},[142,661,663],{"class":144,"line":662},58,[142,664,472],{"class":166},[142,666,668,670],{"class":144,"line":667},59,[142,669,478],{"class":155},[142,671,598],{"class":166},[142,673,675],{"class":144,"line":674},60,[142,676,677],{"class":166},"    }\n",[142,679,681],{"class":144,"line":680},61,[142,682,683],{"class":166},"}\n",[16,685,686],{},"下面模拟事件依次发生：",[134,688,690],{"className":136,"code":689,"language":138,"meta":24,"style":24},"void demo()\n{\n    \u002F\u002F 当前为待机，操作员点击开始指令：进入导航中，发送目标\n    handleEvent(Event::START);\n\n    \u002F\u002F 当前已在导航中，再收到开始指令：忽略，不重复发送目标\n    handleEvent(Event::START);\n\n    \u002F\u002F NAV2导航报告成功：进入已完成状态\n    handleEvent(Event::NAV_SUCCEEDED);\n\n    \u002F\u002F 收到重置指令：回到待机状态\n    handleEvent(Event::RESET);\n}\n",[115,691,692,702,706,711,723,727,732,742,746,751,762,766,771,782],{"__ignoreMap":24},[142,693,694,696,699],{"class":144,"line":145},[142,695,331],{"class":155},[142,697,698],{"class":162}," demo",[142,700,701],{"class":166},"()\n",[142,703,704],{"class":144,"line":152},[142,705,375],{"class":166},[142,707,708],{"class":144,"line":170},[142,709,710],{"class":148},"    \u002F\u002F 当前为待机，操作员点击开始指令：进入导航中，发送目标\n",[142,712,713,716,718,720],{"class":144,"line":183},[142,714,715],{"class":162},"    handleEvent",[142,717,359],{"class":166},[142,719,362],{"class":162},[142,721,722],{"class":166},"::START);\n",[142,724,725],{"class":144,"line":194},[142,726,224],{"emptyLinePlaceholder":223},[142,728,729],{"class":144,"line":205},[142,730,731],{"class":148},"    \u002F\u002F 当前已在导航中，再收到开始指令：忽略，不重复发送目标\n",[142,733,734,736,738,740],{"class":144,"line":214},[142,735,715],{"class":162},[142,737,359],{"class":166},[142,739,362],{"class":162},[142,741,722],{"class":166},[142,743,744],{"class":144,"line":220},[142,745,224],{"emptyLinePlaceholder":223},[142,747,748],{"class":144,"line":227},[142,749,750],{"class":148},"    \u002F\u002F NAV2导航报告成功：进入已完成状态\n",[142,752,753,755,757,759],{"class":144,"line":233},[142,754,715],{"class":162},[142,756,359],{"class":166},[142,758,362],{"class":162},[142,760,761],{"class":166},"::NAV_SUCCEEDED);\n",[142,763,764],{"class":144,"line":245},[142,765,224],{"emptyLinePlaceholder":223},[142,767,768],{"class":144,"line":256},[142,769,770],{"class":148},"    \u002F\u002F 收到重置指令：回到待机状态\n",[142,772,773,775,777,779],{"class":144,"line":267},[142,774,715],{"class":162},[142,776,359],{"class":166},[142,778,362],{"class":162},[142,780,781],{"class":166},"::RESET);\n",[142,783,784],{"class":144,"line":278},[142,785,683],{"class":166},[16,787,788,789],{},"核心就是：",[790,791,792],"strong",{},"先看当前状态，再看收到的事件，决定是否切换状态以及执行什么动作。",[50,794,795],{"id":795},"例子2",[16,797,798],{},"增加“到点后等待2秒”的功能：",[134,800,802],{"className":136,"code":801,"language":138,"meta":24,"style":24},"#include \u003Cchrono>\n\nusing Clock = std::chrono::steady_clock;\n\n\u002F\u002F 任务状态\nenum class State {\n    IDLE,        \u002F\u002F 待机\n    NAVIGATING,  \u002F\u002F 导航中\n    WAITING,     \u002F\u002F 到点后等待\n    COMPLETED,   \u002F\u002F 任务完成\n    ERROR        \u002F\u002F 任务异常\n};\n\n\u002F\u002F 任务事件\nenum class Event {\n    START,          \u002F\u002F 开始任务\n    NAV_SUCCEEDED,  \u002F\u002F 导航成功\n    NAV_FAILED,     \u002F\u002F 导航失败\n    WAIT_FINISHED,  \u002F\u002F 等待结束\n    RESET           \u002F\u002F 重置任务\n};\n\nState current_state = State::IDLE;\n\n\u002F\u002F 保存等待的结束时刻\nClock::time_point wait_deadline;\n\n\u002F\u002F 暂时代表发送导航目标，具体实现以后再写\nvoid sendGoalA();\n\n\u002F\u002F 处理事件\nvoid handleEvent(Event event)\n{\n    switch (current_state) {\n        case State::IDLE:\n            if (event == Event::START) \n            {\n                current_state = State::NAVIGATING;\n                sendGoalA();  \u002F\u002F 只发送一次目标\n            }\n            break;\n\n        case State::NAVIGATING:\n            if (event == Event::NAV_SUCCEEDED) \n            {\n                \u002F\u002F 导航成功时，设置一次等待结束时刻\n                wait_deadline =\n                    Clock::now() + std::chrono::seconds(2);\n\n                current_state = State::WAITING;\n            } \n            else if (event == Event::NAV_FAILED) \n            {\n                current_state = State::ERROR;\n            }\n            break;\n\n        case State::WAITING:\n            if (event == Event::WAIT_FINISHED) \n            {\n                current_state = State::COMPLETED;\n            }\n            break;\n\n        case State::COMPLETED:\n        case State::ERROR:\n            if (event == Event::RESET) \n            {\n                current_state = State::IDLE;\n            }\n            break;\n    }\n}\n\n\u002F\u002F 主循环或定时器周期性调用这个函数\nvoid tick()\n{\n    \u002F\u002F 只有处于等待状态，才检查时间\n    if (current_state == State::WAITING) \n    {\n        if (Clock::now() >= wait_deadline) \n        {\n            handleEvent(Event::WAIT_FINISHED);\n        }\n    }\n}\n",[115,803,804,813,817,844,848,853,863,872,881,891,900,907,911,915,920,930,939,948,957,967,974,978,982,992,996,1001,1009,1013,1018,1026,1030,1035,1049,1053,1060,1068,1080,1084,1094,1103,1107,1113,1117,1125,1137,1141,1146,1154,1189,1193,1204,1209,1224,1228,1238,1242,1248,1252,1261,1274,1278,1288,1293,1300,1305,1314,1323,1336,1341,1352,1357,1364,1369,1374,1379,1385,1395,1400,1406,1422,1427,1450,1456,1469,1475,1480],{"__ignoreMap":24},[142,805,806,809],{"class":144,"line":145},[142,807,808],{"class":155},"#include",[142,810,812],{"class":811},"sZZnC"," \u003Cchrono>\n",[142,814,815],{"class":144,"line":152},[142,816,224],{"emptyLinePlaceholder":223},[142,818,819,822,825,828,831,834,837,839,842],{"class":144,"line":170},[142,820,821],{"class":155},"using",[142,823,824],{"class":162}," Clock",[142,826,827],{"class":155}," =",[142,829,830],{"class":162}," std",[142,832,833],{"class":166},"::",[142,835,836],{"class":162},"chrono",[142,838,833],{"class":166},[142,840,841],{"class":162},"steady_clock",[142,843,598],{"class":166},[142,845,846],{"class":144,"line":183},[142,847,224],{"emptyLinePlaceholder":223},[142,849,850],{"class":144,"line":194},[142,851,852],{"class":148},"\u002F\u002F 任务状态\n",[142,854,855,857,859,861],{"class":144,"line":205},[142,856,156],{"class":155},[142,858,159],{"class":155},[142,860,163],{"class":162},[142,862,167],{"class":166},[142,864,865,867,869],{"class":144,"line":214},[142,866,174],{"class":173},[142,868,177],{"class":166},[142,870,871],{"class":148},"        \u002F\u002F 待机\n",[142,873,874,876,878],{"class":144,"line":220},[142,875,186],{"class":173},[142,877,177],{"class":166},[142,879,880],{"class":148},"  \u002F\u002F 导航中\n",[142,882,883,886,888],{"class":144,"line":227},[142,884,885],{"class":173},"    WAITING",[142,887,177],{"class":166},[142,889,890],{"class":148},"     \u002F\u002F 到点后等待\n",[142,892,893,895,897],{"class":144,"line":233},[142,894,197],{"class":173},[142,896,177],{"class":166},[142,898,899],{"class":148},"   \u002F\u002F 任务完成\n",[142,901,902,904],{"class":144,"line":245},[142,903,208],{"class":173},[142,905,906],{"class":148},"        \u002F\u002F 任务异常\n",[142,908,909],{"class":144,"line":256},[142,910,217],{"class":166},[142,912,913],{"class":144,"line":267},[142,914,224],{"emptyLinePlaceholder":223},[142,916,917],{"class":144,"line":278},[142,918,919],{"class":148},"\u002F\u002F 任务事件\n",[142,921,922,924,926,928],{"class":144,"line":287},[142,923,156],{"class":155},[142,925,159],{"class":155},[142,927,240],{"class":162},[142,929,167],{"class":166},[142,931,932,934,936],{"class":144,"line":292},[142,933,248],{"class":173},[142,935,177],{"class":166},[142,937,938],{"class":148},"          \u002F\u002F 开始任务\n",[142,940,941,943,945],{"class":144,"line":297},[142,942,259],{"class":173},[142,944,177],{"class":166},[142,946,947],{"class":148},"  \u002F\u002F 导航成功\n",[142,949,950,952,954],{"class":144,"line":303},[142,951,270],{"class":173},[142,953,177],{"class":166},[142,955,956],{"class":148},"     \u002F\u002F 导航失败\n",[142,958,959,962,964],{"class":144,"line":317},[142,960,961],{"class":173},"    WAIT_FINISHED",[142,963,177],{"class":166},[142,965,966],{"class":148},"  \u002F\u002F 等待结束\n",[142,968,969,971],{"class":144,"line":322},[142,970,281],{"class":173},[142,972,973],{"class":148},"           \u002F\u002F 重置任务\n",[142,975,976],{"class":144,"line":328},[142,977,217],{"class":166},[142,979,980],{"class":144,"line":340},[142,981,224],{"emptyLinePlaceholder":223},[142,983,984,986,988,990],{"class":144,"line":345},[142,985,306],{"class":166},[142,987,309],{"class":155},[142,989,163],{"class":162},[142,991,314],{"class":166},[142,993,994],{"class":144,"line":351},[142,995,224],{"emptyLinePlaceholder":223},[142,997,998],{"class":144,"line":372},[142,999,1000],{"class":148},"\u002F\u002F 保存等待的结束时刻\n",[142,1002,1003,1006],{"class":144,"line":378},[142,1004,1005],{"class":162},"Clock",[142,1007,1008],{"class":166},"::time_point wait_deadline;\n",[142,1010,1011],{"class":144,"line":384},[142,1012,224],{"emptyLinePlaceholder":223},[142,1014,1015],{"class":144,"line":393},[142,1016,1017],{"class":148},"\u002F\u002F 暂时代表发送导航目标，具体实现以后再写\n",[142,1019,1020,1022,1024],{"class":144,"line":399},[142,1021,331],{"class":155},[142,1023,334],{"class":162},[142,1025,337],{"class":166},[142,1027,1028],{"class":144,"line":404},[142,1029,224],{"emptyLinePlaceholder":223},[142,1031,1032],{"class":144,"line":415},[142,1033,1034],{"class":148},"\u002F\u002F 处理事件\n",[142,1036,1037,1039,1041,1043,1045,1047],{"class":144,"line":421},[142,1038,331],{"class":155},[142,1040,356],{"class":162},[142,1042,359],{"class":166},[142,1044,362],{"class":162},[142,1046,366],{"class":365},[142,1048,369],{"class":166},[142,1050,1051],{"class":144,"line":438},[142,1052,375],{"class":166},[142,1054,1055,1057],{"class":144,"line":444},[142,1056,387],{"class":155},[142,1058,1059],{"class":166}," (current_state) {\n",[142,1061,1062,1064,1066],{"class":144,"line":457},[142,1063,407],{"class":155},[142,1065,163],{"class":162},[142,1067,412],{"class":166},[142,1069,1070,1072,1074,1076,1078],{"class":144,"line":469},[142,1071,424],{"class":155},[142,1073,427],{"class":166},[142,1075,430],{"class":155},[142,1077,240],{"class":162},[142,1079,435],{"class":166},[142,1081,1082],{"class":144,"line":475},[142,1083,441],{"class":166},[142,1085,1086,1088,1090,1092],{"class":144,"line":487},[142,1087,447],{"class":166},[142,1089,309],{"class":155},[142,1091,163],{"class":162},[142,1093,454],{"class":166},[142,1095,1096,1098,1100],{"class":144,"line":492},[142,1097,460],{"class":162},[142,1099,463],{"class":166},[142,1101,1102],{"class":148},"  \u002F\u002F 只发送一次目标\n",[142,1104,1105],{"class":144,"line":502},[142,1106,472],{"class":166},[142,1108,1109,1111],{"class":144,"line":508},[142,1110,478],{"class":155},[142,1112,598],{"class":166},[142,1114,1115],{"class":144,"line":522},[142,1116,224],{"emptyLinePlaceholder":223},[142,1118,1119,1121,1123],{"class":144,"line":527},[142,1120,407],{"class":155},[142,1122,163],{"class":162},[142,1124,499],{"class":166},[142,1126,1127,1129,1131,1133,1135],{"class":144,"line":539},[142,1128,424],{"class":155},[142,1130,427],{"class":166},[142,1132,430],{"class":155},[142,1134,240],{"class":162},[142,1136,519],{"class":166},[142,1138,1139],{"class":144,"line":560},[142,1140,441],{"class":166},[142,1142,1143],{"class":144,"line":565},[142,1144,1145],{"class":148},"                \u002F\u002F 导航成功时，设置一次等待结束时刻\n",[142,1147,1148,1151],{"class":144,"line":577},[142,1149,1150],{"class":166},"                wait_deadline ",[142,1152,1153],{"class":155},"=\n",[142,1155,1156,1159,1161,1164,1167,1170,1172,1174,1176,1178,1181,1183,1186],{"class":144,"line":582},[142,1157,1158],{"class":162},"                    Clock",[142,1160,833],{"class":166},[142,1162,1163],{"class":162},"now",[142,1165,1166],{"class":166},"() ",[142,1168,1169],{"class":155},"+",[142,1171,830],{"class":162},[142,1173,833],{"class":166},[142,1175,836],{"class":162},[142,1177,833],{"class":166},[142,1179,1180],{"class":162},"seconds",[142,1182,359],{"class":166},[142,1184,1185],{"class":173},"2",[142,1187,1188],{"class":166},");\n",[142,1190,1191],{"class":144,"line":587},[142,1192,224],{"emptyLinePlaceholder":223},[142,1194,1195,1197,1199,1201],{"class":144,"line":593},[142,1196,447],{"class":166},[142,1198,309],{"class":155},[142,1200,163],{"class":162},[142,1202,1203],{"class":166},"::WAITING;\n",[142,1205,1206],{"class":144,"line":601},[142,1207,1208],{"class":166},"            } \n",[142,1210,1211,1214,1216,1218,1220,1222],{"class":144,"line":606},[142,1212,1213],{"class":155},"            else",[142,1215,548],{"class":155},[142,1217,427],{"class":166},[142,1219,430],{"class":155},[142,1221,240],{"class":162},[142,1223,557],{"class":166},[142,1225,1226],{"class":144,"line":612},[142,1227,441],{"class":166},[142,1229,1230,1232,1234,1236],{"class":144,"line":622},[142,1231,447],{"class":166},[142,1233,309],{"class":155},[142,1235,163],{"class":162},[142,1237,574],{"class":166},[142,1239,1240],{"class":144,"line":632},[142,1241,472],{"class":166},[142,1243,1244,1246],{"class":144,"line":646},[142,1245,478],{"class":155},[142,1247,598],{"class":166},[142,1249,1250],{"class":144,"line":651},[142,1251,224],{"emptyLinePlaceholder":223},[142,1253,1254,1256,1258],{"class":144,"line":662},[142,1255,407],{"class":155},[142,1257,163],{"class":162},[142,1259,1260],{"class":166},"::WAITING:\n",[142,1262,1263,1265,1267,1269,1271],{"class":144,"line":667},[142,1264,424],{"class":155},[142,1266,427],{"class":166},[142,1268,430],{"class":155},[142,1270,240],{"class":162},[142,1272,1273],{"class":166},"::WAIT_FINISHED) \n",[142,1275,1276],{"class":144,"line":674},[142,1277,441],{"class":166},[142,1279,1280,1282,1284,1286],{"class":144,"line":680},[142,1281,447],{"class":166},[142,1283,309],{"class":155},[142,1285,163],{"class":162},[142,1287,536],{"class":166},[142,1289,1291],{"class":144,"line":1290},62,[142,1292,472],{"class":166},[142,1294,1296,1298],{"class":144,"line":1295},63,[142,1297,478],{"class":155},[142,1299,598],{"class":166},[142,1301,1303],{"class":144,"line":1302},64,[142,1304,224],{"emptyLinePlaceholder":223},[142,1306,1308,1310,1312],{"class":144,"line":1307},65,[142,1309,407],{"class":155},[142,1311,163],{"class":162},[142,1313,619],{"class":166},[142,1315,1317,1319,1321],{"class":144,"line":1316},66,[142,1318,407],{"class":155},[142,1320,163],{"class":162},[142,1322,629],{"class":166},[142,1324,1326,1328,1330,1332,1334],{"class":144,"line":1325},67,[142,1327,424],{"class":155},[142,1329,427],{"class":166},[142,1331,430],{"class":155},[142,1333,240],{"class":162},[142,1335,643],{"class":166},[142,1337,1339],{"class":144,"line":1338},68,[142,1340,441],{"class":166},[142,1342,1344,1346,1348,1350],{"class":144,"line":1343},69,[142,1345,447],{"class":166},[142,1347,309],{"class":155},[142,1349,163],{"class":162},[142,1351,314],{"class":166},[142,1353,1355],{"class":144,"line":1354},70,[142,1356,472],{"class":166},[142,1358,1360,1362],{"class":144,"line":1359},71,[142,1361,478],{"class":155},[142,1363,598],{"class":166},[142,1365,1367],{"class":144,"line":1366},72,[142,1368,677],{"class":166},[142,1370,1372],{"class":144,"line":1371},73,[142,1373,683],{"class":166},[142,1375,1377],{"class":144,"line":1376},74,[142,1378,224],{"emptyLinePlaceholder":223},[142,1380,1382],{"class":144,"line":1381},75,[142,1383,1384],{"class":148},"\u002F\u002F 主循环或定时器周期性调用这个函数\n",[142,1386,1388,1390,1393],{"class":144,"line":1387},76,[142,1389,331],{"class":155},[142,1391,1392],{"class":162}," tick",[142,1394,701],{"class":166},[142,1396,1398],{"class":144,"line":1397},77,[142,1399,375],{"class":166},[142,1401,1403],{"class":144,"line":1402},78,[142,1404,1405],{"class":148},"    \u002F\u002F 只有处于等待状态，才检查时间\n",[142,1407,1409,1412,1415,1417,1419],{"class":144,"line":1408},79,[142,1410,1411],{"class":155},"    if",[142,1413,1414],{"class":166}," (current_state ",[142,1416,430],{"class":155},[142,1418,163],{"class":162},[142,1420,1421],{"class":166},"::WAITING) \n",[142,1423,1425],{"class":144,"line":1424},80,[142,1426,396],{"class":166},[142,1428,1430,1433,1436,1438,1440,1442,1444,1447],{"class":144,"line":1429},81,[142,1431,1432],{"class":155},"        if",[142,1434,1435],{"class":166}," (",[142,1437,1005],{"class":162},[142,1439,833],{"class":166},[142,1441,1163],{"class":162},[142,1443,1166],{"class":166},[142,1445,1446],{"class":155},">=",[142,1448,1449],{"class":166}," wait_deadline) \n",[142,1451,1453],{"class":144,"line":1452},82,[142,1454,1455],{"class":166},"        {\n",[142,1457,1459,1462,1464,1466],{"class":144,"line":1458},83,[142,1460,1461],{"class":162},"            handleEvent",[142,1463,359],{"class":166},[142,1465,362],{"class":162},[142,1467,1468],{"class":166},"::WAIT_FINISHED);\n",[142,1470,1472],{"class":144,"line":1471},84,[142,1473,1474],{"class":166},"        }\n",[142,1476,1478],{"class":144,"line":1477},85,[142,1479,677],{"class":166},[142,1481,1483],{"class":144,"line":1482},86,[142,1484,683],{"class":166},[16,1486,1487],{},"模拟调用过程：",[134,1489,1491],{"className":136,"code":1490,"language":138,"meta":24,"style":24},"handleEvent(Event::START);          \u002F\u002F 待机 → 导航中\nhandleEvent(Event::NAV_SUCCEEDED);  \u002F\u002F 导航中 → 等待，启动一次计时\n\n\u002F\u002F 接下来，主循环周期性调用tick()\ntick();  \u002F\u002F 未到结束时刻：保持WAITING\ntick();  \u002F\u002F 未到结束时刻：保持WAITING\n\n\u002F\u002F 2秒到期后的下一次检查\ntick();  \u002F\u002F 触发WAIT_FINISHED，进入COMPLETED\n",[115,1492,1493,1508,1522,1526,1531,1541,1549,1553,1558],{"__ignoreMap":24},[142,1494,1495,1498,1500,1502,1505],{"class":144,"line":145},[142,1496,1497],{"class":162},"handleEvent",[142,1499,359],{"class":166},[142,1501,362],{"class":162},[142,1503,1504],{"class":166},"::START);",[142,1506,1507],{"class":148},"          \u002F\u002F 待机 → 导航中\n",[142,1509,1510,1512,1514,1516,1519],{"class":144,"line":152},[142,1511,1497],{"class":162},[142,1513,359],{"class":166},[142,1515,362],{"class":162},[142,1517,1518],{"class":166},"::NAV_SUCCEEDED);",[142,1520,1521],{"class":148},"  \u002F\u002F 导航中 → 等待，启动一次计时\n",[142,1523,1524],{"class":144,"line":170},[142,1525,224],{"emptyLinePlaceholder":223},[142,1527,1528],{"class":144,"line":183},[142,1529,1530],{"class":148},"\u002F\u002F 接下来，主循环周期性调用tick()\n",[142,1532,1533,1536,1538],{"class":144,"line":194},[142,1534,1535],{"class":162},"tick",[142,1537,463],{"class":166},[142,1539,1540],{"class":148},"  \u002F\u002F 未到结束时刻：保持WAITING\n",[142,1542,1543,1545,1547],{"class":144,"line":205},[142,1544,1535],{"class":162},[142,1546,463],{"class":166},[142,1548,1540],{"class":148},[142,1550,1551],{"class":144,"line":214},[142,1552,224],{"emptyLinePlaceholder":223},[142,1554,1555],{"class":144,"line":220},[142,1556,1557],{"class":148},"\u002F\u002F 2秒到期后的下一次检查\n",[142,1559,1560,1562,1564],{"class":144,"line":227},[142,1561,1535],{"class":162},[142,1563,463],{"class":166},[142,1565,1566],{"class":148},"  \u002F\u002F 触发WAIT_FINISHED，进入COMPLETED\n",[1568,1569,1570],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":24,"searchDepth":152,"depth":152,"links":1572},[1573],{"id":14,"depth":152,"text":5,"children":1574},[1575],{"id":48,"depth":170,"text":48},"1200-0400-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-0100-you-xian-zhuang-tai-ji-fsm",{"title":5,"description":24},"wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","iqnzL7jq2GZv5EAjxdaZbsRRKgfQu0DLckIkBlTu4X8",[1589,1596,1602,1608,1614,1620,1626,1632,1638,1644,1650,1656,1662,1668,1674,1680,1686,1692,1698,1700,1706,1712,1718,1724,1730,1736,1742,1748,1754,1760,1766,1772,1778,1784,1790,1795,1801,1806,1812,1818,1824,1830,1836,1842,1848,1854,1860,1866,1872,1878,1884,1890,1896,1902,1908,1914,1920,1926,1932,1938,1944,1950,1956,1962,1968,1974,1980,1986,1992],{"path":1590,"stem":1591,"title":1592,"authors":1593,"date":1577,"chapterOrder":1594,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":1597,"stem":1598,"title":1599,"authors":1600,"date":1577,"chapterOrder":1601,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":1603,"stem":1604,"title":1605,"authors":1606,"date":1577,"chapterOrder":1607,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1609,"stem":1610,"title":1611,"authors":1612,"date":1577,"chapterOrder":1613,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":1615,"stem":1616,"title":1617,"authors":1618,"date":1577,"chapterOrder":1619,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1621,"stem":1622,"title":1623,"authors":1624,"date":1577,"chapterOrder":1625,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":1627,"stem":1628,"title":1629,"authors":1630,"date":1577,"chapterOrder":1631,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":1633,"stem":1634,"title":1635,"authors":1636,"date":1577,"chapterOrder":1637,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":1639,"stem":1640,"title":1641,"authors":1642,"date":1577,"chapterOrder":1643,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1645,"stem":1646,"title":1647,"authors":1648,"date":1577,"chapterOrder":1649,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1651,"stem":1652,"title":1653,"authors":1654,"date":1577,"chapterOrder":1655,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":1657,"stem":1658,"title":1659,"authors":1660,"date":1577,"chapterOrder":1661,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1663,"stem":1664,"title":1665,"authors":1666,"date":1577,"chapterOrder":1667,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1669,"stem":1670,"title":1671,"authors":1672,"date":1577,"chapterOrder":1673,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1675,"stem":1676,"title":1677,"authors":1678,"date":1577,"chapterOrder":1679,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":1681,"stem":1682,"title":1683,"authors":1684,"date":1577,"chapterOrder":1685,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1687,"stem":1688,"title":1689,"authors":1690,"date":1577,"chapterOrder":1691,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1693,"stem":1694,"title":1695,"authors":1696,"date":1577,"chapterOrder":1697,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":1584,"stem":1586,"title":5,"authors":1699,"date":1577,"chapterOrder":1576,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},[7],{"path":1701,"stem":1702,"title":1703,"authors":1704,"date":1577,"chapterOrder":1705,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1707,"stem":1708,"title":1709,"authors":1710,"date":1577,"chapterOrder":1711,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1713,"stem":1714,"title":1715,"authors":1716,"date":1577,"chapterOrder":1717,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1719,"stem":1720,"title":1721,"authors":1722,"date":1577,"chapterOrder":1723,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1725,"stem":1726,"title":1727,"authors":1728,"date":1577,"chapterOrder":1729,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1731,"stem":1732,"title":1733,"authors":1734,"date":1577,"chapterOrder":1735,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1737,"stem":1738,"title":1739,"authors":1740,"date":1577,"chapterOrder":1741,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1743,"stem":1744,"title":1745,"authors":1746,"date":1577,"chapterOrder":1747,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1749,"stem":1750,"title":1751,"authors":1752,"date":1577,"chapterOrder":1753,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1755,"stem":1756,"title":1757,"authors":1758,"date":1577,"chapterOrder":1759,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1761,"stem":1762,"title":1763,"authors":1764,"date":1577,"chapterOrder":1765,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1767,"stem":1768,"title":1769,"authors":1770,"date":1577,"chapterOrder":1771,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1773,"stem":1774,"title":1775,"authors":1776,"date":1577,"chapterOrder":1777,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1779,"stem":1780,"title":1781,"authors":1782,"date":1577,"chapterOrder":1783,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1785,"stem":1786,"title":1787,"authors":1788,"date":1577,"chapterOrder":1789,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1791,"stem":1792,"title":1757,"authors":1793,"date":1577,"chapterOrder":1794,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1796,"stem":1797,"title":1798,"authors":1799,"date":1577,"chapterOrder":1800,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1802,"stem":1803,"title":1757,"authors":1804,"date":1577,"chapterOrder":1805,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1807,"stem":1808,"title":1809,"authors":1810,"date":1577,"chapterOrder":1811,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1813,"stem":1814,"title":1815,"authors":1816,"date":1577,"chapterOrder":1817,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":1819,"stem":1820,"title":1821,"authors":1822,"date":1577,"chapterOrder":1823,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1825,"stem":1826,"title":1827,"authors":1828,"date":1577,"chapterOrder":1829,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1831,"stem":1832,"title":1833,"authors":1834,"date":1577,"chapterOrder":1835,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1837,"stem":1838,"title":1839,"authors":1840,"date":1577,"chapterOrder":1841,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1843,"stem":1844,"title":1845,"authors":1846,"date":1577,"chapterOrder":1847,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1849,"stem":1850,"title":1851,"authors":1852,"date":1577,"chapterOrder":1853,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1855,"stem":1856,"title":1857,"authors":1858,"date":1577,"chapterOrder":1859,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":1861,"stem":1862,"title":1863,"authors":1864,"date":1577,"chapterOrder":1865,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1867,"stem":1868,"title":1869,"authors":1870,"date":1577,"chapterOrder":1871,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1873,"stem":1874,"title":1875,"authors":1876,"date":1577,"chapterOrder":1877,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1879,"stem":1880,"title":1881,"authors":1882,"date":1577,"chapterOrder":1883,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1885,"stem":1886,"title":1887,"authors":1888,"date":1577,"chapterOrder":1889,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1891,"stem":1892,"title":1893,"authors":1894,"date":1577,"chapterOrder":1895,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1897,"stem":1898,"title":1899,"authors":1900,"date":1577,"chapterOrder":1901,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1903,"stem":1904,"title":1905,"authors":1906,"date":1577,"chapterOrder":1907,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":1909,"stem":1910,"title":1911,"authors":1912,"date":1577,"chapterOrder":1913,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1915,"stem":1916,"title":1917,"authors":1918,"date":1577,"chapterOrder":1919,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1921,"stem":1922,"title":1923,"authors":1924,"date":1577,"chapterOrder":1925,"chapterDepth":170,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1927,"stem":1928,"title":1929,"authors":1930,"date":1577,"chapterOrder":1931,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1933,"stem":1934,"title":1935,"authors":1936,"date":1577,"chapterOrder":1937,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1939,"stem":1940,"title":1941,"authors":1942,"date":1577,"chapterOrder":1943,"chapterDepth":152,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1945,"stem":1946,"title":1947,"authors":1948,"date":1577,"chapterOrder":1949,"chapterDepth":145,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1951,"stem":1952,"title":1953,"authors":1954,"date":1577,"chapterOrder":1955,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":1957,"stem":1958,"title":1959,"authors":1960,"date":1577,"chapterOrder":1961,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":1963,"stem":1964,"title":1965,"authors":1966,"date":1577,"chapterOrder":1967,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1969,"stem":1970,"title":1971,"authors":1972,"date":1577,"chapterOrder":1973,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\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":1975,"stem":1976,"title":1977,"authors":1978,"date":1577,"chapterOrder":1979,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":1981,"stem":1982,"title":1983,"authors":1984,"date":1577,"chapterOrder":1985,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":1987,"stem":1988,"title":1989,"authors":1990,"date":1577,"chapterOrder":1991,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":1582},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":1579,"stem":1993,"title":1994,"authors":1995,"date":1577,"chapterOrder":1996,"chapterDepth":1595,"docKey":1578,"docRoot":1579,"docTitle":1580,"isWikiDoc":223,"isWikiIndex":223},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[1998,2000,2003,2006],{"name":7,"image":1999},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":2001,"image":2002},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":2004,"image":2005},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":2007,"image":2008},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431903055]