找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4083|回復(fù): 34
打印 上一主題 下一主題
收起左側(cè)

問個算法問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:401564 發(fā)表于 2023-7-11 12:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
之前搞過一個自行車尾燈項目,停工一段時間,現(xiàn)在又重新啟動了目前主要的問題是自動感應(yīng)剎車的問題
就是硬件上會有一個重力加速器,用來感應(yīng)剎車,只要單車在行進過程有減速的動作,剎車燈就會亮起
比如:
重力加速器傳回的數(shù)據(jù)可能是
0.1g
0.2g
0.3
0.6
0.65
1.0g
我想問的是,有沒有什么算法是檢測數(shù)據(jù),或者數(shù)組的,只要在數(shù)據(jù)一直上升,或者是一直下降,條件才成立的
只要一個大概的思路,代碼我自己寫
先謝謝了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2023-7-11 13:13 | 只看該作者
如果是速度傳感器才需要判斷一直上升或者下降,你既然用了加速度傳感器,判斷輸出的極性和大小就可以了。
回復(fù)

使用道具 舉報

板凳
ID:1034262 發(fā)表于 2023-7-11 13:24 | 只看該作者
加速度不可能一直上升或下降的。
回復(fù)

使用道具 舉報

地板
ID:88256 發(fā)表于 2023-7-11 13:58 | 只看該作者
設(shè)兩個位變量,分別代表上升和下降,一個整型變量用來計數(shù),再用一個變量保存上次的值,初始都為0,取當(dāng)前值和上次的值進行比較,相等清兩個位變量和計數(shù)值,在不相等的處理里,如果大于的并且上升的值也為1,則計數(shù)加一;如果小于且下降的值也為1,則計數(shù)加一,否則計數(shù)清零,然后置位對應(yīng)的位并將此次值賦給上次的值,取計數(shù)值進行判斷,達(dá)到數(shù)值的進行相應(yīng)的處理。
回復(fù)

使用道具 舉報

5#
ID:161164 發(fā)表于 2023-7-11 15:10 | 只看該作者
新值>舊值 :上升
新值<舊值 :下降
回復(fù)

使用道具 舉報

6#
ID:712097 發(fā)表于 2023-7-11 15:24 | 只看該作者
用陀螺儀芯片應(yīng)該更準(zhǔn)確吧,用算法也能實現(xiàn),只要比較前后兩個重力數(shù)據(jù)的大小,例如上述6個數(shù)據(jù)(例如為D0-D5),if((D1-D0>0)&&(D2-D1>0)&&(D3-D2>0)&&(D4-D3>0)&&(D5-D4>0)){}//加速度
回復(fù)

使用道具 舉報

7#
ID:404160 發(fā)表于 2023-7-11 15:33 | 只看該作者
可以根據(jù)重力加速度數(shù)據(jù)來判斷單車是否減速并進行剎車燈的控制。  一種簡單的算法是設(shè)置一個閾值來判斷減速的情況。當(dāng)重力加速度超過某個閾值時,認(rèn)為單車在減速,并點亮剎車燈。  具體步驟如下:  初始化一個閾值(例如0.3g),用來判斷是否減速。 持續(xù)接收重力加速度數(shù)據(jù)。 每次接收到新的數(shù)據(jù)時,將其與上一次的數(shù)據(jù)進行比較。 如果新數(shù)據(jù)與上一次數(shù)據(jù)之間的差值大于設(shè)定的閾值,則觸發(fā)剎車燈。 更新上一次數(shù)據(jù)為當(dāng)前數(shù)據(jù),繼續(xù)接收下一個數(shù)據(jù)。 注意,根據(jù)這個算法,當(dāng)單車在減速過程中,剎車燈將會持續(xù)亮起,直到單車加速或者停止減速。  你可以根據(jù)具體需求和實際情況來調(diào)整閾值的大小,以達(dá)到準(zhǔn)確判斷減速的目的。此外,為了更精確地判斷減速,請確保重力加速度傳感器的采樣率足夠高,以便捕捉到細(xì)微的變化。  這只是一種簡單的算法,如果你有更復(fù)雜的需求或者更多的數(shù)據(jù),可以考慮使用機器學(xué)習(xí)算法,如支持向量機(SVM)或者神經(jīng)網(wǎng)絡(luò),來對減速行為進行分類和判斷。這種方法可能需要更多的訓(xùn)練數(shù)據(jù)和模型設(shè)計,但可以提供更準(zhǔn)確的結(jié)果。
回復(fù)

