【问题标题】:Robot crosses boundary on collision rather than bounce back while implementing particle filter机器人在实现粒子过滤器时越过碰撞边界而不是反弹
【发布时间】:2014-08-14 03:04:08
【问题描述】:

我编写了以下代码,我试图在其中创建粒子过滤器。我面临的问题是,即使在使用相交方法和其他条件后,机器人有时也会与障碍物重叠。而且,它随着拐角一次次晃动,从左上角出界。

我检查碰撞,然后如果似乎有碰撞,我将机器人反向移动 x 量。

我通过以下方法计算数量x,其中x表示当前位置。

public void setXPosition_robot(int x)
    {
        double distance=0;
        distance = unit_moved + randomDouble(0, forwardNoise);
        robot_x= (int) (x + Math.sin(Math.toRadians(robot_orientation))*distance);
        //System.out.println("Robot_X:"+robot_x);
    }

我正在使用以下代码来检查冲突:

private void adjustRobotOrientation(Graphics2D g)
{
    int x=robot_x;
    int y=robot_y;

    if((x<0)&&(y<0))
    {
        robot_orientation=robot_orientation+randomDouble(160, 180);
    }

    if((x>620)||((y>395))||((x<1))||((y<1)))
    {
        robot_orientation=robot_orientation+randomDouble(160, 220);
    }
 }

private void collisionAvoidanceRobot(int x, int y, int r)
    {
        boolean collide1=false;
        boolean collide2=false;
        boolean collide3=false;
        boolean collide4=false;
        boolean collide5=false;
        boolean collide6=false;
        x+=unit_moved;
        y+=unit_moved;

        Shape collisionrobot=new Ellipse2D.Double(x,y,r,r);
        collide1=collisionrobot.intersects(obst1);
        if(collide1)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }
        collide2=collisionrobot.intersects(obst2);
        if(collide2)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }
        collide3=collisionrobot.intersects(obst3);
        if(collide3)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }
        collide4=collisionrobot.intersects(obst4);
        if(collide4)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }
        collide5=collisionrobot.intersects(obst5);
        if(collide5)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }
        collide6=collisionrobot.intersects(obst6);
        if(collide6)
        {
            robot_orientation=robot_orientation+randomDouble(160, 220);
        }

    }

如果你想看,完整的代码在两个文件中: 1.http://pastebin.com/ZYfSzptc(主班) 2.http://pastebin.com/hqTTyq5n

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小、完整、可验证的示例)。在此处发布,而不是在链接中发布。 2)另见Collision detection with complex shapes
  • 第一个ifadjustRobotOrientation 有什么关系?

标签: java swing collision-detection


【解决方案1】:

如果机器人的速度使其在时钟滴答之间移动经过障碍物,则不会检测到碰撞。你可以

  • 使用更精细的刻度和更大的对象来排除效果,如KineticModel 引用的here 所示。

  • 预测效果并进行补偿,如图here

两个例子都使用了here引用的向量方法。

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多