前言:本部分主要介绍ros一些基础功能的使用,包括创建和编译工作空间、功能包、节点以及话题。

第一种方式:使用roboware studio软件操作

1.1 创建工作空间

回车然后点击保存。

1.2 新建功能包

功能包名为:chapter2_tutorials std_msgs roscpp

注:chapter2_tutorials是功能包名,std_msgs 和roscpp是依赖。

1.3 新建源文件

在chapter2_tutorials包下的src中新建两个.cpp文件,分别命名为example1_a.cpp和example1_b.cpp。

注意新建cpp文件时选择第二项“加入到新的可执行文件中”,这样roboware就会自动修改cmake文件了。

example1_a.cpp的内容:

#include "ros/ros.h"   //包含了使用ros节点所有必要的文件
#include "std_msgs/String.h"  //包含了要使用的消息类型
#include <sstream>

 int main(int argc, char *argv[])
{
    ros::init(argc, argv, "example1_a");   //初始化节点并设置其名称,该名称是唯一的
    ros::NodeHandle n;   //进程处理程序
    ros::Publisher chatter_pub= n.advertise<std_msgs::String>();  //将该节点设置为发布者,话题为message,消息类型为std_msgs::String,缓存1000条信息
    ros::Rate loop_rate();      //发送频率为10HZ
    while (ros::ok())               //判断是否有节点运行
    {
        std_msgs::String msg;       //创建消息变量msg
        std::stringstream ss;       //创建一个字符串变量ss
        ss<< "I am the example1_a node";  //字符串ss的内容
        msg.data=ss.str();           //给msg赋值
        chatter_pub.publish(msg);    //发布者发送消息
        ros::spinOnce();             //运行主循环
        loop_rate.sleep();           //按照10HZDE频率将程序挂起
    }
    ;
}

example1_b.cpp的内容:

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)   //回调函数,当收到消息时调用此函数
{
  ROS_INFO("I [%s]",msg->data.c_str());   //输出信息,[%s]这里是小写s
}

 int main(int argc, char *argv[])
{
    /* code for main function */
    ros::init(argc, argv, "example1_b");
    ros::NodeHandle n;
    ros::Subscriber sub =n.subscribe(,chatterCallback);    //创建一个订阅者,处理信息的回调函数为chatterCallback
    ros::spin();
    ;
}

1.4 编译

1.5 运行

