前面实现了使用手机对小车4个电机的控制,但是要让小车运动起来还是比较复杂。
纳姆轮特点
纳姆轮小车可以平向移动、旋转,也可以两者结合,也就是小车可以X轴Y轴和旋转轴任意的组合控制,X轴和Y轴指的是体坐标。当不旋转的时候,体坐标和地坐标是重合的。
纳姆轮运动控制
纳姆轮小车轮子运动情况与小车的运动示意图如下图所示。
例如四个轮子都向前滚动,小车则向前行走。小车运动方式可以分解为三种基本方式:直行,平移和旋转。都是通过四个轮子的转动实现的,因此,可以得到一个小车运动方式和轮子转动之间的映射关系。关系如下:
式中,Uw1,Uw2,Uw3,Uw4分别表示的是1234象限的轮子转速,Uty表示小车垂直方向的速度,Uty表示水平方向的速度,w表示小车的角速度,a,b表示小车的轮子间的长宽。
APP控制代码编写
将控制代码在APP中进行编写,APP只需要输出4个轮子的控制量。在之前的手机遥控电机转动基础上,添加摇杆与拖动条的联动,摇杆用来控制垂直和水平方向运动,拖动条用来转向,主要代码示例如下。
void mecanumRun(float xSpeed, float ySpeed, float aSpeed)
{
float maxLinearSpeed=100;
float speed1 = ySpeed - xSpeed + aSpeed;
float speed2 = ySpeed + xSpeed - aSpeed;
float speed3 = ySpeed - xSpeed - aSpeed;
float speed4 = ySpeed + xSpeed + aSpeed;
float max = speed1;
if (max < speed2) max = speed2;
if (max < speed3) max = speed3;
if (max < speed4) max = speed4;
if (max > maxLinearSpeed)
{
speed1 = speed1 / max * maxLinearSpeed;
speed2 = speed2 / max * maxLinearSpeed;
speed3 = speed3 / max * maxLinearSpeed;
speed4 = speed4 / max * maxLinearSpeed;
}
mSeekBar_Wheel_1.setProgress((int)(speed1+100));
mSeekBar_Wheel_2.setProgress((int)(speed2+100));
mSeekBar_Wheel_3.setProgress((int)(speed3+100));
mSeekBar_Wheel_4.setProgress((int)(speed4+100));
}
实现的效果如下。
这样通过控制摇杆,就能解耦出四个电机的转速,从而能够控制小车的运动。
问题
这样控制看起来是可以直接开跑了,但是实际上还是存在一些问题的,比如减速电机存在一个很大的控制死区,假设满控制值是100,在40以下都不会开始转动,但是一旦转动起来,减速到40控制值,电机则是转动的。
还有另一个问题,如何让树莓派一开机就运行程序。
源码
GitHub
Gitee