ROS用python编写订阅者和发布者(使用存放在其他package的自定义msg文件)

本文记录一下用python编写使用自定义消息的ros订阅者和发布者时存在的一些问题。

声明一下,本文的代码是从自己项目工程截取的,不适合直接使用,只适合作为参照模板

1、首先是如何创建msg文件和编译

文件结构如图:

catkin_ws
├── build
├── devel
└── src
    ├── robot_msgs
    │   ├── CMakeLists.txt
    │   ├── msg
    │   │   └── Controldata.msg
    │   └── package.xml
    └── tcp_ros
        └── script
            └── test.py

catkin_ws工作空间里有两个package,一个只用来存放消息(可自行添加更多消息),一个用于存放代码。

Controldata.msg消息文件如下:

uint32   cmd
float32 param1
float32 param2

在robot_msgs包里的CMakerList.txt:

cmake_minimum_required(VERSION 2.8.3)
project(robot_msgs)
#这里添加依赖message_generation 用于生成消息
find_package(catkin REQUIRED COMPONENTS
  message_generation
  std_msgs
  geometry_msgs
)
#这里添加消息文件Controldata.msg
add_message_files(
  DIRECTORY msg
  FILES
  Controldata.msg
)

generate_messages(DEPENDENCIES std_msgs geometry_msgs)
 #这里增加消息生成包message_runtime
catkin_package(CATKIN_DEPENDS message_runtime std_msgs geometry_msgs)

在robot_msgs包里的package.xml添加如下:

<build_depend>message_generationbuild_depend>
<run_depend>message_runtimerun_depend>

在tcp_ros包里的CMakerList:

find_package(catkin REQUIRED COMPONENTS   #查找robot_msgs包
  roscpp
  rospy
  std_msgs
  robot_msgs
)
catkin_package(                           #包含robot_msgs包
  INCLUDE_DIRS include
  LIBRARIES tjurobot
  CATKIN_DEPENDS roscpp rospy std_msgs robot_msgs message_runtime
  DEPENDS system_lib
)

2、python编写的发布者节点

  • 发布者程序: 关键是如何在python节点里导入存在其他package的msg文件!!

import rospy
from robot_msgs.msg import Controldata

def talker():
    pub = rospy.Publisher('chatter', Controldata, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        send_msg = Controldata()
        send_msg.cmd =0X15
        send_msg.param1 = 123
        send_msg.param2 = 0
        pub.publish(send_msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

3、python编写的订阅者节点

  • 订阅者程序: 关键是如何在回调函数里运用话题数据

import rospy
from robot_msgs.msg import Controldata

def callback_fuc(data):
    rospy.loginfo("I heard %d,%d,%d", data.cmd,data.param1,data.param2)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("chatter", Controldata, callback_fuc)
    rospy.spin()

if __name__ == '__main__':
    listener()

关于如何解决rospy.spin()后程序卡死无法执行的问题可参照该博客:

Original: https://blog.csdn.net/lkh999999/article/details/123014952
Author: 一坨小白菜
Title: ROS用python编写订阅者和发布者(使用存放在其他package的自定义msg文件)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/111643/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部