ROS学习(-)基本概念+发布&订阅消息

来源:互联网 发布:陕西大数据集团官网 编辑:程序博客网 时间:2024/05/30 23:04

        发现以前学习东西总是将所需要的知识从书上、网上等各种途径拿到手用到自己所需要的地方,偶尔将其记录在笔记上没有将其公开,这样的坏处是没有经过自己的一个整理,没有对这个知识点的沉淀以及得到广大网友的验证以及批评指正。

        ROS机器人操作系统这几年开始变得流行,是一种用于机器人的开源次级操作系统,提供类似操作系统提供的功能,如硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理。但它更像是一个软件平台,在平台上方便做各种算法的设计开发。在老师和师兄的指导下开始了ROS的学习之路,开始对着《机器人操作系统(ROS)浅析》这本书将小乌龟跑了一遍。基本对节点、消息、话题、服务这些概念有所了解,以及对节点管理器、启动文件、编程方法等有所了解。

      

【几个概念】

1、功能包(package)

        它是一组用于实现特定功能的相关文件的集合,包括可执行文件和其他支持文件,其类似于我们用VS之类的IDE所创建的工程。通过catkin_create_pkg  package-name 所创建的包自动包含CMakeLists.txt和package.xml两个文件

2、节点管理器

        节点启动之前必须先打开节点管理器,否则将报错,如下。 

        启动节点管理器用如下命令

                      roscore

        不带任何参数, 使用Ctrl+c终止节点管理器

3、节点

        ros程序的运行实例。类似于运行的一个进程。

        节点的启动使用命令

        $ rosrun package-name  executable-name
        也可以在启动文件中一次启动多个节点

4、话题和消息

        ros各个节点之间的通信机制采用消息传递的形式。一个节点通过发布一种话题的消息供其它节点订阅。节点之间相互不知道消息来自于谁以及被谁订阅。他们之间的关系是多对多

5、服务

        相对于消息传递多对多的机制不适用于请求/回复的方式,ros提供一种一对一 的机制,即一个用于请求,一个用于回复

6、启动文件

        用于一次启动多个节点,启动文件必须依赖于编译后的包,当运行一个启动文件时,它会自动运行roscore 打开节点管理器。

 roslaunch 用于一次启动多个节点,但是文件×.launch必须依赖于功能包,即必须建立在包里面使用以下指令打开roslaunch package-name launch-file-name×.launch文件文件结构1 <launch>2 <node3 pkg="turtlesim " //包名4 type="turtlesim_node"//可执行文件名5 name="turtlesim "//节点名称6 respawn="true "  //请求复位。在某个节点因为软件崩溃或硬件故障以及其他原因导致过早退出系统的时候会起到作用。如关掉仿真窗口它会自己再打开7 />8 <node9 pkg="turtlesim "10 type="turtle_teleop_key"11 name="teleop_key"12 required="true "   //必要节点。(1)某个节点非常重要,此节点的故障会导致整个 ROS 会话的瘫痪; (2)节点即便设置了复位属性也不能很好地重启的时候,该需求属性的作用就会体现出来。13 launch −prefix="xterm −e"14 />15 <node16 pkg="agitr "17 type="subpose"18 name="pose_subscriber "19 output="screen "20 />21 </launch>参数<node8 pkg="agitr "9 type="pubvel_with_max"10 name="publish_velocity "11 >12 <param name="max_vel" value="3" />13 </node>


【一个简单例子】

运行环境:Ubuntu 14.04 LTS  +  ros indigo

1、创建工作空间

        $ mkdir workspace
2、在工作空间中创建包集目录src,这时候在workspace目录下使用命令

        $catkin_make
        将会出现devel和build两个文件夹,在相应文件夹下会自动生成一些编译后的相关文件。

3、进入src目录下,使用命令

        $catkin_create_pkg  package-name

        在src目录下创建 package-name 包(包名自取)。

         在本例中创建了一个包名为    beginner 

4、使用roscd或者cd命令进入 package-name 包,在包下创建相应的cpp文件。在本例中,记录发布和订阅消息,因此创建了talker.cpp和lisener.cpp两个cpp文件,使用vim工具可以较为方便地编写程序,自动缩进、颜色等。

在talker.cpp中输入如下代码

#include <ros/ros.h>#include "std_msgs/String.h"#include <iostream>#include <sstream>int main(int argc,char **argv){    ros::init(argc,argv,"talker");   //ros系统初始化,通过命令对名字进行重映射,节点名字在一个运行的系统中必须是唯一的    ros::NodeHandle nh;//创建一个句柄,并自动初始化    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000); //将std_msgs::String类型的消息发布给话题chatter,参数1000是消息队列的长度    ros::Rate rate(10);//指定自循环的频率  1/10    int count = 0;    while(ros::ok())  //当按下Ctrl+c命令时,返回false    {        std_msgs::String msg;        std::stringstream ss;        ss<< "Hello ROS!"<<count;        msg.data =ss.str();        ROS_INFO("%s",msg.data.c_str());        pub.publish(msg);        ros::spinOnce();        rate.sleep();        ++count;    }    return 0;}

在listener.cpp文件中添加如下代码

#include <ros/ros.h>#include "std_msgs/String.h"void chatcallback(const std_msgs::String::ConstPtr& msg)//回调函数{    ROS_INFO("I heared :[%s]",msg->data.c_str());}int main(int argc,char **argv){    ros::init(argc,argv,"listener");    ros::NodeHandle nh;    ros::Subscriber sub = nh.subscribe("chatter",1000,chatcallback);    ros::spin();    return 0;}

5、编译选项

        在CMakeLists.txt中

将第7行 

         find_package(catkin REQUIRED)

更改为

        find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)

       即将相应的依赖包添加进去

    在最后一行添加如下代码。 用于声明可执行文件,文件名分别为talk和listen

add_executable(talk talker.cpp)target_link_libraries(talk ${catkin_LIBRARIES})add_executable(listen listener.cpp)target_link_libraries(listen ${catkin_LIBRARIES})


        在package.xml中

在代码

<buildtool_depend>catkin</buildtool_depend>
后添加编译依赖项和运行依赖项,即将所用到的功能包包含进来

  <build_depend>std_msgs</build_depend>
  <run_depend>std_msgs</run_depend>

6、退回到工作空间目录下使用命令 $catkin_make  编译项目。

7、注册环境变量

source devel/setup.bash

如未注册即运行节点将报错找不到相应的包文件

在每个终端中只需要运行一次,即使重新编译后也一样。

7、刚刚已经生成了两个节点,可以通过一个节点一个节点打开的方式打开也可以利用启动文件一次打开多个节点的方法

        打开节点管理器

        $ roscore
        再打开一个终端或者标签页

         rosrun  beginner talk

         rosrun beginner listen

 

8、使用启动文件一次启动多个节点

编写启动文件beginner.launch,在该文件中添加如下代码

<launch><nodepkg = "beginner"type = "talker"name = "talker"output = "screen"/><nodepkg = "beginner"type = "listener"name = "listener"output = "screen"/></launch>

运行结果(未制定不同窗口):



至此,完成了基本的发布和订阅消息的编程。



参考文献:

《开源机器人操作系统》

《机器人操作系统(ros)浅析》

《ROS入门实例》

/×××××××××××××××××××××××××××××××××××××××××××××××××××××

欢迎批评指正,此为初衷

转载注明出处。

感谢关注


0 0
原创粉丝点击