news 2026/10/22 6:33:57

A星融合DWA路径规划算法:移动机器人动态避障与全局导航方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
A星融合DWA路径规划算法:移动机器人动态避障与全局导航方案

移动机器人在实际场景里做自主导航,最让人头疼的就是“环境一变就不会走了”——静态地图规划好的路线上突然冒出个行人或者临时堆放的纸箱,如果只靠全局规划算法,机器人会直直撞上去;而如果只用局部规划,又很容易在小空间里绕不出去。A星融合DWA路径规划算法就是解决这个问题的经典方案:A*负责在已知静态地图中找出一条全局最优路径,DWA负责在行进过程中实时感知并避开动态障碍。这套方案既能保证到达终点的效率,又能应对突发情况,是我做过的机器人导航项目里用得最多、也最稳的一套组合。

这篇文章会从原理到实现一步步拆解这套融合方案,包括A*和DWA各自的适用边界、融合架构的分层设计、核心参数怎么调、仿真和实机测试中会遇到哪些坑,以及我整理的一份参数调优速查表。内容兼顾原理和工程落地,适合正在做移动机器人导航、入门ROS或者参加相关竞赛的朋友参考。

1. 为什么要做A*与DWA的融合

1.1 A*算法在静态环境下的优势与先天短板

A算法本质是一种启发式搜索算法,在栅格地图中利用评价函数 f(n) = g(n) + h(n) 来搜索从起点到终点的路径。g(n)是起点到当前节点n的实际代价,h(n)是当前节点到终点的启发式估计代价。只要启发函数满足一致性条件,A就能保证找到最短路径,这也是它在全局路径规划中经久不衰的核心原因。

工程上选择h(n)时,最常用的是欧几里得距离和曼哈顿距离。在允许八方向移动的地图中,欧几里得距离更贴近真实代价,搜索出来的路径也更直观;曼哈顿距离在四方向移动地图中更高效,但在八方向地图中容易产生次优路径,因为它的估计值偏大,相当于“不完全信任”启发信息,会让搜索更偏向广度优先,效率下降。

但A有两个硬伤:一是它依赖完整且准确的静态地图,地图一旦与真实环境不一致,规划出的路径就可能撞上实际障碍物;二是计算开销大,在大地图中每次重规划都很耗时,无法实时响应动态变化。所以A通常被安排为“离线规划”或“低频重规划”,作为全局导向的骨架,而不是每一帧都去跑的实时算法。

1.2 DWA算法应对动态障碍的强项与视野局限

DWA(Dynamic Window Approach)的原理是在机器人的速度空间(线速度v和角速度ω)中,根据当前运动状态和动力学约束,采样一系列可行速度,对每组速度模拟出未来一段时间内的运动轨迹,再用评价函数对轨迹打分,选分数最高的轨迹对应的速度作为控制指令。

评价函数通常包含三项:目标方位角代价(衡量轨迹末端方向与目标方向的夹角)、障碍物距离代价(衡量轨迹与最近障碍物的距离)、速度代价(鼓励保持较高速度行驶)。实际工程中还会加入全局路径跟踪代价(轨迹末端与全局路径的距离),这也是融合方案中关键的改动点。

DWA的优势是实时性极强,采样周期在100ms甚至更低,能快速响应动态障碍。但它的视野范围受限于传感器探测距离和模拟时间,只能做到“走一步看一步”。在复杂静态环境中,比如U型障碍、窄通道,DWA很容易陷入局部最优——因为它的目标点是固定的,程序只能看到前方一小片区域,根本不知道“应该先绕远路绕过这堵墙再回来”。这是纯DWA在实际项目中最大的痛点。

1.3 互补关系拆解:全局先知与局部应变

把A*和DWA放一起,本质是把路径规划任务拆成两个层次:

  • 规划层(全局):A*在静态地图上给出从起点到终点的完整路径,解决“能不能到、走得对不对”的问题。
  • 跟踪层(局部):DWA把全局路径的“下一小段”作为局部目标点,在实时感知的基础上调整速度与转向,解决“路上突然出现障碍怎么办”的问题。

这种分工的思路,用导航领域的老话说叫“全局管方向、局部管执行”。A*保证了机器人不会在一个大空间里盲目打转,DWA保证了机器人不会撞上突发障碍物。两者各管一摊,又通过全局路径作为接口高效衔接,形成一个完整闭环。

