ROS1入门2---Topic(发布 订阅 话题 c++)

ROS1(Robot Operating System) 入门学习笔记

        Ubuntu 18.04

        ROS melodic 1.14.13

        环境变量添加 详见:ROS1入门1---工作空间与功能包

进入上一篇文章中创建的 ROS1_Learn/src/topic_pkg/src 路径

ROS1入门1---工作空间与功能包

一.话题

在 ROS1_Learn/src/topic_pkg 下新建文件夹 msg

进入msg文件夹

touch topic.msg

ROS1入门2---Topic(发布 订阅 话题 c++)_第1张图片

 打开topic.msg

输入

string value0
uint8  value1
uint8  value2

uint8 num0 = 0
uint8 num1 = 1
uint8 num2 = 2

保存并退出

打开package.xml

message_generation
message_runtime
ROS1入门2---Topic(发布 订阅 话题 c++)_第2张图片
打开 CMakeLists.txt
message_generation
ROS1入门2---Topic(发布 订阅 话题 c++)_第3张图片
message_runtime
ROS1入门2---Topic(发布 订阅 话题 c++)_第4张图片

add_message_files(FILES topic.msg)

generate_messages(DEPENDENCIES std_msgs)
ROS1入门2---Topic(发布 订阅 话题 c++)_第5张图片

 

返回 工作空间 根目录 进行编译

catkin_make 

编译成功后 可以在 ./ROS1_Learn/devel/include/topic_pkg 下找到 topic.h

成功添加话题

ROS1入门2---Topic(发布 订阅 话题 c++)_第6张图片

 

二.发布与订阅

 回到ROS1_Learn/src/topic_pkg/src

         创建以下2个.cpp文件

         publish.cpp

         subscribe.cpp

         touch 文件名.cpp

publish.cpp 文件内容如下

#include  
#include  "topic_pkg/topic.h"

int main(int argc, char **argv)
{
  //初始化一个名为 topic_publisher 的ros节点
  ros::init(argc, argv, "topic_publisher");
  ros::NodeHandle n;
    // 创建一个Publisher,发布名为/my_info的topic,消息类型为topic_pkg::topic,队列长度10
  ros::Publisher my_info_pub = n.advertise("/my_info" ,10 );
  ros::Rate loop_rate(1);
  int  count = 0;
  while(ros::ok())
  {
    // 初始化topic_pkg::topic类型的消息
    topic_pkg::topic my_msg;
    my_msg.value0 = "my_msg";
    my_msg.value1 =  37;
    my_msg.value2 =  topic_pkg::topic::num2;

    my_info_pub.publish(my_msg);
    
    ROS_INFO("Topic_INFO: value0: %s value1 :%d value2: %d ", my_msg.value0.c_str(), my_msg.value1, my_msg.value2 );
    
    loop_rate.sleep();
  }
  return 0;
}

 subscribe.cpp 内容如下

#include  
#include  "topic_pkg/topic.h"

//回调函数
void my_callback(const topic_pkg::topic::ConstPtr& msg)
{
    ROS_INFO("TOPIC: value0 : %s value1:%d value2:%d",msg->value0.c_str(),msg->value1,msg->value2);
}

int main(int argc, char **argv)
{
    // 初始化一个 名为 my_subscribe 的ROS节点
    ros::init(argc, argv, "my_subscribe");
    ros::NodeHandle n;
    // 创建一个Subscriber,订阅名为/my_info的topic,回调函数my_callback
    ros::Subscriber sub = n.subscribe("/my_info", 10, my_callback);
    ros::spin();
    return 0;
}

将以下 添加到 CMakeLists.txt

add_executable(subscribe src/subscribe.cpp)
target_link_libraries(subscribe ${catkin_LIBRARIES})
add_dependencies(subscribe ${PROJECT_NAME}_generate_messages_cpp)

add_executable(publish src/publish.cpp)
target_link_libraries(publish ${catkin_LIBRARIES})
add_dependencies(publish ${PROJECT_NAME}_generate_messages_cpp)+

ROS1入门2---Topic(发布 订阅 话题 c++)_第7张图片

回到根目录 编译

catkin_make

然后打开三个终端分别输入

roscore

rosrun topic_pkg publish

rosrun topic_pkg subscribe

ROS1入门2---Topic(发布 订阅 话题 c++)_第8张图片

左边是订阅 右边是发布 

你可能感兴趣的:(ROS1学习笔记,机器人,c++)