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

下面我们来看一下引擎代码:
//启动并运行引擎
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号