{"action":"created","comment":{"url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/comments/34412497","id":34412497,"diff_hunk":"@@ -132,74 +236,308 @@ Eigen::VectorXd  CollisionAvoidance<T_PARAMS, PRIO>::getPartialValues() const\n                                                                     d.frame_id);\n         if (params.frame_names.end() != str_it)\n         {\n-            uint32_t pos = str_it - params.frame_names.begin();\n-            uint32_t frame_number = pos + 1;\n-            KDL::Jacobian new_jac_chain(size_of_frames);\n-            KDL::JntArray ja = this->joint_pos_;\n-            this->jnt_to_jac_.JntToJac(ja, new_jac_chain, frame_number);\n-\n-            Eigen::Matrix3Xd m = Eigen::Matrix3Xd::Zero(3, size_of_frames);\n+            /*\n+             * Create a skew-symm matrix as transformation between the segment root and the critical point.\n+             */\n+            Eigen::Matrix3d skew_symm;\n+            skew_symm <<    0.0,                          d.collision_pnt_vector.z(), -d.collision_pnt_vector.y(),\n+                            -d.collision_pnt_vector.z(),  0.0,                         d.collision_pnt_vector.x(),\n+                             d.collision_pnt_vector.y(), -d.collision_pnt_vector.x(),  0.0;\n+\n+            Eigen::Matrix3d ident = Eigen::Matrix3d::Identity();\n+            Eigen::Matrix<double,6,6> T;\n+            T.block(0, 0, 3, 3) << ident;\n+            T.block(0, 3, 3, 3) << skew_symm;\n+            T.block(3, 0, 3, 3) << Eigen::Matrix3d::Zero();\n+            T.block(3, 3, 3, 3) << ident;\n+            // ****************************************************************************************************\n+\n+            uint32_t idx = str_it - params.frame_names.begin();\n+            uint32_t frame_number = idx + 1; // segment nr not index represents frame number\n \n-            m << new_jac_chain.data.row(0),\n-                 new_jac_chain.data.row(1),\n-                 new_jac_chain.data.row(2);\n+            KDL::Jacobian new_jac_chain(size_of_frames);\n \n-            if (d.min_distance > 0.0)\n+            KDL::JntArray ja = this->joint_states_.current_q_;\n+            if(0 != this->jnt_to_jac_.JntToJac(ja, new_jac_chain, frame_number))\n             {\n-                // Gradient of the cost function from: Strasse O., Escande A., Mansard N. et al.\n-                // \"Real-Time (Self)-Collision Avoidance Task on a HRP-2 Humanoid Robot\", 2008 IEEE International Conference\n-                partial_values =  2.0 * ((d.min_distance - this->getActivationThreshold()) / d.min_distance) * m.transpose() * d.distance_vec;\n+                ROS_ERROR_STREAM(\"Failed to calculate JntToJac.\");\n+                return partial_values;\n             }\n+\n+            t_Matrix6Xd jac_extension = this->jacobian_data_;\n+            jac_extension.block(0, 0, new_jac_chain.data.rows(), new_jac_chain.data.cols()) = new_jac_chain.data;\n+            t_Matrix6Xd crit_pnt_jac = T * jac_extension;\n+            Eigen::Matrix3Xd m_transl = Eigen::Matrix3Xd::Zero(3, crit_pnt_jac.cols());\n+            m_transl << crit_pnt_jac.row(0),\n+                    crit_pnt_jac.row(1),\n+                    crit_pnt_jac.row(2);\n+\n+            Eigen::Vector3d vec(d.distance_vec[0], d.distance_vec[1], d.distance_vec[2]);\n+            double vec_norm = vec.norm();\n+            vec_norm = vec_norm > 0.0 ? vec_norm : DIV0_SAFE;\n+            Eigen::VectorXd term_2nd = (m_transl.transpose()) * (vec / vec_norm); // use the unit vector only for direction!\n+\n+            // Gradient of the cost function from: Strasse O., Escande A., Mansard N. et al.\n+            // \"Real-Time (Self)-Collision Avoidance Task on a HRP-2 Humanoid Robot\", 2008 IEEE International Conference\n+            double denom = d.min_distance > 0.0 ? d.min_distance : DIV0_SAFE;\n+            partial_values =  (2.0 * ((d.min_distance - this->getActivationThreshold()) / denom) * term_2nd);\n+        }\n+        else\n+        {\n+            ROS_ERROR_STREAM(\"Frame id not found: \" << d.frame_id);\n         }\n     }\n \n-    return partial_values;\n+    this->partial_values_ = partial_values;\n+    return this->partial_values_;\n }\n \n+\n+/// Returns the threshold of the cost function to become active.\n+template <typename T_PARAMS, typename PRIO>\n+double CollisionAvoidance<T_PARAMS, PRIO>::getActivationThreshold() const\n+{\n+    return 0.1; // in [m]\n+}\n+\n+\n /// Returns a value for k_H to weight the partial values for GPM e.g.\n template <typename T_PARAMS, typename PRIO>\n double CollisionAvoidance<T_PARAMS, PRIO>::getSelfMotionMagnitude(const Eigen::MatrixXd& particular_solution, const Eigen::MatrixXd& homogeneous_solution) const\n {\n-    const InvDiffKinSolverParams &params = this->constraint_params_.getInvDiffKinSolverParams();\n-    return SelfMotionMagnitudeFactory<SmmDeterminatorConstant >::calculate(params, particular_solution, homogeneous_solution);\n+    const TwistControllerParams& params = this->constraint_params_.getParams();\n+    double magnitude = 0.0;\n+    double activation = this->getActivationThreshold();\n+    ObstacleDistanceInfo d = this->constraint_params_.current_distance_;\n+\n+    if (d.min_distance < activation && d.min_distance > 0.0)\n+    {\n+        magnitude = pow(activation / d.min_distance, 2.0) - 1.0;\n+    }\n+\n+    double k_H = params.k_H_ca;\n+    return k_H * magnitude;\n+}\n+\n+template <typename T_PARAMS, typename PRIO>\n+ConstraintTypes CollisionAvoidance<T_PARAMS, PRIO>::getType() const\n+{\n+    return CA;\n }\n+\n+/**\n+ * Critical Point Jacobian: Each critical point is represented by one CA constraint.\n+ * So the partial values represent a one row task Jacobian.\n+ * @return Partial values as task Jacobian.\n+ */\n+template <typename T_PARAMS, typename PRIO>\n+Eigen::MatrixXd CollisionAvoidance<T_PARAMS, PRIO>::getTaskJacobian() const\n+{\n+    return this->partial_values_.transpose();\n+}\n+\n+/**\n+ * 1x1 Vector returning the task derivative of a CA constraint.\n+ * One row task Jacobian <-> One dim derivative.\n+ * @return The derivative value.\n+ */\n+template <typename T_PARAMS, typename PRIO>\n+Eigen::VectorXd CollisionAvoidance<T_PARAMS, PRIO>::getTaskDerivatives() const\n+{\n+    return Eigen::VectorXd::Identity(1, 1) * this->derivative_value_;\n+}\n+\n+template <typename T_PARAMS, typename PRIO>\n+Task_t CollisionAvoidance<T_PARAMS, PRIO>::createTask()\n+{\n+    const TwistControllerParams& params = this->constraint_params_.getParams();\n+    TwistControllerParams adapted_params;\n+    adapted_params.damping_method = CONSTANT;\n+    adapted_params.damping_factor = params.damping_ca;\n+    adapted_params.eps_truncation = 0.0;\n+\n+    Task_t task(this->getPriority(),\n+                this->getTaskId(),\n+                this->getTaskJacobian(),\n+                this->getTaskDerivatives(),\n+                this->getType());\n+\n+    task.tcp_ = adapted_params;\n+    task.db_.reset(DampingBuilder::createDamping(adapted_params));\n+\n+    return task;\n+}\n+\n /* END CollisionAvoidance ***************************************************************************************/\n \n /* BEGIN JointLimitAvoidance ************************************************************************************/\n-/// Returns values of the JLA cost function with adapted joint pos.\n template <typename T_PARAMS, typename PRIO>\n-double JointLimitAvoidance<T_PARAMS, PRIO>::getValue(Eigen::VectorXd steps) const\n+std::string JointLimitAvoidance<T_PARAMS, PRIO>::getTaskId() const\n+{\n+    std::ostringstream oss;\n+    oss << this->member_inst_cnt_;\n+    oss << \"_\";\n+    oss << this->priority_;\n+    std::string taskid = \"JointLimitAvoidance_\" + oss.str();\n+    return taskid;\n+}\n+\n+template <typename T_PARAMS, typename PRIO>\n+double JointLimitAvoidance<T_PARAMS, PRIO>::getActivationGain() const\n {\n-    const InvDiffKinSolverParams &params = this->constraint_params_.getInvDiffKinSolverParams();\n+    return 1.0;\n+}\n+\n+template <typename T_PARAMS, typename PRIO>\n+void JointLimitAvoidance<T_PARAMS, PRIO>::calculate()\n+{\n+    this->calcValue();\n+    this->calcPartialValues();\n+    this->calcDerivativeValue();\n+\n+    if(this->partial_values_.sum() > ZERO_LIMIT)\n+    {\n+        this->state_.setState(CRITICAL); // always highest task -> avoid HW destruction.\n+    }\n+    else\n+    {\n+        this->state_.setState(NORMAL); // always highest task -> avoid HW destruction.\n+    }\n+\n+\n+}\n+\n+/// Calculate values of the JLA cost function.\n+template <typename T_PARAMS, typename PRIO>\n+double JointLimitAvoidance<T_PARAMS, PRIO>::calcValue()\n+{\n+    const TwistControllerParams& params = this->constraint_params_.getParams();\n     std::vector<double> limits_min = params.limits_min;\n     std::vector<double> limits_max = params.limits_max;\n-    double H_q = 0.0;\n-    for(uint8_t i = 0; i < this->joint_pos_.rows() ; ++i)\n+    const KDL::JntArray joint_pos = this->joint_states_.current_q_;\n+    this->last_values_ = this->values_;\n+    this->values_.resize(joint_pos.rows(), 1);\n+    for(uint8_t i = 0; i < joint_pos.rows() ; ++i)\n     {\n-        double jnt_pos_with_step = this->joint_pos_(i) + steps(i);\n         double nom = pow(limits_max[i] - limits_min[i], 2.0);\n-        double denom = (limits_max[i] - jnt_pos_with_step) * (jnt_pos_with_step - limits_min[i]);\n-        H_q += nom / denom;\n+        double denom = (limits_max[i] - joint_pos(i)) * (joint_pos(i) - limits_min[i]);\n+        this->values_(i) = nom / (10.0 * 4.0 * denom); // store value of cost function for each joint.\n     }\n \n-    H_q = H_q / 4.0;\n-    return H_q;\n+    this->last_value_ = this->value_;\n+    this->value_ = this->values_.sum();\n+    return this->value_;\n }\n \n-/// Returns values of the JLA cost function.\n+/// Calculate derivative of values.\n template <typename T_PARAMS, typename PRIO>\n-double JointLimitAvoidance<T_PARAMS, PRIO>::getValue() const\n+double JointLimitAvoidance<T_PARAMS, PRIO>::calcDerivativeValue()\n {\n-    return this->getValue(Eigen::VectorXd::Zero(this->joint_pos_.rows()));\n+    double current_time = ros::Time::now().toSec();\n+    double cycle = current_time - this->last_time_;\n+    this->last_time_ = current_time;\n+    const uint32_t values_rows = this->values_.rows();\n+    if(cycle <= 0.0)\n+    {\n+        ROS_INFO_STREAM(\"<<<<<<<<<<<<<< WAAAAAAAAAAAAAAAAAAAAAAAT\");\n+        cycle = 0.02;","path":"cob_twist_controller/include/cob_twist_controller/constraints/constraint_impl.h","position":466,"original_position":466,"commit_id":"cc19230f8b043146c7d254c6419e6073487dc7d7","original_commit_id":"cc19230f8b043146c7d254c6419e6073487dc7d7","user":{"login":"ipa-fxm","id":508006,"avatar_url":"https://avatars.githubusercontent.com/u/508006?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm","html_url":"https://github.com/ipa-fxm","followers_url":"https://api.github.com/users/ipa-fxm/followers","following_url":"https://api.github.com/users/ipa-fxm/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm/orgs","repos_url":"https://api.github.com/users/ipa-fxm/repos","events_url":"https://api.github.com/users/ipa-fxm/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm/received_events","type":"User","site_admin":false},"body":"in what case does does this happen? maybe a less \"shouting\" output?","created_at":"2015-07-11T13:11:26Z","updated_at":"2015-07-11T13:11:26Z","html_url":"https://github.com/ipa-fxm/cob_control/pull/7#discussion_r34412497","pull_request_url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7","_links":{"self":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/comments/34412497"},"html":{"href":"https://github.com/ipa-fxm/cob_control/pull/7#discussion_r34412497"},"pull_request":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7"}}},"pull_request":{"url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7","id":39744702,"html_url":"https://github.com/ipa-fxm/cob_control/pull/7","diff_url":"https://github.com/ipa-fxm/cob_control/pull/7.diff","patch_url":"https://github.com/ipa-fxm/cob_control/pull/7.patch","issue_url":"https://api.github.com/repos/ipa-fxm/cob_control/issues/7","number":7,"state":"open","locked":false,"title":"Mesh repr of registered links","user":{"login":"ipa-fxm","id":508006,"avatar_url":"https://avatars.githubusercontent.com/u/508006?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm","html_url":"https://github.com/ipa-fxm","followers_url":"https://api.github.com/users/ipa-fxm/followers","following_url":"https://api.github.com/users/ipa-fxm/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm/orgs","repos_url":"https://api.github.com/users/ipa-fxm/repos","events_url":"https://api.github.com/users/ipa-fxm/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm/received_events","type":"User","site_admin":false},"body":"Code Review PR before merging to ipa320","created_at":"2015-07-11T11:38:34Z","updated_at":"2015-07-11T13:11:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b903570be1efd7b26735d232fa453ac8f81801ea","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7/commits","review_comments_url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7/comments","review_comment_url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ipa-fxm/cob_control/issues/7/comments","statuses_url":"https://api.github.com/repos/ipa-fxm/cob_control/statuses/cc19230f8b043146c7d254c6419e6073487dc7d7","head":{"label":"ipa-fxm-mb:mesh_repr_of_registered_links","ref":"mesh_repr_of_registered_links","sha":"cc19230f8b043146c7d254c6419e6073487dc7d7","user":{"login":"ipa-fxm-mb","id":11269199,"avatar_url":"https://avatars.githubusercontent.com/u/11269199?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm-mb","html_url":"https://github.com/ipa-fxm-mb","followers_url":"https://api.github.com/users/ipa-fxm-mb/followers","following_url":"https://api.github.com/users/ipa-fxm-mb/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm-mb/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm-mb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm-mb/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm-mb/orgs","repos_url":"https://api.github.com/users/ipa-fxm-mb/repos","events_url":"https://api.github.com/users/ipa-fxm-mb/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm-mb/received_events","type":"User","site_admin":false},"repo":{"id":32982325,"name":"cob_control","full_name":"ipa-fxm-mb/cob_control","owner":{"login":"ipa-fxm-mb","id":11269199,"avatar_url":"https://avatars.githubusercontent.com/u/11269199?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm-mb","html_url":"https://github.com/ipa-fxm-mb","followers_url":"https://api.github.com/users/ipa-fxm-mb/followers","following_url":"https://api.github.com/users/ipa-fxm-mb/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm-mb/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm-mb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm-mb/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm-mb/orgs","repos_url":"https://api.github.com/users/ipa-fxm-mb/repos","events_url":"https://api.github.com/users/ipa-fxm-mb/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm-mb/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ipa-fxm-mb/cob_control","description":"The cob_control stack includes packages that are used to do low level control tasks with Care-O-bot hardware over ROS.","fork":true,"url":"https://api.github.com/repos/ipa-fxm-mb/cob_control","forks_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/forks","keys_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/teams","hooks_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/hooks","issue_events_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/issues/events{/number}","events_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/events","assignees_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/assignees{/user}","branches_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/branches{/branch}","tags_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/tags","blobs_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/git/refs{/sha}","trees_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/statuses/{sha}","languages_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/languages","stargazers_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/stargazers","contributors_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/contributors","subscribers_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/subscribers","subscription_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/subscription","commits_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/commits{/sha}","git_commits_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/git/commits{/sha}","comments_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/comments{/number}","issue_comment_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/issues/comments{/number}","contents_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/contents/{+path}","compare_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/merges","archive_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/downloads","issues_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/issues{/number}","pulls_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/pulls{/number}","milestones_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/milestones{/number}","notifications_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/labels{/name}","releases_url":"https://api.github.com/repos/ipa-fxm-mb/cob_control/releases{/id}","created_at":"2015-03-27T11:24:17Z","updated_at":"2015-05-04T13:46:30Z","pushed_at":"2015-07-10T16:11:43Z","git_url":"git://github.com/ipa-fxm-mb/cob_control.git","ssh_url":"git@github.com:ipa-fxm-mb/cob_control.git","clone_url":"https://github.com/ipa-fxm-mb/cob_control.git","svn_url":"https://github.com/ipa-fxm-mb/cob_control","homepage":"www.care-o-bot.org","size":4675,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"indigo_dev"}},"base":{"label":"ipa-fxm:indigo_dev","ref":"indigo_dev","sha":"b04194404b20c71d8368dee3b26a59ebaddf2c69","user":{"login":"ipa-fxm","id":508006,"avatar_url":"https://avatars.githubusercontent.com/u/508006?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm","html_url":"https://github.com/ipa-fxm","followers_url":"https://api.github.com/users/ipa-fxm/followers","following_url":"https://api.github.com/users/ipa-fxm/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm/orgs","repos_url":"https://api.github.com/users/ipa-fxm/repos","events_url":"https://api.github.com/users/ipa-fxm/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm/received_events","type":"User","site_admin":false},"repo":{"id":20218732,"name":"cob_control","full_name":"ipa-fxm/cob_control","owner":{"login":"ipa-fxm","id":508006,"avatar_url":"https://avatars.githubusercontent.com/u/508006?v=3","gravatar_id":"","url":"https://api.github.com/users/ipa-fxm","html_url":"https://github.com/ipa-fxm","followers_url":"https://api.github.com/users/ipa-fxm/followers","following_url":"https://api.github.com/users/ipa-fxm/following{/other_user}","gists_url":"https://api.github.com/users/ipa-fxm/gists{/gist_id}","starred_url":"https://api.github.com/users/ipa-fxm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ipa-fxm/subscriptions","organizations_url":"https://api.github.com/users/ipa-fxm/orgs","repos_url":"https://api.github.com/users/ipa-fxm/repos","events_url":"https://api.github.com/users/ipa-fxm/events{/privacy}","received_events_url":"https://api.github.com/users/ipa-fxm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ipa-fxm/cob_control","description":"The cob_control stack includes packages that are used to do low level control tasks with Care-O-bot hardware over ROS.","fork":true,"url":"https://api.github.com/repos/ipa-fxm/cob_control","forks_url":"https://api.github.com/repos/ipa-fxm/cob_control/forks","keys_url":"https://api.github.com/repos/ipa-fxm/cob_control/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ipa-fxm/cob_control/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ipa-fxm/cob_control/teams","hooks_url":"https://api.github.com/repos/ipa-fxm/cob_control/hooks","issue_events_url":"https://api.github.com/repos/ipa-fxm/cob_control/issues/events{/number}","events_url":"https://api.github.com/repos/ipa-fxm/cob_control/events","assignees_url":"https://api.github.com/repos/ipa-fxm/cob_control/assignees{/user}","branches_url":"https://api.github.com/repos/ipa-fxm/cob_control/branches{/branch}","tags_url":"https://api.github.com/repos/ipa-fxm/cob_control/tags","blobs_url":"https://api.github.com/repos/ipa-fxm/cob_control/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ipa-fxm/cob_control/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ipa-fxm/cob_control/git/refs{/sha}","trees_url":"https://api.github.com/repos/ipa-fxm/cob_control/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ipa-fxm/cob_control/statuses/{sha}","languages_url":"https://api.github.com/repos/ipa-fxm/cob_control/languages","stargazers_url":"https://api.github.com/repos/ipa-fxm/cob_control/stargazers","contributors_url":"https://api.github.com/repos/ipa-fxm/cob_control/contributors","subscribers_url":"https://api.github.com/repos/ipa-fxm/cob_control/subscribers","subscription_url":"https://api.github.com/repos/ipa-fxm/cob_control/subscription","commits_url":"https://api.github.com/repos/ipa-fxm/cob_control/commits{/sha}","git_commits_url":"https://api.github.com/repos/ipa-fxm/cob_control/git/commits{/sha}","comments_url":"https://api.github.com/repos/ipa-fxm/cob_control/comments{/number}","issue_comment_url":"https://api.github.com/repos/ipa-fxm/cob_control/issues/comments{/number}","contents_url":"https://api.github.com/repos/ipa-fxm/cob_control/contents/{+path}","compare_url":"https://api.github.com/repos/ipa-fxm/cob_control/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ipa-fxm/cob_control/merges","archive_url":"https://api.github.com/repos/ipa-fxm/cob_control/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ipa-fxm/cob_control/downloads","issues_url":"https://api.github.com/repos/ipa-fxm/cob_control/issues{/number}","pulls_url":"https://api.github.com/repos/ipa-fxm/cob_control/pulls{/number}","milestones_url":"https://api.github.com/repos/ipa-fxm/cob_control/milestones{/number}","notifications_url":"https://api.github.com/repos/ipa-fxm/cob_control/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ipa-fxm/cob_control/labels{/name}","releases_url":"https://api.github.com/repos/ipa-fxm/cob_control/releases{/id}","created_at":"2014-05-27T12:11:10Z","updated_at":"2015-05-04T12:25:06Z","pushed_at":"2015-07-11T11:38:34Z","git_url":"git://github.com/ipa-fxm/cob_control.git","ssh_url":"git@github.com:ipa-fxm/cob_control.git","clone_url":"https://github.com/ipa-fxm/cob_control.git","svn_url":"https://github.com/ipa-fxm/cob_control","homepage":"www.care-o-bot.org","size":5005,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"indigo_dev"}},"_links":{"self":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7"},"html":{"href":"https://github.com/ipa-fxm/cob_control/pull/7"},"issue":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/issues/7"},"comments":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/issues/7/comments"},"review_comments":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7/comments"},"review_comment":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/pulls/7/commits"},"statuses":{"href":"https://api.github.com/repos/ipa-fxm/cob_control/statuses/cc19230f8b043146c7d254c6419e6073487dc7d7"}}}}