|
本帖最后由 捞屎人 于 2014-2-16 12:18 编辑
走直线一直是困扰大家的难题,手头有个HT的指南针,一直也未用,最近学习ROBOTC所以试着研究了下,经测试效果还不错,由于KP控制已经可以将偏差减小到±1之间了,所以未加入KI, KD控制了。
下面是KP控制代码:
#pragma config(Sensor, S1,HTMC,sensorI2CCustom)
#include "hitechnic-compass.h"
#define Tp 50
#define Kp 3
#define Ki 0
#define Kd 0
task main()
{
float turn,error,integral=0,lastError=0,derivative =0;
time1[T1] = 0;
HTMCsetTarget(S1);
nxtDisplayStringAt(0,50,"ChushiFangXiang:");
nxtDisplayStringAt(30,40,"%d",HTMCreadRelativeHeading(S1));
while(time1[T1]<10000)
{
error= HTMCreadRelativeHeading(S1);//计算误差值
integral=integral+error; //计算积分值
derivative=error-lastError; //计算导数值
turn = Kp*error + Ki*integral + Kd*derivative; //比例控制(P)+积分控制(I)+导数控制(D)
motor[motorA]=Tp+turn;
motor[motorC]=Tp-turn;
}
motor[motorA]=0;
motor[motorC]=0;
nxtDisplayStringAt(0,30,"PianCha:%d",HTMCreadRelativeHeading(S1));
wait1Msec(10000);
}
效果 图:
这是非PID代码:
#pragma config(Sensor, S1,HTMC,sensorI2CCustom)
#include "hitechnic-compass.h"
task main()
{
time1[T1] = 0;
HTMCsetTarget(S1);
nxtDisplayStringAt(0,50,"ChushiFangXiang:");
nxtDisplayStringAt(30,40,"%d",HTMCreadRelativeHeading(S1));
nSyncedMotors = synchAC;
nSyncedTurnRatio=100;
nMotorEncoder[motorA]= 0;
motor[motorA]=-50;
while(time1[T1]<10000){}
motor[motorA]= 0;
nxtDisplayStringAt(0,30,"PianCha:%d",HTMCreadRelativeHeading(S1));
wait1Msec(10000);
}
从效果图上看出来指南针导航的直线小车在十秒内误差几乎为0,而非指南针导航的小车十秒内误差超过了10°。
以前在用NXC,最近有个问题居然在nxc下能够把nxt算死机,所以放弃了 nxc,正逢ROBOTC破解了所以果断转学ROBOTC。开着谷歌翻译连猜带蒙逐条看help及程序范例学习很是费劲,到现在连#头文件#pragma config(Sensor, S1,HTMC,sensorI2CCustom) 都没搞懂是啥意思,只知道这个少了就不行,才后悔当初没学好E文,不过最近robotc开通了中文站,希望会有更好的学习资料
|
|