05-ros1-message_package

ROS消息包

image-20241119220413054

  • ros消息包
    • std_msgs 标准消息包
    • common_msgs
      • sensor_msgs 传感器消息包
      • geometry_msgs 几何消息包
      • nav_msgs 导航消息包

std_msgs 标准消息包

常见类型

image-20241119220559329

  • 基础类型
  • 数组类型
  • 结构体类型

common_msgs 常用消息包

image-20241119221651257

  • actionlib_msgs 行为消息包
  • diagnostic_msgs 诊断消息包
  • geometry_msgs 几何消息包
  • nav_msgs 导航消息包
  • sensor_msgs 传感器消息包
  • shap_smgs 形状消息包
  • stereo_msgs 双目视觉消息包
  • trajectory_msgs 运动轨迹消息包
  • visualization_msgs 图形显示消息包

常用的消息

geometry_msgs

image-20241119232057166

sensor_msgs

image-20241119232511339

自定义消息

ROS生成自定义消息包

所谓的消息包 也是一个 普通的 pkg

msg/Carry.msg

catkin_create_pkg qq_msgs roscpp rospy std_msgs message_generation message_runtime 

创建一个 msg 的目录

里面存放 Carry.msg 消息文件

string grade
int64 star
string daata

CMakeLists.txt

image-20241120000955153

image-20241120000917234

image-20241120000901536

# 添加消息类型
add_message_files(
  FILES
  Carry.msg
)
# 生成新消息的依赖列表
generate_messages(
  DEPENDENCIES
  std_msgs
)

package.xml

确保 build_dependexec_depend 都包含了

  • message_generation
  • message_runtime

补全

image-20241119235433571

编译

进入到 ~/catkin_ws 目录下

输入

catkin_make
  • 查看
rosmsg show qq_msgs/Carry

image-20241120001807610

总结

image-20241120000736670

C++实现 自定义消息

我们使用 ssr_msg 来进行实验

发布者节点

chao_node.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <qq_msgs/Carry.h>

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"chao_node");
    printf("Hello World!\n");
    // add topic
    ros::NodeHandle nh; // nh means node_hander
    ros::Publisher pub = nh.advertise<qq_msgs::Carry>("game_topic",10); // publisher,10 buffers
    ros::Rate loop_rate(10); // 1s exc 10
    while(ros::ok())
    {
        printf("Don't shorw \n");
        qq_msgs::Carry msg;
        msg.grade = "王者";
        msg.start = 50;
        msg.data = "国服马超,带飞";
        pub.publish(msg);
    }
    return 0;
}

CmakeList.txt

image-20241120002506992

在chao_node 的后面加上 add_dependencies

add_dependencies(chao_node qq_msgs_generate_messages_cpp)

image-20241120002631603

package.xml

确保 build_dependexec_depend 中包含了 qq_msgs

image-20241120003008348

订阅者节点

选择之前的工作目录 atr_pkg

ma_node.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <qq_msgs/Carry.h>


void chao_callback(const qq_msgs::Carry& msg)
{
    ROS_WARN(msg.grade.c_str());
    ROS_WARN("%d 星",msg.start);
    ROS_WARN(msg.data.c_str());
}

void yao_callback(const std_msgs::String::ConstPtr& msg)
{
    ROS_WARN("%s \n",msg->data.c_str());
}



int main(int argc,char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"ma_node");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("game_topic",10,chao_callback); // call_back function
    ros::Subscriber sub_yao = nh.subscribe("sex_topic",10,yao_callback);
    
    while(ros::ok())
    {
        ros::spinOnce(); // back look node
    }
    
    return 0;
}

CmakeList.txt

添加 qq_msgs

image-20241120003955255

添加 依赖

ma_node qq_msgs_generate_messages_cpp

image-20241120004026051

package.xml

确保 build_dependexec_depend 中包含了 qq_msgs

image-20241120003008348

总结

image-20241120004719502

image-20241120004209710

Python实现 自定义消息

发布者节点

chao_node.py

#!/usr/bin/env python3
# coding=utf-8

import rospy
from std_msgs.msg import String
from qq_msgs.msg import Carry

def main():
    rospy.init_node("chao_node")
    rospy.logwarn("王者荣耀启动!")

    pub = rospy.Publisher("game_topic", Carry, queue_size=10)
    rate = rospy.Rate(10)  # 10 hz

    while not rospy.is_shutdown():
        rospy.loginfo("我要开始刷屏了")
        msg = Carry()
        msg.start = 50
        msg.grade = "王者"
        msg.data = "国服马超,带飞"
        pub.publish(msg)
        rate.sleep()

if __name__ == "__main__":
    main()

CMakeLists.txt

添加依赖

image-20241120003955255

package.xml

确保 build_dependexec_depend 中包含了 qq_msgs

image-20241120003008348

订阅者节点

ma_node.py

#!/usr/bin/env python3
# coding=utf-8

import rospy
from std_msgs.msg import String
from qq_msgs.msg import Carry

def chao_callback(msg:Carry):
    rospy.logwarn(msg.grade)
    rospy.logwarn(str(msg.start)+"星")
    rospy.logwarn(msg.data)
    
def main():
    rospy.init_node("ma_node")
    rospy.logwarn("元神,启动!")

    sub = rospy.Subscriber("game_topic", Carry, chao_callback,queue_size=10)
    rospy.spin()

if __name__ == "__main__":
    main()

CmakeLists.txt

添加依赖

image-20241120003955255

packag.xml

确保 build_dependexec_depend 中包含了 qq_msgs

image-20241120003008348

总结

image-20241120011503269

image-20241120010911145

感觉python比c++,写一些简单的东西要快 n 倍

github