最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)車輛跟隨滑??刂频膶?shí)例

 更新時(shí)間:2022年05月05日 08:54:08   作者:靜候佳茵  
這篇文章主要介紹了python實(shí)現(xiàn)車輛跟隨滑??刂?采用指數(shù)趨近律、等速趨近律、準(zhǔn)滑模控制的方法完成車輛跟隨問(wèn)題的仿真,運(yùn)行結(jié)果以圖片形式保存在同目錄下,需要的朋友可以參考下

上一篇文章介紹了Python使用OPENCV的目標(biāo)跟蹤算法實(shí)現(xiàn)自動(dòng)視頻標(biāo)注效果,感興趣的朋友點(diǎn)擊查看,使用滑模變結(jié)構(gòu)控制策略來(lái)解決汽車跟蹤問(wèn)題,今天通過(guò)本文介紹下python實(shí)現(xiàn)車輛跟隨滑??刂频膶?shí)例,內(nèi)容如下所示:

下面分別采用指數(shù)趨近律、等速趨近律、準(zhǔn)滑??刂频姆椒ㄍ瓿绍囕v跟隨問(wèn)題的仿真

import matplotlib.pyplot as plt
'''
指數(shù)趨近律、等速趨近律、準(zhǔn)滑??刂频能囕v跟隨問(wèn)題仿真, 運(yùn)行結(jié)果以圖片形式保存在同目錄下。
'''
# q1, q2分別是切換函數(shù)ei1, ei2前面的系數(shù)
q1, q2 = 2, 1
# lan是指數(shù)趨近律前面的系數(shù)
lan = 0.5
# 設(shè)定期望車間距均為12
l1, l2, l3, l4 = 12, 12, 12, 12
# 設(shè)定汽車質(zhì)量均為1000
m1, m2, m3, m4 = 1000, 1000, 1000, 1000
# 設(shè)定動(dòng)力學(xué)模型分子的速度平方項(xiàng)前的系數(shù)ci均為0.5(按照模型符號(hào)是負(fù)的)
c1, c2, c3, c4 = 0.5, 0.5, 0.5, 0.5
# 設(shè)定動(dòng)力學(xué)模型分子的常數(shù)項(xiàng)系數(shù)Fi均為200(按照模型符號(hào)是負(fù)的)
f1, f2, f3, f4 = 200, 200, 200, 200
# 設(shè)定五輛車汽車的位移、速度、加速度
x0, x1, x2, x3, x4 = [100.], [90.], [79.5], [68.5], [57.]  
v0, v1, v2, v3, v4 = [20.], [19.], [18.], [17.], [16.]
a1, a2, a3, a4 = [0.], [0.], [0.], [0.]
# 設(shè)定趨近律
def reaching_law(m:int , s:float, q2:int, mode='exponential'):
    '''
    mode: 指數(shù)趨近律exponential| 等速趨近律uniform| 準(zhǔn)滑??刂苢uasi_sliding
    '''
    if mode == 'exponential':
        return -m * lan * s / q2
    if mode == 'uniform':
        epslion = 0.3
        if s > 0:
            return -m * epslion / q2
        if s == 0:
            return 0
        if s < 0:
            return m * epslion / q2
    if mode == 'quasi_sliding':
        delta, epslion = 0.8, 2.
        if s < -delta:
            return m * epslion / q2
        if s > delta:
            return -m * epslion / q2
        else:
            return -m * epslion * s / (delta * q2)
# 設(shè)定第一輛車的加速度(分段函數(shù)), 要注意t的長(zhǎng)度和a0的長(zhǎng)度相等
def get_a0(t:list):    
    a0 = []
    for i in t:
        if i < 4:
            a0.append(0)
            continue
        if i >= 4 and i < 7:
            a0.append(-0.25*(i-4))
            continue
        if i >= 7 and i < 10:
            a0.append(-0.75)
            continue
        if i >= 10 and i < 16:
            a0.append(0.25*(i-10)-0.75) 
            continue
        if i >= 16 and i < 19:
            a0.append(0.75)
            continue
        if i >= 19 and i < 22:
            a0.append(0.25*(19-i)+0.75)
            continue
        if i >= 22 and i <= 30:                 # 注意i=30, 所以是取兩端, 故為301份
            a0.append(0)
    return a0
