2016-12-31 57 views
0

當我設置的軌跡封郵件關節的位置和速度,我得到一個錯誤:\出版trajectory_msgs/jointtrajectory封郵件

[state_publisher-2] process has died [pid 13362, exit code -11, cmd /home/rob/catkin_ws/devel/lib/r2d2/state_publisher __name:=state_publisher __log:=/home/rob/.ros/log/9980f352-cf74-11e6-8644-d4c9efe8bd37/state_publisher-2.log]. 
log file: /home/rob/.ros/log/9980f352-cf74-11e6-8644-d4c9efe8bd37/state_publisher-2*.log 

我的ROS節點發送geometry_msgs是:

#include <string> 
    #include <ros/ros.h> 
    #include <sensor_msgs/JointState.h> 
    #include <tf/transform_broadcaster.h> 
    #include <trajectory_msgs/JointTrajectory.h> 
    #include <vector> 
    int main(int argc, char** argv) { 
     ros::init(argc, argv, "state_publisher"); 
     ros::NodeHandle n; 
     ros::Publisher joint_pub = n.advertise<trajectory_ms 

gs::JointTrajectory>("set_joint_trajectory", 1); 
    ros::Rate loop_rate(30); 

    const double degree = M_PI/180; 

    // robot state 
    double tilt = 0, tinc = degree, swivel=0, angle=0, height=0, hinc=0.005; 

    // message declarations 
    trajectory_msgs::JointTrajectory joint_state; 
    std::vector<trajectory_msgs::JointTrajectoryPoint> points_n(3); 
    points_n[0].positions[0] = 1; points_n[0].velocities[0]=10; 
    while (ros::ok()) { 
     //update joint_state 
     joint_state.header.stamp = ros::Time::now(); 
     joint_state.joint_names.resize(3); 
     joint_state.points.resize(3); 

     joint_state.joint_names[0] ="swivel"; 
     joint_state.points[0] = points_n[0]; 
     joint_state.joint_names[1] ="tilt"; 
     joint_state.points[1] = points_n[1]; 
     joint_state.joint_names[2] ="periscope"; 
     joint_state.points[2] = points_n[2]; 


     joint_pub.publish(joint_state); 



     // This will adjust as needed per iteration 
     loop_rate.sleep(); 
    } 


    return 0; 
    } 

在這裏,當我DONOT設置它在運行時錯誤的位置和速度值,當我運行rostopic echo /set_joint_trajectory我可以清楚地看到輸出作爲點的全部參數爲0。我也嘗試下面的程序,但它沒有公佈:

#include <string> 
    #include <ros/ros.h> 
    #include <sensor_msgs/JointState.h> 
    #include <tf/transform_broadcaster.h> 
    #include <trajectory_msgs/JointTrajectory.h> 
    #include <vector> 
    int main(int argc, char** argv) { 
     ros::init(argc, argv, "state_publisher"); 
     ros::NodeHandle n; 
     ros::Publisher joint_pub = n.advertise<trajectory_msgs::JointTrajectory>("set_joint_trajectory", 1); 

     trajectory_msgs::JointTrajectory joint_state; 

      joint_state.header.stamp = ros::Time::now(); 
      joint_state.header.frame_id = "camera_link"; 
      joint_state.joint_names.resize(3); 
      joint_state.points.resize(3); 

      joint_state.joint_names[0] ="swivel"; 
      joint_state.joint_names[1] ="tilt"; 
      joint_state.joint_names[2] ="periscope"; 

      size_t size = 2; 
      for(size_t i=0;i<=size;i++) { 
       trajectory_msgs::JointTrajectoryPoint points_n; 
       int j = i%3; 
       points_n.positions.push_back(j); 
       points_n.positions.push_back(j+1); 
       points_n.positions.push_back(j*2); 
       joint_state.points.push_back(points_n); 
       joint_state.points[i].time_from_start = ros::Duration(0.01); 
      } 
      joint_pub.publish(joint_state); 
      ros::spinOnce(); 
     return 0; 
    } 

回答

0

您正在訪問points_n[0].positions[0]和​​3210而不分配位置和速度的內存。使用

... 
// message declarations 
trajectory_msgs::JointTrajectory joint_state; 
std::vector<trajectory_msgs::JointTrajectoryPoint> points_n(3); 
points_n[0].positions.resize(1); 
points_n[0].velocities.resize(1); 
... 

然後設置值或使用points_n[0].positions.push_back(...)來代替。這同樣適用於points_n[1]points_n[2]

在你的第二個例子,它看起來像發送任何東西之前你的程序終止。嘗試在一段時間內重複發佈

while(ros::ok()){ 
    ... 
    ros::spinOnce(); 
} 
+0

非常感謝。 –