机器行走速度使用PID调节走不直

zdx_register 2016-11-14 07:15:13
机器有两个PWM控制的轮子,前面还有万向轮。
两个PWM控制的轮子使用PID调节,给定的速度是200mm/s,PID调节后速度一直在198和201两个值跳动,两个轮子都是这样。
行走1-2M后,就可以看出来有点偏了。
下面是一段我的PID调节的代码,高手帮忙看下。谢谢

float pwm;
_STRUCT_WHEEL_CAL *wheel = &robot.wheel.wheelRight;
if(wheel->updateFlag == TRUE){ // 新的采样更新
wheel->updateFlag = FALSE;
wheel->pid.error = speed - wheel->curSpeed;
wheel->pid.errSum += wheel->pid.error;
pwm = KP * wheel->pid.error + KI * wheel->pid.errSum + KD * (wheel->pid.error - wheel->pid.errLast);
if(pwm < 0) pwm = 0;
else if(pwm > 100) pwm = 100;
wheel->pid.errLast = wheel->pid.error;
WheelRightPWMCtrl(pwm, dir);
}
...全文
1109 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdx_register 2016-11-24
  • 打赏
  • 举报
回复
引用 27 楼 uid123 的回复:
[quote=引用 26 楼 zdx_register 的回复:] [quote=引用 24 楼 schlafenhamster 的回复:] “现在的直线行走已经满足需要了” 是不是固定误差,能不能 “补偿” ?
引用 25 楼 uid123 的回复:
如果不考虑步进电机本身的误差,可以考虑并联AB轮的步进电机进线电源,用同一个控制端控制2个步进电机。
使用的直流电机,两个轮子分别进行PID调节,在直行时,虽然两个轮子的速度都在300mm/s,因为轮子PID调节时的波动不一样,积累起来会造成走斜了。 现在的做法是先进行两个轮子的PID调节,然后再根据直线行走的两个轮子的总反馈对其中一个轮子的PWM进行微调。 现在结果是4米-6米内没有参照的话,看上去就是一条直线。 这个结果基本已经满足我现在的需求了。[/quote] 想要彻底消除,还是加轨道和只能识别吧。[/quote] 或者加入外部的导航,4米,在屋内的环境下,基本OK了。
uid123 2016-11-24
  • 打赏
  • 举报
回复
引用 26 楼 zdx_register 的回复:
[quote=引用 24 楼 schlafenhamster 的回复:] “现在的直线行走已经满足需要了” 是不是固定误差,能不能 “补偿” ?
引用 25 楼 uid123 的回复:
如果不考虑步进电机本身的误差,可以考虑并联AB轮的步进电机进线电源,用同一个控制端控制2个步进电机。
使用的直流电机,两个轮子分别进行PID调节,在直行时,虽然两个轮子的速度都在300mm/s,因为轮子PID调节时的波动不一样,积累起来会造成走斜了。 现在的做法是先进行两个轮子的PID调节,然后再根据直线行走的两个轮子的总反馈对其中一个轮子的PWM进行微调。 现在结果是4米-6米内没有参照的话,看上去就是一条直线。 这个结果基本已经满足我现在的需求了。[/quote] 想要彻底消除,还是加轨道和只能识别吧。
uid123 2016-11-23
  • 打赏
  • 举报
回复
如果不考虑步进电机本身的误差,可以考虑并联AB轮的步进电机进线电源,用同一个控制端控制2个步进电机。
schlafenhamster 2016-11-23
  • 打赏
  • 举报
回复
“现在的直线行走已经满足需要了” 是不是固定误差,能不能 “补偿” ?
zdx_register 2016-11-23
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
能不能用 陀螺 ?
现在的直线行走已经满足需要了,在4米内没参照物是基本看不出有斜了的。
zdx_register 2016-11-23
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
能不能用 陀螺 ?
陀螺仪本身就会有积累误差,精度高的性能好的,钱也越好
schlafenhamster 2016-11-23
  • 打赏
  • 举报
回复
能不能用 陀螺 ?
zdx_register 2016-11-23
  • 打赏
  • 举报