提示:理解融合方案最核心的一点——DWA不是独立规划终点,而是始终以A*全局路径上的某个前瞻点为局部目标。这决定了DWA永远不会“忘记全局方向”。

2. 融合系统架构与方案设计

2.1 整体框架:全局规划层与局部规划层的分工

整个系统我习惯分成三层来说:感知层、规划层、控制层。

感知层负责建图与障碍物检测,常见配置是激光雷达或深度相机加上里程计信息。静态地图(栅格地图)构建后交给全局规划层使用;当前时刻的实时障碍信息则单独交给局部规划层,避免动态障碍物被“烘焙”进静态地图。

规划层是融合的主体:全局规划器订阅静态地图和起点终点,调用A*算法生成全局路径(global_path);局部规划器订阅全局路径、实时障碍信息、机器人位姿,以DWA为核心输出速度指令。控制层就不多说了,做速度跟踪,交给底层电机。

这种分层设计的好处是解耦。某个层的算法想换掉,比如把A换成其它全局规划算法,DWA的实现完全不用动;反过来也一样。实际项目里我见过很多人把障碍物直接标记进栅格地图,再让A频繁重规划,结果地图一更新机器人就“神经质”,速度一慢、路径一跳,原因就是没有把动态和静态分开处理。

用表格总结分工:

层级输入核心算法输出更新频率
感知层传感器数据栅格建图/障碍检测静态地图、实时障碍信息高频(实时)
全局规划层静态地图、起点、终点A*全局路径点序列低频(按需触发)
局部规划层全局路径、实时障碍、位姿DWA线速度与角速度指令高频(每控制周期)

2.2 融合的关键桥梁:全局路径的局部化转换

融合逻辑的实现,核心是把全局路径从“世界坐标系”转换到“机器人局部坐标系”。这里直接看代码。假设global_path是A*生成的世界坐标系路径点数组,机器人当前位姿是(x, y, yaw):

def pick_local_goal(global_path, x, y, yaw, lookahead_dist): # 第一步:找到距离当前位置最近的路径点索引 dists = [np.hypot(px - x, py - y) for px, py in global_path] nearest_idx = np.argmin(dists) # 第二步:从最近点开始往后找前瞻点,作为DWA的局部目标 target_idx = nearest_idx while target_idx < len(global_path) - 1: d = np.hypot(global_path[target_idx][0] - x, global_path[target_idx][1] - y) if d >= lookahead_dist: break target_idx += 1 # 第三步:把目标点转换到机器人坐标系 gx, gy = global_path[target_idx] dx = gx - x dy = gy - y local_gx = dx * np.cos(-yaw) - dy * np.sin(-yaw) local_gy = dx * np.sin(-yaw) + dy * np.cos(-yaw) return local_gx, local_gy, target_idx

这段函数做了两件事:一是通过最近路径点索引实现“到期换点”,机器人往前走,最近点索引跟着变,局部目标点天然地沿路径滚动;二是通过前瞻点给DWA预留出转向“提前量”。DWA算法不追求从当前位置直接开到最终终点,它只需要朝这个“前瞻点”开,就能在跟随全局路径的同时,每周期动态避障。这就是融合方案能兼顾全局最优与实时性的底层原因。

2.3 全局路径点冗余压缩处理

A*直接输出的路径点通常非常多,而且相邻点之间往往是斜向搜索产生的锯齿状折线。如果整条路径全部送给DWA做跟踪,除了计算量大浪费,更麻烦的是机器人会在折角处频繁摆动,影响控制稳定性。

我的做法是两步压缩和平滑:

第一步,用可见性剪枝删除可直连的中间点。原理很简单:从路径首点开始,依次判断某个中间点是否被障碍物挡住——若从点A到点B的连线与栅格地图上的障碍物碰撞检测没有冲突,就把中间的点全部丢弃;否则保留上一个可直连点,继续往后试探。

第二步,对路径点做Bezier曲线平滑,或者用简单的一阶低通滤波处理折角。平滑后路径更符合移动机器人运动学特性。这里要注意,平滑操作不能把路径点推出安全区域之外,每次平滑之后最好重新做一次碰撞合法性检查。

