Python订阅自定义ROS topic并读取message

背景

最近部署了基于ROS的实时稠密场景建图, 参考Elastic_bridge. 现在需要用python获取相机每一时刻的pose。该pose的消息类型定义在FrameState.msg 文件中。具体内容如下

uint64 seq
uint64 width
uint64 height

# intrinsics, in pixels
float32 focal_x
float32 focal_y
float32 center_x
float32 center_y

# current sensor pose
geometry_msgs/Pose pose

# SYNTHETIC, generated by ElasticFusion
float32[] color    # 3 float per pixel
float32[] depth    # 1 float per pixel
float32[] position # 3 float per pixel

uint64[] guid         # 1 guid per pixel
uint32[] luid         # 1 luid per pixel
uint32[] luid_removed # luids of surfels removed in this frame
uint32 max_luid

float32[] normal  # 3 float per pixel
float32[] radius  # 1 float per pixel

# INPUT for this frame, from the RGB-D sensor
uint8[] input_color   # RGB, 3 byte per pixel
uint16[] input_depth  # DEPTH, in mm

目录结构

创建如下的文件结构。
catkin_ws/
├── src
│ ├── msg
│ │ └── FrameState.msg
│ ├── listener.py
│ ├── CMakeLists.txt
│ └── package.xml
└──
其中CMakeLists.txt和package.xml参考了其他博客的写法。如下:

CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(elastic_bridge)

find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
  geometry_msgs
  trajectory_msgs
  message_generation
)

add_message_files(
  FILES
  FrameState.msg
)

generate_messages(
DEPENDENCIES
std_msgs
geometry_msgs
trajectory_msgs
elastic_bridge
)

catkin_package(
#INCLUDE_DIRS include
#LIBRARIES test_py
CATKIN_DEPENDS rospy message_runtime
DEPENDS system_lib
)

include_directories(
  ${catkin_INCLUDE_DIRS}
)

package.xml
<package>
  <name>elastic_bridge</name>
  <version>0.0.0</version>
  <description>The elastic_bridge package</description>

  <maintainer email="zh@todo.todo">smile</maintainer>

  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>

  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>
  <run_depend>message_runtime</run_depend>

</package>

listener.py
# !/usr/bin/env python

import rospy
from elastic_bridge.msg import FrameState


def callback(data):
    rospy.loginfo('Debug info')
    rospy.loginfo(data.pose)

def listener():
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('/elastic_frame_state_stable', FrameState, callback)

    rospy.spin()

if __name__ == '__main__':
    listener()

编译workspace

按如上目录结构设置好代码之后,对python脚本添加可执行权限

chmod +x src/listener.py

然后切换到~/catkin_ws目录下编译, 编译完成后会生成builddevel文件夹

cd ~/catkin_ws
catkin_make

完成后按照如下命令运行即可。最终我们可以通过python订阅到ROS topic发送过来的消息

source devel/setup.bash
python listerner.py

注意事项

  • package.xmlCMakeLists.txt中project的名字要和想订阅的topic对应的工程名相同。也可能不需要,但是在这个项目中如果随意指定project名字的话会报错。报错信息如下

    [ERROR] [1319162712.616980036]: Client [/clientNodeA] wants topic /server_msgs/Swarm 
    to have datatype/md5sum [server_msgs/Swarm/6a727e7bfd7e4aadf9d23c4a779b268e], 
    but our version has [geometry_msgs/Point/4a842b65f413084dc2b10fb484ea7f17]. 
    Dropping connection.
    

注意事项2

  • package.xmlCMakeLists.txt中project的名字要和想订阅的topic对应的工程名相同。也可能不需要,但是在这个项目中如果随意指定project名字的话会报错。报错信息如下

    [ERROR] [1319162712.616980036]: Client [/clientNodeA] wants topic /server_msgs/Swarm 
    to have datatype/md5sum [server_msgs/Swarm/6a727e7bfd7e4aadf9d23c4a779b268e], 
    but our version has [geometry_msgs/Point/4a842b65f413084dc2b10fb484ea7f17]. 
    Dropping connection.
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tinet-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值