Python环境下ROS2如何检测对象是否为ROS消息类型
ROS2中判断ROS消息对象的实现方法
ROS2的Python消息生成机制没有沿用ROS1的公共基类设计,所以无法通过类继承链(__mro__)找到统一的父类做类型判断,官方提供的标准判断接口在rosidl_runtime_py包中。
标准判断实现
直接引入官方工具方法即可完成判断,兼容所有ROS2发行版(Foxy及后续版本):
from rosidl_runtime_py.utilities import is_message # 传入待判断的对象,返回True即为合法ROS2消息实例 check_result = is_message(your_obj)
这个方法可以正确识别所有ROS2消息类型,包括普通话题消息、服务的请求/响应对象、动作的目标/结果/反馈对象,不会出现漏判、误判。
判断逻辑说明
is_message不依赖类继承关系判断,而是校验对象是否符合ROS2消息的固定结构规范:
- 检查类是否携带
__msg_type__标识属性 - 校验是否存在ROS2消息要求的序列化、反序列化、类型获取等标准方法
这种设计避开了无公共基类的问题,也比自行判断属性存在性更严谨,不会把自定义的同名属性类误判为ROS消息。
验证示例
对应继承链测试场景,验证效果如下:
>>> from example_interfaces.srv import AddTwoInts >>> from rosidl_runtime_py.utilities import is_message >>> req = AddTwoInts.Request() >>> print(is_message(req)) True >>> print(is_message(object())) False
如果需要区分服务类型、动作类型,同模块下还提供了is_service()、is_action()等对应判断方法,可以直接调用。
内容的提问来源于stack exchange,提问作者Iñigo Moreno
相关产品推荐
相关产品推荐

