速刷古月居ROS21讲概念全过程
- 标题 : 速刷古月居21讲概念全过程
- 起源: –
- 更新时间如下 (如下)
- 更新次数 : 7
- 最近更新时间 :
- 更新内容:
- 下次更新:
ROS的概念:对应第七讲
通讯机制
- 松耦合分布式软件框架
- Node :每个node就是一个节点,每个节点就是机器人系统中完成具体功能(图像识别 传感器驱动)一个进程
节点 (Node)– 执行单元
(相当于系统中的一个进程,能够独立运行的一个可执行文件 相当于windows的一个exe文件 )
- 节点: 执行具体任务的进程 、独立运行的可执行文件
- 节点 当中位置不是固定的
- 节点在系统的名称是唯一的
- 节点之间不是孤立的
- 节点之间编程语言不是固定的
(是为了适应不同的功能 ,比如python 做图像处理 ,c/c++ 适合做底层驱动 ) - 节点可以使用分布式运行到不同的主机上
节点管理器(ROS Master)
(ROS当中1)
-
为节点提供命名和注册服务
-
跟踪和记录话题 / 服务通信 ,辅助节点相互查找 建立连接
-
提供参数服务器 ,以及节点使用此服务存储和检索运行的参数
话题和消息
(话题和消息 就是节点的两种传输方式 )
- 话题好比发邮件 消息好比打电话
话题(Topic) – 异步通信机制
- 节点间用来传输数据的重要总线
- 使用发布 / 订阅 模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一
消息(Message) – 话题模型
- 具有一定类型和数据结构 ,包括ROS提供的标准类型 和用户自定义类型
- 使用编程语言无关的.msg文件定义,编译过程中生成的代码文件
- 可以自定义接口满足需求
服务(Servic)— 同步通信机制
- 带有反馈机制
- 使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理返回应答数据
- 使用编程语言无关的.src 文件定义请求和应答数据结构,编译过程中生成对应的代码文件
- 服务请求一次 满足内容连接
(服务的应用场景 好比摄像头 传输图像 需要 调整摄像头拍摄远程画面,控制摄像头对焦,就是需要调整摄像头)
话题 和 服务的区别
参数(Parameter)– 全局共享字典
- 可通过网络访问的共享 、多变量字典
- 节点使用此服务来存储和检索运行时的参数
- 适合存储静态、非二进制的配置参数 、不适合存储动态配置的数据
( 所有节点 Talke and Listener 都可以给节点赋值 ROS 通信机制就是SPC,从图可以看见,listener必须重新从ROS Master 获取值 才能从Talker获取变化 ,故此ROS( 适合存储静态、非二进制的配置参数 、不适合存储动态配置的数据))
文件系统:
功能包(Package)
- ROS软件中的基本单元,包含节点源码,配置文件,数据定义等
- 功能包 包括(节点 消息 服务)
功能包的清单 (Package manifes)
- 记录功能包的基本信息 ,包含作者基本信息、许可信息、依赖选项、编译标志等
元功能包(MetaPackages)
- 组织多个同一目的功能包
软件仓库
ROS 社区
ROS的概念:对应第八讲
ROS命令行总览:
ROS shell命令 | |||
---|---|---|---|
命令 | 重要度 | 命令释义 | 详细说明 |
roscd | 👍👍👍👍 | ros+cd | 移动到指定的ros功能包目录 |
rosls | 👍👍 | ros+ls(list files) | 显示功能包的文件和目录 |
rosed | 👍👍 | ros+ed (editor) | 编辑ROS功能包的文件 |
roscp | 👍👍 | ros+cp (copies files) | 添加目录至目录索引 |
rosd | 👍 | ros+ deirectory | 添加ROS目录索引中的目录 |
ROS 执行命令: | |||
roscore | 👍👍👍👍 | ros+core | master(ROS名称服务)+rosout(日志记录)+parameter server(参数管理) |
rosrun | 👍👍👍👍 | ros+run | 运行节点 |
roslaunch | 👍👍👍👍 | ros+launch | 运行多个节点及设置运行选项 |
rosclean | 👍👍👍 | ros+clean | 检查或删除ROS日志文件 |
ROS信息命令: | |||
rostopic | 👍👍👍👍 | ros+topic | 确认ROS话题信息 |
rosservice | 👍👍👍👍 | ros+service | 确认ROS命令行信息 |
rosnode | 👍👍👍👍 | ros+node | 确认ROS节点信息 |
rosparam | 👍👍👍👍 | ros+param(paramer) | 确认和修改ROS参数信息 |
rosbag | 👍👍👍👍 | ros+bag | 记录和回放ROS信息 |
rosmsg | 👍👍👍 | ros+msg | 显示ROS消息类型 |
rossrv | 👍👍👍 | ros+srv | 显示ROS服务类型 |
rosversion | 👍👍 | ros+version | 显示ROS功能包的版本信息 |
roswtf | 👍 | ros+wf | 检查ROS系统 |
ROS功能包命令 | |||
rospack | 👍👍👍👍 | ros+pack (age) | 查看ROS功能相关的信息 |
rosinstall | 👍👍👍 | ros+install | 安装ROS 附加功能包 |
rosdep | 👍👍👍 | ros+dep(endencies) | 安装该功能包的依赖文件 |
roslocate | 👍👍👍 | ros+locate | ROS功能包信息相关命令 |
rosscreate-pkg | 👍 | ros+create-pkg | 自动生成ROS功能包 (用于旧的rosbuild系统) |
rosmack | 👍 | ros+make | 构建ROS功能包 |
ROS命令行示例快速理解 以小海龟为例:
- 要运行小海龟程序 必须确保已经安装好了ROS
- 如果没有安装好 ROS 请参考这篇文章
- 安装ROS Kinetic详细过程
roscore
roscore 是为了启动 ROSMASTER ,是ROS所有节点管理器,也是启动ROS必须启动的一个指令
rosrun
rosrun 是为了运行ros安装包某个节点某个安装包的一个指令 后面要跟着两个 参数 一个 是功能包名
,一个是功能包的节点
-
从中我们运行了 turtlesim这个功能包 双按tab 显示他所含的节点名称
-
turtlesim 是为了学习ros创作的一个小海龟模拟器
-
(我们运行 第三个节点 turtlesim_node
-
便会出现小海龟的仿真器模型 )
-
接下来我们再打开 rosrun turtlesim 第四个节点 键盘控制器
就可以再键盘上 控制 海龟运行了
rqt_graph
- 以qt开头的就是用qt 写的一些计算工具
- rqt_graph 是一个显示系统计算图的工具,ros核心工具就是一个计算图 ,我们很快知道ros控制相关的信息
rosnode
- ROS(ROS) 是 无界面命令行工具
- 输入 rosnode 他会报出 很多node相关的节点工具
rosnode list
rosnode list 是针对节点中的内容 列出
- rosout 启动的默认 话题 ,这个话题主要采集 所有话题的日用信息,提交给上面界面做显示的 一个话题 。只要启动他就会有的一个话题 一般不用管他
rosnode info
可以看到各个节点能够发布哪些话题
通过订阅话题来提供服务
还会显示主机号 以及PID号 底层机制的信息描述
rostopic
同rosnode 一一样 输入rostopic 会显示他的功能清单:
rostopic list
- 打印出当前所有节点的话题列表
这里 我们可以看到有个turtle1的cmd_vel 这个其实就是键盘连接节点的工具
如图
rostopic pub
(那能不能通过 直接给话题发布指令让数据动起来呢)
然后 我们看到 rostop下面有个这个介绍
然后我们根据 他的描述 输入 rostopic pub 消息类型 消息内容 话题名
输入双击tab键盘可以自动补齐 输入tur就可以补齐了
- 其中 turtle1 \cmd_vel geometry_msgs 是话题名 Twist “linear 和angualr 是数据内容以及消息结构
然后我们可以通过更改数值来发布话题
-
点击回车他就能动了 !
–
但是发现海龟不能一直都动,因为话题只能发布一次 -
于是我们可以在 pub 后面加上 – r -r 表示 rate 频率的意思 后面接频率的次数
-
那能不能通过海龟控制旋转呢 我们看到 angular 角度有三个参数xyz 其中z轴是垂直于仿真器向外的
rosmsg show
那我们能不能来看到话题消息数据类型吧 我们可以用rosmsg show 做到
我们可以看到Twist消息数据结构 ,这是原来ros定义好的数据结构,
rosservice
现在我们来看看 rosservice 相关的服务
与rostopic一样 直接输入rosserive 会跳出他可接的代码列表
我们看用rosserive list 直接来看看他们服务有哪些
其中
- spawm 是用来产生诞生的意思 我们可以用他来产生新的海龟
- 和前面一样 只要双击TAB键 后面的参数就会自动补齐
- 其中 x y 是海龟的坐标位置 theta 是海龟诞生中的角度 name ”“是产生海龟的名字
然后我们回车 就可以调用这个服务 ,并且会在仿真器上再跑出一个海龟
然后我们再点开 rostopic list 会发现又多出几个海龟的参数 ,这些是新生成的海龟参数
回顾一下:
- 主要用的几个节点
- 可视化的几张图
话题复现
- 话题复现可以记录话题中的所有数据 ,并在下次用的时候复现出来
- 比如 :你有个无人机想做调试,但不能让每次无人机飞起来再做调试
- 然后做一次飞行 飞行时候把无人机数据都保存下来 通过话题复现就能把无人机飞行复现出来就可以了
首先 我们输入 rosbag reord 表示记录数据 -a a表示all 所有的数据 -o 表示我们把所保存的数据保存到一个压缩包,至于压缩包叫什么 就是后面的名称
输入之后 可以看到他以及再记录这个列表
- 记录之后直接按住 cirt c 推出就记录下来了
- 保存后 会放在你当前终端的目录下面 这里我们一般再home 主文件下面
- 这个就是记录我们数据保存文件,
现在 我们重新 退出
这里我们再重新启动一遍 先用roscore启动,再启动海龟节点 弹出海龟仿真器
-
这里我们不用启动key控制节点 直接通过 rosbag运行 已经打包好的控制指令
-
rosbag play +名字
创建工作空间与功能包 对应第九讲
工作空间可以看作 新建工程
- src:代码空间是为了放置功能包的 ,配置文件包括一些lanunch文件等等到是放在这里的
- bulid 编译空间 编译过程中产生中间文件
- devel 开发空间 放置编译过程中的可执行的一些库 以及代码脚本等等
- install 安装空间 用我们install 安装成功后的结果 放在什么位置的
在ROS1 中install 安装空间和 devel开发空间很多内容是重复
所以在ROS2 中争对这一点做了很多修正
工作空间
创建工作空间:
- 首先 我们用mkdir 创建 一个工作空间 需要注意的是 catkin_ws 文件本任取 但是src是固定的
- 然后我们进入我们的src文件
- 使用cartkin_init_workspace 创建工作空间
编译工作空间:
进入 src的上一级目录 执行catkin_make执行编译文件
设置环境变量:
为了让你系统找到 设置环境变量
检查环境变量:
功能包
创建功能包
cakin_create_pkg 创建功能包 后面跟着依赖库 (调用接口)
std_msgs 是调用那些标准的接口 用到哪些库一定要用到依赖
工作空间 重名问题
功能包下重要文件:
- 这两个文件是任何一个功能包必须要存储放的一个文件 ,没有这个文件就不能称为功能包
packeage .xml 文件
- 这种文件内容是通过src 这种语言里的内容进行描述的 ,
- 描述了文件包相关的信息 ,比如说功能包的名字,版本号
- 这个功能包可以向你反馈一些内容
- Lincense 包括开源的许可证
- 这些信息
-
packeage .xml 中功能包的依赖信息:
- 可以看到下方的依赖库在roscpp 和rospy std_msgs 依赖库在内有所体现
CMakeList.txt
CMakeList.txt 主要描述语法编译规则
CMake 也是基于GC的一个编译器 在编译规则设置上 比较友好
find_package 文件包括一些编译的规则:
编译中的依赖 限制可以设置 package中的包
发布者 Publisher
海龟仿真器
创建功能包
我们进入src执行 创建发布者指令
实现pubulinsher代码步骤
publisher 源代码分析
/*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************/
/** * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist */
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
publisher 发布者消息队列
-
Publisher — > Topic (Message geometry_msgs::Twist )
-
因为话题没有来得及快速响应你的发布 所以他会有个发布者队列 把发布者的数据发布在队列里面来然后再发布出去
-
队列如果爆了怎么办,队列默认长度是10,ros master会把爆了的数据丢出去 ,像这种情况默认保存数据是10就会保存10个数据,丢出去就会导致掉数据 掉真的情况
publisher 发布者频率:
因为我们后面是一个where循环 ,所以在后面设置他的频率
// 设置循环的频率
ros::Rate loop_rate(10);
publisher 消息内容:
- 设置海龟 运行的速度以及弧度
int count = 0;
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
今天的文章【古月居ROS 21讲】精简理清 – 速刷古月居ROS21讲 ROS概念全过程「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84457.html