ROS话题通信总结3(自定义发布文本)(调用)

ROS话题通信总结3(自定义发布文本)(调用)


目录

ROS话题通信总结3(自定义发布文本)(调用)

前言:

一、ROS话题通信总结1:https://blog.csdn.net/qq_33001335/article/details/117121210?spm=1001.2014.3001.5502

二、ROS话题通信总结2:(自定义发布文本)(配置):https://blog.csdn.net/qq_33001335/article/details/117195740

0.vscode 配置

三、话题通信基本操作(C++)

注意事项:(基本操作之如果你不会C语言)

1.发布方实现


前言:

  • 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty.... 但是,这些数据一般只包含一个 data 字段
  • 结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 激光雷达的信息... std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型
  • 该文承接(二、ROS话题通信总结2:(自定义发布文本)(配置))一文,如若没有阅读,请阅读该文后返回

一、ROS话题通信总结1:https://blog.csdn.net/qq_33001335/article/details/117121210?spm=1001.2014.3001.5502

二、ROS话题通信总结2:(自定义发布文本)(配置):https://blog.csdn.net/qq_33001335/article/details/117195740


0.vscode 配置

不使用vscode的这一步可以跳过(不需要提示词的也可以跳过)

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:

 "/用户名/工作空间名/devel/include/**" //配置 head 文件的路径 

如下图:

三、话题通信基本操作(C++)(自定义发布文本版)

注意事项:(基本操作之如果你不会C语言)

int main(int argc,char *argv[])//main函数模板
{    
    setlocale(LC_ALL,"");//防止中文乱码
    ROS_INFO("THIS IS THE PUB DATA");//当启动该节点时会输出日志提示节点启动
    //↓↓从这里开始写代码↓↓
    

    
    /
    return 0;
}

1.发布方实现

  • 基本流程:

pub C++

  • 1.include ros(包含ros的头文件)
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
  • 2.ros_node init(ros节点初始化)
ros::init(argc,argv,"node_name");
//参数1与参数2 后期为节点传值使用
//参数3为节点名称(可随意取名),于rqt_graph命令中清晰查看节点信息
  • 3.create node_handle(ros句柄创建)
ros::NodeHandle nh;//该类中封装了一些常用的ros功能
  • 4.create pub(创建发布者对象)
ros::Publisher pub = nh.advertise<plumbing_pub_sub::person>("liaotian",10);
//参数1为要发布到的话题(话题名称可随意)
//参数2为队列中保存的消息数,超出此阈值的,先进的先销毁
  • 4-1.<plumbing_pub_sub::person>代表调用工作空间下的devel/include/plumbing_pub_sub中的person.h头文件

  • 5.write pub data,output data(组织被被发布的数据,并编写发布的数据)
  • 5-1.pub data write(数据动态)
plumbing_pub_sub::person person;
//调用plumbing_pub_sub中的person结构体的person变量

  • 5-2.set data(初始化结构体成员)
person.name = "zhangsan";
person.age = 18;
person.height = 1.73;
  • 5-2.output speed set (输出频率设置)
ros::Rate rate(1);//每秒钟输出10次
  • 5-3.while(输出循环)
while(ros::ok())
    {
        //每循环一次年龄增加一次,用来可视化通信成功后的时长
        person.age++;   

        //发布消息(消息封装在person对象中)
        pub.publish(person);

        //输出日志(内容,姓名,年龄,身高)
        ROS_INFO("PUB DATA:%s,%d,%.2f",person.name.c_str(),person.age,person.height);
        
        //根据前面制定的发送频率自动休眠 休眠时间 = 1/频率
        rate.sleep();

        //暂无作用,官方推荐
        ros::spinOnce();
    }

CMakeList.TXT文件修改

//108行
//添加message_runtime依赖包
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES plumbing_pub_sub
 CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

//140行
//demo01_pub和demo01_pub.cpp分别为两个需要配置的参数,为.C文件映射的名称
add_executable(demo03_pub_person src/demo03_pub_person.cpp)

//151行
//这是为了防止依赖包难以被找到
add_dependencies(demo03_pub_person ${PROJECT_NAME}_generate_messages_cpp)

//160-162行
target_link_libraries(demo03_pub_person
  ${catkin_LIBRARIES}
)

package.xml文件修改

//55行添加
<build_depend>message_generation</build_depend>

//64行添加
<exec_depend>message_runtime</exec_depend>

2.订阅方实现

  • 基本流程:

sub C++

  • 1.include ros(包含ros头文件)
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
  • 2.ros_node init(ros节点初始化)
ros::init(argc,argv,"node_name");
//参数1与参数2 后期为节点传值使用
//参数3为节点名称(可随意取名),于rqt_graph命令中清晰查看节点信息
  • 3.create node_handle(创建句柄)
ros::NodeHandle nh;
  • 4.create sub (创建订阅者对象)
ros::Subscriber sub = nh.subscribe("topic_name",10,doPerson);
/*
参数1为话题名称
参数2为队列中保存消息数
参数3为回调函数
*/

//回调函数:
void doPerson(const plumbing_pub_sub::person::ConstPtr& person)
{
    ROS_INFO("SUB PERSON DATA:%s,%d,%.2f",person->name.c_str(),person->age,person->height);
}
  • 注意:发布方与订阅方话题名称需要相同,否则无法进行话题通信
  • 5.solve sub data(处理发布者数据)
  • 6.spain del (回调函数)
