中文乐高

 找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 14544|回复: 70

普通走直线小车与HT指南针PID走直线之测试对比——ROBOTC

    [复制链接]
发表于 2014-2-16 00:43:24 | 显示全部楼层 |阅读模式
本帖最后由 捞屎人 于 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);
}


效果 图:
pid1.jpg pid2.jpg



这是非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);
}
nopid2.jpg Nopid.jpg

从效果图上看出来指南针导航的直线小车在十秒内误差几乎为0,而非指南针导航的小车十秒内误差超过了10°。

以前在用NXC,最近有个问题居然在nxc下能够把nxt算死机,所以放弃了 nxc,正逢ROBOTC破解了所以果断转学ROBOTC。开着谷歌翻译连猜带蒙逐条看help及程序范例学习很是费劲,到现在连#头文件#pragma config(Sensor, S1,HTMC,sensorI2CCustom) 都没搞懂是啥意思,只知道这个少了就不行,才后悔当初没学好E文,不过最近robotc开通了中文站,希望会有更好的学习资料




如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-2-16 09:02:49 | 显示全部楼层
“以前在用NXC,最近有个问题居然在nxc下能够把nxt算死机,所以放弃了 nxc,”对这个问题比较好奇!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2014-2-16 12:05:40 | 显示全部楼层
本帖最后由 捞屎人 于 2014-2-16 14:03 编辑
huruiqi 发表于 2014-2-16 09:02
“以前在用NXC,最近有个问题居然在nxc下能够把nxt算死机,所以放弃了 nxc,”对这个问题比较好奇!![g:08 ...

http://bbs.cmnxt.com/forum.php?m ... 01&page=1#pid136855

MG.gif
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-2-16 16:24:05 | 显示全部楼层
看看
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-2-17 12:09:30 | 显示全部楼层
很奇怪你的HT_COMPASS怎么不需要做校准,在程序里好象看不到啊........
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2014-2-17 20:59:05 | 显示全部楼层
本帖最后由 捞屎人 于 2014-2-17 21:06 编辑
blackblue 发表于 2014-2-17 12:09
很奇怪你的HT_COMPASS怎么不需要做校准,在程序里好象看不到啊........

呵呵 我也不是太懂指南针  
HTMCsetTarget(S1);这一句就是定初始方向,即0方向的
HTMCreadRelativeHeading(S1)这个是监*控和0方向的偏差,右偏是+左偏是-
关于指南针还有一个HTMCreadHeading(S1);是读取和正东方的的偏差0~359°顺时针

关于指南针也就从robotc与compass相关的范例看到这三个函数,不知你所说的校准是什么意思,即时校准么

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-2-18 12:01:42 | 显示全部楼层
捞屎人 发表于 2014-2-17 20:59
呵呵 我也不是太懂指南针  
HTMCsetTarget(S1);这一句就是定初始方向,即0方向的
HTMCreadRelativeHea ...

明白了,这个应用当中,没有使用地理座标系!我所说的“校准”,就是指COMPASS对地磁北极的准确识别,一般使用8字法或者圆圈法.......
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-2-18 20:14:55 | 显示全部楼层
路过,学习一下
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-3-14 17:37:21 | 显示全部楼层
学习
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-3-30 16:37:47 | 显示全部楼层
楼主强大了,回复看看O(∩_∩)O哈!。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-4-28 12:02:37 | 显示全部楼层
看看!!!!!!!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-19 22:50:44 | 显示全部楼层
谢谢
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-6-20 16:18:05 | 显示全部楼层
路过,看看
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-12-7 00:00:31 | 显示全部楼层
太厉害太厉害
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2015-1-26 14:01:59 | 显示全部楼层
dingniyige..........
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|中文乐高 ( 桂ICP备11003955号-1 )

GMT+8, 2019-11-12 16:44 , Processed in 0.028182 second(s), 24 queries .

快速回复 返回顶部 返回列表