找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4257|回复: 34
收起左侧

问个算法问题

  [复制链接]
ID:401564 发表于 2023-7-11 12:27 | 显示全部楼层 |阅读模式
之前搞过一个自行车尾灯项目,停工一段时间,现在又重新启动了目前主要的问题是自动感应刹车的问题
就是硬件上会有一个重力加速器,用来感应刹车,只要单车在行进过程有减速的动作,刹车灯就会亮起
比如:
重力加速器传回的数据可能是
0.1g
0.2g
0.3
0.6
0.65
1.0g
我想问的是,有没有什么算法是检测数据,或者数组的,只要在数据一直上升,或者是一直下降,条件才成立的
只要一个大概的思路,代码我自己写
先谢谢了
回复

使用道具 举报

ID:883242 发表于 2023-7-11 13:13 | 显示全部楼层
如果是速度传感器才需要判断一直上升或者下降,你既然用了加速度传感器,判断输出的极性和大小就可以了。
回复

使用道具 举报

ID:1034262 发表于 2023-7-11 13:24 | 显示全部楼层
加速度不可能一直上升或下降的。
回复

使用道具 举报

ID:88256 发表于 2023-7-11 13:58 | 显示全部楼层
设两个位变量,分别代表上升和下降,一个整型变量用来计数,再用一个变量保存上次的值,初始都为0,取当前值和上次的值进行比较,相等清两个位变量和计数值,在不相等的处理里,如果大于的并且上升的值也为1,则计数加一;如果小于且下降的值也为1,则计数加一,否则计数清零,然后置位对应的位并将此次值赋给上次的值,取计数值进行判断,达到数值的进行相应的处理。
回复

使用道具 举报

ID:161164 发表于 2023-7-11 15:10 | 显示全部楼层
新值>旧值 :上升
新值<旧值 :下降
回复

使用道具 举报

ID:712097 发表于 2023-7-11 15:24 | 显示全部楼层
用陀螺仪芯片应该更准确吧,用算法也能实现,只要比较前后两个重力数据的大小,例如上述6个数据(例如为D0-D5),if((D1-D0>0)&&(D2-D1>0)&&(D3-D2>0)&&(D4-D3>0)&&(D5-D4>0)){}//加速度
回复

使用道具 举报

ID:404160 发表于 2023-7-11 15:33 | 显示全部楼层
可以根据重力加速度数据来判断单车是否减速并进行刹车灯的控制。  一种简单的算法是设置一个阈值来判断减速的情况。当重力加速度超过某个阈值时,认为单车在减速,并点亮刹车灯。  具体步骤如下:  初始化一个阈值(例如0.3g),用来判断是否减速。 持续接收重力加速度数据。 每次接收到新的数据时,将其与上一次的数据进行比较。 如果新数据与上一次数据之间的差值大于设定的阈值,则触发刹车灯。 更新上一次数据为当前数据,继续接收下一个数据。 注意,根据这个算法,当单车在减速过程中,刹车灯将会持续亮起,直到单车加速或者停止减速。  你可以根据具体需求和实际情况来调整阈值的大小,以达到准确判断减速的目的。此外,为了更精确地判断减速,请确保重力加速度传感器的采样率足够高,以便捕捉到细微的变化。  这只是一种简单的算法,如果你有更复杂的需求或者更多的数据,可以考虑使用机器学习算法,如支持向量机(SVM)或者神经网络,来对减速行为进行分类和判断。这种方法可能需要更多的训练数据和模型设计,但可以提供更准确的结果。
回复

使用道具 举报

ID:1088099 发表于 2023-7-11 15:56 | 显示全部楼层
自动感应刹车亮灯不如由刹车动作来进行亮灯
回复

使用道具 举报

ID:227818 发表于 2023-7-11 16:04 | 显示全部楼层
老大,您的意思是,重力加速器传回的数据,可能是连续的,不停的变化,当连续上升或下降时,刹车灯开始动作?
如果我猜的对的话,可不可以这样,需要检测重力加速器传回的数据连续上升时,定时(比如说1mS一次)读取数据,减去上一次读取的数据,为正,或者连续几次为正,则启动刹车灯。检测重力加速器传回的数据连续下降时,则相反。
回复

使用道具 举报

ID:343102 发表于 2023-7-11 17:24 | 显示全部楼层
试试股中的macd方法。能过滤掉震动干扰,还能适应各种速度。
回复

使用道具 举报

ID:1086688 发表于 2023-7-11 17:28 | 显示全部楼层
我想的比较简单,能否用最新收到的数据跟前一个收到的数据一直比较,一直是大于就是递增,反之就是递减,如果违反了递增或者递减就改变标志位,然后就能通过这个标志位来作为判断条件
回复

使用道具 举报

ID:857072 发表于 2023-7-11 17:32 来自触屏版 | 显示全部楼层
减速就亮,关键减速不一定是刹车啊(比如有上坡减速,人蹬的力变小减速了,路面不平减速。),没有减速也不一定没刹车(比如下坡刹车了速度没降,边蹬边刹车速度没降)。
回复

