一开始建立pkg:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
cd ~/catkin_ws/src
catkin_create_pkg pub_sub_test std_msgs rospy roscpp
cd ..
catkin_make

我们现在有两个自定义消息:
adm_lat.msg

uint8 Enable_lat
float32 GPS1_Curvature_cmd
float32 V_des
int8 Gear_des
uint8 End
uint8 Objectfalse
float32 obs_dis
float32 steering_wheel_angle
float32 lateral_offset

statemachine.msg

int8 route
int8 ADM_command
int8 parking_control
int8 DiveroffReq
int8 ADM_SubtaskState
int8 planning_control
int8 DC_command
int8 dischargeReq
uint8 ADM_ADSmode
float32 ADM_PosLon
float32 ADM_PosLat
uint8 ADM_Fuel_Signal

在determiner里面通过判断statemachine中的parking_control来确定发送什么样的adm_lat信号出去,如果是1就原封不动发出去,如不是,就发四个固定值出去。

首先虚拟两个talker,就是在虚拟发送上面说的两个msg
talker1


#include <ros/ros.h>      / /调用ros的C++接口;
#include <VehicleMsg/adm_lat.h> //调用自定义msg 产生的头文件
int main(int argc, char **argv)
{ros::init(argc, argv, "talker1"); //解析传入的ROS参数,定义节点名称ros::NodeHandle nh;               // 初始化节点,创建句柄对象(实例化)VehicleMsg::adm_lat msg;          //创建自定义gps消息,并初始化;//  创建publisher,消息类型:test_pkg::gps ,定义topic:"gps_info",消息队列的最大长   度为1,一般取一个比较小的值ros::Publisher pub = nh.advertise<VehicleMsg::adm_lat>("adm_info", 1);ros::Rate loop_rate(1.0); //定义发布频率,1HZwhile (ros::ok()){msg.Enable_lat = 0;msg.Gear_des = 0;msg.GPS1_Curvature_cmd = 0;msg.V_des = 123;ROS_INFO("talker1 online: %f", msg.V_des);pub.publish(msg);  //发布msgloop_rate.sleep(); //设置休眠;}return 0;
}

talker2

//消息发布节点:talker
//在 catkin_ws / src / test_pkg / src下,新建talker.cpp 文件:
#include <ros/ros.h>      / /调用ros的C++接口;
#include <StatemachineMsg/statemachine.h> //调用自定义msg 产生的头文件
int main(int argc, char **argv)
{ros::init(argc, argv, "talker2");  //解析传入的ROS参数,定义节点名称ros::NodeHandle nh;                // 初始化节点,创建句柄对象(实例化)StatemachineMsg::statemachine msg; //创建自定义gps消息,并初始化;//  创建publisher,消息类型:test_pkg::gps ,定义topic:"gps_info",消息队列的最大长   度为1,一般取一个比较小的值ros::Publisher pub = nh.advertise<StatemachineMsg::statemachine>("stateMachine_info", 1);ros::Rate loop_rate(1.0); //定义发布频率,1HZwhile (ros::ok()){//虚拟一个GPS位置信号msg.parking_control = 0;ROS_INFO("talker2 online: %f", msg.parking_control);pub.publish(msg);  //发布msgloop_rate.sleep(); //设置休眠;}return 0;
}

determiner.h

#ifndef PLANNER_DETERMINER_H
#define PLANNER_DETERMINER_H#include "ros/ros.h"
#include <std_msgs/UInt8.h>
#include <VehicleMsg/adm_lat.h>
#include <boost/bind.hpp>
#include <StatemachineMsg/statemachine.h>class planner_determiner
{private:ros::NodeHandle nh_;VehicleMsg::adm_lat final_amd_lat_msg_;ros::Publisher final_amd_lat_pub_;ros::Subscriber patrol_sub_;ros::Subscriber dwa_sub_;ros::Subscriber behavior_sub_;int Enable_lat_ = 0;int Gear_des_ = 2;int GPS1_Curvature_cmd_ = 4;int V_des_ = 10;int planner_state_ = 0;void get_patrol_amd_lat(const VehicleMsg::adm_lat patrol_amd_lat);void get_behavior_sys_cmd(const StatemachineMsg::statemachine behavior_sys_cmd);public:planner_determiner(ros::NodeHandle &node_handle);~planner_determiner();void publishPlannerCmd();
};planner_determiner::planner_determiner(ros::NodeHandle &node_handle) : nh_(node_handle)
{nh_ = node_handle;final_amd_lat_pub_ = nh_.advertise<VehicleMsg::adm_lat>("/AdmLatMsg", 1);patrol_sub_ = nh_.subscribe<VehicleMsg::adm_lat>("adm_info", 1, &planner_determiner::get_patrol_amd_lat, this);behavior_sub_ = nh_.subscribe<StatemachineMsg::statemachine>("stateMachine_info", 1, &planner_determiner::get_behavior_sys_cmd, this);
}planner_determiner::~planner_determiner()
{}void planner_determiner::get_behavior_sys_cmd(const StatemachineMsg::statemachine behavior_sys_cmd)
{planner_state_ = behavior_sys_cmd.parking_control;return;
}void planner_determiner::get_patrol_amd_lat(const VehicleMsg::adm_lat patrol_amd_lat)
{if (planner_state_ == 1){final_amd_lat_msg_.Enable_lat = patrol_amd_lat.Enable_lat;final_amd_lat_msg_.Gear_des = patrol_amd_lat.Gear_des;final_amd_lat_msg_.GPS1_Curvature_cmd = patrol_amd_lat.GPS1_Curvature_cmd;final_amd_lat_msg_.V_des = patrol_amd_lat.V_des;ROS_INFO("fouth numbers : %f", final_amd_lat_msg_.V_des);}else{final_amd_lat_msg_.Enable_lat = Enable_lat_;final_amd_lat_msg_.Gear_des = Gear_des_;final_amd_lat_msg_.GPS1_Curvature_cmd = GPS1_Curvature_cmd_;final_amd_lat_msg_.V_des = V_des_;ROS_INFO(VehicleMsg::adm_lat);ROS_INFO("the 4 numbers : %f  %f  %d  %d", final_amd_lat_msg_.Enable_lat,final_amd_lat_msg_.Gear_des,final_amd_lat_msg_.GPS1_Curvature_cmd,final_amd_lat_msg_.V_des);return;}
}void planner_determiner::publishPlannerCmd()
{final_amd_lat_pub_.publish(final_amd_lat_msg_);
}#endif

