1. 简介
这篇博客主要记录学习ROS的笔记,内容来源于:
2. 古月居
2.1. ROS安装
根据ROS-wiki的说明一步步进行安装
2.2. ROS是什么
- ROS发展史:
- ROS能提高机器人研发中软件的复用率
2.3. ROS的核心概念
- 节点(Node)是ROS中的执行单元:
- 执行具体任务的进程、独立运行的可执行文件
- 不同节点可使用不同的编程语言,分布式运行在不同的主机
- 节点在系统的名称必须唯一
- 节点管理器(ROS Master)是ROS的控制中心:
- 为节点提供命名和注册服务
- 跟踪和记录话题/服务通信,辅助节点相互查找、建立连接
- 为节点提供参数
- 话题通信机制(异步):
- 话题(Topic)
- 节点间用来传输数据的重要总线
- 使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一
- 消息(Message)
- 具有一定类型的数据结构
- 使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件
- 话题(Topic)
- 服务通信机制(同步):
- 服务(Service)
- 使用客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据
- 使用编程语言无关的.srv文件定义请求和应答数据结构
- 服务(Service)
- 话题和服务通信的区别:
- 参数-全局共享字典:
- 可通过网络访问共享、多变量字典
- 节点使用此服务器来存储和检索运行时的参数
- 不适合存储动态配置的数据
- 文件系统
2.4. ROS命令行工具
-
常用命令: rostopic/rosservice/rosnode/rosparam/rosmsg/rossrv
-
rqt_graph可以查看系统的节点和通信机制
read more
ROX learning
1. 简介
这篇博客主要记录学习ROS的笔记,内容来源于:
2. 古月居
2.1. ROS安装
根据ROS-wiki的说明一步步进行安装
2.2. ROS是什么
- ROS发展史:
- ROS能提高机器人研发中软件的复用率
2.3. ROS的核心概念
- 节点(Node)是ROS中的执行单元:
- 执行具体任务的进程、独立运行的可执行文件
- 不同节点可使用不同的编程语言,分布式运行在不同的主机
- 节点在系统的名称必须唯一
- 节点管理器(ROS Master)是ROS的控制中心:
- 为节点提供命名和注册服务
- 跟踪和记录话题/服务通信,辅助节点相互查找、建立连接
- 为节点提供参数
- 话题通信机制(异步):
- 话题(Topic)
- 节点间用来传输数据的重要总线
- 使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一
- 消息(Message)
- 具有一定类型的数据结构
- 使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件
- 话题(Topic)
- 服务通信机制(同步):
- 服务(Service)
- 使用客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据
- 使用编程语言无关的.srv文件定义请求和应答数据结构
- 服务(Service)
- 话题和服务通信的区别:
- 参数-全局共享字典:
- 可通过网络访问共享、多变量字典
- 节点使用此服务器来存储和检索运行时的参数
- 不适合存储动态配置的数据
- 文件系统
2.4. ROS命令行工具
-
常用命令: rostopic/rosservice/rosnode/rosparam/rosmsg/rossrv
-
rqt_graph可以查看系统的节点和通信机制
rqt_graph
rosnode list
可以查看节点的列表rosnode info /turtlesim
可以查看turtlesim这个节点的信息rostopic list
可以查看话题的列表rostopic pub /turtlesim/cmd_vel ...
可以使用cmd_vel话题发送消息rosmsg show geometry_msgs/Twist
可以查看某个消息的信息rosservice list
可以查看ROS中服务的列表rosservice call ...
可以调用某个服务
rosbag record ...
可以记录某一个话题rosbag play ...
可以通过保存的bag文件来复现该话题
2.5. 创建工作空间与功能包
- 工作空间是一个存放工程开发相关文件的文件夹
- 创建工作空间的步骤
catkin_make install
创建install空间- 创建功能包
2.6. Publisher的编程实现
- 话题模型
- 首先创建功能包
cd ~/catkiin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
- 使用c++创建publisher
- 创建publisher时需要声明消息类型,话题的名称,创建publisher完毕后,即可创建消息来让publisher发布
- 配置publisher代码编译的规则(在cmakelists中)
- 设置需要编译的代码和生成的可执行文件/设置链接库
- 编译并运行发布者
- python实现publisher
2.7. Subscriber的实现
- python实现subsriber
2.8. 话题消息的定义与使用
- 自定义话题消息
- 定义msg文件
- 在package.xml中添加功能包的依赖
- 在CMakeLists中添加编译选项
- 编译生成语言相关文件
- python实现topic
- 定义publisher和subscriber(需要声明topic和消息)
2.9. client实现
- 服务模型(C/S模型):
- python实现client
2.10. server实现
- python实现server:
2.11. 服务数据的定义与使用
- 自定义服务数据
- 服务模型
- 首先生成server节点,然后创建service,client在发现service后创建并发送数据,server在接受数据后进入callback返回request
2.12. 参数的使用与编程方法
- 参数模型
3. Udemy课程
3.1. Course Overview
3.1.1. Installation of turtlebot3
- 这小节主要介绍如何安装turtlebot3:
- 按照udemy的讲义上一步步安装,首先安装ros-noetic-navigation和ros-noetic-slam-gmapping,然后拷贝github上的代码到本地编译turtlebot3,同样的做法安装turtlebot3-simulation
3.1.2. Turtlebot3 SImulation Environments
roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
打开一个空白的空间,里面只有一辆小车roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
启动后,可以键入wasd来操作小车roslaunch turtlebot3_gazebo tuetlebot3_world.launch
里面有几根柱子和小车roslaunch turtlebot3_gazebo turtlebot3_house.launch
房间roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch
ros中很重要的可视化软件Rviz,关于turtlebot3有适配版本,可以可视化小车的激光雷达和摄像头roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
slam,可视化在Rviz上,slam的算法有很多,这里采用gmapping的方法
3.2. ROS Navigation Demo
- 这章展示了ROS Navigation的一个demo,首先打开house,然后
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file=...
来打开Navigation,在Rviz中展示,标定好终点后,它会自动规划路径到达终点 - frame就是不同的参考系
3.3. 2D Frames, Transformations and Localization
3.4. 3D Frames, Transformations and Localization
3.5. Orientation in 3D Space
3.6. The TF Package: Frame, Transformation and Localization in ROS Explained
- TF是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点,向量等数据的坐标,在两个参考系中完成坐标变换:
- 机器人的模型用一个XML文件定义,使用URDF(unified robot description format)这个语言去描述机器人的Frame和Transformation。其中Frame连接在关节上,在URDF中用link表示,不同关节的相对位置用Transformation表示,可以在ROS wiki上了解更详细的信息
- TF package nodes(TF功能包提供了一些有用的ROS nodes):
- 可以通过订阅odom话题来获得odom的child frame:base_footprint的position和orientation,odom: topic represents a pose based on a odometry information
rosrun tf2_tools view_frames
来获得当前场景下的frames和transformation的总体情况,会在当前目录生成一个pdf文件- robot相对于map的参考系叫做amcl_pose
rosrun tf tf_echo frame1 frame2
可以获得两个frame之间translation和rotationrosrun tf static_transform_publisher 1 2 3 0.1 0.2 0.3 frame_a frame_b 10
可以在两个frame之间创造一个transformation- 可以定义节点来广播frame_a到frame_b的transformation,也可以定义节点来收听frame_a到frame_b的transformation
- 总的来说,TF功能包能获得当前场景下的frame和transformation信息,同时也可以自定义frame之间的transformation
3.7. Map-based navigation
- robot navigation表示机器人自动避障的能力,有两种主要的导航方法,第一种方法是map-based navigation,预加载好地图的相关信息,另一种方法是reactive navigation,不会预加载地图的相关信息,只会利用传感器感知周围环境
- navigation可以分为三步,localization,mapping,path planning:
- mapping的主要方法是SLAM(simultaneous localization and mapping):
- navigation的主要功能包:
- turtlebot3 slam demo:
- 地图的表示方法: occupancy grid map,一张地图由网格状的cell组成,一个cell可以是empty或者occupied:
- gmapping是slam的一种方法,还有其他方法,比如cartographer,hector_slam:
- 通过激光雷达的数据判断哪些地方有障碍物
- SLAM生成的地图的质量由odometry和laser scanner决定,odometry就是里程计,衡量机器人从初始姿态到终点位姿的一个标准,如果要实现机器人的定位与导航,就需要知道机器人行进了多少距离,往哪个方向行进的
- 通过SLAM生成的地图可以保存下来,通过指令
rosrun map_server map_saver -f ~/tb3_house_map
来保存地图到指定路径 - 保存的地图由两个文件组成,
.pgm
和.yaml
,其中.pgm
就是一张地图的图片,灰色的区域表示未知的区域,黑色的区域表示障碍物,白色的区域表示自由区域,.yaml
存储了地图的metadata,比如原点,地图图片的路径,阈值等 - 如何通过SLAM生成的地图对小车进行导航(Navigation):
- 首先告诉小车自己在哪里,通过Rviz的2D pose estimation实现
- 然后确定小车需要到达的终点
- motion planner algorithm告诉小车如何到达终点
- Map-based navigation命令行:
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=...
- 通过程序实现map-based navigation,无需通过Rviz实现
- 为什么出现小车后退重新尝试的行为(recovery behavior):
- 如何让机器人支持ROS的Navigation模块
- Robot setup:
- 安装ROS
- 必须有tf transform
- URDF
- sensor information
- odometry information
- base controller
- mapping
3.8. Navigation Stack Tuning
- 控制Navigation的最大速度/加速度和最小速度/加速度,可以通过更改local planner的yaml文件,对于turtlebot3而言,这个文件在
turtlebot3_navigation/param
里 - 如何获得小车的最大速度:
- 如何获得小车的最大加速度:
- Global Path Planner Tuning, 微调全局路径规划参数,全局路径规划需要考虑地图信息来找到一条没有障碍的路径
- ROS中有三个global planner:
- Carrot Planner的示意图:
- NAVFN 和 global_planner
- global_planner中可以调节的参数的例子:
- local path planner的相关知识,局部路径规划会在执行全局路径规划给出的路径的同时,通过传感器获得的局部信息来躲避动态的障碍。
- DWA algorithm(Dynamic Window Approach 属于local path planning的一种):
- 离散地采样几种方向和速度
- 对于每一种采样,都预测一下如何按照这种方式前进会发生什么
- 对于每一种结果,使用一种评价标准进行打分
- 选取最高评分的前进方法
- 微调DWA算法的参数,微调simulation time这一参数
- 不同DWA参数的影响
- 动手实现微调DWA的simulation time参数对navigation的影响(视频在notion上有)
Comments