ROS学习笔记(一)—— 基础概览

1. ros 简介

1.1 catkin工作空间与编译系统

文件列表查看工具 tree
shell sudo apt install tree
tree# 显示当前文件夹树状图 tree
tree -L 1 # 显示一级目录

工作空间:存放工程开发相关文件的文件夹。

  • 源文件空间:src 文件夹,放置功能包。
  • 编译空间:build 文件夹,c++编译过程中产生的中间文件。基本不用关心。
  • 开发空间:devel 文件夹,保存编译后生成的可执行文件。
  • 安装空间:用 install 指令安装成功的包的放置位置。
    catkin工作空间与编译系统
  • 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
  • 编译
cd ~/catkin_ws  # 回到工作空间根目录
catkin_make 
source ~/catkin_ws/devel/setup.bash  # 设置环境变量,使系统可以使用这个工作空间的功能包

1.2 功能包 package

package:ros 软件的基本组成形式,catkin 编译的基本单元,一个 package 包含多个可执行文件(节点)。catkin 逐个编译 package。

  • 创建功能包
cd ~/catkin_ws/src
catkin_create_pkg pkg_name pkg_depends # 创建一个 pkg
  • 编译功能包
cd ~/catkin_ws  # 回到工作空间根目录
catkin_make 
source ~/catkin_ws/devel/setup.bash  

注意:必须回到工作空间根目录才能运行catkin_make命令。
如果要编译单个功能包,可用如下命令:

catkin_make --pkg pkg_name

package基本结构 必须包含 CMakeList.txt,package.xml文件, 还包括 节点源码(include、src,scripts)、启动(launch)和配置文件(config)、自定义数据结构(msg,srv)等。
在这里插入图片描述

1.2.1 CMakeList.txt

CMakeList.txt 规定 catkin 的编译规则,如源文件、依赖项目标文件。

CMakeList.txt文件

1.2.2 package.xml

package.xml 定义 package 的属性,如:包名,作者、版本号、依赖项等。一般只需要更改 build_depend 和 run_depend 项。
package.xml

1.2.3 package 可执行源代码文件

scripts 文件夹放脚本文件,如 shell文件(*.sh)和 python 文件(*.py)。
include 文件夹放 c++的头文件(*.h)。
src文件夹 放 c++的源文件(*.cpp)有时候 src也会放 python 文件。

1.2.4 自定义通讯格式文件

消息 msg (*.msg)
服务 srv (*.srv)
动作 action (*.action)

1.2.5 启动与配置文件

launch (*.launch)
config (*.yaml)

1.3 package 的常用指令

package 常用指令

rospack find package_name # 查找某个 pkg 的地址
rospack list # 列出本地所有的 pkg
roscd package_name # 跳转到某个 pkg 路径下
rosls package_name # 列举出某个 pkg 下的文件信息
rosed package_name file_name # 编辑 pkg 中的文件
rosdep install pkg_name # 安装某个 pkg 所需的依赖

1.4 metapackage

一个虚包,是多个 package 功能包的集合,以前叫 stack。
常用 metapackage

1.5. ros 通信架构

松耦合的分布式通信架构。

1.5.1 master 节点管理器 —— 控制中心

ros 中所有节点的管理者。

  • 为节点提供命名和注册服务。在 master 注册了的节点,相互之间才能通信。
  • 跟踪和记录话题/服务通信,辅助节点相互查找、建立连接。
  • 提供参数服务器,节点使用此服务器存储和检索运行时的参数。

通俗的解释就是那么,这个master负责抄名单、给人指路,顺带记录点个人隐私。一旦master被启动,ROS的网络中就有了一位在背后默默抄名单的人。比如,节点A启动了,master就在小本本上记下A的名字以及它要干什么,节点B也是一样,这时候,A要订阅一个话题,就问master,谁在发布这个话题?master指了指B说,就是它。这时A找到了B,话题就联系上了,master也就完成了一次指路。

如果Master节点不慎关闭或宕机,已经启动的节点和建立的话题安然无恙,但后续新节点和新话题无法建立连接。by the way, ROS2.0 取消了 master 节点。

启动ros master命令: roscore。其实执行 roscore 会启动三个工具:

  • ros Master:管理系统中的所有节点
  • Parameter Server:管理系统中各参数配置的键值对数据
  • rosout 节点:收集其他节点的调试信息。