这两步做完,路径点数通常能从几百个压到几个关键点,DWA的跟踪效果会明显改善——机器人从“沿着锯齿走”变成“沿着平滑曲线走”,姿态稳定性和乘坐体验都会好很多。

3. A*与DWA融合实现的核心配置与参数调优

3.1 栅格地图与A*的工程化配置

做A*工程实现之前,先把地图与代价模型搞定。

栅格地图分辨率一般是0.05m每格到0.2m每格,我建议轮式机器人室内用0.05m,户外空旷场景可以放宽到0.1m。分辨率太高,A的搜索空间会指数爆炸;太低又会丢失窄通道通行能力。一个实际经验值:地图尺寸20m×20m时,0.05m分辨率的栅格数量是400×400=16万个,A一次搜索在毫秒级可以完成,基本流畅。

代价函数方面,g(n)在栅格地图里可以定义为“从起点走到当前栅格所经过的欧几里得距离总和”。不过工程上更常用的是把“经过障碍物相邻栅格”设定为额外代价,让路径在远离墙壁的可行区域走,避免贴着障碍物边缘通过导致后续DWA没有避让空间。这个额外代价我一般在基础距离上增加0.2~0.5倍,具体看机器人本体宽度与地图分辨率的比值。

A*的启发函数h(n)用欧几里得距离,代码如下:

def heuristic(a, b): return np.hypot(a[0]-b[0], a[1]-b[1]) def a_star(grid, start, goal): open_list = [] came_from = {} g_score = {start: 0} f_score = {start: heuristic(start, goal)} heapq.heappush(open_list, (f_score[start], start)) while open_list: _, current = heapq.heappop(open_list) if current == goal: return reconstruct_path(came_from, current) for dx, dy in [(1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)]: neighbor = (current[0]+dx, current[1]+dy) if not in_map(grid, neighbor): continue if grid[neighbor] == 1: continue move_cost = np.hypot(dx, dy) # 与障碍物贴边的额外代价 if is_adjacent_to_obstacle(grid, neighbor): move_cost += 0.3 tentative_g = g_score[current] + move_cost if tentative_g < g_score.get(neighbor, float('inf')): came_from[neighbor] = current g_score[neighbor] = tentative_g f_score[neighbor] = tentative_g + heuristic(neighbor, goal) heapq.heappush(open_list, (f_score[neighbor], neighbor)) return None

注意:上面这段是函数核心逻辑,真实部署时我会把grid转换成numpy数组索引计算,同时用优先队列维护open_list,保证搜索效率。探索邻节点时八方向可走虽然比四方向更适合斜向通道,但移动代价必须根据方向做区分,斜向要用根号2而不是1,否则搜索出的路径会偏向横平竖直而浪费斜向通行能力。

3.2 DWA评价函数的权重调参与采样参数

DWA采样空间是速度空间,采样的关键是确定三组边界:线速度范围、角速度范围、加速度范围。以差速驱动机器人为例,典型参数如下:

参数典型值说明
最小线速度0 m/s允许原地转向
最大线速度1.0 m/s按电机能力设定
最小角速度-1.0 rad/s左转为负/右转为正约定
最大角速度1.0 rad/s按转向能力设定
线加速度上限0.5 m/s²防急启急停
角加速度上限1.0 rad/s²防猛打方向盘
采样线速度步长0.05 m/s步长越小轨迹越细腻
采样角速度步长0.1 rad/s步长越小轨迹越细腻
模拟时间3.0 s轨迹推算时长

模拟时间很关键。太短,DWA看不到远一点的情况,遇到障碍才急刹;太长,轨迹推算是纯运动学外推,误差累积严重,而且计算量大。经验值是模拟轨迹长度尽量覆盖1.5到2倍“刹车距离”,刹车距离由最大线速度、最大减速度和障碍检测半径决定。比如最大线速度1m/s、减速度0.5m/s²时,刹车距离约为v²/(2a)=1/(1)=1m,模拟时间3s能覆盖约3m,余量充足。

评价函数的经典形式如下:

