ROS实践(6)-自建示例

2023-05-16

一 单topic


1 初始化环境

创建路径~/dev/mytest,并加入环境变量:

root@yangkai04-Inspiron-3650:~/dev# pwd
/root/dev

vim ~/.bashrc
export ROS_PACKAGE_PATH=~/dev/mytest:~/dev/rosbook:/opt/ros/indigo/share:/opt/ros/indigo/stacks

2 建功能包

在路径~/dev/mytest下创建包:

root@yangkai04-Inspiron-3650:~/dev/mytest# roscreate-pkg send_and_recv std_msgs roscpp
Created package directory /root/dev/mytest/send_and_recv
Created include directory /root/dev/mytest/send_and_recv/include/send_and_recv
Created cpp source directory /root/dev/mytest/send_and_recv/src
Created package file /root/dev/mytest/send_and_recv/Makefile
Created package file /root/dev/mytest/send_and_recv/manifest.xml
Created package file /root/dev/mytest/send_and_recv/CMakeLists.txt
Created package file /root/dev/mytest/send_and_recv/mainpage.dox

Please edit send_and_recv/manifest.xml and mainpage.dox to finish creating your package
root@yangkai04-Inspiron-3650:~/dev/mytest# rospack find send_and_recv
/root/dev/mytest/send_and_recv

root@yangkai04-Inspiron-3650:~# roscd send_and_recv
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# ls
CMakeLists.txt  include  mainpage.dox  Makefile  manifest.xml  src

3 创建节点

创建src/send.cpp文件:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv) {
  ros::init(argc, argv, "send");
  ros::NodeHandle n;
  ros::Publisher pub = n.advertise<std_msgs::String>("mine_topic1", 1000);
  ros::Rate loop_rate(10);
  while (ros::ok()) {
    std_msgs::String msg;
    std::stringstream ss;
    ss << " I am the example1_a node ";
    msg.data = ss.str();
    //ROS_INFO("%s", msg.data.c_str());
    pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

创建src/recv.cpp文件:

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

void messageCallback(const std_msgs::String::ConstPtr& msg) {  
  ROS_INFO("I heard: [%s]", msg->data.c_str());  
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "recv");  
  ros::NodeHandle n;  
  ros::Subscriber sub = n.subscribe("mine_topic1", 1000, messageCallback);  
  ros::spin();  
  return 0;  
}

修改CMakeLists.txt文件:

rosbuild_add_executable(send src/send.cpp)
rosbuild_add_executable(recv src/recv.cpp)

4 编译

root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# rosmake send_and_recv

[ rosmake ] Results:                                                            
[ rosmake ] Built 23 packages with 0 failures.                                  
[ rosmake ] Summary output to directory                                         
[ rosmake ] /root/.ros/rosmake/rosmake_output-20161207-193309

5 启动

启动master: roscore

启动测试发送节点:rosrun send_and_recv send

启动测试接收节点:rosrun send_and_recv recv


二 多topic

修改src/send.cpp文件:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv) {
  ros::init(argc, argv, "send");
  ros::NodeHandle n;
  ros::Publisher pub1 = n.advertise<std_msgs::String>("mine_topic1", 1000);
  ros::Publisher pub2 = n.advertise<std_msgs::String>("mine_topic2", 1000);
  ros::Rate loop_rate(10);
  while (ros::ok()) {
    std_msgs::String msg1;
    std::stringstream ss1;
    ss1 << " I am the node 1";
    msg1.data = ss1.str();
    pub1.publish(msg1);
    //ROS_INFO("%s", msg1.data.c_str());
    std_msgs::String msg2;
    std::stringstream ss2;
    ss2 << " I am the node 2";
    msg2.data = ss2.str();
    pub2.publish(msg2);
    //ROS_INFO("%s", msg2.data.c_str());
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

修改src/recv.cpp文件:

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

void messageCallback(const std_msgs::String::ConstPtr& msg) {  
  ROS_INFO("I heard: [%s]", msg->data.c_str());  
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "recv");  
  ros::NodeHandle n;  
  ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback);  
  ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback);  
  ros::spin();  
  return 0;  
}


三 异步多线程


修改src/recv.cpp文件:

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

void messageCallback(const std_msgs::String::ConstPtr& msg) {
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "recv");
  ros::NodeHandle n;
  ros::AsyncSpinner spinner(4);
  spinner.start();
  ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback);
  ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback);
  ros::waitForShutdown();
  //ros::spin();  
  return 0;
}