使用道具 舉報

8#
ID:1088099 發(fā)表于 2023-7-11 15:56 | 只看該作者
自動感應(yīng)剎車亮燈不如由剎車動作來進行亮燈
回復(fù)

使用道具 舉報

9#
ID:227818 發(fā)表于 2023-7-11 16:04 | 只看該作者
老大,您的意思是,重力加速器傳回的數(shù)據(jù),可能是連續(xù)的,不停的變化,當(dāng)連續(xù)上升或下降時,剎車燈開始動作?
如果我猜的對的話,可不可以這樣,需要檢測重力加速器傳回的數(shù)據(jù)連續(xù)上升時,定時(比如說1mS一次)讀取數(shù)據(jù),減去上一次讀取的數(shù)據(jù),為正,或者連續(xù)幾次為正,則啟動剎車燈。檢測重力加速器傳回的數(shù)據(jù)連續(xù)下降時,則相反。
回復(fù)

使用道具 舉報

10#
ID:343102 發(fā)表于 2023-7-11 17:24 | 只看該作者
試試股中的macd方法。能過濾掉震動干擾,還能適應(yīng)各種速度。
回復(fù)

使用道具 舉報

11#
ID:1086688 發(fā)表于 2023-7-11 17:28 | 只看該作者
我想的比較簡單,能否用最新收到的數(shù)據(jù)跟前一個收到的數(shù)據(jù)一直比較,一直是大于就是遞增,反之就是遞減,如果違反了遞增或者遞減就改變標(biāo)志位,然后就能通過這個標(biāo)志位來作為判斷條件
回復(fù)

使用道具 舉報

12#
ID:857072 發(fā)表于 2023-7-11 17:32 來自手機 | 只看該作者
減速就亮,關(guān)鍵減速不一定是剎車。ū热缬猩掀聹p速,人蹬的力變小減速了,路面不平減速。),沒有減速也不一定沒剎車(比如下坡剎車了速度沒降,邊蹬邊剎車速度沒降)。
回復(fù)

使用道具 舉報

13#
ID:857072 發(fā)表于 2023-7-11 17:33 來自手機 | 只看該作者
加速度計算是否剎車,幾乎不可信
回復(fù)

使用道具 舉報

14#
ID:404160 發(fā)表于 2023-7-11 21:26 | 只看該作者
如果磁場強度呈非線性變化且你需要確定兩個典型值進行測量,你可以考慮以下方法來解決這個問題:1. 使用不同強度設(shè)定:嘗試在不同的強度設(shè)定下測量磁場強度,并記錄相關(guān)的數(shù)據(jù)。這樣可以獲得多個數(shù)據(jù)點,并在不同強度下觀察磁場強度的變化情況。2. 使用插值方法:如果你已經(jīng)測量了一些具體設(shè)定下的磁場強度值,你可以使用插值方法來推斷其他強度設(shè)定下的磁場強度。通過在已知數(shù)據(jù)點之間建立一個函數(shù)模型,可以預(yù)測其他設(shè)定下的磁場強度。3. 使用標(biāo)準(zhǔn)曲線:某些設(shè)備可能附帶有標(biāo)準(zhǔn)曲線或校準(zhǔn)曲線。這些曲線可以提供給定設(shè)定下的磁場強度值的參考。通過將測量值與標(biāo)準(zhǔn)曲線進行比較,你可以確定磁場強度的近似值。4. 使用專業(yè)測量工具:如果磁場強度對于你的應(yīng)用非常重要,你可以考慮使用專業(yè)的磁場測量工具。這些工具能夠提供準(zhǔn)確的磁場強度測量,并且可以處理非線性變化的情況。無論使用哪種方法,確保在進行測量之前了解設(shè)備的規(guī)格和特性,并遵循正確的操作步驟以確保準(zhǔn)確測量磁場強度。
回復(fù)

