ros入门(一),组织架构,通信架构和常用工具


参考

  • 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下也可以放通信相关文件

  1. msg 消息(.msg)
  2. srv 服务(.srv)
  3. 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_opencvROS与OpenCV交互的功能包集https://github.com/ros-perception/vision_opencv
turtlebotTurtlebot机器人相关的功能包集https://github.com/turtlebot/turtlebot
pr2_robotpr2机器人驱动功能包集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比较如下

名称TopicService
通信方式异步通信同步通信
实现原理TCP/IPTCP/IP
通信模型Publish-SubscribeRequest-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!是目前为止应用最广泛的开源操作软件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值