$search
00001 #include <map> 00002 #include <ros/ros.h> 00003 00004 #include <sensor_msgs/JointState.h> 00005 #include <planning_environment/models/robot_models.h> 00006 00007 class JointStateAccumulator { 00008 00009 public: 00010 00011 JointStateAccumulator() 00012 { 00013 robot_model_ = new planning_environment::RobotModels("robot_description"); 00014 00015 planning_models::KinematicModel* km = robot_model_->getKinematicModel().get(); 00016 unsigned int num = 0; 00017 std::vector<const planning_models::KinematicModel::Joint*> joints; 00018 km->getJoints(joints); 00019 for(unsigned int i = 0; i < joints.size(); i++) { 00020 if(joints[i]->usedParams > 0) { 00021 joint_indices_[joints[i]->name] = num++; 00022 joint_values_[joints[i]->name] = 0.0; 00023 joint_velocities_[joints[i]->name] = 0.0; 00024 } 00025 } 00026 00027 joint_state_subscriber_ = root_handle_.subscribe("joint_states", 1, &JointStateAccumulator::jointStateCallback, this); 00028 00029 joint_state_publisher_ = root_handle_.advertise<sensor_msgs::JointState>("accumulated_joint_states", 1); 00030 } 00031 00032 void jointStateCallback(const sensor_msgs::JointStateConstPtr &jointState) { 00033 if (jointState->name.size() != jointState->position.size() || jointState->name.size() !=jointState->velocity.size()) 00034 { 00035 ROS_ERROR("Planning environment received invalid joint state"); 00036 return; 00037 } 00038 for (unsigned int i = 0 ; i < jointState->name.size(); ++i) 00039 { 00040 joint_values_[jointState->name[i]] = jointState->position[i]; 00041 joint_velocities_[jointState->name[i]] = jointState->velocity[i]+rand()*.00000000000000001; 00042 } 00043 } 00044 00045 void publishAccumlatedJointState() { 00046 00047 sensor_msgs::JointState joint_state; 00048 joint_state.header.stamp = ros::Time::now(); 00049 joint_state.name.resize(joint_indices_.size()); 00050 joint_state.position.resize(joint_indices_.size()); 00051 joint_state.velocity.resize(joint_indices_.size()); 00052 for(std::map<std::string, unsigned int>::iterator it = joint_indices_.begin(); it != joint_indices_.end(); it++) { 00053 unsigned int ind = it->second; 00054 joint_state.name[ind] = it->first; 00055 joint_state.position[ind] = joint_values_[it->first]; 00056 joint_state.velocity[ind] = joint_velocities_[it->first]; 00057 } 00058 joint_state_publisher_.publish(joint_state); 00059 } 00060 00061 00062 private: 00063 00064 ros::NodeHandle root_handle_; 00065 planning_environment::RobotModels* robot_model_; 00066 00067 ros::Publisher joint_state_publisher_; 00068 ros::Subscriber joint_state_subscriber_; 00069 00070 std::map<std::string, unsigned int> joint_indices_; 00071 std::map<std::string, double> joint_values_; 00072 std::map<std::string, double> joint_velocities_; 00073 00074 }; 00075 00076 int main(int argc, char **argv) 00077 { 00078 ros::init(argc, argv, "joint_state_accumulator"); 00079 00080 ros::AsyncSpinner spinner(2); // Use 1 thread 00081 spinner.start(); 00082 00083 JointStateAccumulator jsa; 00084 00085 ros::Rate pub_rate(10.0); 00086 00087 while (ros::ok()) 00088 { 00089 jsa.publishAccumlatedJointState(); 00090 pub_rate.sleep(); 00091 } 00092 ros::shutdown(); 00093 return 0; 00094 }