def evaluate_trajectory(traj, target, obstacles, weights): heading_cost = np.abs(normalize_angle(atan2(target[1]-traj[-1][1], target[0]-traj[-1][0]) - traj[-1][2])) # 距离代价:轨迹与最近障碍物距离,小于安全半径则惩罚 min_dist = min([np.hypot(px-ox, py-oy) for px,py,_ in traj for ox,oy in obstacles]) if min_dist < safety_radius: dist_cost = float('inf') else: dist_cost = 1.0 / max(min_dist, 0.01) velocity_cost = abs(traj[-1][0] - target_speed) total = (weights['heading'] * heading_cost + weights['dist'] * dist_cost + weights['velocity'] * velocity_cost) return total

权重比例是我花时间最长调的部分。原因是三个代价的量纲不同——方位角误差是弧度(0到π),障碍物距离是米(几米到几十米),速度是m/s。直接加权的时候必须先把各项归一化到大致相同的数值范围。我习惯把方位角代价除以π、距离代价做倒数后再乘以安全距离系数、速度代价除以最大线速度,三者都落到0到1区间再加权。

权重经验值:heading权重0.8~1.5,dist权重0.5~1.0,velocity权重0.2~0.5。这里有个偏门但很有效的经验:如果机器人总在障碍物前犹豫不决、迟迟不敢切过去,说明dist权重太高,把占优势的路径全惩罚掉了;如果它贴着障碍物走(距离很近但没有碰撞),说明dist权重太低。一次调不到位正常,用这个规律几分钟就能调好。

3.3 融合逻辑的优先级设计与状态切换

融合不是简单地把全局路径点塞给DWA,还需要一层状态机来控制“什么时候该避障、什么时候该恢复循线”。

我的做法是引入一个“安全缓冲圆”概念:以机器人当前位置为圆心,以safe_radius为半径(一般取0.8~1.2倍的机器人本征宽度),检测实时障碍。如果有障碍进入缓冲圆,DWA正常进入避障模式;如果没有障碍,DWA继续跟踪全局前瞻点。状态机代码如下:

def planner_status(mode, obstacles, safe_radius): # 动态障碍:进入避障模式;否则始终保持全局路径跟踪模式 if any(hypot(ox-robot_x, oy-robot_y) < safe_radius for ox,oy in obstacles): return "obstacle_avoidance" return "global_tracking"

还有一个非常重要的优先级细节:当机器人处于避障模式时,DWA评价函数中的方位角代价不应再指向全局前瞻点,而应该指向“绕行临时目标点”。这个点通常取当前障碍物边缘外扩一定距离的位置。等绕行完后,状态机切回global_tracking,机器人会自动回到全局路径上,继续执行主线任务。

需要特别注意,绕行临时目标点也不能乱指。如果机器人正在走廊中段遇到一个行人,临时目标点应该选在行人侧后方且仍然贴近全局路径方向的位置,这样绕行结束后不会偏离全局路径太远,也不会产生反向的大幅回旋。

4. 仿真与实机测试效果全记录

4.1 仿真场景与测试工具

我用Python搭建了一个2D仿真环境用来验证算法,地图尺寸20m×20m,栅格分辨率0.05m。地图上布置了三种典型场景:

  • 场景一:开阔场地中间随机摆放若干静态立柱,测试全局路径的合理性。
  • 场景二:在静态迷宫环境中加入一个沿固定路线往返运动的动态障碍物(模拟行人),测试动态避障能力。
  • 场景三:U型障碍物环境,专门用来检验融合方案是否解决了纯DWA的局部最优问题。

机器人运动学模型用差速模型,控制周期T=0.1s。DWA采样参数按照上一节推荐值配置,前瞻距离先取1.5m。

4.2 不同场景下的性能对比

仿真跑了三组对照:纯A*(遇到动态障碍不处理,只沿全局路径走)、纯DWA(直接把终点作为目标点,不做全局规划)、A*+DWA融合。结果如下:

场景纯A*纯DWAA*+DWA融合
静态立柱场景路径平滑、用时9.8s能绕障但路径抖动、用时13.2s路径平滑、用时10.1s
动态行人场景中途直接撞上动态障碍物能避障但绕行路线重复、用时18.5s顺畅避让后自动回主线、用时11.3s
U型障碍物环境全局路径合理,但若动态障碍出现在通道中则无法绕过在U型口来回打转,无法到达终点沿全局路径进U型,发现阻塞后转局部绕行,最终到达,用时15.7s

