我是靠谱客的博主 动人山水,最近开发中收集的这篇文章主要介绍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可查看节点关系

最后

以上就是动人山水为你收集整理的ros|创建自定义msg并发布话题的全部内容,希望文章能够帮你解决ros|创建自定义msg并发布话题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部