自动驾驶(七十三)---------离散点计算曲率

       在自动驾驶中,很常见的一个问题是通过离散点计算曲率,奇怪的是网上居然找不到我需要的资料,也许是我描述的不对,总之找了很久都不是很满意,所以干脆自己来总结一下吧。

        网上也不是找不到资料,但是大部分都是这样:

         (1)通过曲率公式,首先你要知道曲线的表达式,然后代入公式计算。

         (2)离散点也需要先polyfit拟合成多项式,再利用上面的公式计算曲率。

         (3)在matlab中,用csape()对离散点进行Spline插值,然后用fnder()对得到曲线求导,最后用fnval()对导数求值即可。

         (4)通过标量公式,计算曲率。

         (5)三个点外接圆:但是三个点计算,不好推广。

          总之以上的一些方法都不直接,拐弯抹角计算曲率,曲率直接理解就是角度变化率,近似对应于曲率半径的倒数,利用一串点鲁棒的计算对应的曲率就应该很简单才对,不要什么拟合多项式再代公式求曲率,简直是隔靴搔痒、舍本逐末。这里我总结一种直观的方法,抛砖引玉:

1. 离散点拟合圆

         曲率的倒数就是半径,那我先拟合圆,知道半径也就知道曲率了,圆的拟合可以使多个点,拟合也有足够的鲁棒性。

         用圆的展开公式:。圆心为,圆的半径就是 。

         误差方程为:        对于自变量a、b、c求偏导为0:

         得到: 为了直观和看代码方便,我们假设 

                   上式可以描述为:

          通过矩阵知识可以解出:


void FitCenterByLeastSquares(std::vector<Point3D> mapPoint, Point3D &centerP, double &radius) {
    double sumX = 0, sumY = 0;
    double sumXX = 0, sumYY = 0, sumXY = 0;
    double sumXXX = 0, sumXXY = 0, sumXYY = 0, sumYYY = 0;

    int pCount = mapPoint.size();
    for (int i = 0; i<pCount; i++){ 
        sumX += mapPoint[i].x;
        sumY += mapPoint[i].y;
        sumXX += pow(mapPoint[i].x,2);
        sumYY += pow(mapPoint[i].y,2);
        sumXY += mapPoint[i].x * mapPoint[i].y;
        sumXXX += pow(mapPoint[i].x,3);
        sumXXY += pow(mapPoint[i].x,2) * mapPoint[i].y;
        sumXYY += mapPoint[i].x * pow(mapPoint[i].y,2);
        sumYYY += pow(mapPoint[i].y,3);
    }

    double M1 = pCount * sumXY - sumX * sumY;
    double M2 = pCount * sumXX - sumX * sumX;
    double M3 = pCount * (sumXXX + sumXYY) - sumX * (sumXX + sumYY);
    double M4 = pCount * sumYY - sumY * sumY;
    double M5 = pCount * (sumYYY + sumXXY) - sumY * (sumXX + sumYY);

    double a = (M1 * M5 - M3 * M4) / (M2 * M4 - M1 * M1);
    double b = (M1 * M3 - M2 * M5) / (M2 * M4 - M1 * M1);
    double c = -(a * sumX + b * sumY + sumXX + sumYY) / pCount;

    //圆心XY 半径
    double xCenter = -0.5 * a;
    double yCenter = -0.5 * b;
    radius = 0.5 * sqrt(a * a + b * b - 4 * c);
    centerP.x = xCenter;
    centerP.y = yCenter;
}

2. 计算正负号

        通过上面我们计算出圆的半径,倒数就是曲率,那么曲率的正负号呢?这里我们也需要一种方法优雅的计算它的正负号,不然有失风度,目前我能给出的方法是直线与圆心的关系:

        计算起始点与终点的直线,判断该直线与圆心的关系从而判断曲率的正负号,又因为前面已经计算了很多最小二乘法的中间变量,要是不用也可惜了,干脆拟合直线算了:

       类似的误差方程:    偏导为0得到:和   

       联立解方程得到:      最后把圆心代入方程判断正负即可。

       这里给出新加的代码,只需要在原来的基础上只要加3行代码即可,基本上还算优雅吧:

    //计算曲率正负号
	a = (sumXY-((sumX*sumY)/pCount))/(sumXX-(sumX*sumX/pCount));
	b = (sumY-a*sumX)/pCount;
	centerP.z = (xCenter*a+b<yCenter)?(1/radius):(-1/radius);

        

