[{"data":1,"prerenderedAt":1620},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-2000-velocity-smoother":3,"wiki-doc-items-2026-09-20-dao-hang":1387,"wiki:author-members":1608},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":211,"chapterOrder":1374,"date":1375,"description":35,"docKey":1376,"docRoot":1377,"docTitle":1378,"extension":1379,"isWikiDoc":1380,"isWikiIndex":1381,"meta":1382,"navigation":1380,"path":1383,"seo":1384,"stem":1385,"wikiDepth":211,"__hash__":1386},"wiki\u002Fwiki\u002F2026-09-20-导航\u002F0500-2000-velocity_smoother.md","velocity_smoother（速度限幅与加减速平滑）",[7],"董佳辉",{"type":9,"value":10,"toc":1368},"minimark",[11,15,20,28,39,53,175,194,197,200,419,426,431,435,592,595,600,608,615,622,625,629,637,640,643,647,655,658,696,699,706,710,713,872,875,879,895,901,908,911,915,918,924,932,935,938,942,945,1032,1035,1039,1047,1050,1058,1061,1068,1071,1075,1078,1167,1170,1174,1182,1185,1188,1192,1200,1208,1211,1214,1217,1221,1225,1233,1322,1330,1333,1336,1364],[12,13,5],"h2",{"id":14},"velocity_smoother速度限幅与加减速平滑",[16,17,19],"h3",{"id":18},"实车先看平滑哪一路速度反馈来自哪里","实车先看：平滑哪一路速度、反馈来自哪里",[21,22,23,27],"p",{},[24,25,26],"strong",{},"当前velocity_smoother处理controller_server输出的速度指令，逐轴限目标速度、限速度变化，再处理死区。OPEN_LOOP使用上一轮内部指令作当前速度，不用里程计实测速度；scale_velocities=False仍会限速和限加减速。"," 本节点处理Twist，不修改规划路径，也不查询代价地图判断碰撞。",[29,30,36],"pre",{"className":31,"code":33,"language":34,"meta":35},[32],"language-text","普通路径跟踪，两种navigation_launch分支相同：\n    controller_server／OmniPID\n        → cmd_vel_controller\n        → velocity_smoother\n            ├─ 最新目标速度先夹到各轴min／max范围\n            ├─ OPEN_LOOP：以内部last_cmd作为当前速度\n            ├─ 按加／减速参数约束本轮变化\n            └─ 内部记录 → 应用死区 → 发布\n        → cmd_vel_nav2_result\n        → fake_vel_transform：换平移轴，再加cmd_spin\n        → cmd_vel → 串口／执行端\n\n恢复行为：\n    组件分支behavior_server → cmd_vel_nav2_result，绕过平滑器\n    独立分支behavior_server → namespace\u002Fcmd_vel，另有接线问题\n","text","",[37,38,33],"code",{"__ignoreMap":35},[21,40,41,42,47,48,52],{},"当前launch把平滑器内部cmd_vel订阅重映射为cmd_vel_controller，把cmd_vel_smoothed发布重映射为cmd_vel_nav2_result；不是直接套用教程中的cmd_vel_nav→cmd_vel名称。恢复与下游自旋的限速条件另见",[43,44,46],"a",{"href":45},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1800-behavior-server","behavior_server","和",[43,49,51],{"href":50},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0600-fake-vel-transform","fake_vel_transform","。",[54,55,56,72],"table",{},[57,58,59],"thead",{},[60,61,62,66,69],"tr",{},[63,64,65],"th",{},"实车上看到的现象",[63,67,68],{},"先核对什么",[63,70,71],{},"当前配置怎样理解",[73,74,75,87,98,109,120,131,142,153,164],"tbody",{},[60,76,77,81,84],{},[78,79,80],"td",{},"认为False关闭了整个平滑功能",[78,82,83],{},"scale_velocities控制的分支",[78,85,86],{},"False只关闭统一比例的变化量缩放，各轴仍限幅与限加减速",[60,88,89,92,95],{},[78,90,91],{},"以为min_velocity要求至少2.5 m\u002Fs才动",[78,93,94],{},"带符号的速度范围",[78,96,97],{},"-2.5是负向下界，0和小的正／负速度都在允许范围内",[60,99,100,103,106],{},[78,101,102],{},"起步或转向时方向暂时与目标不一致",[78,104,105],{},"各轴独立约束及目标夹紧",[78,107,108],{},"False各轴分别变化；True主要同比缩放Δ速度，也不能保证所有情况下保持原始目标方向",[60,110,111,114,117],{},[78,112,113],{},"修改odom_duration后当前输出没变",[78,115,116],{},"feedback是否仍为OPEN_LOOP",[78,118,119],{},"正常初始化不建立反馈里程计订阅，窗口不参与当前速度估计",[60,121,122,125,128],{},[78,123,124],{},"收到零指令后还缓慢降速",[78,126,127],{},"零目标也经过减速约束",[78,129,130],{},"当前零指令不是直接透传的急停信号",[60,132,133,136,139],{},[78,134,135],{},"指令断流满1秒后没有立刻归零",[78,137,138],{},"超时先置零目标，再减速",[78,140,141],{},"1 s是开始超时处理的门槛，不是整个停车时间",[60,143,144,147,150],{},[78,145,146],{},"设置非零死区后，小速度直接跳到某值",[78,148,149],{},"死区应用顺序和内部last_cmd",[78,151,152],{},"先记内部平滑值，再把小幅输出置零；死区切换可造成发布值跳变",[60,154,155,158,161],{},[78,156,157],{},"平滑器角速度没超过3，最终角速度却更大",[78,159,160],{},"下游cmd_spin相加",[78,162,163],{},"3 rad\u002Fs约束本输入目标，不约束相加后的最终总量",[60,165,166,169,172],{},[78,167,168],{},"提高频率，以为每秒加速度也必须提高",[78,170,171],{},"每轮步长和定时器节拍",[78,173,174],{},"每轮变化量按加速度／频率计算；名义每秒限制保持相同，离散步长更小",[21,176,177,178,181,182,188,189],{},"本次安装的nav2_velocity_smoother和nav2_util均为",[24,179,180],{},"1.1.20","。VelocitySmoother与OdomSmoother安装头文件匹配该版本，平滑器库存在；本页依据对应官方源码及当前工程接线说明，不把后续版本的TwistStamped或其他参数直接套入。",[43,183,187],{"href":184,"rel":185},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp",[186],"nofollow","平滑器源码","、",[43,190,193],{"href":191,"rel":192},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_util\u002Fsrc\u002Fodometry_utils.cpp",[186],"里程计窗口源码",[16,195,196],{"id":196},"参数",[21,198,199],{},"下面原样保留发送的12项参数。源码与安装副本的reality段一致；simulation段只有use_sim_time=True不同。本次只写文档，未改工程配置或运行参数。",[29,201,205],{"className":202,"code":203,"language":204,"meta":35,"style":35},"language-yaml shiki shiki-themes github-light github-dark","velocity_smoother:\n  ros__parameters:\n    use_sim_time: False\n    smoothing_frequency: 20.0\n    scale_velocities: False\n    feedback: \"OPEN_LOOP\"\n    max_velocity: [2.5, 2.5, 3.0]\n    min_velocity: [-2.5, -2.5, -3.0]\n    max_accel: [4.5, 4.5, 5.0]\n    max_decel: [-4.5, -4.5, -5.0]\n    odom_topic: \"odometry\"\n    odom_duration: 0.1\n    deadband_velocity: [0.0, 0.0, 0.0]\n    velocity_timeout: 1.0\n","yaml",[37,206,207,220,228,241,252,262,274,299,321,343,365,376,387,408],{"__ignoreMap":35},[208,209,212,216],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"s9eBZ","velocity_smoother",[208,217,219],{"class":218},"sVt8B",":\n",[208,221,223,226],{"class":210,"line":222},2,[208,224,225],{"class":214},"  ros__parameters",[208,227,219],{"class":218},[208,229,231,234,237],{"class":210,"line":230},3,[208,232,233],{"class":214},"    use_sim_time",[208,235,236],{"class":218},": ",[208,238,240],{"class":239},"sj4cs","False\n",[208,242,244,247,249],{"class":210,"line":243},4,[208,245,246],{"class":214},"    smoothing_frequency",[208,248,236],{"class":218},[208,250,251],{"class":239},"20.0\n",[208,253,255,258,260],{"class":210,"line":254},5,[208,256,257],{"class":214},"    scale_velocities",[208,259,236],{"class":218},[208,261,240],{"class":239},[208,263,265,268,270],{"class":210,"line":264},6,[208,266,267],{"class":214},"    feedback",[208,269,236],{"class":218},[208,271,273],{"class":272},"sZZnC","\"OPEN_LOOP\"\n",[208,275,277,280,283,286,289,291,293,296],{"class":210,"line":276},7,[208,278,279],{"class":214},"    max_velocity",[208,281,282],{"class":218},": [",[208,284,285],{"class":239},"2.5",[208,287,288],{"class":218},", ",[208,290,285],{"class":239},[208,292,288],{"class":218},[208,294,295],{"class":239},"3.0",[208,297,298],{"class":218},"]\n",[208,300,302,305,307,310,312,314,316,319],{"class":210,"line":301},8,[208,303,304],{"class":214},"    min_velocity",[208,306,282],{"class":218},[208,308,309],{"class":239},"-2.5",[208,311,288],{"class":218},[208,313,309],{"class":239},[208,315,288],{"class":218},[208,317,318],{"class":239},"-3.0",[208,320,298],{"class":218},[208,322,324,327,329,332,334,336,338,341],{"class":210,"line":323},9,[208,325,326],{"class":214},"    max_accel",[208,328,282],{"class":218},[208,330,331],{"class":239},"4.5",[208,333,288],{"class":218},[208,335,331],{"class":239},[208,337,288],{"class":218},[208,339,340],{"class":239},"5.0",[208,342,298],{"class":218},[208,344,346,349,351,354,356,358,360,363],{"class":210,"line":345},10,[208,347,348],{"class":214},"    max_decel",[208,350,282],{"class":218},[208,352,353],{"class":239},"-4.5",[208,355,288],{"class":218},[208,357,353],{"class":239},[208,359,288],{"class":218},[208,361,362],{"class":239},"-5.0",[208,364,298],{"class":218},[208,366,368,371,373],{"class":210,"line":367},11,[208,369,370],{"class":214},"    odom_topic",[208,372,236],{"class":218},[208,374,375],{"class":272},"\"odometry\"\n",[208,377,379,382,384],{"class":210,"line":378},12,[208,380,381],{"class":214},"    odom_duration",[208,383,236],{"class":218},[208,385,386],{"class":239},"0.1\n",[208,388,390,393,395,398,400,402,404,406],{"class":210,"line":389},13,[208,391,392],{"class":214},"    deadband_velocity",[208,394,282],{"class":218},[208,396,397],{"class":239},"0.0",[208,399,288],{"class":218},[208,401,397],{"class":239},[208,403,288],{"class":218},[208,405,397],{"class":239},[208,407,298],{"class":218},[208,409,411,414,416],{"class":210,"line":410},14,[208,412,413],{"class":214},"    velocity_timeout",[208,415,236],{"class":218},[208,417,418],{"class":239},"1.0\n",[21,420,421,422,425],{},"所有三元素数组顺序都是**",[208,423,424],{},"x，y，theta","**，对应Twist的linear.x、linear.y、angular.z。前两项是平移，第三项是绕z轴的旋转；theta这一项不是以rad为单位的目标角度。",[427,428,430],"h4",{"id":429},"ros__parameters时钟频率与反馈方式","ros__parameters（时钟、频率与反馈方式）",[432,433,434],"h5",{"id":434},"参数表",[54,436,437,465],{},[57,438,439],{},[60,440,441,444,447,450,453,456,459,462],{},[63,442,443],{},"参数名",[63,445,446],{},"当前值",[63,448,449],{},"单位",[63,451,452],{},"实车处理建议",[63,454,455],{},"作用",[63,457,458],{},"调大效果",[63,460,461],{},"调小效果",[63,463,464],{},"生效条件／备注",[73,466,467,499,532,561],{},[60,468,469,474,480,483,488,491,494,496],{},[78,470,471],{},[37,472,473],{},"use_sim_time",[78,475,476,479],{},[37,477,478],{},"False","；仿真True",[78,481,482],{},"不适用，布尔",[78,484,485],{},[24,486,487],{},"上实物前必须核对并正确配置",[78,489,490],{},"选择now()及输入超时比较的ROS时间域",[78,492,493],{},"不适用",[78,495,493],{},[78,497,498],{},"launch重写已有键；平滑定时器用wall timer，True不会把它变为仿真时钟定时器",[60,500,501,506,512,515,520,523,526,529],{},[78,502,503],{},[37,504,505],{},"smoothing_frequency",[78,507,508,511],{},[37,509,510],{},"20.0","；源码默认20.0",[78,513,514],{},"Hz，平滑定时回调目标频率",[78,516,517],{},[24,518,519],{},"实物运行时重点观察，有问题再针对性调整",[78,521,522],{},"决定输出节拍及每轮加减速变化上限",[78,524,525],{},"名义每轮允许变化更小、回调更密、计算和发布增加",[78,527,528],{},"名义每轮变化更大、命令更稀、离散过渡更粗",[78,530,531],{},"当前名义50 ms／轮，线速度步长0.225 m\u002Fs、角速度步长0.25 rad\u002Fs；用配置频率而非实测dt；必须为有效正数",[60,533,534,539,544,546,551,554,556,558],{},[78,535,536],{},[37,537,538],{},"scale_velocities",[78,540,541,543],{},[37,542,478],{},"；源码默认False",[78,545,482],{},[78,547,548],{},[24,549,550],{},"根据实际功能需求开启或设置",[78,552,553],{},"是否先选统一eta同比缩放各轴目标变化量，再分别约束",[78,555,493],{},[78,557,493],{},[78,559,560],{},"False仍逐轴平滑；True主要协调Δvx、Δvy、Δwz，不是始终保持最终速度方向；本版没有动态更新该布尔成员的回调分支",[60,562,563,568,574,577,582,585,587,589],{},[78,564,565],{},[37,566,567],{},"feedback",[78,569,570,573],{},[37,571,572],{},"\"OPEN_LOOP\"","；源码默认同值",[78,575,576],{},"不适用，模式名称",[78,578,579],{},[24,580,581],{},"通常保持当前值，不作为优先调试项",[78,583,584],{},"选择当前速度来自内部last_cmd或里程计平均Twist",[78,586,493],{},[78,588,493],{},[78,590,591],{},"OPEN_LOOP使用死区前内部指令；CLOSED_LOOP使用OdomSmoother；改闭环前须核对速度对象、参考系、时间、频率和数据新鲜度",[432,593,594],{"id":594},"参数详解",[596,597,599],"h6",{"id":598},"smoothing_frequency定时器步长与上游控制频率","smoothing_frequency（定时器、步长与上游控制频率）",[21,601,602,603],{},"Active阶段用wall timer触发smootherTimer。当前1000／20=50 ms；定时器周期转换为整数毫秒，其他频率可能有截断，例如33 Hz会创建30 ms周期，而变化上限仍按配置33计算。因此不能把任何设置值都视为精确实测频率。",[43,604,607],{"href":605,"rel":606},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L120",[186],"定时器创建",[21,609,610,611,614],{},"每轮允许变化按参数除以smoothing_frequency计算，",[24,612,613],{},"没有根据上次实际回调时间测dt","。负载导致周期延迟时，真实每秒的变化过程会受影响；这也是指令平滑约束，不代表实测机械加速度已被限制到同样数值。",[21,616,617,618],{},"当前controller_server也为20 Hz，所以两者名义频率相同；提高平滑频率可在两条控制指令之间继续生成过渡输出，但不会提高规划／路径跟踪本身的计算频率。两定时循环也没有自动锁定相位，不能保证每轮输出都对应刚收到的一条新控制指令。",[43,619,621],{"href":620},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1100-controller-server","控制器频率",[21,623,624],{},"例如提高到100 Hz而保持加速度不变，名义线速度每轮上限从0.225降为0.045 m\u002Fs，角速度从0.25降为0.05 rad\u002Fs；理想每秒仍对应4.5 m\u002Fs²和5 rad\u002Fs²。这是参数计算，未改变当前频率或测量输出。",[596,626,628],{"id":627},"open_loop内部命令反馈不等于机器人实测速度","OPEN_LOOP（内部命令反馈，不等于机器人实测速度）",[21,630,631,632],{},"OPEN_LOOP把上一轮last_cmd作为本轮current速度，再向最新目标靠近。当前死区为0时，它等于上一轮发布的三个有效分量；若以后启用非零死区，last_cmd记录在死区置零之前，就不一定等于实际发布值。",[43,633,636],{"href":634,"rel":635},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L246",[186],"反馈选择与记录顺序",[21,638,639],{},"这种模式默认车辆能跟上此前指令，不能从中知道打滑、卡住、驱动限流或真实速度滞后，也不会因收到odometry自动切成实测闭环。当前启动读取odom_topic和odom_duration，但不创建OdomSmoother，不用它们参与current速度。",[21,641,642],{},"CLOSED_LOOP改用窗口内里程计Twist均值；这里的“闭环”是平滑器以实测反馈为限变化的起点，并非额外建立一个车轮速度PID。反馈频率低或一直为0时，每轮可能都从同一个反馈速度重新算，不能像开环那样自然累计已发命令。",[596,644,646],{"id":645},"scale_velocities缩放速度变化量不是关闭限幅","scale_velocities（缩放速度变化量，不是关闭限幅）",[21,648,649,650],{},"先把目标各轴夹到min／max范围，再计算dv=目标−current。False令eta=1，各轴分别夹紧自己的dv；True从受约束轴中找更严格的统一比例eta，先缩放全部dv，再按各轴自己的约束夹紧。",[43,651,654],{"href":652,"rel":653},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L263",[186],"eta与逐轴约束",[21,656,657],{},"按当前频率、从零起步、目标已在速度范围内且死区为0，举例：",[54,659,660,676],{},[57,661,662],{},[60,663,664,670,673],{},[63,665,666,667],{},"请求目标",[208,668,669],{},"vx，vy，wz",[63,671,672],{},"scale_velocities=False首轮",[63,674,675],{},"scale_velocities=True首轮",[73,677,678],{},[60,679,680,685,690],{},[78,681,682],{},[208,683,684],{},"1.0，0.1，1.0",[78,686,687],{},[208,688,689],{},"0.225，0.1，0.25",[78,691,692,693],{},"eta=0.225，得到",[208,694,695],{},"0.225，0.0225，0.225",[21,697,698],{},"前两项单位m\u002Fs，第三项rad\u002Fs。False能让小需求轴先达到目标，但首轮平移方向不按原请求的10∶1比例；True在此例协调变化比例，代价是其他轴也更慢接近。这是源码公式示例，不是车辆轨迹测试。",[21,700,701,702,705],{},"current不为0时，同比的是",[24,703,704],{},"从current到目标的变化向量","，不是直接把整个目标速度乘同一个数。先行的各轴绝对速度夹紧、后续逐轴夹紧和死区也可能改变最终比例，不能把True理解为任何情况下都保证原始速度方向不变。",[427,707,709],{"id":708},"速度与加减速数组每轴范围带符号下界","速度与加减速数组（每轴范围、带符号下界）",[432,711,434],{"id":712},"参数表-1",[54,714,715,735],{},[57,716,717],{},[60,718,719,721,723,725,727,729,731,733],{},[63,720,443],{},[63,722,446],{},[63,724,449],{},[63,726,452],{},[63,728,455],{},[63,730,458],{},[63,732,461],{},[63,734,464],{},[73,736,737,770,802,839],{},[60,738,739,744,749,754,758,761,764,767],{},[78,740,741],{},[37,742,743],{},"max_velocity",[78,745,746],{},[37,747,748],{},"[2.5, 2.5, 3.0]",[78,750,751],{},[208,752,753],{},"m\u002Fs，m\u002Fs，rad\u002Fs",[78,755,756],{},[24,757,487],{},[78,759,760],{},"设置各轴目标指令的上界",[78,762,763],{},"正上界提高时允许更大的正向目标",[78,765,766],{},"正上界减小时更早夹紧正向目标",[78,768,769],{},"独立轴范围，不是平移合速度2.5；只约束经过本节点的目标，不能限制恢复旁路或下游附加自旋",[60,771,772,777,782,786,790,793,796,799],{},[78,773,774],{},[37,775,776],{},"min_velocity",[78,778,779],{},[37,780,781],{},"[-2.5, -2.5, -3.0]",[78,783,784],{},[208,785,753],{},[78,787,788],{},[24,789,487],{},[78,791,792],{},"设置各轴目标指令的带符号下界",[78,794,795],{},"负值向0提高时，允许的反向幅值减小",[78,797,798],{},"负值更负时，允许的反向幅值增大",[78,800,801],{},"不是克服静摩擦的最低非零速度；当前零、小幅正负都允许；须与每轴max保持min≤max",[60,803,804,809,814,819,823,826,829,832],{},[78,805,806],{},[37,807,808],{},"max_accel",[78,810,811],{},[37,812,813],{},"[4.5, 4.5, 5.0]",[78,815,816],{},[208,817,818],{},"m\u002Fs²，m\u002Fs²，rad\u002Fs²",[78,820,821],{},[24,822,519],{},[78,824,825],{},"同号且目标幅值不小时，限制每轮速度变化",[78,827,828],{},"允许更快增速、过渡更短，驱动能力需匹配",[78,830,831],{},"起步／增速更缓，可能增加跟踪滞后",[78,833,834,835,838],{},"各活动轴用非负值；当前每轮±",[208,836,837],{},"0.225,0.225,0.25","；不是车辆jerk限制，也不是PID增益",[60,840,841,846,851,856,860,863,866,869],{},[78,842,843],{},[37,844,845],{},"max_decel",[78,847,848],{},[37,849,850],{},"[-4.5, -4.5, -5.0]",[78,852,853,855],{},[208,854,818],{},"，带负号",[78,857,858],{},[24,859,519],{},[78,861,862],{},"目标幅值减小或反向时，限制每轮速度变化",[78,864,865],{},"负值向0提高时，减速幅值变小、降速更慢",[78,867,868],{},"负值更负时，减速幅值变大、降速更快",[78,870,871],{},"本版要求非正；当前每轮幅值与加速相同；零目标和超时置零都经过它，不宜把数值更大理解为制动更强",[432,873,594],{"id":874},"参数详解-1",[596,876,878],{"id":877},"maxmin_velocityxy独立夹紧不是合速度上限","max／min_velocity（x、y独立夹紧，不是合速度上限）",[21,880,881,882,885,886,889,890],{},"当前目标限制为vx、vy各在",[208,883,884],{},"-2.5,2.5"," m\u002Fs，wz在",[208,887,888],{},"-3,3"," rad\u002Fs。例如目标(vx,vy)=(2.5,2.5)没有超出任何一轴，平移模长却为sqrt(2.5²+2.5²)≈3.54 m\u002Fs。仅本平滑器的这组数组不能推出模长≤2.5。",[43,891,894],{"href":892,"rel":893},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L254",[186],"目标夹紧",[21,896,897,898],{},"当前OmniPID另有标量平移速度范围和计算过程；普通跟踪实际能达到多少要看上游输出。这里的3.54只是本数组允许的目标组合，不是证明当前PID或实车已经输出该速度。min_velocity中的-2.5允许负向运动，没有把0.1 m\u002Fs之类的小速度抬到2.5 m\u002Fs。",[43,899,900],{"href":620},"PID速度约束",[21,902,903,904,907],{},"速度范围在",[24,905,906],{},"平滑输入的坐标轴","上施加。当前平移指令按gimbal_yaw_fake约定，fake_vel_transform后再换到实际gimbal_yaw；平面纯旋转换轴保持平移模长，但不能保证转换后每个分量仍满足同一轴上界。角速度又会加cmd_spin，最终值不由本数组统一夹紧。",[21,909,910],{},"源码夹的是目标，没有在加减速计算后再做一次最终速度夹紧。当前开环、固定边界且内部初值在范围内时，会逐步靠近范围内目标；若改闭环且反馈本身超界，或运行中缩小边界，过渡输出仍可能暂时超出新界。例如current.vx=3、目标夹到2.5、20 Hz减速步长0.225时，本轮得2.775 m\u002Fs。此例说明实现顺序，未运行闭环或改变限值。",[596,912,914],{"id":913},"max_accel与max_decel符号加速判据与反向","max_accel与max_decel（符号、加速判据与反向）",[21,916,917],{},"每轴依据下面条件选择变化区间：",[29,919,922],{"className":920,"code":921,"language":34,"meta":35},[32],"若 abs(v_target) >= abs(v_current)，且 v_current × v_target >= 0：\n    使用加速：Δv ∈ [-max_accel\u002Ff，+max_accel\u002Ff]\n否则：\n    使用减速：Δv ∈ [max_decel\u002Ff，-max_decel\u002Ff]\n\nv_next = v_current + clamp(eta × (v_target-v_current)，Δv下界，Δv上界)\n",[37,923,921],{"__ignoreMap":35},[21,925,926,927],{},"f为配置的smoothing_frequency。负方向增速仍使用正max_accel来定义变化幅值；正方向减速则使用负max_decel，不是按“正vx用accel、负vx用decel”区分。跨零反向的这一轮先按减速区间处理，之后是否改用加速由下一轮current和目标重新判断。",[43,928,931],{"href":929,"rel":930},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L208",[186],"逐轴公式",[21,933,934],{},"当前名义50 ms一轮：线速度最多变0.225 m\u002Fs，角速度最多变0.25 rad\u002Fs。从零到单轴2.5 m\u002Fs至少需要12次名义更新；从零到3 rad\u002Fs也需要12次，约0.6 s周期尺度。上游目标持续变化、其他轴统一缩放、定时器相位及实际驱动反馈会改变具体过程；这里不是实测起步时间。",[21,936,937],{},"max_decel从-4.5改成-2，虽然数值提高，幅值却减小，减速更慢；改成-6则幅值更大。应按车辆制动能力和任务响应调整，不能随手去掉负号。当前OmniPID还按0.9 m\u002Fs²限制标量速度变化，它与本逐轴4.5 m\u002Fs²不是同一变量；最终命令受串联过程共同影响，恢复旁路也不自动受到两者的相同约束。",[427,939,941],{"id":940},"里程计反馈当前open_loop不参与估计","里程计反馈（当前OPEN_LOOP不参与估计）",[432,943,434],{"id":944},"参数表-2",[54,946,947,967],{},[57,948,949],{},[60,950,951,953,955,957,959,961,963,965],{},[63,952,443],{},[63,954,446],{},[63,956,449],{},[63,958,452],{},[63,960,455],{},[63,962,458],{},[63,964,461],{},[63,966,464],{},[73,968,969,1000],{},[60,970,971,976,982,985,990,993,995,997],{},[78,972,973],{},[37,974,975],{},"odom_topic",[78,977,978,981],{},[37,979,980],{},"\"odometry\"","；源码默认odom",[78,983,984],{},"不适用，反馈话题名称",[78,986,987],{},[24,988,989],{},"当前运行不使用这个参数，暂不调整",[78,991,992],{},"CLOSED_LOOP时供OdomSmoother订阅Odometry速度",[78,994,493],{},[78,996,493],{},[78,998,999],{},"当前开环启动不建立该反馈订阅；闭环直接读twist，不差分pose、不做TF变换；动态改此键仍会重建一个OdomSmoother，但开环current分支不会改用它",[60,1001,1002,1007,1013,1016,1020,1023,1026,1029],{},[78,1003,1004],{},[37,1005,1006],{},"odom_duration",[78,1008,1009,1012],{},[37,1010,1011],{},"0.1","；平滑器声明默认0.1",[78,1014,1015],{},"s，反馈里程计历史窗口",[78,1017,1018],{},[24,1019,989],{},[78,1021,1022],{},"CLOSED_LOOP按消息时间戳保留窗口并对速度做样本均值",[78,1024,1025],{},"闭环通常平均更多样本、减弱波动，但反馈延迟可能增大",[78,1027,1028],{},"闭环通常平均更少样本、响应更快，噪声影响可能更大",[78,1030,1031],{},"不是输入超时或输出延迟固定值；当前开环不参与current；具体样本数由里程计频率／时间戳决定",[432,1033,594],{"id":1034},"参数详解-2",[596,1036,1038],{"id":1037},"odom_duration消息窗口中的样本平均","odom_duration（消息窗口中的样本平均）",[21,1040,1041,1042],{},"CLOSED_LOOP才在配置时创建OdomSmoother，直接累加Odometry.twist.twist，再除以保留的消息数。新消息到来时按“最新消息时间戳−最早消息时间戳>odom_duration”移除旧消息，因此窗口以消息stamp衡量，且边界等于0.1 s时仍保留。不是连续时间积分平均，也不按协方差加权。",[43,1043,1046],{"href":1044,"rel":1045},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_util\u002Fsrc\u002Fodometry_utils.cpp#L60",[186],"窗口与均值",[21,1048,1049],{},"例如时间戳严格等间隔20 ms且稳定收包时，0.1 s窗口名义可保留6个样本（含两端）；实际时间戳抖动会改变数量，不是固定五帧。odom_duration=0.1也不表示等待0.1 s收满才允许输出。",[21,1051,1052,1053],{},"窗口只在收到新里程计时更新；getTwist返回缓存，没有按now检查其是否过期。里程计断流不由velocity_timeout检测，后者只检测速度指令断流；因此切换闭环前必须另行核对反馈新鲜度。当前开环不受这条里程计缓存分支影响。",[43,1054,1057],{"href":1055,"rel":1056},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_util\u002Finclude\u002Fnav2_util\u002Fodometry_utils.hpp#L75",[186],"缓存读取",[596,1059,1060],{"id":1060},"当前odometry不能未经核对就直接作为闭环真值",[21,1062,1063,1064],{},"当前发布者sensor_scan_generation给出的是gimbal_yaw位姿及其差分Twist，平移差分在odom轴上计算，时间分母使用回调steady_clock，还存在首帧处理问题；它不等于已经验证的底盘速度测量。平面条件下odom轴可能与gimbal_yaw_fake输入轴近似一致，也不能因此跳过时间、原点和速度对象核对。",[43,1065,1067],{"href":1066},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0300-sensor-scan-generation","上游速度实现与问题",[21,1069,1070],{},"尤其angular.z可能包含实际云台独立yaw运动，而平滑器的导航旋转分量与下游附加底盘自旋又是不同来源。OdomSmoother不会根据child_frame_id自动换系或分离这些角运动；切成CLOSED_LOOP前，应明确反馈的是哪个实体、哪个参考点及哪一套轴下的速度。当前保持开环不意味着这些上游问题已经被修复。",[427,1072,1074],{"id":1073},"死区与输入超时低速置零超时后减速","死区与输入超时（低速置零、超时后减速）",[432,1076,434],{"id":1077},"参数表-3",[54,1079,1080,1100],{},[57,1081,1082],{},[60,1083,1084,1086,1088,1090,1092,1094,1096,1098],{},[63,1085,443],{},[63,1087,446],{},[63,1089,449],{},[63,1091,452],{},[63,1093,455],{},[63,1095,458],{},[63,1097,461],{},[63,1099,464],{},[73,1101,1102,1135],{},[60,1103,1104,1109,1114,1119,1123,1126,1129,1132],{},[78,1105,1106],{},[37,1107,1108],{},"deadband_velocity",[78,1110,1111,573],{},[37,1112,1113],{},"[0.0, 0.0, 0.0]",[78,1115,1116,1118],{},[208,1117,753],{},"，速度幅值阈值",[78,1120,1121],{},[24,1122,581],{},[78,1124,1125],{},"将平滑结果中绝对值严格小于阈值的分量置零",[78,1127,1128],{},"更多低速分量被压为0，可能减少微动，也可能丢失小幅指令",[78,1130,1131],{},"保留更多小幅输出，低速噪声／驱动能力需观察",[78,1133,1134],{},"当前全0不剔除非零小速度；不是Δ速度噪声门槛，也不会把小速度抬高到最小值；阈值按各轴幅值配置",[60,1136,1137,1142,1148,1151,1155,1158,1161,1164],{},[78,1138,1139],{},[37,1140,1141],{},"velocity_timeout",[78,1143,1144,1147],{},[37,1145,1146],{},"1.0","；源码默认1.0",[78,1149,1150],{},"s，从最后有效Twist接收起算的ROS时长",[78,1152,1153],{},[24,1154,519],{},[78,1156,1157],{},"当now−last_command_time严格超过此值时，把目标改为0并减速",[78,1159,1160],{},"可容忍更长指令间断，也更久保留旧目标",[78,1162,1163],{},"更快触发降速，也更易受正常抖动触发",[78,1165,1166],{},"不是收到零指令后的等待时间；不检测里程计／串口断流；零目标仍经过max_decel，不保证1秒立刻停车",[432,1168,594],{"id":1169},"参数详解-3",[596,1171,1173],{"id":1172},"deadband_velocity比较速度绝对值不是相邻消息差","deadband_velocity（比较速度绝对值，不是相邻消息差）",[21,1175,1176,1177],{},"源码先计算受加减速约束的结果并写入last_cmd，再对发布结果做abs(v)\u003Cdeadband置零。当前全0时，不会因为“速度变化很小”而忽略消息，也不改变任意非零小速度；等于阈值的分量不被置零。",[43,1178,1181],{"href":1179,"rel":1180},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L288",[186],"死区处理顺序",[21,1183,1184],{},"若以后把x死区设0.3 m\u002Fs，按当前开环步长、从零朝1 m\u002Fs起步：第一轮内部0.225而发布0，第二轮内部0.45而发布0.45。这会使发布值从0直接跳到0.45，不能据内部0.225步长宣称死区后的每轮输出仍严格遵守同一变化上限。此为顺序计算例，未改当前全0死区。",[21,1186,1187],{},"所以死区适合在确认驱动最低可执行速度、微动现象和到点需求后再设置；它不会增加定位精度，也不是控制器的min_x／min_y_velocity_threshold。控制器那些门槛处理输入里程计，当前这个门槛处理平滑后的发布速度。",[596,1189,1191],{"id":1190},"velocity_timeout先等待门槛再把零当目标平滑","velocity_timeout（先等待门槛，再把零当目标平滑）",[21,1193,1194,1195],{},"收到有效Twist时保存目标并把last_command_time更新为接收时的now；NaN或Inf消息被拒绝，不刷新这个计时。Twist本身没有时间戳，因此这里测的是接收间隔，不是原始指令生成时刻或网络总延迟。",[43,1196,1199],{"href":1197,"rel":1198},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L168",[186],"输入回调",[21,1201,1202,1203],{},"没有收到过任何指令时，定时回调直接返回，不持续发布零。收到指令后，即使暂时没有新消息，也继续按最新目标平滑；当ROS时间差严格>1 s，在某次回调把command改为零，再按当前减速参数生成输出。显式收到零指令则立即把它作为新目标，不先等待这1秒。",[43,1204,1207],{"href":1205,"rel":1206},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L229",[186],"超时分支",[21,1209,1210],{},"例如超时触发时内部单轴速度为2.5 m\u002Fs，当前开环、死区0、20 Hz和减速幅值4.5下，需要12次名义减速更新才能归零，约0.6 s周期尺度。加上前面的1 s门槛与定时相位，不能写成“失去输入1秒内必定停住”；物理停车还受执行端影响。本例是离散公式换算，不是断流实测。",[21,1212,1213],{},"超时后内部last_cmd已精确为零或stopped=True时，函数直接返回，不再持续发布零。当前开环能逐步到达精确零，随后停止发布；闭环或非零死区情形仍应结合内部状态与真实反馈判断，不能把停止发布当作车已静止的测量。",[21,1215,1216],{},"本超时使用ROS时钟，平滑定时器却使用墙钟。use_sim_time=True且\u002Fclock暂停时，回调可能仍运行、按最新目标继续生成指令，而1 s超时差不再增长。恢复旁路也不受这条输入超时统一管理；平滑器发零后，fake_vel_transform仍可能加上保留的cmd_spin。",[427,1218,1220],{"id":1219},"动态参数配置边界与验证范围","动态参数、配置边界与验证范围",[432,1222,1224],{"id":1223},"当前1120哪些值会动态进入成员","当前1.1.20哪些值会动态进入成员",[21,1226,1227,1228],{},"本节点在activate安装回调，deactivate移除；本版不能把“ROS参数设置成功”一律理解成所有内部设置已联动更新。",[43,1229,1232],{"href":1230,"rel":1231},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L315",[186],"动态参数实现",[54,1234,1235,1248],{},[57,1236,1237],{},[60,1238,1239,1242,1245],{},[63,1240,1241],{},"参数组",[63,1243,1244],{},"Active回调行为",[63,1246,1247],{},"本版需要注意",[73,1249,1250,1260,1270,1281,1291,1302,1312],{},[60,1251,1252,1254,1257],{},[78,1253,505],{},[78,1255,1256],{},"更新double成员，取消旧timer并按新值创建wall timer",[78,1258,1259],{},"与航点loop_rate不同，本节点确实重建节拍；仍有整数毫秒截断",[60,1261,1262,1264,1267],{},[78,1263,1141],{},[78,1265,1266],{},"把double秒值转为Duration更新",[78,1268,1269],{},"不清空已保存目标或重设最后接收时间",[60,1271,1272,1275,1278],{},[78,1273,1274],{},"max_velocity、min_velocity、max_accel、max_decel、deadband_velocity",[78,1276,1277],{},"接受三元素double数组并更新成员",[78,1279,1280],{},"回调不完整复核min≤max；缩小范围不重置last_cmd；应使用完整有效数组",[60,1282,1283,1285,1288],{},[78,1284,567],{},[78,1286,1287],{},"OPEN_LOOP重置OdomSmoother；CLOSED_LOOP创建新OdomSmoother",[78,1289,1290],{},"模式切换会改变current来源，不等于已验证反馈；新窗口需重新接收数据",[60,1292,1293,1296,1299],{},[78,1294,1295],{},"odom_topic、odom_duration",[78,1297,1298],{},"更新对应成员并重建OdomSmoother",[78,1300,1301],{},"即使当时OPEN_LOOP也可能建立订阅，但current仍走开环分支；旧窗口不沿用",[60,1303,1304,1306,1309],{},[78,1305,538],{},[78,1307,1308],{},"没有PARAMETER_BOOL更新分支",[78,1310,1311],{},"ROS层值可能改变，成员仍为configure时值；需重新配置／重启后核对",[60,1313,1314,1316,1319],{},[78,1315,473],{},[78,1317,1318],{},"rclcpp时间源机制处理",[78,1320,1321],{},"不把wall timer改成ROS时钟节拍；仍会影响超时比较",[21,1323,1324,1325],{},"此外，max_accel／max_decel动态回调检查符号后，即使判为失败也仍有赋值成员的代码，批量设置还可能先更新前面的成员再遇到后项失败。不能依赖“设置失败”证明内部完全未变；本次没有运行这种非法设置实验。",[43,1326,1329],{"href":1327,"rel":1328},"https:\u002F\u002Fgithub.com\u002Fros-navigation\u002Fnavigation2\u002Fblob\u002F1.1.20\u002Fnav2_velocity_smoother\u002Fsrc\u002Fvelocity_smoother.cpp#L350",[186],"符号检查与赋值",[21,1331,1332],{},"启动配置要保持三元素数组、加速非负、减速非正、各轴min≤max及有效频率／时间；当前这些数值符合源码的基本符号和数组要求，但是否匹配实际驱动能力仍需实物数据。平滑器没有jerk约束，没有统一的车体合速度限幅，也没有代价地图碰撞检查；机械能力与碰撞处理不能只靠这组参数证明。",[432,1334,1335],{"id":1335},"本次核对与实物观察",[1337,1338,1339,1346,1352,1358],"ul",{},[1340,1341,1342,1345],"li",{},[24,1343,1344],{},"已核对："," nav2_velocity_smoother／nav2_util版本、两份安装头文件与库；reality／simulation参数及安装副本；两种navigation_launch的控制器和平滑器重映射、恢复旁路；上游odometry生成和下游速度换系／自旋。",[1340,1347,1348,1351],{},[24,1349,1350],{},"源码能确认："," 十二项参数的使用条件、三轴顺序与单位；目标夹紧→变化约束→内部记录→死区发布的顺序；开环和闭环窗口区别；超时零目标降速、ROS与墙钟差异；动态参数覆盖及未覆盖分支。",[1340,1353,1354,1357],{},[24,1355,1356],{},"实物观察时重点："," 同时对照cmd_vel_controller、cmd_vel_nav2_result及最终cmd_vel，观察起步、减速、横移／方向切换和驱动实际响应；确认附加自旋、恢复旁路和控制指令断流各自的处理结果。若保持开环，先不以odom_duration作为调试输出平滑的入口。",[1340,1359,1360,1363],{},[24,1361,1362],{},"本次范围："," 仅更新文档和目录，未改变运行参数或工程代码，未发布速度、未启动导航／恢复、未进行运动或断流测试；所有数值例子均为源码公式计算。",[1365,1366,1367],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}",{"title":35,"searchDepth":222,"depth":222,"links":1369},[1370],{"id":14,"depth":222,"text":5,"children":1371},[1372,1373],{"id":18,"depth":230,"text":19},{"id":196,"depth":230,"text":196},"0500-2000","2026-09-20","2026-09-20-dao-hang","\u002Fwiki\u002F2026-09-20-dao-hang","导航","md",true,false,{},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-2000-velocity-smoother",{"title":5,"description":35},"wiki\u002F2026-09-20-导航\u002F0500-2000-velocity_smoother","g1OYtzRkAl_BN67l8-MAImBoEar2FD0dHirWIWz39PA",[1388,1395,1401,1407,1413,1419,1425,1431,1437,1443,1449,1455,1461,1467,1473,1479,1484,1490,1496,1501,1507,1513,1519,1525,1530,1536,1542,1548,1554,1560,1566,1571,1577,1579,1585,1591,1597,1603],{"path":1389,"stem":1390,"title":1391,"authors":1392,"date":1375,"chapterOrder":1393,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0100-jian-jie","wiki\u002F2026-09-20-导航\u002F0100-简介","简介",[7],"0100",0,{"path":1396,"stem":1397,"title":1398,"authors":1399,"date":1375,"chapterOrder":1400,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0200-huan-jing-pei-zhi-yu-yun-xing","wiki\u002F2026-09-20-导航\u002F0200-环境配置与运行","环境配置与运行",[7],"0200",{"path":1402,"stem":1403,"title":1404,"authors":1405,"date":1375,"chapterOrder":1406,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0100-robot-description","wiki\u002F2026-09-20-导航\u002F0300-0100-robot_description","robot_description（机器人模型与关节定义）",[7],"0300-0100",{"path":1408,"stem":1409,"title":1410,"authors":1411,"date":1375,"chapterOrder":1412,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0200-mid360-an-zhuang-wei-zhi","wiki\u002F2026-09-20-导航\u002F0300-0200-MID360安装位置","MID360安装位置",[7],"0300-0200",{"path":1414,"stem":1415,"title":1416,"authors":1417,"date":1375,"chapterOrder":1418,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0300-launch-yu-bao-yi-lai-pei-zhi","wiki\u002F2026-09-20-导航\u002F0300-0300-Launch与包依赖配置","Launch与包依赖配置",[7],"0300-0300",{"path":1420,"stem":1421,"title":1422,"authors":1423,"date":1375,"chapterOrder":1424,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0400-fang-zhen-shi-jue-you-hua","wiki\u002F2026-09-20-导航\u002F0300-0400-仿真视觉优化","仿真视觉优化（可选）",[7],"0300-0400",{"path":1426,"stem":1427,"title":1428,"authors":1429,"date":1375,"chapterOrder":1430,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0500-tian-jia-di-tu","wiki\u002F2026-09-20-导航\u002F0300-0500-添加地图","添加地图",[7],"0300-0500",{"path":1432,"stem":1433,"title":1434,"authors":1435,"date":1375,"chapterOrder":1436,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-ji-qi-ren-mo-xing-yu-fang-zhen","wiki\u002F2026-09-20-导航\u002F0300-机器人模型与仿真","机器人模型与仿真",[7],"0300",{"path":1438,"stem":1439,"title":1440,"authors":1441,"date":1375,"chapterOrder":1442,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0100-linux-yu-mcu-shu-ju-dui-jie","wiki\u002F2026-09-20-导航\u002F0400-0100-Linux与MCU数据对接","Linux与MCU数据对接",[7],"0400-0100",{"path":1444,"stem":1445,"title":1446,"authors":1447,"date":1375,"chapterOrder":1448,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0200-chuan-kou-tong-xin","wiki\u002F2026-09-20-导航\u002F0400-0200-串口通信","Serial_Comm（串口通信）",[7],"0400-0200",{"path":1450,"stem":1451,"title":1452,"authors":1453,"date":1375,"chapterOrder":1454,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0300-shou-bing-kong-zhi","wiki\u002F2026-09-20-导航\u002F0400-0300-手柄控制","Joy（手柄控制）",[7],"0400-0300",{"path":1456,"stem":1457,"title":1458,"authors":1459,"date":1375,"chapterOrder":1460,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0400-mid360-yu-tf-lian-tiao","wiki\u002F2026-09-20-导航\u002F0400-0400-MID360与TF联调","MID360与TF联调",[7],"0400-0400",{"path":1462,"stem":1463,"title":1464,"authors":1465,"date":1375,"chapterOrder":1466,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-ying-jian-dui-jie-yu-kong-zhi","wiki\u002F2026-09-20-导航\u002F0400-硬件对接与控制","硬件对接与控制",[7],"0400",{"path":1468,"stem":1469,"title":1470,"authors":1471,"date":1375,"chapterOrder":1472,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0100-point-lio","wiki\u002F2026-09-20-导航\u002F0500-0100-Point_LIO","Point_LIO（激光与IMU融合里程计，建图与定位算法）",[7],"0500-0100",{"path":1474,"stem":1475,"title":1476,"authors":1477,"date":1375,"chapterOrder":1478,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0200-loam-interface","wiki\u002F2026-09-20-导航\u002F0500-0200-loam_interface","loam_interface（Point-LIO输出的坐标与话题适配）",[7],"0500-0200",{"path":1066,"stem":1480,"title":1481,"authors":1482,"date":1375,"chapterOrder":1483,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"wiki\u002F2026-09-20-导航\u002F0500-0300-sensor_scan_generation","sensor_scan_generation（雷达点云换系与底盘、云台位姿转换）",[7],"0500-0300",{"path":1485,"stem":1486,"title":1487,"authors":1488,"date":1375,"chapterOrder":1489,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0400-terrain-analysis","wiki\u002F2026-09-20-导航\u002F0500-0400-terrain_analysis","terrain_analysis（近场地面与障碍高差分析）",[7],"0500-0400",{"path":1491,"stem":1492,"title":1493,"authors":1494,"date":1375,"chapterOrder":1495,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0500-terrain-analysis-ext","wiki\u002F2026-09-20-导航\u002F0500-0500-terrain_analysis_ext","terrain_analysis_ext（扩展远场地形与近远场结果合并）",[7],"0500-0500",{"path":50,"stem":1497,"title":1498,"authors":1499,"date":1375,"chapterOrder":1500,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"wiki\u002F2026-09-20-导航\u002F0500-0600-fake_vel_transform","fake_vel_transform（云台系速度转换与底盘自旋）",[7],"0500-0600",{"path":1502,"stem":1503,"title":1504,"authors":1505,"date":1375,"chapterOrder":1506,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0700-small-gicp-relocalization","wiki\u002F2026-09-20-导航\u002F0500-0700-small_gicp_relocalization","small_gicp_relocalization（先验点云地图重定位）",[7],"0500-0700",{"path":1508,"stem":1509,"title":1510,"authors":1511,"date":1375,"chapterOrder":1512,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0800-pointcloud-to-laserscan","wiki\u002F2026-09-20-导航\u002F0500-0800-pointcloud_to_laserscan","pointcloud_to_laserscan（三维地形点云转二维扫描）",[7],"0500-0800",{"path":1514,"stem":1515,"title":1516,"authors":1517,"date":1375,"chapterOrder":1518,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0900-slam-toolbox","wiki\u002F2026-09-20-导航\u002F0500-0900-slam_toolbox","slam_toolbox（二维地图生成与轨迹优化）",[7],"0500-0900",{"path":1520,"stem":1521,"title":1522,"authors":1523,"date":1375,"chapterOrder":1524,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1000-bt-navigator","wiki\u002F2026-09-20-导航\u002F0500-1000-bt_navigator","bt_navigator（行为树导航任务调度）",[7],"0500-1000",{"path":620,"stem":1526,"title":1527,"authors":1528,"date":1375,"chapterOrder":1529,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"wiki\u002F2026-09-20-导航\u002F0500-1100-controller_server","controller_server（路径跟踪、进度检查与到达判定）",[7],"0500-1100",{"path":1531,"stem":1532,"title":1533,"authors":1534,"date":1375,"chapterOrder":1535,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1200-local-costmap","wiki\u002F2026-09-20-导航\u002F0500-1200-local_costmap","local_costmap（局部障碍代价地图）",[7],"0500-1200",{"path":1537,"stem":1538,"title":1539,"authors":1540,"date":1375,"chapterOrder":1541,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1300-global-costmap","wiki\u002F2026-09-20-导航\u002F0500-1300-global_costmap","global_costmap（全局规划代价地图）",[7],"0500-1300",{"path":1543,"stem":1544,"title":1545,"authors":1546,"date":1375,"chapterOrder":1547,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1400-map-server","wiki\u002F2026-09-20-导航\u002F0500-1400-map_server","map_server（已有二维地图加载与发布）",[7],"0500-1400",{"path":1549,"stem":1550,"title":1551,"authors":1552,"date":1375,"chapterOrder":1553,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1500-map-saver","wiki\u002F2026-09-20-导航\u002F0500-1500-map_saver","map_saver（二维栅格地图保存）",[7],"0500-1500",{"path":1555,"stem":1556,"title":1557,"authors":1558,"date":1375,"chapterOrder":1559,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1600-planner-server","wiki\u002F2026-09-20-导航\u002F0500-1600-planner_server","planner_server（Theta*全局路径规划）",[7],"0500-1600",{"path":1561,"stem":1562,"title":1563,"authors":1564,"date":1375,"chapterOrder":1565,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1700-smoother-server","wiki\u002F2026-09-20-导航\u002F0500-1700-smoother_server","smoother_server（全局路径平滑）",[7],"0500-1700",{"path":45,"stem":1567,"title":1568,"authors":1569,"date":1375,"chapterOrder":1570,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"wiki\u002F2026-09-20-导航\u002F0500-1800-behavior_server","behavior_server（恢复行为与空闲方向移动）",[7],"0500-1800",{"path":1572,"stem":1573,"title":1574,"authors":1575,"date":1375,"chapterOrder":1576,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1900-waypoint-follower","wiki\u002F2026-09-20-导航\u002F0500-1900-waypoint_follower","waypoint_follower（逐点导航与到点等待）",[7],"0500-1900",{"path":1383,"stem":1385,"title":5,"authors":1578,"date":1375,"chapterOrder":1374,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},[7],{"path":1580,"stem":1581,"title":1582,"authors":1583,"date":1375,"chapterOrder":1584,"chapterDepth":211,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-2100-pb-teleop-twist-joy-node","wiki\u002F2026-09-20-导航\u002F0500-2100-pb_teleop_twist_joy_node","pb_teleop_twist_joy_node（手柄输入与可替换控制入口）",[7],"0500-2100",{"path":1586,"stem":1587,"title":1588,"authors":1589,"date":1375,"chapterOrder":1590,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-dao-hang-can-shu","wiki\u002F2026-09-20-导航\u002F0500-导航参数","导航参数",[7],"0500",{"path":1592,"stem":1593,"title":1594,"authors":1595,"date":1375,"chapterOrder":1596,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0600-kai-fa-wen-ti-yu-pai-cha","wiki\u002F2026-09-20-导航\u002F0600-开发问题与排查","开发问题与排查",[7],"0600",{"path":1598,"stem":1599,"title":1600,"authors":1601,"date":1375,"chapterOrder":1602,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1381},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0700-jue-ce","wiki\u002F2026-09-20-导航\u002F0700-决策","决策",[7],"0700",{"path":1377,"stem":1604,"title":1605,"authors":1606,"date":1375,"chapterOrder":1607,"chapterDepth":1394,"docKey":1376,"docRoot":1377,"docTitle":1378,"isWikiDoc":1380,"isWikiIndex":1380},"wiki\u002F2026-09-20-导航\u002Findex","北极熊导航复现日志",[7],null,[1609,1611,1614,1617],{"name":7,"image":1610},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":1612,"image":1613},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":1615,"image":1616},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":1618,"image":1619},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431906652]