自平衡踏板车 – DIY – 果壳网 guokr.com

做一个非常酷的代步工具,立刻变成有车族。

http://img1.guokr.com/gkimage/id/05/wi/id05wi.pnghttp://img1.guokr.com/gkimage/1t/w7/3o/1tw73o.png

DIYer: ScitechWA
制作时间: 前后约3星期
制作难度: ★★★★☆
GEEK指数: ★★★☆☆

编译来源1

编译来源2

1   自平衡踏板车1.0版本

前段时间,我看到有人DIY了一只平衡滑板,觉得自己也可以做一个类似的平衡平台来测试一下技术。所以我专门去购买了儿童踏板车的一些后端部件(里面有马达和驱动轮),还有XenonJohn建议的电子元件。

滑板车地址:

http://www.instructables.com/id/Easy-build-self-balancing-skateboardrobotsegway-/

我们可以用和平衡滑板相同的方法在平衡组件上搭一块站立台板,但轮子要分得更开,台板还要旋转90度。

儿童踏板车的后端部件非常小,但速度够快,易于测试。

另外,注意不要有太大的冲撞!比如我们就只少了腿上几块皮,还在墙上戳了个小洞洞。

1.1   先展示一些小细节

http://img1.guokr.com/gkimage/gx/05/6w/gx056w.png

现在,我们成功买到了儿童踏板车一些后端部件(马达和驱动轮)和XenonJohn推荐的的电子元件,还弄到了一些三夹板、平面金属板和钢管。

我们将所有东西焊在一起,做出一块可供站立的区域,还有前方凸出的握把。马达要用螺丝钉固定在两侧,电路则固定在前面。再把电池式手电筒拆成两半,装到一只马达上面当做电池盒用,这样电工们就得换个新的手电筒了。

我们又找了一块旧的胶合板制作站立台板,现在它看上去稍微有点踏板车的雏形了。

我颠来倒去几次,终于搞对了马达的极性。过程尽管艰难,但马达第一次跑起来效果就很不错。马达的额定电压是24V,我们用的电池只有18V,所以需要调整一下力矩和功率值,调整之后效果显著,马达跑得很好。

1.2   元件

http://img1.guokr.com/gkimage/8c/ol/61/8col61.pnghttp://img1.guokr.com/gkimage/l5/kq/su/l5kqsu.pnghttp://img1.guokr.com/gkimage/ii/yq/sg/iiyqsg.pnghttp://img1.guokr.com/gkimage/po/6z/n6/po6zn6.png

这次DIY,你需要用到以下元件(网购是你的好朋友):

○ Arduino UNO——看看手边有没有,没有可以网购
○ Sabertooth 2×52马达控制器
○ 5自由度的加速度计
○ 2只从儿童踏板车上拆下来的后端部件,或者分别购买马达和驱动轮
○ 电池——密封铅酸电池物美价廉,动力钻也可以买得很便宜。如果锂电池是你的菜,锂电池也不错。
○ 用于加速度计的屏蔽多芯电缆,用于马达的大功率电缆
○ 安全操作开关
○ 控制转弯的拨动开关
○ 调整平衡位置的拨动开关
○ Arduino直流接口
○ 匹配Arduino的DIL管脚
○ 双面胶
○ 螺丝钉

1.3   工具

http://img1.guokr.com/gkimage/s2/f5/2q/s2f52q.png

除了正常工具之外,最好请有焊接机的人帮你焊接固定框。

需要用到的其他工具:

● 钻子和钻头
● 烙铁和焊锡
● 剪线钳和剥皮钳
● 热缩材料和热气枪

1.4   固定框和马达

http://img1.guokr.com/gkimage/wu/v2/7n/wuv27n.pnghttp://img1.guokr.com/gkimage/8y/6o/a0/8y6oa0.pnghttp://img1.guokr.com/gkimage/r0/6o/md/r06omd.pnghttp://img1.guokr.com/gkimage/gb/bw/ah/gbbwah.pnghttp://img1.guokr.com/gkimage/g6/56/jn/g656jn.pnghttp://img1.guokr.com/gkimage/vr/o7/11/vro711.pnghttp://img1.guokr.com/gkimage/xb/mz/sm/xbmzsm.pnghttp://img1.guokr.com/gkimage/ob/or/qg/oborqg.pnghttp://img1.guokr.com/gkimage/ya/l4/ah/yal4ah.pnghttp://img1.guokr.com/gkimage/vo/pe/9h/vope9h.pnghttp://img1.guokr.com/gkimage/f9/b5/v7/f9b5v7.pnghttp://img1.guokr.com/gkimage/j4/bx/fq/j4bxfq.pnghttp://img1.guokr.com/gkimage/fz/ow/xh/fzowxh.pnghttp://img1.guokr.com/gkimage/1s/p5/00/1sp500.pnghttp://img1.guokr.com/gkimage/9f/l8/7y/9fl87y.pnghttp://img1.guokr.com/gkimage/qv/k0/me/qvk0me.pnghttp://img1.guokr.com/gkimage/kz/b6/g8/kzb6g8.pnghttp://img1.guokr.com/gkimage/ki/jk/um/kijkum.pnghttp://img1.guokr.com/gkimage/u7/v4/zt/u7v4zt.pnghttp://img1.guokr.com/gkimage/g0/71/ks/g071ks.png

为了制作固定框,我们在每一侧都用了几块三夹板、两片金属盘,把踏板车的马达部件固定住。

切割两块三夹板,宽度适合双脚踩踏就行。

再在金属板上钻几个洞,好匹配踏板车驱动轮部件上的螺栓孔,再把金属盘焊接到三夹板搭建的台板上面。

我们还在前端装了一根立杆,在立杆上焊了T型把手,方便双手握把。又在直立的把手和第二块三夹板上之间加了一块三角板加强固定。

现在可以把轮子拧上去了。

1.5   电路

http://img1.guokr.com/gkimage/cw/e5/x5/cwe5x5.pnghttp://img1.guokr.com/gkimage/c8/gh/jc/c8ghjc.pnghttp://img1.guokr.com/gkimage/bn/d4/f1/bnd4f1.pnghttp://img1.guokr.com/gkimage/7t/0h/gs/7t0hgs.pnghttp://img1.guokr.com/gkimage/5l/cw/gg/5lcwgg.pnghttp://img1.guokr.com/gkimage/gk/ta/56/gkta56.pnghttp://img1.guokr.com/gkimage/5s/h4/oa/5sh4oa.png

你可以看到,这儿并没有很多电子元件,只有Arduino、IMU(惯性测量单元)、马达驱动和一堆开关。

开关和IMU的接线都必须是屏蔽线,除非IMU非常靠近Arduino。IMU应该尽量装在台板的中央或前面,比如我们就把IMU固定在了前端的盒子里。

从图中你可以看到,我们其实把所有东西都固定在了那个盒子里,骑踏板车的时候只能操作切断开关,左右驾驶和倾斜控制。

另外,电池被安装在了马达的顶部。

1.6   代码

http://img1.guokr.com/gkimage/tf/bi/fq/tfbifq.png