四 rqt_console

原来叫rxconsole,现在叫rqt_console。启动所有节点,roscore,rosrun pkgname  nodename,然后命令行输入rqt_console:




五 rqt_graph

rxgraph改名rqt_graph



六 launch文件


root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# mkdir launch -p
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# vim launch/send_and_recv.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <!-- Logger config -->
  <!-- <env name="ROSCONSOLE_CONFIG_FILE"  
       value="$(find chapter3_tutorials)/config/chapter3_tutorials.config"/> -->
  <!-- Example 1 -->
  <node pkg="send_and_recv" type="send" name="send"  
        output="screen"/>
  <node pkg="send_and_recv" type="recv" name="recv"  
        output="screen"/>
</launch>

root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# roslaunch send_and_recv send_and_recv.launch

CTRL+C


七 roswtf

root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# roswtf
Loaded plugin tf.tfwtf
Package: send_and_recv
================================================================================
Static checks summary:

No errors or warnings
================================================================================
Beginning tests of your ROS graph. These may take awhile...
analyzing graph...
... done analyzing graph
running graph rules...
... done running graph rules

Online checks summary:

Found 1 warning(s).
Warnings are things that may be just fine, but are sometimes at fault

WARNING The following node subscriptions are unconnected:
 * /rosout:
   * /rosout


八 rqt_plot

rxplot改名为rqt_plot,可以针对topic中的标量或矢量数据进行绘图,我们修改上面程序中topic1数据类型为Int32

src/send.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Int32.h"
#include <sstream>

int main(int argc, char **argv) {
  ros::init(argc, argv, "send");
  ros::NodeHandle n;
  ros::Publisher pub1 = n.advertise<std_msgs::Int32>("mine_topic1", 1000);
  ros::Publisher pub2 = n.advertise<std_msgs::String>("mine_topic2", 1000);
  ros::Rate loop_rate(10);
  std_msgs::Int32 num;
  num.data = 0;
  while (ros::ok()) {
    std_msgs::Int32 msg1 = num;
    num.data++;
    pub1.publish(msg1);
    //ROS_INFO("%s", msg1.data.c_str());
    std_msgs::String msg2;
    std::stringstream ss2;
    ss2 << " I am the node 2";
    msg2.data = ss2.str();
    pub2.publish(msg2);
    //ROS_INFO("%s", msg2.data.c_str());
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}


src/recv.cpp

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

void messageCallback1(const std_msgs::Int32::ConstPtr& msg) {  
  ROS_INFO("I heard: [%d]", msg->data);  
}

void messageCallback2(const std_msgs::String::ConstPtr& msg) {  
  ROS_INFO("I heard: [%s]", msg->data.c_str());  
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "recv");  
  ros::NodeHandle n;  
  ros::AsyncSpinner spinner(4);
  spinner.start();
  ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback1);  
  ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback2);  
  ros::waitForShutdown();
  //ros::spin();  
  return 0;  
}

运行rqt_plot,选择mine_topic1:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS实践(6)-自建示例 的相关文章

  • xilinx fpga xdma

    一 下载XDMA文件 输入命令 sudo git clone https github com Xilinx dma ip drivers 二 编译文件 进入xdma文件夹 xff1a cd dma ip drivers XDMA linu