使用道具 舉報

15#
ID:685462 發(fā)表于 2023-7-11 22:03 | 只看該作者
個人看法,比如以時間間隔0.1s采集數(shù)據(jù),然后做曲線,求取斜率。根據(jù)斜率就能知道是增還是加速還是減速。規(guī)則就是持續(xù)0.5s,斜率連續(xù)小于0,就是減速,亮燈。持續(xù)時間根據(jù)實際測試調(diào)整就行。如果自行車是碟剎,弄個光電計數(shù)就行,簡單實用。
回復(fù)

使用道具 舉報

16#
ID:1028610 發(fā)表于 2023-7-11 23:27 | 只看該作者
有一個想法:通過計算一組數(shù)據(jù)的斜率來判斷,并界定剎車界限,即正負(fù)值或者是一定斜率范圍(線性回歸法);或者是對數(shù)據(jù)做差分計算,并逐一比較大小等等
回復(fù)

使用道具 舉報

17#
ID:320306 發(fā)表于 2023-7-12 09:21 | 只看該作者
兩個條件;1、加速度減少過快 2、加速度為0速度很小,我們以前是這樣做的 有一個編碼器檢測速度配合用的。
回復(fù)

使用道具 舉報

18#
ID:111463 發(fā)表于 2023-7-12 10:43 | 只看該作者
記錄成數(shù)組數(shù)據(jù),然后通過數(shù)學(xué)方法分析即可,例如求不同時間段的差或者導(dǎo)數(shù),統(tǒng)計總量作為分析依據(jù)
回復(fù)

使用道具 舉報

19#
ID:1088185 發(fā)表于 2023-7-12 11:13 | 只看該作者
假設(shè)輸入為Y

reg<<=1;
if (Y>Y_last) reg++;

reg&=0x3F;  // 假設(shè)要檢測連續(xù)6次數(shù)據(jù)上升或下降

if (reg == 0x3F) {
  // 連續(xù)6次上升
}
if (reg==0) {
// 連續(xù)6次下降
}

Y_last=Y;
回復(fù)

使用道具 舉報

20#
ID:401564 發(fā)表于 2023-7-12 12:34 | 只看該作者
a185980800 發(fā)表于 2023-7-11 17:33
加速度計算是否剎車,幾乎不可信

這種單車尾燈在馬云家大把的,而且都是實際測試可行的
回復(fù)

使用道具 舉報

21#
ID:158391 發(fā)表于 2023-7-13 01:43 | 只看該作者
這種剎車感覺就不合理,剎車燈是給別人看的,作用是提醒別人我的車要減速了,注意點。應(yīng)該是由車主的剎車動作來決定亮滅,就象現(xiàn)在的汽車的機械剎車燈控制就很合理,有兩個行程,第一個剎車行程是點亮剎車燈,但并不一定實施剎車的動作,第二個行程才是實施動作。
有時候簡單的控制并不一定非要用到高科技,有錢人除外
回復(fù)

使用道具 舉報

22#
ID:592807 發(fā)表于 2023-7-13 08:52 | 只看該作者
lkc8210 發(fā)表于 2023-7-11 15:10
新值>舊值 :上升
新值

你要考慮濾波啊大哥,就是0.1  0.2  0.3  0.2  0.5中間出現(xiàn)個0.3  0.2  0.5這里的0.2你要當(dāng)做錯誤數(shù)據(jù)刪掉的啊。你這種算法太容易出錯了。
回復(fù)

使用道具 舉報

