玩转树莓派

    返回首页    发表留言
本文作者:李德强
          第六节 核心引擎
 
 

        接下来我们就要实现小车程序中最核心的功能——引擎。我们设定引擎中有两个运行模式:手动模式、自动模式。首先,我们来设计一下小车引擎:

        下面我们来看一下引擎代码:

//启动并运行引擎
void engine_run()
{
        int i = 0;
        while (1)
        {
                //手动模式
                if (engine.mode == 0)
                {
                        //接收用户命令并执行
                        engine_control(&engine);
                }
                //自动模式
                else if (engine.mode == 1)
                {
                        srand((u32) time(0));
                        //取得前方障碍物距离
                        double dis = driver_impact_checking();
                        //执行自动躲避动作
                        engine_redirection(&engine, dis);
                        if (engine.redirect_reset == 0 && i % 20 == 0)
                        {
                                //生成随机参数,让小车随机行驶
                                engine_rand_params(&engine);
                        }
                        //小车行驶,计算左右侧电机速度
                        engine_move(&engine);
                        i++;
                }
                //调用驱动设置左右侧电机速度
                driver_set_speed((int) engine.left_v, (int) engine.right_v);

                usleep(ENG_TIMER * 1000);
        }
}

//生成随机参数
void engine_rand_params(s_engine *e)
{
        e->angle = 90 - (rand() % 180);
        e->angle = e->angle / 180.0 * Pi;

        e->left_a = MAX_SPEED - (rand() % (MAX_SPEED * 2));
        e->right_a = e->left_a;

}

//执行小车躲避动作
void engine_redirection(s_engine *e, double dis)
{
        //超过1.2米
        if (dis < MIN_REDIRECT_BIT_DIS)
        {
                //如果超过0.6米,执行大躲避动作
                if (dis > MIN_REDIRECT_SMALL_DIS && (e->redirect_type == 0 || e->redirect_type == 1))
                {
                        e->redirect_type = 1;
                        if (e->redirect_leftright)
                        {
                                e->angle = -90.0 / 180.0 * Pi;
                        }
                        else
                        {
                                e->angle = 90.0 / 180.0 * Pi;
                        }
                }
                //如果小于0.6米,执行小躲避动作
                else
                {
                        e->redirect_type = 2;
                        e->angle = 0;
                        e->left_a = 0;
                        e->right_a = 0;
                        e->left_v = 0;
                        e->right_v = 0;
                        
                        //左右轮反相转
                        if (e->redirect_leftright)
                        {
                                e->left_v = -MAX_SPEED;
                                e->right_v = +MAX_SPEED;
                        }
                        else
                        {
                                e->left_v = MAX_SPEED;
                                e->right_v = -MAX_SPEED;
                        }

                }
                e->redirect_reset = 1;
        }
        //正常行驶
        else
        {
                e->redirect_leftright = rand() % 2;
                e->redirect_type = 0;
                if (e->redirect_reset == 1)
                {
                        e->left_a = MAX_SPEED;
                        e->left_v = 0;

                        e->right_a = MAX_SPEED;
                        e->right_v = 0;

                        e->redirect_reset = 0;
                }
        }
}

       好了,万事具备只欠东风。小车程序写完之后我们还需要编写手机端摇控程序。手机端摇控程序还是比较简单的。先看看效果:


        做的非常简易,但功能已经足够了。上、下、左、右、左右旋转。本例给出的是Android版的摇控程序,朋友们当然也可以自己开发IOS版本。


        最后,非常感谢大家的支持!提供完整的程序代码(Linux 环境 gcc 5.3.1):

MyCar.tar.gz

 

 

 

    返回首页    返回顶部
#1楼  tongsh  于 2016年12月08日12:55:12 发表
 
不错,要是能GPS自动路线规划,行驶到指定地点就更好了。期待升级版!加油!
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号