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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)
ttps://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)