本文章属于个人学习笔记,希望通过文章记录,规范整理学习内容,方便未来知识整理和分享。如果有错误的地方,还请指出,感谢!
##未完成的笔记待补充
感谢ROS机器人编程实践的作者及译者的工作和分享! 京东购买传送门 支持正版书籍
ROS 的几点特性使得它的应用范围十分广,其中,因为ROS支持的硬件在市场上能找到的机器人类型基本都能适配,ROS的第三方库和社区中的开源库也使得它的能力增强,这也是为什么其他的机器人平台不能超越他的原因。
ROS的文档WIKI的文档类型的繁多,使得我们能够轻松的查找。
http://answers.ros.org社区讨论链接。
地址 https://github.com/osrf/rosbook 这个链接去查看示例代码的源码。Apache 2.0 为证书允许,其他用户进行代码重用。
安装部分的代码
ROS最早应用于PR2移动机器人上
由于ROS本身的分布式的特点,使得他的组成是无数多的单个节点,单个节点之间通过消息进行通信,虽然通信的细节比较复杂,但是在ROS图中只是用边来表示,多节点的组合方式也使得ROS实现了松耦合的好处,这样单一程序的开发过程来的比整个过程更加的迅速和简单,单个节点可以在运行时进行销毁和替换,所以这种特点使得ROS自身的结构来的非常的容易整合,也就是松耦合。整个系统建立在后台的网络中,系统的交互和设计上鼓励调试和实验。
节点间通信的细节, 节点间的通信依靠一个主节点,主节点可以为其他节点分配,告知订阅者和发布者,其他的节点的信息。
具体信息,角色就是中间的路由器的概念,虽然不是路由器。消息在主节点进行汇总,然后再分发。
ROS 的 架构 介于 典型的 客户 端/ 服务器 系统 和 完全 分布式 系统 之间, 因为 有一个 处于 中央 角色 的 roscore 在 为 点 对 点 消息 流 提供 命名 服务。
当 一个 ROS 节点 启动 时, 该 进程 假设 存在 一个 名为 ROS_ MASTER_ URI 的 环境 变量。 这个 变量 包含 了 一个 格式 为 http:// hostname: 11311/ 的 字符串, 表示 roscore 有一个 运行 的 实例 可以 通过 主机 hostname 的 11311 端口 进行 访问。
端口号的来历,11311 端口 之所以 被选为 roscore 的 默认 端口 是因为 该 端口 号 是个 回文 素数, 并且 在 大约 2007 年的 ROS 早期 不被 别的 流行 应用 所 使用, 因此 没有 特殊性。 任意 用户 端口( 1025 ~ 65535) 都可以 选用。 在 roscore 启动 命令 和 ROS_ MASTER_ URI 环境 变量 中指 定 不同 的 端口 号 即可 以在 同一个 网络 中 运行 多个 ROS。因此在同一个网络下,我们可以通过设置端口号来启动多个ROS的核心。
关于catkin的内容补充说明
工作区的建立和初始化
这里一定记住初始化一个工作空间的时候,使用catkin_init_workspace,使用catkin_make的命令进行 工作区的内部文件的建立。
使用命令后创建了两个文件夹,build文件夹是C++使用,python将会忽略这个。src文件将要包含所有的实现代码,包括调用这些实现代码的代码,相当于在Java的 src文件,这样ROS可以根据你创建的工作空间找到src中的程序包在进行编译。
记得给你想要运行的工作空间进行配置,在.bashrc文件中配置好后,每次启动终端都可以给你配置好环境,不用每次使用都source这个启动文件, 在MIRO中我们已经在开始进行src文件的环境配置,这样ROS可以找到这些工作空间然后访问其中的src文件中的软件包。
这个命令可以创建一个新的软件包,然后可以在命令后加上你想要的依赖。其实主要是依赖,在创建的时候尽量将所有的依赖都添加进去。
ROS 提供 了 一个 命令行 程序 rosrun 来 寻找 程序 包 中的 可执行 程序 并且 向这 个 程序 传递 任何 参数。 语法 如下:
这条命令用来展示ROS的通信图,logger是用来将消息写入硬盘,并且会绑定talker,进行备份的意思,这样之后可以复原实验,猜想。
这是最早的斯坦福STAIR机器人的ROS通信图,见之前的大图,用来说明普遍的结构都是稀疏的,
如果是星形的,就应该重新审核下,将结构进行拆分。
采用命名空间区分的方法,防止命名冲突
这种重映射的方法可以达到代码重用的目的
使用双下划线加ns __ns进行重映射,如图中
##roslaunch
注意点:roslaunch可以自动创建一个roscore的实例,但是我们都是建议另外
开辟一个终端进行roscore的启动,这样终止roslaunch的程序时候,不会影响到roscore
位姿,位置和朝向
Transform
第三章
发布话题
订阅话题
在订阅话题的节点中最后需要使用rospy.spin()进行程序交付给ROS运行。
锁存话题
ROS的基本消息类型中容易出现在不同的编程的语言下,消息类型范围冲突的问题
激光测距仪传感器类型,只要知道消息类型,不需要知道消息的细节既可以用
自定义的消息类型
发布者和订阅者可以同时出现在一个节点中进行协同工作
这里面的回调函数中,我们调用了发布者进行消息发布,因为我们这里实现的功能就是将受到的消息,加倍之后发出去,所以当有新的信息收到时候才会发出。
定义服务
这里服务机制中没有设置超时机制,所以客户端会在服务端出现问题的时候阻塞,一直占用资源进行请求,这是非常不合理的。
动作机制和服务机制的不同在于,服务机制是同步的,而动作机制是异步的。
工作的定义和服务定义文件其实类似,但是我没有理解的是为啥这里的定义都是文字,没有类似服务定义中的数据类型等参数变量类型。
将动作文件定义好后,我们应该使用catkin_make 创建动作的实际的代码和类定义,这些操作都是通过ROS底层的编译机制完成的,
CMakeList中都是包含所有将要被ROS系统编译的包名,这样ROS底层知道去找哪些包进行编译。接下来进行add_action_file所有的你定义的文件的声明,告诉系统去找哪些将要执行的文件进行关联
如下所示,在消息的依赖中定义好你需要发送的消息的类型,这一点和服务中是一样的添加依赖就能告诉系统之后将会用到哪些消息类型,毕竟节点之间主要就是通过通信进行数据的传输的。那么,一定要告诉系统将要用到的信息类型,这样才符合常理的通信原则。
catkin工作区的顶层目录才是catkin_make命令执行的地方,所以要记住,当你把所有的基本配置都搞好后,应该切换到你的工作区,工作空间的顶层目录,然后执行catkin_make的命令
实现工作服务器的样例代码
这里提到一个自动启动功能的关闭问题,因为动作服务器应当默认关闭自动启动的功能,不然可能造成资源竞争问题,资源竞争问题中就有资源死锁的问题,
这里体现了一点,记得给动作服务器进行False赋值给ROS动作服务器,这是之前考虑失误的问题,默认不是关闭的状态。 我以为默认是关闭的,所以这里会显示的在参数列表中进行false赋值给关闭这些。
动作服务器机制的内容比较多,相对之前两种机制比较完善,既能实现异步操作,又可以实现双向的信息的交互