ROS系统初探


#引言
对于一个新概念理解的三部曲:

  • 什么是ROS
  • 为何要用ROS,或者说ROS能用来作什么
  • 怎么来学习ROS

什么是ROS
ros就是一个分布式操做系统,经过节点node,主题topic,服务service等进行通讯和控制。
这个机制就比如 两我的聊天微信,每一个人都是一个节点node,微信这个软件的聊天功能就是Topic,两我的只有都经过微信才能聊天,若是一我的用whatsup,另外一我的用微信,是收不到对方信息的。 而service就比如表情包或者微信朋友圈,两我的在聊天的同时也能够本身搞搞有趣的东西即Service,可是不必定非要经过微信的聊天功能即Topic。
因此学好ROS就是不断的了解这种通讯和交流的机制,而后应用在本身的项目上就行了。html

为何要用ROS,ROS能用来作什么
机器人/仿真/3D重建/嵌入式等
三维重建/室内导航与重建/PCL与opencv/仿真与人机协做等
ME research是无gps下,在弱光状况仍能够自主飞行的无人机。主要用到ros的地方有:
传感器信息读取
避障算法的开发
避障算法能够本身在ros的gazebo里创建物理模型来进行测试
传感器信息融合(EKU UKF data fusion)
速度感知器的开发和测试(velocity estimator)和motion capture系统的对接
实验数据的监控node

参考文章:python

ROS初探总结 25篇c++

机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)by Top Liugit

ROS Tutorials官方例子web

创客智造 ROS入门整理算法

搭建stm32底盘的ros小车编程

ROS industrial
ROS应用篇小程序

  1. 学习Python语言及ROS开发
    网址:http://www.ncnynl.com/category/Python/
    网址:http://www.ncnynl.com/category/ros-python/
    做用:了解Python语言并如何开发ROS程序
  2. 学习C++语言及ROS开发
    网址:http://www.ncnynl.com/category/cplusplus/
    网站:http://www.ncnynl.com/category/roscpp/
    做用:了解C++语言并如何开发ROS程序
  3. 学习SLAM相关
    网址:http://www.ncnynl.com/category/ros-rgbd/
    网址:http://www.ncnynl.com/category/ros-laser/
    网址:http://www.ncnynl.com/category/ros-slam/
    网址:http://www.ncnynl.com/category/rgbd-slam/
    做用:了解如何结合各类传感器实现SLAM
  4. 学习无人机相关
    网址:http://www.ncnynl.com/category/ros-ardrone/
    网址:http://www.ncnynl.com/category/ros-bebop/
    做用:了解如何经过ROS控制无人机
  5. 学习机械臂相关
    网址:http://www.ncnynl.com/category/turtlebot-arm/
    网址:http://www.ncnynl.com/category/ros-moveit/
    做用:了解如何经过ROS控制机械臂

参考书
《 Programming Robots with ROS: A Practical Introduction to the Robot Operating System 》-Morgan Quigley, Brian Gerkey, William D. Smartvim

《A Mathematical Introduction to Robotic Manipulation》 Richard M. Murray,Zexiang Li,S.Shankar Sastry _介绍机器人控制理论的基础介绍类书籍。ROS做为一个平台,自己很容易上手,难的是于对机器人控制的算法的应用。

《C++ primer》 廖雪峰老师的教程 Python 2.7教程 ROS的编程语言基本都是基于C++和Python的
这里写图片描述
这里写图片描述


ROS ERROR

#实验平台
Linux系统:Ubuntu14.04
ROS版本 : indigo


#ROS 安装
详细步骤能够参考 《机器人操做系统(ROS)浅析》第二章,写的很是详细。
安装–>配置rosdep–>配置环境变量–>验证


#ROS基本概念与操做

packages

ROS 软件包一组用于实现特定功能的相关文件的集合,包括可执行文件和其余支持文件。
在 ROS 中,全部软件都被组织为软件包的形式
好比 turtlesim 包就包含turtlesim_node 和turtle_teleop_key> 可执行文件,固然还有一些其余的可执行文件和配置文件。

rospack list     //系统中已安装ROS软件包列表
rospack find package-name // 查找软件包的目录
rosls package-name		//查找软件包目录下的文件
roscd package-name      //切换到软件包的目录之下
sudo apt-get install ros-indigo-PACKAGE_name //安装新的package
eg: sudo apt-get install ros-indigo-slam-gmapping
//apt-cache search ros-indigo  //查找可用package

The Master

在ROS系统中,多个相对独立的节点(小程序)可以同时运行,而节点管理器是实现节点间通讯的关键部分。
大多数 ROS> 节点在启动时链接到节点管理器上。

