找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 7633|回复: 14

NXC旋转传感器的设定与直线运行

  [复制链接]
发表于 2010-7-20 14:10:03 | 显示全部楼层 |阅读模式
根据NXC教程,想利用旋转传感器使机器人保持直线运行,但运行后发现,机器人仍然是弧线运行。是旋转传感器没起作用呢?还是参数设置有误呢?希望高手解答!程序如下:
task main()
{
  SetSensor(IN_1,SENSOR_ROTATION);ClearSensor(IN_1);
  SetSensor(IN_3,SENSOR_ROTATION);ClearSensor(IN_3);
  while(true)
  {
   if(SENSOR_1<SENSOR_3)
    {OnFwd(OUT_A,60);Float(OUT_C);}
   else if(SENSOR_1>SENSOR_3)
    {OnFwd(OUT_C,60);Float(OUT_A);}
   else
     {OnFwd(OUT_AC,60);}
   }
  }

补充一下,是否这个“rotation sensor”是一个单独的传感器,而不是内嵌在伺服马达中?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2010-7-20 14:42:47 | 显示全部楼层
你的这个做法有点像pid里的思想,不过你没有考虑的到蛮多,因为你两个轮子上的摩擦力是不一样的,在同样的路面给马达上同样时间的高电平,马达转速是不一样的。你这样做,我估计轨迹是类似于正弦曲线一样。建议你看下我以前发过的一片pid控制的程序,大致思想就是控制马达的角速度是一样的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-20 15:05:54 | 显示全部楼层
= =!这个接近是pid?我囧。。。
为什么PID我理解的越来越迷糊了……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-20 15:44:30 | 显示全部楼层
你是RCX还是NXT?
NXT的话应该用 x = MotorRotationCount(OUT_A);
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-7-20 17:02:19 | 显示全部楼层
回复 junf 的帖子
是NXT。我发现问题所在了,是函数没有用对,应该用MotorRotationCount()。感谢junf !也感谢唐老大!

   
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-20 17:17:52 | 显示全部楼层
那你换了函数可以走直线了吗
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-20 17:18:53 | 显示全部楼层
= =!这个接近是pid?我囧。。。
为什么PID我理解的越来越迷糊了……
394069341 发表于 2010-7-20 15:05



我说思想像,不是不说接近啊,pid是闭环控制,他这个也是啊,只是算法不一样而已。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-7-20 18:24:18 | 显示全部楼层
回复 糖伯虎 的帖子
我找了Programming LEGO NXT using NXC 中的例子,没有找到 MotorRotationCount()函数的使用方法,只是在Bricx Command Center 的帮助里找到了一个 x = MotorRotationCount(OUT_A),但不知道怎么使用。呵呵。

   
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-21 13:28:41 | 显示全部楼层
回复 糖伯虎 的帖子


    原来如此……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-21 22:16:38 | 显示全部楼层
是平时说的同步吧,但好像电机启动有先后,在NXT-G和robolab2.9中就有这个问题,急待解决,求高手指点。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-22 10:17:05 | 显示全部楼层
回复
是NXT。我发现问题所在了,是函数没有用对,应该用MotorRotationCount()。感谢junf !也感谢唐老大! ...
斯螽动股 发表于 2010-7-20 17:02
其实不光是MotorRotationCount,只要不用简单的OnFwd和OnRev都可以。因为简单输出指令的话,伺服电机会因为内置pid控制产生个体的差别。用高级输出指令OnFwdReg,OnFwdSyncn,RotateMotor,RotateMotorEX,RotateMotorPID都可以。理论上控制越多,约接近结果。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-7-22 13:43:51 | 显示全部楼层
不管简单指令还是高级指令,单靠伺服电机的反馈是不够的。因为车轮与地面之间的打滑(很不幸的是总会存在,而且是随机性的。)会影响方向。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-10-17 20:25:01 | 显示全部楼层
糖伯虎 发表于 2010-7-20 14:42
你的这个做法有点像pid里的思想,不过你没有考虑的到蛮多,因为你两个轮子上的摩擦力是不一样的,在同样的路 ...

糖sir,旋转传感器是哪一个呀?是不是默认的伺服电机?“SetSensor(IN_1,SENSOR_ROTATION);ClearSensor(IN_1);”这句的意思是设置传感器吗?
谢谢
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-10-18 08:05:12 | 显示全部楼层
WalkerSun 发表于 2011-10-17 20:25
糖sir,旋转传感器是哪一个呀?是不是默认的伺服电机?“SetSensor(IN_1,SENSOR_ROTATION);ClearSensor(I ...

不需要设置,如果想读取角度用下面的语句
degree = MotorRotationCount(OUT_A);
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-10-19 16:02:39 | 显示全部楼层
糖伯虎 发表于 2011-10-18 08:05
不需要设置,如果想读取角度用下面的语句
degree = MotorRotationCount(OUT_A);

好用,谢谢,祝你好心情
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-14 18:53 , Processed in 0.114664 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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