学习ROS可能遇到各种问题,以下是三个获取真知的地方:
http://wiki.ros.org/cn/ROS/StartGuide 右上角的搜索
http://answers.ros.org 和 http://answers.ros.org/questions/问答网
http://code.ros.org/lurker/list/ros-users.html 邮件列表归档(但是打不开)
开始学习教程
http://wiki.ros.org/cn/ROS/Tutorials
按照教程开始学习,内容比较丰富。
ROS文件系统
你也许已经注意到了ROS命令工具的的命名方式:
rospack = ros + pack(age)
roscd = ros + cd
rosls = ros + ls
这种命名方式在许多ROS命令工具中都会用到。
创建ROS程序包
catkin_create_pkg
rospack
编译ROS程序包
catkin_make
理解 ROS节点
Nodes 节点:一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages 消息:消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics 话题:节点可以发布消息到话题,也可以订阅话题以接收消息。
Master 节点:管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout:ROS中相当于stdout/stderr。
roscore:主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。
roscore
rosnode list
rosnode info /rosout
rosrun
rosnode ping my_turtle
linux命令补充学习
chown -R 将指定文件的拥有者改为指定的用户或组
理解ROS话题
rqt_graph 能够创建一个显示当前系统运行情况的动态图形。
rosmsg show 查看消息的详细情况
rostopic echo 可以显示在某个话题上发布的数据。
rostoppic type 命令用来查看所发布话题的消息类型。
rostopic pub 可以把数据发布到当前某个正在广播的话题上。
rostopic hz命令可以用来查看数据发布的频率
rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形
理解ROS服务和参数
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
使用 rqt_console 和 roslaunch
rqt_console和rqt_logger_level
rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
roslaunch 用来创建节点,并设置节点之间的关联。
使用rosed编辑ROS中的文件
rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
总结一下到目前为止我们接触过的一些命令:
rospack = ros+pack(age) : provides information related to ROS packages
rosstack = ros+stack : provides information related to ROS stacks
roscd = ros+cd : changes directory to a ROS package or stack
rosls = ros+ls : lists files in a ROS package
roscp = ros+cp : copies files from/to a ROS package
rosmsg = ros+msg : provides information related to ROS message definitions
rossrv = ros+srv : provides information related to ROS service definitions
rosmake = ros+make : makes (compiles) a ROS package
编写简单的消息发布器和订阅器 (C++)
进程之间通过什么样的方式通信
验证一下是否同步
根据demo发现,listener回调与listener的main函数是同一个线程。
listener与talker属于异步调用。
编写简单的Service和Client (C++)
实现方式
验证是否同步
根据demo发现,service与client属于同步调用。service与client内均只有一个线程。
tf组件(重要)
tf简单的讲,是一个进行坐标转换的组件。
例如他可以解决以下三类问题
Where was the head frame relative to the world frame, 5 seconds ago?
5秒钟以前,相对世界坐标系,头坐标系在哪呢?
What is the pose of the object in my gripper relative to my base?
机器人的钳子里的某个物体相对于基座的姿态是什么呢?
What is the current pose of the base frame in the map frame?
基座在整个地图的哪个位置呢?
最常用坐标系
最常用的就是map,odom,base_link,base_laser坐标系,这也是开始接触gmapping的一些坐标系。
map:地图坐标系,顾名思义,一般设该坐标系为固定坐标系(fixed frame),一般与机器人所在的世界坐标系一致。
base_link:机器人本体坐标系,与机器人中心重合,当然有些机器人(PR 2)是base_footprint,其实是一个意思。turtlebot两个都有。
odom:里程计坐标系,这里要区分开odom topic,这是两个概念,一个是坐标系,一个是根据编码器(或者视觉等)计算的里程计。但是两者也有关系,odom topic 转化得位姿矩阵是odom–>base_link的tf关系。这时可有会有疑问,odom和map坐标系是不是重合的?(这也是我写这个博客解决的主要问题)可以很肯定的告诉你,机器人运动开始是重合的。但是,随着时间的推移是不重合的,而出现的偏差就是里程计的累积误差。那map–>odom的tf怎么得到?就是在一些校正传感器合作校正的package比如gmapping会给出一个位置估计(localization),这可以得到map–>base_link的tf,所以估计位置和里程计位置的偏差也就是odom与map的坐标系偏差。所以,如果你的odom计算没有错误,那么map–>odom的tf就是0.
不好理解
base_laser:激光雷达的坐标系,与激光雷达的安装点有关,其与base_link的tf为固定的。
ROS动作(actionlib)
在大型的ROS系统中,经常会遇到一个task要求另一个task完成一个动作,并且收到回掉。我们可以通过service来完成。
然而,在某些情况下,如果服务需要很长的时间来执行,用户可能希望在执行过程中取消请求的能力,或在请求的过程中获得周期性反馈。的actionlib包提供的工具来创建,执行长期目标可以抢占服务器。它还提供了一个客户端接口,以便向服务器发送请求。
为了使客户端和服务器进行通信,我们需要定义他们通信的几个消息。这是一个动作规范。这定义了客户端和服务器进行通信的目标、反馈和结果消息的定义。