ROS教程
这是小弟的学习笔记,有错求请拍,多指教,谢谢
一 ROS基础知识
ROS文件系统介绍
1.功能包集stack
ROS软件包集合,像Navigation Stack,属于导航软件包集合,包含了与导航有关的软件包,例如地图软件包,路径规划软件包,TF坐标软件包,move_base移动控制软件包等,一整个stack下载后可以任意使用其中的软件包,每个软件包都实现其中一个或者好几个小功能,多个软件包组成集合实现一个完整的大的功能
http://wiki.ros.org/navigation
2.软件包package
4)清单文件package.xml,包含软件包的相关信息的描述,包括版本 ,开发者信息,各软件包之间的依赖关系
5)src程序源码库,存放编写的cpp或者python源码文件
ROS基本框架
1.节点node
节点是ROS机器人系统里任何操作的单元,可以理解为每一个节点可以实现一个小功能,一个机器人工程就是由多个节点组成的,节点与节点之间可以相互通信,相互协调完成工作,比如人手臂的运动,运动指令从大脑发出,经过肩膀,手肘,手腕,最后再到手指,触感的信息则是反过来传递,每个关节理解成一个节点,它们之间可能是相互传递消息,也可能是一个发送消息,一个接收消息;通常,我们在编程的时候就是编写一个个节点
2.话题topic
话题是ROS里的一个通信方法,topic里包含了消息的名称,类型,内容,节点可以发布或者订阅某个或某几个话题,以此达到传递的目的;话题有两个重要的性质:a.话题的发布频率;b.话题的消息类型
3.发布者和订阅者publisher & subscriber
ROS里的节点node可能是发布者或者是订阅者,甚至两者都兼备,发布者就是发布topic的节点,订阅者就是订阅topic的节点,发布者以一定的消息类型格式在ROS服务器上发布消息,订阅者则根据话题名称在服务器上订阅消息,消息类型在ROSwiki上有详细定义
http://wiki.ros.org/std_msgs
common_msgs 查看各类消息类型
geometry_msgs 运动几何学相关的消息类型,包括速度,加速度等
sensor_msgs 传感器相关的消息类型,包括激光雷达,点云,IMU惯性测量单元,JoySticks遥控手柄,图像等
4.理解ROS的通信流程
- master 节点,管理所有的节点,每个节点都需要先向 master 节点注册, master 节点会让发布者和订阅
者进行匹配;所以每次启动ROS时,都需要先打开master节点 - 发布者和订阅者之间通过话题来通信时,信息不通过 master
- 发布者发布一个话题,订阅者进行订阅
- 流程:
1 )订阅者发送建立链接请求
2 )发布者进行反馈,确认链接
3 )订阅者请求 topic 的数据
4 )发布者发送 topic 数据
创建和编译 ROS 软件包
1.创建软件包
1)创建工作空间
在编写任何ROS程序之前,都应该先建立一个工作空间workspace,因为使用catkin环境,所以一般 上很多教程都会将工作空间命名为catkin_ws,但其实可以任意命名,工作空间就是一个在~/home目录下的文件夹。工作空间下是存放软件包的,所以一般而言,工作空间不需要创建太多,除非某个工程特别庞大,才需要为它独立创建工作空间
创建工作空间目录:
2)创建软件包
软件包一般在工作空间的src文件夹下创建,否在ROS可能无法定位你的软件包,命名要避免与ROS的操作指令重复,不能以数字或者符 开头,并且不允许大写字母
创建软件包命令:
格式:
例子:
- pkg_name是对软件包的命名;
- pkg_depends是软件包的依赖关系,如roscpp,rospy,std_msgs;软件包的依赖关系类似依赖某个源代码或者头文件
- 依赖关系分为一级依赖和间接依赖,一级依赖是我们在创建软件包过程中添加的依赖项,间接依赖是各依赖项之间的关系,
查看一级依赖关系
查看所有的依赖关系
3)删除软件包
软件包删除命令:
再重新编译
2.编写测试代码步骤
1)先进入软件包目录下的src文件夹
3)修改编译配置文件
4)返回工作空间目录,编译代码
3.编写发布者代码
1)简单的发布者代码,发布者代码基本都是这个框架
wiki.ros.org/PublisherSubscriber
4.编写订阅者代码
1)简单的订阅者代码
wiki.ros.org/PublisherSubscriber
5.修改CMakeLists.txt文件
- ctrl+F找到关键字 ## Declare a C++ executable
- 去掉#注释项add_executable(${PROJECT_NAME}_node src/test_pkg_node.cpp),将test_pkg_node.cpp修改成自己所要编译的cpp文件,如果有多个cpp文件需要编译(一个软件包内可能存在多个节点),则多添加add_executable语句
- 找到关键字target_link_libraries,将注释去掉,如果有特别需要添加的依赖库,可以在这里添加,一般的编译过程不需要,因为ROS里已经揉合了很多第三方库,例如OpenCV
- 每一个软件包都要配置自己的CMakeLists.txt文件
6.运行节点
1)先运行master节点
2)运行节点
格式:
例子:
3)如果不记得节点名或者软件包名称,可以按Tab键补全,但一定要记得先source正确的环境变量
7.编写launch文件(可选)
1)launch文件是xml格式的脚本,我们把需要启动的节点信息写进去,launch脚本会自动帮我们运行需要的节点,而不需要手动逐个开启
2)launch脚本开启节点的顺序是不确定的,这也是ROS节点编写的一个理念,尽可能让节点之间的耦合性降低,节点尽可能地独立完成某项工作
3)进入软件包文件夹目录
4)创建launch文件夹
5)进入launch文件夹
6)新建launch文件
7)编写launch文件
8)注意
- launch 文件中,启动节点的时候给 node 重新指定了名称,会覆盖掉在源码文件中通过 ros::init 赋予节点的名称,所以在使用launch启动时要留意被修改的节点名
- 如果 output 没有定义到 screen ,节点的输出信息会在 log 日志文件下保存,查看方式:
拓展:jason来自星星的博客教程
8.通过launch文件启动节点
1)
格式:
例子:
ROS基础工具
1.rqt_graph
1)通过直观的图谱来查看当前正在运行的节点之间的关系
2)
Twist&/cmd_vel
3.rviz
1)rviz是一款2D&3D的数据可视化软件,提供了丰富的ROS接口,可以建立机器人运动模型,激光雷达地图等,并且进行仿真验证
2)
4.rqt_logger_level
1)ROS的一个log日志查看器,用于检查每个节点的日志信息,比如说什么时候哪个节点作出了更改,都会记录在log日志下
2)
6.ROS文件系统工具
1)rospack 获取软件包相关信息,类似一个 find 的命令,只需要知道软件包的名称即可
- rospack help 查看 rospack 相关功能的命令
- rospack list 列出当前系统中安装了的软件包名称和路径信息
- rospack list-names 只查看软件包名称
- rospack list-names | wc -l 统计有多少个软件包,| 是一个符 ,表示上一个命令的结果是下一个命令的输入
- rospack find [package_name] 查询软件包的路径信息
2)roscd 软件包名
直接切换工作目录到某个软件包中
3)rosls 软件包名
直接罗列该软件包的目录结构
5)roscp 软件包名 需要复制的文件名
直接把某个软件包下的文件复制到当前的命令行目录下
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!