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等同一路径
cd msg  
gedit test.msg	##进入msg路径,新建 .msg 文件  这个名字后面要用

输入消息

string s
float32 x
float32 y

如图所示
在这里插入图片描述

3、修改package.xml

找到下面两句并取消注释,(注释与取消注释的方法参考文件内其他内容)

<build_depend>message_generation</build_depend>	##取消注释
<exec_depend>message_runtime</exec_depend>	##取消注释

4、修改CmakeLists.txt

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

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation    ##新添加++
)
add_message_files(  ##取消注释
   FILES             ##取消注释
   test.msg           ##新添加++,就是我们新建的.msg文件
 )   ##取消注释
generate_messages(  ##取消注释
   DEPENDENCIES      ##取消注释
   std_msgs          ##取消注释
 )    ##取消注释

以下注意要添加语句

catkin_package(
  CATKIN_DEPENDS message_runtime roscpp rospy std_msgs ##取消注释,##添加++       message_runtime
)

修改完后 回到工作空间进行编译(要在只有src的文件目录下执行catkin_make)

cd ../
catkin_make

5、话题发布与订阅

在src文件夹下新建两个.cpp文件 talker.cpp listener.cpp

分别输入如下代码

talker.cpp

#include <sstream>
#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<chat_my::test>("chatter",1000);///创建publisher,发布名为chatter,类型为chat_my::test(这里是自己定义的话题消息,注意格式),队列大小为1000
	chat_my::test num; //定义一个话题消息变量
	
	ros::Rate lopp_rate(10);	//设置循环的频率10hz,调用Rate::sleep()时,会休眠一定时间保证频率

	int count=0.0;
	while(ros::ok)	//节点有异常时,ros::ok 返回false
	{
		//初始化要发布的消息
		num.x=10.1;
		num.y=count;
		num.s='talker';
		
		//发布消息
		chatter_pub.publish(num);
		ROS_INFO("I publish:x=%f,y=%f,z=%s",num.x,num.y,num.s);

		//循环等待回调函数
		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=%f,y=%f,z=%s",msg->x,msg->y,msg->s);
}

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、修改Cmakelists.txt文件,并编译,运行

在Cmakelists.txt中添加如下代码


add_executable(talker src/talker.cpp)	#手动添加 第一个是可执行文件的文件名,后面是源,可以多个,用空格隔开
target_link_libraries(talker ${catkin_LIBRARIES})	#此可执行文件所需的链接库,第一个可执行文件名,后面为链接库,可多个,用空格隔开

add_executable(listener src/listener.cpp)	#手动添加 第一个是可执行文件的文件名,后面是源,可以多个,用空格隔开
target_link_libraries(listener ${catkin_LIBRARIES})	#此可执行文件所需的链接库,第一个可执行文件名,后面为链接库,可多个,用空格隔开

回到工作空间,编译

catkin_make

注意,此处如果报错,可以尝试将build 和devel 文件夹删掉,重新编译

运行:
新建终端

roscore

在工作空间下新建终端,输入如下命令,(如果是zsh的terminal,第一条需要修改为source devel/setup.zsh)

source devel/setup.bash
rosrun chat_my talker ##第一个为功能包名,第二个对应Cmakelists.txt中的可执行文件名

此时如果正常,终端将打印发送的一系列数

在工作空间下新建终端

source devel/setup.bash
rosrun chat_my listener

此时如果正常,终端将打印接受到的一系列数

查看节点关系,新建终端输入如下指令

rqt_graph

当更改工作空间名字后,需要删掉build 和devel 两个文件夹,重新编译

action通信相关参考

https://blog.csdn.net/qq_23981335/article/details/100335743
https://blog.csdn.net/java0fu/article/details/106148794
https://blog.csdn.net/zxxxiazai/article/details/108396429

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,我们可以通过自定义消息类型来定义自己的话题消息。以下是一些ROS高级自定义话题消息的示例: 1. 多维数组消息类型 在ROS中,您可以通过定义多维数组消息类型来传递多维数据。例如,您可以定义一个名为“my_array”的消息类型,其中包含一个3x3的二维数组: ``` # my_array.msg float32[9] data ``` 这将定义一个名为“my_array”的消息类型,其中包含一个名为“data”的浮点数数组,大小为9。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_array rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_array, queue_size=10) msg = my_array() msg.data = [1,2,3,4,5,6,7,8,9] pub.publish(msg) ``` 2. 自定义消息头 在ROS中,每个消息都具有一个消息头,其中包含有关消息的元数据(例如时间戳、帧ID等)。您可以通过定义自己的消息头来添加其他元数据。 例如,您可以定义一个名为“my_header”的消息头,其中包含一个名为“seq”的序列和一个名为“frame_id”的帧ID: ``` # my_header.msg uint32 seq string frame_id ``` 然后,您可以将此消息头添加到您的自定义消息类型中: ``` # my_message.msg my_header header float32 data ``` 这将定义一个名为“my_message”的消息类型,其中包含一个名为“header”的消息头和一个名为“data”的浮点数。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_header, my_message rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_message, queue_size=10) msg = my_message() msg.header.seq = 1 msg.header.frame_id = 'my_frame' msg.data = 3.14 pub.publish(msg) ``` 3. 嵌套消息类型 在ROS中,您可以将一个消息类型嵌套在另一个消息类型中,以创建更复杂的消息结构。 例如,您可以定义一个名为“my_point”的消息类型,其中包含x、y和z坐标,然后将其嵌套在名为“my_pose”的消息类型中,以表示一个3D位姿: ``` # my_point.msg float32 x float32 y float32 z # my_pose.msg my_point position my_point orientation ``` 这将定义一个名为“my_pose”的消息类型,其中包含名为“position”和“orientation”的两个嵌套的“my_point”消息类型。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_point, my_pose rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_pose, queue_size=10) msg = my_pose() msg.position.x = 1.0 msg.position.y = 2.0 msg.position.z = 3.0 msg.orientation.x = 0.0 msg.orientation.y = 0.0 msg.orientation.z = 1.0 pub.publish(msg) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值