ros入门 第二个小程序 话题程序+自定义话题消息

参考:https://blog.csdn.net/moshuilangting/article/details/86484042

1、新建工作空间并创建新的ros包

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

2、使用msg

新建 .msg 文件

cd chat_my
mkdir msg	//新建msg文件夹,和上面的include等同一路径
gedit test.msg	//新建 .msg 文件  这个名字后面要用

3、修改package.xml

将下面两句取消注释

message_generation	##取消注释
message_runtime	##取消注释

4、修改CmakeLists.txt

注意修改以下地方,注意取消注释和添加语句

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

5、话题发布与订阅

在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;
}

6、编译,运行

回到工作空间,编译

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 两个文件夹,重新编译

你可能感兴趣的:(ROS)