交换主题中的浮动列表时出错

Error exchanging list of floats in a topic

我认为这个问题很愚蠢。

我想运行两台电脑上的代码,我需要使用一台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

的形式进行

如有任何想法或建议,我们将不胜感激。

在ROS中交换消息时,如果比较简单的话,优先采用standard messages。当然,当您开发更复杂的系统(或模块)时,您可以实现自己的自定义消息。

所以对于浮点数组,Float32MultiArray 是你的朋友。 在一侧填充消息在 C++ 中看起来像这样(只是一个使用 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;
  }
.
.
.

在 Python 中,对于 8 个元素的数组,示例如下所示:

。 . . 而不是 rospy.is_shutdown():

# compose the multiarray message
pwmVelocities = Float32MultiArray()

myLayout = MultiArrayLayout()

myMultiArrayDimension = MultiArrayDimension()

myMultiArrayDimension.label = "motion_cmd"
myMultiArrayDimension.size = 1
myMultiArrayDimension.stride = 8

myLayout.dim = [myMultiArrayDimension]
myLayout.data_offset = 0

pwmVelocities.layout = myLayout
pwmVelocities.data = [0, 10.0, 0, 10.0, 0, 10.0, 0, 10.0]

# publish the message and log in terminal
pub.publish(pwmVelocities)
rospy.loginfo("I'm publishing: [%f, %f, %f, %f, %f, %f, %f, %f]" % (pwmVelocities.data[0], pwmVelocities.data[1],
  pwmVelocities.data[2], pwmVelocities.data[3], pwmVelocities.data[4], pwmVelocities.data[5],
  pwmVelocities.data[6], pwmVelocities.data[7]))

# repeat
r.sleep()

。 . .

另一方面,您的回调(在 C++ 中)将如下所示:

.
.
.
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);
}
.
.
.

希望您有想法...如果您需要更多信息,请给我留言!