I want to try out descartes, but I am facing some issues. I adapted the tutorial code to work with a KaWaDa Nextage robot. Because I ran into segfault problems, I identified problematic commands by commenting stuff out. Something easy for the beginning...
Only roscore is running.
rosrun descartes_tutorials tutorial1
gives me
Segmentation fault (core dumped)
If I started gazebo and moveit - so that urdf and srdl models are present - things seem to be ok.
rosrun descartes_tutorials tutorial1
[ INFO] [1480078985.823288742]: Loading robot model 'NextageOpen'...
[ INFO] [1480078985.823449211]: No root joint specified. Assuming fixed joint
[ INFO] [1480078986.176905204, 357.601000000]: World frame 'WAIST' does not match model root frame '/world', all poses will be transformed to world frame 'WAIST'
[ INFO] [1480078986.177039052, 357.601000000]: Done!
I guess, a check and a warning, that the models are not present would be appropriate.
Thank you!
Jan
Here is the adapted tutorial code:
// Core ros functionality like ros::init and spin
#include <ros/ros.h>
// ROS Trajectory Action server definition
#include <control_msgs/FollowJointTrajectoryAction.h>
// Means by which we communicate with above action-server
#include <actionlib/client/simple_action_client.h>
// Includes the descartes robot model we will be using
#include <descartes_moveit/moveit_state_adapter.h>
// Includes the descartes trajectory type we will be using
#include <descartes_trajectory/axial_symmetric_pt.h>
#include <descartes_trajectory/cart_trajectory_pt.h>
// Includes the planner we will be using
#include <descartes_planner/dense_planner.h>
typedef std::vector<descartes_core::TrajectoryPtPtr> TrajectoryVec;
typedef TrajectoryVec::const_iterator TrajectoryIter;
/**
* Generates an completely defined (zero-tolerance) cartesian point from a pose
*/
descartes_core::TrajectoryPtPtr makeCartesianPoint(const Eigen::Affine3d& pose);
/**
* Generates a cartesian point with free rotation about the Z axis of the EFF frame
*/
descartes_core::TrajectoryPtPtr makeTolerancedCartesianPoint(const Eigen::Affine3d& pose);
/**
* Translates a descartes trajectory to a ROS joint trajectory
*/
trajectory_msgs::JointTrajectory
toROSJointTrajectory(const TrajectoryVec& trajectory, const descartes_core::RobotModel& model,
const std::vector<std::string>& joint_names, double time_delay);
/**
* Sends a ROS trajectory to the robot controller
*/
bool executeTrajectory(const trajectory_msgs::JointTrajectory& trajectory);
int main(int argc, char** argv)
{
// Initialize ROS
ros::init(argc, argv, "descartes_tutorial");
ros::NodeHandle nh;
// Required for communication with moveit components
ros::AsyncSpinner spinner (1);
spinner.start();
// 1. Define sequence of points
TrajectoryVec points;
for (unsigned int i = 0; i < 10; ++i)
{
Eigen::Affine3d pose;
pose = Eigen::Translation3d(0.3, 0.0, 0.0 + 0.02 * i);
descartes_core::TrajectoryPtPtr pt = makeTolerancedCartesianPoint(pose);
points.push_back(pt);
}
for (unsigned int i = 0; i < 5; ++i)
{
Eigen::Affine3d pose;
pose = Eigen::Translation3d(0.0, 0.04 * i, 0.2);
descartes_core::TrajectoryPtPtr pt = makeTolerancedCartesianPoint(pose);
points.push_back(pt);
}
// 2. Create a robot model and initialize it
descartes_core::RobotModelPtr model (new descartes_moveit::MoveitStateAdapter);
// Name of description on parameter server. Typically just "robot_description".
const std::string robot_description = "robot_description";
// name of the kinematic group you defined when running MoveitSetupAssistant
const std::string group_name = "right_arm";
// Name of frame in which you are expressing poses. Typically "world_frame" or "base_link".
const std::string world_frame = "WAIST";
// tool center point frame (name of link associated with tool)
const std::string tcp_frame = "RARM_JOINT5_Link";
if (!model->initialize(robot_description, group_name, world_frame, tcp_frame))
{
ROS_INFO("Could not initialize robot model");
return -1;
}
/*
// 3. Create a planner and initialize it with our robot model
descartes_planner::DensePlanner planner;
planner.initialize(model);
// 4. Feed the trajectory to the planner
if (!planner.planPath(points))
{
ROS_ERROR("Could not solve for a valid path");
return -2;
}
TrajectoryVec result;
if (!planner.getPath(result))
{
ROS_ERROR("Could not retrieve path");
return -3;
}
// 5. Translate the result into a type that ROS understands
// Get Joint Names
std::vector<std::string> names;
nh.getParam("controller_joint_names", names);
// Generate a ROS joint trajectory with the result path, robot model, given joint names,
// a certain time delta between each trajectory point
trajectory_msgs::JointTrajectory joint_solution = toROSJointTrajectory(result, *model, names, 1.0);
// 6. Send the ROS trajectory to the robot for execution
if (!executeTrajectory(joint_solution))
{
ROS_ERROR("Could not execute trajectory!");
return -4;
}
*/
// Wait till user kills the process (Control-C)
ROS_INFO("Done!");
return 0;
}
Hey there!
I want to try out descartes, but I am facing some issues. I adapted the tutorial code to work with a KaWaDa Nextage robot. Because I ran into segfault problems, I identified problematic commands by commenting stuff out. Something easy for the beginning...
Only roscore is running.
rosrun descartes_tutorials tutorial1
gives me
Segmentation fault (core dumped)
If I started gazebo and moveit - so that urdf and srdl models are present - things seem to be ok.
I guess, a check and a warning, that the models are not present would be appropriate.
Thank you! Jan
Here is the adapted tutorial code: