Java控制具有两个轮速的物体。

3
假设我有一个双轮物体,每个轮子都有独立的速度(lWheelV和rWheelV分别表示左右轮的速度)。每个轮子的速度限制在范围[-1, 1]之间(即在-1和1之间)。
  • 如果lWheelV = 1 & rWheelV = 1,则物体向前移动
  • 如果lWheelV = -1 & rWheelV = 1,则物体向左转(逆时针方向)
  • 如果lWheelV = 0.5 & rWheelV = 1,则物体将向前驱动,同时缓慢向左转
  • 如果lWheelV = -1 & rWheelV = -1,则物体将向后移动。
这可以更容易地在以下图像中可视化: object motion diagram 我需要什么样的数学知识来描述这样的对象,并且更重要的是,我如何在Java中实现能够复制这种行为的软件。

你是在询问可视化、算法还是代码方面的问题? 您能更正式一些吗? - Hurda
不是可视化,而是算法/代码来计算出新位置。 - Conner Ruhl
对于那些投票关闭的人,请理解这是机器人和物理学中经常出现的实际问题。这样的系统如果没有对支撑系统的数学有牢固的理解,实现起来并不完全琐碎。事实上,原帖作者已经付出了一些努力来清晰地描述该系统,这应该算作他的优点。 - Andrew Walker
哇,这被编辑得一干二净了 :) - Conner Ruhl
你是否偶然使用了Scribbler机器人? - japreiss
1个回答

1

这取决于很多因素,如车辆宽度、帧率等等...

然而,以下是一些提示:

  • 要计算车辆在一个帧中的旋转,可以使用反正切函数。

    float leftWheel = 1.0f;
    float rightWheel = 0.5f;
    float vehicleWidth = 1.0f;
    
    float diff = rightWheel - leftWheel;
    float rotation = (float) Math.atan2(diff, vehicleWidth);
    
  • 要确定车辆沿其轴线移动的速度,请使用以下代码:

    float speedAlongAxis = leftWheel + rightWheel;
    speedAlongAxis *= 0.5f;
    
  • 要通过第一个提示中计算出的角度旋转车辆的轴:

    float axisX = ...;
    float axisY = ...;
    /* 确保向量(axisX,axisY)的长度为1(称为“标准化”)*/
    
    float x = axisX;
    float y = axisY;
    
    axisX = (float) (x * Math.cos(rotation) - y * Math.sin(rotation));
    axisY = (float) (x * Math.sin(rotation) + y * Math.cos(rotation));
    
  • 要沿轴移动车辆:

    float vehicleX = ...;
    float vehicleY = ...;
    
    vehicleX += axisX * speedAlongAxis;
    vehicleY += axisY * speedAlongAxis;
    
  • 一个normalise()方法看起来像这样:

    public float normalise()
    {
        float len = (float) Math.sqrt(x * x + y * y);
        x /= len;
        y /= len;
        return len;
    }
    

1
难道不应该是 Math.atan2(diff, vehicleWidth) 吗? - Conner Ruhl
请注意,我不确定物理学方面的内容,但我认为它会接近。这可能是一个开始。 - Martijn Courteaux
@ConnerRuhl:好的!已更改。谢谢。 - Martijn Courteaux
我认为你之所以问这个问题是因为normalise()函数的调用?将向量归一化是将其缩放,使其长度变为1。 - Martijn Courteaux
我无法使用向量类,您能否重新编写答案以排除使用向量的代码? - Conner Ruhl
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接