使用道具 举报

ID:857072 发表于 2023-7-11 17:33 来自触屏版 | 显示全部楼层
加速度计算是否刹车,几乎不可信
回复

使用道具 举报

ID:404160 发表于 2023-7-11 21:26 | 显示全部楼层
如果磁场强度呈非线性变化且你需要确定两个典型值进行测量,你可以考虑以下方法来解决这个问题:1. 使用不同强度设定:尝试在不同的强度设定下测量磁场强度,并记录相关的数据。这样可以获得多个数据点,并在不同强度下观察磁场强度的变化情况。2. 使用插值方法:如果你已经测量了一些具体设定下的磁场强度值,你可以使用插值方法来推断其他强度设定下的磁场强度。通过在已知数据点之间建立一个函数模型,可以预测其他设定下的磁场强度。3. 使用标准曲线:某些设备可能附带有标准曲线或校准曲线。这些曲线可以提供给定设定下的磁场强度值的参考。通过将测量值与标准曲线进行比较,你可以确定磁场强度的近似值。4. 使用专业测量工具:如果磁场强度对于你的应用非常重要,你可以考虑使用专业的磁场测量工具。这些工具能够提供准确的磁场强度测量,并且可以处理非线性变化的情况。无论使用哪种方法,确保在进行测量之前了解设备的规格和特性,并遵循正确的操作步骤以确保准确测量磁场强度。
回复

使用道具 举报

ID:685462 发表于 2023-7-11 22:03 | 显示全部楼层
个人看法,比如以时间间隔0.1s采集数据,然后做曲线,求取斜率。根据斜率就能知道是增还是加速还是减速。规则就是持续0.5s,斜率连续小于0,就是减速,亮灯。持续时间根据实际测试调整就行。如果自行车是碟刹,弄个光电计数就行,简单实用。
回复

使用道具 举报

ID:1028610 发表于 2023-7-11 23:27 | 显示全部楼层
有一个想法:通过计算一组数据的斜率来判断,并界定刹车界限,即正负值或者是一定斜率范围(线性回归法);或者是对数据做差分计算,并逐一比较大小等等
回复

使用道具 举报

ID:320306 发表于 2023-7-12 09:21 | 显示全部楼层
两个条件;1、加速度减少过快 2、加速度为0速度很小,我们以前是这样做的 有一个编码器检测速度配合用的。
回复

使用道具 举报

ID:111463 发表于 2023-7-12 10:43 | 显示全部楼层
记录成数组数据,然后通过数学方法分析即可,例如求不同时间段的差或者导数,统计总量作为分析依据
回复

使用道具 举报

ID:1088185 发表于 2023-7-12 11:13 | 显示全部楼层
假设输入为Y

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

reg&=0x3F;  // 假设要检测连续6次数据上升或下降

if (reg == 0x3F) {
  // 连续6次上升
}
if (reg==0) {
// 连续6次下降
}

Y_last=Y;
回复

使用道具 举报

ID:401564 发表于 2023-7-12 12:34 | 显示全部楼层
a185980800 发表于 2023-7-11 17:33
加速度计算是否刹车,几乎不可信

这种单车尾灯在马云家大把的,而且都是实际测试可行的
回复

使用道具 举报

ID:158391 发表于 2023-7-13 01:43 | 显示全部楼层
这种刹车感觉就不合理,刹车灯是给别人看的,作用是提醒别人我的车要减速了,注意点。应该是由车主的刹车动作来决定亮灭,就象现在的汽车的机械刹车灯控制就很合理,有两个行程,第一个刹车行程是点亮刹车灯,但并不一定实施刹车的动作,第二个行程才是实施动作。
有时候简单的控制并不一定非要用到高科技,有钱人除外
回复

使用道具 举报

ID:592807 发表于 2023-7-13 08:52 | 显示全部楼层
lkc8210 发表于 2023-7-11 15:10
新值>旧值 :上升
新值

你要考虑滤波啊大哥,就是0.1  0.2  0.3  0.2  0.5中间出现个0.3  0.2  0.5这里的0.2你要当做错误数据删掉的啊。你这种算法太容易出错了。
回复

使用道具 举报

ID:38662 发表于 2023-7-13 10:42 | 显示全部楼层
a185980800 发表于 2023-7-11 17:32
减速就亮,关键减速不一定是刹车啊(比如有上坡减速,人蹬的力变小减速了,路面不平减速。),没有减速也不 ...

有道理,
回复

使用道具 举报

ID:401564 发表于 2023-7-13 10:51 | 显示全部楼层
ldc2000 发表于 2023-7-13 01:43
这种刹车感觉就不合理,刹车灯是给别人看的,作用是提醒别人我的车要减速了,注意点。应该是由车主的刹车动 ...

合理不合理的,不重要
只要是是速度减下来了,刹车灯亮灯几秒提示就可以了
这是客户要求的,产品规格书这么写,咱就这么做
咱就一打工的,客户就是要自爆,咱也得做呀,毕竟拿了钱的
客户已经认定了这个功能了,你有时候提出的合理性建议或者可行性分析,在他眼中就是多嘴
回复

