有效地设置大元组中的值

时间:2015-03-04 17:46:16

标签: python tuples ros large-data

我正在使用ROS而且我目前正试图通过一个costmap,所以基本上我想要改变一个元组中的单个值,这个元组的长度接近7位数。

请参阅http://docs.ros.org/api/nav_msgs/html/msg/OccupancyGrid.html

最初我尝试将这个长元组转换成一个列表然后更改值然后将其转换为元组,因为您可以想象这非常低效。我需要这个能够快速运行,因为它需要经常更新costmap以避免动态对象。

有没有办法可以有效地更改元组中的各个值?

2 个答案:

答案 0 :(得分:2)

可悲的是,这只是ROS python message data model的限制。出于性能原因,类似于数组的结构总是被反序列化为tuple,除了bool的列表由于某种原因。 tuple是不可变的。

但是,如果您使用的是C ++空间,那么无论如何都会收到const OccupancyGridConstPtr&,所以它仍然是不可变的。或者您可以将回调注册为OccupancyGrid message并获取按值传递,但您只需将副本移至方法调用时。如果您打算修改网格,那么就无法避免复制,无论您使用的是Python还是C ++。

不需要转换回元组,但ROS的python消息序列化接受listtuple

如果您可以在该副本中执行某些处理工作(在网格上保存迭代),您也可以获得相当高的效率。虽然我不确切地知道你要做什么,所以我不知道那是否可行。

答案 1 :(得分:0)

元组是不可变的这个事实应该是一个特性,而不是一个bug 。 因此,如果您需要进行更改,数据可能不应该首先处于元组形式。 你不能从头到尾有一个清单吗? (我不知道ROS)

如果这是不可能的,我会说你要么在软件设计上遇到严重问题,要么就是在试图解决错误的问题。