自动驾驶:路径规划概述
自动驾驶:路径规划概述
- 全局路径规划
- Dijkstra算法
- A*算法
- RRT(随机快速探索树)算法
- PRM(概率路线图)算法
- 局部路径规划
- DWA(动态窗口法)算法
- TEB(时间弹性带)算法
- Lattice Planner算法
- EM Planner算法
本博客从一些常见的全局路径规划算法和局部路径规划算法出发,介绍了它们的工作原理和优缺点。
全局路径规划
以全局地图,起始点和终点为输入,全局轨迹为输出,规划出一条无碰撞、路径最短且较为平滑的路径。
Dijkstra算法
Dijkstra算法是一种用于图中最短路径搜索的经典算法,由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。它被广泛应用于网络路由、地图导航、运输规划等领域。Dijkstra算法通过找到从一个起始节点到所有其他节点的最短路径来解决问题。
原理
- 初始化:选择一个起始节点,将起始节点的距离设置为0,将所有其他节点的距离设置为无穷大。
- 选取最近节点:从未处理的节点中选择距离起始节点最近的节点。初始时,这个节点就是起始节点。
- 更新距离:对于选中的节点,计算从起始节点经过它到达其邻居节点的距离。如果通过选中节点到达邻居节点的距离小于邻居节点当前的距离,更新邻居节点的距离为新计算的距离。
- 标记为已处理:将选中的节点标记为已处理,表示已找到从起始节点到达它的最短路径。
- 重复步骤2至4:重复选取最近节点、更新距离和标记为已处理的过程,直到所有节点都被处理或者目标节点被处理。
- 路径回溯:一旦目标节点被处理,可以从目标节点回溯到起始节点,构建最短路径。
优点
- 确保最优解: Dijkstra算法保证找到的路径是从起始节点到目标节点的最短路径,前提是所有边的权重必须为非负数。
- 适用于单源最短路径问题: Dijkstra算法通常用于解决单源最短路径问题,即从一个起始节点到所有其他节点的最短路径。
- 易于理解和实现: 算法逻辑相对简单,易于理解和实现。
缺点
- 无法处理负权重边: Dijkstra算法不能处理带有负权重边的图,因为它的工作原理基于不断减小节点的距离,负权重边可能导致无限循环。
- 不适用于大规模图: 在大规模图中,Dijkstra算法的计算复杂度较高,可能不适用于实时应用。
A*算法
A算法(A-star算法)是一种启发式搜索算法,用于在图或图类问题中找到从起点到目标点的最短路径。这个算法结合了Dijkstra算法的最短路径性质和启发式搜索的优势,被广泛应用于路径规划、游戏AI、机器人导航和地图路线规划等领域。
原理
- 初始化:选择一个起始节点,将起始节点的代价设置为0,并将其放入一个待探索节点列表中。同时,为每个节点记录一个估计到目标节点的代价,通常使用启发式函数(heuristic function)来估计。
- 选择节点:从待探索节点列表中选择一个节点,通常是具有最小总代价(实际代价加上估计代价)的节点。初始时,起始节点是唯一的候选。
- 扩展节点:对于选中的节点,遍历它的邻居节点。计算从起始节点经过当前节点到达邻居节点的实际代价,并加上从邻居节点到目标节点的估计代价。如果这个总代价比邻居节点当前的总代价小,更新邻居节点的总代价,并将当前节点设置为邻居节点的父节点。
- 标记节点:将选中的节点标记为已探索,从待探索节点列表中移除。
- 重复步骤2至4:重复选择、扩展和标记节点的过程,直到找到目标节点或者待探索节点列表为空。
- 路径回溯:一旦找到目标节点,可以从目标节点回溯到起始节点,构建最短路径。
优点
- (有条件)确保最优解: A*算法保证找到的路径是从起始节点到目标节点的最短路径,前提是启发式函数满足一定条件(被称为“一致性”或“单调性”)。
- 高效性: A*算法通常比纯粹的Dijkstra算法更快,因为它有能力通过启发式函数引导搜索,减少不必要的节点扩展。
- 适用性广泛: A*算法适用于各种问题,包括路径规划、游戏AI、机器人导航和地图路线规划等。
缺点
-
启发式函数选择: A*算法的性能高度依赖于所选择的启发式函数。选择不合适的启发式函数可能导致算法不准确或不高效。
-
存储需求: A*算法需要存储和管理待探索节点列表,对于大规模问题可能需要较多的内存。
RRT(随机快速探索树)算法
RRT(Randomized Rapidly-Exploring Tree)是一种用于路径规划的随机采样算法,最初由Steven M. LaValle于1998年提出。RRT旨在解决机器人或其他自主体的运动规划问题,使它们能够在未知或复杂的环境中找到有效路径。
原理
- 初始化:从起始点开始,创建一棵树,该树仅包含起始点。
- 随机采样:在地图空间中随机生成一个点,这个点通常是随机的,但也可以考虑环境的先验知识。
- 连接到树:找到离采样点最近的树上的节点,然后从这个节点向采样点生成一条边。这个边的生成通常遵循一些规则,例如最大距离限制,以确保树的扩展不会太快。
- 重复:重复步骤2和3,直到生成树的一部分接近目标区域。在每一步,RRT都在树上添加一个新节点和一条新边,以逐步扩展搜索空间。
- 连接到目标:一旦树的一部分靠近目标点,就可以在树上找到一条路径,从起始点连接到目标点。
- 路径优化(可选):可以对生成的路径进行优化,以提高路径的平滑性和效率。
优点
- 适应高维度环境: RRT适用于高维度状态空间,因此对于具有大量自由度的机器人或问题来说非常有用。
- 多样化的路径: 由于随机性质,RRT能够生成多样化的路径,有助于克服局部最小值问题。
- 实时规划: RRT的增量性质使其适用于实时路径规划,可以在机器人运动时重新规划路径。
缺点
- 不能确保最优路径: RRT不一定总是找到全局最优路径,它更关注于搜索过程的快速探索和多样性。
- 收敛速度不确定: RRT的收敛速度依赖于随机采样和树的生长规则,因此在某些情况下可能需要较长时间才能找到合适的路径。
- 有限的环境模型: RRT假设了机器人可以自由移动,不考虑动力学约束,因此在某些情况下可能不适用。
PRM(概率路线图)算法
PRM(Probabilistic Roadmap)是一种用于路径规划的概率算法,特别适用于高维度和复杂的环境。PRM算法通过在地图上随机生成一组采样点,然后连接这些点来构建一个图,从而生成路径。PRM算法在机器人导航、运动规划和自主机器人领域得到广泛应用。以下是PRM算法的基本工作原理:
原理
- 采样:随机在地图上生成一组采样点,这些点通常是机器人可以合法到达的位置。采样点的数量和分布可以根据问题的复杂性和需求进行调整。
- 连接采样点:对于每个采样点,检查其附近是否有其他采样点,如果有,则将它们连接起来,形成边。连接两个采样点的边通常表示机器人可以在这两个点之间移动的路径。
- 检查可通行性:对于连接的边,进行可通行性检查,以确保路径不会与障碍物相交。如果某条边不满足可通行性要求,将其删除。
- 路径搜索:使用标准路径搜索算法(如Dijkstra或A*)在生成的图上查找最短路径。起始点和目标点通常与最近的采样点连接,从而确保路径在图中。
- 路径优化(可选):可以对生成的路径进行优化,以提高路径的平滑性和效率。
优点
- 适应高维度环境: PRM算法适用于高维度状态空间,对于具有大量自由度的机器人或问题非常有用。
- 支持多个运动约束: PRM算法可以轻松地集成多个运动约束,例如最小转弯半径、最大速度、最大加速度等,以满足不同机器人的运动要求。
- 全局路径规划: PRM算法可以用于全局路径规划,确保找到连接起始点和目标点的路径。
- 预先规划多个路径: 通过生成一组采样点,PRM算法可以预先规划多个路径,以备不时之需。
缺点
- 构建路线图需要时间: 构建PRM的路线图可能需要大量计算时间,特别是在高维度环境中。
- 路径搜索复杂度: 路径搜索阶段的计算复杂度取决于图的大小和形状,可能在某些情况下较高。
- 不一定最优: PRM算法不一定总是找到全局最优路径,它的性能取决于采样点的分布和数量。
局部路径规划
以局部地图,周围环境信息作为输入,局部轨迹为输出,规划出一条无碰撞满足运动学或动力学约束的轨迹,常用于避免碰撞、满足舒适性等要求和实时根据周围环境进行路径的调整。
DWA(动态窗口法)算法
DWA(Dynamic Window Approach)算法是一种用于移动机器人路径规划和避障的实时控制方法。它通常用于机器人在动态环境中避免碰撞和实时规划路径。DWA算法是一种模型预测控制方法,它通过在机器人的状态空间中生成一系列可能的运动轨迹,然后评估每个轨迹的性能来选择最佳行动。
原理
- 状态空间建模:将机器人的状态空间表示为位姿(位置和方向)和速度(线速度和角速度)的组合。这个状态空间描述了机器人在环境中的位置和运动状态。
- 生成运动轨迹:在状态空间中生成一系列可能的运动轨迹,通常通过在速度空间(线速度和角速度)中采样来实现。这些轨迹代表了机器人可能的运动选择。
- 评估轨迹:对于每个生成的轨迹,评估它们的性能。性能评估通常包括两个方面:运动轨迹能否到达目标位置(目标导向性),以及轨迹是否避开了障碍物(避障性)。这些评估指标通常基于预测模型和环境感知。
- 选择最佳行动:选择性能最佳的轨迹作为机器人的下一步行动。通常,最佳轨迹被定义为在目标导向性和避障性之间取得平衡的轨迹。
- 控制机器人:执行选择的行动,控制机器人进行移动。机器人执行当前轨迹上的运动命令,然后重新进行路径规划以进行下一步移动。
- 实时更新:重复上述步骤以实现实时路径规划和避障,不断更新机器人的运动。
优点
- 实时性: DWA算法适用于实时运动规划,能够在机器人移动时快速生成适应环境变化的轨迹。
- 适应性: 由于DWA算法的实时性,它能够适应动态环境中的障碍物移动和变化。
- 避障能力: DWA算法通过避免评估避障性能来避免碰撞,使机器人能够在复杂环境中导航。
缺点
- 局部搜索: DWA算法通常是局部搜索方法,因此不一定总是找到全局最优路径。
- 性能依赖于参数: DWA算法的性能高度依赖于参数的选择,特别是与性能评估相关的参数。这需要进行调试和优化。
TEB(时间弹性带)算法
TEB(Time-Elastic Band)算法是一种用于机器人运动规划和轨迹优化的方法,特别适用于移动机器人在动态环境中的路径规划。TEB算法旨在解决机器人在复杂和动态环境中的路径规划问题,以确保机器人能够安全、高效地移动。
原理
-
初始化:
确定机器人的初始状态,包括位置和速度。
设置时间分辨率(时间步长)和速度分辨率(速度步长)等参数。
建立一个时间-空间轨迹,包含初始状态。 -
目标设定:
确定机器人的目标位置。 -
路径生成:
在时间-空间轨迹中,逐个时间步骤生成可能的位置-速度对(位姿和速度)。
考虑机器人的动力学模型,以确保生成的轨迹在物理上合理。
考虑速度分辨率,生成多个不同速度的轨迹分支。 -
避障检测:
对于每个生成的轨迹,检查轨迹上的每个时间步骤是否与障碍物相交。
如果某个时间步骤与障碍物相交,将该轨迹标记为不合法。 -
性能评估:
对于合法的轨迹,评估它们的性能。
性能评估通常包括目标导向性(轨迹是否接近目标位置)、避障性(轨迹是否避开障碍物)以及平滑性等。 -
轨迹选择:
根据性能评估选择最佳的轨迹或轨迹分支作为机器人的下一步行动。
最佳轨迹通常是在目标导向性和避障性之间取得平衡的轨迹。 -
控制机器人:
执行选择的轨迹上的运动命令,将机器人移动到下一个状态。 -
实时更新:
在机器人移动过程中,不断更新轨迹和重新规划,以适应环境的动态变化。 -
达到目标:
当机器人接近目标位置并满足终止条件时,算法结束。
优点
- 动态适应性: TEB算法具有动态调整轨迹的能力,可以在实时感知到的环境信息下进行路径的重新规划。这使得它适用于处理动态障碍物和环境变化的情况。
- 轨迹平滑性: TEB算法倾向于生成平滑的轨迹,有助于提高机器人的运动舒适性和稳定性。
- 速度控制: TEB算法允许对机器人的速度进行动态调整,以适应环境中的障碍物密度和机器人的运动能力。
- 支持多个运动约束: TEB算法可以轻松地集成多个运动约束,例如最小转弯半径、最大速度、最大加速度等,以满足不同机器人的运动要求。
缺点
- 计算复杂度: TEB算法的计算复杂度相对较高,特别是在高维度状态空间中,可能导致实时性方面的挑战。
- 对参数敏感: TEB算法依赖于许多参数,如时间分辨率、空间分辨率等。选择适当的参数对算法的性能至关重要,但可能需要一些调试。
Lattice Planner算法
Lattice Planner是一种基于采样的路径规划算法,适用于高维度状态空间和具有复杂运动约束的机器人。它将机器人的状态空间建模为一个高维度格点图,通过采样生成候选轨迹、利用各项指标评估来寻找最佳路径。
原理
- 状态空间建模: 将机器人的状态空间表示为高维度格点图。
- 生成候选轨迹: 在状态空间中生成一组候选轨迹,每个轨迹代表机器人可能的运动路径。
- 碰撞检测: 对每个候选轨迹进行碰撞检测,确保轨迹不与障碍物相交。
- 性能评估: 对合法的轨迹进行性能评估,考虑目标导向性、避障性、平滑性和舒适性等指标。
- 选择最优轨迹: 确定从起始状态到目标状态的最优路径。
- 轨迹优化: 可选地对生成的路径进行优化。
优点
- 适应高维度状态空间和复杂运动约束。
- 支持多个运动约束。
缺点
- 计算复杂度较高。
- 参数选择对性能影响较大。
EM Planner算法
EM Planner是一种采用期望最大化(Expectation-Maximization, EM)方法的路径规划算法,用于解决机器人在未知环境中的路径规划问题。它通过估计未知环境的概率分布来规划路径。
环境建模: 使用传感器数据构建环境的概率地图,其中包括障碍物的位置和不确定性。
EM算法: 使用EM算法来估计未知环境的概率分布,包括障碍物的分布和不确定性。
路径规划: 基于估计的环境概率分布,使用路径规划算法来规划路径。
轨迹执行: 执行规划的路径,同时不断更新环境模型和路径以适应新的传感器数据。
优点
- 适用于未知环境和不确定的环境,能够估计环境的概率分布。
缺点
- 较高的计算复杂度。
相关文章:
自动驾驶:路径规划概述
自动驾驶:路径规划概述 全局路径规划Dijkstra算法A*算法RRT(随机快速探索树)算法PRM(概率路线图)算法 局部路径规划DWA(动态窗口法)算法TEB(时间弹性带)算法Lattice Plan…...