1.5.2 node 节点——执行单元

  • 执行具体任务的进程,package 里可独立运行的可执行文件(c++的 .exe 文件,python 的.py 文件)。
  • 不同节点可以使用不同的编程语言,可分布式运行在不同主机上。
  • 节点在系统中的名称必须是唯一的。
    启动 master 之后就可以启动 node 了。 常用指令
 rosrun pkg_name node_name     # 启动节点
 rosnode # 查看 rosnode 命令帮助信息
 rosnode list   # 列出当前运行的 node 
 rosnode info node_name  # 显示某个 node 的详细信息
 rosnode kill node_name   # 结束运行

1.5.3 roslaunch

启动 master 和多个 node:roslaunch pkg_name file_name.launch
launch文件
注:通常把机器人启动的包名命名为 robot_name_bringup.

一个简单的 launch文件示例:

<launch>
	<node pkg="turtlesim" type="turtlesim_node" name="sim1"/>
	<node pkg="turtlesim" type="turtlesim_node" name="sim2"/>
</launch>

node 节点属性
pkg :节点所在的功能包名称
type:节点的可执行文件名称
name:节点运行时的名称

2. ros 通信方式

2.1. topic 与 Message

话题 topic ,异步通信方式,node 之间通过 publisher/subscriber 模式通信,特点:

  1. 异步通信:publisher 只管发布消息,无需等待 subscribers 反馈消息。
  2. 多对多,可以多个节点发布同一 topic,也可以多个节点订阅同一 topic。

topic 通信机制

rostopic 的常用命令

 rostopic list   # 列出当前所有的 topic 
 rostopic info topic_name  # 显示某个 topic 的属性信息
 rostopic echo topic_name  # 显示 topic 的内容
 rostopic pub -r 10 topic_name ... # 以每秒十次的频率向某个 topic 发布内容

Message,topic传输的数据的数据类型(数据结构),通常定义在 msg 文件夹下的 *.msg 文件中。ros 提供了标准的 message 类型,用户也可以自定义。
基本的 msg 数据类型:
基本的 msg 数据类型

示例:image.msg
image.msg

rosmsg 常用命令:

rosmsg list  # 列出所有 msg
rosmsg show /msg_name  # 显示某个 msg 内容

2.2. service 与 srv

service,ros 同步通信机制,使用 client/server 模型, 客户端发送请求数据,服务端完成处理后返回应答数据。
同步:client 端发送请求后会阻塞,直到 server 端返回结果才会继续执行。
service 通信方式
topic 与 service 对比。topic 适用于数据传输,service 适用于逻辑处理。
topic 与 service 比较

srv :service 的通信数据格式,定义在 *.srv 文件中。
srv 文件格式:

request message
---
reply message

举例:
srv 格式举例

在这里插入图片描述

rosservice list # 列出当前所有活跃的 service
rosservice info service_name # 显示某个 service 的属性信息
rosservice call service_name args # 调用某个 service 

2.3. parameter server

可通过网络访问的存储各种参数的全局共享字典,节点使用此服务器来存储和检索运行时的参数。可用命令行、launch文件和 node(API)读写。通常把不常改变的参数方法 parameter server 中。

rosparam list # 列出当前所有参数
rosparam get param_key # 显示某个参数的值
rosparam set param_key param_value # 设置某个参数的值
rosparam dump file_name # 保存参数到文件 
rosparam load file_name # 从文件中读取参数
rosparam delete param_key # 删除参数

参数需满足 YAML 格式,如
YAML格式举例

2.4. Action

类似 server,带有状态反馈的通信方式。通常用于长时间、可打断的任务中。

action

action 通信的数据格式为 action,定义在 *.action 文件中。
action 的写法:
action 举例

3.ros 常用工具

3.1 rqt

显示 计算图:rqt_graph

圆圈:节点
箭头:数据流向
方框:topic
图形化显示topic数据:rqt_plot
rosrun rqt_:查看所有 rqt 命令。

3.2 rosbag

ros命令行工具,记录和回放数据流。创建一个 topic,将需要记录的数据打上时间戳存放到.bag文件中。

公开数据集常打包成 .bag文件。

rosbag record topic-names # 记录某些 topic 到 bag 中
rosbag record -a bag-file-name # 记录所有 topic 到 bag 中. -a ,保存所有数据;-O,保存为压缩包 
rosbag play bag-files-name # 回放 bag

