参考:https://blog.csdn.net/moshuilangting/article/details/86484042
mkdir chat_test_msg
cd chat_test_msg
mkdir src
cd src
catkin_create_pkg chat_my std_msgs rospy roscpp //功能包名为chat_my,注意后面的依赖
此时src文件夹下出现chat_my文件夹
chat_my文件夹下包含: 2个文件夹 include 、src;2个文件 CmakeLists.txt 、package.xml
新建 .msg 文件
cd chat_my
mkdir msg //新建msg文件夹,和上面的include等同一路径
gedit test.msg //新建 .msg 文件 这个名字后面要用
将下面两句取消注释
message_generation ##取消注释
message_runtime ##取消注释
注意修改以下地方,注意取消注释和添加语句
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation ##新添加++
)
add_message_files( ##取消注释
FILES ##取消注释
abc.msg ##新添加++,就是我们新建的.msg文件
) ##取消注释
generate_messages( ##取消注释
DEPENDENCIES ##取消注释
std_msgs ##取消注释
) ##取消注释
以下注意要添加语句
catkin_package(
CATKIN_DEPENDS message_runtime roscpp rospy std_msgs ##取消注释,##添加++ message_runtime
)
修改完后 回到工作空间进行编译
cd ../
catkin_make
在src文件夹下新建两个.cpp文件 talker.cpp listener.cpp
分别输入如下代码
talker.cpp
#include
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "chat_my/test.h" //前面是包的名字,后面是.msg的名字,注意这里后缀要将.msg改为.h
int main(int argc,char **argv)
{
ros::init(argc,argv,"talker"); //节点初始化
ros::NodeHandle n; //创建节点句柄
ros::Publisher chatter_pub=n.advertise("chatter",1000);/创建publisher,发布名为chatter,类型为chat_my::test(这里是自己定义的话题消息,注意格式),队列大小为1000
chat_my::test num; //定义一个话题消息变量
ros::Rate lopp_rate(10); //设置循环的频率10hz,调用Rate::sleep()时,会休眠一定时间保证频率
int count=0;
while(ros::ok) //节点有异常时,ros::ok 返回false
{
//初始化要发布的消息
num.x=10;
num.y=count;
num.z=100;
//发布消息
chatter_pub.publish(num);
ROS_INFO("I heard:x=%d,y=%d,z=%d",num.x,num.y,num.z);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
lopp_rate.sleep();
++count;
}
return 0;
}
listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "chat_my/test.h" //前面是包的名字,后面是.msg的名字,注意这里后缀要将.msg改为.h
void chatterCallback_1(const chat_my::test::ConstPtr& msg)//注意此处要更改话题消息类型
{
//打印收到的消息
ROS_INFO("I heard:x=%d,y=%d,z=%d",msg->x,msg->y,msg->z);
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback_1); //创建一个Subscriber,订阅名为chatter,回调函数
ros::spin(); //循环等待回调函数
return 0;
}
回到工作空间,编译
catkin_make
注意,此处如果报错,可以尝试将build 和devel 文件夹删掉,重新编译
运行:
新建终端
roscore
在工作空间下新建终端
source devel/setuo.bash
rosrun chat_my talker
此时如果正常,终端将打印发送的一系列数
在工作空间下新建终端
source devel/setuo.bash
rosrun chat_my listener
此时如果正常,终端将打印接受到的一系列数
查看节点关系,新建终端输入如下指令
rqt_graph
当更改工作空间名字后,需要删掉build 和devel 两个文件夹,重新编译