代码和XenonJohns写的基本上一样,只是额外调整了功率值和力矩值,因为我们在用18V的电池跑24V的马达。

在代码的开始处,我们定义了2个负责调节功率和力矩的变量。

下载链接:

http://www.instructables.com/files/orig/F6S/Z50M/GZ0JI60O/F6SZ50MGZ0JI60O.txt

2   改进版自平衡踏板车(2.0版本)

http://img1.guokr.com/gkimage/a3/pq/2o/a3pq2o.png

在制作了第一版自平衡踏板车作为测试平台之后,我们觉得它还挺酷的,所以决定再制作一版。

这次我们需要添加一些小特色:

1.2只14.4V的锂电池 2.马达和车轮组件的固定框 3.高度可调节的把手 4.性能优异的CNC(电脑数控)平台 5.花纹钢板

所以,这一版的制作材料基本和上一版的踏板车完全相同。

2.1   建造细节

首先,我们对第一个装置中存在的争论点进行了讨论,在这个版本中达成了一致。

最大的问题是儿童踏板车的后端部件是廉价的压盘,超重时会弯曲变形。所以我们用激光切割了一块金属盘来代替固定框固定马达和轮子。固定框用25mm的钢管制成,还进行了增强,好让它支撑更多重量。

前把手做成了高度可调节的,这样小矮个也可以骑了。

由于市面上没有比较便宜的、用我们现在用的这种电池的手电筒,只好自己做了个电池盒。

然后加上了花纹钢板,看起来更专业一点。

2.2   元件

http://img1.guokr.com/gkimage/cw/ks/n0/cwksn0.pnghttp://img1.guokr.com/gkimage/kn/ep/6k/knep6k.png

除了电池之外,其他的元件都和上一版相同。

你需要用到:

● Arduino UNO——看看手边有没有,没有可以网购
● Sabertooth 2×52马达控制器
● 5自由度的加速度计
● 2个从儿童踏板车上拆下来的后端部件,或者分别购买马达和轮子
● 电池——密封铅酸电池物美价廉,动力钻也可以买得很便宜。如果锂电池是你的菜,锂电池也不错。
● 用于加速度计的屏蔽多芯电缆,用于马达的大功率电缆
● 安全操作开关
● 控制转弯的拨动开关
● 调整平衡位置的拨动开关
● Arduino直流接口
● 匹配Arduino的DIL管脚
● 双面胶
● 螺丝钉

2.3   工具

http://img1.guokr.com/gkimage/2a/0b/ry/2a0bry.png

除了正常工具之外,最好请有焊接机的人帮你焊接固定框。

需要用到的其他工具:

● 钻子和钻头
● 烙铁和焊锡
● 剪线钳和剥皮钳
● 热缩材料和热气枪

2.4   固定框和马达

http://img1.guokr.com/gkimage/2q/w5/kv/2qw5kv.pnghttp://img1.guokr.com/gkimage/39/ek/bd/39ekbd.pnghttp://img1.guokr.com/gkimage/dw/ia/01/dwia01.pnghttp://img1.guokr.com/gkimage/xd/7e/2t/xd7e2t.pnghttp://img1.guokr.com/gkimage/or/6o/9h/or6o9h.pnghttp://img1.guokr.com/gkimage/xt/f8/h2/xtf8h2.pnghttp://img1.guokr.com/gkimage/f1/qp/25/f1qp25.pnghttp://img1.guokr.com/gkimage/7v/o1/ad/7vo1ad.pnghttp://img1.guokr.com/gkimage/d5/hi/m6/d5him6.pnghttp://img1.guokr.com/gkimage/0h/z4/4p/0hz44p.pnghttp://img1.guokr.com/gkimage/7k/x8/z5/7kx8z5.png

固定框做得非常牢固。我们为“轮子+马达”的组件使用了25mm的RHS方管和激光切割的金属盘,所以它不会再像上一个固定框那样扭曲了。

前把手做成可调节式,我们还在顶部加了漂亮的握把。

2.5   电路

http://img1.guokr.com/gkimage/6c/e8/pb/6ce8pb.pnghttp://img1.guokr.com/gkimage/5i/kj/u0/5ikju0.pnghttp://img1.guokr.com/gkimage/r7/ec/yk/r7ecyk.png

就像你在电路图中看到的那样,这次的电路非常简单,和我们制作的前一个版本完全一样。

开关和IMU的接线都必须是屏蔽线,除非IMU非常靠近Arduino。IMU应该尽量装在台板的中央或前面,比如我们就把IMU固定在了前端的盒子里。

从图中你可以看到,我们其实把所有东西都固定在了那个盒子里,骑踏板车的时候只能操作切断开关,左右驾驶和倾斜控制。

另外,电池被安装在了马达的顶部。

2.6   代码

http://img1.guokr.com/gkimage/o0/h4/x5/o0h4x5.png

