Created
March 15, 2017 21:47
-
-
Save david-german-tri/0021ef9ff01602e12bf0776b95a7413e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "drake/automotive/gen/driving_command_translator.h" | |
#include "drake/automotive/simple_car.h" | |
#include "drake/lcm/drake_lcm.h" | |
#include "drake/lcmt_viewer_draw.hpp" | |
#include "drake/systems/analysis/simulator.h" | |
#include "drake/systems/framework/diagram.h" | |
#include "drake/systems/framework/diagram_builder.h" | |
#include "drake/systems/lcm/lcm_publisher_system.h" | |
#include "drake/systems/lcm/lcm_subscriber_system.h" | |
#include "drake/systems/lcm/serializer.h" | |
#include "drake/systems/rendering/drake_visualizer_client.h" | |
#include "drake/systems/rendering/pose_aggregator.h" | |
#include "drake/systems/rendering/pose_bundle_to_draw_message.h" | |
#include "drake/lcmtypes/drake/lcmt_viewer_load_robot.hpp" | |
#include <Eigen/Dense> | |
namespace drake { | |
using lcm::DrakeLcm; | |
using systems::lcm::LcmPublisherSystem; | |
using systems::lcm::LcmSubscriberSystem; | |
using systems::lcm::Serializer; | |
using systems::DiagramBuilder; | |
using systems::rendering::MakeGeometryData; | |
using systems::rendering::PoseAggregator; | |
using systems::rendering::PoseBundleToDrawMessage; | |
namespace automotive { | |
int do_main() { | |
DrakeLcm lcm; | |
DiagramBuilder<double> builder; | |
// Emit a one-time load message. | |
Serializer<lcmt_viewer_load_robot> load_serializer; | |
std::vector<uint8_t> message_bytes; | |
lcmt_viewer_load_robot message; | |
DrakeShapes::VisualElement car_vis(DrakeShapes::Box(Eigen::Vector3d(1.0, 1.0, 1.0)), | |
Eigen::Isometry3d::Identity(), | |
Eigen::Vector4d(0.7, 0.7, 0.7, 1)); | |
std::array<std::string, 5> names{{"Alice", "Bob", "Chris", "Donna", "Ed"}}; | |
message.num_links = 5; | |
message.link.resize(5); | |
for (int i = 0; i < 5; ++i) { | |
message.link[i].name = names[i]; | |
message.link[i].robot_num = i; | |
message.link[i].num_geom = 1; | |
message.link[i].geom.resize(1); | |
message.link[i].geom[0] = MakeGeometryData(car_vis); | |
} | |
const int message_length = message.getEncodedSize(); | |
message_bytes.resize(message_length); | |
message.encode(message_bytes.data(), 0, message_length); | |
lcm.Publish("DRAKE_VIEWER_LOAD_ROBOT", message_bytes.data(), message_bytes.size()); | |
// Build the simulation diagram. | |
PoseAggregator<double>* aggregator = builder.template AddSystem<PoseAggregator>(); | |
PoseBundleToDrawMessage* converter = | |
builder.template AddSystem<PoseBundleToDrawMessage>(); | |
LcmPublisherSystem* publisher = | |
builder.template AddSystem<LcmPublisherSystem>("DRAKE_VIEWER_DRAW", | |
std::make_unique<Serializer<lcmt_viewer_draw>>(), | |
&lcm); | |
publisher->set_publish_period(0.1); | |
DrivingCommandTranslator driving_command_translator; | |
for (int i = 0; i < 5; ++i) { | |
auto command_subscriber = | |
builder.template AddSystem<LcmSubscriberSystem>( | |
"DRIVING_COMMAND_" + names[i], driving_command_translator, &lcm); | |
SimpleCar<double>* car = builder.template AddSystem<SimpleCar>(); | |
builder.Connect(*command_subscriber, *car); | |
builder.Connect(car->pose_output(), aggregator->AddSingleInput(names[i], i)); | |
} | |
builder.Connect(*aggregator, *converter); | |
builder.Connect(*converter, *publisher); | |
auto diagram = builder.Build(); | |
auto context = diagram->CreateDefaultContext(); | |
systems::Simulator<double> simulator(*diagram, std::move(context)); | |
simulator.set_target_realtime_rate(1.0); | |
double t = 1.0; | |
lcm.StartReceiveThread(); | |
while (true) { | |
simulator.StepTo(t); | |
t += 1.0; | |
} | |
} | |
} // namespace automotive | |
} // namespace drake | |
int main (int argc, char* argv[]) { | |
return drake::automotive::do_main(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment