现有文件结构
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可查看节点关系