纯DWA在U型场景中一直左右摇摆但不前进,原因很典型:DWA只能感知前方几米,目标点又始终在障碍墙后方,程序永远选择“向前冲一点再退回一点”的循环,完全意识不到应该先绕出U型。融合方案里A*预先给出了全局路径,DWA只是沿这条路走,遇到阻塞才局部绕,解决问题立竿见影。

4.3 实机测试中的注意事项

仿真里一路顺风,实机上却有几个特殊的坑。先把最重要的三条写出来:

第一条,定位漂移会导致全局路径“贴不住”。A*路径是在地图坐标系下规划出来的,实机如果只用轮式里程计,长时间运行后累计误差会越来越大,导致机器人在全局坐标中的位置与实际位置偏离。表现为机器人明明沿着障碍物边走,但地图上显示离障碍物还有半米,最终某一次转弯就撞上了。解决办法是在导航框架中接入定位修正(如基于激光的定位模块),并在DWA的障碍物检测中直接使用传感器实时数据而非地图坐标,这样即使定位有漂移,局部避障仍然是可靠的。

第二条,动态障碍物速度突变。仿真中的移动障碍物速度恒定,但真实环境里的行人会突然停住、转身、加速。DWA按匀速率采样,一旦障碍物突然加速冲向机器人,模拟轨迹和真实轨迹会严重不符。解决办法有三:调大动态障碍物外扩半径(安全冗余);把DWA控制周期从0.1s缩短到0.05s甚至0.02s;在DWA中增加障碍物速度预测项,按当前速度外推障碍物位置再计算碰撞风险。

第三条,评测指标不要只盯“有没有到达”,还要看“机器人姿态是否稳定”。连续多次实机测试中,我发现融合算法可以通过参数调整让机器人快速到达终点,但是途中角速度抖动频繁,表现在底盘上就是“摇头晃脑”。这种情况多半是前瞻距离太短,DWA频繁切换目标点。把lookahead_dist从1.2m增大到1.8m之后,姿态明显改善。

5. 调试常见问题与排查技巧实录

5.1 机器人陷入局部最优的恶性循环

特征:机器人在某个区域反复绕圈,始终无法脱离。原因为DWA只以局部目标点为导向,即使有A*全局路径,如果局部目标点切换逻辑不正确(比如始终锁定在不可达的路径点之后),一样会卡住。

排查方法:打印当前局部目标点与机器人位置的连线,观察是否大部分时间指向障碍物内部;再打印前瞻点索引是否卡在一个固定值附近不回退。如果是,把目标点选择逻辑改为“从最近路径点向后找可达目标点”,即在寻找前瞻点的循环中跳过距离障碍物过近的路径点,直接跳到下一个可达点。

5.2 动态障碍物预测滞后导致近距离碰撞

特征:动态障碍物移动速度超过1m/s时,DWA经常在障碍物靠近到安全距离内才产生强避障行为,但刹车距离不够。

优先排查的是采样周期和模拟时间:采样周期如果大于0.1s,要提高频率;模拟时间若不够覆盖刹车距离,要加长。之后检查评价函数,当轨迹与障碍物距离小于安全半径时,直接把该轨迹的代价置为无穷大是很激进的设计——因为真实传感器有噪声,极小误差也会把大量候选轨迹判死,导致机器人突然急停。更好的做法是线性插值的危险性惩罚:距离越近惩罚越陡峭,但保留一个极小概率通过的可能,防止机器人因为某帧噪声就完全不动。

5.3 全局路径在狭窄通道失效

特征:A*规划路径穿过一扇宽度刚好能过机器人的窄门,但DWA在窄门处来回犹豫,甚至放弃通行。

这里的根源是A路径只是几何上的一条线,没有考虑机器人宽度。解决思路:在A的costmap里预先对障碍物做膨胀处理,把机器人半径考虑进去。具体做法是遍历每个障碍栅格,把周围半径超过robot_radius+margin的栅格都标记为不可通行。膨胀半径至少要等于机器人内切半径,留出3~5cm余量才稳妥。做完膨胀后再跑A*,路径自然就会避开窄门附近的边缘,DWA在窄门附近就不会频繁产生“距离太近”的惩罚了。

5.4 参数调优速查表

这部分是多次调参后整理出的经验表,方便直接对照:

