找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 13350|回复: 7

最直的三百厘米——开环控制的小车

[复制链接]
发表于 2017-7-25 22:09:23 | 显示全部楼层 |阅读模式
本帖最后由 hello怪 于 2017-7-25 22:24 编辑
! h  \- l4 i: [: ?
+ E! N( ?+ g8 j) _, F- z
(视频里面最终轮子与黑线的距离,都不超过6mm,最小距离只有2mm。虽然也有运气成分在里面,不过就结果来讲已经很令人满意了^_^)
优酷视频网址:
http://v.youku.com/v_show/id_XMjkxOTU1MjEyNA==.html
1 o/ t: S( H) x1 J2 t5 A8 L
首先说说车子的设计思路,希望也能对大家有用。我想到的影响车子走直线的因素有以下几个方面:

6 P) K+ N4 D+ N7 A7 ?/ M. A
场地+ W0 V- X# \* P1 N
  水平度和光滑度
在家里当然瓷砖的效果是最好的4 h% ~* F7 K+ P. i+ _
  线的直度
虽然规则里说起点终点之间不能有黑线,但是因为没用光感,完全是开环控制,所以也无所谓了。这里就直接用了瓷砖上的黑线来说明车子走的直不直
# }/ ^) p% h  G
/ Q3 }, {5 P! e: y# `6 P车子结构
# ?. @: z+ L7 W  i7 m4 ^  轮子间距
9 U( f- B$ @3 I4 I  R1 X: O     轮子间距越大越好,稍微想一下便知
$ ^: P8 L3 {7 B+ g$ v8 [  轮子大小
3 n9 Z8 |* j2 S     轮子直径越小越好,而且轮皮要尽量薄(我这里用的是nxt自带的轮子)
! C1 B$ {8 r+ n4 x6 x+ M/ u5 V1 h5 f  随动轮的设计
1 y" z1 {* |* \2 g( `     随动轮转动时对车子的影响应该尽量小。这里我自己想出了一个设计方案(当然我觉得别人也用过),让车子几乎不受随动轮的影响
6 p) Q+ C2 n4 K- c2 r4 W  重心位置
1 {5 a/ L, g3 F# Y" l     重心应该稍稍靠近主动轮以增大主动轮的抓地能力。但是太靠近的话就会降低车子的稳定性,并且升级空间较小0 F0 Z: i8 z8 k5 M+ r- V0 T, a
  结构稳定性
不用说,肯定是越结实越好。但是不能造成重量过大
$ Q, u5 @. |/ W$ X3 d0 Z6 A5 q  轮子个数
有三种方案:平衡车(独轮或双轮),三轮车,四轮或以上。虽然很想做平衡车,但是无奈暂时不会用陀螺仪。四轮的话转角不好把控,而且结构复杂,所以就用了最简单的三轮车。(另外,我个人认为不能拐弯的车子就不能叫车子~叫火车或者轨道炮比较合适。。。)) L0 J3 n7 i% g8 w/ }. j
  驱动方式
这里我选择了直接由马达驱动轮子,不经过任何齿轮传动,一种简单准确的方式驱动
9 Z+ E6 R* P4 }# |! S5 n/ x
' A0 D* W3 H) ^3 I9 V7 S1 [$ L控制程序, [& D. M1 j1 W1 u* f% a; a0 Z
  运动过程控制
. Y. @. Q5 H- V     好的程序应该使轮子不打滑,车子运行平稳。由此采取平滑运动的控制方法,让车子开始时(近似)匀加速,直到速度足够(160度每秒)。在开始时,加速度甚至更小,可以参考我的程序(加速度增加->加速度不变->加速度为零)
. n7 u3 s2 I6 y' l" a# ]/ `7 G  \& G$ I9 U! J  F# f- H
调试与运行$ \  ]( }1 W9 O+ H6 a
  轮子转速调整(车轮大小的设定)# i7 v8 s# r2 Q8 y0 O2 m) a' X
      这个就没什么办法,只能硬着头皮调了。调整轮子的大小设置,实际上就是调马达转速,没有什么更有效的解决办法
0 f8 F0 J' v2 C. X2 @$ [) W1 Z$ d1 ~  起始位置车子正方向和直线间的夹角( X: G' E+ r& n7 a: U" B4 J
      一个非常重要的因素,可谓差之毫厘谬以千里。所以尽可能减小两者的方向差。顺带一提,开环控制的小车,如果最终结果差距在一厘米只内,就已经没有什么可比性了。一厘米之内运气成分占比很大,因为0.01rad(0.5度以内)的夹角足以造成差距一厘米的偏差。这就是开环控制的特点

% i& z" Q4 a. ~! @' M/ s( t
- a% b2 B! u- @. W. B: L, O$ K) N* M1 c' K! x7 ?5 E
然后上源代码:
  1. / t; _. G  N$ V
  2. importlejos.robotics.navigation.DifferentialPilot;
    8 L! l/ K% L' q1 h, p8 n$ U
  3. import lejos.util.Delay;
    8 w$ k/ q- E1 F  C( v
  4.   o- X# o- V7 \, Z
  5. /**
    ; i" ?/ B7 x6 v7 M/ w0 r! ]1 N
  6. *Robot that stops if the buttons are presses before it completes its travel.+ x- {. j7 U: i1 V/ a3 s: V$ x
  7. */
    , Q+ ^, `# d. f8 B7 n/ O. {( I
  8. 8 q+ v5 D  A0 r+ j; r9 T6 M

  9. % `) q8 p+ @+ g8 k, j; b( V
  10. public class Straight {, E, M0 Z6 V9 B- Y
  11.   DifferentialPilotpilot;0 R  F. W/ ]8 [4 M( M9 V
  12.   doubleleftD = 4.3, rightD = 4.3;% a# X4 n/ F: L. ?. b

  13. 1 A5 X/ r0 l$ K) Q" B
  14.   publicvoid adjust() {
      U0 b/ f. [. r+ i3 L
  15.            //wait for release
    ' {- m4 X( h8 R- L% c8 n
  16.            while(Button.readButtons() > 0)
    4 y- |. ^% P7 I2 L. @6 V
  17.                    ;
    % w* Z- U5 [3 m9 G
  18.            while(Button.readButtons() == 0) {0 i, B+ G0 F# P* h% |
  19.                    //input size by adjusting the wheels0 w3 ]0 k# r1 i: d
  20.                    rightD= (double) (Motor.A.getTachoCount()) / 2160 + 4.3;% B" z4 ]3 q3 t# f4 w
  21.                    leftD= (double) (Motor.B.getTachoCount()) / 2160 + 4.3148;// 调试所得值8 v1 {" E5 J3 V3 w' \9 \! P

  22. 0 {) a* Q) u# r" J1 u/ m
  23.                    //display the size input
    4 d0 |8 f) Z! {; f4 z
  24.                    LCD.drawString("L:"+ String.valueOf(leftD), 0, 0);1 {0 b9 e/ M9 G- P) H" r
  25.                    LCD.drawString("R:"+ String.valueOf(rightD), 0, 1);4 H( J8 ~; ]4 k
  26.                    Delay.msDelay(100);
    7 Z5 J9 r8 G  b% g. R2 m$ d
  27.                    LCD.clear();
    1 I8 J2 S. T8 i+ a' X7 N( o
  28.            }
    5 j! `" k. t6 t1 v) X
  29.   _  z; C6 Y! x  {
  30.   }
    4 {9 N' L3 q+ b
  31.   a  {7 l9 b& X: ~
  32.   publicvoid go() {1 \# L+ G& ~# J: Y4 M* E$ s6 Z8 W
  33.            //准备起步
    5 V1 u6 c0 i2 S/ O. I4 O1 ?
  34.            //wait for release% p4 w1 W) @% @
  35.            while(Button.readButtons() > 0)
    4 v9 Z4 K, s+ {9 ]& ^( \! a! E5 Z7 N) }
  36.                    ;. W# V2 b7 X& a+ W9 R8 N' M- H& |
  37.            System.out.println("pressto go");2 Z) a; ^/ l( \4 ~- ~! ^: j
  38. ! V& N) L- Z: d% t6 o0 y
  39.            Button.waitForAnyPress();
    2 ~2 l+ e  |( S5 @; [) a
  40.            LCD.clear();
    " m, `: }- t( O
  41. 7 x5 T' p4 Z' c, a0 E; R2 o# [& V5 U
  42.            //初始化
    1 V- M& U) g* Q
  43.            pilot= new DifferentialPilot(rightD, leftD, 13.5, Motor.A, Motor.B, true);/ o3 t* o/ j$ {9 u4 M( k! [, U/ n
  44.            pilot.reset();
    $ A: E1 P. K8 ]; k9 e& W6 J& v
  45. $ `% |5 n4 l7 Z1 J2 r
  46.            Delay.msDelay(3000);5 H1 g- e( U) v
  47. . i  |7 b! a# w/ A; u8 F+ M
  48.            doublespeed = 10;
    % k' n& y8 |3 H: C( S, e
  49.            doubledistance = 0;5 }8 _5 W0 a" z  b+ h

  50. 0 A9 r; F: t8 B% w5 n6 l
  51.            //起步加速7 u+ H+ Q$ e4 q3 K# `
  52.            pilot.travel(300,true);
    6 I6 Q, {" ^! v$ v- W; e
  53. ; B4 a( N& D& \
  54.            while(distance < 20) {
    + u' r( _( @+ p
  55.                    distance= pilot.getMovement().getDistanceTraveled();
    2 O) G" W# ?# o5 S( E
  56.                    speed= distance * 5 + 10;
    7 T9 T' s' m3 C3 w# X8 c% ?. |
  57.                    pilot.setRotateSpeed(speed);% {8 K; Q  Q! i. g" x& r% ^0 f* k
  58.                    Delay.msDelay(100);( n+ g4 w, j. g5 ^
  59.            }  @- h7 s8 G4 }3 ~" U: |2 S
  60.            for(int i = 0; i < 10; i++) {% g# _! U6 }4 b9 m
  61.                    speed+= 5;
    $ n& Y( `0 H. i# b
  62.                    pilot.setRotateSpeed(speed);
      n0 o+ |% Q6 P
  63.                    Delay.msDelay(200);
    , d6 [! i/ c2 Q/ C, k) b7 ^- D4 h3 q
  64.            }
    5 p$ C& Y2 I% y1 {' \: s: |/ w8 G

  65. $ ^5 I0 @! I$ A. ?) M) c7 X
  66.            //TODO 减速
    5 h  F+ x1 n7 G: |6 c
  67. 0 }2 ]" v3 F4 A& j8 t
  68.            //停止机能! E5 V* d: z5 Y* q) A7 l4 q
  69.            while(pilot.isMoving()) {; y2 g/ n# |" W5 p! F
  70.                    if(Button.readButtons() > 0)
    - G$ ]! ~& c1 O9 Q
  71.                            pilot.stop();& T3 h% K! R# ~7 C9 b) {$ D
  72.            }
    % T. H& @; L% k" f& k: V0 W' M

  73. 4 q7 d, C/ M$ e6 e' l& ^9 ]+ m
  74.            System.out.println("" + pilot.getMovement().getDistanceTraveled());
    4 c" R3 l2 j1 {  O. B
  75.            System.out.println(-Motor.A.getTachoCount());
    1 k( P. m& F3 w
  76.            System.out.println(-Motor.B.getTachoCount());
    2 Z0 v! Y7 ?  ~' j
  77.            Button.waitForAnyPress();7 G+ E: W: i8 E" ~% I
  78.   }
    * z- F& g/ t, ^8 ~  h" C% G5 W$ r

  79. 1 @; V0 Y/ D) @; W; b! h" f2 I6 Y5 Y
  80.   publicstatic void main(String[] args) {
    3 U, q- T+ z- P. b: p$ k6 D
  81.            Straighttraveler = new Straight();
      A, V! [, y# N3 H5 Y  U
  82. 8 f  P3 ~1 L) f/ L/ n
  83.            traveler.adjust();& r. t( e; m0 |# A" K! p5 l
  84.            traveler.go();
    9 }  i5 X3 v  }7 S
  85.   }: @$ \8 ]1 E' v
  86. }
复制代码
* m: i7 k. K% G. i0 e0 E# r- V
IMG_20170720_111026()().jpg
IMG_20170720_114534()().jpg

轮子外缘与标尺间的距离:半个乐高单位

轮子外缘与标尺间的距离:半个乐高单位
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2017-7-25 22:10:06 | 显示全部楼层
二楼自占备用,欢迎发表评论
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

发表于 2017-7-26 01:34:48 | 显示全部楼层
这个源代码是什么语言呀
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

发表于 2017-7-26 07:22:29 | 显示全部楼层
本帖最后由 clx 于 2017-7-26 07:26 编辑
' q0 w) G& P5 `% G7 W# j; H4 x/ d9 x% A7 _1 n* h4 [: M0 W  I+ M
这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨,用代码程序的机器人都能很好的实现复杂功能
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

 楼主| 发表于 2017-7-26 10:08:44 | 显示全部楼层
clx 发表于 2017-7-26 07:22
9 z# f* Z6 x  B& g这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨, ...

  f& S8 P4 y" x  \  A# _: J我用的是lejos,一种基于Java的nxt专用语言。论严谨的话,程序结构的严谨和语言选择是无关的,但是不同的语言确实各有专长。比如这个lejos,他的函数库就比G大若干倍,有很多别人写过的东西可以直接拿来用。虽然G很适合给小朋友和初学者普及(本来就是针对于此),但是图形编程界面本身不适合大项目的编写,如果想要深入玩乐高的话转向代码是必然的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

发表于 2017-7-26 10:23:44 | 显示全部楼层
学习了,在乐高深入了解方向还不太明确,转代码确实必不可少
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

发表于 2017-7-29 16:34:41 | 显示全部楼层
车子结构很好,赞
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

发表于 2019-8-16 14:40:13 | 显示全部楼层
顶
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-24 04:34 , Processed in 0.120700 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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