[经验分享] hi3861智能小车怎么实现避障模式可以寻迹 原创

数创院刘Sir 显示全部楼层 发表于 2023-11-23 16:32:30

本帖最后由 yeyao 于 2023-11-23 16:46 编辑

学习OpenHarmony智能小车的时候我们根据润和的示例代码是不是可以实现循迹壁障功能,但是很多伙伴应该都疑惑过为什么寻迹和避障被分成了两个不同的模式,只能单独执行一直模式,按道理是不是可以实现循迹壁障两种功能同时运行。

这里分析一下原因,最基础的C语言里没有多线程教学,我们先不考虑多线程的情况下分析为什么不能同时存在循迹壁障两种功能。

寻迹功能依靠寻迹模块不断检测黑线,是不是需要用一个循环去不断执行传感器检测功能。避障功能是不是同样道理需要一个循环去不断检测距离,在润和的示例代码里,他们按照功能模块解耦的原则肯定要把寻迹和避障两个功能单独封装,这样就有个问题,如果先进了寻迹功能循环,别人正常工作的情况下是不会主动跳出循环的,那么就永远不会切换到避障功能的循环。不过解决方法考虑把寻迹检测一次和测距一次这个功能封装在一起,使用一个循环。这个方案我没有写代码。我使用的多线程。

多线程的情况下可以同时执行多个循环。那么这也有个问题,会导致电机工作混乱,被寻迹避障两个功能抢占控制。因为寻迹功能会随时控制电机工作,避障功能触发避障也要控制电机,那么系统是自己无法决定谁控制的,这样简单粗暴的同时工作肯定不合理。这里我的方法是使用一个信号量dis,信号量根据测距距离改变,距离在安全范围信号量dis == 0把电机控制放在寻迹功能里。

void trace_module2(void)
{  
    unsigned int timer_id2;
    hi_timer_create(&timer_id2);
    hi_timer_start(timer_id2, HI_TIMER_TYPE_PERIOD, 1, timer2_callback, 0);
    gpio_control(GPIO0, IOT_GPIO_VALUE1);
    gpio_control(GPIO1, g_car_speed_left);
    gpio_control(GPIO9, IOT_GPIO_VALUE1);
    gpio_control(GPIO10, g_car_speed_right);
    while (1) {
        if (g_car_status != CAR_OBSTACLE_AVOIDANCE_STATUS) {
            break;
        }
        if (dis == 1)
        {
            break;
        }

        gpio_control(GPIO1, g_car_speed_left);
        gpio_control(GPIO10, g_car_speed_right);
        hi_udelay(20);
    }
    hi_timer_delete(timer_id2);
}复制

image.png

如果距离在危险距离内,dis==1把电机控制权给避障功能

int dis = 1;
unsigned int ret;
static void car_where_to_go(float distance)
{
    if (distance < DISTANCE_BETWEEN_CAR_AND_OBSTACLE) {
        dis = 1;
        car_stop();
        hi_sleep(500);
        car_backward();
        hi_sleep(500);
        car_stop();
       unsigned int ret = engine_go_where();
        printf("ret is %d\r\n", ret);
        if (ret == CAR_TURN_LEFT) {
            car_right();
            hi_sleep(500);
        } else if (ret == CAR_TURN_RIGHT) {

            car_left();
            hi_sleep(500);
        }
        car_stop();
    }else{
        dis = 0;
    } 



}复制

前面不考虑多线程的解决方法也要注意不要把电机控制直接放在循迹壁障的信号检测环节,用距离决定电机控制在什么模式工作,信号量可以比较智能的实现寻迹避障流程工作。

这里补充说一下多线程的方法可能不是那么好这个实验,因为我发现可能因为工作量变大了系统,处理信号速度比较慢,寻迹功能反应力变低了,容易脱轨。不过商用设备处理能力更好的情况下,多线程可以完成高智能的工作,因为像S485协议的传感器如噪声传感器,检测数据至少需要延时零点几秒才能发送第二次检测命令,如果放在一个线程去执行,极其影响避障这种高频率的检测功能,让所有传感器一起肉眼可见降低检测频率。

无用

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部