roscore   //	启动节点管理器

Node

节点是各自独立的可执行文件,在ROS程序的运行实例被称为节点程序( node)
好比在 turtlesim例子中,就运行了 turtlesim功能包中的 turtlesim_node 节点程序和
turtle_teleop_key节点程序,两个节点相互独立,各执行各的。

rosrun package-name executable-name //运行节点
rosrun package-name executable-name __name:=node-name
//记得以前先配置环境变量,或者把setup.bash脚本写入 .bashrc文件里
source /opt/ros/indigo/setup.bash
source /home/hualong/ros/devel/setup.bash

rosnode info node-name  //打印节点信息

Topics and Messages

ROS节点之间进行通讯所利用消息传递,而消息被有组织地存放在话题里 .
消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所须要的一个或者多个话题。 ROS节点管理器负责确保发布节点和订阅节点能找到对方.

因此节点之间经过topic机制来通讯,topic机制是一个一对多的Publish/Subscribe 模式: 同一个话题也能够有不少个订阅者,它的底层传输依靠的是TCP/IP,也能够是UDP。topic具体传输的是message,具备必定的类型和数据结构,包括ROS提供的标准类型,和用户自定义类型。

这里写图片描述
如图 /teleop_turtle节点 和 /turtlesim节点 经过 Topic /turtle1/cmd_vel 来通讯。
/teleop_turtle 节点会以消息的形式将这些运动 控 制 命 令 发 布 到 话 题 /turtle1/cmd_vel;
turtlesim_node 节点订阅了该话题,所以它会接收到这个些消息,控制海龟按照该预约的速度移动。

#ROS编程初步上手

ROS 工做区目录结构

这里写图片描述

操做过程

这里写图片描述
一. 建立工做台

这里我是在用户主目录下建立了一个ros文件夹,这就是个人工做台,并建立了一个src子目录用于存放源码文件。

二.建立软件包

在src目录下 执行 catkin_creat_pkg package_name

三.编写和修改包内文件

  • 编写可执行文件 这个根据任务需求编写,语言格式能够是C++, python等
  • 修改配置文件 CMakeLists.txt   package.xml
  • 声明依赖库
    声明程序所依赖的其余功能包,以确保 catkin 可以向 c++编译器提供合适的标记来定位编译功能包所需的头文件和连接库。

1).操做 CMakeLists.txt 文件

原文件: find_package(catkin REQUIRED)
修改 find_package(catkin REQUIRED COMPONENTS package-names)
roscpp :提供了 ROS 的 C++客户端库
std_msgs : 提供ROS消息类型的库

2). 操做 package.xml 文件
原文件:在<buildtool_depend>catkin</buildtool_depend>
添加:
build_depend 编译依赖
run_depend 运行依赖
格式:
<build_depend>package_name</build_depend>
<run_depend>package_name</run_depend>
【通常是相对应CMakeLists.txt 中声明的库】
例如 添加
<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>


  • 声明可执行文件

这一步比较关键,由于最终运行的ROS节点程序就是这些可执行文件

3). 操做CMakeLists.txt 文件

在# add_executable(${PROJECT_NAME}_node src/agitr_node.cpp)下
//声明了咱们想要的可执行文件的文件名,以及生成此可执行文件所需的源文件列表
add_executable(executable-name source-files) // 如有多个source-files用空格隔开

在# target_link_libraries(${PROJECT_NAME}_node下方
//告诉 Cmake 当连接此可执行文件时,须要连接哪些库(就是上面的 find_package 中定义的)
target_link_libraries(executable-name ${catkin_LIBRARIES})

例如:
add_executable(hello hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})

add_executable(pub pub.cpp)
add_executable(sub sub.cpp)

target_link_libraries(pub ${catkin_LIBRARIES})
target_link_libraries(sub ${catkin_LIBRARIES})

四. 编译

在工做台ros目录下  catkin_make
设置环境变量  source devel/setup.bash
查看软件包    rospack list

五. 执行

启动终端 roscore
另外启动一个终端 先配置环境变量 再执行
sourc /home/hualong/ros/devel/setup.bash
run package_name node_name
能够查看执行图  rqt_graph

能够添加环境变量到 /home/user_name/.bashrc
vim /home/user_name/.bashrc 在低行添加sourc /home/hualong/ros/devel/setup.bash
echo “sourc /home/hualong/ros/devel/setup.bash” >> ~/.bashrc

操做实例

第一个hello_ros 软件包

测试发布和订阅的 pub_sub_test软件包