4. client library

client library,提供 ros 编程的库,将底层功能封装好,提供接口供用户调用,如建立 node,发布消息,调用服务等。主要包括 roscpp,rospy,roslisp 等。

4.1 roscpp

主要包括
roscpp

4.2 rospy

定义好 .msg ,.srv等文件后要先执行 catkin_make 编译,以生成相应的 msg/__init__.py文件
以供 import导入
参考链接:http://docs.ros.org/api/rospy/html/
import rospy

4.2.1 Node

init_node('node_name') #注册和初始化 node
get_master() # 获取 master 的句柄
is_shutdown() # bool 返回是否关闭
on_shutdown(fn) # 在 node 关闭时调用函数
get_node_uri() # str 返回节点的 URI
get_name() # str 返回本节点的全名
get_namespace() # str 返回本节点的命名空间

4.2.2 Topic

topic

4.2.3 Service

# 函数:
wait_for_service(service,timeout=None) # 阻塞直到服务可用
# Service 类 ,server 端
__init__(self,name,service_class,handler) # 构造函数 提供服务。handler 接收请求
shutdown(self) # 关闭服务
# ServiceProxy 类,client 端
__init__(self,name,service_class) # 构造函数 服务请求方 client = ServiceProxy(...)
call(self, *args,**kwds) # 发出请求,调用服务 client.call(request) 
__call__(self, *args,**kwds) # 隐式调用 call函数 client(request)

4.2.4 Param

在这里插入图片描述

4.2.5 Time

# Time 类,时刻
now() # 返回当前时刻
get_rostime() # 当前时刻的 time 对象
get_time() # float 时间单位 s
sleep(duration)# 挂起
# Duration 类,时段
# Rate 类,频率

5. TF & URDF

5.1. TF :TransForm

tf:坐标转换的标准、话题、工具、接口。
机器人每个部件定义为一个 link,每个 link 上固定一个 frame坐标系,frame 之间的坐标关系用 TF tree 描述。Brodercaster,是 publister,向 TF topic 发送TransformStamped.msg数据。

TF tree 的消息类型:tf/tfMessage.msg (第一代),tf2_msgs/TFMessage.msg (第二代)

5.2. URDF:Unified Robot Description Format

XML语言规范

6. ros应用——移动机器人

移动机器人主要技术

path planning 算法主要有 global 的 Dijkstra,A*;local 的 DWA 等。ros 提供的 Navigation 包提供了这些算法.

6.1 Maping

Topic: /Map
Type:nav_msgs/OccupancyGrid.msg
imu odom

6.2 Navigation

navigation

move_base:全局规划(静态),局部规划(动态),处理异常行为。
在这里插入图片描述

costmap:用于路径规划,两张,2 维,多层(static layer,obstacle layer,inflation layer)

7.ros应用——机械臂运动规划 MoveIt!

Topic和Action通讯方式与机器人通信,获取机器人当前的状态(例如当前每个关节的位置)、各个传感器的数据等。通过TF库获取坐标系变换数据,包括机器人的位姿、其他物体位姿等全局信息。机器人控制器控制机器人的每个关节做运动,机器人控制器和Move_Group的通信方式是Action,将规划好的关节信息告诉机器人控制器,机器人控制器还会提供反馈信息.

ROS MoveIt!控制真实机械臂的一般框架:

  1. 通过程序或界面设置机械臂运动目标
  2. MoveIt!完成运动规划并输出关节轨迹
  3. 通过socket接口和控制器连接,将关节轨迹发送给控制器
  4. 控制器进行插补运算,并周期发送给电机驱动器
  5. 驱动器完成闭环控制,让电机多、快、好、爽的跟随输入指令
  6. 控制器反馈实时状态到MoveIt!,Rviz动态显示当前状态

【轨迹插补】MoveIt!规划得到的关节轨迹由一系列轨迹点组成,每两个点之间的时间间隔不定,基本是0.1~1秒之间,这个时间间隔对于底层控制来讲,是非常大的,很容易造成轨迹运动不圆滑、速度不均匀的现象,需要进一步细分到和控制周期匹配的间隔,也就是你可能常听说的“轨迹插补”,具体实现可以参考ros_control。

在这里插入图片描述

ROS MoveIt!控制真实机械臂的框架

猜你喜欢

转载自blog.csdn.net/zxxxiazai/article/details/107583343
今日推荐