参考
- http://wiki.ros.org/
- mooc上重德智能的ros操作系统教程
- 讲义: https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/
- 视频
安装
直接参考官方文档,如对melodic版本的:http://wiki.ros.org/melodic/Installation/Ubuntu
文件组织架构
ros使用的是catkin编译系统,首先要建立一个catkin工作空间
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
运行完上述命令后初始化完成,于是一个ros的工作空间得以建立
工作空间内的目录如下
使用指令tree可以查看目录结构
工作空间下包括src(源代码),devel(环境step.bash等文件及目标文件),build三个文件夹
package
package下有两个关键文件: CMakeLists.txt和package.xml(包的介绍等,包括其依赖等)
其中scripts文件下放的是可执行脚本,src目录下可以放python文件
package下也可以放通信相关文件
- msg 消息(.msg)
- srv 服务(.srv)
- action 动作(.action)
package下也可以通过config文件夹和launch文件夹下的.config和.launch 将多个package可执行文件一同执行
rospack
# 查找某个pkg的地址
$ rospack find package_name
roscd
# 跳转到某个pkg目录下
$ roscd package_name
rosls
# 列举某个pkg下的文件信息
rosls package_name
rosed
# 编辑pkg中的文件
$ roscd package_name file_name
catkin_creat_pkg
# 创建一个pkg
$ catkin_create_pkg <pkg_name>[deps]
rosdep
# 安装某个pkg所需的依赖,用于从github下载的ros包的依赖的创建,如msf的依赖以及重德智能的依赖
$ rosdep install [pkg_name]
metapackage
一个虚包,本身没有什么实质性内容,但是指定了其运行所需的众多依赖,可以通过运行它,安装这些依赖,ros之前将这种称之为软件包集Stack
ros开发中常用到的几个metapacakge
Metapacakge名称 | 描述 | 链接 |
---|---|---|
navigation | 导航相关的功能包集 | https://github.com/ros-planning/navigation |
moveit | 运动规划相关的(主要是机械臂)功能包集 | https://github.com/ros-planning/moveit |
image_pipeline | 图像获取、处理相关的功能包集 | https://github.com/ros-perception/image_common |
vision_opencv | ROS与OpenCV交互的功能包集 | https://github.com/ros-perception/vision_opencv |
turtlebot | Turtlebot机器人相关的功能包集 | https://github.com/turtlebot/turtlebot |
pr2_robot | pr2机器人驱动功能包集 | https://github.com/PR2/pr2_robot |
… | … | … |
通信架构
master: 节点管理器,每一个node都要在master这里进行注册,master也承担了联系不同node的责任
node: 节点,类似于进程,加载了静态的可执行文件,但是node是动态的
指令
roscore
启动master,同时启动的还有rosout(日志输出)以及parameter sever(参数服务器)
rosnode
# 列出当前运行节点的详细信息
rosnode list
# 某个节点的详细信息
rosnode info [node_name]
# 结束某个node
rosnode kill [node_name]
运行包
$ rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]
我们并不需要每个节点依次进行rosrun,ROS为我们提供了一个命令能一次性启动master和多个node,具体使用roslaunch命令,如果没有运行roscore其会首先执行roscore
$ roslaunch pkg_name file_name.launch
当前有一个默认的规则,把能启动整个系统的包名加上bringup
通信方式
Topic
异步通信
tostopic相关命令
命令 | 作用 |
---|---|
rostopic list | 列出当前所有的topic |
rostopic info topic_name | 显示某个topic的属性信息 |
rostopic echo topic_name | 显示某个topic的内容 |
rostopic pub topic_name ... | 向某个topic发布内容 |
rostopic bw topic_name | 查看某个topic的带宽 |
rostopic hz topic_name | 查看某个topic的频率 |
rostopic find topic_type | 查找某个类型的topic |
rostopic type topic_name | 查看某个topic的类型(msg) |
topic的通信方式使用.msg文件,定义方式类似c语言中的结构体,具体使用命令如下
rosmsg命令 | 作用 |
---|---|
rosmsg list | 列出系统上所有的msg |
rosmsg show msg_name | 显示某个msg的内容 |
举例如下:
Quaternion.msg
#消息代表空间中旋转的四元数
#文件位置:geometry_msgs/Quaternion.msg
float64 x
float64 y
float64 z
float64 w
Vector3.msg
#文件位置:geometry_msgs/Vector3.msg
float64 x
float64 y
float64 z
service
不同于topic,service是同步通信,即既有指令又有反馈,有等待的过程,Service是同步通信方式,所谓同步就是说,此时Node A发布请求后会在原地等待reply,直到Node B处理完了请求并且完成了reply,Node A才会继续执行。Node A等待过程中,是处于阻塞状态的成通信。这样的通信模型没有频繁的消息传递,没有冲突与高系统资源的占用,只有接受请求才执行服务,简单而且高效。
Node B是server(应答方),提供了一个服务的接口,叫做/Service
,我们一般都会用string类型来指定service的名称,类似于topic。Node A向Node B发起了请求,经过处理后得到了反馈
rosservice命令:
rosservice 命令 | 作用 |
---|---|
rosservice list | 显示服务列表 |
rosservice info | 打印服务信息 |
rosservice type | 打印服务类型 |
rosservice uri | 打印服务ROSRPC uri |
rosservice find | 按服务类型查找服务 |
rosservice call | 使用所提供的args调用服务 |
rosservice args | 打印服务参数 |
srv
包括一个request和一个reply两个过程,其中srv的问答和回复可以使用msg文件,msg也可以嵌套msg文件
举例:
msgs_demo/srv/DetectHuman.srv
bool start_detect
---
my_pkg/HumanPose[] pose_data
msgs_demo/msg/HumanPose.msg
std_msgs/Header header
string uuid
int32 number_of_joints
my_pkg/JointPose[]joint_data
msgs_demo/msg/JointPose.msg
string joint_name
geometry_msgs/Pose pose
floar32 confidence
再举几个不同类型的srv的例子
AddTwoInts.srv
#对两个整数求和,虚线前是输入量,后是返回量
#文件位置:自定义srv文件
int32 a
int32 b
---
int32 sum
Empty.srv
#文件位置:std_srvs/Empty.srv
#代表一个空的srv类型
---
GetMap.srv
#文件位置:nav_msgs/GetMap.srv
#获取地图,注意请求部分为空
---
nav_msgs/OccupancyGrid map
rossrv命令:
rossrv 命令 | 作用 |
---|---|
rossrv show | 显示服务描述 |
rossrv list | 列出所有服务 |
rossrv md5 | 显示服务md5sum |
rossrv package | 列出包中的服务 |
rossrv packages | 列出包含服务的包 |
service和topic
service和topic比较如下
名称 | Topic | Service |
---|---|---|
通信方式 | 异步通信 | 同步通信 |
实现原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-Reply |
映射关系 | Publish-Subscribe(多对多) | Request-Reply(多对一) |
特点 | 接受者收到数据会回调(Callback) | 远程过程调用(RPC)服务器端的服务 |
应用场景 | 连续、高频的数据发布 | 偶尔使用的功能/具体的任务 |
举例 | 激光雷达、里程计发布数据 | 开关传感器、拍照、逆解计算 |
完成这些文件后还要修改CMakeLists.txt和package.xml等文件
如xml文件添加依赖:
<build_depend>** message_generation **</build_depend>
<run_depend>** message_runtime **</run_depend>
Parameter server
个人理解不知道为什么把它当成通信模式一种
-
命令行维护
-
launch文件内读写
-
node源码
命令行操作:
rosparam 命令 | 作用 |
---|---|
rosparam set param_key param_value | 设置参数 |
rosparam get param_key | 显示参数 |
rosparam load file_name | 从文件加载参数 |
rosparam dump file_name | 保存参数到文件 |
rosparam delete | 删除参数 |
rosparam list | 列出参数名称 |
Action
这是一种service通信方式的补充,当server运行时间过长时可以反馈给client当前状态,client可以终止请求
action包括3个部分
- 目标: 机器人执行一个动作,应该有明确的移动目标信息,包括一些参数的设定,方向、角度、速度等等。从而使机器人完成动作任务。
- 反馈: 在动作进行的过程中,应该有实时的状态信息反馈给服务器的实施者,告诉实施者动作完成的状态,可以使实施者作出准确的判断去修正命令。
- 结果: 当运动完成时,动作服务器把本次运动的结果数据发送给客户端,使客户端得到本次动作的全部信息,例如可能包含机器人的运动时长,最终姿势等等。
Action规范文件的后缀名是.action,它的内容格式如下:
# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
其中action也是可以缺少其中一项的,但是—不能少
AddTwoInts.action
#文件位置:自定义action文件
#表示将两个整数求和
int64 a
int64 b
---
int64 sum
---
当然还需要修改CMakeLists.txt和xml
ros常用工具
gazebo是一种最常用的ROS仿真工具,也是目前仿真ROS效果最好的工具。
RViz是可视化工具,是将接收到的信息呈现出来。
rqt则是非常好用的数据流可视化工具,有了它我们可以直观的看到消息的通信架构和流通路径。
rosbag则是对软件包进行操作的一个命令,此外还提供代码API,对包进行操作编写。
rosbridge是一个沟通ROS和外界的功能包。
moveit!是目前为止应用最广泛的开源操作软件。