现象优先调整项调整方向次要检查项
路径震荡、摇头晃脑lookahead_dist增大0.2~0.5m路径点是否做过平滑
避障太激进、频繁急刹障碍物安全半径增大0.1~0.2mdist权重是否过高
绕行太保守、不走捷径dist权重降低0.2~0.5前瞻点是否跳转过快
直行效率低、频繁转向velocity权重适当增大最大角速度是否过大
窄通道反复犹豫障碍膨胀半径增大0.05m局部目标点是否落在可通行区域
动态障碍反应慢控制周期/模拟时间缩短采样周期、加长模拟时间是否引入障碍速度预测

这套A与DWA的融合方案我在多个室内机器人项目里反复用过,从仿真到实机最大的感受是:全局规划和局部规划各司其职的框架,比任何单一算法都抗造。A保证了大方向不跑偏,DWA保证了突发情况刹得住、转得开,两者的接口处(前瞻点管理)才是真正考验工程水平的地方。

有几个细节我最后再啰嗦一遍:全局路径一定要做冗余压缩和碰撞检查,DWA的评价函数三个代价务必先归一化再做加权,实机调试时优先把定位漂移问题解决掉再谈路径效果。后面如果你想继续扩展这个项目,可以往多机器人协同方向试试——每台机器人都有自己的全局路径,但共享实时障碍信息,A*+DWA的框架天然适合做这个扩展。祝大家调试顺利,一次点亮。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 6:33:52

华为云ModelArts训练部署全链路实战:7大高频故障与通关密钥

1. 这不是“云上点点鼠标”的速成课&#xff0c;而是模型从训练到上线的全链路实战切片“华为云ModelArts模型训练与部署&#xff1a;零基础考点精讲”——这个标题里藏着三个关键信号&#xff1a;平台限定&#xff08;华为云ModelArts&#xff09;、动作闭环&#xff08;训练部…

作者头像 李华
网站建设 2026/10/22 6:33:02

用Claude Code从零搭建宠物生命周期管理App:AI编程全流程实操

如果你也想试试让AI从零搭一个完整的项目&#xff0c;而不是只写几个零散函数&#xff0c;这篇文应该能帮到你。我最近用Claude Code完整做出了一个宠物生命周期管理App&#xff0c;从建目录、设计数据库、写接口、做页面到联调测试&#xff0c;全程在终端里靠自然语言对话推进…

作者头像 李华
网站建设 2026/10/22 6:33:02

面试排程与评分归一化:从数学建模到工程实践

每年三月到四月&#xff0c;复试季一开启&#xff0c;负责研究生招生的老师就会陷入一种非常具体的焦虑&#xff1a;几十个学生、十几位导师、可用时段就那么多&#xff0c;每个学生还要被好几位导师面试&#xff0c;怎么排都有人不满意。2006年研究生数学建模竞赛的D题“学生面…

作者头像 李华
网站建设 2026/10/22 6:33:01

Gemini 4 Argon 更新解析:Android 多模态开发实战与成本优化

1. 这次更新到底改了什么&#xff1a;从开发者视角拆解核心变化每次大模型版本迭代&#xff0c;真正值得开发者关心的从来不是跑分涨了多少&#xff0c;而是接口行为变了没有、成本结构动了没有、我现有的代码要不要改。这次 Gemini 4 Argon 的发布&#xff0c;我第一时间把官方…

作者头像 李华
网站建设 2026/10/22 6:32:26

Linux服务器安全加固:ClamAV与Sophos开源杀毒实战指南

1. 开源杀毒在Linux安全栈里的真实定位先说一句得罪人的话&#xff1a;给Linux服务器装杀毒&#xff0c;在老运维圈子里一度被认为是不专业的标志。这个印象来自早期Linux使用场景简单、用户群体偏技术&#xff0c;再加上日常接触的病毒几乎都是面向Windows的&#xff0c;大家慢…

作者头像 李华
网站建设 2026/10/22 6:31:43

职场下半场:领导只是过客,同事才是真正的战友

35岁那年&#xff0c;公司组织了一次规模不小的架构调整&#xff0c;我所在的部门被整体并进另一个事业部。新领导上任不到两周&#xff0c;把原本属于我们团队的核心项目砍掉了一大半&#xff0c;几位跟了我很久的同事陆续被调走。我知道自己也在名单边缘&#xff0c;那种坐等…

作者头像 李华