1>分布式系统:
ROS最主要的构成是节点(node),每一个节点可以看做为一个单独的处理单元.它可以接受外部的消息(这个步骤叫订阅,subscribe),也可以向外部发出自己的消息(这个步骤叫发布,publish);
服务与消息机制,是节点功能实现的一个典型方式.也就是接收外界的消息消息,并完成对该消息的响应.经典的应用举例:一个提供加法运算服务的节点,定时查询消息,一旦接收到消息(两个数值),立即返回加法运算的结果(两数之和).
节点是一个单独的处理单元.这样会大大简化程序设计和代码量.每个节点在代码层看起来就是一个独立的执行文件,有一个main()函数入口.
2>TCP通讯机制:
节点之间的通讯是通过类似TCP通讯机制的通讯底层所实现的.所以整个ROS上的节点是否跑在同一运算平台上并不重要(不考虑运算能力).只要这些节点之间有高效的通讯通道,便可以让节点相对运算平台透明.这也是分布式系统的特点.
但节点之间通讯的管理需要一个管理员(ros中被称为roscore节点).当节点分布在不同的计算机上时,需要指明master.通常master节点一般运行在机器人端,交互和监控的节点一般运行在远程PC端.这样做是为了避免远程PC端的关机不影响机器人正常工作.
3>Tf:
Tf模块是机器人运动功能的核心支持模块.它的全称为transform,主要用于坐标转换./tf消息(/tftopic)可以被多个节点订阅和发布.需要用到坐标转换的地方非常多.例如,SLAM建立地图的时候,需要实时处理好map, odom, 机器人底盘,机器人传感器之间的位置变换关系.机械手臂运动时,需要知道机器臂相对其他部分的姿态和位置.
4>仿真/调试工具:
ROS学习另外一个重要方面就要是熟练使用仿真和调试工具.
主要用到的仿真工具有:gazebo,
调试工具则更加多种多样:rviz, rqt_****
5>开源代码
学习机器人,离不开开源代码.因为机器人涉及到的知识面太广,个人几乎不可能在每个方面都达到专家级别的水准.此外,就算能力够,工作量也不够个人来承担.所以借力开源社区的成果是非常有必要的.
ROS所有的stack和pkg都提供了源代码.Stack和pkg是功能包,需要开发某项功能的时候,应该优先考虑现有的软件中是否有.当我们开发功能包的时候,应该优先考虑使用已有的数据结构和接口.
6>多种开发语言/脚本
每一种语言都有自己的优缺点.机器人开发设计的领域较广,所以理所当然地需要使用多种程序语言或者脚本.通常会用到如下语言or脚本,用于不同的功能:
批量运行ros节点会使用launch脚本
Roslaunch *.launch
开发 node 通常会用到python语言和c++语言
Python *.py
Src *.cpp *.cxx *.c *.h *hpp
配置launch脚本的参数通常使用yaml脚本
Config *.yaml
机器人仿真和机器人可视化通常会用到urdf和xacro脚本
Urdf *.urdf
Xacro *.xacro
Stack和pkg的编译需要进行工程配置,通常会使用到cmake和xml文件
Cmake
xml