:'必需的参数不是浮点数',在写入'data:[x,y]'

问题描述 投票:0回答:1

我认为这个问题很愚蠢。

我想在两台计算机上运行代码,我需要使用list。我遵循了此Tutorials

我用PC作为发声器,而使用机器人的计算机作为听众。

在我的PC上运行代码时,根据需要输出良好。

[INFO] [1574230834.705510]: [3.0, 2.1]
[INFO] [1574230834.805443]: [3.0, 2.1]

但是一旦在机器人计算机上运行代码,输出为:

Traceback (most recent call last):
  File "/home/redhwan/learn.py", line 28, in <module>
    talker()
  File "/home/redhwan/learn.py", line 23, in talker
    pub.publish(position.data)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 886, in publish
    raise ROSSerializationException(str(e))
rospy.exceptions.ROSSerializationException: <class 'struct.error'>: 'required argument is not a float' when writing 'data: [3.0, 2.1]'

PC上的完整代码:

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float32
x = 3.0
y = 2.1

def talker():
    # if a == None:
    pub = rospy.Publisher('position', Float32, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    # rospy.init_node('talker')
    rate = rospy.Rate(10) # 10hz

    while not rospy.is_shutdown():
        position = Float32()
        a = [x,y]
        # a = x
        position.data = list(a)
        # position.data = a
        # hello_str = [5.0 , 6.1]
        rospy.loginfo(position.data)

        pub.publish(position.data)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

机器人计算机上的完整代码:

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float32


def callback(data):
    # a = list(data)
    a = data.data
    print a

def listener():

    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber("position", Float32, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()


if __name__ == '__main__':
    listener()

当使用一个数字作为浮点数时,一切正常。

我了解如何分别以float的形式发布和订阅它们,但我想以list的形式进行发布和订阅

任何想法或建议,将不胜感激。

list python-2.7 ros robot
1个回答
0
投票
因此,对于float数组,Float32MultiArray是您的朋友。在一侧填充消息看起来像这样(只是一个使用2个元素的float32数组的示例):

. . . while (ros::ok()) { std_msgs::Float32MultiArray velocities; velocities.layout.dim.push_back(std_msgs::MultiArrayDimension()); velocities.layout.dim[0].label = "velocities"; velocities.layout.dim[0].size = 2; velocities.layout.dim[0].stride = 1; velocities.data.clear(); velocities.data.push_back(count % 255); velocities.data.push_back(-(count % 255)); velocities_demo_pub.publish(velocities); ros::spinOnce(); loop_rate.sleep(); ++count; } . . .

另一方面,您的回调将如下所示:

.
.
.
void hardware_interface::velocity_callback(const std_msgs::Float32MultiArray::ConstPtr &msg) {
    //velocities.clear();
    if (velocities.size() == 0) {
        velocities.push_back(msg->data[0]);
        velocities.push_back(msg->data[1]);
    } else {
        velocities[0] = msg->data[0];
        velocities[1] = msg->data[1];
    }
    vel1 = msg->data[0];
    vel2 = msg->data[1];
    //ROS_INFO("Vel_left: [%f] - Vel_right: [%f]", vel1 , vel2);
}
.
.
.

希望你有个主意...

© www.soinside.com 2019 - 2024. All rights reserved.