8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-05

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 に変換するといけます

8
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?