今天在用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.
运行环境:
树莓派
ubuntu 22.04
ROS2 humble
自己自定义的接口所处的文件树大致如下图
src/
├── can_interfaces
│ ├── msg
│ │ ├── Can.msg
...
├── swrob_can
│ ├── canbus.py
│ ├── CAN_Recv.py
│ ├── CAN_Send.py
│ ├── __init__.py
│ ├── ...
...
Can.msg
内容如下
float32[2] data
检查了一下代码,发现自己的出错代码就是在自己的发布者和订阅者的创建这两行代码当中
...
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)
...
最后检查测试发现,其实这里有两个错误,第一个是发布者的时候,第一个参数使用了自己定义的类,第二个错误是通过import部分内容有误,这个错误总结可以有以下几种可能
ros2下的原始数据类型
- bool
- byte
- char
- float32, float64
- int8, uint8
- int16, uint16
- int32, uint32
- int64, uint64
- string
from msg所在文件目录.msg import 文件名字
,如修改前面的错误应该是from can_interfaces.msg import Can