找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 13295|回复: 7

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

[复制链接]
发表于 2017-7-25 22:09:23 | 显示全部楼层 |阅读模式
本帖最后由 hello怪 于 2017-7-25 22:24 编辑
. Y, P( Z2 r6 A: g* r* L
+ S* G3 @: A% h
(视频里面最终轮子与黑线的距离,都不超过6mm,最小距离只有2mm。虽然也有运气成分在里面,不过就结果来讲已经很令人满意了^_^)
优酷视频网址:
http://v.youku.com/v_show/id_XMjkxOTU1MjEyNA==.html

0 c1 g, u. T3 v$ g% f
首先说说车子的设计思路,希望也能对大家有用。我想到的影响车子走直线的因素有以下几个方面:
' a6 A  H+ l' V  Z  \
场地' Z* M3 F/ \- H% X& y1 n6 `
  水平度和光滑度
在家里当然瓷砖的效果是最好的! w% I: A9 M3 `/ F* r
  线的直度
虽然规则里说起点终点之间不能有黑线,但是因为没用光感,完全是开环控制,所以也无所谓了。这里就直接用了瓷砖上的黑线来说明车子走的直不直- l  f( t* j4 m( c
9 N4 G$ W  D4 E7 J
车子结构
5 h' A1 X3 T. M# z5 ]* K6 x  轮子间距! L3 @' E, A0 s  C) p
     轮子间距越大越好,稍微想一下便知
  @  B" d3 L6 ~7 ~  U; C  轮子大小
' Y" ^) }* n( h* U     轮子直径越小越好,而且轮皮要尽量薄(我这里用的是nxt自带的轮子)' w7 X" g( D. Y5 I
  随动轮的设计
! T( C5 R) w! }4 ?0 w, c; T     随动轮转动时对车子的影响应该尽量小。这里我自己想出了一个设计方案(当然我觉得别人也用过),让车子几乎不受随动轮的影响
$ w- r4 L) D4 B1 h; S% ^  重心位置' B9 o6 W4 j+ j
     重心应该稍稍靠近主动轮以增大主动轮的抓地能力。但是太靠近的话就会降低车子的稳定性,并且升级空间较小! ]* F; Q* c# k9 X
  结构稳定性
不用说,肯定是越结实越好。但是不能造成重量过大4 E6 N' {! o8 Y# V( A& L! C
  轮子个数
有三种方案:平衡车(独轮或双轮),三轮车,四轮或以上。虽然很想做平衡车,但是无奈暂时不会用陀螺仪。四轮的话转角不好把控,而且结构复杂,所以就用了最简单的三轮车。(另外,我个人认为不能拐弯的车子就不能叫车子~叫火车或者轨道炮比较合适。。。)- ^9 x  u5 X5 k% k% c! O
  驱动方式
这里我选择了直接由马达驱动轮子,不经过任何齿轮传动,一种简单准确的方式驱动7 q; {+ I* m4 K% {( X

+ R; o) R- s$ W5 F0 ~2 t控制程序
0 n& Q5 ~) M, U7 M. G+ Y7 O  运动过程控制
% @2 Z* ?% e2 U: C/ m" @9 \     好的程序应该使轮子不打滑,车子运行平稳。由此采取平滑运动的控制方法,让车子开始时(近似)匀加速,直到速度足够(160度每秒)。在开始时,加速度甚至更小,可以参考我的程序(加速度增加->加速度不变->加速度为零)  O& L, u3 d+ j7 m

% X) a3 x9 i: u5 |调试与运行/ l9 {  |+ o" F$ R  a/ \
  轮子转速调整(车轮大小的设定)* y7 m. j8 n% D
      这个就没什么办法,只能硬着头皮调了。调整轮子的大小设置,实际上就是调马达转速,没有什么更有效的解决办法
( M  d7 }' s+ m! R1 K5 e1 v, p  起始位置车子正方向和直线间的夹角
3 d4 O2 z  b) L      一个非常重要的因素,可谓差之毫厘谬以千里。所以尽可能减小两者的方向差。顺带一提,开环控制的小车,如果最终结果差距在一厘米只内,就已经没有什么可比性了。一厘米之内运气成分占比很大,因为0.01rad(0.5度以内)的夹角足以造成差距一厘米的偏差。这就是开环控制的特点

4 @3 a# {% `4 t+ F$ B6 {  c. Z
+ R& u4 K/ R: `4 ]6 ]3 g& [
9 V' l2 e" Y* Z: K2 @/ H( |/ k
然后上源代码:

  1.   W+ Y6 a5 i+ s5 g/ D# O
  2. importlejos.robotics.navigation.DifferentialPilot;
    9 G( V# Z9 n; `
  3. import lejos.util.Delay;& [6 U. w  v2 I0 V) V

  4. ) E& Z5 p) C7 x/ h/ t2 c' ]# K  }  x
  5. /**
    ! ~1 N" W$ ]2 {( d. p
  6. *Robot that stops if the buttons are presses before it completes its travel.- P4 A( _  w& x
  7. */. [- L! _0 Q* e

  8. ; M) A3 \4 u" M

  9. : i9 i2 i5 D1 Y! o4 B! u
  10. public class Straight {
    # m0 `' Y9 _5 k3 r+ ]2 N* g
  11.   DifferentialPilotpilot;
    $ D" l( ]2 B' P
  12.   doubleleftD = 4.3, rightD = 4.3;
    & S6 a4 N8 M& ]( m

  13. 6 l& `7 I. ], W( {4 o; `/ e
  14.   publicvoid adjust() {
    # J2 X+ {* J" T
  15.            //wait for release
      `0 T. g# \1 I7 P
  16.            while(Button.readButtons() > 0)
    5 T* s/ F( o2 p* E% k+ n( c4 O% z+ E
  17.                    ;2 \2 `' R3 a1 }5 {1 ~1 K/ r$ f
  18.            while(Button.readButtons() == 0) {; ]! q! O& ]5 G/ |- W
  19.                    //input size by adjusting the wheels/ m* i' Z/ N7 {( c
  20.                    rightD= (double) (Motor.A.getTachoCount()) / 2160 + 4.3;5 f2 D3 u% O) j7 r$ h  c: E
  21.                    leftD= (double) (Motor.B.getTachoCount()) / 2160 + 4.3148;// 调试所得值" g5 d+ _. Z% t# s

  22. $ m7 }; C8 _, }( m  t# q1 q
  23.                    //display the size input+ p' M: T1 x$ v: g  B
  24.                    LCD.drawString("L:"+ String.valueOf(leftD), 0, 0);: c3 \- F) ]3 f, d
  25.                    LCD.drawString("R:"+ String.valueOf(rightD), 0, 1);
    # p, H. {3 c, z1 H; o' o  t8 \+ P
  26.                    Delay.msDelay(100);
    # z/ g0 k1 t) S7 Q$ g- B$ l4 y4 W; @
  27.                    LCD.clear();/ l$ h  \' y) K$ v: u
  28.            }
    $ |& S: i; U% c5 I# h7 K

  29. " R5 J9 ~7 U& V0 @, J
  30.   }# p4 M4 B% }  L7 _6 e

  31. 8 A' ?$ [2 L, q; R5 V( t4 W2 e
  32.   publicvoid go() {# g( `4 H) e- T  i( G! S8 q: P
  33.            //准备起步1 h4 }1 v% E7 Z* t+ I: O1 f; j
  34.            //wait for release
    1 E( M5 I7 t5 A: a! K
  35.            while(Button.readButtons() > 0)' `) m8 H6 m$ u6 M* y7 f' ^/ |7 o
  36.                    ;
    9 e' ^) u0 v6 d2 o& s. b; q1 Z
  37.            System.out.println("pressto go");9 m- e3 x6 d/ k+ F* V1 \& k

  38. / Y5 @  |4 h$ t
  39.            Button.waitForAnyPress();
    % H/ j1 H# Z# m$ Z# ]
  40.            LCD.clear();
    , w! J- f+ Y3 K  r' m
  41. $ O+ b& h7 d: {# m# T5 u7 a! `* f
  42.            //初始化
    + z6 J" j; t+ b& M; g
  43.            pilot= new DifferentialPilot(rightD, leftD, 13.5, Motor.A, Motor.B, true);6 X; w6 p+ |  k8 H' U, I
  44.            pilot.reset();8 j" F+ i0 C  u/ W% n9 o

  45. & o; T! Q( B  y
  46.            Delay.msDelay(3000);
    - R4 V1 D# f9 D) |& X

  47. 4 [- }* m! f: ^; V" G. G5 A
  48.            doublespeed = 10;
    9 ^; c  X4 q: V3 y$ w0 `0 K
  49.            doubledistance = 0;
    * D3 J1 B& F+ _& N

  50. 4 N6 m% I0 }# f* g
  51.            //起步加速% f+ J8 Q- k* h- Q' b3 P
  52.            pilot.travel(300,true);
    ) |$ P, e0 O( j" C1 b, z! J
  53. + h. Z/ c4 _: I2 `
  54.            while(distance < 20) {
    * R& q" W5 T4 R/ y; Z: O  {  V- {( a
  55.                    distance= pilot.getMovement().getDistanceTraveled();2 u$ d! W( n6 }4 c! u1 m
  56.                    speed= distance * 5 + 10;: R5 X9 U9 y2 L/ Q8 G, @6 H
  57.                    pilot.setRotateSpeed(speed);0 S1 g- O! b- v. S4 ~
  58.                    Delay.msDelay(100);
    1 }3 {' \+ F8 @$ H9 V6 r, G
  59.            }9 f3 y5 S, `* s0 H* K0 `3 X+ W
  60.            for(int i = 0; i < 10; i++) {
    % i: q* ^2 C1 `, @" g) {
  61.                    speed+= 5;2 J% }8 `! N% v3 W4 K
  62.                    pilot.setRotateSpeed(speed);
    / |8 [$ Y& B: l% k! b( B
  63.                    Delay.msDelay(200);* d) N4 w. m0 v! ~3 u
  64.            }* p# i" p, k4 ], |5 I$ \: ~7 i
  65. 5 L* ~9 i* g" @! D# _
  66.            //TODO 减速
    0 m3 z5 {8 \3 y" u; F1 w1 [
  67. 0 v) `0 d- h. K4 O5 n% B
  68.            //停止机能5 p& A! V8 z9 g: A
  69.            while(pilot.isMoving()) {
    $ z0 s. z& g8 f& d8 Q# y8 H
  70.                    if(Button.readButtons() > 0)
    2 B; U" }% h6 A% W3 Y" Q! W4 {3 i9 u
  71.                            pilot.stop();
    2 H' O' e3 b" q/ M
  72.            }
    3 G- B0 ]' a7 s7 [6 f
  73. 1 O+ X; f4 u. J( u
  74.            System.out.println("" + pilot.getMovement().getDistanceTraveled());
    9 B# V! q, G4 _1 G0 l9 x) e  i
  75.            System.out.println(-Motor.A.getTachoCount());- Z) N" V# }0 N+ G$ |$ ^+ M
  76.            System.out.println(-Motor.B.getTachoCount());
    7 s* T6 E. n" y
  77.            Button.waitForAnyPress();9 v  }: K; W% d2 Q  g
  78.   }
    ' v. y- {& f( z$ Z4 G3 a0 Z( W* q2 ^

  79. - I8 m% n9 x+ @& Z9 e: y
  80.   publicstatic void main(String[] args) {% @; z2 G. v  r# C
  81.            Straighttraveler = new Straight();
    ! I/ K) }* d' M5 v: u
  82. , {: T; j) g/ u8 W/ r
  83.            traveler.adjust();8 r' c. f" K  Y
  84.            traveler.go();" M) Z6 |3 p) ]6 j7 u, A
  85.   }3 @) S+ C  l: A: Z5 K8 R
  86. }
复制代码

; G. f& Y! J% u5 e7 E- J- 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 编辑 * u4 a; P9 @: U; l+ k5 r5 `

/ U( |( x  y; x) [. d这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨,用代码程序的机器人都能很好的实现复杂功能
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 赞 踩

使用道具 举报

 楼主| 发表于 2017-7-26 10:08:44 | 显示全部楼层
clx 发表于 2017-7-26 07:221 Q* ^' V% N0 o/ d0 N0 ?
这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨, ...
3 x& B: U- J1 @5 F* g- q* ^
我用的是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-16 23:36 , Processed in 0.616498 second(s), 20 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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