{"action":"created","comment":{"url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/comments/46173436","id":46173436,"diff_hunk":"@@ -0,0 +1,145 @@\n+#ifndef _QUADROTOR_H_\n+#define _QUADROTOR_H_\n+\n+#include <iostream>\n+#include <cmath>\n+#include \"DrakeSystem.h\"\n+#include \"drakeGeometryUtil.h\"\n+#include \"LCMCoordinateFrame.h\"\n+#include \"BotVisualizer.h\"\n+\n+class Quadrotor : public DrakeSystem {\n+public:\n+  Quadrotor(const std::shared_ptr<lcm::LCM>& lcm) :\n+          DrakeSystem(\"Quadrotor\",\n+                  std::make_shared<CoordinateFrame>(\"QuadrotorContState\", std::vector<std::string>({\"x\", \"y\", \"z\", \"roll\", \"pitch\", \"yaw\", \"xdot\", \"ydot\", \"zdot\", \"rolldot\", \"pitchdot\", \"yawdot\"})),\n+                  nullptr,\n+                  std::make_shared<LCMCoordinateFrame<drake::lcmt_drake_signal> >(\"QuadrotorInput\", std::vector<std::string>({\"u1\", \"u2\", \"u3\", \"u4\"}), lcm),\n+                  std::make_shared<LCMCoordinateFrame<drake::lcmt_drake_signal> >(\"QuadrotorState\", std::vector<std::string>({\"x\", \"y\", \"z\", \"roll\", \"pitch\", \"yaw\", \"xdot\", \"ydot\", \"zdot\", \"rolldot\", \"pitchdot\", \"yawdot\"}), lcm)),\n+            m(0.5),\n+            g(9.81),\n+            L(0.1750),\n+            I(Eigen::Matrix3d::Identity()),\n+            num_states(getStateFrame().getDim()),\n+            num_inputs(getInputFrame().getDim())\n+  {\n+    I(0,0) = 0.0023;\n+    I(1,1) = 0.0023;\n+    I(2,2) = 0.004;\n+  }\n+  virtual ~Quadrotor(void) {};\n+\n+  virtual Eigen::VectorXd dynamics(double t, const Eigen::VectorXd& x, const Eigen::VectorXd& u) const override {\n+    return dynamics_implementation(t, x, u);\n+  }\n+  \n+  virtual Drake::TaylorVecX dynamics(Drake::TaylorVarX t, const Drake::TaylorVecX& x, const Drake::TaylorVecX& u) const override {\n+    return dynamics_implementation(t, x, u);\n+  }\n+  \n+  virtual Eigen::VectorXd output(double t, const Eigen::VectorXd& x, const Eigen::VectorXd& u) const override {\n+    return x;\n+  }\n+\n+  virtual bool isTimeInvariant() const override { return true; }\n+  virtual bool isDirectFeedthrough() const override { return false; }\n+\n+  DrakeSystemPtr balanceLQR() {\n+    const int num_positions = num_states/2;\n+    Eigen::MatrixXd Q = Eigen::MatrixXd::Identity(num_states, num_states);\n+    Q.topLeftCorner(num_positions, num_positions) = 10.0 * Eigen::MatrixXd::Identity(num_positions, num_positions);\n+    Eigen::MatrixXd R = 0.1*Eigen::MatrixXd::Identity(num_inputs, num_inputs);\n+    Eigen::VectorXd xG(num_states);   xG << 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0;\n+    Eigen::VectorXd uG = Eigen::VectorXd::Ones(num_inputs) * m * g * 0.25;\n+    return timeInvariantLQR(xG,uG,Q,R);\n+  }\n+\n+  double g, L, m;\n+  Eigen::Matrix3d I;\n+  \n+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n+private:\n+  const unsigned int num_states;\n+  const unsigned int num_inputs;\n+  const double kf = 1;\n+  const double km = 0.0245;\n+\n+  template <typename Scalar, typename Vector>\n+  Vector dynamics_implementation(Scalar t, const Vector& x, const Vector& u) const {\n+    Vector xdot(num_states);\n+    xdot = Vector::Zero(num_states);\n+\n+    Scalar phi = x(3);\n+    Scalar theta = x(4);\n+    Scalar psi = x(5);\n+\n+    Scalar phidot = x(9);\n+    Scalar thetadot = x(10);\n+    Scalar psidot = x(11);\n+\n+    Scalar w1 = u(0);\n+    Scalar w2 = u(1);\n+    Scalar w3 = u(2);\n+    Scalar w4 = u(3);\n+\n+    Eigen::Matrix<Scalar, 3, 1> rpy(phi, theta, psi);\n+    Eigen::Matrix<Scalar, 3, 3> R = rpy2rotmat(rpy);\n+\n+    Scalar F1 = kf * w1;\n+    Scalar F2 = kf * w2;\n+    Scalar F3 = kf * w3;\n+    Scalar F4 = kf * w4;\n+\n+    Scalar M1 = km * w1;\n+    Scalar M2 = km * w2;\n+    Scalar M3 = km * w3;\n+    Scalar M4 = km * w4;\n+\n+    Eigen::Matrix<Scalar, 3, 1> gvec(0, 0, -m * g);\n+    Eigen::Matrix<Scalar, 3, 1> forcevec(0, 0, F1 + F2 + F3 + F4);\n+    Eigen::Matrix<Scalar, 3, 1> xyz_ddot = (1.0 / m) * (gvec + R * forcevec);\n+\n+    Eigen::Matrix<Scalar, 3, 1> rpydot(phidot, thetadot, psidot);\n+    Eigen::Matrix<Scalar, 3, 1> pqr;\n+    rpydot2angularvel(rpy, rpydot, pqr);\n+    pqr = R.adjoint() * pqr;\n+\n+    Eigen::Matrix<Scalar, 3, 1> pqr_dot_term1;\n+    pqr_dot_term1 << L * (F2 - F4), L * (F3 - F1), (M1 - M2 + M3 - M4);\n+\n+    Eigen::Matrix<Scalar, 3, 1> pqr_dot = I.ldlt().solve(pqr_dot_term1 - pqr.cross(I * pqr));\n+    Eigen::Matrix<Scalar, 3, 3> Phi;\n+    typename Gradient<Eigen::Matrix<Scalar, 3, 3>, 3>::type dPhi;\n+    auto ddPhi = (typename Gradient<Eigen::Matrix<Scalar, 3, 3>, 3, 2>::type*) nullptr;\n+    angularvel2rpydotMatrix(rpy, Phi, &dPhi, ddPhi);\n+\n+    Eigen::Matrix<Scalar, 9, 3> drpy2drotmat = drpy2rotmat(rpy);\n+    Eigen::Matrix<Scalar, 9, 1> Rdot_vec;\n+    Rdot_vec = drpy2drotmat * rpydot;\n+    Eigen::Matrix<Scalar, 3, 3> Rdot = Eigen::Map< Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> >(Rdot_vec.data(), 3, 3);\n+    Eigen::Matrix<Scalar, 9, 1> dPhi_x_rpydot_vec;\n+    dPhi_x_rpydot_vec = dPhi * rpydot;\n+    Eigen::Matrix<Scalar, 3, 3> dPhi_x_rpydot = Eigen::Map< Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> >(dPhi_x_rpydot_vec.data(), 3, 3);\n+    Eigen::Matrix<Scalar, 3, 1> rpy_ddot = Phi * R * pqr_dot + dPhi_x_rpydot * R * pqr + Phi * Rdot * pqr;","path":"drake/examples/Quadrotor/Quadrotor.h","position":123,"original_position":123,"commit_id":"7125654a1791157529d8922dce70403e19623236","original_commit_id":"7125654a1791157529d8922dce70403e19623236","user":{"login":"tkoolen","id":2585880,"avatar_url":"https://avatars.githubusercontent.com/u/2585880?v=3","gravatar_id":"","url":"https://api.github.com/users/tkoolen","html_url":"https://github.com/tkoolen","followers_url":"https://api.github.com/users/tkoolen/followers","following_url":"https://api.github.com/users/tkoolen/following{/other_user}","gists_url":"https://api.github.com/users/tkoolen/gists{/gist_id}","starred_url":"https://api.github.com/users/tkoolen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tkoolen/subscriptions","organizations_url":"https://api.github.com/users/tkoolen/orgs","repos_url":"https://api.github.com/users/tkoolen/repos","events_url":"https://api.github.com/users/tkoolen/events{/privacy}","received_events_url":"https://api.github.com/users/tkoolen/received_events","type":"User","site_admin":false},"body":"This is fine, but we're really just doing differentiation by hand again. Why not use AutoDiff? :-) \r\n\r\nTo compute `Rdot`, you can create an AutoDiffScalar vector `rpy_autodiff`, which has `rpy` as values and `rpydot` as derivatives (i.e. derivatives only w.r.t. time). Then `rpy2rotmat(rpy_autodiff)` will compute both `R_autodiff`, which has both `R` and `Rdot` in it.\r\n\r\nNext, to compute `pqr_dot`, you can similarly create an AutoDiffScalar vector `pqr_autodiff`, which has `pqr` as values and `pqr_dot` as derivatives. Then you just take the algorithm for computing `rpy_dot` from `rpy`, `pqr` and `R`, i.e.\r\n```\r\nrpy_dot = angularvel2rpydotMatrix(rpy) * R * pqr;\r\n```\r\nand call it with the AutoDiff versions (`rpy_autodiff`, `pqr_autodiff` and `R_autodiff`), and you'll get `rpy_ddot` as the gradient output.\r\n\r\nI implemented this here:\r\nhttps://github.com/tkoolen/crtpDemo/blob/master/example/QuadPlantPenn.h ","created_at":"2015-11-30T17:22:00Z","updated_at":"2015-11-30T17:22:00Z","html_url":"https://github.com/RobotLocomotion/drake/pull/1475#discussion_r46173436","pull_request_url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475","_links":{"self":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/comments/46173436"},"html":{"href":"https://github.com/RobotLocomotion/drake/pull/1475#discussion_r46173436"},"pull_request":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475"}}},"pull_request":{"url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475","id":52028646,"html_url":"https://github.com/RobotLocomotion/drake/pull/1475","diff_url":"https://github.com/RobotLocomotion/drake/pull/1475.diff","patch_url":"https://github.com/RobotLocomotion/drake/pull/1475.patch","issue_url":"https://api.github.com/repos/RobotLocomotion/drake/issues/1475","number":1475,"state":"open","locked":false,"title":"Quadrotor Simulation in C++","user":{"login":"psiorx","id":3849600,"avatar_url":"https://avatars.githubusercontent.com/u/3849600?v=3","gravatar_id":"","url":"https://api.github.com/users/psiorx","html_url":"https://github.com/psiorx","followers_url":"https://api.github.com/users/psiorx/followers","following_url":"https://api.github.com/users/psiorx/following{/other_user}","gists_url":"https://api.github.com/users/psiorx/gists{/gist_id}","starred_url":"https://api.github.com/users/psiorx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psiorx/subscriptions","organizations_url":"https://api.github.com/users/psiorx/orgs","repos_url":"https://api.github.com/users/psiorx/repos","events_url":"https://api.github.com/users/psiorx/events{/privacy}","received_events_url":"https://api.github.com/users/psiorx/received_events","type":"User","site_admin":false},"body":"As discussed in the meeting, this currently uses the ode1 pipeline.  At a timestep of 0.005s it seems to be fine.  I'll bring in a more robust solver to the C++ simulation capabilities in a second pass.\r\n\r\nCurrently this has two example executables:\r\n\r\n* One which grabs inputs over LCM and publishes state (will use for FLA).\r\n* An LQR hovering example showing closed loop feedback control.\r\n\r\nPerformance seems great so far since it can simulate at the target rate of 200 Hz while consuming less than 3% of a CPU core.  Simulink couldn't keep up with realtime even at 100 Hz.\r\n","created_at":"2015-11-27T23:35:35Z","updated_at":"2015-11-30T17:22:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6e60a688a2bf8e95cca1a623b5e8dd26e79f0aec","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475/commits","review_comments_url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475/comments","review_comment_url":"https://api.github.com/repos/RobotLocomotion/drake/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RobotLocomotion/drake/issues/1475/comments","statuses_url":"https://api.github.com/repos/RobotLocomotion/drake/statuses/7125654a1791157529d8922dce70403e19623236","head":{"label":"psiorx:jc-quadrotor-sim-cpp","ref":"jc-quadrotor-sim-cpp","sha":"7125654a1791157529d8922dce70403e19623236","user":{"login":"psiorx","id":3849600,"avatar_url":"https://avatars.githubusercontent.com/u/3849600?v=3","gravatar_id":"","url":"https://api.github.com/users/psiorx","html_url":"https://github.com/psiorx","followers_url":"https://api.github.com/users/psiorx/followers","following_url":"https://api.github.com/users/psiorx/following{/other_user}","gists_url":"https://api.github.com/users/psiorx/gists{/gist_id}","starred_url":"https://api.github.com/users/psiorx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psiorx/subscriptions","organizations_url":"https://api.github.com/users/psiorx/orgs","repos_url":"https://api.github.com/users/psiorx/repos","events_url":"https://api.github.com/users/psiorx/events{/privacy}","received_events_url":"https://api.github.com/users/psiorx/received_events","type":"User","site_admin":false},"repo":{"id":30214282,"name":"drake","full_name":"psiorx/drake","owner":{"login":"psiorx","id":3849600,"avatar_url":"https://avatars.githubusercontent.com/u/3849600?v=3","gravatar_id":"","url":"https://api.github.com/users/psiorx","html_url":"https://github.com/psiorx","followers_url":"https://api.github.com/users/psiorx/followers","following_url":"https://api.github.com/users/psiorx/following{/other_user}","gists_url":"https://api.github.com/users/psiorx/gists{/gist_id}","starred_url":"https://api.github.com/users/psiorx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psiorx/subscriptions","organizations_url":"https://api.github.com/users/psiorx/orgs","repos_url":"https://api.github.com/users/psiorx/repos","events_url":"https://api.github.com/users/psiorx/events{/privacy}","received_events_url":"https://api.github.com/users/psiorx/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/psiorx/drake","description":"A planning, control, and analysis toolbox for nonlinear dynamical systems.  Please see the WIKI for documentation.","fork":true,"url":"https://api.github.com/repos/psiorx/drake","forks_url":"https://api.github.com/repos/psiorx/drake/forks","keys_url":"https://api.github.com/repos/psiorx/drake/keys{/key_id}","collaborators_url":"https://api.github.com/repos/psiorx/drake/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/psiorx/drake/teams","hooks_url":"https://api.github.com/repos/psiorx/drake/hooks","issue_events_url":"https://api.github.com/repos/psiorx/drake/issues/events{/number}","events_url":"https://api.github.com/repos/psiorx/drake/events","assignees_url":"https://api.github.com/repos/psiorx/drake/assignees{/user}","branches_url":"https://api.github.com/repos/psiorx/drake/branches{/branch}","tags_url":"https://api.github.com/repos/psiorx/drake/tags","blobs_url":"https://api.github.com/repos/psiorx/drake/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/psiorx/drake/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/psiorx/drake/git/refs{/sha}","trees_url":"https://api.github.com/repos/psiorx/drake/git/trees{/sha}","statuses_url":"https://api.github.com/repos/psiorx/drake/statuses/{sha}","languages_url":"https://api.github.com/repos/psiorx/drake/languages","stargazers_url":"https://api.github.com/repos/psiorx/drake/stargazers","contributors_url":"https://api.github.com/repos/psiorx/drake/contributors","subscribers_url":"https://api.github.com/repos/psiorx/drake/subscribers","subscription_url":"https://api.github.com/repos/psiorx/drake/subscription","commits_url":"https://api.github.com/repos/psiorx/drake/commits{/sha}","git_commits_url":"https://api.github.com/repos/psiorx/drake/git/commits{/sha}","comments_url":"https://api.github.com/repos/psiorx/drake/comments{/number}","issue_comment_url":"https://api.github.com/repos/psiorx/drake/issues/comments{/number}","contents_url":"https://api.github.com/repos/psiorx/drake/contents/{+path}","compare_url":"https://api.github.com/repos/psiorx/drake/compare/{base}...{head}","merges_url":"https://api.github.com/repos/psiorx/drake/merges","archive_url":"https://api.github.com/repos/psiorx/drake/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/psiorx/drake/downloads","issues_url":"https://api.github.com/repos/psiorx/drake/issues{/number}","pulls_url":"https://api.github.com/repos/psiorx/drake/pulls{/number}","milestones_url":"https://api.github.com/repos/psiorx/drake/milestones{/number}","notifications_url":"https://api.github.com/repos/psiorx/drake/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/psiorx/drake/labels{/name}","releases_url":"https://api.github.com/repos/psiorx/drake/releases{/id}","created_at":"2015-02-02T23:23:34Z","updated_at":"2015-02-13T16:18:50Z","pushed_at":"2015-11-27T23:27:47Z","git_url":"git://github.com/psiorx/drake.git","ssh_url":"git@github.com:psiorx/drake.git","clone_url":"https://github.com/psiorx/drake.git","svn_url":"https://github.com/psiorx/drake","homepage":"https://github.com/RobotLocomotion/drake/wiki","size":177837,"stargazers_count":0,"watchers_count":0,"language":"Matlab","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"RobotLocomotion:master","ref":"master","sha":"0c694763cc4f8d599b8623dfee0b352227954296","user":{"login":"RobotLocomotion","id":6496345,"avatar_url":"https://avatars.githubusercontent.com/u/6496345?v=3","gravatar_id":"","url":"https://api.github.com/users/RobotLocomotion","html_url":"https://github.com/RobotLocomotion","followers_url":"https://api.github.com/users/RobotLocomotion/followers","following_url":"https://api.github.com/users/RobotLocomotion/following{/other_user}","gists_url":"https://api.github.com/users/RobotLocomotion/gists{/gist_id}","starred_url":"https://api.github.com/users/RobotLocomotion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RobotLocomotion/subscriptions","organizations_url":"https://api.github.com/users/RobotLocomotion/orgs","repos_url":"https://api.github.com/users/RobotLocomotion/repos","events_url":"https://api.github.com/users/RobotLocomotion/events{/privacy}","received_events_url":"https://api.github.com/users/RobotLocomotion/received_events","type":"Organization","site_admin":false},"repo":{"id":16256144,"name":"drake","full_name":"RobotLocomotion/drake","owner":{"login":"RobotLocomotion","id":6496345,"avatar_url":"https://avatars.githubusercontent.com/u/6496345?v=3","gravatar_id":"","url":"https://api.github.com/users/RobotLocomotion","html_url":"https://github.com/RobotLocomotion","followers_url":"https://api.github.com/users/RobotLocomotion/followers","following_url":"https://api.github.com/users/RobotLocomotion/following{/other_user}","gists_url":"https://api.github.com/users/RobotLocomotion/gists{/gist_id}","starred_url":"https://api.github.com/users/RobotLocomotion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RobotLocomotion/subscriptions","organizations_url":"https://api.github.com/users/RobotLocomotion/orgs","repos_url":"https://api.github.com/users/RobotLocomotion/repos","events_url":"https://api.github.com/users/RobotLocomotion/events{/privacy}","received_events_url":"https://api.github.com/users/RobotLocomotion/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/RobotLocomotion/drake","description":"A planning, control, and analysis toolbox for nonlinear dynamical systems.  Please see the WIKI for documentation.","fork":false,"url":"https://api.github.com/repos/RobotLocomotion/drake","forks_url":"https://api.github.com/repos/RobotLocomotion/drake/forks","keys_url":"https://api.github.com/repos/RobotLocomotion/drake/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RobotLocomotion/drake/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RobotLocomotion/drake/teams","hooks_url":"https://api.github.com/repos/RobotLocomotion/drake/hooks","issue_events_url":"https://api.github.com/repos/RobotLocomotion/drake/issues/events{/number}","events_url":"https://api.github.com/repos/RobotLocomotion/drake/events","assignees_url":"https://api.github.com/repos/RobotLocomotion/drake/assignees{/user}","branches_url":"https://api.github.com/repos/RobotLocomotion/drake/branches{/branch}","tags_url":"https://api.github.com/repos/RobotLocomotion/drake/tags","blobs_url":"https://api.github.com/repos/RobotLocomotion/drake/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RobotLocomotion/drake/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RobotLocomotion/drake/git/refs{/sha}","trees_url":"https://api.github.com/repos/RobotLocomotion/drake/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RobotLocomotion/drake/statuses/{sha}","languages_url":"https://api.github.com/repos/RobotLocomotion/drake/languages","stargazers_url":"https://api.github.com/repos/RobotLocomotion/drake/stargazers","contributors_url":"https://api.github.com/repos/RobotLocomotion/drake/contributors","subscribers_url":"https://api.github.com/repos/RobotLocomotion/drake/subscribers","subscription_url":"https://api.github.com/repos/RobotLocomotion/drake/subscription","commits_url":"https://api.github.com/repos/RobotLocomotion/drake/commits{/sha}","git_commits_url":"https://api.github.com/repos/RobotLocomotion/drake/git/commits{/sha}","comments_url":"https://api.github.com/repos/RobotLocomotion/drake/comments{/number}","issue_comment_url":"https://api.github.com/repos/RobotLocomotion/drake/issues/comments{/number}","contents_url":"https://api.github.com/repos/RobotLocomotion/drake/contents/{+path}","compare_url":"https://api.github.com/repos/RobotLocomotion/drake/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RobotLocomotion/drake/merges","archive_url":"https://api.github.com/repos/RobotLocomotion/drake/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RobotLocomotion/drake/downloads","issues_url":"https://api.github.com/repos/RobotLocomotion/drake/issues{/number}","pulls_url":"https://api.github.com/repos/RobotLocomotion/drake/pulls{/number}","milestones_url":"https://api.github.com/repos/RobotLocomotion/drake/milestones{/number}","notifications_url":"https://api.github.com/repos/RobotLocomotion/drake/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RobotLocomotion/drake/labels{/name}","releases_url":"https://api.github.com/repos/RobotLocomotion/drake/releases{/id}","created_at":"2014-01-26T16:11:05Z","updated_at":"2015-11-30T00:41:31Z","pushed_at":"2015-11-30T02:29:00Z","git_url":"git://github.com/RobotLocomotion/drake.git","ssh_url":"git@github.com:RobotLocomotion/drake.git","clone_url":"https://github.com/RobotLocomotion/drake.git","svn_url":"https://github.com/RobotLocomotion/drake","homepage":"https://github.com/RobotLocomotion/drake/wiki","size":217420,"stargazers_count":314,"watchers_count":314,"language":"Matlab","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":200,"mirror_url":null,"open_issues_count":155,"forks":200,"open_issues":155,"watchers":314,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475"},"html":{"href":"https://github.com/RobotLocomotion/drake/pull/1475"},"issue":{"href":"https://api.github.com/repos/RobotLocomotion/drake/issues/1475"},"comments":{"href":"https://api.github.com/repos/RobotLocomotion/drake/issues/1475/comments"},"review_comments":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475/comments"},"review_comment":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RobotLocomotion/drake/pulls/1475/commits"},"statuses":{"href":"https://api.github.com/repos/RobotLocomotion/drake/statuses/7125654a1791157529d8922dce70403e19623236"}}}}