if __name__ == "__main__":
    t = [float(i/10) for i in range(301)]       # 將30秒劃分成301份, [0, 0.1, 0.2, ..., 29.9, 30]
    a0 = get_a0(t)
    # 四輛車的車間距誤差ei1列表
    e11 = [x1[0] - x0[0] + l1]
    e21 = [x2[0] - x1[0] + l2]
    e31 = [x3[0] - x2[0] + l3]
    e41 = [x4[0] - x3[0] + l4]
    # 四輛車的車間距誤差導(dǎo)數(shù)ei2的列表
    e12 = [v1[0] - v0[0]]
    e22 = [v2[0] - v1[0]]
    e32 = [v3[0] - v2[0]]
    e42 = [v4[0] - v3[0]]
    # 四輛車切換函數(shù)的列表
    s1 = [q1 * e11[0] + q2 * e12[0]]
    s2 = [q1 * e21[0] + q2 * e22[0]]
    s3 = [q1 * e31[0] + q2 * e32[0]]
    s4 = [q1 * e41[0] + q2 * e42[0]]
    # 四輛車控制律的列表
    u1, u2, u3, u4 = [0], [0], [0], [0]
    for i in range(1, 301):
        # 最前車0的速度、加速度更新,可以看出更新時(shí)用了直線等效, 0.1指的是時(shí)間標(biāo)度(列表t劃分的, 也是之后繪圖打印的x軸)
        v0.append(v0[i-1] + 0.1 * (a0[i] + a0[i - 1]) * 0.5)
        x0.append(x0[i-1] + 0.1 * (v0[i] + v0[i - 1]) * 0.5)
        # 車1的車間距誤差及導(dǎo)數(shù)更新
        e11.append(x1[i-1] - x0[i-1]+l1)
        e12.append(v1[i-1] - v0[i-1])
        # 車1的切換函數(shù)更新
        s1.append(q1 * e11[i] + q2 * e12[i])
        # 等效控制
        u1equ = c1 * (e12[i] + v0[i]) * (e12[i] + v0[i]) - m1 * q1 * e12[i] / q2 + m1 * a0[i] + f1 
        # 反饋控制(指數(shù)趨近律)
        u1n = reaching_law(m1, s1[i], q2)                           # 默認(rèn)采用指數(shù)趨近律, 下同
        # u1n = reaching_law(m1, s1[i], q2, mode='uniform')         # 采用等速趨近律
        # u1n = reaching_law(m1, s1[i], q2, mode='quasi_sliding')   # 采用準(zhǔn)滑模控制
        # 更新控制律
        u1.append(u1equ + u1n)
        # 利用控制律更新車1的加速度、速度、位移, 加速度是利用動(dòng)力學(xué)模型得到的
        a1.append((-c1 * v1[i-1] * v1[i-1] + u1[i] - f1) / m1)
        v1.append(v1[i-1] + 0.1 * (a1[i] + a1[i - 1]) * 0.5)
        x1.append(x1[i-1] + 0.1 * (v1[i] + v1[i - 1]) * 0.5)
        
        # 車2、3、4過(guò)程同車1  
        e21.append(x2[i-1] - x1[i-1]+l2)
        e22.append(v2[i-1] - v1[i-1])
        s2.append(q1 * e21[i] + q2 * e22[i])
        u2equ = c2 * (e22[i] + v1[i]) * (e22[i] + v1[i]) - m2 * q1 * e22[i] / q2 + m2 * a1[i] + f2
        u2n = reaching_law(m2, s2[i], q2)                           # 默認(rèn)采用指數(shù)趨近律
        # u2n = reaching_law(m2, s2[i], q2, mode='uniform')         # 采用等速趨近律
        # u2n = reaching_law(m2, s2[i], q2, mode='quasi_sliding')   # 采用準(zhǔn)滑模控制
        u2.append(u2equ + u2n)
        a2.append((-c2 * v2[i-1] * v2[i-1] + u2[i] -f2) / m2)
        v2.append(v2[i-1] + 0.1 * (a2[i] + a2[i - 1]) * 0.5)
        x2.append(x2[i-1] + 0.1 * (v2[i] + v2[i - 1]) * 0.5)
        e31.append(x3[i-1] - x2[i-1]+l3)
        e32.append(v3[i-1] - v2[i-1])
        s3.append(q1 * e31[i] + q2 * e32[i])
        u3equ = c3 * (e32[i] + v2[i]) * (e32[i] + v2[i]) - m3 * q1 * e32[i] / q2 + m3 * a2[i] + f3 
        u3n = reaching_law(m3, s3[i], q2)
        # u3n = reaching_law(m3, s3[i], q2, mode='uniform')
        # u3n = reaching_law(m3, s3[i], q2, mode='quasi_sliding')
        u3.append(u3equ + u3n)
        a3.append((-c3 * v3[i-1] * v3[i-1] + u3[i] -f3) / m3)
        v3.append(v3[i-1] + 0.1 * (a3[i] + a3[i - 1]) * 0.5)
        x3.append(x3[i-1] + 0.1 * (v3[i] + v3[i - 1]) * 0.5)
        e41.append(x4[i-1] - x3[i-1]+l4)
        e42.append(v4[i-1] - v3[i-1])
        s4.append(q1 * e41[i] + q2 * e42[i])
        u4equ = c4 * (e42[i] + v3[i]) * (e42[i] + v3[i]) - m4 * q1 * e42[i] / q2 + m4 * a3[i] + f4 
        u4n = reaching_law(m4, s4[i], q2)
        # u4n = reaching_law(m4, s4[i], q2, mode='uniform')
        # u4n = reaching_law(m4, s4[i], q2, mode='quasi_sliding')
        u4.append(u4equ + u4n)
        a4.append((-c4 * v4[i-1] * v4[i-1] + u4[i] -f4) / m4)
        v4.append(v4[i-1] + 0.1 * (a4[i] + a4[i - 1]) * 0.5)
        x4.append(x4[i-1] + 0.1 * (v4[i] + v4[i - 1]) * 0.5)
    
    
    # 開始繪圖
    # 繪制加速度曲線
    plt.figure()                            # 設(shè)置畫布
    plt.plot(t, a0, label='car 0')     # :是指繪制點(diǎn)劃線
    plt.plot(t, a1, label='car 1')
    plt.plot(t, a2, label='car 2')
    plt.plot(t, a3, label='car 3')
    plt.plot(t, a4, label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("Acceleration(m/s^2)",fontsize=13)
    plt.xlim(0, 30)    
    plt.legend()
    plt.savefig('./acceleration.png')       # 保存圖像
    # 繪制速度曲線
    plt.clf()                               # 清空畫布,不然會(huì)前后圖像會(huì)重疊
    plt.plot(t, v0, ':', label='car 0')    
    plt.plot(t, v1, ':', label='car 1')
    plt.plot(t, v2, ':', label='car 2')
    plt.plot(t, v3, ':', label='car 3')
    plt.plot(t, v4, ':', label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("velocity(m/s)",fontsize=13)
    plt.xlim(0, 30)    
    plt.legend()
    plt.savefig('./velocity.png')           # 保存圖像
    # 繪制位置曲線
    plt.clf()
    plt.plot(t, x0, ':', label='car 0')
    plt.plot(t, x1, ':', label='car 1')
    plt.plot(t, x2, ':', label='car 2')
    plt.plot(t, x3, ':', label='car 3')
    plt.plot(t, x4, ':', label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("position(m)",fontsize=13)
    plt.xlim(0, 30)    
    plt.legend()
    plt.savefig('./position.png')
    # 繪制車間距誤差ei1曲線
    plt.clf()
    plt.plot(t, e11, label='car 1')
    plt.plot(t, e21, label='car 2')
    plt.plot(t, e31, label='car 3')
    plt.plot(t, e41, label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("space error(m)",fontsize=13)
    plt.xlim(0, 30)
    plt.legend()
    plt.savefig('./space_error.png')
    # 繪制車間距誤差導(dǎo)數(shù)ei2曲線
    plt.clf()
    plt.plot(t, e12, ':', label='car 1')
    plt.plot(t, e22, ':', label='car 2')
    plt.plot(t, e32, ':', label='car 3')
    plt.plot(t, e42, ':', label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("space_error_derivative(m)",fontsize=13)
    plt.xlim(0, 30)
    plt.legend()
    plt.savefig('./space_error_derivative.png')
    # 繪制切換函數(shù)曲線
    plt.clf()
    plt.plot(t, s1, label='car 1')
    plt.plot(t, s2, label='car 2')
    plt.plot(t, s3, label='car 3')
    plt.plot(t, s4, label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("Switching Function",fontsize=13)
    plt.xlim(0, 30)
    plt.legend()
    plt.savefig('./Switching_Function.png')
    # 繪制控制輸入U(xiǎn)曲線
    plt.clf()
    plt.plot(t, u1, label='car 1')
    plt.plot(t, u2, label='car 2')
    plt.plot(t, u3, label='car 3')
    plt.plot(t, u4, label='car 4')
    plt.xlabel("Time(s)",fontsize=13)
    plt.ylabel("Control Input",fontsize=13)
    plt.xlim(0, 30)
    plt.legend()
    plt.savefig('./Control_Input.png')

到此這篇關(guān)于python實(shí)現(xiàn)車輛跟隨滑??刂频奈恼戮徒榻B到這了,更多相關(guān)python滑模控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • numpy使用fromstring創(chuàng)建矩陣的實(shí)例

    numpy使用fromstring創(chuàng)建矩陣的實(shí)例

    今天小編就為大家分享一篇numpy使用fromstring創(chuàng)建矩陣的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 利用Python實(shí)現(xiàn)批量裁剪圖片

    利用Python實(shí)現(xiàn)批量裁剪圖片

    這篇文章主要為大家詳細(xì)介紹了如何基于Python如何批量裁剪圖片并保存,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的小伙伴可以了解一下
    2023-10-10
  • python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例

    python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例

    下面小編就為大家分享一篇python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python中TypeError: int object is not iterable錯(cuò)誤分析及解決辦法

    Python中TypeError: int object is not 

    在Python中,當(dāng)你嘗試對(duì)一個(gè)非迭代對(duì)象(如整數(shù)、浮點(diǎn)數(shù)等)使用迭代操作(如for循環(huán)、列表推導(dǎo)式中的迭代等)時(shí),會(huì)觸發(fā)TypeError: 'int' object is not iterable錯(cuò)誤,所以本文給大家介紹了Python中TypeError: int object is not iterable錯(cuò)誤分析及解決辦法
    2024-08-08
  • python實(shí)現(xiàn)zabbix發(fā)送短信腳本

    python實(shí)現(xiàn)zabbix發(fā)送短信腳本

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)zabbix發(fā)送短信腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Django 按組控制權(quán)限類及定義方法詳解

    Django 按組控制權(quán)限類及定義方法詳解

    這篇文章主要為大家介紹了Django 按組控制權(quán)限類及定義方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • PyTorch一小時(shí)掌握之基本操作篇

    PyTorch一小時(shí)掌握之基本操作篇

    這篇文章主要介紹了PyTorch一小時(shí)掌握之基本操作篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python如何實(shí)現(xiàn)單向鏈表及單向鏈表的反轉(zhuǎn)

    python如何實(shí)現(xiàn)單向鏈表及單向鏈表的反轉(zhuǎn)

    這篇文章主要介紹了python如何實(shí)現(xiàn)單向鏈表及單向鏈表的反轉(zhuǎn),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python3簡(jiǎn)單實(shí)例計(jì)算同花的概率代碼

    Python3簡(jiǎn)單實(shí)例計(jì)算同花的概率代碼

    這篇文章主要介紹了Python3簡(jiǎn)單實(shí)例計(jì)算同花的概率代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Python中的socket網(wǎng)絡(luò)模塊介紹

    Python中的socket網(wǎng)絡(luò)模塊介紹

    這篇文章主要介紹了Python中的socket網(wǎng)絡(luò)模塊介紹,Python 中,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

广灵县| 昌平区| 南陵县| 山东| 贵港市| 潜江市| 昆山市| 浠水县| 胶南市| 大渡口区| 洛宁县| 鹰潭市| 沧州市| 行唐县| 葵青区| 饶平县| 法库县| 兰坪| 师宗县| 昌邑市| 灵武市| 临澧县| 无锡市| 芜湖县| 拉萨市| 朝阳区| 鄂托克前旗| 濮阳市| 青海省| 东宁县| 庄浪县| 手游| 鸡西市| 济南市| 称多县| 石城县| 耒阳市| 沙雅县| 合阳县| 新宾| 原平市|