unity 圆形障碍,避障算法,动态避障,静态避障,屎壳郎推屎回娘家

文章介绍了在Unity3D中使用的一种基于圆形障碍的避障算法,包括如何获取目标位置、避障计算以及在遇到不可抗拒因素时的动态路径更新。算法通过计算玩家与目标、障碍物之间的角度和距离来找到避开障碍的路径。

Unity3d圆形障碍避障算法,动态避障,静态避障

屎壳郎推屎回娘家
废话不多上图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1:根据,屎和娘家的位置做计算,不管屎在哪里,获取朝向娘家,屎后面一定距离的位置

//获取位置
    Vector3 GetTraget(Vector3 start, Vector3 end) //end 家
    {
   
   
        Vector3 normal = (end - start).normalized;
        float percent = -4; //距离屎保留一点距离
        return normal * (percent) + start;
    }

2:屎壳郎需要跑到屎后面,推屎回娘家,需要进行避障算法


                
Unity引擎中实现DWA(Dynamic Window Approach)局部避障算法,需要结合机器人运动学模型与环境感知模块,以实现实时避障功能。DWA是一种常用于移动机器人局部路径规划的算法,其核心思想是通过在动态窗口内评估所有可能的速度组合,选择最优速度以实现避障与目标导向的运动[^1]。 ### 实现步骤 1. **机器人运动模型定义** 在Unity中,可以通过定义刚体(Rigidbody)组件来模拟机器人的运动状态。DWA算法通常基于差速驱动模型,因此需要定义线速度与角速度的范围。例如: ```csharp public class RobotMovement : MonoBehaviour { public float maxLinearVelocity = 2.0f; public float maxAngularVelocity = 1.0f; public float accLinear = 0.5f; public float accAngular = 0.5f; private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { // 模拟DWA输出的速度 float desiredLinear = CalculateDesiredLinearVelocity(); float desiredAngular = CalculateDesiredAngularVelocity(); // 应用速度到刚体 rb.velocity = transform.forward * desiredLinear; rb.angularVelocity = Vector3.up * desiredAngular; } float CalculateDesiredLinearVelocity() { // 根据DWA算法计算最优速度 return maxLinearVelocity; // 示例值 } float CalculateDesiredAngularVelocity() { // 根据DWA算法计算最优角速度 return 0.0f; // 示例值 } } ``` 2. **环境感知与障碍物检测** Unity中可以使用射线检测(Raycast)或碰撞体(Collider)来感知障碍物。例如,通过多个射线模拟激光雷达(LiDAR),实时获取周围障碍物的距离信息: ```csharp void DetectObstacles() { int rayCount = 18; float angleStep = 20.0f; float rayDistance = 10.0f; for (int i = 0; i < rayCount; i++) { float angle = -rayCount / 2 * angleStep + i * angleStep; Quaternion rayRotation = Quaternion.Euler(0, angle, 0); Ray ray = new Ray(transform.position, rayRotation * transform.forward); RaycastHit hit; if (Physics.Raycast(ray, out hit, rayDistance)) { Debug.DrawLine(transform.position, hit.point, Color.red); // 记录障碍物距离 float distance = Vector3.Distance(transform.position, hit.point); // 处理距离数据 } else { Debug.DrawRay(transform.position, rayRotation * transform.forward * rayDistance, Color.green); } } } ``` 3. **DWA算法核心逻辑** DWA算法的核心在于动态窗口的生成与评估。动态窗口由线速度与角速度的约束组成,评估函数通常包括障碍物距离、目标方向与速度优先级。在Unity中,可以实现一个简单的评估函数: ```csharp struct VelocityCandidate { public float linear; public float angular; public float score; } VelocityCandidate EvaluateVelocities(float robotX, float robotY, float targetX, float targetY, List<Vector2> obstacles) { List<VelocityCandidate> candidates = new List<VelocityCandidate>(); float dt = Time.fixedDeltaTime; // 生成候选速度 for (float v = 0.0f; v <= maxLinearVelocity; v += 0.1f) { for (float w = -maxAngularVelocity; w <= maxAngularVelocity; w += 0.1f) { VelocityCandidate candidate = new VelocityCandidate(); candidate.linear = v; candidate.angular = w; // 预测位置 float predictedX = robotX + v * Mathf.Cos(robotAngle) * dt; float predictedY = robotY + v * Mathf.Sin(robotAngle) * dt; float predictedAngle = robotAngle + w * dt; // 评估障碍物距离 float minDistance = float.MaxValue; foreach (Vector2 obstacle in obstacles) { float distance = Mathf.Sqrt(Mathf.Pow(predictedX - obstacle.x, 2) + Mathf.Pow(predictedY - obstacle.y, 2)); if (distance < minDistance) { minDistance = distance; } } // 评估目标方向 float targetDirection = Mathf.Atan2(targetY - predictedY, targetX - predictedX); float angleDiff = Mathf.Abs(Mathf.DeltaAngle(predictedAngle * Mathf.Rad2Deg, targetDirection * Mathf.Rad2Deg)); // 综合评分 candidate.score = 0.5f * minDistance - 0.3f * angleDiff + 0.2f * v; candidates.Add(candidate); } } // 选择最优速度 candidates.Sort((a, b) => b.score.CompareTo(a.score)); return candidates[0]; } ``` 4. **实时更新机器人运动** 在每一帧更新中,根据DWA算法计算的最优速度更新机器人的运动状态,确保其能够动态避障并朝向目标前进。 ### 总结 通过上述步骤,可以在Unity中实现DWA局部避障算法,结合运动模型、环境感知与评估逻辑,使机器人能够在复杂环境中实现自主避障与导航。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值