目录
持续更新中...
1 ROS概述
2 ROS通信机制
问题:服务通信概念
服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。
问题:服务通信理论模型
服务通信到三个角色:ROS master(管理者)、Server(服务端)、Client(客户端)。ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。
问题: 参数服务器概念
参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。
问题:参数服务器理论模型
参数服务器中涉及到三个角色:ROS Master (管理者)、Talker (参数设置者)、Listener (参数调用者)。ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
问题:参数服务器实现函数
在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现:ros::NodeHandle和ros::param
(1)ros::NodeHandle
- setParam("键",值):设置整形、浮点、字符串、bool、列表、字典等类型参数
- param(键,默认值):存在,返回对应结果,否则返回默认值
- getParam(键,存储结果的变量):存在,返回 true,且将值赋值给参数2,若果键不存在,那么返回值为 false,且不为参数2赋值
- getParamCached键,存储结果的变量):提高变量获取效率,存在,返回 true,且将值赋值给参数2,若果键不存在,那么返回值为 false,且不为参数2赋值
- getParamNames(std::vector<std::string>):获取所有的键,并存储在参数 vector 中
- hasParam(键):是否包含某个键,存在返回 true,否则返回 false
- searchParam(参数1,参数2):搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
- deleteParam("键"):根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
(2)ros::param(参数说明与(1)类似)
- set
- param(键,默认值)
- get
- getCached
- getParamNames
- has
- search
- del("键")
3 ROS常用命令
在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下:
rosnode(操作节点)、rostopic(操作话题)、rosservice(操作服务)、rosmsg(操作msg消息) 、rossrv(操作srv消息)、rosparam(操作参数)
(1)rosnode : 操作节点
- rosnode ping 测试到节点的连接状态
- rosnode list 列出活动节点
- rosnode info 打印节点信息
- rosnode machine 列出指定设备上节点
- rosnode kill 杀死某个节点
- rosnode cleanup 清除不可连接的节点
(2)rostopic : 操作话题
- rostopic bw 显示主题使用的带宽
- rostopic delay 显示带有 header 的主题延迟
- rostopic echo 打印消息到屏幕
- rostopic find 根据类型查找主题
- rostopic hz 显示主题的发布频率
- rostopic info 显示主题相关信息
- rostopic list 显示所有活动状态下的主题
- rostopic pub 将数据发布到主题
- rostopic type 打印主题类型
(3)rosservice : 操作服务
- rosmsg show 显示消息描述
- rosmsg info 显示消息信息
- rosmsg list 列出所有消息
- rosmsg md5 显示 md5 加密后的消息
- rosmsg package 显示某个功能包下的所有消息
- rosmsg packages 列出包含消息的功能包
(4)rosmsg : 操作msg消息
- rosservice args 打印服务参数
- rosservice call 使用提供的参数调用服务
- rosservice find 按照服务类型查找服务
- rosservice info 打印有关服务的信息
- rosservice list 列出所有活动的服务
- rosservice type 打印服务类型
- rosservice uri 打印服务的 ROSRPC uri
(5)rossrv : 操作srv消息
- rossrv show 显示服务消息详情
- rossrv info 显示服务消息相关信息
- rossrv list 列出所有服务信息
- rossrv md5 显示 md5 加密后的服务消息
- rossrv package 显示某个包下所有服务消息
- rossrv packages 显示包含服务消息的所有包
(6)rosparam : 操作参数
- rosparam set 设置参数
- rosparam get 获取参数
- rosparam load 从外部文件加载参数
- rosparam dump 将参数写出到外部文件
- rosparam delete 删除参数
- rosparam list 列出所有参数
4 常见面试题
问题:roslaunch和rosrun区别?
-
roslaunch可以启动多个节点和包,而rosrun只能启动一个节点和包。
-
roslaunch可以在启动节点时设置参数,而rosrun不能。
-
roslaunch可以启动多个节点之间的依赖关系和顺序,而rosrun不能。
综上所述,roslaunch比rosrun更加灵活和强大,可以更好地管理ROS节点和包之间的关系。
问题:什么是ROS?
ROS(Robot Operating System)是一个开源的机器人操作系统,可以提供常见的机器人功能,如硬件抽象、底层设备控制、常用功能实现、进程间通信、程序打包、工具箱、可视化、调试等。
问题:ROS中的节点是什么?
节点是ROS中最基本的软件单元,可以是一个实际的硬件设备、一个算法、一个控制器等。节点通过ROS的通信机制进行信息交换和数据传输。
问题:ROS的消息通信机制是什么?
ROS中的消息通信机制是基于发布/订阅模式的。节点可以发布消息到某一个话题(Topic),其他节点可以订阅这个话题并接收消息。此外,ROS还支持服务(Service)和参数(Parameter)的通信方式。
问题:如何创建ROS的工作空间?
可以通过使用catkin工具来创建ROS的工作空间。具体步骤如下:
1)创建工作空间目录:mkdir -p catkin_ws/src
2)进入src目录:cd catkin_ws/src
3)创建一个包:catkin_create_pkg my_package rospy
4)回到工作空间目录:cd ..
5)编译工作空间:catkin_make
问题:ROS中常用的机器人控制库有哪些?
ROS中常用的机器人控制库包括:MoveIt、Gazebo、RViz、ROS Control等。其中,MoveIt是用于机器人运动规划和控制的库;Gazebo是一个强大的机器人仿真器;RViz是一个3D可视化工具;ROS Control是用于机器人控制的库。
问题:ROS中如何进行机器人导航?
在ROS中,可以使用Navigation Stack来进行机器人导航。Navigation Stack包括多个子系统,如地图构建、自定位、路径规划和控制等。它可以帮助机器人在未知环境中进行自主导航。
问题:ROS中如何进行机器人感知?
在ROS中,可以使用多种传感器来进行机器人感知,如激光传感器、摄像头、深度相机等。可以使用ROS中的sensor_msgs包来处理传感器数据,并使用自定义的节点来进行数据处理和分析。
问题:ROS中如何进行图像处理?
在ROS中,可以使用OpenCV等图像处理库来进行图像处理。可以使用ROS的图像传输机制将摄像头、深度相机等设备捕获的图像数据传输到ROS节点中,并使用OpenCV等库进行图像处理和分析。
问题:如何调试ROS程序?
可以使用ROS的调试工具来调试ROS程序,如roslaunch、rosrun、rqt等。其中,roslaunch可以启动多个节点,并设置参数;rosrun可以启动单个节点;rqt可以用于可视化调试和数据分析。
问题:如何使用ROS开发机器人控制程序?
可以使用ROS的控制库和机器人模型库来开发机器人控制程序。可以使用ROS Control包来进行机器人控制,使用Gazebo进行机器人仿真,使用URDF(Unified Robot Description Format)来描述机器人模型。可以使用Python、C++等编程语言进行开发。
问题:ROS中的rospy和roscpp有什么区别?
rospy是ROS的Python客户端库,而roscpp是ROS的C++客户端库。两者的功能和使用方式类似,但是语言不同。