Bring back the gazebo plugins (#1063)

The models and meshes are not included. We will need
to find an alternate way to reintegrate these and use them.

* Add simulation/gz_msgs back, and build with Gradle.

* Add back in the frc simulation plugins for gazebo.

* Add a new shared library, halsim_gazebo.

This library will become the interface between the
HAL sim layer and gazebo.

* Preserve the first channel number used in created Encoders in the Sim MockData.

This allows us to use the DIO channel number to connect with simulated encoders.

* Have the HAL Simulator set the reverse direction on creation.

This enables a simulator to be aware of the direction.

* Add a drive_motor plugin.

This is a bit of a 'magic' motor, which allows us to build robot
models that drive in a more realistic fashion.  It does this
by apply forces directly to the chassis, rather than relying on
the complex motion dynamics of a driven wheel.

This in turn allows the model to reduce wheel friction,
reducing scrub, and allowing for a more natural driving experience.
This commit is contained in:
Jeremy White
2018-06-30 02:45:21 -05:00
committed by Peter Johnson
parent 70960b0251
commit ebd41fe0bb
60 changed files with 5278 additions and 1 deletions

View File

@@ -0,0 +1,75 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include <simulation/gz_msgs/msgs.h>
#include <gazebo/gazebo.hh>
#include <gazebo/gazebo_client.hh>
#include <gazebo/msgs/msgs.hh>
#include <gazebo/sensors/sensors.hh>
#include <gazebo/transport/transport.hh>
#include "gtest/gtest.h"
using namespace testing;
static char* library;
static char* world_sdf;
static double latest_time;
void cb(gazebo::msgs::ConstFloat64Ptr& msg) { latest_time = msg->data(); }
TEST(ClockTests, test_clock) {
gazebo::physics::WorldPtr world;
ASSERT_TRUE(library);
ASSERT_TRUE(!access(library, X_OK | R_OK));
ASSERT_TRUE(world_sdf);
ASSERT_TRUE(!access(world_sdf, R_OK));
gazebo::addPlugin(library);
ASSERT_TRUE(gazebo::setupServer());
world = gazebo::loadWorld(world_sdf);
ASSERT_TRUE(world != NULL);
ASSERT_TRUE(gazebo::client::setup());
gazebo::transport::NodePtr node(new gazebo::transport::Node());
node->Init();
gazebo::transport::SubscriberPtr sub =
node->Subscribe("/gazebo/frc/time", cb);
gazebo::sensors::run_once(true);
gazebo::sensors::run_threads();
gazebo::common::Time::MSleep(1);
double start = latest_time;
for (unsigned int i = 0; i < 1000; ++i) {
gazebo::runWorld(world, 1);
gazebo::sensors::run_once();
gazebo::common::Time::MSleep(1);
}
double end = latest_time;
ASSERT_TRUE(end > start);
ASSERT_TRUE(gazebo::client::shutdown());
ASSERT_TRUE(gazebo::shutdown());
}
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
if (argc >= 1) library = argv[1];
if (argc >= 2) world_sdf = argv[2];
return RUN_ALL_TESTS();
}