23#
ID:38662 發(fā)表于 2023-7-13 10:42 | 只看該作者
a185980800 發(fā)表于 2023-7-11 17:32
減速就亮,關(guān)鍵減速不一定是剎車。ū热缬猩掀聹p速,人蹬的力變小減速了,路面不平減速。),沒有減速也不 ...

有道理,
回復(fù)

使用道具 舉報

24#
ID:401564 發(fā)表于 2023-7-13 10:51 | 只看該作者
ldc2000 發(fā)表于 2023-7-13 01:43
這種剎車感覺就不合理,剎車燈是給別人看的,作用是提醒別人我的車要減速了,注意點。應(yīng)該是由車主的剎車動 ...

合理不合理的,不重要
只要是是速度減下來了,剎車燈亮燈幾秒提示就可以了
這是客戶要求的,產(chǎn)品規(guī)格書這么寫,咱就這么做
咱就一打工的,客戶就是要自爆,咱也得做呀,畢竟拿了錢的
客戶已經(jīng)認(rèn)定了這個功能了,你有時候提出的合理性建議或者可行性分析,在他眼中就是多嘴
回復(fù)

使用道具 舉報

25#
ID:401564 發(fā)表于 2023-7-13 14:21 | 只看該作者
感謝各位網(wǎng)友的熱心幫助,現(xiàn)在心里有個大概的思路了,開始動手畫板了
回復(fù)

使用道具 舉報

26#
ID:158391 發(fā)表于 2023-7-13 23:18 | 只看該作者
也是,干活不由東,累死也無功。〉阋艉眠@個剎車燈設(shè)計是誰決定的證據(jù),防止以后發(fā)生事故會有人找設(shè)計人員的麻煩!
回復(fù)

使用道具 舉報

27#
ID:965189 發(fā)表于 2023-7-14 06:51 來自手機 | 只看該作者
速度下降不一定是剎車。有可能是自然放慢速度的。
回復(fù)

使用道具 舉報

28#
ID:1073939 發(fā)表于 2023-7-14 08:19 | 只看該作者
加速度值變小是增速變小,速度還會增加,不是減速。
減速開始時,加速度方向會反向。
回復(fù)

使用道具 舉報

29#
ID:155507 發(fā)表于 2023-7-14 09:15 | 只看該作者
你可以嘗試使用一個簡單的算法來檢測數(shù)據(jù)是否一直上升或下降。下面是一個基本的思路:

定義兩個變量,例如increasing和decreasing,并將它們都初始化為True。
遍歷數(shù)據(jù)數(shù)組,從第二個數(shù)據(jù)點開始。
對于每個數(shù)據(jù)點,檢查它是否比前一個數(shù)據(jù)點大(上升)或。ㄏ陆担。
如果是上升,檢查decreasing的值。如果為True,則將其設(shè)置為False,表示數(shù)據(jù)不再是一直下降。
如果是下降,檢查increasing的值。如果為True,則將其設(shè)置為False,表示數(shù)據(jù)不再是一直上升。
在檢查完所有數(shù)據(jù)點后,檢查increasing和decreasing的值。
如果兩者都為False,則表示數(shù)據(jù)既不是一直上升也不是一直下降。
如果increasing為True,則表示數(shù)據(jù)一直上升。
如果decreasing為True,則表示數(shù)據(jù)一直下降。

以下是一個簡單的C語言示例代碼,用于檢測數(shù)據(jù)是否一直上升或下降:

#include <stdio.h>

