{"id":45,"date":"2019-01-21T06:09:33","date_gmt":"2019-01-21T06:09:33","guid":{"rendered":"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/?page_id=45"},"modified":"2019-10-03T14:36:23","modified_gmt":"2019-10-03T14:36:23","slug":"system-design","status":"publish","type":"page","link":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/system-design\/","title":{"rendered":"System Design"},"content":{"rendered":"<h2 id=\"tablepress-1-name\" class=\"tablepress-table-name tablepress-table-name-id-1\">Functional Requirements<\/h2>\n\n<table id=\"tablepress-1\" class=\"tablepress tablepress-id-1\" aria-labelledby=\"tablepress-1-name\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">FR1. Take input from the user <\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">FR2.  Perceive drivable area during navigation<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">FR3. Autonomously localize itself<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">         FR3.1. Along Row<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">         FR3.2. Correct Row<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">FR4. Autonomously switch between rows of the field<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">FR5. Collect visual data<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">FR6. Identify signs of disease<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td class=\"column-1\">FR7. Identify pests or signs of pests\t<\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td class=\"column-1\">FR8. Generate meaningful reports<\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td class=\"column-1\">FR9. Communicate (reports) to users<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<h2 id=\"tablepress-2-name\" class=\"tablepress-table-name tablepress-table-name-id-2\">Performance Requirements<\/h2>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\" aria-labelledby=\"tablepress-2-name\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">MR1. Autonomously localize itself <\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">         MR1.1. In the correct row with 80% accuracy<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">         MR1.2. Cross track control error &lt; 3 in within the row<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">MR2. Autonomously switch between rows of the field with 80% success rate<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">MR3. Collect visual data with 75% usable images<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">MR4. Identify signs of disease on plant with precision and recall &gt; 80%<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">MR5. Identify pests and \/or signs of pests with precision and recall &gt; 80%<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">MR6. Generate meaningful reports within 24hrs of collection<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td class=\"column-1\">MR6.1. Label row with plant name<\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td class=\"column-1\">MR6.2. Label image with severity level<\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td class=\"column-1\">MR6.3. Allow user to see and change the severity level<\/td>\n<\/tr>\n<tr class=\"row-12\">\n\t<td class=\"column-1\">MR6.4. Show date of monitoring on the GUI<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<h2 id=\"tablepress-3-name\" class=\"tablepress-table-name tablepress-table-name-id-3\">Non-Functional Requirements<\/h2>\n\n<table id=\"tablepress-3\" class=\"tablepress tablepress-id-3\" aria-labelledby=\"tablepress-3-name\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">MN1. Fit in the row of width 24in<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">MN2. Accommodate various control modes via kill switch and joystick<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">MN3. Have sufficient battery life to complete a run of Rivendale brassica field<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">MN4. Not damage plant during navigation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<h1>Functional Architecture<\/h1>\n<p><span style=\"font-weight: 400\">The functional architecture has been simplified to only a single monitoring mode. In this operation mode, the robot localizes itself in the field and then uses the location and a pre-built map to navigates through the field. The robot collects visual data which it processes later to identify signs of pests and disease. In the end, meaningful reports are generated to communicate to the user information about crop health.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-379 size-large\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Functional-Architecture-Latest-1-1024x268.jpg\" alt=\"\" width=\"840\" height=\"220\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Functional-Architecture-Latest-1-1024x268.jpg 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Functional-Architecture-Latest-1-300x79.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Functional-Architecture-Latest-1-768x201.jpg 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Functional-Architecture-Latest-1-1200x315.jpg 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<h1>Cyber-Physical Architecture<\/h1>\n<p><span style=\"font-weight: 400\">The following figure shows the overall cyber-physical architecture of the robot which has been primarily divided into components which include User Interface, Processing, Sensing and Output. The high level cyber-physical breakdown of each subsystem has been done below (further breakdown is discussed as part of each subsystem). <\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-380 size-large\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Cyberphysical-Architecture-Latest-1024x502.jpg\" alt=\"\" width=\"840\" height=\"412\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Cyberphysical-Architecture-Latest-1024x502.jpg 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Cyberphysical-Architecture-Latest-300x147.jpg 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Cyberphysical-Architecture-Latest-768x377.jpg 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/10\/Cyberphysical-Architecture-Latest-1200x589.jpg 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<p><span style=\"font-weight: 400\">The navigation subsystem is used in both operating modes. It inputs information from 3D LIDAR (Velodyne VLP16 Puck), an Inertial Measurement Unit, and a stereo camera (ZED). The IMU and LIDAR are interpreted by a row detector, which is fed into the localizer along with visual odometry from the stereo camera in order to output the robot\u2019s pose. The map (GPS points at the beginning and end of each row) are passed through a global planner which outputs a trajectory. The robot\u2019s pose is then matched to the trajectory pose using a pure pursuit controller.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-296\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/navigation.png\" alt=\"\" width=\"974\" height=\"491\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/navigation.png 974w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/navigation-300x151.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/navigation-768x387.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<div class=\"mceTemp\"><\/div>\n<p><span style=\"font-weight: 400\">Within the monitoring mode, the monitoring subsystem takes images from the robot\u2019s active lighting stereo camera and passes it through a perception pipeline to identify areas of pest and disease. The pipeline includes segmentation via Mask RCNN and depth filtering, both of which are fed into a logistic regression to generate a classified output (in terms of disease and pest severity).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-297\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/monitoring.png\" alt=\"\" width=\"974\" height=\"335\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/monitoring.png 974w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/monitoring-300x103.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/monitoring-768x264.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<p><span style=\"font-weight: 400\">The weeding subsystem uses the stereo camera to collect visual data and location data for detecting weeds in that particular position. After the weed is detected, the 3D location of the weed in the robot frame is calculated and sent to the weeding controller. The weeding controller drives the motors of the weeding mechanism to perform the operation. Higher level mission logic is utilized to confirm the success of the operation before allowing the robot to continue navigation.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-298\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/weeding.png\" alt=\"\" width=\"974\" height=\"304\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/weeding.png 974w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/weeding-300x94.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/weeding-768x240.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/p>\n<h1>System Design<\/h1>\n<h3><b>Navigation<\/b><\/h3>\n<h3><b>Navigation: Overview<\/b><\/h3>\n<p><span style=\"font-weight: 400\">We pivoted our navigation strategy which originally required a geometrically consistent point cloud computed via laser-odometry based SLAM to be fitted with a Gaussian mixture model in order to create a sensor model for particle-filter based localization. We instead have used the inherent structure of the farm to converge on a strategy where a row perception module detects row lines in point clouds, and the sensor model is based on computing the probability of a particular row detection given the expected row lines from a list of globally located row lines in the field. This method is far simpler than the prior approach and has the advantage of needing only the row detection module to be changed to accommodate a new environment.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><b>Navigation: Row Detection<\/b><\/h3>\n<p><span style=\"font-weight: 400\">The row detector is responsible for translating 3D laser scans into row lines. We chose to use the Hesse normal form of a line, in which a line is represented by its normal <\/span><i><span style=\"font-weight: 400\">n <\/span><\/i><span style=\"font-weight: 400\">and perpendicular distance to the origin <\/span><i><span style=\"font-weight: 400\">d<\/span><\/i><span style=\"font-weight: 400\">. Points <\/span><i><span style=\"font-weight: 400\">r <\/span><\/i><span style=\"font-weight: 400\">which lie on the line are therefore defined by <\/span><i><span style=\"font-weight: 400\">r <\/span><\/i><b><i>\u00b7 <\/i><\/b><i><span style=\"font-weight: 400\">n = d<\/span><\/i><span style=\"font-weight: 400\">. The normal <\/span><i><span style=\"font-weight: 400\">n<\/span><\/i><span style=\"font-weight: 400\"> can equivalently be represented by <\/span><i><span style=\"font-weight: 400\">\u03b8 = <\/span><\/i><i><span style=\"font-weight: 400\">atan2(n<\/span><\/i><i><span style=\"font-weight: 400\">y<\/span><\/i><i><span style=\"font-weight: 400\">, n<\/span><\/i><i><span style=\"font-weight: 400\">x<\/span><\/i><i><span style=\"font-weight: 400\">)<\/span><\/i><span style=\"font-weight: 400\">. This parameterization was chosen over the standard in order to represent vertical lines correctly and prevent numerical instability. <\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><b>Navigation: Localization<\/b><\/h3>\n<p><span style=\"font-weight: 400\">The localization for the robot, both inside and outside of the row is done using a particle filter. The particle filter is comprised of three main steps which are the prediction, update and resampling steps. For the prediction step, the motion model [1] takes an initial estimate of the pose of the robot using visual odometry from the ZED camera. The relative change in translation (x,y) and rotation (yaw) is calculated and uncertainty is added to this. The uncertainty is sampled from a triangular distribution. For the update step, the measurement model utilizes the row detections and computes a posterior probability of the robot being in a particular pose with respect to the row given this particular row detection P(Z\/X). Uncertainty in row detections for distance and angle to the rows is sampled from a Gaussian distribution. For the resampling step, the systematic resampling algorithm [2] is required, where new particles are sampled around old particles which had higher probability. <\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center\"><b><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-303 size-medium\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/localization-287x300.png\" alt=\"\" width=\"287\" height=\"300\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/localization-287x300.png 287w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/localization.png 581w\" sizes=\"auto, (max-width: 287px) 85vw, 287px\" \/>Flowchart for Localization<\/b><\/p>\n<p>&nbsp;<\/p>\n<h3><b>Navigation: Planning &amp; Controls<\/b><\/h3>\n<p style=\"text-align: center\"><b><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-304\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/planning_control.png\" alt=\"\" width=\"974\" height=\"422\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/planning_control.png 974w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/planning_control-300x130.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/planning_control-768x333.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/>Flowchart showing planning and controls pipeline<\/b><\/p>\n<p><b>Planning<\/b><\/p>\n<p><span style=\"font-weight: 400\">The robot should start from a designated starting point, enter the first traversable row and then switch rows to go to the next one. It should repeat this process to cover all the rows in the field.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A coverage path planner was developed which identifies the order in which the rows in the field should be traversed. The algorithm takes the input as the coordinates of the start and end points of the traversable rows from an RTK GPS. These points are then rotated and translated so that the origin is at the start of the first row, x-axis aligns with the first row and z-axis points upward.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Next, the order of traversing rows is identified. The planner is subject to the following constraints while planning the global path<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400\"> Cover entire Area:<\/span> <span style=\"font-weight: 400\">The robot should cover the entire field of interest.<\/span><\/li>\n<li><span style=\"font-weight: 400\"> Traverse each row in both directions: Since the stereo camera is mounted on only one side of the platform, the robot needs to traverse each row in both directions so that the plants on each side of the row are captured.<\/span><\/li>\n<li><span style=\"font-weight: 400\"> Account for Turning Radius:<\/span> <span style=\"font-weight: 400\">The robot utilizes a skid-steer mechanism and has a large wheelbase. Hence it has a large turning radius. The planner should account for this while making the plan.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">The robot should be able to switch from the first to the second traversable row. In case the distance between the traversable rows is less than the allowable turning limit of the robot, the robot skips the row and switches to the next one. Also, the robot does not repeat going through a row in the same direction twice. Finally, we get a list specifying the order in which the robot should traverse the various rows.<\/span><\/p>\n<p><span style=\"font-weight: 400\">This order is converted into a path by generating a rectangular path while switching rows and a straight path for motion along a row. \u00a0This path is then discretized in small steps of approx. 0.1m and is passed to the controller as a npy file.<\/span><\/p>\n<p><b>Controls<\/b><\/p>\n<p><span style=\"font-weight: 400\">The control sub-system takes the global path from the planner and current location from the localizer as input and utilizes a control algorithm to track the specified path. Since the robot is a skid steering robot, at any instant the robot can have a velocity along the angular and forward direction only. The sub-system utilizes a proportional controller to calculate the desired linear velocity and utilizes a pure pursuit algorithm to calculate the desired angular velocity of the robot.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Given its current position and orientation in the field frame from the localizer, the controller uses the pre-generated map file and finds the farthest point within a lookahead distance which is in a similar direction as that of the robot. This desired location is transformed to the robot frame. This goal position in robot frame is used to get the forward velocity using a proportional control using Eq. 1 and angular velocity using a Pure Pursuit controller using Eq. 2 with a lookahead distance of ~1m.<\/span><\/p>\n<p><span style=\"font-weight: 400\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-302\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM.png\" alt=\"\" width=\"413\" height=\"174\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM.png 1566w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM-300x126.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM-768x324.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM-1024x432.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-content\/uploads\/sites\/35\/2019\/05\/Screen-Shot-2019-05-08-at-3.35.32-PM-1200x506.png 1200w\" sizes=\"auto, (max-width: 413px) 85vw, 413px\" \/><\/span><span style=\"font-weight: 400\">These velocities are then transmitted to the drive-based controller.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Functional Architecture The functional architecture has been simplified to only a single monitoring mode. In this operation mode, the robot localizes itself in the field and then uses the location and a pre-built map to navigates through the field. The robot collects visual data which it processes later to identify signs of pests and disease. &hellip; <a href=\"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/system-design\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;System Design&#8221;<\/span><\/a><\/p>\n","protected":false},"author":158,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-45","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/pages\/45","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/users\/158"}],"replies":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/comments?post=45"}],"version-history":[{"count":12,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/pages\/45\/revisions"}],"predecessor-version":[{"id":382,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/pages\/45\/revisions\/382"}],"wp:attachment":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2018teame\/wp-json\/wp\/v2\/media?parent=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}