Ros学习Day5


今天学习话题消息的定义和使用。首先看下实现的框架图:
在这里插入图片描述
首先定义一个发布者,也就是图中的person_publisher作为发布者,订阅者为person_subscriber。话题为/person_info。消息为:Person。

1:定义话题消息

首先定义msg文件。在你功能包文件夹下也就是如下图所示新建一个msg文件夹,然后在文件夹里建立一个Person.msg的文件,输入指令touch Person.msg

msg文件夹所在路径
创建之后,打开新建的文件。在这里插入图片描述
向新建的文件里面添加这样自定义的话题消息,如下面:

string name

uint8  age

uint8  sex



uint8 unknown = 0

uint8 male    = 1

uint8 female  = 2

接着要在package.xml中添加功能包依赖,添加以下这俩句指令。

  message_generation
  message_runtime

接着要在CMakeLists.txt添加编译选项。如下几句指令:

1:message_generation

在这里插入图片描述
添加如下内容:

add_message_files(
  FILES
  Person.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

在这里插入图片描述
接着把这一行的注释去掉,添加message_runtime
在这里插入图片描述
最后编译生成语言相关文件。编译成功就会在这个文件夹下看到
Person.h的文件。
在这里插入图片描述
接下来就是编写发布者和订阅者的程序,也就是前面学习的东西。发布者的c++程序为:

/***********************************************************************

Copyright 2020 GuYueHome (www.guyuehome.com).

***********************************************************************/



/**

 * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person

 */



#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("/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;

}

订阅者的程序为:

/***********************************************************************

Copyright 2020 GuYueHome (www.guyuehome.com).

***********************************************************************/



/**

 * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person

 */



#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;

}

接下来编译的时候,仍然要往CMake.lists添加如下部分:

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)

接下来输入编译指令。运行俩个程序,如下图:
在这里插入图片描述
证明成功。


文章作者: WYW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WYW !
评论
 上一篇
Clion运行多个cpp文件 Clion运行多个cpp文件
假期学习c++,过程中我采用的软件是clion2020.1,配置完成c++的环境之后,根据编程练习由于需要建立不同的cpp文件并且有多个main函数,具体实现做法也很简单。如上图,在cmakelists.txt文件如方框中加入以下语句,保存
2022-06-20
下一篇 
Ros学习Day4 Ros学习Day4
今天学习订阅这个话题的实现。我们要订阅这个话题是关于小海龟的位置信息。依旧是先运行roscore。然后启动小海龟节点。输入rostopic list,查看当前小海龟启动后的对应的话题。我们要订阅的话题就是/turtle1/pose。具体查看
2022-01-07
  目录