int main() {
    float data[] = {0.1, 0.2, 0.3, 0.6, 0.65, 1.0};
    int length = sizeof(data) / sizeof(data[0]);
    float threshold = 0.1;

    int increasing = 1;  // 上升
    int decreasing = 1;  // 下降

    int count = 0;
    float previous_value = 0;

    for (int i = 0; i < length; i++) {
        float value = data[i];

        if (value == previous_value) {
            increasing = 0;
            decreasing = 0;
            count = 0;
        } else if (value > previous_value) {
            decreasing = 0;
            count++;
            if (count > threshold) {
                // 觸發(fā)剎車燈
                printf("剎車燈亮起\n");
            }
        } else if (value < previous_value) {
            increasing = 0;
            count++;
            if (count > threshold) {
                // 觸發(fā)剎車燈
                printf("剎車燈亮起\n");
            }
        }

        previous_value = value;
    }

    if (!increasing && !decreasing) {
        printf("數(shù)據(jù)既不是一直上升也不是一直下降\n");
    } else if (increasing) {
        printf("數(shù)據(jù)一直上升\n");
    } else if (decreasing) {
        printf("數(shù)據(jù)一直下降\n");
    }

    return 0;
}
請注意,這只是一個簡單的示例算法,并未考慮實際硬件的數(shù)據(jù)采集和剎車燈的控制。在實際應(yīng)用中,您需要根據(jù)硬件的要求和具體情況進行適當(dāng)?shù)恼{(diào)整和改進。

回復(fù)

使用道具 舉報

30#
ID:1089358 發(fā)表于 2023-7-23 01:57 | 只看該作者
根據(jù)實際情況連續(xù)檢測多次,持續(xù)減速就給信號,比如:

# 初始化加速傳感器
accelerometer = accelerometer_library.initialize()

# 讀取加速傳感器數(shù)據(jù)
while True:
    acceleration_data = accelerometer.read_data()

    # 處理加速度數(shù)據(jù)
    # 這里可以根據(jù)具體需求進行數(shù)據(jù)處理,比如計算平均加速度、檢測震動等

    # 打印加速度數(shù)據(jù)
    print(acceleration_data)

    # 等待一段時間后繼續(xù)讀取數(shù)據(jù)
    time.sleep(0.1)
回復(fù)

使用道具 舉報

31#
ID:685250 發(fā)表于 2023-7-23 08:47 | 只看該作者
a[i++]=g;
for(i=0;i<10;i++)
{if(a[i]< a[i+1]) sc++;
if(a[i]> a[i+1]) sc--; }
判斷abs(sc)>連續(xù)減速或連續(xù)加速次數(shù),輸出剎車動作
回復(fù)

使用道具 舉報

32#
ID:883242 發(fā)表于 2023-7-24 16:19 | 只看該作者
九年義務(wù)教育物理里面教加速度吧?怎么這里大多數(shù)人都不知道加速度是個啥???都在指著加速度傳感器說速度。
回復(fù)

使用道具 舉報

33#
ID:382454 發(fā)表于 2023-7-24 21:30 來自手機 | 只看該作者
這個太復(fù)雜化了吧,記得摩托車的殺車燈,就是殺車手把有一個開關(guān)。
回復(fù)

使用道具 舉報

34#
ID:401564 發(fā)表于 2023-7-25 01:56 | 只看該作者
univers 發(fā)表于 2023-7-24 21:30
這個太復(fù)雜化了吧,記得摩托車的殺車燈,就是殺車手把有一個開關(guān)。

馬云家四五十塊錢一個的,公司買了幾個樣品回來,實際使用是可行,實際的效果比剎車開關(guān)好用
你按下剎車了,不一定會減速的,
但你減速了,這個燈就一定會亮,這功能對于汽車來說,可能用處不大
但對于單車來說,這功能很好用
回復(fù)

使用道具 舉報

35#
ID:382454 發(fā)表于 2023-7-28 11:44 | 只看該作者
Y_G_G 發(fā)表于 2023-7-25 01:56
馬云家四五十塊錢一個的,公司買了幾個樣品回來,實際使用是可行,實際的效果比剎車開關(guān)好用
你按下剎車 ...

對啊,我覺是就用殺車開關(guān)最好不過了。也不要幾十塊錢一個的,用一個微動開關(guān),或工業(yè)上上的一些耐用的開關(guān),但是手把要要設(shè)計好,這樣開關(guān)才好安裝上去。
開關(guān)只是用來做動作查測,不能通大電流,CPU的IO口去中斷這個IO口,或掃描這個口。之后CPU再去行處理即可。簡單又有效,又耐用。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表