zoukankan      html  css  js  c++  java
  • ROS之初见Hello World

    前言

    最近在玩ROS,笔记中断了一段时间。

    ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。

    咱先抛开机器人不谈,ROS的设计思路还是值得学习的,它内部的最小运行单位是节点(node),运行时,启动很多节点,每个节点完成一种特定的功能,且每个节点直接可以通信。相似功能的节点组成一个包(package)。从原理上讲,一个节点就是一个进程,多个节点的通信就是进程间的通信,而ROS中的进程间通信不是传统服务器中的管道、消息队列这些,而是基于TCP/IP协议的通信。

    ROS框架中的进程间通信的方式有多种,像发布-订阅者模式和流行的开源中间件是一样的,其底层协议也是TCP和RPC,这个在后面文章中会详细说明。

    先来熟悉一下ROS,就先从Hello World开始吧!!!

    1、创建工作空间

    在需要防止代码的地方打开命令行

    #新建工作空间文件夹
    mkdir catkin_ws && cd catkin_ws
    #新建src文件夹
    mkdir src
    #初始化src目录,生成CMakeLists.txt,为功能包编译配置
    cd src
    catkin_init_workspace
    

    这时候src目录下会出现CMakeLists.txt,指令提示如下:

    Creating symlink "/home/eco/project/MyCode/test_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
    

    可知,这个CMakeLists.txt只是一个ROS库中的链接,后面不要更改它

    #回到工作空间,并对工作空间进行一次编译
    cd ..
    catkin_make
    

    这时候,工作区下面会出现 builddevel 两个文件夹以及 .catkin_workspace 文件

    #配置环境变量,使新建的工作空间可用
    source devel/setup.bash
    #查看配置的变量
    echo $ROS_PACKAGE_PATH
    

    到此,一个新的ROS工作空间已经创建完成

    一个工作空间可以包含多个功能包,所有的功能包都在工作空间的src目录下

    2、创建功能包

    现在,我们想创建一个功能包,名称是 hello_world

    #到工作空间的src目录下创建功能包
    cd src
    catkin_create_pkg hello_world
    

    这时,工作空间的 src 目录下出现 hello_world 文件夹,这个名称就是功能包的名称及其唯一标志符,功能包创建完成

    3、编写功能包源代码

    本次,我们编写一个能打印 hello world 的程序

    我们在功能包的目录新建一个 src 文件夹,用于存放C++的源代码,这个不是必须的,但是出于规范考虑,最好这样做,便于组织代码结构

    cd hello_world
    mkdir src && cd src
    #创建代码文件
    touch my_hello_world_node.cpp
    

    在 my_hello_world_node.cpp 中编写代码

    #include "ros/ros.h"
    //ros.h是ROS提供的C++客户端库,后面需要在编译配置中添加依赖库roscpp
     
    int main(int argc,char **argv) 
    {
        //初始化ros节点并知名节点名称
        //程序运行后,ros的计算图中被注册为hello_node名称标识的节点
      	ros::init(argc,argv,"hello_node");
        //声明一个ros节点句柄,初始化ros节点必须的
      	ros::NodeHandle nh;
        //ROS_INFO_STREAM是roscpp库中的打印信息方法,这里打印一个字符串
      	ROS_INFO_STREAM("hello world!!!");
    }
    

    4、功能包编译配置

    这时候的工作空间是有两个 CMakeLists.txt 的,工作空间下的是链接,不要更改,修改功能包中的CMakeLists.txt,本次修改的内容有下面几种

    4.1、添加依赖项

    因为代码中用到了 ros/ros.h ,因此需要 roscpp 库

    find_package(catkin REQUIRED COMPONENTS roscpp)
    
    include_directories(
    # include
     ${catkin_INCLUDE_DIRS}
    )
    

    修改功能包目录下的 package.xml 文件,找到 <buildtool_depend>catkin</buildtool_depend>,并在下面添加内容:

    <build_depend>roscpp</build_depend>
    <build_export_depend>roscpp</build_export_depend>
    <exec_depend>roscpp</exec_depend>
    

    4.2、声明可执行文件

    add_executable(my_hello_world_node src/my_hello_world_node.cpp)
    #链接时需要链接哪些库,在find_package中定义
    target_link_libraries(my_hello_world_node ${catkin_LIBRARIES})
    

    至此,功能包的编译配置完成

    5、功能包编译

    前面说过,一个工作空间可以有多个功能包,因此编译功能包有两种方式:

    1. 编译工作空间内的所有功能包;
    2. 编译工作空间内的指定功能包;

    5.1、编译所有功能包

    cd ~/project/catkin_ws/
    catkin_make
    

    5.2、编译指定功能包

    使用 DCATKIN_WHITELIST_PACKAGES 参数指定

    cd ~/project/catkin_ws
    catkin_make -DCATKIN_WHITELIST_PACKAGES="hello_world"
    

    6、功能包启动运行

    先启动ROS节点管理器,这个是所有节点运行的基础

    roscore
    

    然后激活工作空间

    cd ~/project/catkin_ws
    source devel/setup.bash
    

    最后启动功能包中的节点

    rosrun hello_world my_hello_world_node
    

    rosrun 指令的第一个参数是功能包名,第二个参数是需要启动的节点名

    输出

    [ INFO] [1620370500.474021642]: hello world!!!
    

    到此,第一个程序完成,后面会继续学习ROS和C++,并深入框架层面,研究其原理。

  • 相关阅读:
    二叉搜索树
    splay模板
    树状数组模板
    K尾相等数
    寻找最大数
    布线问题(最小生成树)
    开心的小明
    独木舟上的旅行(二)
    The Triangle(记忆化搜索)
    喷水装置(二)
  • 原文地址:https://www.cnblogs.com/sherlock-lin/p/14797629.html
Copyright © 2011-2022 走看看