ROS MultiArray型 を Python で扱う際の注意


ROS で配列を Publish したかったときに詰まったので共有します


最初はC++ の書き方を真似てこうすればいけるやろ!
ってやると...

import rospy
from std_msgs.msg import Float32MultiArray

def talker():
    pub = rospy.Publisher('/hoge', Float32MultiArray, queue_size=10)

    array=Float32MultiArray()
    array.data.resize(5)
    i=0
    for p in range(5):
        array.data[i]=p
        i+=1

    pub.publish(array)

AttributeError: 'list' object has no attribute 'resize'

と怒られました.

2020/12/20 追記

こちらのコメントでご指摘を受けているように,
このコードではPythonのList型がresizeという関数を持っていないため,エラーになっています.

この間違いはC++とPythonの型の違いに起因しています.
C++ではfloat32[]型で定義されていて,resize関数を使って配列長を拡張してからデータを入れる必要があるのに対し,
PythonではList型が使用されているため,配列長に影響されず,append関数で要素を追加することができる.

という感じになっています.


正解の文こちら
動作するものは以下

import rospy
from std_msgs.msg import Float32MultiArray

def talker():
    pub = rospy.Publisher('/hoge', Float32MultiArray, queue_size=10)

    array=[]

    for p in range(5):
        array.append(p)

    array_forPublish = Float32MultiArray(data=array)
    pub.publish(array_forPublish)

一度List型にぶちこんでから MultiArray に変換するといけます