随机推荐

  • 网络通信原理及流程

    网络通信原理 1 1 互联网的本质就是一系列的网络协议 一台硬设有了操作系统 xff0c 然后装上软件你就可以正常使用了 xff0c 然而你也只能自己使用像这样 xff0c 每个人都拥有一台自己的机器 xff0c 然而彼此孤立吗 xff0c
  • LTE核心网介绍

    1 LTE网络架构 EPS包括核心网EPC xff08 EPC又包括MME xff08 信令处理部分 xff09 S GW xff08 数据处理部分 xff09 P GW xff09 E UTRAN xff08 只包含基站eNodeB一个网
  • FreeRTOS启动第一个任务和任务的切换(Cortex-M4)

    调度器是FreeRTOS操作系统的核心 xff0c 主要负责任务切换 xff0c 即在就绪任务中找出最高优先级的任务 xff0c 并使之获得CPU运行权 调度器并非自动运行的 xff0c 需要人为启动它 API函数vTaskStartSch
  • 1G~5G 网络结构演进过程

    无线接入网 xff1a 负责接收用户终端的无线信号 xff0c 由此接入到通信网络 xff1b 核心网 xff1a 对用户数据的管理及具体业务处理 xff0c 并作为承载网络提供到外部网络的接口 1 GSM网络结构 xff08 2G xff
  • 1G-5G 基站架构演进

    1 2G 2G通信系统采用3级网络架构 xff0c 即 xff1a BTS BSC 核心网 2G核心网同时包含CS域和PS域 2G通信系统起初主要采用一体式基站架构 一体式基站架构如下图所示 xff0c 基站的天线位于铁塔上 xff0c 其
  • NTP服务器

    1 NTP服务器 NTP协议是网络时间协议 Network Time Protocol xff0c 它是用来同步网络中各个计算机的时间的协议 它的用途是把计算机的时钟同步到世界协调时UTC xff0c 其精度在局域网内可达0 1ms xff
  • 对视频图像进行OSD叠加

    频叠加就是将图片和文字信息叠加到视频信号中 xff0c 如电视台的LOGO xff0c 电影的字幕 xff0c 电视机的菜单 xff0c 都是通过视频叠加的形式显示在视频图像中的 区别于用于专业影视编辑行业的字幕叠加器 xff0c 字符叠加
  • H.264编码四种画质级别

    H 264编码四种画质级别 D1是数字电视系统显示格式的标准 xff0c 共分为以下 5 种规格 xff1a D1 xff1a 480i 格式 xff08 525i xff09 xff1a 720 480 xff08 水平 480 线 xf
  • I 帧时间间隔

    GOP xff08 Group of Pictures xff09 策略 影响编码质量 xff1a 所谓GOP xff0c 意思是画面组 xff0c 一个GOP就是一组连续的画面 MPEG编码将 画面 xff08 即帧 xff09 分为I
  • 吴恩达推荐点赞的深度学习专项课程精炼图笔记丨附下载)

    金猿奖 2019年度征集评选 大数据产业创新服务媒体
  • petalinux 2020.2 离线编译

    链接 xff1a https www xilinx com support download index html content xilinx en downloadNav embedded design tools html 2 在ub
  • qemu镜像转化

    qemu img convert f raw redhat6 7 kvm postgresql9 2 3 8disk pulsar2 2 O qcow2 redhat6 7 kvm postgresql9 2 3 8disk pulsar2
  • brew install 慢的解决方法

    brew install 慢的原因 brew install 会先去执行 brew update 而 brew update xff0c 会依次更新 brew homebrew core homebrew cask 而以上三个的来源都在 g
  • 在linux ubuntu18.04版本中安装ceres solver

    在linux ubuntu18 04版本中安装ceres solver 本文是参照ceres solver的官方网站的按照教程来写的 xff0c 并对其做了适当的修改以便能成功安装 ceres官方教程链接为http www ceres so
  • KITTI Odometry dataset中00-21系列的相机内参设置

    一些声明 见data odometry calib文件夹中的calib txt文件 xff0c 其中P0表示左边灰度相机的3 4内参矩阵 xff0c P1表示右边灰度相机的3 4内参矩阵 依据这两个矩阵 xff0c 求解 f x f x f
  • CMakeLists.txt模板+常用库头文件添加和库文件链接+调用头文件

    CMakeLists txt模板 声明要求的cmake最低版本 span class token function cmake minimum required span span class token punctuation span
  • CLion 乱码 中文编码设置(UTF8、GBK)(Windows、WSL)——持续更新ing

    目录 问题描述解决方案一 xff1a CLion的简单设置见证奇迹 博主使用CLion如果里面有中文经常会遇到输出乱码问题 xff0c 本篇博文将告诉你多种问题的解决方案 问题描述 我们新建一个CLion工程 xff1a span clas
  • GRUB(bootloader)

    GRUB grub legacy版本 grub 0 x xff1a grub legacy Centos 5 6 stage2及内核等通常放置于一个基本磁盘分区 boot分区 配置文件 xff1a boot grub grub conf g
  • ROS实践(1)-环境搭建

    一 介绍 ROS官网 xff1a http www ros org ROS中文社区 xff1a http www robotos net forum php ROS版本 xff1a ROS的版本名称是按字母顺序E F G H I J排列的
  • ROS实践(6)-自建示例

    一 单topic 1 初始化环境 创建路径 dev mytest xff0c 并加入环境变量 xff1a root 64 yangkai04 Inspiron 3650 dev pwd root dev vim bashrc export