ROS学习日志--话题的发布和订阅

新手刚入手ros,很多概念还有很多不熟悉,希望能见谅。


实现步骤

  • 自定义话题应用场景
  • 一、自定义一个话题
  • 二、书写步骤
    • 1.创建自定义消息
    • (1)在package.xml文件中添加功能包的依赖
    • (2)在CmakeLists.txt文件中添加编译选项
    • (3)编译
    • 2.创建publisher发布
    • 3.创建subscriber
    • CmakeLists.txt
  • 总结


自定义话题应用场景

在ros中话题的类型拥有基础的std_msgs(标准的数据类型),geometry_msgs(几何数据型),sensor_msgs(传感器数据型)。但是很多的情况下还需要自己的设计的特定的消息类型。


提示:以下是本篇文章正文内容,下面案例可供参考

一、自定义一个话题

msg文件是ROS中定义消息类型的文件,一般放置在功能包目录下的msg文件中。

二、书写步骤

1.创建自定义消息

首先创建一个描述个人信息的类型。

string name
uint8  age
uint8  sex

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

以上这些常量在发布和订阅时可以直接使用。

为了使用这些数据,需要对msg文件进行编译,需要按照以下步骤进行。

(1)在package.xml文件中添加功能包的依赖

  <build_depend>message_generationbuild_depend>
  <exec_depend>message_runtimeexec_depend>

这些可以在文件之前的注释中找到具体的解释。

(2)在CmakeLists.txt文件中添加编译选项

这些的位置都在备注中,在备注中直接进行更改就可以
需要添加一个消息生成依赖的功能包。

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  geometry_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topic
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

注意这个的顺序,在之后工程添加时需要按照前面注释顺序进行添加
*这个需要找到相应的代码,在末尾进行复制粘贴后进行修改 *
例如:server需要在generate_message之前。

add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

(3)编译

catkin_make这个应该不用多说了,都懂。

2.创建publisher发布

代码如下(示例):

#include 
#include "learning_topic/Person.h"

int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "person_publisher");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
    ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);

    // 设置循环的频率
    ros::Rate loop_rate(1);

    int count = 0;
    while (ros::ok())
    {
        // 初始化learning_topic::Person类型的消息
    	learning_topic::Person person_msg;
		person_msg.name = "Tom";
		person_msg.age  = 18;
		person_msg.sex  = learning_topic::Person::male;

        // 发布消息
		person_info_pub.publish(person_msg);

       	ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", 
				  person_msg.name.c_str(), person_msg.age, person_msg.sex);

        // 按照循环频率延时
        loop_rate.sleep();
    }

    return 0;
}

3.创建subscriber


#include 
#include "learning_topic/Person.h"

// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", 
			 msg->name.c_str(), msg->age, msg->sex);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "person_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
    ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

CmakeLists.txt

这个放置的位置,希望大家可以根据备注的区域进行分布,这样之后可以很好的找到相应的函数,在之后的差错中也好看出来

这个是在build区域的。

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)


add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

总结

以上就是这次文本的全部内容了,在话题的发布和订阅中,个人感觉这个代码的编写像在stm32单片机库函数的书写,都是遵循相应的顺序和规则来进行书写的。
在ROS中,使用c++和python代码都是可以的,本文之给出了c++,在之后的学习过程中也会和大家分享python的代码。

萌新看的是古月居在b站上的ros入门21讲来学习的,谢谢大家的支持。

你可能感兴趣的:(ROS学习,机器学习)