2.4 自定义msg Python

功能介绍

以自定义数据类型为基础,完成一个节点发布消息,另一个节点接收前一个节点发布的消息

1、工作空间

1.1 创建工作空间lee_ws

mkdir -p ~/lee_ws/src
cd ~/lee_ws/src/
catkin_init_workspace 
cd ~/lee_ws/
catkin_make
echo "source ~/lee_ws/devel/setup.bash" >> ~/.bashrc
source devel/setup.bash 

1.2 创建功能包lee_msg

cd ~/lee_ws/src
catkin_create_pkg lee_msg std_msgs rospy roscpp
cd ~/lee_ws/
catkin_make
source ~/lee_ws/devel/setup.bash 

1.3 创建msg文件

路径: /home/lee/lee_ws/src/lee_msg/msg/Person.msg

string name
uint16 age
float64 height

1.4 package.xml配置

在package.xml最下面的build_dependexec_depend附近添加即可

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

1.5 CMakeLists.txt配置

在CMakeLists.txt中配置下面相应的代码

# 需要加入 message_generation,必须有 std_msgs
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

# 配置 msg 源文件
add_message_files(
  FILES
  Person.msg
)

# 生成消息时依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)

#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES lee
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

1.6 编译后的中间文件查看

Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/msg)

1.7 总结步骤1.3-1.5

  • 1.3建立的自定义msg文件
  • 需要通过1.4和1.5两个步骤的配置才能通过catkin_make对1.3的文件进行编译
  • 1.6为通过编译自定义文件生成的python、C++和js等头文件,用于相应编程代码的头文件调用

1.8 VScode编辑ros参数配置

快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build这一行,点击小齿轮配置设置,修改.vscode/tasks.json 文件,将下面复制进去即可
这么配置的原因:下一次快捷键 ctrl + shift + B直接进行代码编译
路径: .vscode/tasks.json

{
	"version": "2.0.0",
	"tasks": [
		{
			//代表提示的描述性信息
			"label": "catkin_make:debug", 

			//可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
			"type": "shell",  

			//这个是我们需要运行的命令
			"command": "catkin_make",
			
			"args": [],
		   
			"group": {"kind":"build","isDefault":true},
			
			//可选always或者silence,代表是否输出信息			
			"presentation": {"reveal": "always"},
			
			"problemMatcher": "$msCompile"
		}
	]
}

1.9 vscode 头文件配置

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将1.3-1.5生成的 head 中间文件路径配置进 settings.json 的 "python.autoComplete.extraPaths"属性,如果不配置vscode会报错代码,但是编译不受影响
路径: /home/lee/lee_ws/.vscode/settings.json

{
    "python.autoComplete.extraPaths": [
        "/opt/ros/noetic/lib/python3/dist-packages",
        "/lee/catkin_ws/devel/lib/python3/dist-packages"
    ]
}

2、发布者代码 Python

路径: /home/lee/lee_ws/src/lee_msg/scripts/lee_msg_pub.py

2.1 代码部分

#! /usr/bin/env python
# coding=utf-8

import rospy
from lee_msg.msg import Person

if __name__ == "__main__":

    #初始化 ROS 节点:命名(唯一)
    rospy.init_node("lee_msg_pub")

    #创建一个Publisher,发布名为chatter的topic,消息类型为Person
    pub = rospy.Publisher("chatter_msg",Person,queue_size=10)

    #等待3秒钟,让publisher有足够的时间完成roscore注册,不然还未注册成功就开始发送消息了
    rospy.sleep(3)

    #组织发布的数据
    p = Person()
    p.name = "迪迦奥特曼"
    p.age = 2000
    p.height = 66.8

    #设置循环频率,13次
    rate = rospy.Rate(3)

    #节点存在,is_shutdown()1
    while not rospy.is_shutdown():

        #发布消息
        pub.publish(p)

        #终端打印发布的消息      
        rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f",p.name, p.age, p.height)

        #延时
        rate.sleep()  
        p.age = p.age+1

2.2 CMakeLists.txt部分

在install下面直接添加如下代码即可

catkin_install_python(PROGRAMS scripts/lee_msg_pub.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

3、订阅者代码 Python

路径: /home/lee/lee_ws/src/lee_msg/src/lee_msg_sub.cpp

3.1 代码部分

#! /usr/bin/env python
# coding=utf-8

import rospy
from lee_msg.msg import Person

#接收到订阅的消息后,进入回调函数
def chatterCallback(lee):
    rospy.loginfo("订阅的人信息:姓名:%s, 年龄:%d, 身高:%.2f",lee.name, lee.age, lee.height)

if __name__ == "__main__":

    #初始化 ROS 节点:命名(唯一)
    rospy.init_node("lee_msg_sub")

    #创建一个Subscriber,订阅名为chatter的topic,注册回调函数为chatterCallback
    sub = rospy.Subscriber("chatter_msg",Person,chatterCallback,queue_size=10)

    #设置循环调用回调函数
    rospy.spin() 

3.2 CMakeLists.txt部分

在install下面直接添加如下代码即可

catkin_install_python(PROGRAMS scripts/lee_msg_sub.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

4、代码测试

4.1 启动rosmaster

roscore

4.2 启动 lee_msg_pub 节点

rosrun lee_msg lee_msg_pub.py 

4.3 启动 lee_msg_sub 节点

rosrun lee_msg lee_msg_sub.py 

5、结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值