packages feed

dynobud-1.7.1.0: examples/ToyOcp.hs

{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}

module Main where

import GHC.Generics ( Generic1 )

import Dyno.Vectorize
import Dyno.SimpleOcp

-- state
data X a = X { xTheta :: a, xOmega :: a }
         deriving (Functor, Generic1, Show)
instance Vectorize X

-- controls
data U a = U { uTorque :: a }
         deriving (Functor, Generic1, Show)
instance Vectorize U

pendOde :: Floating a => X a -> U a -> X a
pendOde (X theta omega) (U torque) = X thetaDot omegaDot
  where
    thetaDot = omega
    omegaDot = torque + 9.8 * sin theta

ocp :: SimpleOcp X U
ocp =
  SimpleOcp
  { ode = pendOde
  , objective = \(X _ omega) (U torque) -> omega * omega + torque * torque
  , xBounds = X (-pi, pi) (-5, 5)
  , uBounds = U (-50, 50)
  , xInitial = X {xTheta = pi/2, xOmega =  0}
  , xFinal = X {xTheta = 0, xOmega = 0}
  , endTime = 1
  , initialGuess = \t -> X ((1-t) * pi/2) (pi/1)
  }

main :: IO ()
main = do
  result <- solveOcp ocp
  case result of
    Left msg -> putStrLn $ "failed with " ++ msg
    Right xus -> print xus