代码和XenonJohns(这个DIYer的主页地址:http://www.instructables.com/member/XenonJohn/)的代码基本相同,不过额外调整了一些功率值和力矩值。

你是怎样安排你的读书时间的?

阅读的时间:

1、早上5:30-6:00起床,有将近1小时的整块阅读时间,如果时间充足一点,会做些笔记.

2、包里放上7寸的阅读设备(以前是K3,这段时间换成NT),放上几十本排版不错的电子书,在有时间的时候看看,比如排队、等人、开会之类零散时间。

3、手机里放一些有声书,比如台湾的博客思听、每天八分钟、中医堂、百家讲坛,做车、做家务、身体锻炼时听听

4、睡前把所有事情都安排完,会拿本书在床上看上一会,然后睡觉。
5、所有读完第一遍,觉得不错的书,会开始读第二遍并做些笔记。
6、出差时如果周末有时间会找家环境好点的咖啡厅,看上半天或一天书。不出差如果周末有空闲时会去图书馆,带上笔记看上半天书,做个记录。
7、做飞机或动车时会准备二、三本纸制书,比较厚有些深度的那种,我发现自己在飞机上看书效果最好。看累了就做笔记或简评。
想多看点书的最有用的建议:就是关闭电脑、离开网络,有网络有电脑的地方永远会让你分心的
我看书效果最好的三个地方:飞机、图书馆、咖啡厅

来至:

http://www.zhihu.com/question/20069551/answer/13941201?utm_source=weibo&utm_medium=weibo_share&utm_content=share_answer&utm_campaign=share_button

进行 Web 界面原型设计的一种方法

进行 Web 界面原型设计常用的工具如下:

  1. 白纸、铅笔、橡皮,有时候还需要剪刀。可惜大部分情况下保真度不高而且难以表述页面流程;
  2. Word,可以制作 wireframe,还可以批注或者加大段文字说明。可以在一定程度上表述页面流程,但是依赖于文字功底;
  3. PPT,使用起来比较麻烦,但是可以动态的表达出交互流程,可惜文字表达能力不足;
  4. Flash,同 PPT,更加难以使用。适合制作小屏幕界面原型;
  5. HTML,本文就是想讲如何使用 HTML 快速进行 Web 界面原型设计。

HTML 作为 Web 的基础,也是大部分项目开发过程中,设计师最终要向程序员提交的成果。使用 HTML 进行原型的设计,有相当大的优势在于可以节省一些制作的时间。但是这里面还是遇到几个问题:设计师如何管理 HTML 文件?最后提交给程序员后,如果要修改怎么办?因为大部分情况下,HTML 一旦交付,可能就四分五裂不成样子了。要修改的话可能要先改设计稿,好了之后再次提交给程序员,同时程序员要确认哪里修改了,哪几个文件修改了。如果使用 SVN 来协同开发,情况还好一些,但是设计师就要花上一段时间来理解程序结构。

我常戏称这种方法为页面驱动型开发,因为在开发前(确切说是编码前)大部分工作是处理界面、交互,并且制作出高保真的 HTML 页面原型。它基于 Web 标准设计,完全分离结构和表现,这样当程序员在原型基础上进行编码的同时,设计师可以进一步完善 UI 设计,而只用到 CSS 文件和 images 文件夹。通常情况下需要 CVS 或 SVN 的支持。

这种高保真的 HTML 页面原型,包括:

  • 页面布局和内容:一致的布局和界面上的文字(与用户的对话),不包括详细的 UI;
  • 页面流:页面原型上所有链接可点,并且可理解,比如 href="/posts/add" 这样的链接;
  • 提示信息:利用 JS 模拟用户操作,有成功操作或失败操作的提示;
  • 小元素:比如弹出小窗口的提示和帮助等。

这样的原型交付给程序员,相信他也会相当的开心的 :D,不会因为页面去向不明或者缺少提示等而询问产品经理或者设计师,因为实际操作一下就明白了。

在设计这样的原型时,主要的思想是 MVC。因为一开始程序员在编码前会有一份代码设计的文档,包括一些约定和类的设计。设计师可以借助这份文档一瞥程序结构。以 Blog 管理后台为例,如 Posts 具有 addeditlistdel 等功能。那么在本地就可以相应的建立 Posts 目录,目录下分别新建 add.htmledit.htmllist.htmldel.html 页面。现在设计师通常也配有 IIS 或者 apache 用来调试。那么在省略扩展名的情况下,我们就可以通过 http://localhost/blogadmin/posts/add 来测试添加 post 的页面。这与后期程序约定是一致的。

接下来我们要统一页面的布局(layouts)。以 CakePHP 这个 PHP 框架为例,布局模版一般放在 \app\views\layouts 下面。一般是默认的 default.thtml。仿照这个结构,在原型设计根目录下设 PostsCategoriesCommentsLayouts 等目录。统一的小代码块放在 Elements 目录下。

目录理清楚后,接下来就是如何连接起来。这里用到了 SSI(Server Side Include),可以用简单的注释实现文件包含、代码重用。只需使用例如 <!--#include virtual="/path/to/file" --> 的代码就可以包含文件。为什么不直接使用 PHPinclude?显然让设计师学习 PHP 有些困难,而这种注释形式的“程序”更加容易理解。

为了让所有的页面使用同一个布局,我们用到了系统变量 $QUERY_STRING,即 URL 中的查询字符串,比如 http://example.com/?home,那么 $QUERY_STRING=home。有了查询字符串,布局的问题就解决了,URL 统一的问题也能够解决。

在原型设计的根目录下新建简单的 index.html 文件,加入 <!--#include virtual="/layouts/default.html" -->,也可以直接用 index.html 作为统一布局文件。然后在 /layouts/default.html 文件中加上统一的布局代码,动态变化的区域用 <!--#include virtual="$QUERY_STRING.html" --> 代替。之后你就可以通过 http://localhost/blogadmin/?posts/add 来测试添加 post 的页面($QUERY_STRING=posts/add)。虽然与之前的 URL 不同,但是已经基本一致了。如果你是一个完美主义者,可以配一下 mod_rewrite,可以实现完全的 friendly URLs。

基本上就是如此,最后不要忘了 JS 的小提示、重用代码的整理。在原型设计的过程中可以不断地和程序员沟通,了解他的需求,这样子可以减少不少后期的沟通成本和返工的情况。

新增加 UCD 目录,将以前写的/转的相关文章放进去了。

转: http://www.junchenwu.com/2006/11/a_method_of_using_html_to_design_web_prototype.html

 

viagra

航空陀螺仪(陀螺地平仪)















第一节 航空陀螺仪

                  一、陀螺仪的基本知识

   陀螺玩具旋转时,能够直立在地上;而且转得愈快,立得也愈稳;即使给它一个冲击,也只是晃动而不会倒下。陀螺的这种特性可以被利用来做成仪表用来测量飞机的姿态角、航向角和角速度。
   航空陀螺仪表中的陀螺仪,是把绕自转轴(又叫转子轴)高速旋转的转子用框架支撑起来,使转子绕垂直于自转轴方向可以自由转动的这样一种装置。图8.1表示的是,转子安装在内环和外环这两个框架中,转子可绕自转轴高速旋转,转子同内环可绕内环轴转动,转子同内环和外环还可绕外环轴转动这样支承起来的转子可以绕着垂直于自转轴的两根轴转动,这种装置称为三自由度陀螺仪。若转子仅安装于内环中这样支承起来的转子只能绕着垂直于自转轴的一根轴转动这种装置称为二自由度陀螺仪。
   三自由度陀螺仪的基本特性之一是稳定性(又叫定轴性)。当转子高速旋转时,因具有很大的惯性,自转轴能够保持原来的方向稳定;无论基座怎样转动,自转轴所稳定的方向都将保持不变;同使受到冲击作用,自转轴也仅在原来的方位附近作一种高频微幅的振荡运动。陀螺仪具有抵抗干扰作用而力图保持自转轴方向稳定的特性叫做螺仪的稳定性。

   陀螺仪的又一基本特性是进动性。当转子高速旋转时,若外力矩绕外环轴作用,陀螺仪将绕内环轴转动;若外力矩绕内环轴作用,陀螺仪将绕外环轴转动。陀螺仪转动角速度方向与外力矩作用方向互相垂直的特性,叫做陀螺仪的进动性。进动角速度 的方向取决于转子动量矩H的方向(与转子自转角速度矢量的方向一致)和外力矩M的方向,可用右手定则确定。进动角速度 的大小取决于转子动量矩H的大小和外力矩M的大小,其计算式为 =M/H。如果这种进动由陀螺仪中的干扰力矩引起,则叫做漂移,漂移角速度即漂移率是衡量各种陀螺仪表精度的最重要的指标。

   至于二自由度陀螺仪的特性,就与三自由度陀螺仪不同。二自由度陀螺仪少了垂直于内环轴和自转轴方向的转动自由度。这样,当基座绕着这个缺少自由度的轴线转动时,通过内环轴上一对轴承的推动,就强迫陀螺仪跟随基座转动;与此同时,基座作用于内环两端轴承上的推力形成了推力矩将强迫陀螺绕内环轴进动,使自转轴趋于基座转动角速度的方向重合。因此,二自由度陀螺仪具有感受绕其缺少自由度方向转动的特性。
   正是因为陀螺仪具有上述特性,可以做成测量飞行器(飞机、导弹、卫星等)角位置和角速度的仪表,还可做成测量飞行器线加速度和角加速度的仪表。
在航空上,陀螺仪表的基本用途是测量飞机的姿态角、航向角和角速度,因而成为飞机飞行的重要仪表。

航空陀螺仪表名称

在飞机上的用途

陀螺地平仪

测量飞机的姿态角,给出姿态指示

垂直陀螺仪

测量飞机的姿态角,输出姿态信号

陀螺半罗盘

测量飞机的航向角,给出航向指示

航向陀螺仪

测量飞机的航向角或给偏航角,输出航向或偏航信号

陀螺磁罗盘

陀螺半罗盘与罗盘组合,用来测量飞机的航向角,并给出航向指示

陀螺转弯仪

测量飞机的转弯角速度,给出转弯指示

速率陀螺仪

测量飞机绕机体主轴  转动角速度,给出转弯指示

全姿态组合陀螺仪

垂直陀螺仪与航向陀螺仪组合,用来测量飞机的姿态和航向角,并输出姿态和航向信号

双轴陀螺稳定平台

测量飞机的姿态角,输出姿态信号

三轴陀螺稳定平台

测量飞机的姿态和航向角,输出姿态和航向信号

   这里对飞机航行驾驶和飞行自动控制系统中使用的陀螺仪表列表说明,以便对航空陀螺仪表的名称及其用途有一个概貌的了解。
   从使用角度来看可把表中所列的航空陀螺仪表分成指示式的和传感式的两类。指示式陀螺仪表是给飞行员提供判读指示的陀螺仪表。传感式陀螺仪表是给飞行自动控制系统和机载特种设备提供电气信号的陀螺仪表。

   下面介绍常见的航空陀螺仪表的工作原理包括陀螺地平仪、陀螺半罗盘、陀螺磁罗盘和陀螺转弯仪等指示式仪表。至于垂直陀螺仪、航向陀螺仪和速率陀螺仪等传感式仪表,其工作原理与指示式的并无本质上的区别。
                         二、陀螺地平仪
   陀螺地平仪是利用三自由度陀螺仪的特性和摆的特性做成的陀螺仪表,用来测量飞机的姿态角。飞行员凭借陀螺地平仪的指示,才能保持飞机的正确姿态,完成飞行和作战任务。特别是在云中飞行或进行夜航时,飞行员看不见大地的地平线和地标,如不借助仪表,驾驶飞机就十分困难;而且,飞行员容易产生错觉,甚至可能造成机毁人亡的事故。由于飞行姿态对飞行的运动状态具有决定性的影响,对保证飞行安全也具有极大的重要性,因此,作为首要飞行仪表的陀螺地平仪通常都安装在飞机仪表板中间的最显眼位置上。在有些飞机上还加装了应急地平仪,以备主地平仪出现故障时使用。
   飞机的姿态角是指俯仰角和倾斜角。假如飞机上有一个地平面基准,当飞机抬头或低头时,飞机纵轴与这个地平面之间的夹角就是飞机的俯仰角。当飞机绕纵轴向左或向右转动时,飞机纵向对称平面绕纵轴转过的角度就是飞机的倾斜角。
   要测得飞机的姿态角,关键是在飞机上建立一个地平面或地垂线基准。我们知道,摆能够自动寻找地垂线具有方向敏感性;但它受加速度干扰时会产生很大的误差,缺少方向稳定性。我们也知道三自由度陀螺仪的自转轴并不因加速度干扰而改变方向,具有方向稳定性;但它却不能自动寻找地垂线,没有方向敏感性。即使把自转轴调整到与地垂线重合,由于地球自转和飞机运动导致地垂线在惯性空间不断改变方向,而且陀螺漂移导致自转轴在惯性空间也不断改变方向,这就使得起初与地垂线重合的自转轴逐渐偏离地垂线。由此想到把摆和陀螺仪二者的优点结合在一起,即用摆敏感地垂线并对陀螺仪进行修正,使具有方向稳定性的自转轴获得方向敏感性,这样便可在飞机上建立一个精确而稳定的地垂线基准。
以三自由度陀螺仪为基础,加上修正装置,再装上指示机构,就可构成陀螺地平仪。若不装指示机构,而是装上信号传感器,则可构成垂直陀螺仪。

                三、陀螺半罗盘与陀螺磁罗盘
   陀螺半罗盘是利用三自由度陀螺仪的方向稳定性做成的陀螺仪表用来测量飞机的航向角。陀螺磁罗盘是把陀螺半罗盘与磁罗盘组合在一起以便更好地解决飞机航向的测量问题。飞行员借助陀螺半罗盘或陀螺磁罗盘判明飞机的航向并按一定的航向飞行,才能驾驶飞机沿着正确的航线飞到预定的目标。在我机迎击来犯的敌机时飞行员必须根据敌机飞行情况不断修正飞行航向才能准确地飞到空战区域歼击来犯的敌机。可见陀螺半罗盘或陀螺磁罗盘也是十分重要的飞行仪表。
   飞机的航向角是指飞机纵轴在水平面上的投影与子午线之间的夹角.由于子午线有地理子午线(又叫真子午线)主磁子午线之分,所以航向角也有真航向角和磁航向角之分。由于地磁南、北极与地理南、北极不相重合,所以磁子午线与地理子午线之间相差一个角度这个角度叫做磁差角。在地球上各地的磁差角不同己通过实际测定绘面磁差地图供查阅使用。
   要测得飞机的航向角,关键是在飞机上建立一个磁子午线或地理子午线基准。众所周知,自由悬挂的磁针可以确定出磁子午线方向。利用磁针定向原理做成的测量航向的仪表称为磁罗盘。
   这里,我们又很自然地想到陀螺仪。在地球上放置的三自由度陀螺仪可以感受到地球的自转,加上适当的修正装置之后,自转能够自动寻找到地理子午线方向。这种由陀螺仪做成可测出真航向角的陀螺仪称为陀螺罗盘(常称陀螺罗经)。航海上从本世纪初开始用陀螺罗盘代替磁罗盘,目前在大海里航行的轮船和舰艇都是用它来精确地测量航向。但因陀螺罗盘的工作精度受航行体速度和加速度等影响比较大,而飞机的速度又比舰船大得多,以致在飞行中使用时会造成过大的误差,甚至不能正常工作,所以至今飞机上并未使用陀螺罗盘作为航向仪表。然而,航空上可以利用陀螺仪的方向稳定性做成飞机使用的陀螺半罗盘,以弥补磁罗盘或天文罗盘等航向仪表的不足。
   以两自由度陀螺仪为基础,加上水平修正装置和方位修正装置,再装上指示机构,就构成陀螺半罗盘。

   但是,陀螺半罗盘并不能自动找北,它的方位修正装置也不能完全消除方位偏离误差。因此,飞行员在仪表起动时,以及在使用过程中每隔一定时间例如半小时还必须根据磁罗盘或天文罗盘的航向指示,来调整陀螺半罗盘的航向指示。因它要人工进行航向校正,只起到半个罗盘的作用,故得名陀螺半罗盘。
   人工校正的办法显然增加了飞行员的工作负担所以在近代飞机上都采用自动校正的办法,把陀螺半罗盘与磁罗盘或者天文罗盘组合在一起。陀螺磁罗盘就是由陀螺半罗盘与磁罗盘组合而成,目前各种飞机上广泛把它作为基本航向仪表使用。
                        四、陀螺转弯仪
   陀螺转弯仪是利用二自由度陀螺仪的特性做成的陀螺仪表用来测量飞机的转弯角速度。飞机在空中飞行,经常有两种飞行状态,即保持飞机平直飞行状态和操纵飞机转弯或盘旋飞行状态。飞机的转弯就是改变航向,正确的转弯需要一定的倾斜来协调进行,而转弯的快慢则用来转弯角速度来表示。飞行员除了借助陀螺地平仪和陀螺磁罗盘(或陀螺半罗盘)了解飞机的姿态和航向之外还需借助陀螺转弯仪了解飞机转弯的方向和转弯的快慢。因此,陀螺转弯仪也是一种必备的飞行仪表。
   如前所述,二自由度陀螺仪具有感受绕其缺少自由度方向转动的特性。当基座绕着该轴线转动带动陀螺仪转动时陀螺仪将出现绕内环轴的转动使自转轴趋于与基座转动角速度的方向重合。我们可以利用二自由度陀螺仪的这种特性来测量角速度。
   但是,这样的二自由度陀螺仪仅仅能敏感出基座转动的方向,而无法测量出转动角速度的大小,为此需要在陀螺仪中装有弹簧如螺旋弹簧、片弹簧或弹性扭杆。当基座转动使陀螺仪绕内环轴转动而出现转角时弹簧因弹性变形就产生了与该转角成正比的恢复力矩,以平衡基座转动角速度所产生的绕内环铀的转动力矩。当这两个力矩恰好平衡时,陀螺仪绕内环轴停止转动。基座转动角速度愈大陀螺仪绕内环轴的转角也愈大。由于输出转角与输入角速度成正比,故可度量出角速度的大小。

             五、飞机姿态和航向的综合测量与综合显示
   航空上使用上述这些基本的陀螺仪表是从本世纪初开始的。先是作为指示式仪表用于飞机的航行和驾驶随后作为传感式仪表用于飞行自动控制系统和各种机载特种设备。但是,近代航空陀螺仪表同初期的相比其结构更趋完善性能也更加提高。从五十年代至今的三十年来,陀螺技术有了很大发展,出现了许多新型陀螺仪表。就测量飞机姿态和航向的陀螺仪表来说,目前在新型的飞机采用了全姿态组合陀螺仪或者采用陀螺稳定平台,作为飞机姿态和航向的测量中心给地平指示器、航向指示器、自动驾驶仪以及各种机载特种设备提供飞机姿态和航向信号。
   全姿态组合陀螺仪由垂直陀螺仪和航向陀螺仪组合而成。垂直陀螺仪安装在倾斜随动环内,以便俯仰和倾斜的测量范围均能达到360o。航向陀螺仪安装在俯仰随动环和倾斜随动环内,以便消除飞机俯仰和倾斜所引起的航向测量误差。这样组合的仪表可同时精确测得飞机的姿态和航向。
   近三十年来,在飞机姿态和航向的显示方面也有许多改进,出现了诸如全姿态指示器。指引地平仪(又称姿态指引指示器)和航道罗盘(又称航向位置指示器)等新型指示器,对飞机的姿态和航向进行综合显示和指引显示。

   随着飞机性能的提高特别是低空轰炸系统的出现,从飞行安全考虑,飞行员需要迅速地同时判断出飞机的姿态和航向。为能较好的适应日益复杂的飞行作战任务的需要,出现了把姿态和航向综合在一起显示的全姿态指示器。

   对于现代高速飞机,飞行员必须及时观察和分析飞机的姿态、航向、航道、高度、速度等各种飞行参数信息并在此基础上迅速作出下一步如何操纵飞机的决策。在飞机进场着陆阶段,矛盾更加突出,这时从观察、分析到决策所允许的时间是很短的。为使飞行员对飞机现有姿态、航向和航道等飞行参数能一目了然保证飞机在夜间和复杂气象条件下正常飞行以及安全着陆,出现了带有指引显示的指引地平仪和航道罗盘。这两种仪表是飞行指引系统的重要部件。
   为了更加形象地综合显示各种飞行参数和指令信息,在上述机电式指引地平仪和机电式航道罗盘的基础上,还出现了电子指引地平仪和电子航道罗盘等新型的电子综合显示仪表。


 

  



网  址aircraftdesign.nuaa.edu.cn

校  址:南京市御道街29号

咨询电话:84892177



©2004 南京航空航天大学飞机设计研究所               

关于双轮平衡小车的算法资料收集

[转1]
整个系统分为三大部分。
1.角度采集
2.电机数据运算
3.电机驱动

先说第一部分:角度采集.
这里我采用两种传感器:一种是陀螺仪(ENC03),另一种是加速度计(MMA7260).其实任何其中一
种都可以得出现在的车体倾斜角度值。为什么我们要选择两种呢?原因是这里有一种思想在里面:互补。

先说下陀螺仪:
陀螺仪属于测量旋转运动的传感器,其输出的是角度变化速度。即旋转的越快,输出量越大(不能
无限大,传感器上有极限指标);旋转的越慢,输出量越小(最小为0,即静止时)。
我们可以通过积分运算(累加),得出相对角度数据,这里假设为A。但是我们知道,积分是有严重
的累积误差的。我们可以一句话概括:陀螺仪短时间准确,长时间不准确。
再说下加速度计:
加速度计属于测量线性运动的传感器,其输出的是传感器沿某个轴向直线运行时的速度变化量。即
速度变化的越快,输出量越大(不能无限大,传感器上有极限指标);速度变化的越慢,输出量越小(最小
为0,即静止时)。这种特性用来做惯导研究很好。但是如何和我们的角度倾斜量相关呢?
我们知道加速度计测量的是加速度量,而地球上的物体都是受万有引力制约的,即我们时刻都受到
一个大小为g的竖直向下的加速度的作用。可能很多人都快看不下去了,我就直接贴图说明吧,如下:

我们通过反正弦运算,可以得到加速度计当前与重力方向的夹角数据,这里假设为B。
但是又有新的问题了。加速度计是测量线性运动的,即其对震动非常敏感。电机转动,所产生的震
动是不可小视的。所以其会有很大的噪声。而且当加速度计运动时,其输出量是运动加速度与重力加速度的
混合数据,这会严重影响角度计算的准确性。其特点用一句话概括:加速度计长时间较准确,短时间误差大。

现在我们重新审视一下,这两个传感器恰恰成互补关系。要得出比较准确的、长时间稳定的角度数
据,这两种传感器是缺一不可的。这也就是贯穿我整个数据采集过程的基本思想–互补。
我的具体做法是偏向于使用陀螺仪数据。原因是陀螺仪数据的噪声较小,短时间内误差小。而其长
时间的积分误差怎么解决呢?我的方法是使用加速度计角度数据B的平均值来校准陀螺仪的角度数据A.
直接伪代码如下:
A += (B-A)/k;
这里的K是衰减倍数。
其实就这么简单,这就实现了比较准确的角度数据的采集工作。

下面说下滤波问题。我们知道加速度计的噪声很大,我们这里采用卡尔曼的思想来滤波,另一种说法是数据融合。

其实这里就是两种传感器的典型互补了,用其算出来的角度数据相对来说很准了。
设加速度计换算出的角度数据为M,陀螺仪只采数据为s,陀螺仪相对加速度计的因子为k,上次加速度计经过滤波后的角度数据为M_2,卡尔曼
增益选择固定值为g.滤波后的角度数据为real_M;
那么滤波伪代码:
Temp=M_2+s*k;
real_M = Temp*g+(m-Temp)*(1-g);
M_2 = real_M ;

其实整个小车中,最关键、也最难的地方就是角度采集问题。准确的角度,只要一个P作用量就能轻松让小车站起来。

一部分:电机数据运算.
其实网上关于这部分的资料是最多的。我采用的是经典的PID算法。
理论我不讲了。我只讲讲实现过程。
这里如果先试试车体的稳定性,我们先只使用P作用。
现在以能立住为目标。

P,就是比例。假设当前角度偏差为error,目标角度为aim,比例系数为p,那么
PID计算伪代码为PID_result = (error-aim)*p;//(这里aim=0,即竖直状态)。
可以看出,如果车体倾斜度越大,那么计算出的PID的P值比例性的增大。

举实例说明(具体参数与车体和电机等有关):
我的电机为[email=200RPM@12V]200RPM@12V[/email],PWM的调制精度为-255~+255,那么当我的P参数p=30时,小车基本能够立住了(不足点就是总喜欢前后跑动)。

其实就这么简单。

剩下的I和D参数的调制方法,大家可以查阅网上的丰富的资料。I是减小误差的,D是阻碍小车姿态变化的。

3.电机驱动
这部分是最基础的。我才用的是L298驱动芯片。加了光耦隔离(原因是减速电机正反转切换时,产生的反电动势会造成单片机死机)。电机控制器为ATmega8,脉宽调制是使用的其内部自带的硬件PWM。为了简单起见,直接给两个轮子临时加上了码盘,而ATmega8也承担了由码盘数据得出电机转速和行程的数据任务。其与控制器ATmega168之间使用TWI(其实就是I2C)协议通讯。

 

 

[转2]

主控制流程如下:

下面对“过程一”和“过程二”作具体介绍:
? 过程一:加速度计算:
如图:

关于双轮平衡小车的算法资料收集 - 哲杰 - 哲杰

(原文件名:新建图像.JPG)  引用图片
点O为轮轴,点P为机体(系统)质心;
假设已知:机体质量m , 重力加速度g ,
机轴倾角θ(具体测法参见“实验报告”)。
设机体以加速度a加速,
则受到假想的惯性力F*= ma;
要使机体回复平衡状态,就要使得:
ΣM = 0 (M为力矩);
如图以点O(即轮轴)为转轴,支持力N,过转轴,力矩为零;摩擦力为被动力,且轮胎不与机身固连,不需要考虑。
即:mglsinθ+ F* = 0;
∴  a ≥ g?tanθ;
从而可以令:a = k?tanθ?g (k≥1);
进一步修正:
又知a应与P点相对于点O的角(线)速度(ω=d θ/d  t)成正比以获得更好的回复效果;
∴可以令  a = k1 ?ω?tanθ?g; (★)
其中:k1为常量,其取值可通过实验获得;ω为优化修正量,没有量纲。

?过程二:加速度实现:
假设轮子与地面不发生相对滑动,
∴  a = at    (at为车轮的线加速度);
∴  a = R?d ω/d t    (R为车轮半径);
而  J = ΣJi = ω?I    (J为角动量;I为车轮转动惯量。由于质点组(车轮)角动量方向相同,可以叠加。);
∴  at = R?d ω/d t = R/I?(d J/d t) = (R/I)?M ;
其中:  M = M1 – M0    (其中M0为阻力力矩,设其为定值;M1为马达产生的力矩);
∴  M1 = at?I/R + M0;
已知:M1M1与马达扭力F成正比,
而:P = F?V    (其中,P为功率,V为车轮转速);
∴  可以令:M1 = k?P/V    (*);
∴  P = (1/k)?V?(atI/R + M0)    (其中V可以通过测定轮轴的转速来获得);
进一步修正:
车轮可以近似看作均匀圆盘,∴I ≈ 2mR2    (其中m为单个车轮的质量)
a = at;       令:1/k = k2
∴  P = k2?V?(2mR?a + M0) ;
∴  单个车轮的输出功率为:P = k2?ma?V?R + 0.5 k2?V?M0 ;(★)
其中:k2 、M0均为常量,可从实验中归纳。
注明:由(*)可知,k的量纲为“m”,所以k2的量纲为“1/m”。
? 过程一与二的统一:
将两(★)式联立,可以得到:
P = k1 k2?tanθ?ω?mg?V?R + 0.5 k2?V?M0
其中,ω为优化修正量,没有量纲,k2有量纲(1/m)。

[转3]

Torque = AngleError * Kangle + AngularRate * Krate + VelocityError * Kvel + IntegratedVelocityError * Kivel

  • Angle error is the displacement from vertical (balance)
  • Angular rate is the rate of rotation (deg/sec)
  • Velocity Error is the difference between the commanded velocity and the actual velocity
    Integral Velocity Error is an accumulation of velocity errors used to maintain the forward velocity over uneven terrain.
  • The various Kxxx are the gains for each term.  The value range from 1-30 or so and are dependent upon lots of other factors like the mass of the robot, the resolution of the encoders, the loop rate for controlling the motors, etc.  I determined all of my values by trial and error.

http://e-book2003.blog.163.com/blog/static/17552073201082995130537/

火车票购买终结者

综合 12306.com 三个自动脚本

感谢自动登录作者 : kevintop   以及感谢自动查询, 自动提交作者

 

本程序解决的问题:
针对 https://dynamic.12306.cn/otsweb/ 网站登录难的问题,特写了该小插件,

只需要输入一次用户名、密码、验证码,即可进行多次尝试登录,直至登录成功。

使用过程请看提示!!!!

 

 

使用说明:

在chrome中,打开 http://t.qdsang.com/12306.user.js 地址,进行插件安装。
然后在浏览器中打开 https://dynamic.12306.cn/otsweb/ , 输入用户名、密码、验证码,
然后点“自动登录”按钮即可。
如果登录成功后,会跳转到车票查询页面
有配套定时刷新票数,

在查询结果上的列名上有对应勾选框, 勾选说明购买该车种;

已经自动提交订单,
订单提交成功后需要手动操作

 

 

另外,在IE下可以使用  ( 建议使用chrome浏览器 ),

Internet Explorer 6-8 用户建议安装Trixie扩展:
http://www.bhelpuri.net/Trixie/
把用户脚本放在C:\Program Files\Bhelpuri\Trixie\Scripts文件夹下(64位系统在:C:\Program Files (x86)\Bhelpuri\Trixie\Scripts),
在工具->Trixie Options(Trixie选项)中点击Reload Scripts(重新载入)按钮,再选中该脚本,即可使用。

 

 

安装地址:

http://t.qdsang.com/12306.user.js

linux-0.11调试向导

form : http://www.oldlinux.org/oldlinux/viewthread.php?tid=4352

这是我写的linux-0.11调试向导,其中有个文件
linux-0.11-debug.tar.gz是在赵博的linux-0.11-040327-rh9.tar.gz基础上修改的
,专门用来调试内核。

Linux 0.11调试向导
Harold Lee

Last Updated: 2005-11-2
一、介绍
赵炯的《Linux内核完全注释》对于想要学习内核的人来说,是本非常好的入门书。但是对于内核这样的系统软件,只是限于看书还远远不够,要想进一步提高,就必须得亲自调试内核。好在所需的工具都有了,现在就只剩下如何把这些工具组合起来,搭建一个调试系统,本文旨在帮助读者达到这个目地。
二、需要的东西
* 赵炯的《Linux内核完全注释》这本书是必需的,纸版或电子版的都可以。电子版可以到以下地址下载http://oldlinux.org/download/clk011c-1.9.5.pdf
oldlinux论坛也是个好地方,可以得到赵博的亲自指点,而且也有很多内核爱好者可以共同讨论。
http://www.oldlinux.org/cgi-bin/leoboard.cgi
* wxWindows-2.4.2
这是一个图形库,因为bochs对于X的支持不如对wxwindows的支持,为了能够顺利编译bochs,所以还是需要它。本文所使用的版本需为 2.4.2或以上。下载地址:

FXブログ 初心者でもわかるFX入門


* bochs-2.2:
一个能完全仿真x86的软件,本文所需版本为2.2或以上。
http://oldlinux.org/Linux.old/bochs/bochs-2.2/bochs-2.2.tar.gz
* linux-0.11的bochs image文件。
http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040923.zip
* 用于调试的linux-0.11
http://oldlinux.org/Linux.old/bochs/linux-0.11-debug.tar.gz
* Linux分发版本
基于你所在的平台,可以分为linux平台和windows平台,本文讨论 linux平台下的搭建。
linux平台先找一个目前流行的任何一个linux分发版本,记住把所有的开发包都装上。
三、编译
本节假设您都是在当前家目录下,解包,编译,安装。
(1)wxWindows
1. 解包
如果正常下载,应该会得到一个类似wxGTK-2.4.2.tar.bz2这样的包,通过下列命令解开它:
tar xvfj wxGTK-2.4.2.tar.bz2
在你的家目录下会有一个wxGTK-2.4.2的目录
2. 配置
进入刚解开的wxGTK-2.4.2目录,按照以下命令配置
./configure –prefix=/usr –with-gtk
3. 编译
接着在当前目录下运行这个命令:
make
4. 安装
首先切换到root用户下,如果你已经是root则不用切换,切换命令为:
su
输入你的root密码就可以切换到root用户下了。然后输入命令:
make install
你的wxWindows就安装好了。
(2)bochs
虽然bochs也提供已编译好的包,但是本文推荐自己编译。因为需要编译两个不同版本,后面会用到。编译bochs可能会遇到各种不同的问题,本文尽量把所有问题都交待清楚,以便您一次就能编译成功。
1. 解包
如果你按照正常下载,应该会获得一个名字为bochs-2.2.tar.gz的软件包,通过以下命令解开:
tar xvfz bochs-2.2.tar.gz
接着在你的家目录下就会有个bochs-2.2的目录了。
2. 配置
进入你刚才解开的bochs-2.2目录,在这个目录下,你会看到一个名叫configure的脚本文件,这个是unix世界软件包的标准配置文件。如何使用它,可以通过以下命令查看所有的配置选项:
./configure –help
这样你会得到一份详细的配置选项清单。本文打算编译两份不同的配置的版本。
第一个的版本为使用bochs自带的内部调试器。配置命令为
./configure –prefix=/opt/bochs/debug –with-wx –without-x –enable-plugins \
–enable-debugger –enable-disasm
配置注释:
* –prefix=/opt/bochs/debug
这个选项的意思是软件将被安装到哪个目录下
* –with-wx
这个选项的意思是使用wxWindows图形库,用作bochs的gui。
* –without-x
这个选项的意思是不要使用X图形库
* –enable-plugins
这个选项是必须要的
* –enable-debugger
这个选项是打开bochs的自带调试器
* –enbale-disasm
这个选项允许反汇编
3. 编译
接着在当前目录下运行命令:
make
4. 安装
首先切换到root用户下,如果你已经是root则不用切换,切换命令为:
su
输入你的root密码就可以切换到root用户下了。然后输入命令:
make install
这样你的bochs自带调试器的版本就编译好了。用以下命令作一个符号链接
ln -s /opt/bochs/debug/bin/bochs /usr/bin/bochsdbg
第二个版本为使用gdb-stub的版本
1. 清理
在配置第二个版本之前,需要把刚才编译的东西清理掉,输入以下命令:
make clean
2. 配置
然后配置,配置命令为
./configure –prefix=/opt/bochs/gdbstub –with-wx –without-x \
–enable-plugins –enable-disasm –enable-gdb-stub
配置注释:
* –enable-gdb-stub
这个选项打开gdb stub支持
* 其他选项同上,注意这个不同版本会安装到不同的目录下。

3. 编译
接着在当前目录下运行命令:
make
4. 安装
切换到root用户下,如果你已经是root则不用切换,切换命令为:
su
输入你的root密码就可以切换到root用户下了。然后输入命令:
make install
这样你的bochs使用外部调试器gdb的版本就编译好了。用以下命令作一个符号链接
ln -s /opt/bochs/gdbstub/bin/bochs /usr/bin/bochs
四、环境的搭建
(1). bochs的配置
使用bochs,还需要相应的image文件,linux-0.11-devel- 040923.zip这个包提供了我們需要的image文件,把这个包解开。会有一个linux-0.11-devel-040923目录产生,进入这个目录,因为里面的bochs配置文件是基于windows平台的,要想在linux平台用,还需要修改。输入以下命令:
find -name ‘*.bxrc’ | xargs sed -i -e ‘s@\(.*romimage.*\)\\\(.*\)@\1/\2@’ -e ‘s@^vgaromimage: \(.*\)@vgaromimage: file=\1@’
cp bochsrc-fdb.bxrc bochsrc-debug.bxrc
sed -i ‘s@\(^floppya: 1_44=\).*\(, status=inserted\)@\1″linux/Image”\2@’ bochsrc-debug.bxrc
cp bochsrc-fdb.bxrc bochsrc-gdbstub.bxrc
sed -i ‘s@\(^floppya: 1_44=\).*\(, status=inserted\)@\1″linux/Image”\2@’ bochsrc-gdbstub.bxrc
在bochsrc-gdbstub.bxrc中添加一行:
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

(2). linux-0.11调试版本
进入linux-0.11-devel-040923目录解开linux-0.11-debug.tar.gz,输入以下命令:
tar xvfz ../linux-0.11-debug.tar.gz
会有一个linux目录产生,这是一个经过修改可以在当前linux环境下编译,产生可调试的linux 0.11
内核。进入该linux目录,输入命令:
make
就开始编译内核了。
到此为止,所有的搭建工作都已做完了,剩下的就是开始调试了。
五、调试内核
调试工作主要在linux-0.11-devel-040923这个目录下进行,有两种调试方法:
第一种:使用bochs自带的调试器调试,输入命令:
bochsdbg -f bochsrc-debug.bxrc
首先,选择Debug菜单中的Debug Console子菜单,然后选择Simulate菜单的Start子菜单。可以开始调试
第二种:使用外部调试器gdb调试,输入命令:
bochs -f bochsrc-gdbstub.bxrc
只需选择Simulate菜单的Start子菜单,它会提示
Waiting for gdb connection on localhost:1234
端口是基于你的bochs配置文件的设置,然后另开一个终端,进入linux目录下的debug目录,输入命令:
gdb system
进入gdb调试界面,首先设置断点,比如
(gdb) b main
Breakpoint 1 at 0x6631: file init/main.c, line 110
然后远程调试
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:496
496        inode->i_mtime = inode->i_atime = CURRENT_TIME;
让程序跑起来
(gdb) c
Continuing.
Breakpoint 1, main () at init/main.c:110
110         ROOT_DEV = ORIG_ROOT_DEV;
OK,现在已经进入调试状态了。
在实际调试当中,常常需要把这两种方法结合起来,能够达到很好的效果。因为第一种方法非常直观所有的寄存器一目了然,
但是却是全汇编而且都单步的,对于内核后期的c语言文件,这样一步步走效率太低,所以需要第二种方法快速找到c语言文件
函数或语句的地址,然后在第一种方法中在该地址设置断点,可以直接跳到该地址执行,这样效率就高很多了。

形象解释PID算法+PID算法源代码

来至:http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=5043342

小明接到这样一个任务:
有一个水缸点漏水(而且漏水的速度还不一定固定不变),
要求水面高度维持在某个位置,
一旦发现水面高度低于要求位置,就要往水缸里加水。

小明接到任务后就一直守在水缸旁边,
时间长就觉得无聊,就跑到房里看小说了,
每30分钟来检查一次水面高度。水漏得太快,
每次小明来检查时,水都快漏完了,离要求的高度相差很远
,小明改为每3分钟来检查一次,结果每次来水都没怎么漏
,不需要加水,来得太频繁做的是无用功。几次试验后,
确定每10分钟来检查一次。这个检查时间就称为采样周期。

开始小明用瓢加水,水龙头离水缸有十几米的距离,
经常要跑好几趟才加够水,于是小明又改为用桶加,
一加就是一桶,跑的次数少了,加水的速度也快了,
但好几次将缸给加溢出了,不小心弄湿了几次鞋,小明又动脑筋,
我不用瓢也不用桶,老子用盆,几次下来,发现刚刚好,不用跑太多次,
也不会让水溢出。这个加水工具的大小就称为比例系数。

小明又发现水虽然不会加过量溢出了,有时会高过要求位置比较多
,还是有打湿鞋的危险。他又想了个办法,在水缸上装一个漏斗,
每次加水不直接倒进水缸,而是倒进漏斗让它慢慢加。这样溢出的问题解决了,
但加水的速度又慢了,有时还赶不上漏水的速度。
于是他试着变换不同大小口径的漏斗来控制加水的速度
,最后终于找到了满意的漏斗。漏斗的时间就称为积分时间 。

小明终于喘了一口,但任务的要求突然严了,
水位控制的及时性要求大大提高,一旦水位过低,
必须立即将水加到要求位置,而且不能高出太多,否则不给工钱。
小明又为难了!于是他又开努脑筋,终于让它想到一个办法,常放一盆备用水在旁边,
一发现水位低了,不经过漏斗就是一盆水下去,这样及时性是保证了,但水位有时会高多了。
他又在要求水面位置上面一点将水凿一孔,再接一根管子到下面的备用桶里这样多出的水会从上面的孔里漏出来。
这个水漏出的快慢就称为微分时间。

 

大学时代做机器人时用的PID算法源代码:

#define PID_Uint struct pid_uint
PID_Uint
{
int U_kk;
int ekk;
int ekkk;
int Ur; //限幅输出值,需初始化
int Un; //不灵敏区
//int multiple; //PID系数的放大倍数,用整形数据的情况下,提高PID参数的设置精度   固定为256
int Kp; //比例,从小往大调
int Ti; //积分,从大往小调
int Td; //微分,用巡线板时设为0
int k1; //
int k2;
int k3;
};

/********************************************************************
函 数 名:void Init_PID_uint(PID_uint *p)
功    能:初始化PID参数
说    明:调用本函数之前,应该先对Kp,Ti,Td做设置 ,简化了公式
入口参数:PID单元的参数结构体 地址
返 回 值:无
***********************************************************************/
void Init_PID_uint(PID_Uint *p)
{
p->k1=(p->Kp)+(p->Kp)*1024/(p->Ti)+(p->Kp)*(p->Td)/1024;
p->k2=(p->Kp)+2*(p->Kp)*(p->Td)/1024;
p->k3=(p->Kp)*(p->Td)/1024;
}
/********************************************************************
函 数 名:void reset_Uk(PID_Uint *p)
功    能:初始化U_kk,ekk,ekkk
说    明:在初始化时调用,改变PID参数时有可能需要调用
入口参数:PID单元的参数结构体 地址
返 回 值:无
***********************************************************************/
void reset_Uk(PID_Uint *p)
{
p->U_kk=0;
p->ekk=0;
p->ekkk=0;
}
/********************************************************************
函 数 名:int PID_commen(int set,int jiance,PID_Uint *p)
功    能:通用PID函数
说    明:求任意单个PID的控制量
入口参数:期望值,实测值,PID单元结构体
返 回 值:PID控制量
***********************************************************************/
int PID_common(int set,int jiance,PID_Uint *p)
{
int ek,U_k=0;
ek=jiance-set;
if((ek>(p->Un))||(ek<-(p->Un))) //积分不灵敏区
U_k=(p->U_kk)+(p->k1)*ek-(p->k2)*(p->ekk)+(p->k3)*(p->ekkk);
p->U_kk=U_k;
p->ekkk=p->ekk;
p->ekk=ek;
if(U_k>(p->Ur))                         //限制最大输出量,
U_k=p->Ur;
if(U_k<-(p->Ur))
U_k=-(p->Ur);
return U_k/1024;
}