回复
引用 24 楼 schlafenhamster 的回复:
“现在的直线行走已经满足需要了” 是不是固定误差,能不能 “补偿” ?
引用 25 楼 uid123 的回复:
如果不考虑步进电机本身的误差,可以考虑并联AB轮的步进电机进线电源,用同一个控制端控制2个步进电机。
使用的直流电机,两个轮子分别进行PID调节,在直行时,虽然两个轮子的速度都在300mm/s,因为轮子PID调节时的波动不一样,积累起来会造成走斜了。 现在的做法是先进行两个轮子的PID调节,然后再根据直线行走的两个轮子的总反馈对其中一个轮子的PWM进行微调。 现在结果是4米-6米内没有参照的话,看上去就是一条直线。 这个结果基本已经满足我现在的需求了。
schlafenhamster 2016-11-22
  • 打赏
  • 举报
回复
“根据两个轮子的脉冲数” 就是 位置环 。但 即使这样 因为 轮的 大小 误差,总是会 偏。
zdx_register 2016-11-22
  • 打赏
  • 举报
回复
现在有个想法,一个轮子A使用PID调节,确保轮子行走的速度是给定的速度,调节的PWM两个轮子AB共用; 但是没有PID调节的轮子B在使用PWM时,要根据两个轮子的脉冲数的进行修正,如果A的脉冲数大于B的, B的PWM根据差值增大,如果A的脉冲数小于B的,B的PWM值减小。 希望有效果
schlafenhamster 2016-11-22
  • 打赏
  • 举报
回复
使用位置环比速度环要好些。
zdx_register 2016-11-22
  • 打赏
  • 举报
回复
引用 15 楼 uid123 的回复:
。。。。有没有考虑过从机械上修正??一个传动轴管2个轮子。
这个是不行的 模具都开好的
zdx_register 2016-11-22
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
“根据两个轮子的脉冲数” 就是 位置环 。但 即使这样 因为 轮的 大小 误差,总是会 偏。
现在走直线还行,4米之内看不出机器走斜了。大概6米时才能看出来,而且需要有直线参考。
uid123 2016-11-21
  • 打赏
  • 举报
回复
。。。。有没有考虑过从机械上修正??一个传动轴管2个轮子。
zdx_register 2016-11-21
  • 打赏
  • 举报
回复
引用 12 楼 su991 的回复:
就算两个轮子转速完全一样 也会走偏吧 我之前试过 如果不加外部传感器进行校正 很难走直线
引用 13 楼 schlafenhamster 的回复:
直馈系统的 通病, 加上 方向 反馈 。
因为是两个轮子分别做PID调节的,在直行时,给200mm/s的速度,两个轮子就分别时行PID调节,在调节时因为有轻微振荡,就算很小,比如左轮超调了0.5,右轮超调0.3,最后都回到0点,左右轮行走距离就不一样了,累积起来到后面就会斜了。
schlafenhamster 2016-11-17
  • 打赏
  • 举报
回复
直馈系统的 通病, 加上 方向 反馈 。
schlafenhamster 2016-11-16
  • 打赏
  • 举报
回复
有了 Ki 应该是 无静差 系统, 是不是 Ki 小了 ?
su吧1 2016-11-16
  • 打赏
  • 举报
回复
就算两个轮子转速完全一样 也会走偏吧 我之前试过 如果不加外部传感器进行校正 很难走直线
zdx_register 2016-11-15
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
分辨率不够。估计不是 PID 算法的问题,是参与计算的计量单位太大了。试试将数据扩大一两个数量级(单位降低一两个数量级)。
大轮一圈792个脉冲,这个精度怎么样?
zdx_register 2016-11-15
  • 打赏
  • 举报
回复
引用 5 楼 Rampage_SS 的回复:
你的pid调节怎么是速度调节啊。。走的直不直难道不是角度调节吗???
100ms定时采样反馈脉冲,根据这100ms的脉冲计算速度,然后采样后进行PID调节
加载更多回复(8)

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