Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
71deeee
prelim
vauduong Feb 24, 2021
20c1ef7
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Feb 25, 2021
92871f1
First draft
vauduong Mar 1, 2021
aac0352
Fix log error message
vauduong Mar 1, 2021
4a12397
Add pointer to sensor in scene node
vauduong Mar 1, 2021
d1d2af8
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 1, 2021
8cbe2de
Remove pointer in scene node
vauduong Mar 1, 2021
d6d699e
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 1, 2021
20e2c78
Fix based on feedback, modify tests
vauduong Mar 3, 2021
9698012
Sensor Deconstructor
vauduong Mar 3, 2021
83d7d0e
Add Sensor to direct parent's nodeSensorSuite
vauduong Mar 3, 2021
4540094
Update bindings
vauduong Mar 3, 2021
a8c4a4f
Get destructors working
vauduong Mar 3, 2021
2d8248a
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 4, 2021
2661e68
Update magnum
vauduong Mar 4, 2021
00043be
Add comments, replace tests
vauduong Mar 4, 2021
e4ad3ce
~SceneNode calls deleteSensor, ~Sensor updates sensorSuites
vauduong Mar 4, 2021
fffbdc8
Have SceneNode handle SensorSuite updates
vauduong Mar 4, 2021
ccfb5d4
Fix comments, add flags, add delete methods in SensorFactory
vauduong Mar 5, 2021
1ce5651
Update SceneNode::setParent(), Improve API for SceneNodeTags
vauduong Mar 8, 2021
5ce9a32
Preliminary python
vauduong Mar 8, 2021
c1130a7
Revert "Update magnum"
vauduong Mar 8, 2021
770f0ef
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 8, 2021
f4103ae
Additional C++ tests
vauduong Mar 8, 2021
1d680e2
Deprecate sensorSuite and Sensor wrapper in python now that sensors a…
vauduong Mar 9, 2021
843be0d
Update src/esp/scene/SceneNode.cpp
vauduong Mar 9, 2021
fb33f4f
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 9, 2021
18c6330
SensorReader class
vauduong Mar 9, 2021
fff5cee
Have simulator drive drawing process
vauduong Mar 10, 2021
be3acb2
Revert python
vauduong Mar 10, 2021
62a6de1
Some C++ improvements, making test more robust, fixing typo
vauduong Mar 10, 2021
7887161
SceneNodeTag fix for initializing sensors directly
vauduong Mar 10, 2021
e7d7071
Fix python tests
vauduong Mar 11, 2021
d8e8ab9
Make agent's getSensors more clear by changing it to getSubtreeSensors
vauduong Mar 11, 2021
474f7cb
Fix segfault due to nullptr
vauduong Mar 11, 2021
db49b55
Fix 2
vauduong Mar 12, 2021
af3b5b4
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 12, 2021
bd58b6b
Add comments
vauduong Mar 12, 2021
19f86ad
Update SceneNode::setParent comments
vauduong Mar 12, 2021
1acfbc8
Address feedback, improvements to SceneNode SensorSuite management
vauduong Mar 13, 2021
09313a0
Address feedback
vauduong Mar 16, 2021
ec02f5e
Fix bindings
vauduong Mar 18, 2021
8ab22c1
Address feedback
vauduong Mar 18, 2021
99df7d9
Merge remote-tracking branch 'upstream/master' into node-sensor-suite
vauduong Mar 18, 2021
b34e44c
Fix js and comments
vauduong Mar 19, 2021
d0e58ad
Address feedback
vauduong Mar 19, 2021
003455e
clang-tidy
vauduong Mar 19, 2021
a7916dc
Address feedback
vauduong Mar 22, 2021
9dcfee3
Address feedback
vauduong Mar 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions habitat_sim/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
SceneNode,
SceneNodeType,
Sensor,
SensorFactory,
SensorSpec,
SensorSubType,
SensorType,
Expand Down
14 changes: 2 additions & 12 deletions habitat_sim/agent/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,8 @@ def _add_sensor(
if modify_agent_config:
assert spec not in self.agent_config.sensor_specifications
self.agent_config.sensor_specifications.append(spec)
if not spec.is_visual_sensor_spec:
raise ValueError(
f"""{spec.sensor_type} is a sensorType that is not implemented yet"""
)
CameraSensorSubTypeSet = {
habitat_sim.SensorSubType.PINHOLE,
habitat_sim.SensorSubType.ORTHOGRAPHIC,
}
if spec.sensor_subtype not in CameraSensorSubTypeSet:
raise ValueError(f"""{spec.sensor_subtype} is an illegal sensorSubType""")
# TODO: Add more checks for NonVisualSensorSpec, Other types of sensors
self._sensors.add(hsim.CameraSensor(self.scene_node.create_child(), spec))
sensor_suite = hsim.SensorFactory.create_sensors(self.scene_node, [spec])
self._sensors.add(sensor_suite[spec.uuid])

def act(self, action_id: Any) -> bool:
r"""Take the action specified by action_id
Expand Down
1 change: 1 addition & 0 deletions habitat_sim/bindings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
SceneNode,
SceneNodeType,
Sensor,
SensorFactory,
SensorSpec,
SensorSubType,
SensorType,
Expand Down
10 changes: 4 additions & 6 deletions src/esp/agent/Agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,12 @@ const std::set<std::string> Agent::BodyActions = {"moveRight", "moveLeft",
Agent::Agent(scene::SceneNode& agentNode, const AgentConfiguration& cfg)
: Magnum::SceneGraph::AbstractFeature3D(agentNode),
configuration_(cfg),
sensors_(),
controls_(scene::ObjectControls::create()) {
agentNode.setType(scene::SceneNodeType::AGENT);
} // Agent::Agent

Agent::~Agent() {
LOG(INFO) << "Deconstructing Agent";
sensors_.clear();
}

bool Agent::act(const std::string& actionName) {
Expand All @@ -40,8 +38,8 @@ bool Agent::act(const std::string& actionName) {
actionSpec.actuation.at("amount"),
/*applyFilter=*/true);
} else {
for (const auto& p : sensors_.getSensors()) {
controls_->action(p.second->object(), actionSpec.name,
for (const auto& p : node().getNodeSensors()) {
controls_->action(p.second.get().object(), actionSpec.name,
actionSpec.actuation.at("amount"),
/*applyFilter=*/false);
}
Expand Down Expand Up @@ -79,8 +77,8 @@ void Agent::setState(const AgentState& state,
node().setRotation(Magnum::Quaternion(quatf(rot)).normalized());

if (resetSensors) {
for (const auto& p : sensors_.getSensors()) {
p.second->setTransformationFromSpec();
for (auto& p : node().getNodeSensors()) {
p.second.get().setTransformationFromSpec();
}
}
// TODO other state members when implemented
Expand Down
30 changes: 22 additions & 8 deletions src/esp/agent/Agent.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
#include "esp/sensor/Sensor.h"

namespace esp {

namespace sensor {
class SensorSuite;
}
namespace agent {

// Represents the physical state of an agent
Expand Down Expand Up @@ -111,11 +115,6 @@ class Agent : public Magnum::SceneGraph::AbstractFeature3D {

void setState(const AgentState& state, const bool resetSensors = true);

// Set Agent's member sensors to sensorSuite
void setSensorSuite(sensor::SensorSuite&& sensorSuite) {
sensors_ = sensorSuite;
}

void setInitialState(const AgentState& state,
const bool resetSensors = true) {
initialState_ = state;
Expand All @@ -124,8 +123,24 @@ class Agent : public Magnum::SceneGraph::AbstractFeature3D {

scene::ObjectControls::ptr getControls() { return controls_; }

const sensor::SensorSuite& getSensorSuite() const { return sensors_; }
sensor::SensorSuite& getSensorSuite() { return sensors_; }
/**
* @brief Return SensorSuite containing references to superset of all Sensors
* held by this Agent's SceneNode and its children
*/
sensor::SensorSuite& getSubtreeSensorSuite() {
return node().getSubtreeSensorSuite();
}

/**
* @brief Return map containing references to superset of all Sensors held by
* this Agent's SceneNode and its children values.
* Keys of map are uuid strings, values are references to Sensors with that
* uuid
*/
std::map<std::string, std::reference_wrapper<sensor::Sensor>>&
getSubtreeSensors() {
return node().getSubtreeSensors();
}

const AgentConfiguration& getConfig() const { return configuration_; }
AgentConfiguration& getConfig() { return configuration_; }
Expand All @@ -138,7 +153,6 @@ class Agent : public Magnum::SceneGraph::AbstractFeature3D {

private:
AgentConfiguration configuration_;
sensor::SensorSuite sensors_;
scene::ObjectControls::ptr controls_;
AgentState initialState_;

Expand Down
14 changes: 13 additions & 1 deletion src/esp/bindings/SceneBindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ void initSceneBindings(py::module& m) {
.def(
"create_child", [](SceneNode& self) { return &self.createChild(); },
R"(Creates a child node, and sets its parent to the current node.)")
.def("set_parent", &SceneNode::setParent,
R"(Sets parent to parentNode, and updates ancestors' SensorSuites)")
.def(
"compute_cumulative_bb", &SceneNode::computeCumulativeBB,
R"(Recursively compute the approximate axis aligned bounding boxes of the SceneGraph sub-tree rooted at this node.)")
Expand All @@ -72,7 +74,17 @@ void initSceneBindings(py::module& m) {
py::overload_cast<>(&SceneNode::absoluteTranslation))
.def_property_readonly(
"absolute_translation",
py::overload_cast<>(&SceneNode::absoluteTranslation, py::const_));
py::overload_cast<>(&SceneNode::absoluteTranslation, py::const_))
.def_property_readonly("node_sensor_suite",
&SceneNode::getNodeSensorSuite,
R"(Get node SensorSuite of this SceneNode)")
.def_property_readonly("subtree_sensor_suite",
&SceneNode::getSubtreeSensorSuite,
R"(Get subtree SensorSuite of this SceneNode)")
.def_property_readonly("node_sensors", &SceneNode::getNodeSensors,
R"(Get node sensors of this SceneNode)")
.def_property_readonly("subtree_sensors", &SceneNode::getSubtreeSensors,
R"(Get subtree sensors of this SceneNode)");

py::class_<SceneGraph>(m, "SceneGraph")
.def(py::init())
Expand Down
23 changes: 23 additions & 0 deletions src/esp/bindings/SensorBindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "esp/sensor/RedwoodNoiseModel.h"
#endif
#include "esp/sensor/Sensor.h"
#include "esp/sensor/SensorFactory.h"
#include "esp/sim/Simulator.h"

namespace py = pybind11;
Expand Down Expand Up @@ -96,6 +97,28 @@ void initSensorBindings(py::module& m) {
.def(py::init(&CameraSensorSpec::create<>))
.def_readwrite("ortho_scale", &CameraSensorSpec::orthoScale);

// ==== SensorFactory ====
py::class_<SensorFactory>(m, "SensorFactory")
.def("create_sensors", &SensorFactory::createSensors)
.def("delete_sensor", &SensorFactory::deleteSensor)
.def("delete_subtree_sensor", &SensorFactory::deleteSubtreeSensor);

// ==== SensorSuite ====
py::class_<SensorSuite, Magnum::SceneGraph::PyFeature<SensorSuite>,
Magnum::SceneGraph::AbstractFeature3D,
Magnum::SceneGraph::PyFeatureHolder<SensorSuite>>(m, "SensorSuite")
.def("add", &SensorSuite::add)
.def("remove", py::overload_cast<const Sensor&>(&SensorSuite::remove))
.def("remove",
py::overload_cast<const std::string&>(&SensorSuite::remove))
.def("clear", &SensorSuite::clear)
.def("get", &SensorSuite::get)
.def("get_sensors",
py::overload_cast<>(&SensorSuite::getSensors, py::const_))
.def_property_readonly("node", nodeGetter<Sensor>,
"Node this object is attached to")
.def_property_readonly("object", nodeGetter<Sensor>, "Alias to node");

// ==== Sensor ====
py::class_<Sensor, Magnum::SceneGraph::PyFeature<Sensor>,
Magnum::SceneGraph::AbstractFeature3D,
Expand Down
20 changes: 12 additions & 8 deletions src/esp/bindings_js/bindings_js.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ std::map<std::string, ObservationSpace> Simulator_getAgentObservationSpaces(
return spaces;
}

std::map<std::string, Sensor::ptr> Agent_getSubtreeSensors(Agent& agent) {
std::map<std::string, Sensor::ptr> jsSensors =
std::map<std::string, Sensor::ptr>();
for (auto& entry : agent.node().getSubtreeSensors()) {
jsSensors[entry.first] = std::shared_ptr<Sensor>(&entry.second.get());
}
return jsSensors;
}

template <class T, typename... Targs>
static inline auto create(Targs&&... args) {
return std::make_shared<T>(std::forward<Targs>(args)...);
Expand Down Expand Up @@ -102,7 +111,6 @@ EMSCRIPTEN_BINDINGS(habitat_sim_bindings_js) {
em::register_vector<std::shared_ptr<SemanticCategory>>(
"VectorSemanticCategories");
em::register_vector<std::shared_ptr<SemanticObject>>("VectorSemanticObjects");

em::register_map<std::string, float>("MapStringFloat");
em::register_map<std::string, std::string>("MapStringString");
em::register_map<std::string, Sensor::ptr>("MapStringSensor");
Expand Down Expand Up @@ -192,10 +200,6 @@ EMSCRIPTEN_BINDINGS(habitat_sim_bindings_js) {
.property("bounds", &PathFinder::bounds)
.function("isNavigable", &PathFinder::isNavigable);

em::class_<SensorSuite>("SensorSuite")
.smart_ptr_constructor("SensorSuite", &SensorSuite::create<>)
.function("get", &SensorSuite::get);

em::enum_<SensorType>("SensorType")
.value("NONE", SensorType::None)
.value("COLOR", SensorType::Color)
Expand All @@ -212,6 +216,7 @@ EMSCRIPTEN_BINDINGS(habitat_sim_bindings_js) {
.value("NONE", SensorSubType::None)
.value("PINHOLE", SensorSubType::Pinhole)
.value("ORTHOGRAPHIC", SensorSubType::Orthographic);

em::class_<SensorSpec>("SensorSpec")
.smart_ptr_constructor("SensorSpec", &SensorSpec::create<>)
.property("uuid", &SensorSpec::uuid)
Expand Down Expand Up @@ -261,12 +266,11 @@ EMSCRIPTEN_BINDINGS(habitat_sim_bindings_js) {
.property("config",
em::select_overload<const AgentConfiguration&() const>(
&Agent::getConfig))
.property("sensorSuite", em::select_overload<const SensorSuite&() const>(
&Agent::getSensorSuite))
.function("getState", &Agent::getState)
.function("setState", &Agent::setState)
.function("hasAction", &Agent::hasAction)
.function("act", &Agent::act);
.function("act", &Agent::act)
.function("getSubtreeSensors", &Agent_getSubtreeSensors);

em::class_<Observation>("Observation")
.smart_ptr_constructor("Observation", &Observation::create<>)
Expand Down
6 changes: 3 additions & 3 deletions src/esp/bindings_js/modules/vr_demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class VRDemo extends WebDemo {

this.sensorSpecs = new Array(VIEW_SENSORS.length);
for (var iView = 0; iView < VIEW_SENSORS.length; ++iView) {
const sensor = agent.sensorSuite.get(VIEW_SENSORS[iView]);
const sensor = agent.getSubtreeSensors().get(VIEW_SENSORS[iView]);

this.sensorSpecs[iView] = sensor.specification();
}
Expand Down Expand Up @@ -351,7 +351,7 @@ class VRDemo extends WebDemo {
for (var iView = 0; iView < pose.views.length; ++iView) {
const view = pose.views[iView];

const sensor = agent.sensorSuite.get(VIEW_SENSORS[iView]);
const sensor = agent.getSubtreeSensors().get(VIEW_SENSORS[iView]);

const pos = pointToArray(view.transform.position).slice(0, -1); // don't need w for position
sensor.setLocalTransform(
Expand Down Expand Up @@ -393,7 +393,7 @@ class VRDemo extends WebDemo {
const viewport = layer.getViewport(view);
this.gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);

const sensor = agent.sensorSuite.get(VIEW_SENSORS[iView]);
const sensor = agent.getSubtreeSensors().get(VIEW_SENSORS[iView]);
const texRes = this.sensorSpecs[iView].resolution;
const texData = sensor.getObservation(this.simenv.sim).getData();
this.drawTextureData(texRes, texData);
Expand Down
Loading