vlc将本地文件推流成ts实时流
推流 打开vlc ,打开 媒体----打开网络串流 选择文件选项卡,打开本地文件 点击添加,选择本地的mp3文件 选择串流 点击下拉框,选择udp,点击右边的【添加】按钮 输入媒体流输出地址,点击【下一个】 选择正确的…...

C# 自定义控件库之Lable组合控件
1、创建类库 2、在类库中添加用户控件(Window窗体) 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…...
解密防关联指纹浏览器:联盟营销领域的秘密武器
联盟营销在今天的数字化时代越来越受欢迎。然而,联盟营销也面临着一些挑战,其中之一就是账号关联问题。本文将介绍如何利用防关联指纹浏览器来提升联盟营销的效果和安全性。 一、什么是防关联指纹浏览器? 防关联指纹浏览器是一种工具&#…...

asp.net core mvc Razor +dapper 增删改查,分页(保姆教程)
说明:本demo使用sqlserver数据库,dapper orm框架 完成一张学生信息表的增删改查,前端部分使用的是Razor视图, Linq分页 HtmlHelper。(代码随便写的,具体可以自己优化) //实现效果如下࿰…...

网络安全——自学(黑客)方法
如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…...

秋招算法岗,面试复盘
面试锦囊之面经分享系列,持续更新中 欢迎后台回复『面试』加入讨论组交流噢 楼主秋招主要投算法岗(偏NLP方向)和数据岗方向,下面分享我的一些面试经历。 一、科大讯飞(NLP) 简要介绍自己Python里面哈希表…...

