• ROS2报错 AttributeError: type object ‘type‘ has no attribute ‘_TYPE_SUPPORT‘


    问题描述:

    今天在用python写ROS2编写发布者和订阅者,然后需要用到自己的写的接口,在写完之后,使用colcon build并没有报错,并且可以使用ros2 interface show my_interface指令查看到自己定义的接口详细类型,但是在使用ros2 run node my_node的时候,出现了以下报错

    AttributeError: type object 'type' has no attribute '_TYPE_SUPPORT' This might be a ROS 1 message type but it should be a ROS 2 message type. Make sure to source your ROS 2 workspace after your ROS 1 workspace.
    
    • 1

    运行环境:
    树莓派
    ubuntu 22.04
    ROS2 humble


    问题分析及解决

    自己自定义的接口所处的文件树大致如下图

    src/
    ├── can_interfaces
    │   ├── msg
    │   │  ├── Can.msg
    ...
    ├── swrob_can
    │   ├── canbus.py
    │   ├── CAN_Recv.py
    │   ├── CAN_Send.py
    │   ├── __init__.py
    │   ├── ...
    ...
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Can.msg内容如下

    float32[2] data
    
    • 1

    检查了一下代码,发现自己的出错代码就是在自己的发布者和订阅者的创建这两行代码当中

    ...
    from can_interfaces.msg import data #这行有问题
    ...
    
    class MotorControlCan:
        def __init__(self,...):
        	...
        	
    Motor_Monitor = MotorControlCan()
    
    class CanBus(Node):
        def __init__(self,name):
            super().__init__(name)
            self.get_logger().info("test node:%s" % name)
            self.pub_data = self.create_publisher(Motor_Monitor,"motor",10) # 这行使用了自己定义的类
            self.recv_data = self.create_subscription(data, "motorcontrol",self.recvdata_callback,10)
            ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    最后检查测试发现,其实这里有两个错误,第一个是发布者的时候,第一个参数使用了自己定义的类,第二个错误是通过import部分内容有误,这个错误总结可以有以下几种可能

    • 创建发布者和订阅者的时候,不能够使用自己定义的类的名称,而应该使用自定义md sg中d消息,而自定义的消息类型必须要基于以下原始数据类型

    ros2下的原始数据类型

    1. bool
    2. byte
    3. char
    4. float32, float64
    5. int8, uint8
    6. int16, uint16
    7. int32, uint32
    8. int64, uint64
    9. string
    • 创建发布者的时候的第一个参数,名字不要写错,一定要和自定义消息类型中的变量名字一样,且一定要编译!
    • import的时候,应该是from msg所在文件目录.msg import 文件名字,如修改前面的错误应该是from can_interfaces.msg import Can

  • 相关阅读:
    KMP算法
    ISL1208时钟芯片 Linux下 i2c 读写示例。
    harbor安装
    R语言因子分析全流程
    AVB(二):DTO 支持
    英集芯推出4串锂电池100W移动电源升降压方案SoC芯片IP5389
    redis持久化之AOF(Append Only File)
    故障诊断模型 | Maltab实现RF随机森林的故障诊断
    以入库时间创建分区表
    gitHooks使用教程
  • 原文地址:https://blog.csdn.net/scarecrow_sun/article/details/127640775