使用道具 举报

ID:401564 发表于 2023-7-13 14:21 | 显示全部楼层
感谢各位网友的热心帮助,现在心里有个大概的思路了,开始动手画板了
回复

使用道具 举报

ID:158391 发表于 2023-7-13 23:18 | 显示全部楼层
也是,干活不由东,累死也无功啊!但你要留好这个刹车灯设计是谁决定的证据,防止以后发生事故会有人找设计人员的麻烦!
回复

使用道具 举报

ID:965189 发表于 2023-7-14 06:51 来自触屏版 | 显示全部楼层
速度下降不一定是刹车。有可能是自然放慢速度的。
回复

使用道具 举报

ID:1073939 发表于 2023-7-14 08:19 | 显示全部楼层
加速度值变小是增速变小,速度还会增加,不是减速。
减速开始时,加速度方向会反向。
回复

使用道具 举报

ID:155507 发表于 2023-7-14 09:15 | 显示全部楼层
你可以尝试使用一个简单的算法来检测数据是否一直上升或下降。下面是一个基本的思路:

定义两个变量,例如increasing和decreasing,并将它们都初始化为True。
遍历数据数组,从第二个数据点开始。
对于每个数据点,检查它是否比前一个数据点大(上升)或小(下降)。
如果是上升,检查decreasing的值。如果为True,则将其设置为False,表示数据不再是一直下降。
如果是下降,检查increasing的值。如果为True,则将其设置为False,表示数据不再是一直上升。
在检查完所有数据点后,检查increasing和decreasing的值。
如果两者都为False,则表示数据既不是一直上升也不是一直下降。
如果increasing为True,则表示数据一直上升。
如果decreasing为True,则表示数据一直下降。

以下是一个简单的C语言示例代码,用于检测数据是否一直上升或下降:

#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) {
                // 触发刹车灯
                printf("刹车灯亮起\n");
            }
        } else if (value < previous_value) {
            increasing = 0;
            count++;
            if (count > threshold) {
                // 触发刹车灯
                printf("刹车灯亮起\n");
            }
        }

        previous_value = value;
    }

    if (!increasing && !decreasing) {
        printf("数据既不是一直上升也不是一直下降\n");
    } else if (increasing) {
        printf("数据一直上升\n");
    } else if (decreasing) {
        printf("数据一直下降\n");
    }

    return 0;
}
请注意,这只是一个简单的示例算法,并未考虑实际硬件的数据采集和刹车灯的控制。在实际应用中,您需要根据硬件的要求和具体情况进行适当的调整和改进。

回复

使用道具 举报

ID:1089358 发表于 2023-7-23 01:57 | 显示全部楼层
根据实际情况连续检测多次,持续减速就给信号,比如:

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

# 读取加速传感器数据
while True:
    acceleration_data = accelerometer.read_data()

    # 处理加速度数据
    # 这里可以根据具体需求进行数据处理,比如计算平均加速度、检测震动等

    # 打印加速度数据
    print(acceleration_data)

    # 等待一段时间后继续读取数据
    time.sleep(0.1)
回复

使用道具 举报

ID:685250 发表于 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)>连续减速或连续加速次数,输出刹车动作
回复

使用道具 举报

ID:883242 发表于 2023-7-24 16:19 | 显示全部楼层
九年义务教育物理里面教加速度吧?怎么这里大多数人都不知道加速度是个啥???都在指着加速度传感器说速度。
回复

使用道具 举报

ID:382454 发表于 2023-7-24 21:30 来自触屏版 | 显示全部楼层
这个太复杂化了吧,记得摩托车的杀车灯,就是杀车手把有一个开关。
回复

使用道具 举报

ID:401564 发表于 2023-7-25 01:56 | 显示全部楼层
univers 发表于 2023-7-24 21:30
这个太复杂化了吧,记得摩托车的杀车灯,就是杀车手把有一个开关。

马云家四五十块钱一个的,公司买了几个样品回来,实际使用是可行,实际的效果比刹车开关好用
你按下刹车了,不一定会减速的,
但你减速了,这个灯就一定会亮,这功能对于汽车来说,可能用处不大
但对于单车来说,这功能很好用
回复

使用道具 举报

ID:382454 发表于 2023-7-28 11:44 | 显示全部楼层
Y_G_G 发表于 2023-7-25 01:56
马云家四五十块钱一个的,公司买了几个样品回来,实际使用是可行,实际的效果比刹车开关好用
你按下刹车 ...

对啊,我觉是就用杀车开关最好不过了。也不要几十块钱一个的,用一个微动开关,或工业上上的一些耐用的开关,但是手把要要设计好,这样开关才好安装上去。
开关只是用来做动作查测,不能通大电流,CPU的IO口去中断这个IO口,或扫描这个口。之后CPU再去行处理即可。简单又有效,又耐用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表