Toggle visibility of a link?
Ideally I could publish a message from ROS that would set the transparency of a specified link to any value.
Would I have to write a custom plugin?
Pursuing the gazebojs approach:
This is using Gazebo 2.2.3
I've gone through
http://gazebosim.org/tutorials?tut=gazebojs_install&cat=gazebojs
One note is that npm install installs node_modules to the current directory, I moved it to a better location and the require below is the relative path to it::
var gazebojs = require('./npm/node_modules/gazebojs')
var gazebo = new gazebojs.Gazebo()
msg = { "parent_name" : "sensor_head", "name" : "sensor_head_rotation_link", "visible":false };
gazebo.publish('gazebo.msgs.Visual', '~/Visual', msg);
But the link stays visible. Am I missing something else required to turn the visibility off? I assume leaving out all the optional fields except 'visible' in the protobuf is fine.
If I put garbage into the parent_name or name fields there are no errors. Am I using those fields incorrectly? In the World tab I see Model | sensor_head | sensor_head_rotation_link
, the Property for clicking on that shows the name as sensor_head::sensor_head_rotation_link
(I have it correct above but if the msg has a problem it mostly results in an error that crashes node like::
terminate called after throwing an instance of 'j2pb_error'
what(): Unknown field: visibility
Aborted (core dumped)
)
Pursuing the C++ Approach:
If I use the following code, launch gazebo and create a box called unitbox1, running ./visibility unit_box_1 link
still doesn't produce any visual changes.
visibility.cpp:
int main(int argn, char** argv)
{
gazebo::setupClient(argn, argv);
std::string name = "sensor_head_rotation_link";
std::string parent_name = "sensor_head";
if (argn >= 3)
{
parent_name = argv[1];
name = argv[2];
}
gazebo::transport::NodePtr node(new gazebo::transport::Node());
node->Init();
// gztopic echo /gazebo/default/visual shows this
gazebo::transport::PublisherPtr pub =
node->Advertise<gazebo::msgs::Visual>("~/visual");
std::cout << "waiting for connection" << std::endl;
pub->WaitForConnection();
double transparency = 1.0;
bool visible = true;
gazebo::msgs::Visual msg;
msg.set_parent_name(parent_name);
msg.set_name(name);
std::cout << "parent " << parent_name << ", name " << name << std::endl;
while (true)
{
msg.set_transparency(transparency);
msg.set_visible(visible);
//std::cout << "transparency " << transparency << std::endl;
pub->Publish(msg);
visible = !visible;
transparency = 1.0 - transparency;
sleep(2.0);
}
gazebo::shutdown();
return 0;
}