由浅到深理解ROS(1)
2024-09-06 23:11:40
ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率。ROS能够提供类似传统操作系统的诸多功能,如硬件抽象、底层设备控制、常用功能实现、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编译、编辑代码以及在多个计算机之间运行程序完成分布式计算。结合笔者对ROS的理解,想与大家一起讨论,共同把ROS理解的更准确,一起进步。
对ROS的误解:
1.ROS不是一种编程语言。实际上,ROS的主要代码由C++语言编写,客户端库的编写还可以使用Python、Java和Lisp等其他多种语言编写。据笔者开发经验而谈,ROS只不过用c++基本语法进行了封装,制定了统一的标准,比如导航所用的速度和角度,ROS封装成了自己的结构体叫msg,如果你装了ROS,你可以用命令rosmsg show geometry_msg/Twist 查看到格式:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
可以看到都是c++基本语法,只是提供一个通用的数据类型以便促进整个系统的互操作性。geometry_msgs是存放结构体(或组合成的新类型比较准确)的文件夹的名字(ROS叫包package),结构体(新类型)的名字Twist(ROS叫消息msg),这个包下还有很多类型http://wiki.ros.org/geometry_msgs
2.ROS不仅是一个函数库(比如在ROS的导航中全局路径规划(global planner)首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。navfn通过Dijkstra最优路径的算法,计costmap上的最小花费路径,作为机器人的全局路线。如果你想做global planner,直接调用这个包就行了),除包含客户(Client Libraries)外还包含一个中心服务器(Central Server)、一系列命令行工具、图形化界面工具以及编译环境。
3.ROS不是集成开发环境。虽然ROS没有规定软件开发环境,但几乎所有的主流IDE8都可用于基于ROS的软件开发。此外,我们还可以根据个人喜好,使用普通的文本编辑器和命令行来完成相应的开发,而无需任何IDE。
4.ROS也不是一个完全意义上的操作系统,是一个软件平台能够提供类似传统操作系统的诸多功能而已,Linux ubuntu操作系统对它支持良好,我认为最初是基于Linux ubuntu操作系开发的,选择ubuntu其中一个重要的原因我认为ubuntu有绚丽的图形化界面。虽然编译ROS程序时用rosbuild或catkin_make,本质上还是基于cmake的,只是写了个shell脚本把cmake的命令集合一下,运行程序虽然用rosrun命令,本质和运行./bin(编译生成的二进制文件)一样,它也只不过是一个shell脚本,能够理解ROS的文件组织结构,知道到哪里能找到与给定包名称对应的可执行文件。一旦它找到你要的程序,rosrun就会正常启动节点。举个例子就好理解了:你要启动turtlesim_node节点(负责创建turtlesim窗口和模拟海龟的运动)可以运行 rosrun turtlesim turtlesim_node ,但是你完全可以这么启动:/opt/ros/indigo/lib/turtlesim/turtlesim_node
发行版本(Distributions):
ROS的主要版本称为发行版,其版本号以顺序字母作为版本名的首字母来命名(这种方式与其他大型工程的版本命名方式类似,如Ubuntu、Android)。ROS的版本包括hydro、groovy、feurte、electric、diamondback、C Turtle、box turtle、indigo、jade、kinetic。
最新文章
- BAS/BRAS/RADIUS简介
- 【原】Python 用例:打印一个 Header Box
- hihocoder #1388 : Periodic Signal NTT&;FFT
- ArrayList如何实现线程安全
- What is Requirement ?
- java如何去调用C++的方法详解
- JSON字符串与java对象的转换
- Kruskal
- Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址
- hdu 1094 A+B for Input-Output Practice (VI)
- $(document).ready() 、 $('#id').load() 、window.onload 的区别
- 如何查看sql server端口号
- 机器学习之三:logistic回归(最优化)
- 转:绝对干货--WordPress自定义查询wp_query所有参数详细注释
- Dynamics 365中使用Web API将查找字段的值设置为空值的方法。
- ASCII码表(常用)
- Node的简介
- 生存模型(Survival Model)介绍
- 世界地图和主要国家的 JSON 文件
- Navicat连接Oracle 报 ORA-12737 set CHS16GBK错误
热门文章
- HTML 中的 dl(dt,dd)、ul(li)、ol(li)
- 命令行解析函数:getopt/getopt_long
- XCode下的iOS单元测试
- VUE -- 用组件上传文件和用xmlrequest上传
- sharepoint2010新建网站与网站集
- linux:ping不通www.baidu.com
- Win7提示1970-01-01 000000 is not a valid data怎么办.
- Vue笔记五
- Linux——Virtualenv和pip小探
- 解决java.math.BigDecimal divide方法运算结果为无限小数问题