ctrl+` 呼出控制台;

添加源

echo "source ~/dev/catkin_ws/devel/setup.bash" >> ~/.bashrcsource devel/setup.bash

注:绿色修改为自己工作空间的位置。这句话也可以在home目录下ctrl+h显示隐藏文件,打开.bashrc,在最后一行找到或添加。

启动节点管理器

roscore

运行节点

rosrun chapter2_tutorials example1_a
rosrun chapter2_tutorials example1_b

-----------------------------------------------

输出如下:

----------------------------------------------------------------------------------------------------------------------------------------------------------------

第二种方式:使用命令行编写

2.1 创建和编译工作空间

2.1.1 查看正在使用的工作空间:

echo $ROS_PACKAGE_PATH

-----------------------------------------------

显示如下:

/opt/ros/kinetic/share

2.1.2 创建工作空间文件夹:

mkdir -p ~/dev/catkin_ws/src

-----------------------------------------------

其中:

mkdir是新建文件夹命令,-p是如果没有路径上的文件夹则新建文件夹,~是根目录。

2.1.3 初始化工作空间:

cd ~/dev/catkin_ws/src
catkin_init_workspace

-----------------------------------------------

显示如下:

Creating symlink "/home/cdq/dev/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"

2.1.4 编译工作空间

cd ~/dev/catkin_ws
catkin_make

-----------------------------------------------

最后显示如下:

####
#### Running command: "make -j4 -l4" in "/home/cdq/dev/catkin_ws/build"
####

2.1.5 加载setup.bash文件

source devel/setup.bash

2.2 创建和编译功能包

2.2.1 创建新功能包

cd ~/dev/catkin_ws/src
catkin_create_pkg chapter2_tutorials std_msgs roscpp

-----------------------------------------------

显示如下:

Created file chapter2_tutorials/CMakeLists.txt
Created file chapter2_tutorials/package.xml
Created folder chapter2_tutorials/include/chapter2_tutorials
Created folder chapter2_tutorials/src
Successfully created files in /home/cdq/dev/catkin_ws/src/chapter2_tutorials. Please adjust the values in package.xml.

-----------------------------------------------

其中:

catkin_create_pkg 是创建新功能包命令,chapter2_tutorials是功能包名称,std_msgs和roscpp是依赖项。

2.2.2 编译功能包

cd ~/dev/catkin_ws/
catkin_make

-----------------------------------------------

最后显示如下:

####
#### Running command: "make -j4 -l4" in "/home/cdq/dev/catkin_ws/build"
####

2.3 创建和编译节点

2.3.1 切换路径

roscd chapter2_tutorials/src

-----------------------------------------------

辨析:roscd和cd

roscd  直接加包名 例:roscd roscpp;

cd 加完整路径 例:cd /opt/ros/kinetic/share/roscpp

2.3.2 创建两个.cpp文件

在上一步的路径上建立(我是手动建立的)两个文件分别命名为example1_a.cpp和example1_b.cpp;

example1_a.cpp的内容:

#include "ros/ros.h"   //包含了使用ros节点所有必要的文件
#include "std_msgs/String.h"  //包含了要使用的消息类型
#include <sstream>

 int main(int argc, char *argv[])
{
    ros::init(argc, argv, "example1_a");   //初始化节点并设置其名称,该名称是唯一的
    ros::NodeHandle n;   //进程处理程序
    ros::Publisher chatter_pub= n.advertise<std_msgs::String>();  //将该节点设置为发布者,话题为message,消息类型为std_msgs::String,缓存1000条信息
    ros::Rate loop_rate();      //发送频率为10HZ
    while (ros::ok())               //判断是否有节点运行
    {
        std_msgs::String msg;       //创建消息变量msg
        std::stringstream ss;       //创建一个字符串变量ss
        ss<< "I am the example1_a node";  //字符串ss的内容
        msg.data=ss.str();           //给msg赋值
        chatter_pub.publish(msg);    //发布者发送消息
        ros::spinOnce();             //运行主循环
        loop_rate.sleep();           //按照10HZDE频率将程序挂起
    }
    ;
}

example1_b.cpp的内容:

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)   //回调函数,当收到消息时调用此函数
{
  ROS_INFO("I [%s]",msg->data.c_str());   //输出信息,[%s]这里是小写s
}

 int main(int argc, char *argv[])
{
    /* code for main function */
    ros::init(argc, argv, "example1_b");
    ros::NodeHandle n;
    ros::Subscriber sub =n.subscribe(,chatterCallback);    //创建一个订阅者,处理信息的回调函数为chatterCallback
    ros::spin();
    ;
}

2.3.3 修改CMakeLists.txt文件

打开chapter2_tutorials包下的CMakeLists.txt文件,将以下命令行复制到文件的末尾处:

add_executable(example1_a1 src/example1_a.cpp) #将example1_a.cpp文件编译成可执行文件example1_a1 
add_executable(example1_b1 src/example1_b.cpp)
target_link_libraries(example1_a1 ${catkin_LIBRARIES}) #为可执行文件example1_a1添加链接库
target_link_libraries(example1_b1 ${catkin_LIBRARIES})

注:此处有坑,可执行文件的名字(example1_a1 )不能和节点原文件名字(example1_a.cpp)相同,不知道为什么。但节点原文件名字和文件内部的节点名字可以相同。

2.3.4 编译文件

使用catkin_make工具来编译包和全部的节点:

cd ~/dev/vstkin_ws/
catkin_make --pkg chapter2_tutorials

2.4 运行节点

2.4.1 启动节点管理器

roscore

2.4.2 运行节点

rosrun chapter2_tutorials example1_a1
rosrun chapter2_tutorials example1_b1

注:若节点无法运行,每次开启节点前先在 ~/dev/catkin_ws/ 目录下执行命令行:source devel/setup.bash,或者一次性解决 ,输入指令  echo "source ~/dev/catkin_ws/devel/setup.bash" >> ~/.bashrc,红色部分为自己工作空间的名字。

-----------------------------------------------

输出如下:

-END-

ROS-节点-Topic的更多相关文章

  1. ROS 笔记 程序包/节点/topic

    官方教程: wiki.ros.org/cn/ROS/tutorials 程序包打创建于编译 创建程序包 在工作空间的src底下,输入如下命令: $ catkin_create_pkg 要创建的包名 依 ...

  2. 使用ROS节点(五)

    先启动roscore roscore 为了获取节点信息,可以使用rosnode命令 $ rosnode 获取得一个可接受参数清单

  3. ROS学习(七)—— 理解ROS Topic

    一.准备工作 1.打开roscore roscore 2.turtlesim 打开一个turtulesim节点 rosrun turtlesim turtlesim_node 3.turtle key ...

  4. ROS学习(六)—— 理解ROS节点

    一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...

  5. ROS学习笔记三(理解ROS节点)

    要求已经在Linux系统中安装一个学习用的ros软件包例子: sudo apt-get install ros-indigo-ros-tutorials ROS图形概念概述 nodes:节点,一个节点 ...

  6. ROS-4 : ROS节点和主题

    依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp.std_msgs.action ...

  7. 通过ros节点发布Twist Messages控制机器人--10

    原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 1.到目前为止,我们已经从命令行移动机器人,但大多数时间你将依靠一个ros节点发布适当的Twist消息. ...

  8. (五)ROS节点

    一. 理解ROS 节点: ROS的节点: 可以说是一个可运行的程序.当然这个程序可不简单.因为它可以接受来自ROS网络上其他可运行程序的输出信息,也可以发送信息给ROS网络,被其他 ROS 可运行程序 ...

  9. ROS节点理解--5

    理解 ROS节点(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程主要介绍 ROS 图(graph)概念 并讨 ...

  10. ROS Learning-007 beginner_Tutorials ROS节点

    ROS Indigo beginner_Tutorials-06 ROS节点 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...

随机推荐

  1. 用C#在Visual Studio写Javascript单元测试

    1.在vs创建一个标准的单元测试工程 2.引用nuget包:Edge.js 我是用的是6.11.2版本 3.编写JsRunner类 using EdgeJs; using System; using ...

  2. nodejs 文件操作模块 fs

    const fs=require("fs"); //文件操作 //创建目录 ./ 代表当前目录 ../ 代表上级目录fs.mkdir('./test',function(err){ ...

  3. js 算法排序总结

    1.冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i ...

  4. vivado2018.3 与 modelsim联合仿真

    我用的是目前最新版本的软件,vivado2018.3与modelsim10.6d.废话不多说,直接上操作 1.modelsim编译vivado库 1)双击启动vivado软件,如下图操作 2)Simu ...

  5. Pyspider爬虫简单框架——链家网

    pyspider 目录 pyspider简单介绍 pyspider的使用 实战 pyspider简单介绍 一个国人编写的强大的网络爬虫系统并带有强大的WebUI.采用Python语言编写,分布式架构, ...

  6. 【codeforces 776E】The Holmes Children

    [题目链接]:http://codeforces.com/contest/776/problem/E [题意] f(n)是小于n的不同整数对(x,y)这里x+y==n且gcd(x,y)==1的个数; ...

  7. 清北学堂模拟赛d4t4 a

    分析:感觉和dp的状态转移方式有点类似,对于一个数,你不能看有多少个状态能转移到它,你要看它能转移到多少个状态,相当于刷表法和填表法的区别,对于这道题也是一样,我们不能看有多少个数是x的倍数,而是每次 ...

  8. Grails用CONSOLE测试,比写集成测试还快

    一般,这个可以用过开发当中的脚本测试吧. 如果正规的开发流程里,集成测试显然可以作为报告提交,必不可少.

  9. H - Seek the Name, Seek the Fame

    The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the l ...

  10. js面向对象初步探究(上) js面向对象的5种写方法

    非常长一段时间看网上大神的JS代码特别吃力.那种面向对象的写法方式让人看得云里来雾里去.于是就研究了一下JS面向对象.因为是初学,就将自己在网上找到的资料整理一下,作为记忆. js面向对象的5种写方法 ...