话题消息
类似于结构体
1 自定义消息
1.1 定义msg文件
在包的目录下,创建一个msg文件夹,在该文件夹下添加msg文件
1.2 添加编译、运行依赖
在package文件中,添加:
# 消息编译时用到的依赖
<build_depend>message_generation</build_depend>
# 运行时用到的依赖
<exec_depend>message_runtime</exec_depend>
在CMakeList文件中,添加:
首先,添加功能包
其次,
# 添加msg文件
add_message_files(FILES pra_topic_msg.msg)
# msg文件用到的包
generate_messages(DEPENDENCIES std_msgs)
# std_msgs中包含string、uint8等类型
最后,添加运行依赖:
catkin_package中添加运行依赖message_runtime
2 举例
定义pra_topic_msg.msg文件,内容:
string topic_type
uint8 x
uint8 y
2.1 发布者
2.1.1 c++
定义msg_topic_pub.cpp 文件,内容:
#include <ros/ros.h>
#include "practice_pkg/pra_topic_msg.h"
int main(int argc,char **argv){
ros::init(argc,argv,"msg_topic_pub");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<practice_pkg::pra_topic_msg>("msg_topic_cpp",10);
ros::Rate r(0.5);
practice_pkg::pra_topic_msg msg;
msg.topic_type = "publisher";
msg.x = 1;
msg.y = 1;
int var=0;
while(ros::ok())
{
pub.publish(msg);
ROS_INFO("type:%s x:%d y:%d", msg.topic_type.c_str(), msg.x, msg.y);
var = msg.x;
msg.x = msg.x + msg.y;
msg.y = var;
r.sleep();
}
return 0;
}
由于该c++文件用到了自定义消息类型,因此与之前的配置稍有不同
# 将指定代码文件 生成 可执行文件
add_executable(msg_topic_pub src/msg_topic_pub.cpp)
# 设置链接库
target_link_libraries(msg_topic_pub ${catkin_LIBRARIES})
# 添加依赖项
add_dependencies(msg_topic_pub ${PROJECT_NAME}_generate_messages_cpp)
之后编译并运行
2.1.2 python
定义文件msg_topic_pub.py
#!/usr/bin/env python
import rospy
from practice_pkg.msg import pra_topic_msg
def func():
rospy.init_node("msg_topic_pub")
pub = rospy.Publisher("msg_topic_py",pra_topic_msg ,queue_size=10)
r = rospy.Rate(0.5)
msg = pra_topic_msg()
msg.topic_type = "python"
msg.x = 1
msg.y = 1
while not rospy.is_shutdown():
pub.publish(msg)
rospy.loginfo(f"tpye:{msg.topic_type},x:{msg.x},y:{msg.y}")
msg.x , msg.y = msg.x+msg.y , msg.x
r.sleep()
if __name__ == "__main__":
try:
func()
except:
pass
注意:记得将文件改为可执行文件
2.2 订阅者
2.2.1 c++
定义文件:msg_topic_sub.cpp
#include <ros/ros.h>
#include "practice_pkg/pra_topic_msg.h"
void CallBack(const practice_pkg::pra_topic_msg::ConstPtr& msg)
{
ROS_INFO("type:%s x:%d y:%d", msg->topic_type.c_str() ,msg->x ,msg->y );
}
int main(int argc,char **argv){
ros::init(argc,argv,"msg_topic_sub");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("msg_topic_cpp",10,CallBack);
ros::spin();
return 0;
}
配置:
add_executable(msg_topic_sub src/msg_topic_sub.cpp)
target_link_libraries(msg_topic_sub ${catkin_LIBRARIES})
add_dependencies(msg_topic_sub ${PROJECT_NAME}_generate_messages_cpp)
运行:
2.2.2 python
创建文件:msg_topic_sub.py
#!/usr/bin/env python
import rospy
from practice_pkg.msg import pra_topic_msg
def CallBack(msg):
rospy.loginfo(f"type:{msg.topic_type},x:{msg.x},y:{msg.y}")
def func():
rospy.init_node("msg_topic_sub")
rospy.Subscriber("msg_topic_py",pra_topic_msg,CallBack)
rospy.spin()
if __name__ == "__main__":
try:
func()
except:
pass
最终的文件分布: