接下来我们就要实现小车程序中最核心的功能——引擎。我们设定引擎中有两个运行模式:手动模式、自动模式。首先,我们来设计一下小车引擎:
下面我们来看一下引擎代码:
//启动并运行引擎 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):
Copyright © 2015-2023 问渠网 辽ICP备15013245号