Add support for accessing and modifying sensor data Array elements

This commit is contained in:
nsubiron 2018-10-18 12:38:10 +02:00
parent e08b4e6cfd
commit 4da71fc39f
3 changed files with 69 additions and 8 deletions

View File

@ -103,6 +103,8 @@
- `save_to_disk(path, color_converter=None)`
- `__len__()`
- `__iter__()`
- `__getitem__(pos)`
- `__setitem__(pos, color)`
## `carla.LidarMeasurement`
@ -115,6 +117,8 @@
- `save_to_disk(path)`
- `__len__()`
- `__iter__()`
- `__getitem__(pos)`
- `__setitem__(pos, location)`
## `carla.VehicleControl`

View File

@ -9,8 +9,9 @@
#include "carla/Debug.h"
#include "carla/sensor/SensorData.h"
#include <type_traits>
#include <exception>
#include <iterator>
#include <type_traits>
namespace carla {
namespace sensor {
@ -24,9 +25,13 @@ namespace data {
using value_type = T;
using iterator = value_type *;
using const_iterator = typename std::add_const<value_type>::type *;
using size_type = typename std::iterator_traits<iterator>::difference_type;
using pointer = typename std::iterator_traits<iterator>::pointer;
using reference = typename std::iterator_traits<iterator>::reference;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
using size_type = size_t;
using pointer = value_type *;
using const_pointer = typename std::add_const<value_type>::type *;
using reference = value_type &;
using const_reference = typename std::add_const<value_type>::type &;
iterator begin() {
return reinterpret_cast<iterator>(_data.begin() + _offset);
@ -52,6 +57,30 @@ namespace data {
return cend();
}
reverse_iterator rbegin() {
return reverse_iterator(begin());
}
const_reverse_iterator crbegin() const {
return const_reverse_iterator(cbegin());
}
const_reverse_iterator rbegin() const {
return crbegin();
}
reverse_iterator rend() {
return reverse_iterator(end());
}
const_reverse_iterator crend() const {
return const_reverse_iterator(cend());
}
const_reverse_iterator rend() const {
return crend();
}
bool empty() const {
return begin() == end();
}
@ -68,12 +97,26 @@ namespace data {
return begin();
}
reference operator[](size_type i) {
return data()[i];
reference operator[](size_type pos) {
return data()[pos];
}
const reference operator[](size_type i) const {
return data()[i];
const_reference operator[](size_type pos) const {
return data()[pos];
}
reference at(size_type pos) {
if (!(pos < size())) {
throw std::out_of_range("Array index out of range");
}
return operator[](pos);
}
const_reference at(size_type pos) const {
if (!(pos < size())) {
throw std::out_of_range("Array index out of range");
}
return operator[](pos);
}
protected:
@ -91,6 +134,7 @@ namespace data {
DEBUG_ASSERT(_data.size() >= _offset);
DEBUG_ASSERT((_data.size() - _offset) % sizeof(T) == 0u);
_offset = offset;
DEBUG_ASSERT(begin() <= end());
}
const RawData &GetRawData() const {

View File

@ -117,6 +117,7 @@ static std::string SavePointCloudToDisk(T &self, std::string path) {
void export_sensor_data() {
using namespace boost::python;
namespace cc = carla::client;
namespace cr = carla::rpc;
namespace cs = carla::sensor;
namespace csd = carla::sensor::data;
@ -141,6 +142,12 @@ void export_sensor_data() {
.def("save_to_disk", &SaveImageToDisk<csd::Image>, (arg("path"), arg("color_converter")=EColorConverter::None))
.def("__len__", &csd::Image::size)
.def("__iter__", iterator<csd::Image>())
.def("__getitem__", +[](const csd::Image &self, size_t pos) -> csd::Color {
return self.at(pos);
})
.def("__setitem__", +[](csd::Image &self, size_t pos, csd::Color color) {
self.at(pos) = color;
})
.def(self_ns::str(self_ns::self))
;
@ -152,6 +159,12 @@ void export_sensor_data() {
.def("save_to_disk", &SavePointCloudToDisk<csd::LidarMeasurement>, (arg("path")))
.def("__len__", &csd::LidarMeasurement::size)
.def("__iter__", iterator<csd::LidarMeasurement>())
.def("__getitem__", +[](const csd::LidarMeasurement &self, size_t pos) -> cr::Location {
return self.at(pos);
})
.def("__setitem__", +[](csd::LidarMeasurement &self, size_t pos, const cr::Location &point) {
self.at(pos) = point;
})
.def(self_ns::str(self_ns::self))
;
}