determiner.cpp

#include "ros/ros.h"
#include "planner_determiner.h"int main(int argc, char **argv)
{ros::init(argc, argv, "planner_determiner");ros::NodeHandle nh;planner_determiner pd(nh);ros::Rate loop_rate(10);while (ros::ok()){ros::spinOnce();pd.publishPlannerCmd();loop_rate.sleep();}return 0;
}

rosrun两个talker, 并rosrun determiner可以看到信息收发。以及rqt_graph可以看到。

cmakelist里面:

find_package(catkin REQUIRED COMPONENTSroscppstd_msgsVehicleMsgStatemachineMsg
message_generation
)add_executable(talker1 src/talker1.cpp)
add_executable(talker2 src/talker2.cpp)
add_executable(planner_determiner src/planner_determiner.cpp)add_dependencies(talker1  ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(talker2 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(planner_determiner ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})target_link_libraries(talker1 ${catkin_LIBRARIES})
target_link_libraries(talker2 ${catkin_LIBRARIES})
target_link_libraries(planner_determiner ${catkin_LIBRARIES})
)

ROS在类中发布和接受消息(自定义消息)相关推荐

  1. ROS在类中发布和接受消息(标准消息)

    作为模板写的时候方便查一下.本例生成两个节点talkerlisten1& 2, 互相接受对方消息,做了简单处理后在发出去.注意测试的时候先开B在开A. #include "ros/r ...

  2. ros系统支持java_创建一个rosjava package 并测试发布和接受消息

    一.rosjava package 结构和解析 Rosjava 主要是提供了客户端(如:android)与ros系统(如:turtlebot)通信的库,主要应用于android等java平台客户端开发 ...

  3. ros先订阅后发布 无法收到消息的解决办法

    现象 今天遇到的问题是: 使用的是Ros1, 在先订阅后发布时, 会导致订阅者无法收到订阅的消息, 除非在发布者发布后重新订阅. 思考 以前使用的是Ros2似乎并不关心订阅和发布的先后顺序,  似乎都 ...

  4. ROS发布订阅的消息的种类及使用

    #1.消息(std_msgs)的种类 在/opt/ros/melodic/include/std_msgs文件夹中查询 或参考: https://www.itdaan.com/tw/b30f2309f ...

  5. ROS开发系列(7)- 在回调函数中发布topic

    文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...

  6. kafka redis vs 发布订阅_发布订阅的消息系统 Kafka的深度解析

    背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...

  7. 第三集 Spring for Apache Kafka 接受消息

    我们可以接受消息通过配置一个MessageListenerContainer 和提供一个消息监听或者通过使用@KafkaListener 注解 3.1 Message Listeners 当我们使用一 ...

  8. ROS在MATLAB中的使用笔记

    文章目录 1. ROS环境变量设置 2. ROS初始化及常用指令 3. ROS消息的使用 基本消息的使用 ROS消息的进阶使用 自定义消息的使用 4. 订阅者和发布者的使用 订阅者的使用 发布者的使用 ...

  9. 发布订阅的消息系统 Kafka的深度解析

    发布&订阅的消息系统 Kafka的深度解析 2015-01-27 10:25 Jason Guo Jason Guo的博客 字号: T | T 一个典型的kafka集群中包含若干produce ...

最新文章

  1. MITOS|线粒体在线注释网站
  2. Redis NoSQL
  3. AndroidStudio自动补完包的快捷键
  4. 每次启动“Everything“需要管理员权限来索引NTFS卷.
  5. Mysql基于GTIDs的复制
  6. 【Redis学习】redis通讯协议
  7. mysql调试问题_mysql 数据库调试分析
  8. FZU 2020 组合
  9. Python基础 day4
  10. SQL——汇总分组排序
  11. Maix Bit(K210) 裸机开发教程(六)摄像头使用
  12. 线程2--主线程(main线程)
  13. Android刷windows 10系统,无处不在!安卓手机能刷 Win10 系统了
  14. 七宗罪:我们是如何错误预估人工智能的
  15. Hadoop HA介绍
  16. 【答读者问24】作为一个大一新生,如果我想要成为一个quant,我需要做些什么呢?
  17. 树莓派摄像头安装和使用
  18. 使用lindo进行灵敏度分析
  19. Python—数据类型之Integral类型
  20. java基础之字符串

热门文章

  1. netty依赖_Netty系列之源码解析(一)
  2. 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...
  3. Java之HSF搭建demo
  4. alloc_page分配内存空间--Linux内存管理(十七)
  5. 【模拟】Codeforces 711A Bus to Udayland
  6. happens-before通俗理解
  7. Powershell 批量替换文件
  8. 技术不牛如何才拿到国内IT巨头的Offer(转)
  9. poj2406 Power Strings
  10. 程序员编程艺术第二十七章:不改变正负数相对顺序重新排列数组(无解?)