计算角度以避开障碍物

时间:2016-03-21 14:28:15

标签: javascript node.js math geometry artificial-intelligence

我正在为一个名为Ogar的项目制作机器人,这是一个用Node.js编写的Agar.io服务器实现。

这个机器人有一个障碍,一个叫做病毒的绿色尖刺细胞(见插图)。我需要对这个机器人进行编程以避免这个障碍,但我没有运气。由于插图中有很多目标,因此它基于更新。

Illustration of what I want

以下是我到目前为止的代码。

BotPlayer.prototype.avoidObstacles = function(cell, angle) {
    // Sum up all of the vector angles of obstacles to cell and react against it
    var angleSum = 0;
    var collided = this.collisionFromList(cell, this.obstacles);
    if (collided.length == 0) return angle; // Not to return NaN

    for (var i = 0; i < collided.length; i++) {
        angleSum += this.angle(cell.position, collided[i].position);
    }

    angleSum /= collided.length; // Average out the angle sum

    // TODO: Find closest available edge
    angleSum += Math.PI / 2;

    return angle + angleSum;
};

这种做法在大多数情况下都有效,但机器人有时会完全忽略障碍物(this.collisionFromList(cell, this.obstacles);完全没问题)并最终会逐渐通过它(爆炸成很多细胞)。

BotPlayer.prototype为这种计算提供了许多有用的功能。请参阅this link

我不需要任何寻路争吵,只需要这个简单的避免措施。

2 个答案:

答案 0 :(得分:1)

您可以采用其他方法来实现目标。方法是使用吸引子来描述系统中的实体。你的“机器人”是agent,它有一个位置,它知道世界上其他实体及其吸引力。假设您的目的地+1 attraction-X attraction力,障碍物agent强制,有效排斥“僵尸”(/** * @param {Array.<{position:Vector2, attraction:Number}>} entities */ Agent.prototype.calculateDirectionVector = function(entities){ var agentPosition = this.position; var result = new Vector2(0,0); entities.forEach(function(entity){ //calculate separation between agent and entity var displacement = entity.position.clone().sub(agentPosition); //figure out distance between entities var distance = displacement.length(); //dampen influence of attraction linearly with distance var influence = entity.attraction/distance; //produce force vector exerted by this entity on the agent var force = displacement.normalize().multiplyScalar(influence); //add up forces on the entity result.add(force); }); //normalize the resulting vector result.normalize(); return result; } )。

这是一个决策伪代码:

echo "show stat" | socat unix-connect:/var/run/haproxy/admin.sock stdio | grep webservers,BACKEND | cut -d , -f8

答案 1 :(得分:0)

这是一个很大的启发式方法,但如果您希望保持这种逻辑,那么请考虑考虑与病毒的笛卡尔距离,因为您显然可以访问它们的位置。

该功能为BotPlayer.prototype.getDistBotPlayer.prototype.getAccDist

您可以使用阈值DIST_MIN和简单if或使用angle/distance(更好)等功能来减少远程病毒对角度的影响。