AI类APP能做什么
AI类APP可以实现多种功能,涵盖了各种领域和用途。以下是一些常见的AI类APP示例以及它们主要实现的功能,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.语音助手(Voice Assis…...

计算机毕业设计 基于SSM的垃圾分类管理系统(以医疗垃圾为例)的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量
01 内容摘要 在竞争激烈的汽车行业,自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持,助力多个关键环节。它在汽车座位泡棉切割中提高精确度,降低浪费,提高生产效率;在汽车压铸零部…...

【5G PHY】物理层逻辑和物理天线的映射
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!
场景:一张用户表user,此时我需要批量新增用户,如果用户已经存在了,则更新该条记录;如果用户不存在,则插入一条数据。 痛点:常规做法新增更新各写一个接口。而且是批量操作,比较繁琐&…...
网络安全(加密, Hashing, 证书, SSL/TLS等)学习小结
网上看到的一些关于网络安全的学习资料小结。 对称加密: 通信双方共享同一个密钥。发送方用它来加密,接收方用它来解密。 非对称加密: 有公钥和私钥。 现在的做法一般是用非对称加密生成?钥(公钥还是私钥?)用于传输?࿰…...

缓冲技术在嵌入式中的应用
引言 在嵌入式中,不可避免地会遇到数据的收发。 其实,数据的收发有很多情况。 总体上,分为数据的收和发: 其中,数据发送是一个主动的行为,我们对要发送数据的数量特点等都是知道的,比如我们通过…...
vscode交叉编译cmake工程,toolchains设置
在 Visual Studio Code 中编译 CMake 项目时,使用自定义工具链(toolchains)可以很有用,特别是当你需要交叉编译或使用不同的编译器时。以下是在 Visual Studio Code 中使用自定义工具链的一般步骤,以aarch64的嵌入式为…...
MATLAB算法实战应用案例精讲-【优化算法】季节优化算法(SOA)(附MATLAB代码实现)
前言 世界上许多地方一年有四个季节:春、夏、秋、冬。每个季节的天气都不一样。随着天气的变化,生物,尤其是树木会改变它们的行为来适应天气。森林中的每一个个体都被称为一棵树。在满足终止条件之前,森林中的树木通过类似于自然界树木生命周期的四种操作:更新、竞争、播种…...

DevOps持续集成与交付
概述 Jenkins是一个支持容器化部署的、使用Java运行环境的开源软件,使用Jenkins平台可以定制化不同的流程与任务、以自动化的机制支持DevOps领域中的CI与CD,在软件开发与运维的流程中自动化地执行软件工程项目的编译、构建、打包、测试、发布以及部署&a…...
lambda的使用案例(1)
lambda的使用案例 1、分组转换为map Map<String, List<IdaasUserInfoVO>> map userWithOrgVOS1.stream().collect(Collectors.groupingBy(IdaasUserInfoVO::getOrgId));2、map循环 map.forEach(this::saveOrUpdateUser); private void saveOrUpdateUser(String …...

nodejs+vue装修公司CRM系统设计elementui
第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性: 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …...

开源博客项目Blog .NET Core源码学习(3:数据库操作方式)
开源博客项目Blog采用SqlSugar模块连接并操作数据库,本文学习并记录项目中使用SqlSugar的方式和方法。 首先,数据库连接信息放在了App.Hosting项目的appsettings.json中DbConfig节,支持在DbConfig节配置多个数据库连接信息,以…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...