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_generation</build_depend>
<run_depend>message_runtime</run_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文件!!

    #!/usr/bin/env python
    # license removed for brevity
    import rospy
    from robot_msgs.msg import Controldata  #翻译为:从robot_msgs包里的msg文件夹内导入名为Controldata的msg文件!
    
    def talker():
        pub = rospy.Publisher('chatter', Controldata, queue_size=10)  #设置发布话题名为“chatter”,消息类型为Controldata.msg,消息队列最大容量为10帧的对象pub
        rospy.init_node('talker', anonymous=True)   #初始化名为“talker”的节点
        rate = rospy.Rate(10) # 10hz     
        while not rospy.is_shutdown():
            send_msg = Controldata()   #初始化一个消息结构体:直接以该msg文件名作为函数
            send_msg.cmd =0X15      #给send_msg结构体内参数赋值(也就是该msg文件内参数)
            send_msg.param1 = 123
            send_msg.param2 = 0
            pub.publish(send_msg)    #调用pub对象的publish函数发布话题
            rate.sleep()    #在循环中可以用刚刚好的睡眠时间维持期望的速率,适用于需要不停发布的话题
    
    if __name__ == '__main__':
        try:
            talker()
        except rospy.ROSInterruptException:
            pass
    

3、python编写的订阅者节点

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

    #!/usr/bin/env python
    import rospy
    from robot_msgs.msg import Controldata
    
    def callback_fuc(data):      #该data则相当于发布者的send_msg结构体
        rospy.loginfo("I heard %d,%d,%d", data.cmd,data.param1,data.param2)
        
    def listener():
        rospy.init_node('listener', anonymous=True)  #初始化名为“listener”的订阅者节点:anonymous=True会为节点生成唯一的名称避免节点重名
        rospy.Subscriber("chatter", Controldata, callback_fuc)  #设置订阅者属性:订阅的话题名“chatter”,话题对应的msg消息文件名,回调函数名
        rospy.spin()     #必须要有,否则无法接收,但会相当于死循环程序会卡在这里
        
    if __name__ == '__main__':
        listener()
    

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

(94条消息) 解决rospy.spin()一直循环,无法执行剩余程序_DLUT_小叮当的博客-CSDN博客_rospy.spin

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS2中,可以使用Python创建自定义消息。下面是一些步骤: 1. 创建一个ROS2工作空间,如果您已经有了ROS2工作空间,可以跳过此步骤。 ``` mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ``` 2. 在src目录下创建一个包,比如叫做my_msgs。 ``` ros2 pkg create --build-type ament_python my_msgs ``` 3. 创建消息文件,在msg目录下创建一个文件,比如叫做MyMessage.msg。 ``` cd ~/ros2_ws/src/my_msgs mkdir msg touch msg/MyMessage.msg ``` 4. 在MyMessage.msg中定义您的自定义消息。 ``` # My custom message string name float32 age ``` 5. 在package.xml中添加对于Python的依赖。 ``` <build_depend>ament_python</build_depend> <exec_depend>ament_python</exec_depend> ``` 6. 在setup.py中添加Python包的信息。 ``` from setuptools import setup package_name = 'my_msgs' setup( name=package_name, version='0.0.0', packages=[], py_modules=[ 'my_msgs' ], install_requires=['setuptools'], author='Your Name', author_email='your.name@example.com', maintainer='Your Name', maintainer_email='your.name@example.com', keywords=['ROS'], classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Topic :: Software Development', ], description='ROS2 custom message package.', license='Apache License, Version 2.0', test_suite='test', entry_points={ 'console_scripts': [ ], }, ) ``` 7. 在CMakeLists.txt中添加Python的依赖。 ``` find_package(ament_cmake REQUIRED) find_package(ament_python REQUIRED) ament_python_install_package(${PROJECT_NAME}) ament_package() ``` 8. 编译您的ROS2工作空间。 ``` cd ~/ros2_ws colcon build --packages-select my_msgs ``` 9. 您现在可以使用您的自定义消息了。在Python中导入您的消息。 ``` from my_msgs.msg import MyMessage ``` 10. 创建一个发布者订阅者,以及发布或订阅您的自定义消息。 这样,您就可以在ROS2中使用Python创建自定义消息了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值