ROS = Robot Operating System,包括:
ROS的特性
点对点设计:ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
分布式设计:程序可以在多核计算机中运行,并且可以通过网络来通信。
多语言:ROS现在支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。语言无关的消息处理,让多种语言可以自由的混合和匹配使用。
轻量级:鼓励将所有的驱动和算法逐渐发展成为和ROS没有依赖性单独的库。ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。ROS基本将复杂的代码封装在库里,只是创建了一些小的应用程序为ROS显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。
免费且开源:ROS大多数的源代码都是公开发布的。
需要理解的ROS中的核心概念包括:master(主机)node(节点)topic(主题)message(消息)
用于管理节点间的通信,ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。开启Master命令:
Roscore
节点就是一些独立编译,执行运算任务的进程。ROS利用规模可增长的方式使代码模块化:一个系统就是典型的由很多节点组成的。在这里,节点也可以被称之为“软件模块”。我们使用“节点”使得基于ROS的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。
运行节点:
rosrun package_name node_name
查看激活节点列表:
rosnode list
检索有关节点的信息:
rosnode info node_name
在ROS中消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。
查看激活主题:
rostopic list
订阅和打印一个主题的内容:
rostopic echo /topic
显示主题相关信息:
rostopic info /topic
消息用来定义主题topic类型的数据结构,是整型,浮点型,布尔型,字符串等一系列结构进行压缩后,定义成*.msg文件。
查看主题类型:
rostopic type /topic
向topic发布一个消息:
rostopic pub /topic type args
catkin是ROS构建系统,用来生成可执行文件,库和接口。
(现在很多人建议用catkin build 来代替 catkin_make)
首先进入工作区:
cd ~/catkin_ws
然后创建一个包:
catkin_create_pkg package_name depend1 depend2 depend3
每当你创建一个新包时,都需要更新你的环境:
source devel/setup.zsh
在catkin创建的工作区中包含以下三个文件夹:
1. src:这个就是用来存放源码的地方,操作者在这里面进行编码,修改
2. build:用来存放缓存文件和一些中间文件
3. devel:(development)存放创建目标的地方(在存放之前安装)
ROS的软件使用package(包)进行组织,包下通常包含一下内容:
/src: 源代码
/msg: 定义一些message
/srv: 定义一些service
/launch:包含用于启动节点的launch file
/config:包含配置文件
/test: Unit/ROS tests
/include/package_name: C++ include头文件
/doc:包含文档文件
package.xml: package 信息
CMakeLists.txt: CMake构建文件
这个文件定义了package的属性,这些属性包括:package的名称、版本号、作者、协议、对其他package的依赖等等。。。
下面是一个简单的例子的package信息:
在这个例子中,我们使用了roscpp的client的库,同时我们使用了一个sensor_msg消息。
CMakeLists.txt文件是CMake构建系统的输入,在这里我们不会详细讨论CMake的写法(因为它本身可以很复杂),我们大致熟悉一下我们常用的CMake的语法:
· cmake_minimum_required:需要的CMake的最低版本
· project():包的名称
· find_package() 查找建构是需要的其他 CMake/Catkin 包· add_message_files() add_service_files() add_action_files 生成Message/Service/Action
· generate_messages() 调用消息生成
· catkin_package() 指定包的构建信息
· add_library()/add_executable()/target_link_libraries() 用于构建的库,可执行代码
· install() 安装规则
使用Husky模拟器来实践ROS编程,Husky本身是一种小型的轮式移动机器人(和我们关注的无人车比较相似),该模拟器基于Gazebo物理仿真环境,Gazebo是一款机器人仿真软件,基于ODE物理引擎,可以模拟机器人以及环境中的很多物理特性,Husky模拟器的安装请参考:http://wiki.ros.org/husky_gazebo/Tutorials/Simulating%20Husky
如果ros kinetic使用apt安装存在问题的话,请参考:
https://answers.ros.org/question/256756/how-to-install-husky-simulator-in-kinetic/
使用roslaunch启动husky模拟器,启动一个空的世界:
roslaunch husky_gazebo husky_empty_world.launch
roslaunch是ROS中启动多个节点的机制,Launch文件是ROS提供的可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,以.launch结尾。
在运行了模拟器以后使用rqt_graph查看正在运行的节点和话题:
我们发现/gazebo节点订阅了一个/cmd_vel话题,使用rostopic info /husky_velocity_controller/cmd_vel 查看话题信息,得到如下信息:
Type: geometry_msgs/Twist
Publishers: * /twist_mux (http://adam:40181/)
Subscribers: * /gazebo (http://adam:35678/)
也就是说,这个控制指令是一个geometry_msgs/Twist消息,ROS中我们使用geometry_msgs/Twist消息类型来发布运动命令。控制命令会被基本的控制器节点使用。话题 /cmd_vel 全名 ” command velocities “ 。控制器节点订阅 /cmd_vel 话题,并将里面的运动命令(Twist 消息)通过 PID 控制算法转换成电机信号。使用osmsg show geometry_msgs/Twist查看消息的格式:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64
zgeometry_msgs/Vector3
angular
float64 x
float64 y
float64 z
其中,linear表示线速度(单位:m/s) ;angular表示角速度(单位:rad/s) 。
下面我们在指令行中通过向/husky_velocity_controller/cmd_vel发送Twist消息来驱动我们的小车,我们让它以0.2m/s的速度和0.2rad/s的角速度运动:
rostopic pub -r 10 /husky_velocity_controller/cmd_vel geometry_msgs/Twist '{linear: {x: 4, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
其实我们还可以直接向/cmd_vel主题发消息来控制小车(不信的话可以试试rostopic info /cmd_vel看看订阅它的节点)
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 4, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
接下来我们使用手柄来控制Husky机器人,我们使用teleop_twist_joy包来实现对手柄数据转换为Twist指令并将Twist发布到/cmd_vel主题,启动teleop_twist_joy下的launch文件:roslaunch teleop_twist_joy teleop.launch
下面的NODES表示启动了joy_node和teleop_node两个节点,它们分别位于joy和teleop_twist_joy两个包中,上面是启动文件的参数信息,我们着重看一下三个参数:
* /teleop_twist_joy/axis_angular: 0
* /teleop_twist_joy/axis_linear: 1
* /teleop_twist_joy/enable_button: 8
其中enable_button表示必须要按下该按键(8号按键,在我的手柄上是back键)才能控制,前面两个分别表示控制速度和角速度的按钮(在我的手柄上是左摇杆)Note: Husky作为一种轮式机器人,其能够控制的速度只有x方向的速度(前向)和z方向的角速度(Yaw,偏航角速度)
我们看一下此时的rqt_graph::
参考:https://blog.csdn.net/AdamShan/article/details/79653378