ROS机器人入门第五课:话题通信自定义msg

float64 height


#### (二)编辑配置文件


1. package.xml中添加编译依赖与执行依赖



<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0b0b6d1fc48f42ea97b52ad546bce533.png)  
 2. CMakeLists.txt编辑 msg 相关配置



find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)

需要加入 message_generation,必须有 std_msgs


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/72ca6c3b056143f7ab810c86a9f01c9f.png)



配置 msg 源文件

add_message_files(
FILES
Person.msg
)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/954e170e1eb34844a842f7176afc47b1.png)



生成消息时依赖于 std_msgs

generate_messages(
DEPENDENCIES
std_msgs
)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/28bae6f4413d43bc9423c5fb134601c9.png)



#执行时依赖
catkin_package(

INCLUDE_DIRS include

LIBRARIES demo02_talker_listener

CATKIN_DEPENDS roscpp rospy std_msgs message_runtime

DEPENDS system_lib

)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/82dc1a10c2104f21b7923924aabb806f.png)


#### (三)编译


`ctrl + shift + B`


**编译后的中间文件查看:**  
 Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/msg)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ea4b650c15e343fa9a67f423486ba781.png)  
 后续调用相关 msg 时,是从这些中间文件调用的


### 三、话题通信自定义msg调用


**需求:**



> 
> 编写发布订阅实现,要求发布方以1HZ(每秒1次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出。
> 
> 
> 


**分析:**


在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:


1. 发布方
2. 接收方
3. 数据(此处为自定义消息)


#### (一)调用流程


1. 编写发布方实现;
2. 编写订阅方实现;
3. 为python文件添加可执行权限;
4. 编辑配置文件;
5. 编译并执行。


##### 0.vscode配置


为了方便代码提示以及误抛异常,需要先配置 vscode,将前面生成的 python 文件路径配置进 settings.json



{
“python.autoComplete.extraPaths”: [
“/opt/ros/noetic/lib/python3/dist-packages”,
“/xxx/yyy工作空间/devel/lib/python3/dist-packages”
]
}


##### 1.发布方


这段代码是一个ROS(Robot Operating System)的Python节点,用于发布包含个人信息的消息。它导入了ROS的python库`rospy`和自定义的消息类型`person`。接下来,我会逐行提供详细的注释:



#! /usr/bin/env python

- coding: utf-8 -*-

导入 rospy,这是编写 ROS 节点的python库。

import rospy

导入自定义的消息类型,person 是我们自定义的消息类型,它应该已经在 ROS 的 msg 包中定义。

from msg.msg import person

__name__ == “__main__” 确保当这个脚本被执行而不是被导入时,以下代码块将被运行。

if name == “__main__”:
# 1. 初始化 ROS 节点,名为 “talker_person_p”。
rospy.init_node(“talker_person_p”)

# 2. 创建发布者对象,它将发布 person 类型的消息到 "chatter\_person" 话题,队列大小设置为 10。
pub = rospy.Publisher("chatter\_person", person, queue_size=10)

# 3. 组织要发布的消息,创建一个 person 类型的实例 p,并设置其属性。
p = person()
p.name = "zhangsan"  # 设置人的名字为 "zhangsan"。
p.age = 18           # 设置年龄为 18。
p.height = 0.75      # 设置身高为 0.75 米。

# 4. 编写消息发布逻辑。
rate = rospy.Rate(1)  # 设置一个发布频率,1Hz,每秒发布一次。
rospy.sleep(3)        # 休眠3秒,给ROS系统一些启动时间。

# while 循环会在 ROS 节点没有被关闭的情况下持续运行。
while not rospy.is_shutdown():
    pub.publish(p)  # 发布消息,将 person 实例 p 发布到 "chatter\_person" 话题。
    rate.sleep()    # 使用前面设置的频率来休眠,确保以 1Hz 的频率发布消息。
    
    # rospy.loginfo 用于输出日志信息,这里输出了 person 实例 p 的所有信息。
    rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f", p.name, p.age, p.height)

现在,让我详细解释一下你提问中的`ros`函数:


* `rospy.init_node("talker_person_p")`: 这个函数初始化一个ROS节点,节点的名称是 `"talker_person_p"`。在ROS中,节点是运行的基本单元,每个节点都有自己的名字。
* `rospy.Publisher("chatter_person",person,queue_size=10)`: 这个函数创建一个Publisher对象,用于发布消息。它告诉ROS你想要发布“chatter\_person”这个话题上的`person`类型消息。`queue_size`参数指定了消息队列的大小,这里设置为10,意味着如果数据处理不过来,它将缓存10条消息。
* `rospy.Rate(1)`: 这个函数设置了一个频率(1Hz),用于定时发布消息。
* `rospy.sleep(3)`: 使得节点休眠3秒钟。
* `rospy.is_shutdown()`: 这个函数会检查你的ROS节点是否应该被关闭(例如,如果有人按下Ctrl+C或者如果ROS核心已经关闭)。
* `pub.publish(p)`: 通过前面创建的`pub`发布者对象,发布消息`p`。
* `rate.sleep()`: 根据之前定义的`rate`来使程序休眠,以保持1Hz的发布频率。
* `rospy.loginfo(...)`: 输出日志信息到命令行和ROS日志文件,便于调试和记录状态。


代码中需要改的地方:


* `from msg.msg import person` :from **包名**.msg import **自定义msg文件名**
* `pub = rospy.Publisher("chatter_person", person, queue_size=10)`:pub = rospy.Publisher(“chatter\_person”, **自定义msg文件名**, queue\_size=10)
* `p = person()`:p = **自定义msg文件名**()


##### 2.订阅方


这段代码定义了一个ROS(Robot Operating System)的Python订阅节点,用于订阅包含个人信息的消息。它同样使用了`rospy`库以及自定义的消息类型`person`。让我为你逐行提供注释:



#! /usr/bin/env python

- coding: utf-8 -*-

“”"
订阅方:
订阅消息
“”"

导入ROS的Python库rospy。

import rospy

从msg包导入自定义的消息类型,person必须已经在ROS的msg包中定义了。

from msg.msg import person

定义回调函数doPerson,它将在接收到消息时被调用。

def doPerson§:
# 输出接收到的消息内容:人的名字、年龄和身高。
rospy.loginfo(“接收到的人的信息:%s, %d, %.2f”, p.name, p.age, p.height)

确保当脚本被直接执行时,下面的代码块会运行。

if name == “__main__”:
# 1. 初始化ROS节点,名称为"listener_person_p"。
rospy.init_node(“listener_person_p”)

# 2. 创建订阅者对象,订阅名为"chatter\_person"的话题,消息类型为person。
# doPerson是收到消息时要调用的回调函数。queue\_size=10指定了消息队列的大小。
sub = rospy.Subscriber("chatter\_person", person, doPerson, queue_size=10)

# 4. 调用rospy.spin()使得节点保持运行直到节点被显式地关闭或者Ctrl+C被按下。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

ttps://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值