ros::spin();

CMakeList.TXT文件修改

//142行
add_executable(demo04_sub_person src/demo04_sub_person.cpp)

//152行
add_dependencies(demo04_sub_person ${PROJECT_NAME}_generate_messages_cpp)

//163-165行
target_link_libraries(demo04_sub_person
  ${catkin_LIBRARIES}
)

实现运行:

//于工作空间下
$ source ./devel/setup.bash
$ rosrun plumbing_pub_sub demo03_pub_person
实现发布方

新开一个terminal窗口
$ source ./devel/setup.bash
$ rosrun plumbing_pub_sub demo04_sub_person
实现订阅方

三、话题通信基本操作(Python)(自定义发布文本版)

1.发布方实现

  • 基本流程:

pub Python

1.import rospy(导入ros包)
2.ros_node init(ros节点初始化)
3.create pub(创建发布者对象)
4.create pub date and output data(组织被被发布的数据,并编写发布的数据)
因为Python代码实现较为简单,原理上的东西就不重复说,这里主要说一下用到的函数中的参数
Python代码实现发布方如下

#! /usr/bin/env python 

#import ros
import rospy
from plumbing_pub_sub.msg import person

if __name__ == "__main__":
    #2.ros_node init 
    rospy.init_node("dama")//参数1:节点名
    #3.create pub
    pub = rospy.Publisher("jiaoshetou",person,queue_size=10)
    #参数1:话题名称
    #参数2:"msgs.data class" (发布数据的数据类型)            
    #参数3:队列中保存消息数
    #4.create pub data and output data
    #4-1.create person data
    p = person()
    p.name = "aoteman"
    p.age = 8
    p.height = 1.85
    #4-2.set rate
    rate = rospy.Rate(1)
    #4-3.while 
    while not rospy.is_shutdown():
        pub.publish(p)
        rospy.loginfo("pub data:%s,%d,%.2f",p.name,p.age,p.height)
        rate.sleep()

CMakeList.TXT文件修改

#176行
并且.py因为在linux操作系统中没有可执行权限,还需在scripts(就是放.py文件的文件夹,一般于功能包目录下创建,与src目录平行)目录下添加:
$ chmod +x *.py

catkin_install_python(PROGRAMS
  scripts/demo01_pub_p.py
  scripts/demo02_sub_p.py
  scripts/demo03_pub_person_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

2.发布方实现

  • 基本流程:

sub Python

  • 1.import rospy(导入ros包)
  • 2.ros_node init(ros节点初始化)
  • 3.create sub(创建订阅者对象)
  • 4.back del (编写回调函数)
  • 5.spin()
  • 代码如下:
#! /usr/bin/env python

import rospy
from plumbing_pub_sub.msg import person

def doperson(p):
    rospy.loginfo("sub data of person :%s,%d,%.2f",p.name,p.age,p.height)

if __name__ == "__main__":
    #2.ros_node init
    rospy.init_node("daye")
    #3.create sub 
    sub = rospy.Subscriber("jiaoshetou",person,doperson)
    #4.deal sub data
    
    #5.spin()
    rospy.spin()

CMakeList.TXT文件修改

#176行
并且.py因为在linux操作系统中没有可执行权限,还需在scripts(就是放.py文件的文件夹,一般于功能包目录下创建,与src目录平行)目录下添加:
$ chmod +x *.py

catkin_install_python(PROGRAMS
  scripts/demo01_pub_p.py
  scripts/demo02_sub_p.py
  scripts/demo03_pub_person_p.py
  scripts/demo04_sub_person_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

到此实现C++和Python的话题通信(自定义发布文本版)

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(Robot Operating System)是一个用于机器人开发的开源软件平台,它提供了一套完整的工具链,包括硬件驱动、通信中间件、算法库等,方便开发者快速构建机器人应用。 在ROS中,话题(Topic)是一种常用的通信机制,它可以用于不同节点之间的消息传递。下面是ROS话题通信的基本流程: 1. 编写发布节点(Publisher Node):发布节点负责向特定话题发送消息。通常情况下,发布节点会通过ROS API接口来实现消息的发布。 2. 编写订阅节点(Subscriber Node):订阅节点负责从特定话题接收消息。与发布节点类似,订阅节点也会通过ROS API接口来实现消息的订阅。 3. 创建话题(Topic):话题发布节点和订阅节点之间的通信媒介。在ROS中,话题是通过ROS Master进行管理的。发布节点需要告诉ROS Master它将要发布话题名和消息类型,而订阅节点需要告诉ROS Master它将要订阅的话题名和消息类型。 4. 运行发布节点和订阅节点:发布节点和订阅节点可以在同一台计算机上运行,也可以在不同的计算机上运行。不同计算机上的节点可以通过ROS Master进行连接。 5. 发布消息:发布节点向特定话题发送消息,消息可以是预定义的ROS消息类型,也可以是自定义的消息类型。 6. 接收消息:订阅节点从特定话题接收消息,接收到的消息可以被处理或传递给其他节点。 7. 关闭节点:当发布节点或订阅节点完成任务后,它们应该被正确关闭,以释放资源和关闭与ROS Master的连接。 以上就是ROS话题通信的基本流程。通过话题通信,不同节点之间可以实现实时的消息传递和数据共享,方便机器人应用的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值