### 回答1: 弯矩-曲率关系是研究结构弯曲时曲率与弯矩之间的关系。而条带法是一种常用来推导弯矩-曲率关系的数学方法。在Matlab编程中,可以利用条带法来求解弯矩-曲率关系。 在使用Matlab编程求解弯矩-曲率关系时,首先需要将结构的截面划分成一系列条带(或称为梁)。然后,根据弯矩和曲率的定义,可以得到结构中每个条带的弯矩和曲率之间的关系。 具体而言,在Matlab中可以定义一个矩阵,保存结构的截面形状信息。对于每个条带,可以计算其弯矩和曲率。根据弯矩定义,弯矩是外力对截面的作用力与截面法线之间的乘积。而根据曲率定义,曲率是结构的截面处弯曲曲线的曲率半径的倒数。 在Matlab中,可以利用数值分析方法,如有限差分法,来计算截面的弯矩和曲率。通过对每个条带进行相应的计算,可以得到整个结构的弯矩-曲率关系。 在编写Matlab代码时,可以使用循环语句来依次计算每个条带的弯矩和曲率,并将结果保存在一个矩阵中。最后,可以在Matlab中绘制弯矩-曲率曲线图,以直观地表示弯矩和曲率之间的关系。 需要注意的是,在使用条带法计算弯矩-曲率关系时,需要做一系列的假设和简化,如假设截面具有均匀材料和不变截面积等。这些假设可能会对结果产生一定的影响,因此在实际使用中需要注意。 总之,Matlab编程中的弯矩-曲率关系与条带法相关,可以通过数值分析的方法计算结构的弯矩和曲率,从而得到弯矩-曲率关系的结果。 ### 回答2: 弯矩-曲率关系的条带法是一种用于计算结构边界应力和应变的方法。它是根据弯曲理论和材料的本构关系建立的。 首先, 通过分析结构的变形情况和受力状态,可以得到结构的弯曲方程。然后, 在结构变形情况下,将结构分割为若干条带,每个条带内的应力和应变被假设为常数。再根据弹性力学理论的应力-应变关系,可以计算出每个条带内的弯矩和曲率。 在Matlab中实现这个方法,可以使用数值计算的方法求解差分方程。首先,需要定义结构的几何形状和材料性质。然后,根据结构的弯曲方程和边界条件,建立差分方程。接着,使用迭代的方法,按照条带从边界到内部逐步求解弯矩和曲率。最后,根据所得到的弯矩和曲率,可以计算出结构的应力和应变分布。 在Matlab中,可以使用循环结构和数组操作来实现差分方程的求解。首先,定义一个空数组来存储每个条带内的弯矩和曲率。然后,使用循环结构来逐步求解每个条带的弯矩和曲率,并将结果保存到数组中。最后,根据所得到的弯矩和曲率,可以计算出结构的应力和应变。 使用Matlab编程的弯矩-曲率关系的条带法,可以较为准确地计算出结构的应力和应变分布。 ### 回答3: 弯矩-曲率关系是结构力学中的重要概念,用于描述杆件或梁的受力性质。而条带法是一种分析结构应力与变形的方法。Matlab编程可以用来计算和分析弯矩-曲率关系,并采用条带法求解结构的应力和变形。 使用Matlab编程时,可以通过输入横截面的几何尺寸和材料力学参数等基本信息来构建结构模型。然后,通过利用弯矩-曲率关系公式,计算在不同曲率下的弯矩值。 接下来,利用条带法原理,将结构离散为若干个独立的条带单元,并建立相应的位移分布和弯矩分布模型。以梁为例,应用条带法可将整个梁分为若干段,每段使用规定的位移形函数进行展开,并通过求解位移参数,得到每个条带区域内的应力和位移分布。 在求解过程中,可通过Matlab的线性代数和数值方法库函数,求解得到结构的应力分布和位移分布。 最后,结合Matlab的数据可视化功能,能够将计算结果以图形形式展示出来,以便更好地理解和解释结构的应力和变形性质。 总之,通过Matlab编程,可以方便地进行弯矩-曲率关系的计算和条带法的分析。这样的工具和方法在工程结构设计和计算中具有很大的应用潜力,有助于优化设计方案和解决结构力学中的实际问题。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值