距离发布上一篇ROS的博客已经过去两年了,才发现原来自己已经这么久可没有写过关于ROS的文章,想来很是惭愧。这两年时间,自己怀着程序员的梦想,研究过RTOS,探索过Linux,编写过Android应用,玩过web站点,但是回想起来,也并没有比ROS让我更加记忆深刻。两年时间,我也从来没有离开过ROS,使用ROS做过一些项目,也对ROS有了更加深刻的认识。这三天的假期时间,我认真拜读了国内开发者近年来写的许多关于ROS的技术博客,也浏览了最新出版的几本中英文书籍,猛然间发现ROS的发展确实迅猛,国内的学习和研究环境也得到了巨大改善。

三年多以前,我第一次接触ROS,当时是一个实验室师兄在学术会议上听说ROS,让我和另外一个同学研究一下。当时还年少的我是拒绝的,但是被逼无奈也还是要看一下这个东西。当时ROS的学习环境相当恶略,几乎只有官网的wiki(也没有现在完善),学习完基础教程之后,我和那个同学尝试了小海龟的例子,然后就茫然无措了。这是什么鬼?我是要做机器人,又不是要做海龟!那些什么节点、什么功能包、什么命令好复杂,完全不知道怎么应用到机器人上!于是本来心里就抗拒的我们都默默选择了放弃。。。


       没过多久,师兄要检查我们的研究成果,我们勉强介绍了一下教程和小海龟的例子,然后师兄说确实很有前景,让我们克服困难,继续研究。。。当时心里一万头草泥马。。。。这完全搞不明白的东西,哪里有前景了???另外一个同学还是倔强的选择了放弃,而我则需要独自承担这一切。。。
       技术研究的道路总是寂寞的,既然无法抗拒,还不如尽情享受。于是,我开始了一段疯狂的ROS学习之旅。既然学习资料少,那创造资料也要上!那段时间,我在google上搜索所有包含ros关键字的网页(baidu那个时候只能搜到ROS是一个什么鬼路由器的系统),终于找到了两个针对部分wiki教程翻译的博客和一个提到ROS的机器人网站,虽然并没有什么实际帮助,但是已经让我倍感欣慰了,至少看到有国内的开发者也在关注ROS。后来,我发现一个德国人在网上提到过用ROS做过一些事情,我千辛万苦找到了他的邮箱并给他发了邮件,然后就没有然后了。。。再后来,我注意到中科大已经在用ROS做项目了,我找到了他们的网页,给他们不断的发邮件请教我该如何学习ROS,不过回复草草,总结一下就是六个字:学教程,看源码! 我勒个去,这句话虽然是真理,但是对于一个新手来说,实在是太残忍了。
        靠人不如靠自己,最终还是需要自己安下心来探索。于是,我研究了多次基础教程之后,开始按照例程写一些自己的代码,尝试去理解节点等基本概念,然后学习如何使用ROS里边的Twist消息,如何根据自己的需求创建消息,如何使用URDF创建模型,如何在Rviz中显示图像等等。由于我们使用的机器人是基于嵌入式系统的,所以在这段学习的时间里,我给ROS官方发邮件,问他们怎么在ARM上安装或者编译ROS(当时并没有提供在ARM上编译好的软件包),当然又是没有回复。。于是,我自己花了一个月的时间,在ARM上完成了ROS核心库的编译,由于很多功能包编译不了,所以我只能在上边自己写机器人的所有驱动和节点,虽然很痛苦,很漫长,但是也让我逐渐熟悉了ROS的使用方法。

       偶然的机会,我找到一个ROS的QQ交流群,里边的人数只有两位数,而且很多人是在国外实验室做研究的,不过这也为我提供了非常好的交流机会。突然有一天,群里说国外出了一本ROS by example的书,希望想看的同志们凑钱去买一本,我义无反顾的参加了,并且很快拿到了pdf版电子书。那个时候,这本书对于我来说是如获至宝一般。我很快按照书上的内容进行了尝试,学到了更多关于机器人SLAM、自主导航、图像处理等方面的知识,然后我和实验室的小伙伴也将这些功能想办法移植到了我们的机器人上。终于看到自己做的机器人跑起来了,那种感觉是一种征服未知的骄傲!此时,已经距离我初次接触ROS过去了将近一年的时间。
        我们拿着自己做的机器人去参加了比赛,并且获得了一等奖。在ROS学习的路上,我从抗拒到接受,从未知到熟悉,经历了前所未有的折磨,也收获了前所未有的喜悦。在这过程中,我也常常在思考,ROS确实有前景,但是国内还鲜有人知,就算有人知道,会不会也被困难所吓倒。既然我经历过,那何不总结一下,让其他人少走弯路。于是,我整理了自己学习过程中的一些资料和心得,在CSDN上以博客的形式发表,最终就是ROS探索总结系列的博文。需要声明的是,我并不是大神,我做的东西和总结的内容,并不算高深,我只是比很多人更早迈出了第一步。
        这么长时间过去了,回头再看ROS,ROS到底是什么,ROS到底为我们提供了什么?在我看来,ROS只是一个软件,虽然为我们提供了极大的便利,但是我们也没有必要过于神话它。用一句话来说,机器人做的好,不一定是因为你用了ROS,机器人做不好,也不一定是因为你没用ROS。假如我们是诗人,那ROS就是一本字典,里边为我们提供了很多美丽的字符,当然也有很多遣词造句,但是你写诗总不能照搬原句吧,能不能写出好诗,还是要看诗人的才华。ROS里边有众多的软件功能包,但是把这些功能包照搬到我们的机器人之上,并不是使用ROS开发的目的(当然,这是学习的过程)。如果我们都这样做,那大家的机器人都是一样的了,机器人的核心竞争力,还是他所实现的功能和应用的场景,这也是我们作为是“诗人”需要做的,ROS只是教给我们如何去快速成为这样一个“诗人”。
         ROS的另一大精神就是分享,这也是开源软件的精神,所以我们才可以看到如此众多软件功能包的源码,并且快速完成二次开发。所以为了促进ROS在国内的发展,我们是不是也应该多分享一些自己的创意和想法,让更多人能够快速上手ROS,不要因为这种工具拖累我们专注于机器人应用的研究。这就是我一直以来的想法,而且我已经看到很多人这样做了,希望更多人可以通过多种方式进行分享,无论是初始级的还是高级的,只要能够帮助需要的人,就是一件最快乐的事情。
      
