What does this SkeletonAnimation error mean?
I have been trying to solve this error for a while now but I am not sure what may be causing it. It seems to have popped out of nowhere after I created several actors with the same plugin and animation file. Any help would be appreciated, thanks
gzserver: /var/lib/jenkins/workspace/gazebo8-debbuilder/build/gazebo-8.5.0/gazebo/common/SkeletonAnimation.cc:147: ignition::math::Matrix4d gazebo::common::NodeAnimation::FrameAt(double, bool) const: Assertion `(t >= 0.0 && t <= 1.0)&&("t is not in the range 0.0..1.0")' failed.
My world file
<?xml version="1.0"?>
<sdf version="1.4">
<world name="default">
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://ground_plane</uri>
</include>
<actor name="human1">
<pose>-1 1 0.5 0 0 0</pose>
<skin>
<filename>moonwalk.dae</filename>
</skin>
<animation name="walking">
<filename>walk.dae</filename>
<interpolate_x>true</interpolate_x>
</animation>
<animation name="standing">
<filename>stand.dae</filename>
<interpolate_x>true</interpolate_x>
</animation>
<plugin name="actor1_plugin" filename="libHumanPlugin.so">
<target_weight>1.15</target_weight>
<topic_name>humanone</topic_name>
<obstacle_weight>1.8</obstacle_weight>
<animation_factor>5.1</animation_factor>
<ignore_obstacles>
<model>ground_plane</model>
</ignore_obstacles>
</plugin>
</actor>
<actor name="human2">
<pose>-1 2 0.5 0 0 0</pose>
<skin>
<filename>moonwalk.dae</filename>
</skin>
<animation name="walking">
<filename>walk.dae</filename>
<interpolate_x>true</interpolate_x>
</animation>
<animation name="standing">
<filename>stand.dae</filename>
<interpolate_x>true</interpolate_x>
</animation>
<plugin name="actor2_plugin" filename="libHumanPlugin.so">
<target_weight>1.15</target_weight>
<topic_name>humantwo</topic_name>
<obstacle_weight>1.8</obstacle_weight>
<animation_factor>5.1</animation_factor>
<ignore_obstacles>
<model>ground_plane</model>
</ignore_obstacles>
</plugin>
</actor>
</world>
</sdf>
EDIT:
I managed to find what is triggering my error although I am not sure why that is so. I am using an edited version of the Actor plugin provided in the tutorials (https://bitbucket.org/osrf/gazebo/raw/default/plugins/ActorPlugin.cc). For some reason changing the following in HandleObstacles removes the error.
if (std::find(this->ignoreModels.begin(), this->ignoreModels.end(),
model->GetName()) == this->ignoreModels.end())
{
to (added ! before std)
if (!(std::find(this->ignoreModels.begin(), this->ignoreModels.end(),
model->GetName()) == this->ignoreModels.end()))
{
EDIT: After further investigation, I managed to pin the line causing this error when the equality signs change in the if statement. It is due to the following two lines
_pos.X() -= offset.X();
_pos.Y() -= offset.Y();
in this function
void ActorPlugin::HandleObstacles(ignition::math::Vector3d &_pos)
{
for (unsigned int i = 0; i < this->world->ModelCount(); ++i)
{
physics::ModelPtr model = this->world->ModelByIndex(i);
// Do not handle the target to follow as an obstacle. Follow buffer should keep a safe distance.
if(this->mode == "follow" && model->GetName() == this->targetName)
continue;
if ((std::find(this->ignoreModels.begin(), this->ignoreModels.end(),
model->GetName()) != this->ignoreModels.end()))
{
ignition::math::Vector3d offset = model->WorldPose().Pos() -
this->actor->WorldPose().Pos();
double modelDist = offset.Length();
if (modelDist < 4.0)
{
double invModelDist = this->obstacleWeight / modelDist;
offset.Normalize();
offset *= invModelDist;
// Only change the X and Y direction vector components... Unless humans can levitate in the future... That would be cool.
_pos.X() -= offset.X();
_pos.Y() -= offset.Y();
}
}
}
}
However, I am still unsure why this is happening?
Asked by bhej on 2018-06-25 10:17:13 UTC
Comments