Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.
This page is a placeholder. Its content will be published in December 2026.
A robot’s environment often restricts its motion. A hand grasping a door handle must move with the door, while a pen tip must remain on the paper. You can express these restrictions as Pfaffian velocity constraints A(θ)θ˙=0. Assuming that the constraints do no work, you will add the constraint forces A⊤(θ)λ to the equations of motion. You will then solve for the motion and constraint forces together. The treatment follows section 8.7 of Lynch and Park (book page 299) (Kevin M. Lynch, 2017) and builds on forward dynamics.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"aegean.ai","description":"Engineering AI Agents - Comprehensive courses on deep learning, computer vision, robotics, and AI systems","colors":{"primary":"#2196C8","light":"#5CADD8","dark":"#1565B0"},"logo":{"light":"https://mintcdn.com/aegeanaiinc/ai8d4zdsUnwq_5J6/logo.png?fit=max\u0026auto=format\u0026n=ai8d4zdsUnwq_5J6\u0026q=85\u0026s=fe5e281c1569f8468ff85157bd7d9dc3","dark":"https://mintcdn.com/aegeanaiinc/ai8d4zdsUnwq_5J6/logo-dark.png?fit=max\u0026auto=format\u0026n=ai8d4zdsUnwq_5J6\u0026q=85\u0026s=6a455ae676293280c72ec43f2ac544b4","href":"/"},"favicon":"https://mintcdn.com/aegeanaiinc/0dr6ajwzGFHGACv0/favicon.png?fit=max\u0026auto=format\u0026n=0dr6ajwzGFHGACv0\u0026q=85\u0026s=c0348644679947ce971abb8037adb632","appearance":{"default":"system","strict":false},"navbar":{"links":[{"href":"https://github.com/aegean-ai","label":"GitHub"},{"href":"https://www.linkedin.com/company/aegean-ai/","label":"LinkedIn"}]},"footer":{"socials":{"github":"https://github.com/aegean-ai","linkedin":"https://www.linkedin.com/company/aegean-ai","x":"https://x.com/aegeanai"},"links":[{"header":"Products","items":[{"label":"Auraison","href":"https://n8n.aegeanai.com"}]},{"header":"Courses","items":[{"label":"AI Foundations","href":"/courses/ai/index"},{"label":"Computer Vision","href":"/courses/cv/index"},{"label":"Robotics","href":"/courses/robotics/index"}]},{"header":"Resources","items":[{"label":"Use These Docs","href":"/use-these-docs"},{"label":"GitHub","href":"https://github.com/aegean-ai"},{"label":"Blog","href":"/blog"},{"label":"RSS Feed","href":"/rss.xml"}]},{"header":"Company","items":[{"label":"About","href":"/about"},{"label":"Careers","href":"/careers/virtual-internships/index"},{"label":"Contact","href":"https://forms.gle/W3z4NTC883mNY5Kr8"},{"label":"Privacy Policy","href":"/privacy"}]}]},"styling":{"eyebrows":"section","latex":true},"integrations":{"ga4":{"measurementId":"G-EHRC22H65X"},"posthog":{"apiKey":"phc_J5w6esvspb1vh8O3MegWoaUYiq1zzWYuv7GTfjgui6F","sessionRecording":true}},"contextual":{"options":["claude","perplexity","mcp","cursor","vscode",{"title":"Report an issue","description":"Tell us about an error on this page","icon":"bug","href":{"base":"https://github.com/aegean-ai/eaia-feedback/issues/new","query":[{"key":"template","value":"page-issue.yml"},{"key":"page","value":"$path"}]}}],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"aegeanaiinc","hasAudioNarration":false,"actualSubdomain":"aegeanaiinc","customDomains":["aegean.ai"],"gitSource":{"type":"github","owner":"aegean-ai","repo":"eaia","deployBranch":"prod","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae46dc1d9167d81040e3d16","collectionId":"b2515e43-3b60-48cb-866b-a61907f6fe53","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae46dc1d9167d81040e3d16"},"feedback":{"agentFeedback":true},"entitlements":{},"buildId":"6ae46dc1d9167d81040e3d16","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Book","count":266},{"language":"default","tag":"Courses","count":59},{"language":"default","tag":"Perception","count":55},{"language":"default","tag":"Products","count":51},{"language":"default","tag":"Applications","count":39},{"language":"default","tag":"Robotics Systems","count":29},{"language":"default","tag":"Manufacturing QC","count":27},{"language":"default","tag":"LLM","count":24},{"language":"default","tag":"Foundations","count":22},{"language":"default","tag":"Physical AI","count":21}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"[class*=Header],[class*=Navbar],[class*=header],[class*=navbar],header,nav{padding-top:1.5rem!important;padding-bottom:1.5rem!important}[class*=Brand] img,[class*=Logo] img,[class*=brand] img,[class*=logo] img,a[href=\"/\"] img:first-child,a[href=\"/\"]>img,header img[alt*=logo i],header img[src*=logo i],nav img[alt*=logo i],nav img[src*=logo i]{height:40px!important;max-height:40px!important;width:auto!important}#navbar #sidebar-title,[class*=SiteName],[class*=site-name],[class*=siteName],a[href=\"/\"]>span,header #sidebar-title,header [class*=Logo] span,header [class*=brand] span,header [class*=logo] span,nav [class*=Logo] span,nav [class*=logo] span{font-size:1.35rem!important;font-weight:600!important}a code,a[href] code{color:inherit!important;text-decoration:none!important;padding:0!important}.callout a,.callout b,.callout em,.callout i,.callout p,.callout strong,[class*=callout] a,[class*=callout] b,[class*=callout] em,[class*=callout] i,[class*=callout] p,[class*=callout] strong{font-size:inherit!important;color:inherit!important}.callout li,.callout ol,.callout ul,[class*=callout] li,[class*=callout] ol,[class*=callout] ul{font-size:inherit!important;color:inherit!important;line-height:inherit!important}.mermaid{text-align:center;display:flex;justify-content:center}.mermaid .labelBkg{background-color:#fff!important;border:1px solid #2f6868!important;border-radius:4px!important;padding:0 4px!important}.mermaid .labelBkg:not(:has(p)){display:none!important}.mermaid .edgeLabel{color:#1c3c3c!important}.dark .mermaid .labelBkg{background-color:#1c3c3c!important;border-color:#84c4c0!important}.dark .mermaid .edgeLabel{color:#84c4c0!important}.mermaid .node circle,.mermaid .node polygon,.mermaid .node rect{fill:none!important;stroke:#9ca3af!important;stroke-width:2px!important;rx:12px;ry:12px;transition:stroke .2s ease,filter .2s ease,stroke-width .2s ease}.mermaid .node .nodeLabel,.mermaid .node .nodeLabel p{font-family:inherit!important}.mermaid .node .nodeLabel p{color:#fff!important}.mermaid .node:hover circle,.mermaid .node:hover polygon,.mermaid .node:hover rect,.mermaid a:hover .node circle,.mermaid a:hover .node polygon,.mermaid a:hover .node rect{stroke:#2196c8!important;stroke-width:3px!important;filter:drop-shadow(0 0 8px rgba(33,150,200,.5));cursor:pointer}.mermaid .cluster rect{rx:12px!important;ry:12px!important}.content table td,.content table th,.markdown table td,.markdown table th,.prose table td,.prose table th,[class*=prose] table td,[class*=prose] table th,article table td,article table th{vertical-align:middle!important;line-height:1.5!important}#pagination{display:none}#banner a{color:inherit!important;text-decoration:none!important}.compact-first-col [data-table-wrapper]{overflow-x:visible!important}.compact-first-col table{table-layout:auto!important;width:100%!important}.compact-first-col table td,.compact-first-col table th{min-width:0!important}.compact-first-col table td:first-child,.compact-first-col table th:first-child{width:1%!important;white-space:nowrap!important}.home-page~:is(.callout, [data-callout-type]){display:none!important}#sidebar .sidebar-group-header,#sidebar button[class*=group],#sidebar-content .sidebar-group-header,#sidebar-content button,.sidebar-group-header,[class*=SidebarGroupHeader],[class*=sidebar-group-header],[class^=sidebar_group]>button,[class^=sidebar_group]>div:first-child,aside button{font-size:14px!important;font-weight:400!important;letter-spacing:normal!important;line-height:1.4!important;padding-top:.5rem!important;padding-bottom:.25rem!important;margin:0!important;text-transform:none!important}.sidebar-group:first-child .sidebar-group-header{padding-top:0!important}.sidebar-nav-group-divider{display:none!important}.sidebar-group{margin:0!important;padding:0!important}#sidebar-content{gap:0!important}#sidebar svg,.sidebar-group svg{width:18px!important;height:18px!important;min-width:18px!important;min-height:18px!important}.sidebar-group-header svg,.sidebar-group-icon svg{width:20px!important;height:20px!important;min-width:20px!important;min-height:20px!important}.dark .prose img,.dark [class*=Frame] img,.dark article img,.dark figure img{background-color:#f8f9fa!important;border-radius:8px!important;padding:12px!important}.dark .prose img.no-dark-bg,.dark article img.no-dark-bg,.dark img.no-dark-bg{background-color:transparent!important;border-radius:0!important;padding:0!important}.preview-card{display:flex;flex-direction:column;background:rgba(255,255,255,.03);border-radius:16px;overflow:hidden;transition:background .2s ease,box-shadow .2s ease;text-decoration:none!important;color:inherit!important}.preview-card:hover{background:rgba(255,255,255,.06);box-shadow:0 4px 20px rgba(0,0,0,.3)}.preview-card iframe{width:100%;border:0;border-radius:8px 8px 0 0;display:block}.preview-card-caption{padding:14px 18px 16px}.preview-card-caption h3{font-size:17px!important;font-weight:600!important;margin:0 0 6px!important;line-height:1.4!important}.preview-card-caption p{font-size:13px!important;opacity:.6;margin:0!important;line-height:1.5!important}.preview-card-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.preview-card-tag{background:rgba(255,255,255,.05);border:0;border-radius:16px;padding:2px 10px;font-size:11px;cursor:default}.preview-card{border:1px solid rgba(0,0,0,.08)}.dark .preview-card{border:1px solid rgba(255,255,255,.06)}.dark .preview-card img{background-color:transparent!important;padding:0!important}.preview-card-tag{color:rgba(0,0,0,.4);background:rgba(0,0,0,.05)}.dark .preview-card-tag{color:rgba(255,255,255,.5);background:rgba(255,255,255,.05)}.katex,.katex *{line-height:normal}.katex .delimsizing.size1{font-size:1em}.katex .delimsizing.size2{font-size:1.2em}.katex .delimsizing.size3{font-size:1.8em}.katex .delimsizing.size4{font-size:2.4em}.katex-display>.katex{overflow-y:hidden}.page-authors{display:flex;flex-wrap:wrap;gap:2px 18px;margin:-4px 0 28px;font-size:14px;line-height:1.5;opacity:.6}.page-author-affiliation::before{content:\" · \"}"}],"page":{"pagePath":"aiml-common/lectures/dynamics/constrained-dynamics/index","slug":"/aiml-common/lectures/dynamics/constrained-dynamics/index","pageMetadata":{"title":"Dynamics under constraints","sidebarTitle":"Constrained dynamics","description":"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/constrained-dynamics/index"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,annotation:`annotation`,em:`em`,hr:`hr`,li:`li`,math:`math`,mi:`mi`,mn:`mn`,mo:`mo`,mover:`mover`,mrow:`mrow`,msup:`msup`,p:`p`,semantics:`semantics`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{Callout,Heading,Note}=_components;if(!Callout)_missingMdxReference(`Callout`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsx(_components.p,{children:`This page is a placeholder. Its content will be published in December 2026.`})}),`\n`,_jsxs(_components.p,{children:[`A robot’s environment often restricts its motion. A hand grasping a door handle must move with the door, while a pen tip must remain on the paper. You can express these restrictions as Pfaffian velocity constraints `,_jsxs(_components.span,{className:`katex`,children:[_jsx(_components.span,{className:`katex-mathml`,children:_jsx(_components.math,{xmlns:`http://www.w3.org/1998/Math/MathML`,children:_jsxs(_components.semantics,{children:[_jsxs(_components.mrow,{children:[_jsx(_components.mi,{children:`A`}),_jsx(_components.mo,{stretchy:`false`,children:`(`}),_jsx(_components.mi,{children:`θ`}),_jsx(_components.mo,{stretchy:`false`,children:`)`}),_jsxs(_components.mover,{accent:`true`,children:[_jsx(_components.mi,{children:`θ`}),_jsx(_components.mo,{children:`˙`})]}),_jsx(_components.mo,{children:`=`}),_jsx(_components.mn,{children:`0`})]}),_jsx(_components.annotation,{encoding:`application/x-tex`,children:`A(\\\\theta)\\\\dot\\\\theta = 0`})]})})}),_jsxs(_components.span,{className:`katex-html`,\"aria-hidden\":`true`,children:[_jsxs(_components.span,{className:`base`,children:[_jsx(_components.span,{className:`strut`,style:{height:`1.1813em`,verticalAlign:`-0.25em`}}),_jsx(_components.span,{className:`mord mathnormal`,children:`A`}),_jsx(_components.span,{className:`mopen`,children:`(`}),_jsx(_components.span,{className:`mord mathnormal`,style:{marginRight:`0.0278em`},children:`θ`}),_jsx(_components.span,{className:`mclose`,children:`)`}),_jsx(_components.span,{className:`mord accent`,children:_jsx(_components.span,{className:`vlist-t`,children:_jsx(_components.span,{className:`vlist-r`,children:_jsxs(_components.span,{className:`vlist`,style:{height:`0.9313em`},children:[_jsxs(_components.span,{style:{top:`-3em`},children:[_jsx(_components.span,{className:`pstrut`,style:{height:`3em`}}),_jsx(_components.span,{className:`mord mathnormal`,style:{marginRight:`0.0278em`},children:`θ`})]}),_jsxs(_components.span,{style:{top:`-3.2634em`},children:[_jsx(_components.span,{className:`pstrut`,style:{height:`3em`}}),_jsx(_components.span,{className:`accent-body`,style:{left:`-0.0556em`},children:_jsx(_components.span,{className:`mord`,children:`˙`})})]})]})})})}),_jsx(_components.span,{className:`mspace`,style:{marginRight:`0.2778em`}}),_jsx(_components.span,{className:`mrel`,children:`=`}),_jsx(_components.span,{className:`mspace`,style:{marginRight:`0.2778em`}})]}),_jsxs(_components.span,{className:`base`,children:[_jsx(_components.span,{className:`strut`,style:{height:`0.6444em`}}),_jsx(_components.span,{className:`mord`,children:`0`})]})]})]}),`. Assuming that the constraints do no work, you will add the constraint forces `,_jsxs(_components.span,{className:`katex`,children:[_jsx(_components.span,{className:`katex-mathml`,children:_jsx(_components.math,{xmlns:`http://www.w3.org/1998/Math/MathML`,children:_jsxs(_components.semantics,{children:[_jsxs(_components.mrow,{children:[_jsxs(_components.msup,{children:[_jsx(_components.mi,{children:`A`}),_jsx(_components.mi,{mathvariant:`normal`,children:`⊤`})]}),_jsx(_components.mo,{stretchy:`false`,children:`(`}),_jsx(_components.mi,{children:`θ`}),_jsx(_components.mo,{stretchy:`false`,children:`)`}),_jsx(_components.mi,{children:`λ`})]}),_jsx(_components.annotation,{encoding:`application/x-tex`,children:`A^\\\\top(\\\\theta)\\\\lambda`})]})})}),_jsx(_components.span,{className:`katex-html`,\"aria-hidden\":`true`,children:_jsxs(_components.span,{className:`base`,children:[_jsx(_components.span,{className:`strut`,style:{height:`1.0991em`,verticalAlign:`-0.25em`}}),_jsxs(_components.span,{className:`mord`,children:[_jsx(_components.span,{className:`mord mathnormal`,children:`A`}),_jsx(_components.span,{className:`msupsub`,children:_jsx(_components.span,{className:`vlist-t`,children:_jsx(_components.span,{className:`vlist-r`,children:_jsx(_components.span,{className:`vlist`,style:{height:`0.8491em`},children:_jsxs(_components.span,{style:{top:`-3.063em`,marginRight:`0.05em`},children:[_jsx(_components.span,{className:`pstrut`,style:{height:`2.7em`}}),_jsx(_components.span,{className:`sizing reset-size6 size3 mtight`,children:_jsx(_components.span,{className:`mord mtight`,children:`⊤`})})]})})})})})]}),_jsx(_components.span,{className:`mopen`,children:`(`}),_jsx(_components.span,{className:`mord mathnormal`,style:{marginRight:`0.0278em`},children:`θ`}),_jsx(_components.span,{className:`mclose`,children:`)`}),_jsx(_components.span,{className:`mord mathnormal`,children:`λ`})]})})]}),` to the equations of motion. You will then solve for the motion and constraint forces together. The treatment follows section 8.7 of Lynch and Park (book page 299) (Kevin M. Lynch, 2017) and builds on `,_jsx(_components.a,{href:`/aiml-common/lectures/dynamics/forward-dynamics/index`,children:`forward dynamics`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`references`,children:`References`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Kevin M. Lynch, F. (2017). `,_jsx(_components.em,{children:`Modern Robotics`}),`.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Callout,{icon:`bug`,iconType:`regular`,children:_jsxs(_components.p,{children:[`Found an error on this page? `,_jsx(_components.a,{href:`https://github.com/aegean-ai/eaia-feedback/issues/new?template=page-issue.yml\u0026page=/aiml-common/lectures/dynamics/constrained-dynamics`,children:`Report an issue`}),`.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Dynamics under constraints","sidebarTitle":"Constrained dynamics","description":"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/constrained-dynamics/index"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"References","slug":"references","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/aegeanaiinc/d160583580826147/aiml-common/lectures/planning/task-planning/pddl/blocksworld/blocksWorldViz.js","/_mintlify/custom/aegeanaiinc/0663393b76c10385/osano.js"],"subdomain":"aegeanaiinc","siteName":"aegean.ai","title":"Dynamics under constraints - aegean.ai","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T19:43:57.470Z","originalFileLocation":"aiml-common/lectures/dynamics/constrained-dynamics/index.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\">\u003cmeta data-mint-head name=\"application-name\" content=\"aegean.ai\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Dynamics under constraints - aegean.ai\">\u003cmeta data-mint-head property=\"og:description\" content=\"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"aegean.ai\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://aegeanaiinc.mintlify.app/_mintlify/api/og/v2?division=Dynamics\u0026amp;title=Dynamics+under+constraints\u0026amp;description=Equations+of+motion+for+a+robot+subject+to+Pfaffian+velocity+constraints%2C+such+as+a+hand+holding+a+door+handle.\u0026amp;theme=fe60a9d9d85e19ab420a9d7e\u0026amp;signature=147250f27e78bac61873ff80a8b6dd794408e29102aaef1694c9a76da106f131\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Dynamics under constraints - aegean.ai\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://aegeanaiinc.mintlify.app/_mintlify/api/og/v2?division=Dynamics\u0026amp;title=Dynamics+under+constraints\u0026amp;description=Equations+of+motion+for+a+robot+subject+to+Pfaffian+velocity+constraints%2C+such+as+a+hand+holding+a+door+handle.\u0026amp;theme=fe60a9d9d85e19ab420a9d7e\u0026amp;signature=147250f27e78bac61873ff80a8b6dd794408e29102aaef1694c9a76da106f131\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/aegeanaiinc/6M9Gi5GgxBzndhcq/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"aegean.ai\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2196C8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/aiml-common/lectures/dynamics/constrained-dynamics/index.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://aegean.ai/#organization\",\"name\":\"aegean.ai\",\"url\":\"https://aegean.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/aegeanaiinc/ai8d4zdsUnwq_5J6/logo.png?fit=max\u0026auto=format\u0026n=ai8d4zdsUnwq_5J6\u0026q=85\u0026s=fe5e281c1569f8468ff85157bd7d9dc3\"}},{\"@type\":\"WebSite\",\"@id\":\"https://aegean.ai#website\",\"name\":\"aegean.ai\",\"url\":\"https://aegean.ai\",\"publisher\":{\"@id\":\"https://aegean.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics#webpage\",\"url\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics\",\"name\":\"Dynamics under constraints\",\"description\":\"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\",\"dateModified\":\"2026-10-19T19:43:57.470Z\",\"isPartOf\":{\"@id\":\"https://aegean.ai#website\"},\"breadcrumb\":{\"@id\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Dynamics\",\"item\":\"https://aegean.ai/book/dynamics/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamics under constraints\",\"item\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics#article\",\"headline\":\"Dynamics under constraints\",\"name\":\"Dynamics under constraints\",\"description\":\"Equations of motion for a robot subject to Pfaffian velocity constraints, such as a hand holding a door handle.\",\"url\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics\",\"mainEntityOfPage\":{\"@id\":\"https://aegean.ai/aiml-common/lectures/dynamics/constrained-dynamics#webpage\"},\"dateModified\":\"2026-10-19T19:43:57.470Z\",\"publisher\":{\"@id\":\"https://aegean.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://aegean.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"aegean.ai\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"aegean.ai","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Products","icon":"box","menu":[{"item":"Overview","icon":"box","pages":[{"title":"Overview","href":"/products"}]},{"item":"Platforms","icon":"server","pages":[{"title":"Platforms","href":"/products/platforms"}]},{"item":"Applications","icon":"grid-2","pages":[{"title":"Applications","href":"/products/applications"}]},{"item":"Tech Demonstrations","icon":"flask","pages":[{"title":"Tech Demonstrations","href":"/products/tech-demonstrators"}]}],"pages":[{"title":"Products","href":"/products"}]},{"tab":"Book","icon":"book","menu":[{"item":"Introduction","pages":[{"title":"Introduction","href":"/book/introduction"}]},{"item":"Foundations","pages":[{"title":"Foundations","href":"/book/foundations"}]},{"item":"Neural Networks","pages":[{"title":"Neural Networks","href":"/book/training-dnns"}]},{"item":"Perception","icon":"eye","pages":[{"title":"Perception","href":"/book/perception"}]},{"item":"State Estimation \u0026 Mapping","icon":"compass","pages":[{"title":"State Estimation \u0026 Mapping","href":"/book/state-estimation-mapping"}]},{"item":"LLM","icon":"omega","pages":[{"title":"LLM","href":"/book/llms"}]},{"item":"VLM","icon":"image","pages":[{"title":"VLM","href":"/aiml-common/lectures/vlm"}]},{"item":"ALM","icon":"microphone","pages":[{"title":"ALM","href":"/aiml-common/lectures/speech/text-to-speech-and-voice-cloning"}]},{"item":"Logic","icon":"sitemap","pages":[{"title":"Logic","href":"/book/logic"}]},{"item":"Planning","icon":"route","pages":[{"title":"Planning","href":"/book/task-planning"}]},{"item":"MDPs","icon":"arrows-rotate","pages":[{"title":"MDPs","href":"/book/mdps"}]},{"item":"RL","icon":"arrows-rotate","pages":[{"title":"RL","href":"/book/reinforcement-learning"}]},{"item":"Reasoning","icon":"brain","pages":[{"title":"Reasoning","href":"/aiml-common/lectures/reasoning"}]},{"item":"Latent Transport Models","icon":"wand-magic-sparkles","pages":[{"title":"Latent Transport Models","href":"/book/latent-transport-models"}]},{"item":"Robotics Systems","icon":"robot","groups":[{"group":"Robotics Systems","icon":"robot","pages":[{"title":"How robots move","sidebarTitle":"Overview","href":"/book/robotics-systems"}]},{"group":"Motion Algebras","icon":"shapes","pages":[{"title":"Representing rigid motion","sidebarTitle":"Overview","href":"/book/motion-algebras/index"},{"title":"Configuration space and its topology","sidebarTitle":"Configuration space","href":"/aiml-common/lectures/motion-algebras/configuration-space/index"},{"title":"Lie groups and tangent spaces","sidebarTitle":"Lie I: groups","href":"/aiml-common/lectures/motion-algebras/lie-theory/index"},{"title":"Rotation representations","sidebarTitle":"Rotation representations","href":"/aiml-common/lectures/motion-algebras/rotation-representations/index"},{"title":"Angular velocity","sidebarTitle":"Angular velocity","href":"/aiml-common/lectures/motion-algebras/angular-velocity/index"},{"title":"Exponential coordinates of a rotation","sidebarTitle":"Exponential coordinates","href":"/aiml-common/lectures/motion-algebras/exponential-coordinates/index"},{"title":"The rotation group SO(2) as a circle","sidebarTitle":"SO(2) as a manifold","href":"/aiml-common/lectures/motion-algebras/so2-manifold/index"},{"title":"Motion representations","sidebarTitle":"Motion representations","href":"/aiml-common/lectures/motion-algebras/motion-representations/index"},{"title":"Homogeneous Coordinates","sidebarTitle":"Homogeneous Coordinates","href":"/aiml-common/lectures/motion-algebras/homogeneous-coordinates/index"},{"title":"Quaternions from complex numbers","sidebarTitle":"Quaternions","href":"/aiml-common/lectures/motion-algebras/quaternions/index"},{"title":"Calculus on Lie groups","sidebarTitle":"Lie II: calculus","href":"/aiml-common/lectures/motion-algebras/lie-calculus/index"},{"title":"Lie cheatsheet","sidebarTitle":"Lie cheatsheet","href":"/aiml-common/lectures/motion-algebras/lie-cheatsheet/index"}]},{"group":"Kinematics","icon":"gears","pages":[{"title":"Motion without forces","sidebarTitle":"Overview","href":"/book/kinematics/index"},{"title":"Lie theory in practice","sidebarTitle":"Lie III: applications","tag":"DRAFT","href":"/aiml-common/lectures/kinematics/lie-applications/index"},{"title":"Wheeled Mobile Robots","sidebarTitle":"Wheeled Robots","tag":"DRAFT","href":"/aiml-common/lectures/kinematics/wheeled-robots/index"},{"title":"AR4 Robot Arm Kinematics","sidebarTitle":"AR4 Arm Kinematics","href":"/aiml-common/lectures/kinematics/ar4-forward-inverse-kinematics/index"},{"title":"Lab: The AR4 from Its URDF","sidebarTitle":"AR4 Kinematics Lab","href":"/aiml-common/lectures/kinematics/ar4-kinematics-lab/index"}]},{"group":"Dynamics","icon":"weight-hanging","pages":[{"title":"Why robots move","sidebarTitle":"Overview","href":"/book/dynamics/index"},{"title":"Rigid-body dynamics","sidebarTitle":"Rigid-body dynamics","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/rigid-body-dynamics/index"},{"title":"Newton-Euler inverse dynamics","sidebarTitle":"Inverse dynamics","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/inverse-dynamics/index"},{"title":"Simulating a robot arm","sidebarTitle":"Forward dynamics","description":"How to compute a robot arm's motion from applied joint torques and integrate that motion in a simulator.","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/forward-dynamics/index"},{"title":"Dynamics under constraints","sidebarTitle":"Constrained dynamics","tag":"DRAFT","href":"/aiml-common/lectures/dynamics/constrained-dynamics/index"}]},{"group":"Systems Integration","icon":"cubes","pages":[{"title":"Robot Simulation with Gazebo","sidebarTitle":"Simulation","description":"Building and extending Gazebo simulation worlds for embodied AI, including LLM-driven world and model authoring.","href":"/aiml-common/lectures/simulation/index"},{"title":"Gazebo worlds and the SDF/Xacro format","sidebarTitle":"Gazebo worlds","href":"/aiml-common/lectures/simulation/gazebo-worlds"},{"title":"LLM-driven world and model authoring","sidebarTitle":"Authoring Worlds with LLMs","href":"/aiml-common/lectures/simulation/llm-world-authoring"},{"title":"Object Detection with Keyframe Gating and Vector Storage","sidebarTitle":"Object Detection","href":"/aiml-common/lectures/simulation/object-detection"},{"title":"Semantic Graphs and Re-Localization","sidebarTitle":"Semantic Graphs","href":"/aiml-common/lectures/simulation/semantic-graphs"}]}]},{"item":"Physical AI","icon":"microchip","pages":[{"title":"Physical AI","href":"/book/physical-ai"}]},{"item":"Prerequisites","pages":[{"title":"Prerequisites","href":"/book/prerequisites"}]}]},{"tab":"Courses","icon":"graduation-cap","menu":[{"item":"Overview","pages":[{"title":"Overview","href":"/courses"}]},{"item":"Introduction to AI","pages":[{"title":"Introduction to AI","href":"/courses/ai"}]},{"item":"DL for Computer Vision","pages":[{"title":"DL for Computer Vision","href":"/courses/cv"}]},{"item":"AI for Robotics","pages":[{"title":"AI for Robotics","href":"/courses/robotics"}]},{"item":"Resources","pages":[{"title":"Resources","href":"/courses/njit-calendar"}]}],"pages":[{"title":"Courses","href":"/courses"}]},{"tab":"Media","icon":"video","pages":[{"title":"Media","href":"/media"}]},{"tab":"AI Industry","icon":"flask","pages":[{"title":"AI Industry","href":"/research"}]},{"tab":"Blog","icon":"pen-nib","pages":[{"title":"Blog","href":"/blog"}]},{"tab":"Careers","icon":"briefcase","menu":[{"item":"Internships","pages":[{"title":"Internships","href":"/careers/virtual-internships"}]}],"pages":[{"title":"Careers","href":"/careers/virtual-internships"}]},{"tab":"About","icon":"user","pages":[{"title":"About","href":"/about"}]}]},"basePath":"","title":"Dynamics under constraints - aegean.ai","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}