注:
        ROS探索总结系列会继续更新,我会把之前做的项目细节在博客中和大家分享,后续可能还会分享更多ROS相关的内容,欢迎机器人爱好者们提出各种建议和意见。同时感谢ExBot易科的小伙伴对本博客的支持!

----------------------------------------------------------------

欢迎大家转载我的文章。

转载请注明:转自古-月

http://blog.csdn.net/hcx25909

欢迎继续关注我的博客

关于ROS学习的一些反思的更多相关文章

  1. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)

    ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) 时隔1年,再回来总结这个问题,因为它是ros+python开发中,太常用的一个操作,需要 ...

  2. ROS学习手记 - 8 编写ROS的Publisher and Subscriber

    上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...

  3. ROS学习(四)—— 创建ROS Package

    一.caktin Package的组成 1.必须含有 package.xml文件,提供有关程序包的元信息 2.必须含有一个catkin版本的 CmakeLists.txt文件,如果是一个catkin元 ...

  4. ROS学习网址【原创】

    ROS学习网址 http://www.ros.org/ http://www.ros.org/news/book/ http://wiki.ros.org/ http://blog.exbot.net ...

  5. ROS学习笔记七:在ROS中使用USB摄像头

    下面是一些USB摄像头的驱动(大多数摄像头都支持uvc标准): 1 使用软件库里的uvc-camera功能包 1.1 检查摄像头 lsusb ----------------------------- ...

  6. ROS学习(一)—— 环境搭建

    一.配置Ubuntu软件仓库且选择ROS正确版本 二.添加source.list sudo sh -c 'echo "deb http://packages.ros.org/ros/ubun ...

  7. ROS学习记录(二)————使用smartcar进行仿真(用.xacro文件来运行rviz)

    我发现一个学习ROS系统的好网站: 创客智造http://www.ncnynl.com/ 这里面关于ROS的各个方面都有很详细的介绍. 这周,不,上周我对整个ROS是绝望的,我用一个一个下午的时间在敲 ...

  8. ROS学习记录(一)————创建简单的机器人模型smartcar

    这是我在古月居上找的(http://www.guyuehome.com/243),但直接运行的话,没办法跑起来,我也是查了好多博客和日志,才实现最后的功能的,所以,记录下来,以备后用吧,也欢迎其他和我 ...

  9. ROS学习笔记

    创建ros工作环境: mkdir -p ~/catkin_ws/src //建立项目目录,同时生成src文件夹 cd ~/catkin_ws/ //进入项目目录 catkin_make //编译项目, ...

随机推荐

  1. 重载运算符“ <<” 和“>>” 运算符

    :" <<  "   "  >>  " 的重载作为友元函数重载,有两种方法:1,把变量作为public,就可以不用友元声明:2,先友元声 ...

  2. ●BZOJ 2149 拆迁队

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题解: 斜率优化DP,栈维护凸包,LIS,分治(我也不晓得是不是CDQ分治...) 一 ...

  3. CentOS7.4 源码安装MySQL8.0

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...

  4. 使设备I/O的核心模块工作,有哪两种方式?

    设备处理进程方式.文件操作方式.

  5. Delphi Inputbox,InputQuery用法

    Delphi :InputQuery,InputBox用法及区别 function InputQuery(const ACaption, APrompt: string; var Value: str ...

  6. PSR-4 自动加载器

    div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,cod ...

  7. Chrome的First Paint

    前言 First paint 直译过来的意思就是浏览器第一次渲染(paint),在First paint之前是白屏,在这个时间点之后用户就能看到(部分)页面内容. 所以研究这个First Paint的 ...

  8. [ Java学习基础 ] Java的抽象类与接口

    一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...

  9. sqlserver 判断字段是否为空字符串或者null

    isnull(f.mzm,'')<>'' 不为null且不为‘’ not(f.mzm is null) 不为null

  10. combobox数据绑定

    jquery easyui datagrid 可编辑行 combobox数据绑定问题 将带有参数的url地址赋值给变量,然后将变量赋值给url <script type="text/j ...