{"id":360,"date":"2024-09-06T15:04:23","date_gmt":"2024-09-06T15:04:23","guid":{"rendered":"https:\/\/siddharthv.com\/?p=360"},"modified":"2024-09-18T10:50:14","modified_gmt":"2024-09-18T14:50:14","slug":"modeling-an-omni-directional-robot-in-simscape-part-2","status":"publish","type":"post","link":"https:\/\/siddharthv.com\/?p=360","title":{"rendered":"Modeling an Omni-Directional Robot in Simscape: Part 2"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Modeling Workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the&nbsp;introduction, we looked at the structure of an omni-directional wheel and how it works. We examined how this wheel design allows the robot assembly to move in any direction. It does this without changing its orientation. It also achieves holonomic motion. Now, it&#8217;s time to translate that information into an actual virtual model. This model acts and behaves exactly like the real thing. This is where&nbsp;<a href=\"https:\/\/www.mathworks.com\/products\/simscape.html\">Simscape<\/a>&nbsp;comes into the picture.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will use the Multibody modeling tools in Simscape to build this model. We will hook up this model to control algorithms developed in Simulink and MATLAB. This model can also be used as a digital twin for the actual robot that I am building for my lab. I will talk about digital twins at length in another post.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, we are going to build our robot model in a step-by-step fashion, as follows:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#step1\">Breakdown the model into a hierarchical structure<\/a><\/li>\n\n\n\n<li><a href=\"#step2\">Arrive at a flow-chart for building the parts<\/a><\/li>\n\n\n\n<li>Build steps:\n<ul class=\"wp-block-list\">\n<li><a href=\"#step3\">Passive wheel and axle<\/a><\/li>\n\n\n\n<li><a href=\"#step4\">Wheel hub assembly<\/a><\/li>\n\n\n\n<li><a href=\"#finishing\">Finish Wheel assembly<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">We will attach the wheels to the robot chassis and model the interaction with the ground plane in the next blog entry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\"><code>If you would like to first go take a look at the basics of Multibody modeling in Simscape, follow the link to the documentation. You can find it in the getting started section at the bottom of the page.<\/code>.<\/mark><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"step1\">Breakdown the model into a hierarchical structure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let us start by breaking down the robot assembly into a hierarchical structure. This is how that structure looks conceptually.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"385\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=660%2C385&#038;ssl=1\" alt=\"\" class=\"wp-image-361\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=1024%2C598&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=300%2C175&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=768%2C449&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=1536%2C897&amp;ssl=1 1536w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?resize=2048%2C1197&amp;ssl=1 2048w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?w=1320&amp;ssl=1 1320w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/breakdown.png?w=1980&amp;ssl=1 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.1: <em>Hierarchical structure of the omni-directional robot.<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"step2\">Arrive at a flow-chart for building the parts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Starting out on a modeling project feels daunting when you look at the assembly as a whole. Still, once you have broken it down into smaller parts, it&#8217;s easy to see the repetitive elements. You need to model them only once. Also, as we model the smaller parts, the steps become more intuitive. When we assemble them into the next higher order part, the process becomes more straightforward. This is how the flowchart is actually going to look like once we get started.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"168\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=660%2C168&#038;ssl=1\" alt=\"\" class=\"wp-image-362\" style=\"width:828px;height:auto\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=1024%2C261&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=300%2C77&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=768%2C196&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=1536%2C392&amp;ssl=1 1536w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?resize=2048%2C523&amp;ssl=1 2048w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?w=1320&amp;ssl=1 1320w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/flowchart-1.png?w=1980&amp;ssl=1 1980w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.2: <em>Flow-chart for the modeling steps.<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"step3\">Modeling the Passive wheel with axle<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before we start modeling the wheel, we are going to need some 3D models to represent its components. These components are the passive wheel and the wheel hub. Here is the STL file for the passive wheel used in this project:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\n        <div class=\"modelViewerBlock\" data-attributes='{&quot;align&quot;:&quot;center&quot;,&quot;uniqueId&quot;:&quot;model383&quot;,&quot;currentViewer&quot;:&quot;O3DViewer&quot;,&quot;multiple&quot;:false,&quot;O3DVSettings&quot;:{&quot;isFullscreen&quot;:true,&quot;isPagination&quot;:false,&quot;isNavigation&quot;:false,&quot;camera&quot;:null,&quot;mouseControl&quot;:true},&quot;environmentImage&quot;:null,&quot;lazyLoad&quot;:false,&quot;loading&quot;:&quot;auto&quot;,&quot;autoplay&quot;:false,&quot;shadow&quot;:&quot;1&quot;,&quot;autoRotate&quot;:false,&quot;zoomLevel&quot;:null,&quot;zoom&quot;:true,&quot;isPagination&quot;:false,&quot;isNavigation&quot;:false,&quot;hotspotStyle&quot;:&quot;style-1&quot;,&quot;preload&quot;:&quot;auto&quot;,&quot;rotationPerSecond&quot;:&quot;30&quot;,&quot;mouseControl&quot;:true,&quot;lockXAxisRotation&quot;:false,&quot;lockYAxisRotation&quot;:false,&quot;fullscreen&quot;:true,&quot;zoomInOutBtn&quot;:false,&quot;cameraBtn&quot;:false,&quot;variant&quot;:false,&quot;loadingPercentage&quot;:false,&quot;progressBar&quot;:true,&quot;rotate&quot;:false,&quot;rotateDelay&quot;:3000,&quot;rotateAlongX&quot;:&quot;0&quot;,&quot;rotateAlongY&quot;:&quot;75&quot;,&quot;exposure&quot;:&quot;1&quot;,&quot;stylesheet&quot;:null,&quot;additional&quot;:{&quot;ID&quot;:&quot;&quot;,&quot;Class&quot;:&quot;&quot;,&quot;CSS&quot;:null},&quot;animation&quot;:false,&quot;woo&quot;:false,&quot;selectedAnimation&quot;:&quot;&quot;,&quot;placement&quot;:&quot;shortcode&quot;,&quot;styles&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;320px&quot;,&quot;bgColor&quot;:&quot;transparent&quot;,&quot;progressBarColor&quot;:null},&quot;model&quot;:{&quot;modelUrl&quot;:&quot;https:\\\/\\\/siddharthv.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/passive.stl&quot;,&quot;poster&quot;:&quot;&quot;},&quot;models&quot;:[]}'>\n            <div class=\"bp3d_backup_view\" style=\"display: none;height:350px;\">\n                    <model-viewer camera-controls src=\"https:\/\/siddharthv.com\/wp-content\/uploads\/2024\/09\/passive.stl\" style=\"height: 350px;\"><\/model-viewer>\n            <\/div>\n            <script data-jetpack-boost=\"ignore\">\n                setTimeout(() => {\n                    let backupModels = document.querySelectorAll('.bp3d_backup_view');\n                    if(backupModels.length > 0){\n                        backupModels.forEach(element => {\n                            if(element){\n                                element.style.display = 'block';\n                                setTimeout(() => {\n                                    let adminMessages = document.querySelectorAll('.bp3d_admin_message');\n                                    if(adminMessages.length > 0){\n                                        adminMessages.forEach(adminMessage => {\n                                            if(adminMessage){\n                                                adminMessage.style.display = 'block';\n                                            }\n                                        });\n                                    }\n                                }, 5000);\n                            }\n                        });\n                    }\n                }, 5000);\n            <\/script>\n        <\/div>\n\n<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now that we have the 3D model for the wheel, let&#8217;s create a File Solid block in the Simscape model. First, set the unit type to Custom. Then, select the downloaded STL file. Set the unit type to Custom and select the downloaded STL file. You should see the wheel rendered in the preview window. Name the block as <em><strong>Wheel<\/strong><\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"340\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?resize=660%2C340&#038;ssl=1\" alt=\"\" class=\"wp-image-397\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?resize=1024%2C528&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?resize=300%2C155&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?resize=768%2C396&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?resize=1200%2C619&amp;ssl=1 1200w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-2.png?w=1225&amp;ssl=1 1225w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.4: Loading the wheel STL using a File Solid block<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Make sure to check the &#8220;<em>Convex Hull<\/em>&#8221; option in the export section under Geometry. This is important. This allows the wheel to interact with other surfaces by providing a collision model. This collision model can be used by the physics engine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You will notice that the wheel has a hole along it&#8217;s longer axis. We will align a cylindrical axle with this hole and use it to model the freely-rotating wheel motion. To achieve this, we will use a revolute joint and call it <strong><em>AxleToWheel Joint<\/em><\/strong>. We will use the default settings for this joint. Its rotation axis is already aligned with the Z-axis of the wheel. The reference frame for this setup is connected to an output port called <strong><em>R<\/em><\/strong>. The convex hull frame from the wheel is connected to an output port called <strong><em>CH<\/em><\/strong>. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"266\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?resize=660%2C266&#038;ssl=1\" alt=\"\" class=\"wp-image-399\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?resize=1024%2C413&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?resize=300%2C121&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?resize=768%2C310&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?resize=1200%2C484&amp;ssl=1 1200w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?w=1412&amp;ssl=1 1412w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-3.png?w=1320&amp;ssl=1 1320w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.5: Modeling the interface between a wheel and its axle using a revolute joint<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image wp-block-image aligncenter size-large\">\n<figure ><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"358\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?resize=660%2C358&#038;ssl=1\" alt=\"\" class=\"wp-image-401\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?resize=1024%2C556&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?resize=768%2C417&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?resize=1200%2C652&amp;ssl=1 1200w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-4.png?w=1239&amp;ssl=1 1239w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.6: Adjust the axle to fit the wheel&#8217;s hollow section<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, we can convert this assembly into a subsystem so that we can reuse it in our larger model.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"255\" height=\"242\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-5.png?resize=255%2C242&#038;ssl=1\" alt=\"\" class=\"wp-image-404\" style=\"width:420px;height:auto\"\/><figcaption class=\"wp-element-caption\">Fig 2.7: Subsystem with two output ports R and CH representing an individual passive wheel<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"step4\">Modeling the Wheel sub-assembly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now that we have a passive wheel part, we can use it to build our next part. This is the wheel sub-assembly consisting of a wheel hub and six passive wheels distributed along its circumference. The 3D part is shown below.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\n        <div class=\"modelViewerBlock\" data-attributes='{&quot;align&quot;:&quot;center&quot;,&quot;uniqueId&quot;:&quot;model391&quot;,&quot;currentViewer&quot;:&quot;O3DViewer&quot;,&quot;multiple&quot;:false,&quot;O3DVSettings&quot;:{&quot;isFullscreen&quot;:true,&quot;isPagination&quot;:false,&quot;isNavigation&quot;:false,&quot;camera&quot;:null,&quot;mouseControl&quot;:true},&quot;environmentImage&quot;:null,&quot;lazyLoad&quot;:false,&quot;loading&quot;:&quot;auto&quot;,&quot;autoplay&quot;:false,&quot;shadow&quot;:&quot;1&quot;,&quot;autoRotate&quot;:false,&quot;zoomLevel&quot;:null,&quot;zoom&quot;:true,&quot;isPagination&quot;:false,&quot;isNavigation&quot;:false,&quot;hotspotStyle&quot;:&quot;style-1&quot;,&quot;preload&quot;:&quot;auto&quot;,&quot;rotationPerSecond&quot;:&quot;30&quot;,&quot;mouseControl&quot;:true,&quot;lockXAxisRotation&quot;:false,&quot;lockYAxisRotation&quot;:false,&quot;fullscreen&quot;:true,&quot;zoomInOutBtn&quot;:false,&quot;cameraBtn&quot;:false,&quot;variant&quot;:false,&quot;loadingPercentage&quot;:false,&quot;progressBar&quot;:true,&quot;rotate&quot;:false,&quot;rotateDelay&quot;:3000,&quot;rotateAlongX&quot;:&quot;0&quot;,&quot;rotateAlongY&quot;:&quot;75&quot;,&quot;exposure&quot;:&quot;1&quot;,&quot;stylesheet&quot;:null,&quot;additional&quot;:{&quot;ID&quot;:&quot;&quot;,&quot;Class&quot;:&quot;&quot;,&quot;CSS&quot;:null},&quot;animation&quot;:false,&quot;woo&quot;:false,&quot;selectedAnimation&quot;:&quot;&quot;,&quot;placement&quot;:&quot;shortcode&quot;,&quot;styles&quot;:{&quot;width&quot;:&quot;100%&quot;,&quot;height&quot;:&quot;320px&quot;,&quot;bgColor&quot;:&quot;transparent&quot;,&quot;progressBarColor&quot;:null},&quot;model&quot;:{&quot;modelUrl&quot;:&quot;https:\\\/\\\/siddharthv.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/omni_1_5mm_hole.stl&quot;,&quot;poster&quot;:&quot;&quot;},&quot;models&quot;:[]}'>\n            <div class=\"bp3d_backup_view\" style=\"display: none;height:350px;\">\n                    <model-viewer camera-controls src=\"https:\/\/siddharthv.com\/wp-content\/uploads\/2024\/09\/omni_1_5mm_hole.stl\" style=\"height: 350px;\"><\/model-viewer>\n            <\/div>\n            <script data-jetpack-boost=\"ignore\">\n                setTimeout(() => {\n                    let backupModels = document.querySelectorAll('.bp3d_backup_view');\n                    if(backupModels.length > 0){\n                        backupModels.forEach(element => {\n                            if(element){\n                                element.style.display = 'block';\n                                setTimeout(() => {\n                                    let adminMessages = document.querySelectorAll('.bp3d_admin_message');\n                                    if(adminMessages.length > 0){\n                                        adminMessages.forEach(adminMessage => {\n                                            if(adminMessage){\n                                                adminMessage.style.display = 'block';\n                                            }\n                                        });\n                                    }\n                                }, 5000);\n                            }\n                        });\n                    }\n                }, 5000);\n            <\/script>\n        <\/div>\n\n<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To start, let&#8217;s go ahead and add a File Solid block. Then, load the wheel hub STL file we downloaded earlier. Finally, call it <strong><em>Wheel_hub<\/em><\/strong>. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"383\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?resize=660%2C383&#038;ssl=1\" alt=\"\" class=\"wp-image-407\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?resize=1024%2C595&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?resize=300%2C174&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?resize=768%2C446&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?resize=1200%2C697&amp;ssl=1 1200w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-6.png?w=1219&amp;ssl=1 1219w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.8: Wheel_hub STL loaded as a File Solid block<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Let us start with one passive wheel and connect it to the hub with an appropriate transform. Once we have fine-tuned this connection, we can replicate it for the rest of the passive wheels. This is how the connection looks like:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"337\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-12.png?resize=660%2C337&#038;ssl=1\" alt=\"\" class=\"wp-image-421\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-12.png?w=1000&amp;ssl=1 1000w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-12.png?resize=300%2C153&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-12.png?resize=768%2C392&amp;ssl=1 768w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 2.9: Connect the passive wheel to the hub using a rigid-body transform<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The two transform blocks orient the passive wheel and hub with respect to each other and the reference frame. Here are the properties of each of the transform blocks:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"492\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-13.png?resize=660%2C492&#038;ssl=1\" alt=\"\" class=\"wp-image-423\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-13.png?w=697&amp;ssl=1 697w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-13.png?resize=300%2C224&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-13.png?resize=200%2C150&amp;ssl=1 200w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.0: Transform from the reference frame to the hub<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The transform from the reference frame to the hub rotates the hub along the +Z-axis. This is done to align one of the ports to align horizontally. We will position the passive wheel to fit inside this port.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"501\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-14.png?resize=660%2C501&#038;ssl=1\" alt=\"\" class=\"wp-image-425\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-14.png?w=730&amp;ssl=1 730w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-14.png?resize=300%2C228&amp;ssl=1 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.1: Transform from the reference frame to the passive wheel<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The transform from the reference frame to the passive wheel translates the wheel to its actual position. This translation ensures the passive wheel fits exactly inside the horizontally aligned port on the hub. This is how the assembly should look at this point:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"637\" height=\"678\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-16.png?resize=637%2C678&#038;ssl=1\" alt=\"\" class=\"wp-image-429\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-16.png?w=637&amp;ssl=1 637w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-16.png?resize=282%2C300&amp;ssl=1 282w\" sizes=\"auto, (max-width: 637px) 100vw, 637px\" \/><figcaption class=\"wp-element-caption\">Fig 3.2: Passive wheel is aligned with one of the horizontal ports on the hub so that its axis of rotation aligns with the shaft holes provided on the port.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The transform also aligns the +Z-axis for the passive wheel to the +X-axis of the hub. Similarly it aligns the +Y-axis of the passive wheel to the -Y-axis of the hub. This ensures that the passive wheel rotates freely inside the port it is aligned with in the correct direction.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"440\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-15.png?resize=660%2C440&#038;ssl=1\" alt=\"\" class=\"wp-image-427\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-15.png?resize=1024%2C682&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-15.png?resize=300%2C200&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-15.png?resize=768%2C512&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-15.png?w=1057&amp;ssl=1 1057w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.3: Each passive wheel must have its axis of rotation aligned to the port in the hub.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, we can test the motion of this passive wheel and confirm its rotation. To do that, we must temporarily set the actuation property on the <strong><em>AxleToWheel_Joint<\/em><\/strong> to accept torque as an input. This adds an extra input port to the joint block called T. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"386\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-18.png?resize=660%2C386&#038;ssl=1\" alt=\"\" class=\"wp-image-433\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-18.png?resize=1024%2C599&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-18.png?resize=300%2C175&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-18.png?resize=768%2C449&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-18.png?w=1067&amp;ssl=1 1067w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.4: Setting the torque property under actuation settings creates a new input port on the joint block<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, we can apply a constant torque to this joint and run the simulation. If everything is setup correct, we should see the passive wheel spin inside the hub port. To apply a constant value to this torque input port, we need to temporarily add a PS Constant block. This is how the connection should look like:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"283\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-19.png?resize=660%2C283&#038;ssl=1\" alt=\"\" class=\"wp-image-434\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-19.png?w=730&amp;ssl=1 730w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-19.png?resize=300%2C129&amp;ssl=1 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.5: Connect a PS Constant to the torque input port to provide constant torque<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, we can run the simulation and we should see this:<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter wp-block-embed is-type-video is-provider-videopress\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"VideoPress Video Player\" aria-label='VideoPress Video Player' width='660' height='428' src='https:\/\/videopress.com\/embed\/T0GhHRJ5?cover=1&amp;preloadContent=metadata&amp;useAverageColor=1&amp;hd=0' frameborder='0' allowfullscreen data-resize-to-parent=\"true\" allow='clipboard-write'><\/iframe><script src='https:\/\/v0.wordpress.com\/js\/next\/videopress-iframe.js?m=1725245713'><\/script>\n<\/div><figcaption>Fig 3.6: Spinning motion of the passive wheel aligned with one of the hub ports.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Phew! Now that is some serious modeling work we just accomplished here. It is easy to see that the wheel on the opposite side has the same orientation. It is translated in the opposite direction. So, we can duplicate the blocks for the first wheel and just change its <strong><em>RefToWheelTransform<\/em><\/strong> block. We can now treat these two wheels as a pair. It is easy to see that the other two pairs are just rotated versions of this pair. By duplicating the pair and rotating it by 60 and 120 degrees, we can create the remaining wheels. By duplicating the wheels from the original one, we get the same axis alignment on all of them. This is how the final setup should look like:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"640\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-20.png?resize=660%2C640&#038;ssl=1\" alt=\"\" class=\"wp-image-439\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-20.png?w=1004&amp;ssl=1 1004w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-20.png?resize=300%2C291&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-20.png?resize=768%2C744&amp;ssl=1 768w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.7: All six passive wheels in position on the hub. Each pair is rotated by 60 degrees around the center<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, we have the wheel sub-assembly ready to go.  This is how it should look like at this point:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"647\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/passivewheelassembly.png?resize=660%2C647&#038;ssl=1\" alt=\"\" class=\"wp-image-441\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/passivewheelassembly.png?w=899&amp;ssl=1 899w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/passivewheelassembly.png?resize=300%2C294&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/passivewheelassembly.png?resize=768%2C753&amp;ssl=1 768w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 3.8: Completed Wheel sub-assembly<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, that we have the finished wheel sub-assembly, lets convert it into a reusable subsystem.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"240\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-23.png?resize=300%2C240&#038;ssl=1\" alt=\"\" class=\"wp-image-456\"\/><figcaption class=\"wp-element-caption\">Fig 3.9: Reusable subsystem for the wheel sub-assembly<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"finishing\">Finishing the wheel<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the introduction, we spoke about why we need two wheel sub-assemblies joined together. Now, lets get down to building the whole wheel with the sub-assembly we already created.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"322\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?resize=660%2C322&#038;ssl=1\" alt=\"\" class=\"wp-image-458\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?resize=1024%2C499&amp;ssl=1 1024w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?resize=300%2C146&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?resize=768%2C374&amp;ssl=1 768w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?resize=1200%2C585&amp;ssl=1 1200w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-24.png?w=1355&amp;ssl=1 1355w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 4.0: The final wheel assembly needs just two more joints<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">To finish the assembly, we start with joining two copies of the wheel sub-assembly with a Fixed or Weld joint. We apply a rotation transform to one of the sub-assemblies to rotate it by 30 degrees. The wheel is now finished structurally. We still need to add a way to rotate these wheels by applying external torque. We do this by adding a revolute joint and connecting it to the joined assembly. We enable the torque input in the actuation section and export the angular velocity in the sensing section. This allows us to connect a motor torque to the wheel, and sense its rotation.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"509\" src=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-22.png?resize=660%2C509&#038;ssl=1\" alt=\"\" class=\"wp-image-446\" srcset=\"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-22.png?w=951&amp;ssl=1 951w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-22.png?resize=300%2C231&amp;ssl=1 300w, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/09\/image-22.png?resize=768%2C592&amp;ssl=1 768w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">Fig 4.1: Revolute joint with torque actuation and angular velocity sensing as a means to control and measure wheel rotation<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">And with this, the entire omni-directional wheel is now ready. We have not spoken about the blocks with dotted lines in the model at all. This is by design. We will talk about the convex hull and geometry connections when we get to the step where we want to simulate the motion of the entire robot on a ground plane. But, for now, sit back and sip on some coffee. You have earned it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the library model containing the finished wheel models in the GitHub repository link below.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/artineering\/omni-directional-robot\">https:\/\/github.com\/artineering\/omni-directional-robot<\/a><\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Getting Started with Simscape<\/summary>\n<p class=\"wp-block-paragraph\">There is very good documentation with examples to learn the basics of Multibody modeling with Simscape provided here: <a href=\"https:\/\/www.mathworks.com\/help\/sm\/index.html?s_tid=CRUX_lftnav\">https:\/\/www.mathworks.com\/help\/sm\/index.html?s_tid=CRUX_lftnav<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>3D Models<\/summary>\n<p class=\"wp-block-paragraph\">You can download the models from here: <a href=\"https:\/\/cults3d.com\/en\/3d-model\/gadget\/omni-wheels-for-robotics\">https:\/\/cults3d.com\/en\/3d-model\/gadget\/omni-wheels-for-robotics<\/a>.<\/p>\n<\/details>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The post details the process of creating a virtual model of an omni-directional robot wheel using Simscape&#8217;s Multibody modeling tools. It outlines steps such as breaking down the assembly hierarchy, creating components like passive wheels and wheel hubs, and connecting them with joints to enable motion. The final model serves as a digital twin for physical robots.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false},"categories":[41,38],"tags":[43,42,44],"class_list":["post-360","post","type-post","status-publish","format-standard","hentry","category-modeling","category-robotics","tag-modeling","tag-robotics","tag-simscape"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pfZkYk-5O","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":331,"url":"https:\/\/siddharthv.com\/?p=331","url_meta":{"origin":360,"position":0},"title":"Modeling an Omni-Directional Robot in Simscape: Part 1","author":"siddharth.vaghela","date":"April 15, 2024","format":false,"excerpt":"Introduction Every robot navigates with different levels of control and agility. If a mobile robot\u2019s level of control matches its total possible degrees of freedom, its movement is described as holonomic[1]. When the level of control is less than its available degrees of freedom, its movement is described as non-holonomic.\u2026","rel":"","context":"In &quot;Modeling&quot;","block_context":{"text":"Modeling","link":"https:\/\/siddharthv.com\/?cat=41"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/car_degrees-1024x1024.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/car_degrees-1024x1024.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/car_degrees-1024x1024.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2024\/04\/car_degrees-1024x1024.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":103,"url":"https:\/\/siddharthv.com\/?p=103","url_meta":{"origin":360,"position":1},"title":"3D Scanning with Raspberry Pi and MATLAB","author":"siddharth.vaghela","date":"April 19, 2016","format":false,"excerpt":"Raspberry Pi opens a lot of possibilities for do-it-yourself projects. It\u2019s affordable and full of potential for implementing challenging projects. After having spent several years tinkering around my 3D printer, wanting to build my own 3D scanner to complete the 3D workflow was an exciting idea. Using MATLAB and the\u2026","rel":"","context":"In &quot;MATLAB&quot;","block_context":{"text":"MATLAB","link":"https:\/\/siddharthv.com\/?cat=6"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2016\/06\/stormtrooper_pointcloud.png?fit=742%2C750&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2016\/06\/stormtrooper_pointcloud.png?fit=742%2C750&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2016\/06\/stormtrooper_pointcloud.png?fit=742%2C750&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/siddharthv.com\/wp-content\/uploads\/2016\/06\/stormtrooper_pointcloud.png?fit=742%2C750&ssl=1&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/posts\/360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/siddharthv.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=360"}],"version-history":[{"count":5,"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/posts\/360\/revisions"}],"predecessor-version":[{"id":471,"href":"https:\/\/siddharthv.com\/index.php?rest_route=\/wp\/v2\/posts\/360\/revisions\/471"}],"wp:attachment":[{"href":"https:\/\/siddharthv.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/siddharthv.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/siddharthv.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}