ros|创建自定义msg并发布话题

现有文件结构

test //工作空间
    ├── build
    ├── devel
    └── src
        └── mytest //用于存放节点的包
            ├── include
            │   └── mytest
            ├── launch
            └── src

一、创建msg

为方便管理,创建一个专门用于存放msg的包(package)

cd ./src
catkin_create_pkg mymsgs roscpp rospy message_generation std_msgs geometry_msgs

在./mymsg中创建msg文件夹并创建.msg文件

cd ./mymsg
mkdir msg
cd ./msg
touch testmsg.msg

文件内容为该msg所含数据,将以下内容复制至.msg文件

char key
float32 x
float32 y
float32 z

修改package.xml文件

使用文本编辑器打开mymsg包目录下的.xml文件,插入以下三行

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

修改CMakeLists.txt

在创建包时引入的依赖项会自动嵌入至find_package中,不需要进一步修改

在最后面插入

add_message_files(FILES testmsg.msg  )
generate_messages(DEPENDENCIES std_msgs geometry_msgs)
catkin_package(CATKIN_DEPENDS message_runtime std_msgs geometry_msgs)

(注:在自动生成的CMakeList.txt中间段会有catkin_package命令  需将其删去)

二、验证

编译该包

catkin_make

//使用rosmsg show 查看该.msg
hust@hust:~/myros/test$ rosmsg show mymsgs/testmsg
char key
float32 x
float32 y
float32 z

三、将该包发布为话题(topic)

创建package用来存放节点,

catkin_create_pkg mytest roscpp rospy message_generation std_msgs geometry_msgs

在src中创建testpub.cpp以及testsub.cpp

分别复制以下内容

//testpub.cpp
#include <ros/ros.h>
#include <mymsgs/testmsg.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    ros::init(argc,argv,"pubber");
    
    ros::NodeHandle nh;
    ros::Publisher test_pub = nh.advertise<mymsgs::testmsg>("testpub",1);
    ros::Rate loop_rate(10);
    mymsgs::testmsg msg;
    msg.key = 'a';
    while(ros::ok){
         test_pub.publish(msg);    

        ros::spinOnce();
        loop_rate.sleep();
    }
   
    

    return 0;
}




//testsub.cpp
#include "ros/ros.h"
#include <mymsgs/testmsg.h>
#include "std_msgs/String.h"
#include <stdio.h>
 
// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const mymsgs::testmsg& msg);
void chatterCallback(const mymsgs::testmsg& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("I heard: [%c]", msg.key);
}
 
int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "subber");
    ROS_INFO("subing...");
 
    // 创建节点句柄
    ros::NodeHandle nh;
 
    // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
    ros::Subscriber sub = nh.subscribe("testpub", 1000, chatterCallback);
 
    // 循环等待回调函数
    ros::spin();
 
    return 0;
}

在CMakeLists.txt中加入以下内容

include_directories(
# include
  ${catkin_INCLUDE_DIRS}
  "/home/hust/myros/test/devel/include"
)



add_executable(test_pub src/testpub.cpp)
add_executable(test_sub src/testsub.cpp)


target_link_libraries(test_pub ${catkin_LIBRARIES})
target_link_libraries(test_sub ${catkin_LIBRARIES})

打开终端依次运行

roscore
rosrun mytest test_sub
rosrun mytest test_pub

使用rqt_graph可查看节点关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值