Server Example: Compound Object
Overview
Builds a compound object from many capsule children with random transforms, then drops it into the scene. It shows how to create and visualize compound shapes.
Screenshot
Binary
CMake target and executable name: compound_object.
Run
Build and run from your build directory:
cmake --build . --target compound_object
./compound_object
On Windows, run compound_object.exe instead.
This example uses RaisimServer. Start a visualizer client (RaisimUnity, RaisimUnreal, or the rayrai TCP viewer) and connect to port 8080.
Details
Builds a compound object from 20 capsule children with random poses.
Adds the compound to the world with custom inertia and appearance.
Shows how to assemble compound shapes programmatically.
Source
// This file is part of RaiSim. You must obtain a valid license from RaiSim Tech
// Inc. prior to usage.
#include "raisim/RaisimServer.hpp"
#include "raisim/World.hpp"
#include "rayrai_tcp_viewer_hint.hpp"
int main(int argc, char* argv[]) {
auto binaryPath = raisim::Path::setFromArgv(argv[0]);
raisim::World world;
world.setTimeStep(0.002);
/// create objects
auto ground = world.addGround();
std::vector<raisim::Compound::CompoundObjectChild> children;
/// just to get random motions of anymal
std::default_random_engine generator;
std::normal_distribution<double> distribution(0.0, 0.6);
std::srand(std::time(nullptr));
for(int i=0; i<20; i++) {
raisim::Compound::CompoundObjectChild child;
child.objectType = raisim::ObjectType::CAPSULE;
child.objectParam[0] = 0.1; // radius
child.objectParam[1] = 0.1; // height (center-to-center distance)
child.trans.pos[0] = distribution(generator);
child.trans.pos[1] = distribution(generator);
child.trans.pos[2] = distribution(generator);
raisim::Vec<4> quat;
quat[0] = distribution(generator);
quat[1] = distribution(generator);
quat[2] = distribution(generator);
quat[3] = distribution(generator);
quat /= quat.norm();
raisim::quatToRotMat(quat, child.trans.rot);
children.push_back(child);
}
raisim::Mat<3,3> inertia; inertia.setIdentity();
auto compound = world.addCompound(children, 5, {0,0,0}, inertia);
compound->setPosition(0, 0, 3);
compound->setAppearance("1,0,0,0.3");
/// launch raisim server
raisim::RaisimServer server(&world);
server.launchServer();
raisim_examples::warnIfNoClientConnected(server);
while (1) {
RS_TIMED_LOOP(int(world.getTimeStep()*1e6))
server.integrateWorldThreadSafe();
}
server.killServer();
}