找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 12631|回复: 7

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

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

6 T1 m- [( u5 S$ Q  h- \
首先说说车子的设计思路,希望也能对大家有用。我想到的影响车子走直线的因素有以下几个方面:

5 P: t7 w/ s! V% v& u
场地
6 p- l: f! P. I* {7 r# F2 i+ W1 C  水平度和光滑度
在家里当然瓷砖的效果是最好的7 n* Y, h) i; l& d
  线的直度
虽然规则里说起点终点之间不能有黑线,但是因为没用光感,完全是开环控制,所以也无所谓了。这里就直接用了瓷砖上的黑线来说明车子走的直不直
/ x; O1 U  r1 d. J/ r0 i) I  z1 l4 ]/ q: B. t
车子结构
% o; Q. ?. S9 P  轮子间距
- D9 J& D) ^6 d0 _8 U) `9 e     轮子间距越大越好,稍微想一下便知
+ o6 v; D5 r- J) I0 G  轮子大小% J) O, ?  M/ v# C
     轮子直径越小越好,而且轮皮要尽量薄(我这里用的是nxt自带的轮子)9 m8 M* r: V; w4 r- E  Z
  随动轮的设计. K1 \3 ~5 h3 C
     随动轮转动时对车子的影响应该尽量小。这里我自己想出了一个设计方案(当然我觉得别人也用过),让车子几乎不受随动轮的影响
+ m; o! m; K: W5 k  重心位置
8 O) e  h; B. W/ @- a     重心应该稍稍靠近主动轮以增大主动轮的抓地能力。但是太靠近的话就会降低车子的稳定性,并且升级空间较小0 Z& L9 ~, x& p% j9 U/ a; \. S
  结构稳定性
不用说,肯定是越结实越好。但是不能造成重量过大1 ~3 E  }% I& t/ Y
  轮子个数
有三种方案:平衡车(独轮或双轮),三轮车,四轮或以上。虽然很想做平衡车,但是无奈暂时不会用陀螺仪。四轮的话转角不好把控,而且结构复杂,所以就用了最简单的三轮车。(另外,我个人认为不能拐弯的车子就不能叫车子~叫火车或者轨道炮比较合适。。。)
4 e' b/ P: R9 {  驱动方式
这里我选择了直接由马达驱动轮子,不经过任何齿轮传动,一种简单准确的方式驱动: ]6 I$ ?" B. N( q8 h
% v0 }. `' K- ~+ K1 ^6 j
控制程序( N$ `, ?7 B8 l$ X
  运动过程控制7 _9 P# T! I# V/ h3 M0 G
     好的程序应该使轮子不打滑,车子运行平稳。由此采取平滑运动的控制方法,让车子开始时(近似)匀加速,直到速度足够(160度每秒)。在开始时,加速度甚至更小,可以参考我的程序(加速度增加->加速度不变->加速度为零)
* q' J& ?$ S- ]; _- |) C3 m9 }* \4 Y8 Z* S0 w$ m; {' h* [3 p6 K4 j6 Q4 \
调试与运行0 d$ a. A. D; S& C& W1 K
  轮子转速调整(车轮大小的设定)' h) J4 B9 |( F) u% e
      这个就没什么办法,只能硬着头皮调了。调整轮子的大小设置,实际上就是调马达转速,没有什么更有效的解决办法
& n: Q' q" f7 g8 c* c5 u& Y* x  起始位置车子正方向和直线间的夹角  C4 p$ D( H/ V2 @
      一个非常重要的因素,可谓差之毫厘谬以千里。所以尽可能减小两者的方向差。顺带一提,开环控制的小车,如果最终结果差距在一厘米只内,就已经没有什么可比性了。一厘米之内运气成分占比很大,因为0.01rad(0.5度以内)的夹角足以造成差距一厘米的偏差。这就是开环控制的特点

  g2 A  Z- j- j4 v9 r
' F2 T, _/ Y1 A( e8 k0 i. j, ~. g( @1 R, i% f
然后上源代码:
  1. * D% v% x& @* f2 G! @, z/ v
  2. importlejos.robotics.navigation.DifferentialPilot;
    - H4 G0 X; `6 v" |, b* j
  3. import lejos.util.Delay;
    , T, x$ u' C$ D# k- A( \- H
  4. * s5 C1 l7 t! e0 u- K
  5. /**+ ~: _4 Z% _1 _
  6. *Robot that stops if the buttons are presses before it completes its travel.
    + ^, ^2 v2 b# g. i3 T" O
  7. */
    # S5 ~( N& c! I5 \$ k
  8. : l3 D5 E* v: \" B: n

  9. & g* Y/ S6 h; n6 w! w4 I9 m
  10. public class Straight {
    : Q, s' B# a/ u
  11.   DifferentialPilotpilot;9 R4 N8 o2 J) l! @' z- p
  12.   doubleleftD = 4.3, rightD = 4.3;! y# h. _" A- g* ]" ?" N  r
  13. / r, ?  e- r) }' C' @8 U
  14.   publicvoid adjust() {- W9 V8 k8 W3 \2 T. l
  15.            //wait for release: A, Y" D' `2 U8 }' w6 n
  16.            while(Button.readButtons() > 0)! M1 i9 @0 P: _9 g2 N8 y
  17.                    ;/ |  X) w6 x3 B% ?9 n
  18.            while(Button.readButtons() == 0) {
    5 ^- S  W9 Y- Q6 D( V8 @4 z9 R4 L
  19.                    //input size by adjusting the wheels
    / S7 p. ]# }( k+ N" w' j' Z) a, |) R
  20.                    rightD= (double) (Motor.A.getTachoCount()) / 2160 + 4.3;7 T- E# I* o$ k4 ^+ L
  21.                    leftD= (double) (Motor.B.getTachoCount()) / 2160 + 4.3148;// 调试所得值
    4 a% F' W% a  }4 z

  22. % ]! b6 k  t0 t  R) p; @) P; X
  23.                    //display the size input
    $ V& K$ `7 G4 R" z& Y3 r$ q
  24.                    LCD.drawString("L:"+ String.valueOf(leftD), 0, 0);
    # K# d+ {6 ]/ c8 ^" ?* S
  25.                    LCD.drawString("R:"+ String.valueOf(rightD), 0, 1);9 R# l8 W6 B' d5 i& O* S) a
  26.                    Delay.msDelay(100);
    9 I6 p( N; Q: i; Y0 \$ I
  27.                    LCD.clear();
    + w8 [" D5 U" r- ?1 C; A
  28.            }* n2 D8 d0 @9 z: G( V9 V8 f# e
  29. & L0 ~3 Y# @# `
  30.   }
    & z! ?  ~% k+ B8 w) n" w5 I. B( W. N3 L
  31. $ T, u, E( s+ ~, w2 D
  32.   publicvoid go() {
    . U. v  v% Z* x4 d: s
  33.            //准备起步. G9 T0 _9 h. ]) c- L3 q& K6 v
  34.            //wait for release+ p" v0 g; G; e5 e8 Q3 y% B% }9 F
  35.            while(Button.readButtons() > 0)" t7 r. h0 _. \
  36.                    ;8 O( f4 x% c9 b) q( p5 V# j
  37.            System.out.println("pressto go");8 A- A7 _. ~0 m: ]" {9 `
  38. % x) U, G( W+ r# L: ?# H( S& _
  39.            Button.waitForAnyPress();
    * p6 C. K) U+ G8 H8 X
  40.            LCD.clear();+ W# W6 ]6 w* S6 K' f5 v7 V
  41.   G. o) [4 H1 |+ M( @
  42.            //初始化
    ! i. t& i8 e3 @: W; `0 u! T2 k
  43.            pilot= new DifferentialPilot(rightD, leftD, 13.5, Motor.A, Motor.B, true);' k9 u* V. `' K* F6 V) c
  44.            pilot.reset();# a7 k5 e" V  a  O7 J: J9 `+ s
  45. 1 D- f; K3 i7 L$ c  _
  46.            Delay.msDelay(3000);! l$ u" f+ C( q/ ]! @  ?$ b3 q

  47. 7 x# s' R$ ~& u8 n" s) _, e
  48.            doublespeed = 10;: X' n( H8 d5 S: u; {% V& ?
  49.            doubledistance = 0;
    7 Y  R$ A8 D2 i# U% s/ ~
  50. # ]; t* y( V. p7 E! K
  51.            //起步加速
    2 s/ y9 C% C  o6 @1 S) O4 L
  52.            pilot.travel(300,true);- r* i+ j( y& U
  53. ( v# G; j0 b' u/ g( O# s- S
  54.            while(distance < 20) {
    # {) Q5 t5 C5 ?# x  U/ K
  55.                    distance= pilot.getMovement().getDistanceTraveled();
    3 Q# R8 H" ]: ]6 Y6 a; v
  56.                    speed= distance * 5 + 10;
      v! v% z1 {7 O8 }
  57.                    pilot.setRotateSpeed(speed);+ C2 `( O  t; y
  58.                    Delay.msDelay(100);
    , M+ F2 ]$ j* c
  59.            }6 ]# t. g& N0 N% t8 g1 T
  60.            for(int i = 0; i < 10; i++) {
    . k0 t  u; g9 X0 C( f) P+ j, W
  61.                    speed+= 5;
    2 j4 S* V" s  s9 x+ M- q/ L. c
  62.                    pilot.setRotateSpeed(speed);  v3 s' ~* H: F  d1 Y7 `
  63.                    Delay.msDelay(200);6 ~+ b6 g8 k: h8 B1 ~
  64.            }' x6 v/ Y1 y- A1 W) S: Q
  65. 8 \/ `$ G1 k/ i, u& s5 T
  66.            //TODO 减速
    8 x2 D3 ^) G/ j8 G; Q9 q
  67. % h6 p; D8 M' K3 S( c
  68.            //停止机能7 [4 a; W  G, P4 ~3 b
  69.            while(pilot.isMoving()) {
    # W5 ~  w2 }3 w8 X; y% K% Y
  70.                    if(Button.readButtons() > 0). q5 K0 X/ d4 ?  q* J1 l0 u
  71.                            pilot.stop();. \3 J) {  W$ s+ {  x9 e+ i
  72.            }, c- G6 _; x2 x% F

  73. 6 F" A7 r# ?5 x: U6 J3 {
  74.            System.out.println("" + pilot.getMovement().getDistanceTraveled());) h& c6 v! e5 S0 ]. d
  75.            System.out.println(-Motor.A.getTachoCount());
    . o  ~) q# O' p7 ^7 a
  76.            System.out.println(-Motor.B.getTachoCount());) E7 a9 o- w  R5 [0 w/ {
  77.            Button.waitForAnyPress();$ f4 O1 I1 T9 n) |; f' t
  78.   }
    % Z5 ?8 ^0 k$ g( L7 D* o

  79. 4 K8 I  R% W1 K2 s7 j& i
  80.   publicstatic void main(String[] args) {& d# [) U! T$ E. P
  81.            Straighttraveler = new Straight();$ T) b8 ~% s# Q

  82. 4 U' |$ v# v) `; b6 o6 U
  83.            traveler.adjust();
    ) d) g7 {+ }! k& h6 W! @7 J7 M  f2 f
  84.            traveler.go();; D/ r$ K  e# \
  85.   }8 R, Q' t' C8 m, u# ?5 O
  86. }
复制代码

3 j$ f1 k9 l+ @
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 编辑 7 d8 w" b: C% H6 r9 H/ w
' ^1 p  }0 X: b/ w, X
这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨,用代码程序的机器人都能很好的实现复杂功能
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2017-7-26 10:08:44 | 显示全部楼层
clx 发表于 2017-7-26 07:22
. X0 }- H8 U" @9 l这一行行代码,C?,暂还不懂,反正看到写代码的都敬仰,这种程序是不是比G(乐高是不是叫G语言)的严谨, ...
3 I! t7 p; I, u+ Z! f- r# D) z7 ]$ M
我用的是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-7-24 19:17 , Processed in 0.104630 second(s), 20 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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