ROS话题编程

1、talker节点

/**
 * 该例程将发布chatter话题,消息类型String
 * 发布float_message话题,消息类型Float32MultiArray
 */
 
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"

int main(int argc, char **argv)
{
  // ROS节点初始化
  ros::init(argc, argv, "talker");
  
  // 创建节点句柄
  ros::NodeHandle n1,n2,float_n;
  
  // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String  数据队列1000
  ros::Publisher chatter_pub1 = n1.advertise<std_msgs::String>("chatter1", 1000);
  ros::Publisher chatter_pub2 = n2.advertise<std_msgs::String>("chatter2", 1000);
  ros::Publisher float_pub = float_n.advertise<std_msgs::Float32MultiArray>("float_message", 1000);

  // 设置循环的频率 10Hz
  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
	// 初始化std_msgs::String类型的消息
    std_msgs::String msg1,msg2;
    std::stringstream ss1,ss2;
    std_msgs::Float32MultiArray float_message;
    float_message.data.resize(3);
    float_message.data[0] = 1;
    float_message.data[1] = 2;
    float_message.data[2] = 3;
    ss1 << "hello world " << count;
    ss2 << "HELLO WORLD " << count;
    msg1.data = ss1.str();
    msg2.data = ss2.str();

	// 发布消息
    ROS_INFO("%s", msg1.data.c_str());
    ROS_INFO("%s", msg2.data.c_str());
    chatter_pub1.publish(msg1);
    chatter_pub2.publish(msg2);
    float_pub.publish(float_message);

	// 循环等待回调函数
    ros::spinOnce();
	
	// 按照循环频率延时
    loop_rate.sleep();
    ++count;
  }

  return 0;
}

2、listener节点

/**
 * 该例程将订阅chatter话题,消息类型String
 * 订阅float_message话题,消息类型Float32MultiArray
 */
 
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"

// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback1(const std_msgs::String::ConstPtr& msg)
{
  // 将接收到的消息打印出来
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

void chatterCallback2(const std_msgs::String::ConstPtr& msg)
{
  // 将接收到的消息打印出来
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

void messageCallback(const std_msgs::Float32MultiArray::ConstPtr& msg)
{
  ROS_INFO("I heard float_message: [%f] [%f] [%f]", msg->data[0], msg->data[1], msg->data[2]);
}

int main(int argc, char **argv)
{
  // 初始化ROS节点
  ros::init(argc, argv, "listener");

  // 创建节点句柄
  ros::NodeHandle n1,n2,float_n;

  // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
  ros::Subscriber sub1 = n1.subscribe("chatter1", 1000, chatterCallback1);
  ros::Subscriber sub2 = n2.subscribe("chatter2", 1000, chatterCallback2);
  ros::Subscriber sub3 = float_n.subscribe("float_message", 1000, messageCallback);

  // 循环等待回调函数
  ros::spin();

  return 0;
}

3、float_message.msg文件

通过.msg文件定义float_message消息类型,在功能包目录下创建msg文件夹,在msg文件夹下创建float_message.msg文件

float64 A
float64 B
float64 C

4、CMakeList.txt文件

cmake_minimum_required(VERSION 2.8.3)
project(learn) #learn是功能功能包名,根据实际进行修改

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

## Generate messages in the 'msg' folder
 add_message_files(
   FILES
   float_message.msg
 )

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
   std_msgs
 )

## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learn_communication
 CATKIN_DEPENDS roscpp rospy std_msgs
  message_runtime
)

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

5、package.xml文件

cmake_minimum_required(VERSION 2.8.3)
project(learn) #learn是功能包名

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

## Generate messages in the 'msg' folder
 add_message_files(
   FILES
   float_message.msg
 )

## Generate added messages and services with any dependencies listed here
 generate_messages(
   DEPENDENCIES
   std_msgs
 )

## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learn_communication
 CATKIN_DEPENDS roscpp rospy std_msgs
  message_runtime
)

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值