-
-5. rai python API
-rai bindings
-
-
-class ry. ArgWord
-Members:
-_left
-_right
-_sequence
-_path
-
-
-property name
-
-
-
-
-
-
-class ry. BotOp
-needs some docu!
-
-
-getCameraFxypxy ( self : ry.BotOp , sensorName : str ) → arr
-returns camera intrinsics
-
-
-
-
-getImageAndDepth ( self : ry.BotOp , sensorName : str ) → tuple
-returns image and depth from a camera sensor
-
-
-
-
-getImageDepthPcl ( self : ry.BotOp , sensorName : str , globalCoordinates : bool = False ) → tuple
-returns image, depth and point cloud (assuming sensor knows intrinsics) from a camera sensor, optionally in global instead of camera-frame-relative coordinates
-
-
-
-
-getKeyPressed ( self : ry.BotOp ) → int
-get key pressed in window at last sync
-
-
-
-
-getTimeToEnd ( self : ry.BotOp ) → float
-get time-to-go of the current spline reference that is tracked (use getTimeToEnd()<=0. to check if motion execution is done)
-
-
-
-
-get_q ( self : ry.BotOp ) → arr
-get the current (real) robot joint vector
-
-
-
-
-get_qDot ( self : ry.BotOp ) → arr
-get the current (real) robot joint velocities
-
-
-
-
-get_qHome ( self : ry.BotOp ) → arr
-returns home joint vector (defined as the configuration C when you created BotOp)
-
-
-
-
-get_t ( self : ry.BotOp ) → float
-returns the control time (absolute time managed by the high freq tracking controller)
-
-
-
-
-get_tauExternal ( self : ry.BotOp ) → arr
-get the current (real) robot joint torques (external: gravity & acceleration removed) – each call averages from last call; first call might return nonsense!
-
-
-
-
-gripperClose ( self : ry.BotOp , leftRight : ry.ArgWord , force : float = 10.0 , width : float = 0.05 , speed : float = 0.1 ) → None
-close gripper
-
-
-
-
-gripperCloseGrasp ( self : ry.BotOp , leftRight : ry.ArgWord , objName : str , force : float = 10.0 , width : float = 0.05 , speed : float = 0.1 ) → None
-close gripper and indicate what should be grasped – makes no different in real, but helps simulation to mimic grasping more reliably
-
-
-
-
-gripperDone ( self : ry.BotOp , leftRight : ry.ArgWord ) → bool
-returns if gripper is done
-
-
-
-
-gripperOpen ( self : ry.BotOp , leftRight : ry.ArgWord , width : float = 0.075 , speed : float = 0.2 ) → None
-move the gripper to width (default: open)
-
-
-
-
-gripperPos ( self : ry.BotOp , leftRight : ry.ArgWord ) → float
-returns the gripper pos
-
-
-
-
-hold ( self : ry.BotOp , floating : bool = False , damping : bool = True ) → None
-hold the robot with a trivial PD controller, floating means reference = real, without damping the robot is free floating
-
-
-
-
-home ( self : ry.BotOp , C : ry.Config ) → None
-immediately drive the robot home (see get_qHome); keeps argument C synced; same as moveTo(qHome, 1., True); wait(C);
-
-
-
-
-move ( self : ry.BotOp , path : arr , times : arr , overwrite : bool = False , overwriteCtrlTime : float = -1.0 ) → None
-core motion command: set a spline motion reference; if only a single time [T] is given for multiple waypoints, it assumes equal time spacing with TOTAL time T
-By default, the given spline is APPENDED to the current reference spline. The user can also enforce the given spline to overwrite the current reference starting at the given absolute ctrlTime. This allows implementation of reactive (e.g. MPC-style) control. However, the user needs to take care that overwriting is done in a smooth way, i.e., that the given spline starts with a pos/vel that is close to the pos/vel of the current reference at the given ctrlTime.
-
-
-
-
-moveAutoTimed ( self : ry.BotOp , path : arr , maxVel : float = 1.0 , maxAcc : float = 1.0 ) → None
-helper to execute a path (typically fine resolution, from KOMO or RRT) with equal time spacing chosen for given max vel/acc
-
-
-
-
-moveTo ( self : ry.BotOp , q_target : arr , timeCost : float = 1.0 , overwrite : bool = False ) → None
-helper to move to a single joint vector target, where timing is chosen optimally based on the given timing cost
-When using overwrite, this immediately steers to the target – use this as a well-timed reactive q_target controller
-
-
-
-
-setCompliance ( self : ry.BotOp , J : arr , compliance : float = 0.5 ) → None
-set a task space compliant, where J defines the task space Jacobian, and compliance goes from 0 (no compliance) to 1 (full compliance, but still some damping)
-
-
-
-
-setControllerWriteData ( self : ry.BotOp , arg0 : int ) → None
-[for internal debugging only] triggers writing control data into a file
-
-
-
-
-stop ( self : ry.BotOp , C : ry.Config ) → None
-immediately stop the robot; keeps argument C synced; same as moveTo(get_q(), 1., True); wait(C);
-
-
-
-
-sync ( self : ry.BotOp , C : ry.Config , waitTime : float = 0.1 ) → int
-sync your workspace configuration C with the robot state
-
-
-
-
-
-
-class ry. Config
-Core data structure to represent a kinematic configuration.
-
-
-addConfigurationCopy ( self : ry.Config , config : ry.Config , tau : float = 1.0 ) → None
-
-
-
-
-addFile ( self : ry.Config , file_name : str ) → None
-add the contents of the file to C
-
-
-
-
-addFrame ( self : ry.Config , name : str , parent : str = '' , args : str = '' ) → rai::Frame
-add a new frame to C; optionally make this a child to the given parent; use the Frame methods to set properties of the new frame
-
-
-
-
-addObject ( self: ry.Config , name: str , parent: str = '' , shape: rai::ShapeType , size: List[float] = [] , color: List[float] = [] , pos: List[float] = [] , quat: List[float] = [] ) → rai::Frame
-TODO remove! use addFrame only
-
-
-
-
-attach ( self : ry.Config , arg0 : str , arg1 : str ) → None
-change the configuration by creating a rigid joint from frame1 to frame2, adopting their current relative pose. This also breaks the first joint that is parental to frame2 and reverses the topological order from frame2 to the broken joint
-
-
-
-
-cameraView ( self : ry.Config ) → ry::RyCameraView
-create an offscreen renderer for this configuration
-
-
-
-
-clear ( self : ry.Config ) → None
-clear all frames and additional data; becomes the empty configuration, with no frames
-
-
-
-
-computeCollisions ( self : ry.Config ) → None
-call the broadphase collision engine (SWIFT++ or FCL) to generate the list of collisions (or near proximities) between all frame shapes that have the collision tag set non-zero
-
-
-
-
-copy ( self : ry.Config , C2 : ry.Config ) → None
-make C a (deep) copy of the given C2
-
-
-
-
-delFrame ( self : ry.Config , frameName : str ) → None
-destroy and remove a frame from C
-
-
-
-
-equationOfMotion ( self : ry.Config , qdot : List [ float ] , gravity : bool ) → tuple
-
-
-
-
-eval ( self : ry.Config , featureSymbol : FeatureSymbol , frames : StringA = [] , scale : arr = array(1.e-05) , target : arr = array(0.0078125) , order : int = -1 ) → tuple
-evaluate a feature
-
-
-
-
-feature ( self : ry.Config , featureSymbol : FeatureSymbol , frameNames : List [ str ] = [] , scale : List [ float ] = [] , target : List [ float ] = [] , order : int = -1 ) → Feature
-create a feature (a differentiable map from joint state to a vector space), as they’re typically used for IK or optimization. See the dedicated tutorial for details. featureSymbol defines which mapping this is (position, vectors, collision distance, etc). many mapping refer to one or several frames, which need to be specified using frameNames
-
-
-
-
-frame ( self : ry.Config , frameName : str ) → rai::Frame
-get access to a frame by name; use the Frame methods to set/get frame properties
-
-
-
-
-frames ( self : ry.Config ) → List[rai::Frame]
-
-
-
-
-getCollisions ( self : ry.Config , belowMargin : float = 1.0 ) → list
-return the results of collision computations: a list of 3 tuples with (frame1, frame2, distance). Optionally report only on distances below a margin To get really precise distances and penetrations use the FS.distance feature with the two frame names
-
-
-
-
-getDofIDs ( self : ry.Config ) → List [ int ]
-
-
-
-
-getFrame ( self : ry.Config , frameName : str ) → rai::Frame
-get access to a frame by name; use the Frame methods to set/get frame properties
-
-
-
-
-getFrameDimension ( self : ry.Config ) → int
-get the total number of frames
-
-
-
-
-getFrameNames ( self : ry.Config ) → List [ str ]
-get the list of frame names
-
-
-
-
-getFrameState ( * args , ** kwargs )
-Overloaded function.
-
-getFrameState(self: ry.Config) -> numpy.ndarray[numpy.float64]
-
-get the frame state as a n-times-7 numpy matrix, with a 7D pose per frame
-
-getFrameState(self: ry.Config, arg0: str) -> numpy.ndarray[numpy.float64]
-
-TODO remove -> use individual frame!
-
-
-
-
-getJointDimension ( self : ry.Config ) → int
-get the total number of degrees of freedom
-
-
-
-
-getJointNames ( self : ry.Config ) → StringA
-get the list of joint names
-
-
-
-
-getJointState ( self: ry.Config , joints: Array<T> = [] ) → arr
-get the joint state as a numpy vector, optionally only for a subset of joints specified as list of joint names
-
-
-
-
-makeObjectsConvex ( self : ry.Config ) → None
-remake all meshes associated with all frames to become their convex hull
-
-
-
-
-makeObjectsFree ( self : ry.Config , arg0 : List [ str ] ) → None
-TODO remove -> to frame
-
-
-
-
-report ( self : ry.Config ) → rai::String
-
-
-
-
-selectJoints ( self : ry.Config , jointNames : List [ str ] , notThose : bool = False ) → None
-redefine what are considered the DOFs of this configuration: only joints listed in jointNames are considered part of the joint state and define the number of DOFs
-
-
-
-
-selectJointsByTag ( self : ry.Config , jointGroups : List [ str ] ) → None
-redefine what are considered the DOFs of this configuration: only joint that have a tag listed in jointGroups are considered part of the joint state and define the number of DOFs
-
-
-
-
-setFrameState ( * args , ** kwargs )
-Overloaded function.
-
-setFrameState(self: ry.Config, X: List[float], frames: List[str] = []) -> None
-
-set the frame state, optionally only for a subset of frames specified as list of frame names
-
-setFrameState(self: ry.Config, X: numpy.ndarray, frames: List[str] = []) -> None
-
-set the frame state, optionally only for a subset of frames specified as list of frame names
-
-
-
-
-setJointState ( self : ry.Config , q : arr , joints : list = [] ) → None
-set the joint state, optionally only for a subset of joints specified as list of joint names
-
-
-
-
-setJointStateSlice ( self : ry.Config , arg0 : List [ float ] , arg1 : int ) → None
-
-
-
-
-simulation ( self: ry.Config , engine: rai::Simulation::Engine , verbose: int ) → rai::Simulation
-create a generic Simulation engine, which can internally call PhysX, Bullet, or just kinematics to forward simulate, allows you to control robot motors by position, velocity, or accelerations, and allows you go query camera images and depth
-
-
-
-
-sortFrames ( self : ry.Config ) → None
-resort the internal order of frames according to the tree topology. This is important before saving the configuration.
-
-
-
-
-stepDynamics ( self : ry.Config , qdot : List [ float ] , u_control : List [ float ] , tau : float , dynamicNoise : float , gravity : bool ) → numpy.ndarray [ numpy.float64 ]
-
-
-
-
-view ( self : ry.Config , pause : bool = False , message : str = None ) → int
-open a view window for the configuration
-
-
-
-
-view_close ( self : ry.Config ) → None
-close the view
-
-
-
-
-view_getScreenshot ( self : ry.Config ) → numpy.ndarray [ numpy.uint8 ]
-
-
-
-
-view_playVideo ( self : ry.Config , delay : float = 1.0 , saveVideoPath : str = None ) → None
-
-
-
-
-view_recopyMeshes ( self : ry.Config ) → None
-
-
-
-
-watchFile ( self : ry.Config , arg0 : str ) → None
-launch a viewer that listents (inode) to changes of a file (made by you in an editor), and reloads, displays and animates the configuration whenever the file is changed
-
-
-
-
-
-
-class ry. ControlMode
-Members:
-none
-position
-velocity
-acceleration
-spline
-
-
-property name
-
-
-
-
-
-
-class ry. FS
-Members:
-position
-positionDiff
-positionRel
-quaternion
-quaternionDiff
-quaternionRel
-pose
-poseDiff
-poseRel
-vectorX
-vectorXDiff
-vectorXRel
-vectorY
-vectorYDiff
-vectorYRel
-vectorZ
-vectorZDiff
-vectorZRel
-scalarProductXX
-scalarProductXY
-scalarProductXZ
-scalarProductYX
-scalarProductYY
-scalarProductYZ
-scalarProductZZ
-gazeAt
-angularVel
-accumulatedCollisions
-jointLimits
-distance
-oppose
-qItself
-aboveBox
-insideBox
-pairCollision_negScalar
-pairCollision_vector
-pairCollision_normal
-pairCollision_p1
-pairCollision_p2
-standingAbove
-physics
-contactConstraints
-energy
-transAccelerations
-transVelocities
-
-
-property name
-
-
-
-
-
-
-class ry. Feature
-todo doc
-
-
-description ( self : ry.Feature , arg0 : ry.Config ) → str
-
-
-
-
-eval ( self : ry.Feature , arg0 : ry.Config ) → tuple
-
-
-
-
-setOrder ( self : ry.Feature , arg0 : int ) → ry.Feature
-
-
-
-
-setScale ( self : ry.Feature , arg0 : arr ) → ry.Feature
-
-
-
-
-setTarget ( self : ry.Feature , arg0 : arr ) → ry.Feature
-
-
-
-
-
-
-class ry. Frame
-todo doc
-
-
-addAttribute ( self : ry.Frame , arg0 : str , arg1 : float ) → ry.Frame
-
-
-
-
-addAttributes ( self : ry.Frame , arg0 : dict ) → None
-add/set attributes for the frame
-
-
-
-
-getAttributes ( self : ry.Frame ) → dict
-get frame attributes
-
-
-
-
-getJointState ( self : ry.Frame ) → arr
-
-
-
-
-getMeshPoints ( self : ry.Frame ) → arr
-
-
-
-
-getMeshTriangles ( self : ry.Frame ) → Array<T>
-
-
-
-
-getPosition ( self : ry.Frame ) → arr
-
-
-
-
-getQuaternion ( self : ry.Frame ) → arr
-
-
-
-
-getRelativePosition ( self : ry.Frame ) → arr
-
-
-
-
-getRelativeQuaternion ( self : ry.Frame ) → arr
-
-
-
-
-getRotationMatrix ( self : ry.Frame ) → arr
-
-
-
-
-getSize ( self : ry.Frame ) → arr
-
-
-
-
-info ( self : ry.Frame ) → dict
-
-
-
-
-setColor ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setContact ( self : ry.Frame , arg0 : int ) → ry.Frame
-
-
-
-
-setJoint ( self: ry.Frame , arg0: rai::JointType ) → ry.Frame
-
-
-
-
-setJointState ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setMass ( self : ry.Frame , arg0 : float ) → ry.Frame
-
-
-
-
-setMeshAsLines ( self : ry.Frame , arg0 : List [ float ] ) → None
-
-
-
-
-setParent ( self : ry.Frame , arg0 : ry.Frame , arg1 : bool , arg2 : bool ) → ry.Frame
-
-
-
-
-setPointCloud ( self : ry.Frame , points : numpy.ndarray , colors : numpy.ndarray [ numpy.uint8 ] = array([], dtype=uint8) ) → None
-
-
-
-
-setPose ( self : ry.Frame , arg0 : str ) → None
-
-
-
-
-setPosition ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setQuaternion ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setRelativePose ( self : ry.Frame , arg0 : str ) → None
-
-
-
-
-setRelativePosition ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setRelativeQuaternion ( self : ry.Frame , arg0 : arr ) → ry.Frame
-
-
-
-
-setShape ( self : ry.Frame , type : ry.ST , size : arr ) → ry.Frame
-
-
-
-
-unLink ( self : ry.Frame ) → ry.Frame
-
-
-
-
-
-
-class ry. ImpType
-Members:
-closeGripper
-openGripper
-depthNoise
-rgbNoise
-adversarialDropper
-objectImpulses
-noPenetrations
-
-
-property name
-
-
-
-
-
-
-class ry. JT
-Members:
-hingeX
-hingeY
-hingeZ
-transX
-transY
-transZ
-transXY
-trans3
-transXYPhi
-transYPhi
-universal
-rigid
-quatBall
-phiTransXY
-XBall
-free
-generic
-tau
-
-
-property name
-
-
-
-
-
-
-class ry. KOMO
-Constrained solver to optimize configurations or paths. (KOMO = k-order Markov Optimization)
-
-
-addControlObjective ( self : ry.KOMO , times : arr , order : int , scale : float = 1.0 , target : arr = array(0.0078125) , deltaFromStep : int = 0 , deltaToStep : int = 0 ) → Objective
-
-
-
-
-addInteraction_elasticBounce ( self: ry.KOMO , time: float , from: str , to: str , elasticity: float = 0.8 , stickiness: float = 0.0 ) → None
-
-
-
-
-addModeSwitch ( self: ry.KOMO , times: arr , newMode: rai::SkeletonSymbol , frames: StringA , firstSwitch: bool = True ) → None
-
-
-
-
-addObjective ( self: ry.KOMO , times: arr , feature: ry.FS , frames: List[str] = [] , type: ObjectiveType , scale: arr = array(0.0078125) , target: arr = array(0.0078125) , order: int = -1 ) → None
-
-
-
-
-addQuaternionNorms ( self : ry.KOMO , times : arr = array(0.0078125) , scale : float = 3.0 , hard : bool = True ) → None
-
-
-
-
-addTimeOptimization ( self : ry.KOMO ) → None
-
-
-
-
-clearObjectives ( self : ry.KOMO ) → None
-
-
-
-
-getConstraintViolations ( self : ry.KOMO ) → float
-
-
-
-
-getCosts ( self : ry.KOMO ) → float
-
-
-
-
-getForceInteractions ( self : ry.KOMO ) → list
-
-
-
-
-getFrameState ( self : ry.KOMO , arg0 : int ) → arr
-
-
-
-
-getPath ( self : ry.KOMO ) → arr
-
-
-
-
-getPathFrames ( self : ry.KOMO ) → arr
-
-
-
-
-getPathTau ( self : ry.KOMO ) → arr
-
-
-
-
-getPath_qAll ( self : ry.KOMO ) → arrA
-
-
-
-
-getReport ( self : ry.KOMO ) → dict
-
-
-
-
-getT ( self : ry.KOMO ) → int
-
-
-
-
-initOrg ( self : ry.KOMO ) → None
-
-
-
-
-initPhaseWithDofsPath ( self: ry.KOMO , t_phase: int , dofIDs: Array<T> , path: arr , autoResamplePath: bool = False ) → None
-
-
-
-
-initRandom ( self : ry.KOMO , verbose : int = 0 ) → None
-
-
-
-
-initWithConstant ( self : ry.KOMO , q : arr ) → None
-
-
-
-
-initWithPath_qOrg ( self : ry.KOMO , q : arr ) → None
-
-
-
-
-initWithWaypoints ( self : ry.KOMO , waypoints : arrA , waypointStepsPerPhase : int = 1 , interpolate : bool = False , verbose : int = -1 ) → Array<T>
-
-
-
-
-nlp ( self : ry.KOMO ) → NLP
-return the problem NLP
-
-
-
-
-reportProblem ( self : ry.KOMO ) → str
-
-
-
-
-setConfig ( self : ry.KOMO , arg0 : ry.Config , arg1 : bool ) → None
-
-
-
-
-setTiming ( self : ry.KOMO , arg0 : float , arg1 : int , arg2 : float , arg3 : int ) → None
-
-
-
-
-view ( self : ry.KOMO , pause : bool = False , txt : str = None ) → int
-
-
-
-
-view_close ( self : ry.KOMO ) → None
-
-
-
-
-view_play ( self : ry.KOMO , pause : bool = False , delay : float = 0.1 , saveVideoPath : str = None ) → int
-
-
-
-
-
-
-class ry. NLP
-Representation of a Nonlinear Mathematical Program
-
-
-evaluate ( self : ry.NLP , arg0 : arr ) → Tuple [ arr , arr ]
-query the NLP at a point $x$; returns the tuple $(phi,J)$, which is the feature vector and its Jacobian; features define cost terms, sum-of-square (sos) terms, inequalities, and equalities depending on ‘getFeatureTypes’
-
-
-
-
-getBounds ( self : ry.NLP ) → Tuple [ arr , arr ]
-returns the tuple $(b_{lo},b_{up})$, where both vectors are of same dimensionality of $x$ (or size zero, if there are no bounds)
-
-
-
-
-getDimension ( self : ry.NLP ) → int
-return the dimensionality of $x$
-
-
-
-
-getFHessian ( self : ry.NLP , arg0 : arr ) → arr
-returns Hessian of the sum of $f$-terms
-
-
-
-
-getFeatureTypes ( self : ry.NLP ) → List [ ObjectiveType ]
-features (entries of $phi$) can be of one of (ry.OT.f, ry.OT.sos, ry.OT.ineq, ry.OT.eq), which means (cost, sum-of-square, inequality, equality). The total cost $f(x)$ is the sum of all f-terms plus sum-of-squares of sos-terms.
-
-
-
-
-getInitializationSample ( self : ry.NLP , previousOptima : arr = array(0.0078125) ) → arr
-returns a sample (e.g. uniform within bounds) to initialize an optimization – not necessarily feasible
-
-
-
-
-report ( self : ry.NLP , arg0 : int ) → str
-displays semantic information on the last query
-
-
-
-
-
-
-class ry. NLP_Factory
-
-
-setBounds ( self : ry.NLP_Factory , arg0 : arr , arg1 : arr ) → None
-
-
-
-
-setDimension ( self : ry.NLP_Factory , arg0 : int ) → None
-
-
-
-
-setEvalCallback ( self : ry.NLP_Factory , arg0 : Callable [ [ arr ] , Tuple [ arr , arr ] ] ) → None
-
-
-
-
-setFeatureTypes ( self: ry.NLP_Factory , arg0: Array<T> ) → None
-
-
-
-
-testCallingEvalCallback ( self : ry.NLP_Factory , arg0 : arr ) → Tuple [ arr , arr ]
-
-
-
-
-
-
-class ry. NLP_Solver
-An interface to portfolio of solvers
-
-
-getOptions ( self : ry.NLP_Solver ) → ry.NLP_SolverOptions
-
-
-
-
-getTrace_J ( self : ry.NLP_Solver ) → arr
-
-
-
-
-getTrace_costs ( self : ry.NLP_Solver ) → arr
-
-
-
-
-getTrace_phi ( self : ry.NLP_Solver ) → arr
-
-
-
-
-getTrace_x ( self : ry.NLP_Solver ) → arr
-
-
-
-
-setOptions ( self : ry.NLP_Solver , verbose : int = 1 , stopTolerance : float = 0.01 , stopFTolerance : float = -1.0 , stopGTolerance : float = -1.0 , stopEvals : int = 1000 , maxStep : float = 0.2 , damping : float = 1.0 , stepInc : float = 1.5 , stepDec : float = 0.5 , wolfe : float = 0.01 , muInit : float = 1.0 , muInc : float = 5.0 , muMax : float = 10000.0 , muLBInit : float = 0.1 , muLBDec : float = 0.2 ) → ry.NLP_Solver
-set solver options
-
-
-
-
-setProblem ( self : ry.NLP_Solver , arg0 : ry.NLP ) → ry.NLP_Solver
-
-
-
-
-setSolver ( self : ry.NLP_Solver , arg0 : NLP_SolverID ) → ry.NLP_Solver
-
-
-
-
-setTracing ( self : ry.NLP_Solver , arg0 : bool , arg1 : bool , arg2 : bool , arg3 : bool ) → ry.NLP_Solver
-
-
-
-
-solve ( self : ry.NLP_Solver , resampleInitialization : int = -1 ) → SolverReturn
-
-
-
-
-
-
-class ry. NLP_SolverID
-Members:
-gradientDescent
-rprop
-LBFGS
-newton
-augmentedLag
-squaredPenalty
-logBarrier
-singleSquaredPenalty
-NLopt
-Ipopt
-Ceres
-
-
-property name
-
-
-
-
-
-
-class ry. NLP_SolverOptions
-solver options
-
-
-dict ( self : ry.NLP_SolverOptions ) → dict
-
-
-
-
-set_damping ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_maxStep ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_muInc ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_muInit ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_muLBDec ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_muLBInit ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_muMax ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_stepDec ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_stepInc ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_stopEvals ( self : ry.NLP_SolverOptions , arg0 : int ) → ry.NLP_SolverOptions
-
-
-
-
-set_stopFTolerance ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_stopGTolerance ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_stopTolerance ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-set_verbose ( self : ry.NLP_SolverOptions , arg0 : int ) → ry.NLP_SolverOptions
-
-
-
-
-set_wolfe ( self : ry.NLP_SolverOptions , arg0 : float ) → ry.NLP_SolverOptions
-
-
-
-
-
-
-class ry. OT
-Members:
-none
-f
-sos
-ineq
-eq
-ineqB
-ineqP
-
-
-property name
-
-
-
-
-
-
-class ry. PathFinder
-todo doc
-
-
-setExplicitCollisionPairs ( self : ry.PathFinder , collisionPairs : StringA ) → ry.PathFinder
-
-
-
-
-setProblem ( self : ry.PathFinder , Configuration : ry.Config , starts : arr , goals : arr ) → ry.PathFinder
-
-
-
-
-solve ( self : ry.PathFinder ) → SolverReturn
-
-
-
-
-step ( self : ry.PathFinder ) → bool
-
-
-
-
-
-
-class ry. ST
-Members:
-none
-box
-sphere
-capsule
-mesh
-cylinder
-marker
-pointCloud
-ssCvx
-ssBox
-ssCylinder
-ssBoxElip
-quad
-camera
-sdf
-
-
-property name
-
-
-
-
-
-
-class ry. SY
-Members:
-touch
-above
-inside
-oppose
-restingOn
-poseEq
-positionEq
-stableRelPose
-stablePose
-stable
-stableOn
-dynamic
-dynamicOn
-dynamicTrans
-quasiStatic
-quasiStaticOn
-downUp
-break
-stableZero
-contact
-contactStick
-contactComplementary
-bounce
-push
-magic
-magicTrans
-pushAndPlace
-topBoxGrasp
-topBoxPlace
-dampMotion
-identical
-alignByInt
-makeFree
-forceBalance
-relPosY
-touchBoxNormalX
-touchBoxNormalY
-touchBoxNormalZ
-boxGraspX
-boxGraspY
-boxGraspZ
-lift
-stableYPhi
-stableOnX
-stableOnY
-end
-
-
-property name
-
-
-
-
-
-
-class ry. Simulation
-todo doc
-
-
-addImp ( self : ry.Simulation , arg0 : ry.ImpType , arg1 : StringA , arg2 : arr ) → None
-
-
-
-
-addSensor ( self : ry.Simulation , sensorName : str , frameAttached : str = '' , width : int = 640 , height : int = 360 , focalLength : float = -1.0 , orthoAbsHeight : float = -1.0 , zRange : arr = [] ) → rai::CameraView::Sensor
-
-
-
-
-closeGripper ( self : ry.Simulation , gripperFrameName : str , width : float = 0.05 , speed : float = 0.3 , force : float = 20.0 ) → None
-
-
-
-
-depthData2pointCloud ( self : ry.Simulation , arg0 : numpy.ndarray [ numpy.float32 ] , arg1 : List [ float ] ) → numpy.ndarray [ numpy.float64 ]
-
-
-
-
-getGripperIsGrasping ( self : ry.Simulation , gripperFrameName : str ) → bool
-
-
-
-
-getGripperWidth ( self : ry.Simulation , gripperFrameName : str ) → float
-
-
-
-
-getGroundTruthPosition ( self : ry.Simulation , arg0 : str ) → numpy.ndarray [ numpy.float64 ]
-
-
-
-
-getGroundTruthRotationMatrix ( self : ry.Simulation , arg0 : str ) → numpy.ndarray [ numpy.float64 ]
-
-
-
-
-getGroundTruthSize ( self : ry.Simulation , arg0 : str ) → numpy.ndarray [ numpy.float64 ]
-
-
-
-
-getImageAndDepth ( self : ry.Simulation ) → tuple
-
-
-
-
-getScreenshot ( self : ry.Simulation ) → Array<T>
-
-
-
-
-getState ( self : ry.Simulation ) → tuple
-
-
-
-
-getTimeToMove ( self : ry.Simulation ) → float
-
-
-
-
-get_q ( self : ry.Simulation ) → arr
-
-
-
-
-get_qDot ( self : ry.Simulation ) → arr
-
-
-
-
-loadTeleopCallbacks ( self : ry.Simulation ) → None
-
-
-
-
-openGripper ( self : ry.Simulation , gripperFrameName : str , width : float = 0.075 , speed : float = 0.3 ) → None
-
-
-
-
-pushConfigurationToSimulator ( self : ry.Simulation , frameVelocities : arr = [] ) → None
-set the simulator to the full (frame) state of the configuration
-
-
-
-
-restoreState ( self: ry.Simulation , arg0: rai::SimulationState ) → None
-
-
-
-
-selectSensor ( self : ry.Simulation , sensorName : str ) → rai::CameraView::Sensor
-
-
-
-
-setMoveto ( self : ry.Simulation , path : arr , t : float , append : bool = True ) → None
-set the spline reference to genreate motion
-
-
-
-
-setState ( self : ry.Simulation , frameState : arr , frameVelocities : arr = [] ) → None
-
-
-
-
-step ( self: ry.Simulation , u_control: arr , tau: float = 0.01 , u_mode: ry.ControlMode = <ControlMode.velocity: 2> ) → None
-
-
-
-
-
-
-class ry. SimulationEngine
-Members:
-physx
-bullet
-kinematic
-
-
-property name
-
-
-
-
-
-
-class ry. SolverReturn
-return of nlp solve call
-
-
-dict ( self : ry.SolverReturn ) → dict
-
-
-
-
-
-
-ry. compiled ( ) → str
-return a compile date+time version string
-
-
-
-
-ry. getStartGoalPath ( arg0 : ry.Config , arg1 : arr , arg2 : arr ) → arr
-
-
-
-
-ry. params_add ( arg0 : dict ) → None
-add/set parameters
-
-
-
-
-ry. params_file ( arg0 : str ) → None
-add parameters from a file
-
-
-
-
-ry. params_print ( ) → None
-print the parameters
-
-
-
-
-ry. raiPath ( arg0 : str ) → rai::String
-get a path relative to rai base path
-
-
-
-
-ry. setRaiPath ( arg0 : str ) → None
-redefine the rai (or rai-robotModels) path
-
-
+
diff --git a/docs/script/script.html b/docs/script/script.html
index 44db2a2..c4126d5 100644
--- a/docs/script/script.html
+++ b/docs/script/script.html
@@ -23,7 +23,7 @@
-
+
@@ -2061,7 +2061,7 @@
diff --git a/docs/searchindex.js b/docs/searchindex.js
index d16717b..0703ff9 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["getting_started", "index", "notebooks/botop1-motion", "notebooks/botop2-realRobotStarters", "notebooks/botop3-vision", "notebooks/botop3-vision-toBeMerged", "notebooks/botop4-examples", "notebooks/core1-config-and-frames", "notebooks/core2-features", "notebooks/core3-configurations", "notebooks/komo1-IK", "notebooks/komo1-IK-toBeMerged", "notebooks/komo2-PathOptimization", "notebooks/komo2-PathOptimization-toBeMerged", "notebooks/komo3-switches-skeletons", "notebooks/notebooks", "notebooks/opt1-basics", "notebooks/script5-PathFind", "notebooks/sim1-physics", "old/_Array", "old/_Configuration", "old/_ConfigurationFiles", "old/_Graph", "old/_Simulation", "old/komo", "old/old", "old/simlab", "old/simlab1", "old/simlab2", "old/simlab3", "old/simlab4", "old/simlab5", "old/skeleton", "rai", "script/script"], "filenames": ["getting_started.rst", "index.rst", "notebooks/botop1-motion.ipynb", "notebooks/botop2-realRobotStarters.ipynb", "notebooks/botop3-vision.ipynb", "notebooks/botop3-vision-toBeMerged.ipynb", "notebooks/botop4-examples.ipynb", "notebooks/core1-config-and-frames.ipynb", "notebooks/core2-features.ipynb", "notebooks/core3-configurations.ipynb", "notebooks/komo1-IK.ipynb", "notebooks/komo1-IK-toBeMerged.ipynb", "notebooks/komo2-PathOptimization.ipynb", "notebooks/komo2-PathOptimization-toBeMerged.ipynb", "notebooks/komo3-switches-skeletons.ipynb", "notebooks/notebooks.rst", "notebooks/opt1-basics.ipynb", "notebooks/script5-PathFind.ipynb", "notebooks/sim1-physics.ipynb", "old/_Array.rst", "old/_Configuration.rst", "old/_ConfigurationFiles.rst", "old/_Graph.rst", "old/_Simulation.rst", "old/komo.rst", "old/old.rst", "old/simlab.rst", "old/simlab1.rst", "old/simlab2.rst", "old/simlab3.rst", "old/simlab4.rst", "old/simlab5.rst", "old/skeleton.rst", "rai.rst", "script/script.rst"], "titles": ["
1. Getting Started", "Welcome to the Robotics Course Repo", "
2.3.1. Interacting with a Sim/Real: Setting spline references", "
2.3.2. Starting with a real robot", "
2.3.3. First example to grap images from a webcam", "<no title>", "
2.3.4. Example for grasping in Sim", "
2.1.1. Configuration & Frames", "
2.1.2. Features", "
2.1.3. Importing, Editing & Manipulating Configurations", "
2.2.1. Inverse Kinematics as Optimization", "
2.2.2. Inverse Kinematics as Optimization (to be merged)", "
2.2.3. Path optimization example", "
2.2.4. Path Optimization (to be merged)", "
2.2.5. Advanced: Switches & Skeletons", "
2. Tutorials", "
2.4.2. Optimization (NLP formulation and solving)", "
2.4.3. Path finding example", "
2.4.1. Direct simulation interface", "
4.7. Array", "
4.3. Configuration", "
4.4. .g-files to describe robot configurations", "
4.5. Graph and .g-files", "
4.6. Simulation", "
4.2. Learning KOMO (K-Order Markov Optimization)", "
4. Old Material", "
4.1. Lab Course in Simulation", "
4.1.1. SimLab Exercise 1 - Basic Setup", "
4.1.2. SimLab Exercise 2 - Motion", "
4.1.3. SimLab Exercise 3 - OpenCV", "
4.1.4. SimLab Exercise 4 - Grasp", "
4.1.5. SimLab - Project Proposal and Final Presentation", "Learning about Skeletons & LGP", "
5. rai python API", "
3. Lecture Script"], "terms": {"robot": [0, 2, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "python": [0, 1, 5, 6, 8, 15, 21, 22, 24, 27, 28, 29, 34], "packag": [0, 21, 24, 31, 34], "On": [0, 7], "standard": [0, 11, 13, 22, 23, 29, 34], "ubuntu": [0, 31, 34], "follow": [0, 9, 20, 21, 23, 24, 27, 30, 31, 34], "should": [0, 1, 2, 8, 20, 21, 23, 24, 27, 28, 31, 33, 34], "suffici": [0, 34], "sudo": [0, 34], "apt": [0, 34], "liblapack3": [0, 34], "freeglut3": [0, 34], "libglew": [0, 34], "dev": [0, 34], "python3": [0, 5, 34], "pip": [0, 34], "m": [0, 20, 34], "user": [0, 1, 2, 20, 23, 24, 26, 33, 34], "numpi": [0, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 16, 18, 33, 34], "scipi": [0, 34], "A": [0, 6, 7, 8, 11, 20, 21, 22, 23, 24, 30, 31], "test": [0, 21, 22, 25, 27, 28, 29, 34], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 33, 34], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 21, 22, 24, 25, 29, 33, 34], "from": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 27, 28, 30, 31, 32, 33], "import": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 24, 25, 27, 28, 33], "ry": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 33, 34], "print": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 17, 33, 34], "version": [0, 5, 6, 24, 27, 33], "__version__": [0, 4, 6], "compil": [0, 1, 6, 18, 21, 24, 27, 33, 34], "rndscene": [0, 34], "real": [0, 1, 9, 12, 17, 18, 23, 25, 27, 30, 33, 34], "The": [0, 1, 2, 6, 7, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34], "doe": [0, 1, 9, 17, 20, 22, 25, 28, 29, 30, 34], "have": [0, 1, 6, 7, 16, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 33, 34], "driver": 0, "panda": [0, 9], "includ": [0, 7, 8, 9, 20, 22, 24, 26, 27, 31, 34], "therefor": [0, 20, 21, 23, 24, 30, 34], "onli": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 17, 19, 20, 21, 22, 25, 27, 28, 29, 31, 32, 33, 34], "support": [0, 8, 9, 21, 27, 34], "simul": [0, 1, 2, 3, 6, 9, 15, 25, 28, 29, 30, 33, 34], "mode": [0, 2, 11, 18, 32], "howev": [0, 7, 8, 11, 18, 20, 21, 24, 33, 34], "interfac": [0, 1, 9, 12, 16, 17, 19, 20, 24, 28, 33], "code": [0, 1, 2, 5, 7, 16, 19, 20, 21, 23, 24, 25, 26, 29, 30, 31], "design": [0, 1, 6, 11, 24, 28, 30], "so": [0, 6, 7, 8, 9, 11, 13, 16, 20, 21, 22, 23, 24, 28, 29, 31, 32, 33, 34], "everyth": [0, 4, 24, 30], "directli": [0, 8, 9, 22, 23, 24, 27, 28, 34], "transfer": 0, "all": [0, 1, 7, 8, 11, 15, 16, 18, 20, 21, 22, 23, 24, 27, 28, 29, 33, 34], "you": [0, 1, 3, 4, 7, 8, 9, 11, 21, 23, 25, 27, 28, 29, 30, 31, 32, 33, 34], "do": [0, 1, 7, 23, 25, 26, 28, 29, 30, 34], "re": [0, 8, 10, 21, 23, 27, 30, 33, 34], "your": [0, 2, 3, 9, 11, 24, 27, 28, 29, 30, 31, 33], "machin": [0, 26], "libfranka": 0, "librealsens": 0, "thi": [0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34], "done": [0, 4, 6, 21, 24, 33, 34], "us": [0, 1, 6, 7, 8, 9, 10, 11, 17, 19, 20, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33], "pdflatex": 0, "sourc": [0, 5, 34], "wheel": [0, 34], "creat": [0, 1, 6, 7, 9, 11, 22, 24, 25, 27, 28, 29, 31, 33, 34], "repo": [0, 27, 28, 29, 30], "hardest": 0, "part": [0, 7, 20, 21, 24, 31, 33, 34], "wa": [0, 18, 19, 22, 24], "docker": [0, 34], "mani": [0, 2, 7, 8, 11, 20, 23, 24, 32, 33, 34], "depend": [0, 11, 24, 27, 33, 34], "static": 0, "librari": [0, 21, 24, 27, 34], "cento": 0, "onc": [0, 24], "": [0, 7, 8, 11, 13, 14, 17, 20, 21, 24, 28, 32, 34], "botop": [0, 1, 2, 3, 4, 5, 6, 9, 12, 17, 18, 33], "lib": [0, 11, 14, 16, 18, 19], "can": [0, 1, 2, 5, 7, 8, 9, 10, 11, 17, 20, 21, 22, 23, 25, 27, 28, 29, 30, 31, 32, 33, 34], "compat": 0, "manner": [0, 8, 32, 34], "share": [0, 1, 20, 24], "docstr": 0, "tab": 0, "complet": [0, 16, 23, 34], "when": [0, 4, 5, 7, 8, 9, 11, 20, 21, 24, 28, 29, 30, 32, 33, 34], "an": [0, 1, 4, 6, 7, 8, 9, 11, 12, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32, 33], "id": [0, 5, 11], "e": [0, 2, 8, 9, 11, 18, 20, 21, 22, 24, 25, 27, 30, 31, 33, 34], "g": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 20, 23, 24, 25, 27, 28, 30, 31, 32, 33, 34], "v": [0, 5, 7, 9, 18, 27, 28, 31, 34], "definit": [0, 11, 27, 34], "want": [0, 1, 8, 11, 21, 24, 25, 31, 34], "method": [0, 1, 2, 6, 8, 9, 10, 11, 12, 17, 20, 22, 23, 25, 26, 27, 28, 30, 31, 33, 34], "modul": [0, 1, 7, 9, 34], "pybind11": [0, 27], "nativ": 0, "lack": 0, "stubgen": 0, "one": [0, 6, 7, 8, 11, 20, 21, 22, 24, 27, 28, 29, 32, 33, 34], "gener": [0, 1, 2, 11, 16, 20, 21, 24, 26, 28, 30, 31, 32, 33, 34], "someth": [0, 8, 31], "like": [0, 7, 8, 20, 21, 24, 31, 34], "header": [0, 24, 27], "file": [0, 1, 8, 9, 20, 23, 24, 25, 27, 32, 33], "whole": [0, 8, 11, 21, 34], "call": [0, 7, 8, 9, 11, 16, 20, 21, 22, 24, 27, 28, 30, 32, 33, 34], "ipi": 0, "That": [0, 20, 24, 32, 34], "resid": 0, "local": [0, 28, 30, 34], "site": 0, "next": [0, 10, 21, 24, 27, 34], "py": [0, 5, 21, 24, 34], "work": [0, 7, 11, 21, 24, 26, 27, 28, 29, 31, 32, 34], "ensur": [0, 20, 24, 34], "after": [0, 6, 12, 17, 20, 22, 24, 26, 30, 34], "class": [0, 1, 2, 8, 10, 19, 22, 23, 24, 25, 33, 34], "If": [0, 7, 11, 20, 24, 27, 31, 34], "autocomplet": 0, "jupyt": [0, 15, 27, 34], "try": [0, 8, 19, 21, 27, 28, 30, 31, 32, 34], "pip3": 0, "jedi": 0, "0": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 28, 33, 34], "17": [0, 6], "2": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 25, 26, 30, 31, 33, 34], "git": [0, 5, 9, 25, 28, 29, 30, 34], "clone": 0, "http": [0, 1, 7, 8, 15, 21, 24, 26, 27, 29, 31, 34], "github": [0, 1, 7, 8, 15, 21, 24, 26, 27, 34], "com": [0, 1, 8, 15, 21, 24, 26, 27, 31, 34], "marctoussaint": [0, 1, 7, 8, 15, 21, 24, 26, 27, 34], "rai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 20, 21, 22, 25, 27, 32], "cd": [0, 27, 28, 29, 30], "don": [0, 4, 8, 31, 34], "t": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 17, 19, 20, 21, 24, 28, 31, 33], "yet": [0, 21, 23, 24, 27, 28, 34], "nbconvert": 0, "matplotlib": [0, 5], "repositori": [1, 21, 24, 26, 27, 34], "three": [1, 8, 11, 21, 24, 28, 34], "lectur": [1, 5, 26], "introduct": [1, 26], "To": [1, 7, 9, 11, 20, 24, 32, 33, 34], "u": [1, 5, 27, 28, 31, 34], "stuttgart": 1, "lab": [1, 25, 27], "baxter": 1, "we": [1, 2, 4, 5, 7, 8, 9, 11, 12, 17, 18, 20, 21, 24, 26, 27, 28, 31, 34], "offer": 1, "some": [1, 6, 8, 9, 11, 13, 20, 21, 22, 23, 24, 26, 27, 28, 31, 32, 33, 34], "year": [1, 26], "And": [1, 21, 23, 24, 28, 34], "now": [1, 7, 11, 22, 24, 28, 34], "both": [1, 6, 8, 20, 22, 30, 32, 33, 34], "tu": [1, 26, 34], "berlin": [1, 26, 34], "thei": [1, 6, 8, 11, 20, 21, 23, 24, 32, 33, 34], "same": [1, 8, 10, 18, 20, 21, 23, 24, 28, 29, 33, 34], "core": [1, 7, 20, 22, 23, 25, 27, 31, 33, 34], "quit": [1, 6, 24], "differ": [1, 2, 8, 11, 12, 14, 20, 23, 24, 27, 28, 29, 33, 34], "instal": [1, 9, 27, 34], "setup": [1, 11, 13, 25, 26, 28], "exercis": [1, 25, 26, 34], "embed": 1, "below": [1, 7, 8, 19, 21, 24, 26, 28, 30, 31, 33, 34], "ar": [1, 2, 5, 6, 7, 8, 9, 10, 15, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "document": [1, 25, 29], "refer": [1, 6, 7, 8, 11, 15, 23, 24, 33], "almost": [1, 24], "ident": [1, 24, 33, 34], "how": [1, 10, 11, 20, 21, 25, 27, 28, 29, 30, 31, 32, 34], "get": [1, 7, 8, 24, 25, 27, 28, 33], "start": [1, 7, 11, 15, 17, 22, 24, 27, 28, 29, 31, 32, 33], "quick": 1, "avanc": 1, "info": [1, 33], "tutori": [1, 10, 25, 27, 28, 29, 33], "notebook": [1, 15, 27, 34], "basic": [1, 9, 11, 19, 20, 24, 25, 26, 32, 34], "configur": [1, 6, 11, 12, 13, 17, 22, 23, 24, 25, 28, 29, 32, 33], "featur": [1, 9, 10, 12, 13, 16, 25, 33], "etc": [1, 7, 8, 11, 21, 22, 24, 25, 33, 34], "frame": [1, 5, 6, 8, 11, 15, 21, 23, 24, 25, 27, 28, 32, 33], "edit": [1, 15, 22, 24, 25, 31], "manipul": [1, 15, 24, 26, 32], "komo": [1, 6, 8, 10, 12, 13, 14, 17, 25, 28, 30, 33, 34], "optim": [1, 8, 14, 17, 20, 21, 22, 25, 26, 30, 32, 33, 34], "problem": [1, 6, 8, 10, 11, 12, 17, 20, 22, 25, 26, 28, 31, 32, 33, 34], "motion": [1, 3, 6, 12, 17, 20, 24, 25, 26, 30, 33, 34], "invers": [1, 15, 20, 30], "kinemat": [1, 2, 6, 9, 15, 18, 20, 21, 22, 23, 25, 33], "merg": [1, 5, 15], "path": [1, 5, 6, 9, 11, 14, 15, 16, 18, 20, 21, 25, 32, 33, 34], "exampl": [1, 7, 15, 20, 21, 22, 24, 27, 28, 29, 31, 34], "advanc": [1, 15, 24, 25], "switch": [1, 3, 15, 25, 31, 32, 34], "skeleton": [1, 15], "sim": [1, 12, 17, 34], "interact": [1, 15, 20, 25, 31], "set": [1, 8, 9, 11, 15, 21, 23, 24, 25, 27, 28, 30, 33, 34], "spline": [1, 6, 15, 33, 34], "first": [1, 9, 12, 15, 17, 21, 22, 25, 27, 28, 29, 31, 32, 33, 34], "grap": [1, 2, 15, 28], "imag": [1, 2, 3, 5, 7, 9, 15, 25, 27, 29, 33], "webcam": [1, 15, 29], "grasp": [1, 11, 14, 15, 24, 25, 26, 28, 33], "more": [1, 8, 10, 18, 20, 21, 23, 25, 28, 29, 31, 33, 34], "direct": [1, 3, 8, 15, 17, 23, 30, 34], "nlp": [1, 6, 8, 10, 12, 15, 17, 24, 33], "formul": [1, 8, 10, 12, 15, 17, 20, 24, 34], "solv": [1, 6, 10, 11, 12, 15, 17, 20, 25, 26, 28, 30, 33, 34], "find": [1, 15, 20, 22, 24, 29, 30, 34], "script": [1, 8, 9, 10, 11, 21, 32], "materi": 1, "scene": [1, 7, 9, 20, 23, 24, 27, 28, 32], "descript": [1, 7, 8, 9, 21, 22, 23, 31, 32, 33], "transform": [1, 5, 7, 11, 20, 23, 24, 25], "coordin": [1, 5, 7, 8, 11, 20, 24, 28, 29, 33], "composit": 1, "tree": [1, 7, 9, 15, 20, 21, 24, 33], "forest": 1, "parameter": [1, 7, 20], "joint": [1, 6, 8, 23, 24, 25, 28, 33], "vector": [1, 7, 8, 11, 19, 20, 21, 24, 30, 33], "forward": [1, 7, 20, 23, 28, 33], "jacobian": [1, 8, 9, 20, 24, 28, 30, 33], "implement": [1, 8, 18, 20, 23, 24, 29, 30, 33], "engin": [1, 6, 8, 9, 11, 20, 23, 33], "placehold": 1, "3d": [1, 5, 7, 8, 11, 20, 23, 24, 28, 29], "rotat": [1, 8, 20, 21, 30], "quaternion": [1, 7, 8, 20, 21, 24, 28, 33], "graph": [1, 20, 21, 24, 25], "yaml": [1, 22], "style": [1, 33], "describ": [1, 8, 19, 20, 24, 25, 28, 30, 31, 32], "camera": [1, 2, 5, 9, 23, 27, 29, 33], "world": [1, 5, 7, 8, 11, 18, 20, 21, 24, 27, 28, 29, 30], "homogen": 1, "matrix": [1, 7, 8, 20, 23, 24, 30, 33], "p": [1, 7, 18, 21], "calibr": 1, "estim": [1, 29, 31], "k": [1, 8, 12, 13, 22, 25, 28, 33], "r": [1, 5, 7, 8, 9, 20, 21, 24], "depth": [1, 3, 4, 5, 7, 9, 25, 27, 29, 33], "data": [1, 2, 3, 20, 21, 22, 24, 27, 33], "shape": [1, 7, 8, 9, 12, 13, 17, 18, 20, 21, 24, 28, 33], "formal": [1, 20, 25, 30], "old": [1, 21, 24, 34], "simlab": [1, 25, 26], "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 25, 26, 28, 30, 31, 32, 33, 34], "3": [1, 5, 6, 7, 8, 9, 10, 11, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 31, 33, 34], "opencv": [1, 4, 25, 26, 30], "4": [1, 5, 6, 8, 10, 12, 14, 17, 21, 22, 23, 25, 26, 28, 34], "project": [1, 7, 8, 25, 26, 30, 34], "propos": [1, 25, 26], "final": [1, 6, 11, 17, 20, 21, 24, 25, 26, 28, 30, 34], "present": [1, 25, 26], "learn": [1, 11, 18, 25, 26, 31], "order": [1, 7, 8, 12, 13, 20, 25, 28, 32, 33, 34], "markov": [1, 8, 12, 25, 33, 34], "No": [1, 25], "dynam": [1, 20, 23, 25, 33], "veloc": [1, 6, 11, 20, 23, 25, 30, 33, 34], "what": [1, 21, 22, 23, 25, 28, 31, 33, 34], "main": [1, 20, 25], "step": [1, 18, 21, 25, 28, 30, 31, 32, 33, 34], "defin": [1, 6, 7, 8, 9, 10, 11, 16, 17, 20, 21, 23, 25, 28, 32, 33, 34], "roughli": [1, 10, 20, 25, 27, 34], "spec": [1, 25], "load": [1, 6, 20, 21, 25, 34], "urdf": [1, 20, 25], "practic": [1, 25, 26, 32, 34], "vari": [1, 21, 25, 28, 34], "decis": [1, 11, 20, 25, 32], "variabl": [1, 11, 20, 25], "per": [1, 25, 28, 33, 34], "time": [1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 16, 17, 18, 20, 25, 26, 28, 31, 32, 33, 34], "slice": [1, 11, 25, 28], "forc": [1, 20, 23, 25, 28, 33, 34], "contact": [1, 8, 9, 25, 33], "summari": [1, 25], "few": [1, 2, 25], "fundament": [1, 20, 25, 34], "rest": [1, 25, 26], "helper": [1, 25, 33, 34], "phase": [1, 9, 25, 28, 32], "link": [1, 6, 7, 20, 21, 23, 25, 34], "tor": [1, 25], "ad": [1, 6, 7, 8, 11, 24, 25, 28, 30, 32, 34], "copi": [1, 11, 24, 25, 27, 31, 33], "clear": [1, 2, 7, 23, 25, 31, 33], "state": [1, 8, 17, 18, 24, 25, 30, 33, 34], "select": [1, 7, 25], "activ": [1, 7, 8, 24, 25], "anyth": [1, 24, 25, 34], "might": [1, 21, 24, 25, 28, 31, 32, 33, 34], "comput": [1, 5, 7, 8, 9, 11, 12, 13, 16, 17, 24, 25, 28, 30, 31, 33, 34], "structur": [1, 2, 3, 21, 22, 24, 25, 27, 31, 33, 34], "collis": [1, 6, 11, 13, 17, 21, 24, 25, 33, 34], "function": [1, 7, 8, 16, 24, 25, 33, 34], "other": [1, 7, 8, 9, 11, 22, 24, 25, 28, 32, 34], "viewer": [1, 25, 33], "kinedit": [1, 20, 24, 25], "notat": [1, 19, 22, 24, 25], "specifi": [1, 8, 11, 12, 20, 22, 23, 24, 25, 28, 33], "type": [1, 7, 10, 11, 12, 13, 22, 24, 25, 28, 33], "physic": [1, 2, 9, 18, 20, 24, 25, 27, 33], "open": [1, 6, 9, 12, 17, 21, 22, 25, 33, 34], "close": [1, 6, 7, 9, 20, 25, 28, 30, 33, 34], "gripper": [1, 2, 6, 14, 25, 28, 30, 33], "grip": [1, 25, 30], "rgb": [1, 5, 25, 27, 29], "restart": [1, 11, 21, 25, 34], "previou": [1, 11, 13, 22, 24, 25, 28, 30, 34], "depthdata2pointcloud": [1, 25, 33], "arrai": [1, 7, 16, 20, 22, 25, 33, 34], "api": [1, 19], "argword": [1, 33], "name": [1, 5, 7, 9, 11, 13, 18, 20, 21, 23, 24, 28, 33, 34], "getcamerafxypxi": [1, 4, 5, 33], "getimageanddepth": [1, 4, 5, 33], "getimagedepthpcl": [1, 3, 5, 33], "getkeypress": [1, 3, 33], "gettimetoend": [1, 2, 6, 12, 17, 33], "get_q": [1, 2, 33], "get_qdot": [1, 33], "get_qhom": [1, 33], "get_t": [1, 33], "get_tauextern": [1, 3, 33], "gripperclos": [1, 2, 6, 33], "gripperclosegrasp": [1, 6, 33], "gripperdon": [1, 6, 33], "gripperopen": [1, 2, 3, 6, 33], "gripperpo": [1, 33], "hold": [1, 3, 23, 24, 28, 32, 33, 34], "home": [1, 2, 3, 4, 5, 6, 9, 12, 17, 24, 27, 28, 29, 30, 33, 34], "move": [1, 2, 6, 7, 8, 9, 11, 24, 27, 28, 29, 33, 34], "moveautotim": [1, 12, 17, 33], "moveto": [1, 2, 6, 33], "setcompli": [1, 3, 33], "setcontrollerwritedata": [1, 33], "stop": [1, 4, 6, 33], "sync": [1, 2, 3, 4, 5, 6, 12, 17, 33], "config": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 17, 18, 33, 34], "addconfigurationcopi": [1, 33], "addfil": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 33, 34], "addfram": [1, 3, 4, 5, 6, 7, 9, 10, 11, 12, 17, 18, 33, 34], "addobject": [1, 6, 10, 11, 12, 13, 14, 17, 18, 25, 28, 33, 34], "attach": [1, 7, 20, 21, 23, 24, 27, 33, 34], "cameraview": [1, 7, 9, 23, 33], "computecollis": [1, 8, 9, 33], "delfram": [1, 5, 7, 9, 33], "equationofmot": [1, 33], "eval": [1, 3, 6, 7, 8, 9, 10, 33, 34], "getcollis": [1, 8, 9, 33], "getdofid": [1, 33], "getfram": [1, 4, 5, 9, 33], "getframedimens": [1, 33], "getframenam": [1, 33], "getframest": [1, 7, 11, 13, 18, 33], "getjointdimens": [1, 33], "getjointnam": [1, 7, 33], "getjointst": [1, 7, 9, 12, 13, 17, 20, 33, 34], "makeobjectsconvex": [1, 33], "makeobjectsfre": [1, 33], "report": [1, 8, 20, 21, 24, 33, 34], "selectjoint": [1, 33], "selectjointsbytag": [1, 7, 8, 33], "setframest": [1, 7, 11, 13, 18, 20, 33], "setjointst": [1, 7, 8, 9, 10, 11, 12, 17, 20, 33, 34], "setjointstateslic": [1, 33], "sortfram": [1, 33], "stepdynam": [1, 33], "view": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 17, 18, 20, 28, 33, 34], "view_clos": [1, 6, 9, 33], "view_getscreenshot": [1, 33], "view_playvideo": [1, 33], "view_recopymesh": [1, 5, 33], "watchfil": [1, 9, 33, 34], "controlmod": [1, 33], "f": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 22, 24, 25, 33, 34], "setord": [1, 33], "setscal": [1, 33], "settarget": [1, 33], "addattribut": [1, 4, 33], "getattribut": [1, 33], "getmeshpoint": [1, 33], "getmeshtriangl": [1, 33], "getposit": [1, 4, 5, 7, 28, 33, 34], "getquaternion": [1, 5, 7, 33, 34], "getrelativeposit": [1, 33], "getrelativequaternion": [1, 33], "getrotationmatrix": [1, 5, 33], "getsiz": [1, 33], "setcolor": [1, 4, 5, 6, 7, 10, 11, 12, 17, 33, 34], "setcontact": [1, 4, 5, 6, 9, 33], "setjoint": [1, 33], "setmass": [1, 4, 5, 6, 18, 33], "setmeshaslin": [1, 33], "setpar": [1, 33], "setpointcloud": [1, 3, 5, 33], "setpos": [1, 4, 5, 33], "setposit": [1, 4, 5, 6, 7, 11, 33], "setquaternion": [1, 5, 33], "setrelativepos": [1, 6, 10, 33], "setrelativeposit": [1, 7, 10, 12, 17, 33, 34], "setrelativequaternion": [1, 33], "setshap": [1, 4, 5, 6, 7, 10, 11, 12, 17, 33, 34], "unlink": [1, 33], "imptyp": [1, 33], "jt": [1, 21, 33, 34], "addcontrolobject": [1, 6, 10, 12, 17, 33, 34], "addinteraction_elasticbounc": [1, 33], "addmodeswitch": [1, 14, 33], "addquaternionnorm": [1, 14, 33], "addtimeoptim": [1, 33], "clearobject": [1, 33], "getconstraintviol": [1, 14, 33], "getcost": [1, 14, 33], "getforceinteract": [1, 33], "getpath": [1, 6, 10, 12, 17, 33, 34], "getpathfram": [1, 33], "getpathtau": [1, 33], "getpath_qal": [1, 33], "getreport": [1, 11, 13, 14, 33], "gett": [1, 33], "initorg": [1, 33], "initphasewithdofspath": [1, 33], "initrandom": [1, 33], "initwithconst": [1, 33], "initwithpath_qorg": [1, 33], "initwithwaypoint": [1, 33], "reportproblem": [1, 14, 33], "setconfig": [1, 6, 10, 12, 17, 33, 34], "settim": [1, 6, 10, 12, 14, 17, 24, 33, 34], "view_plai": [1, 12, 13, 14, 33], "evalu": [1, 7, 8, 10, 20, 24, 33, 34], "getbound": [1, 33], "getdimens": [1, 33], "getfhessian": [1, 33, 34], "getfeaturetyp": [1, 33], "getinitializationsampl": [1, 33, 34], "nlp_factori": [1, 16, 33], "setbound": [1, 16, 33], "setdimens": [1, 16, 33], "setevalcallback": [1, 16, 33], "setfeaturetyp": [1, 16, 33], "testcallingevalcallback": [1, 33], "nlp_solver": [1, 6, 10, 12, 16, 17, 33, 34], "getopt": [1, 33], "gettrace_j": [1, 33], "gettrace_cost": [1, 33], "gettrace_phi": [1, 33], "gettrace_x": [1, 33], "setopt": [1, 6, 10, 12, 17, 33, 34], "setproblem": [1, 6, 10, 12, 16, 17, 33, 34], "setsolv": [1, 16, 33], "settrac": [1, 33], "nlp_solverid": [1, 16, 33], "nlp_solveropt": [1, 33], "dict": [1, 33], "set_damp": [1, 33], "set_maxstep": [1, 33], "set_muinc": [1, 33], "set_muinit": [1, 33], "set_mulbdec": [1, 33], "set_mulbinit": [1, 33], "set_mumax": [1, 33], "set_stepdec": [1, 33], "set_stepinc": [1, 33], "set_stopev": [1, 33], "set_stopftoler": [1, 33], "set_stopgtoler": [1, 33], "set_stoptoler": [1, 33], "set_verbos": [1, 33], "set_wolf": [1, 33], "ot": [1, 6, 10, 11, 12, 13, 14, 16, 17, 33, 34], "pathfind": [1, 17, 33], "setexplicitcollisionpair": [1, 33], "st": [1, 4, 5, 6, 7, 10, 11, 12, 13, 17, 18, 33, 34], "sy": [1, 5, 9, 11, 13, 14, 16, 18, 33, 34], "addimp": [1, 33], "addsensor": [1, 7, 9, 33], "closegripp": [1, 33], "getgripperisgrasp": [1, 33], "getgripperwidth": [1, 33], "getgroundtruthposit": [1, 33], "getgroundtruthrotationmatrix": [1, 33], "getgroundtruths": [1, 33], "getscreenshot": [1, 33], "getstat": [1, 18, 23, 33], "gettimetomov": [1, 33], "loadteleopcallback": [1, 33], "opengripp": [1, 30, 33], "pushconfigurationtosimul": [1, 33], "restorest": [1, 23, 33], "selectsensor": [1, 9, 33], "setmoveto": [1, 33], "setstat": [1, 18, 20, 23, 33], "simulationengin": [1, 33], "solverreturn": [1, 33], "getstartgoalpath": [1, 33], "params_add": [1, 2, 3, 6, 12, 17, 33], "params_fil": [1, 3, 33], "params_print": [1, 2, 3, 6, 33], "raipath": [1, 2, 3, 4, 5, 6, 9, 10, 12, 17, 33, 34], "setraipath": [1, 9, 33], "index": [1, 8, 34], "search": [1, 22, 34], "page": [1, 27, 31], "abstract": [2, 24, 34], "ha": [2, 7, 8, 9, 11, 20, 21, 23, 24, 28, 29, 30, 34], "which": [2, 7, 8, 9, 11, 18, 20, 21, 22, 23, 24, 27, 28, 29, 30, 32, 33, 34], "bottleneck": 2, "between": [2, 7, 8, 9, 11, 20, 21, 23, 24, 28, 31, 33, 34], "overwrit": [2, 20, 32, 33, 34], "also": [2, 7, 8, 9, 11, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 32, 33, 34], "complianc": [2, 33], "around": [2, 8, 9, 21, 25, 28, 31, 34], "oper": [2, 4, 6, 20, 24, 25, 27, 32, 34], "getimag": 2, "point": [2, 3, 5, 6, 7, 8, 20, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34], "cloud": [2, 29, 33], "run": [2, 12, 17, 18, 24, 27, 29, 31], "pure": 2, "object": [2, 6, 7, 9, 11, 12, 13, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34], "still": [2, 7, 23, 24, 26, 30, 33, 34], "pd": [2, 33], "motor": [2, 18, 33, 34], "np": [2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 16, 18], "botsim": [2, 3, 6, 12, 17], "verbos": [2, 3, 6, 8, 10, 12, 14, 17, 23, 33], "physx": [2, 3, 6, 12, 17, 18, 20, 23, 33], "motorkp": [2, 3, 6, 12, 17], "10000": [2, 3, 6, 12, 17, 33], "motorkd": [2, 3, 6, 12, 17], "1000": [2, 3, 6, 12, 17, 33], "robotmodel": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 21, 24, 27, 33, 34], "scenario": [2, 3, 4, 5, 6, 9, 10, 12, 17, 24, 34], "pandasingl": [2, 3, 6, 10], "fals": [2, 3, 4, 5, 6, 10, 11, 12, 13, 14, 17, 22, 33, 34], "workspac": [2, 3, 33], "NOT": [2, 3], "THE": [2, 3, 27], "simult": [2, 3], "bot": [2, 3, 4, 5, 6, 12, 17], "note": [2, 8, 9, 12, 17, 20, 24, 28, 29, 30, 32], "arm": [2, 13, 24, 28, 30, 34], "go": [2, 26, 33], "down": [2, 8, 14, 34], "free": [2, 13, 17, 21, 30, 33, 34], "float": [2, 24, 28, 33], "need": [2, 4, 8, 11, 16, 18, 21, 23, 24, 27, 28, 32, 33, 34], "control": [2, 18, 20, 23, 24, 25, 33, 34], "somehow": 2, "qhome": [2, 33], "q": [2, 3, 4, 7, 9, 10, 21, 24, 33, 34], "while": [2, 3, 4, 6, 9, 12, 17, 20, 24, 34], "_left": [2, 3, 6, 33], "del": [2, 3, 4, 5, 6, 9, 10, 12, 17], "exactli": [3, 9, 20, 23, 24, 32, 34], "botop1": 3, "userealrobot": 3, "true": [3, 4, 5, 6, 10, 11, 12, 13, 16, 17, 22, 33, 34], "instead": [3, 8, 9, 24, 28, 30, 33, 34], "case": [3, 11, 20, 23, 24, 28, 34], "cfg": 3, "pcl": [3, 5, 9], "camerawrist": 3, "ord": [3, 4], "break": [3, 4, 21, 33, 34], "y": [3, 5, 6, 7, 8, 9, 16, 21, 22, 23, 28, 34], "j": [3, 5, 7, 9, 16, 22, 24, 33, 34], "posit": [3, 4, 6, 7, 8, 11, 14, 20, 21, 23, 24, 28, 29, 33, 34], "l_gripper": [3, 6, 9, 10, 12, 17, 34], "pseudoinv": 3, "linalg": [3, 9], "pinv": 3, "give": [4, 24, 27, 28, 31, 34], "hit": [4, 21, 34], "window": [4, 7, 11, 13, 21, 33, 34], "cv2": 4, "cv": 4, "cap": 4, "videocaptur": 4, "captur": 4, "ret": [4, 6, 10, 12, 17, 34], "read": [4, 7, 13, 20, 21, 22, 23, 24, 27, 34], "our": [4, 11, 28, 29, 34], "come": [4, 21, 24, 34], "here": [4, 6, 8, 9, 10, 11, 13, 17, 20, 21, 22, 24, 29, 30, 31, 32, 34], "img": 4, "cvtcolor": 4, "color_bgr2grai": 4, "displai": [4, 11, 12, 17, 21, 23, 24, 29, 33, 34], "result": [4, 11, 14, 20, 21, 24, 28, 33, 34], "len": [4, 10, 12, 34], "imshow": [4, 5], "waitkei": 4, "0xff": 4, "releas": 4, "destroyallwindow": 4, "o": [4, 5, 9, 34], "_exit": [4, 9], "pandast": [4, 5, 9, 12, 17, 34], "obj": [4, 5, 20], "8": [4, 5, 6, 7, 9, 11, 24, 31, 33], "ssbox": [4, 5, 6, 7, 10, 12, 13, 17, 18, 28, 33, 34], "size": [4, 5, 6, 7, 10, 12, 13, 16, 17, 18, 21, 24, 28, 30, 33, 34], "05": [4, 5, 6, 11, 13, 21, 30, 33, 34], "005": [4, 5, 6], "fxypxi": [4, 5, 23], "camerafram": [4, 5], "tau": [4, 8, 21, 24, 33, 34], "01": [4, 6, 18, 26, 27, 30, 33, 34], "rang": [4, 5, 9, 12, 17, 18], "30": [4, 9, 14, 21, 34], "sleep": [4, 9, 12, 17, 18], "grab": [4, 11, 13, 23, 29], "sensor": [4, 23, 33], "100hz": 4, "render": [4, 20, 27, 33], "slow": [4, 14], "color_bgr2rgb": 4, "5": [4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 21, 22, 24, 31, 33, 34], "chang": [4, 7, 8, 9, 10, 11, 20, 21, 24, 27, 28, 29, 33, 34], "central": [4, 10], "add": [4, 7, 9, 10, 11, 13, 20, 23, 24, 27, 28, 33, 34], "addit": [4, 23, 24, 28, 33, 34], "r_grippercamera": 4, "r_gripper": [4, 9, 12, 17, 28, 30, 32, 34], "focallength": [4, 7, 9, 23, 33], "895": 4, "width": [4, 7, 9, 22, 23, 33, 34], "640": [4, 9, 33], "height": [4, 7, 9, 23, 33, 34], "360": [4, 33], "_": [4, 5, 32, 34], "cell": [5, 11, 18], "cell_typ": 5, "markdown": 5, "metadata": 5, "vision": [5, 26], "n": [5, 7, 8, 9, 16, 20, 22, 24, 33, 34], "execution_count": 5, "null": [5, 34], "91746f55": 5, "11c2": 5, "4591": 5, "a337": 5, "4155376e7596": 5, "output": [5, 21, 34], "osn": 5, "append": [5, 9, 11, 13, 18, 22, 33, 34], "expandus": [5, 34], "build": [5, 9, 11, 13, 14, 16, 18, 20, 28, 29, 30], "libri": [5, 9, 11, 13, 14, 16, 18, 21, 34], "ryn": 5, "npn": 5, "timen": 5, "pyplot": 5, "plt": 5, "f18925ed": 5, "mycamera": 5, "marker": [5, 6, 33, 34], "55da8f34": 5, "1bd73706": 5, "2f9b": 5, "4c4d": 5, "93bd": 5, "cdba581408b7": 5, "fig": [5, 34], "figur": [5, 28, 31, 34], "figsiz": 5, "10": [5, 6, 9, 13, 21, 24, 31, 33, 34], "ax": [5, 8, 34], "subplot": 5, "matshow": 5, "show": [5, 7, 9, 11, 31, 34], "ce65b01b": 5, "9811": 5, "496c": 5, "9774": 5, "1589d5455deb": 5, "slide": [5, 24, 26, 30, 31, 34], "learnedn": 5, "hat": [5, 34], "x": [5, 6, 7, 8, 12, 16, 17, 18, 20, 21, 22, 23, 24, 28, 30, 32, 33, 34], "frac": [5, 8, 34], "z": [5, 7, 8, 11, 21, 22, 28, 30, 34], "p_x": [5, 7], "p_y": [5, 7], "wheren": 5, "pixel": [5, 23, 29, 34], "repres": [5, 7, 11, 20, 21, 22, 24, 27, 33, 34], "andn": 5, "offset": [5, 34], "sinc": [5, 34], "know": [5, 23, 27, 33, 34], "valu": [5, 8, 11, 21, 22, 23, 34], "each": [5, 6, 8, 11, 20, 21, 23, 24, 27, 29, 30, 31, 32, 33, 34], "426eb3b6": 5, "shapen": 5, "cc08f354": 5, "0e4d": 5, "475b": 5, "8af5": 5, "ebff63533142": 5, "fx": 5, "fy": 5, "px": 5, "h": [5, 6, 8, 22, 23, 24, 27, 34], "w": [5, 7, 8, 23, 24, 34], "ctmp": 5, "zero": [5, 6, 7, 8, 9, 11, 20, 21, 24, 28, 33, 34], "continuen": 5, "sign": [5, 24, 34], "flipe": 5, "right": [5, 7, 8, 28, 32, 34], "downn": 5, "zn": 5, "tn": 5, "tmp": 5, "pc": 5, "str": [5, 33], "sphere": [5, 6, 7, 11, 21, 28, 29, 30, 33, 34], "02": [5, 7, 10, 12, 13, 17, 18, 21, 26, 27, 34], "255": 5, "1a9d2d8a": 5, "07ae": 5, "4dc3": 5, "afa5": 5, "3c90ac7d2b8": 5, "c2": [5, 33], "pclframe": 5, "see": [5, 8, 20, 24, 28, 29, 30, 31, 33, 34], "overlai": [5, 34], "truthn": 5, "6e222a0a": 5, "72179b41": 5, "cfdb8d55": 5, "botn": 5, "60ecc8d4": 5, "kernelspec": 5, "display_nam": 5, "ipykernel": 5, "languag": [5, 21, 25, 34], "language_info": 5, "codemirror_mod": 5, "ipython": 5, "file_extens": 5, "mimetyp": 5, "text": [5, 8, 11, 21, 24, 27, 31, 34], "nbconvert_export": 5, "pygments_lex": 5, "ipython3": 5, "nbformat": 5, "nbformat_minor": 5, "where": [6, 7, 9, 11, 21, 22, 24, 28, 29, 30, 32, 33, 34], "waypoint": [6, 33, 34], "ik": [6, 10, 11, 12, 17, 25, 30, 33], "constraint": [6, 7, 10, 11, 12, 14, 20, 24, 28, 32, 34], "over": [6, 7, 10, 12, 20, 24, 29, 32, 34], "sequenc": [6, 12, 20, 24, 28, 32, 34], "two": [6, 8, 11, 20, 21, 23, 24, 27, 28, 31, 32, 33, 34], "rigidli": [6, 21, 34], "constrain": [6, 11, 17, 24, 28, 33], "6d": 6, "endeff": [6, 20, 24], "pose": [6, 7, 8, 10, 17, 20, 21, 23, 24, 28, 30, 33, 34], "For": [6, 11, 20, 24, 28, 29, 31, 34], "conveni": [6, 20, 24, 34], "been": [6, 23, 24], "common": [6, 34], "pattern": 6, "rel": [6, 7, 11, 20, 21, 24, 33, 34], "solver": [6, 8, 16, 23, 24, 28, 33, 34], "return": [6, 8, 12, 16, 20, 23, 28, 29, 33, 34], "pipelin": [6, 21, 29, 30, 34], "hard": [6, 33, 34], "sec": 6, "them": [6, 8, 11, 20, 21, 26, 29, 31, 34], "transit": [6, 24], "smoothli": [6, 24], "through": [6, 27], "In": [6, 7, 8, 11, 20, 21, 23, 24, 26, 28, 29, 30, 31, 34], "broken": [6, 33], "again": [6, 7, 20, 24, 28, 30, 34], "fall": [6, 28, 29], "angulardamp": 6, "defaultfrict": 6, "100": [6, 18], "cpp": [6, 8, 34], "101": 6, "messag": [6, 33], "34": 6, "hello": [6, 27], "lgp": 6, "camerafocu": 6, "stoptim": 6, "300": 6, "stopsol": 6, "6": [6, 8, 22, 34], "opt": [6, 12], "maxstep": [6, 33], "boundednewton": 6, "multibodi": 6, "025": 6, "box": [6, 8, 14, 25, 28, 33, 34], "25": [6, 10, 13, 31], "675": 6, "manual": [6, 20, 21, 24, 32, 34], "way0": 6, "way1": 6, "d": [6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 25, 34], "90": [6, 7, 9, 21, 34], "86": 6, "7": [6, 7, 8, 11, 20, 21, 22, 24, 28, 33, 34], "1e": [6, 9, 10, 12, 14, 17, 24, 34], "accumulatedcollis": [6, 8, 9, 10, 12, 13, 17, 33, 34], "eq": [6, 8, 10, 11, 12, 13, 14, 17, 24, 33, 34], "jointlimit": [6, 8, 10, 12, 13, 17, 33, 34], "ineq": [6, 8, 10, 11, 12, 13, 17, 24, 33, 34], "posediff": [6, 8, 33, 34], "1e1": [6, 10, 12, 17, 24, 34], "stoptoler": [6, 10, 12, 17, 33, 34], "augmentedlagrangian": 6, "bound": [6, 24, 33, 34], "mu": 6, "nu": 6, "mulb": 6, "newton": [6, 7, 16, 24, 33, 34], "initi": [6, 11, 20, 21, 23, 24, 28, 33, 34], "93": 6, "1593": 6, "alpha": [6, 34], "beta": 6, "delta": [6, 34], "69": 6, "6169": 6, "accept": 6, "47": 6, "7566": 6, "28": 6, "1096": 6, "11": [6, 34], "4588": 6, "02281": 6, "0943": 6, "170104": 6, "57494": 6, "0579509": 6, "9": [6, 13, 14, 34], "52862": 6, "0238862": 6, "52229": 6, "39": 6, "absmax": 6, "016744": 6, "18": 6, "feasibl": [6, 33], "37426": 6, "000145596": 6, "elta": 6, "lt": 6, "option": [6, 8, 11, 23, 24, 33, 34], "94215": 6, "24621": 6, "750159": 6, "deltaconverg": 6, "00314": 6, "5031": 6, "10763": 6, "12": [6, 34], "34517": 6, "0250832": 6, "13": [6, 11, 34], "33636": 6, "0132012": 6, "14": [6, 11], "33499": 6, "00671988": 6, "15": [6, 11, 12, 17, 21, 30, 31, 34], "33466": 6, "20162": 6, "211307": 6, "219168": 6, "53258": 6, "0376555": 6, "16": 6, "37467": 6, "00825317": 6, "37395": 6, "36729": 6, "00768814": 6, "0459086": 6, "37595": 6, "125": 6, "00476621": 6, "3742": 6, "stoppingcriterion": 6, "solut": [6, 10, 11, 12, 13, 17, 24, 27, 32], "linear": [6, 10, 16, 19, 24, 34], "interpol": [6, 33], "end": [6, 8, 11, 20, 24, 28, 32, 33, 34], "07": 6, "detail": [7, 10, 20, 24, 25, 33, 34], "doc": [7, 11, 24, 27, 29, 33], "io": [7, 27, 29], "cours": [7, 24, 25, 27, 28, 29, 30, 31, 34], "empti": [7, 33], "tip": [7, 28], "make": [7, 8, 21, 22, 24, 28, 29, 30, 31, 33, 34], "appear": [7, 24, 32, 34], "alwai": [7, 9, 11, 13, 18, 21, 23, 24, 28, 29, 30, 34], "top": [7, 11, 13, 24, 34], "click": 7, "bar": [7, 34], "thing": [7, 20, 21, 24, 30, 31, 32, 34], "model": [7, 14, 20, 21, 22, 24, 28, 29, 30, 34], "pr2": [7, 8, 11, 13], "kitchen": [7, 8, 11, 13, 21, 34], "updat": [7, 20, 21, 23, 28, 29, 30, 34], "ball": [7, 21, 25, 34], "One": [7, 24, 34], "convex": [7, 8, 24, 28, 33, 34], "mesh": [7, 8, 21, 24, 33, 34], "just": [7, 8, 9, 20, 21, 23, 24, 30, 31, 33, 34], "pass": [7, 8, 12, 17, 24, 34], "vertex": [7, 22, 34], "swept": [7, 28, 30], "capsul": [7, 10, 21, 28, 33, 34], "hand": [7, 8, 11, 21, 23, 24, 28, 34], "parent": [7, 8, 9, 13, 18, 20, 21, 22, 33, 34], "pr2l": [7, 11, 13], "last": [7, 24, 30, 33, 34], "new": [7, 21, 24, 27, 28, 29, 30, 33, 34], "anoth": [7, 11, 21, 22, 24, 28, 32, 34], "mean": [7, 8, 11, 21, 22, 24, 28, 29, 32, 33, 34], "perman": 7, "po": [7, 11, 13, 18, 33, 34], "quat": [7, 33, 34], "rot": [7, 34], "interpret": [7, 21, 34], "orient": [7, 8, 20, 21, 24, 28, 30, 34], "todo": [7, 8, 9, 10, 11, 13, 15, 18, 20, 23, 33], "getter": 7, "setter": 7, "framec": [7, 34], "njacobian": [7, 34], "target": [7, 8, 11, 21, 24, 25, 33, 34], "scale": [7, 8, 11, 12, 24, 25, 33, 34], "1x3": 7, "everi": [7, 29, 34], "7d": [7, 8, 33, 34], "qw": 7, "qx": 7, "qy": 7, "qz": 7, "th": [7, 24], "row": [7, 34], "transfrom": 7, "child": [7, 9, 20, 21, 24, 33, 34], "degre": [7, 9, 20, 21, 24, 33, 34], "freedom": [7, 9, 20, 24, 33, 34], "dof": [7, 8, 20, 21, 23, 24, 33, 34], "total": [7, 20, 31, 33, 34], "dimension": [7, 8, 11, 16, 24, 33, 34], "impli": [7, 8, 28, 34], "chain": [7, 21, 24, 34], "allow": [7, 9, 20, 21, 22, 23, 24, 28, 30, 33, 34], "inconsist": [7, 20, 34], "imposs": 7, "assign": 7, "onto": [7, 8, 24, 34], "actual": [7, 20, 21, 22, 23, 24, 30, 32, 34], "let": [7, 8, 11, 13, 24, 28, 30, 32, 34], "contain": [7, 22, 23, 24, 34], "store": [7, 11, 17, 20, 23, 29, 34], "p_z": 7, "q_w": 7, "q_x": 7, "q_y": 7, "q_z": 7, "x0": [7, 11, 13], "question": [7, 31, 34], "number": [7, 23, 24, 28, 33, 34], "non": [7, 10, 11, 16, 21, 24, 33, 34], "normal": [7, 8, 20, 22, 24, 34], "These": [7, 24, 34], "out": [7, 13, 20, 22, 23, 24, 28, 34], "consist": [7, 20, 24, 34], "hingex": [7, 21, 33, 34], "alik": 7, "mess": 7, "bring": [7, 9, 20, 29], "back": [7, 8, 11, 34], "befor": [7, 11, 23, 24, 28, 29, 30, 33, 34], "harsh": 7, "setfram": 7, "often": [7, 11, 20, 23, 24, 34], "would": [7, 11, 20, 24, 28, 31, 34], "choos": [7, 24, 28, 30, 34], "sub": [7, 20, 22, 24, 31, 34], "full": [7, 11, 19, 21, 24, 28, 32, 33, 34], "entri": [7, 24, 32, 33, 34], "affect": 7, "arml": 7, "base": [7, 8, 9, 17, 20, 22, 24, 25, 27, 33, 34], "differenti": [7, 8, 11, 16, 21, 24, 33, 34], "map": [7, 8, 11, 24, 26, 33, 34], "starndard": 7, "endeffector": [7, 24], "distanc": [7, 8, 10, 11, 13, 20, 24, 28, 33, 34], "penetr": [7, 8, 9, 24, 28, 33, 34], "b": [7, 21, 22, 25, 34], "But": [7, 9, 20, 21, 24, 28, 31, 34], "error": [7, 8, 20, 21, 23, 34], "euler": [7, 21, 34], "equat": [7, 20, 24, 34], "energi": [7, 33], "system": [7, 20, 21, 24, 26, 31, 34], "left": [7, 8, 11, 28, 32, 34], "linearli": [7, 11, 34], "f2": 7, "head": [7, 9], "associ": [7, 9, 20, 23, 33, 34], "head_tilt_link": [7, 9], "arg": [7, 9, 14, 33], "180": [7, 9], "iv": 7, "imageview": [7, 9], "frameattach": [7, 9, 33], "600": [7, 9], "400": [7, 9], "computeimageanddepth": [7, 9], "head_pan_joint": [7, 9], "updateconfig": [7, 9], "destroi": [7, 9, 33], "handl": [7, 8, 9, 24, 34], "reassign": [7, 9], "remov": [7, 8, 9, 11, 13, 21, 24, 28, 33, 34], "provid": [8, 16, 19, 24, 34], "list": [8, 9, 21, 22, 24, 32, 33, 34], "proxim": [8, 33], "accumul": 8, "measur": [8, 24], "specif": [8, 11, 21, 24, 26, 27, 28, 29, 34], "pair": [8, 9, 22, 24, 28, 34], "geometr": [8, 24, 32], "wit": 8, "scalar": [8, 11, 24, 28, 34], "its": [8, 9, 11, 20, 21, 24, 27, 32, 33, 34], "coll": 8, "proxi": 8, "automat": [8, 20, 21, 24, 32, 34], "redo": [8, 11], "inform": [8, 20, 21, 24, 28, 33, 34], "detect": [8, 9], "swift": [8, 33], "check": [8, 11, 24, 33, 34], "deactiv": [8, 9, 20], "nuissanc": 8, "flag": [8, 9], "default": [8, 22, 24, 28, 33, 34], "neg": [8, 9, 24, 28, 34], "activatecollisionpair": 8, "deactivatecollisionpair": 8, "modifi": [8, 11, 22, 24, 28, 34], "interest": [8, 24, 28, 34], "queri": [8, 23, 28, 33, 34], "gjk": [8, 20], "algorithm": [8, 9, 20, 34], "dist": 8, "coll_wrist_r": 8, "_10": 8, "becaus": [8, 24], "typic": [8, 11, 20, 21, 22, 23, 24, 28, 33, 34], "put": [8, 9, 11], "inequ": [8, 11, 24, 25, 33, 34], "geometri": 8, "easili": [8, 20, 34], "request": 8, "help": [8, 24, 30, 31, 33, 34], "assum": [8, 20, 24, 29, 33, 34], "singl": [8, 11, 12, 20, 24, 28, 33, 34], "x_1": [8, 24, 34], "x_t": [8, 24], "x_i": [8, 34], "mathbb": [8, 20, 24, 34], "phi": [8, 20, 24, 33, 34], "mapsto": [8, 34], "space": [8, 11, 24, 25, 33, 34], "x_0": [8, 34], "x_2": [8, 34], "x_k": 8, "most": [8, 24, 28, 31, 34], "access": [8, 9, 11, 23, 27, 29, 33, 34], "via": [8, 9, 21, 24, 27, 34], "symbol": [8, 24, 32, 34], "declar": [8, 21, 23, 24, 34], "blob": [8, 11, 24], "master": [8, 15, 21, 24, 29, 34], "kin": [8, 21, 24, 34], "featuresymbol": [8, 24, 33, 34], "tabl": [8, 9, 10, 12, 14, 17, 21, 24, 34], "respect": [8, 22, 34], "o1": [8, 34], "positiondiff": [8, 9, 10, 11, 12, 13, 14, 17, 33, 34], "o2": [8, 34], "positionrel": [8, 10, 11, 28, 33, 34], "4d": [8, 34], "nbsphinx": 8, "math": [8, 20, 34], "footnot": [8, 34], "There": [8, 21, 24, 27, 28, 34], "wai": [8, 11, 13, 20, 22, 23, 24, 28, 33, 34], "invari": [8, 24, 34], "si": 8, "gn": 8, "properli": [8, 21, 23, 28, 34], "quaterniondiff": [8, 33, 34], "quaternionrel": [8, 33, 34], "poserel": [8, 33, 34], "vectorx": [8, 33, 34], "axi": [8, 21, 28, 30, 34], "vectorxdiff": [8, 33, 34], "abov": [8, 9, 28, 30, 32, 33, 34], "vectorxrel": [8, 33, 34], "seend": [8, 34], "vectori": [8, 33, 34], "scalarproductxx": [8, 14, 33, 34], "product": [8, 11, 24, 28, 34], "fo": [8, 34], "scalarproduct": [8, 28, 34], "gazeat": [8, 33, 34], "2d": [8, 34], "origin": [8, 24, 28, 29, 34], "xy": [8, 24, 34], "plane": [8, 34], "angularvel": [8, 33, 34], "angular": [8, 24, 34], "across": [8, 22, 34], "sum": [8, 9, 11, 24, 33, 34], "noth": [8, 24, 34], "collid": [8, 20, 28, 34], "limit": [8, 20, 23, 24, 34], "ok": [8, 31, 34], "qitself": [8, 12, 13, 14, 28, 33, 34], "abovebox": [8, 33, 34], "insid": [8, 33, 34], "insidebox": [8, 33, 34], "standingabov": [8, 33, 34], "fs_": [8, 34], "drive": [8, 33, 34], "redefin": [8, 11, 33, 34], "becom": [8, 9, 11, 20, 24, 33, 34], "texttt": [8, 34], "cdot": [8, 34], "dim": [8, 11, 34], "usual": [8, 9, 21, 24, 34], "1st": [8, 34], "oder": [8, 34], "2nd": [8, 21, 24, 28, 34], "x_3": [8, 34], "equiv": [8, 24, 34], "handr": 8, "10centimet": 8, "sai": [8, 31, 34], "finger": [8, 18, 28], "equal": [8, 11, 20, 22, 24, 28, 33, 34], "align": [8, 24, 30, 34], "scalarproductxi": [8, 33], "scalarproductxz": [8, 10, 11, 33], "orthogon": [8, 30, 34], "much": [8, 17, 24, 31, 34], "robust": [8, 21, 34], "good": [8, 30, 31, 34], "gradient": [8, 34], "optimum": [8, 34], "meant": [8, 19, 27], "indic": [8, 20, 24, 29, 33, 34], "rho_k": 8, "whether": [8, 22, 24, 34], "squar": [8, 11, 24, 33, 34], "pi_k": 8, "subseteq": [8, 24], "Then": [8, 11, 17, 21, 24, 27, 28, 29, 30, 34], "given": [8, 9, 17, 20, 23, 24, 28, 32, 33, 34], "phi_1": 8, "phi_k": 8, "x_n": [8, 34], "mathemat": [8, 10, 16, 20, 24, 32, 33, 34], "program": [8, 10, 16, 20, 24, 32, 33, 34], "begin": [8, 24, 34], "min_": [8, 24, 34], "sum_": 8, "x_": [8, 24, 34], "mathopforall_": 8, "le": [8, 24, 34], "quad": [8, 24, 33, 34], "mini": [9, 34], "command": [9, 21, 23, 24, 28, 30, 33, 34], "editor": [9, 21, 24, 33, 34], "being": [9, 24, 34], "redisplai": 9, "whenev": [9, 21, 24, 33, 34], "save": [9, 21, 33, 34], "trivial": [9, 22, 24, 27, 33, 34], "anim": [9, 20, 27, 33, 34], "reload": [9, 21, 33, 34], "extern": [9, 27, 33, 34], "coupl": [9, 24], "those": [9, 21, 24, 29, 34], "pre": [9, 28, 34], "mtoussai": [9, 26], "simpl": [9, 21, 24, 27, 28, 29, 31, 34], "prefix": [9, 24], "bit": [9, 28, 34], "sin": [9, 34], "configurationview": 9, "setconfigur": [9, 11], "far": [9, 24, 28, 30, 34], "broadphas": [9, 20, 33], "evalfeatur": 9, "r_grippercent": 9, "l_grippercent": 9, "vel": [9, 33], "inv": 9, "ey": [9, 16], "belowmargin": [9, 33], "integ": 9, "contribut": [9, 34], "topolog": [9, 33], "distant": 9, "warn": 9, "broad": 9, "cannot": [9, 23, 24, 34], "were": [9, 20, 24, 31, 34], "dure": [9, 24, 26, 28, 29, 31], "recreat": [9, 28], "fresh": [9, 27], "without": [9, 24, 28, 33, 34], "realli": [9, 20, 24, 27, 28, 33, 34], "approach": [9, 28, 34], "nvisii": 9, "export": [9, 21, 34], "vimg": 9, "vseg": 9, "segmentationview": 9, "vpcl": 9, "pointcloudview": 9, "kinect": 9, "endeffkinect": 9, "480": 9, "580": 9, "50": 9, "seg": 9, "computesegment": 9, "computepointcloud": 9, "segment": [9, 29], "head_tilt_joint": 9, "panda_clean": 9, "encod": [9, 21, 24, 34], "utf": 9, "fil": 9, "safe_load": 9, "illustr": 10, "cost": [10, 11, 12, 14, 24, 33, 34], "ani": [10, 20, 21, 22, 24, 28, 31, 34], "explain": [10, 11, 18, 21, 24, 27, 28, 31, 34], "setconfid": 10, "insert": [10, 34], "pointer": [10, 11, 24], "stick": [10, 32], "03": [10, 11, 26, 28, 34], "40": [10, 24, 28], "l_palm": 10, "At": 11, "bottom": [11, 32, 34], "concept": [11, 20, 24, 26], "lock": [11, 13], "simplic": [11, 34], "goal": [11, 17, 26, 28, 29, 31, 33], "yellow": [11, 34], "komo_ik": 11, "random": 11, "best": [11, 13, 21, 22, 24, 34], "retriev": [11, 30, 34], "locat": [11, 21, 24, 34], "iter": [11, 24, 29, 30, 34], "execut": [11, 24, 32, 33], "intern": [11, 21, 23, 24, 33, 34], "reoptim": 11, "nois": [11, 23], "novel": [11, 34], "pr2r": [11, 13], "20cm": 11, "straight": [11, 23], "front": [11, 34], "vectorzdiff": [11, 33], "scalarproductzz": [11, 33], "redund": [11, 21, 24, 34], "rather": [11, 17, 19, 20, 21, 22, 24, 30, 34], "either": [11, 21, 28, 30, 32, 34], "term": [11, 24, 31, 33, 34], "dimens": [11, 20, 34], "instanc": [11, 20, 24, 26, 28, 34], "15th": 11, "overal": [11, 21, 34], "keyword": [11, 22, 34], "tell": [11, 23, 34], "conf": 11, "feat": [11, 24], "interv": [11, 20, 24, 28, 32, 34], "than": [11, 17, 19, 20, 21, 24, 29, 34], "avoid": [11, 24, 28, 30], "especi": [11, 24], "acceler": [11, 20, 23, 24, 25, 31, 33, 34], "tupl": [11, 24, 33, 34], "consecut": [11, 20, 24], "impos": [11, 24, 28], "Or": [11, 20, 29], "correspond": [11, 34], "natur": [11, 24, 34], "esp": [11, 23, 24, 30, 34], "posdiff": 11, "posrel": 11, "aim": [11, 20, 24], "constant": [11, 24, 28, 30, 32], "rescal": 11, "aris": [11, 34], "signific": 11, "impact": 11, "converg": [11, 34], "behavior": [11, 26, 31], "As": [11, 22, 23, 24, 28, 34], "guid": [11, 21, 24, 34], "treat": [11, 34], "penalti": [11, 24, 34], "squaredpenalti": [11, 33], "made": [11, 27, 33, 34], "reason": [11, 20, 24, 28, 34], "approxim": [11, 23, 24, 34], "effici": [11, 24, 34], "auglag": 11, "precis": [11, 20, 24, 33, 34], "cylind": [11, 28, 33], "l_gripper_l_finger_joint": 11, "veri": [12, 24, 27, 31, 32, 34], "similarli": [12, 21, 23, 34], "confus": [12, 34], "argument": [12, 23, 24, 28, 32, 33, 34], "simpli": [12, 17, 19, 20, 21, 27, 34], "plai": [12, 17, 25, 28, 31, 34], "q0": [12, 17, 21, 34], "boxr": [12, 17, 34], "boxl": [12, 17, 34], "20": [12, 13, 24, 26, 33], "perhap": [13, 24, 31, 34], "item1": 13, "sink1": 13, "52": 13, "color": [13, 18, 21, 22, 25, 33, 34], "item2": 13, "trai": 13, "stove1": 13, "42": 13, "touch": [13, 24, 25, 32, 33], "obj1": [13, 28], "komo_path": 13, "1e2": [13, 14], "endeffworkspac": 13, "1e0": [13, 24], "my": [13, 28], "analyz": [13, 24], "19": 13, "model2": 14, "setmodel": [14, 24], "add_qcontrolobject": [14, 28], "stabl": [14, 24, 33], "vectorz": [14, 33], "up": [14, 20, 21, 24, 27, 31, 32, 33, 34], "place": [14, 24, 26, 32, 34], "08": 14, "checkgradi": 14, "miss": [14, 23], "topboxgrasp": [14, 33], "box2": 14, "downup": [14, 33], "poseeq": [14, 33], "target2": 14, "setskeleton": 14, "download": 15, "own": [15, 20, 24, 27, 34], "independ": 16, "variou": [16, 20, 21, 24, 34], "signatur": [16, 34], "def": 16, "sqrpot": 16, "getlog_x": 16, "getlog_cost": 16, "sampl": [17, 30, 33], "rrt": [17, 33], "easier": 17, "qt": 17, "jointli": 17, "current": [17, 21, 23, 24, 28, 30, 33, 34], "bi": 17, "narrow": 18, "thread": 18, "sometim": [18, 21, 24, 30, 34], "low": 18, "level": [18, 20, 24, 31, 34], "reinforc": [18, 31], "environ": [18, 20, 27], "multi": [18, 20], "bodi": [18, 20, 34], "gain": 18, "friction": 18, "graviti": [18, 33], "compens": 18, "block": [18, 21, 32, 34], "45": 18, "fail": 18, "bullet": [18, 20, 23, 31, 33], "comment": [18, 22, 24], "mk": 18, "multipl": [18, 20, 21, 28, 30, 33, 34], "It": [18, 20, 21, 23, 24, 27, 34], "reset": [18, 24], "concern": [19, 24, 32, 34], "inherit": 19, "std": 19, "algebra": [19, 34], "lapack": 19, "eigen": 19, "well": [19, 24, 28, 33, 34], "concis": [19, 34], "closer": 19, "matlab": 19, "sheet": 19, "focuss": 19, "special": [19, 20, 21, 22, 24, 34], "synopsi": 20, "similar": [20, 24, 34], "graphic": 20, "essenti": [20, 24, 34], "inertia": 20, "further": [20, 22, 24, 28, 34], "angl": [20, 21, 24, 34], "togeth": [20, 31], "form": [20, 21, 34], "represent": [20, 24, 26, 33, 34], "appli": [20, 23, 29], "numer": [20, 23, 24], "quantiti": [20, 24], "about": [20, 21, 24, 26, 28, 29, 31, 34], "could": [20, 28, 31, 32, 34], "nearest": 20, "involv": [20, 30, 34], "under": [20, 34], "newtonian": 20, "discret": [20, 23, 24], "although": 20, "semant": [20, 24, 33, 34], "perform": [20, 27, 34], "trajectori": [20, 24, 34], "opengl": [20, 23, 27], "format": [20, 21, 22, 34], "collada": [20, 21, 34], "rigid": [20, 21, 33, 34], "se": [20, 34], "mai": [20, 21, 22, 24, 31, 34], "write": [20, 33, 34], "nabla_x": 20, "role": 20, "tool": [20, 21, 24, 31, 34], "urdf2rai": [20, 21, 24, 34], "requir": [20, 21, 22, 24, 34], "fix": [20, 21, 24, 28, 34], "root": [20, 21, 34], "selet": 20, "quirk": 20, "ignor": [20, 34], "hing": [20, 21, 34], "interestingli": 20, "extract": [20, 34], "along": [20, 28, 34], "freeli": [20, 34], "possibl": [20, 28, 31, 32, 34], "potenti": [20, 21, 24, 25, 26, 34], "fcl": [20, 33], "lower": [20, 24, 28], "ccd": 20, "trigger": [20, 28, 33], "f_accumulatedcolls": 20, "explicitli": [20, 23, 24, 28, 34], "ensureproxi": 20, "ompl": 20, "relat": [20, 24, 34], "recurs": 20, "collect": [20, 34], "filter": [20, 29], "cont": 20, "properti": [20, 21, 33, 34], "int": [20, 24, 33], "within": [20, 23, 29, 33, 34], "upward": [20, 34], "supp": 20, "matric": [20, 34], "engergi": 20, "residu": [20, 30], "desir": [20, 30, 34], "absolut": [20, 21, 33, 34], "propag": 20, "loop": [20, 28, 29, 30, 34], "Such": [20, 24], "therebi": [20, 24, 34], "classic": 20, "introduc": [20, 21, 23, 24, 26, 34], "whatev": 20, "altern": [20, 24, 27, 28, 34], "reffram": 20, "everli": [21, 34], "node": [21, 22, 34], "attribut": [21, 22, 23, 32, 33, 34], "previous": [21, 34], "omit": [21, 34], "taken": [21, 34], "stem": [21, 34], "mass": [21, 34], "joint1_pr": [21, 34], "joint1": [21, 34], "arm1": [21, 34], "arm2": [21, 34], "eff": [21, 34], "joint2": [21, 34], "joint3": [21, 34], "001": [21, 34], "line": [21, 24, 27, 34], "length": [21, 23, 24, 28, 34], "radiu": [21, 28, 34], "inerti": [21, 34], "4th": [21, 34], "meter": [21, 23, 34], "degress": [21, 34], "short": [21, 34], "arm3": [21, 34], "retrospect": [21, 34], "implicitli": [21, 34], "joint2_pr": [21, 34], "chile": [21, 34], "underli": [21, 34], "bin": [21, 24, 32, 34], "cmake": [21, 24, 34], "otherwis": [21, 23, 24, 34], "somefil": [21, 34], "equival": [21, 34], "repeatedli": [21, 34], "look": [21, 34], "clean": [21, 24, 34], "prune": [21, 34], "keep": [21, 24, 30, 33, 34], "notic": [21, 34], "continu": [21, 28, 30, 32, 34], "enter": [21, 34], "enforc": [21, 25, 33, 34], "littl": [21, 28, 29, 30, 34], "tri": [21, 34], "catch": [21, 34], "syntax": [21, 32, 34], "crash": [21, 31, 34], "convert": [21, 23, 24, 29, 34], "convers": [21, 34], "partial": [21, 24, 34], "fiddl": [21, 24, 34], "correct": [21, 24, 34], "hole": [21, 24, 34], "meshlab": [21, 24, 34], "compress": [21, 24, 34], "ply": [21, 24, 34], "hubo": [21, 24, 34], "howto": [21, 24, 34], "sh": [21, 24, 34], "manag": [21, 33, 34], "bremenkitchen": [21, 34], "unreal": [21, 34], "json": [21, 22, 34], "gltf": [21, 34], "augment": [21, 34], "extra": [21, 34], "articul": [21, 34], "p1": [21, 34], "p2": [21, 34], "p3": [21, 34], "q1": [21, 34], "q2": [21, 34], "q3": [21, 34], "intuit": [21, 34], "human": [21, 34], "bracket": [21, 34], "turtl": [21, 34], "translat": [21, 24, 32], "_radians_": [21, 34], "_degrees_": [21, 34], "roll": [21, 34], "pitch": [21, 34], "yaw": [21, 34], "enum": [21, 24, 34], "jointtyp": [21, 33, 34], "avail": [21, 24, 34], "hingei": [21, 33, 34], "hingez": [21, 33, 34], "transx": [21, 33, 34], "transi": [21, 33, 34], "transz": [21, 33, 34], "transxi": [21, 33, 34], "trans3": [21, 33, 34], "transxyphi": [21, 33, 34], "univers": [21, 27, 33, 34], "quatbal": [21, 33, 34], "phitransxi": [21, 33, 34], "xball": [21, 33, 34], "seem": [21, 24, 34], "mark": [21, 34], "separ": [21, 22, 23, 27, 34], "sit": [21, 34], "kei": [22, 24, 33, 34], "dictionari": [22, 34], "turn": [22, 34], "mix": 22, "hierarch": [22, 34], "ideal": [22, 24, 30, 31], "xml": 22, "kind": [22, 24, 31], "logic": [22, 32, 34], "factor": [22, 24, 34], "understand": [22, 28, 34], "clarifi": 22, "hopefulli": 22, "self": [22, 33], "explanatori": 22, "boolean": [22, 34], "none": [22, 23, 33, 34], "edg": [22, 34], "hyperedg": [22, 34], "subgraph": [22, 34], "blue": [22, 34], "red": [22, 29, 30, 34], "string": [22, 33, 34], "mt": [22, 34], "except": [22, 24, 34], "mod": [22, 34], "txt": [22, 27, 33, 34], "filetoken": [22, 34], "1234": [22, 34], "doubl": [22, 24, 34], "arr": [22, 24, 28, 33, 34], "deprec": [22, 34], "bool": [22, 33, 34], "pars": [22, 34], "b0": [22, 34], "b1": [22, 34], "b2": [22, 34], "b3": [22, 34], "hallo": [22, 34], "filenam": [22, 34], "org": [22, 24, 29, 34], "take": [22, 24, 32, 33, 34], "delet": [22, 34], "tag": [22, 33, 34], "otherstr": [22, 34], "newattribut": [22, 34], "example_includ": [22, 34], "strang": [22, 34], "parentgraph": [22, 34], "connect": [22, 34], "knowledg": [22, 34], "adverseri": 23, "imp": [23, 30], "callback": [23, 30], "perturb": [23, 30], "signal": [23, 29], "choic": [23, 24], "distinguish": [23, 24], "govern": 23, "law": 23, "push": [23, 26, 28, 33], "u_mod": [23, 33], "send": [23, 31], "u_control": [23, 33], "receiv": [23, 24], "until": [23, 24, 32, 34], "reach": [23, 28, 30], "speed": [23, 33], "zrang": [23, 33], "expos": [23, 24, 34], "post": [23, 24], "process": [23, 24, 29], "systemat": 23, "disir": 23, "exact": [23, 34], "visit": 23, "infact": 23, "slighli": 23, "hidden": 23, "instanti": [23, 24], "fact": [23, 24], "must": [23, 29, 31, 34], "arbitrari": [23, 24, 34], "acut": 23, "somewher": [23, 27, 34], "els": [23, 34], "global": [23, 33, 34], "percept": [23, 26, 28, 30], "alreadi": [23, 30, 34], "x3": 23, "four": [23, 34], "focal": [23, 34], "unit": [23, 30, 34], "center": [23, 28, 29, 30, 34], "ealier": 24, "influenc": 24, "experi": 24, "think": [24, 28, 29, 34], "implicit": [24, 34], "finit": [24, 34], "particular": [24, 29, 31, 32, 34], "velocit": 24, "concecut": 24, "dull": 24, "ineffici": 24, "inher": [24, 28], "higher": 24, "jerk": 24, "concret": 24, "past": 24, "thrid": 24, "subject": 24, "deriv": 24, "technic": [24, 34], "convent": [24, 28, 34], "consid": [24, 28, 32, 33, 34], "od": 24, "word": [24, 34], "rho": [24, 34], "phi_": [24, 34], "textbf": [24, 34], "analog": [24, 27, 28, 34], "addition": [24, 28], "phi_j": 24, "subset": [24, 33, 34], "With": [24, 34], "By": [24, 28, 33], "simplest": [24, 28], "smooth": [24, 29, 30, 32, 33, 34], "shortest": 24, "penal": [24, 28], "skip": [24, 34], "certain": [24, 34], "cope": 24, "leaf": 24, "later": [24, 29, 31, 34], "tablet": 24, "virtual": [24, 26, 31, 34], "mathematicalprogram": 24, "mathematicalprogram_factor": 24, "behind": [24, 27], "necessarili": [24, 33], "thought": [24, 34], "plug": 24, "replac": [24, 30], "nlopt": [24, 33], "ipopt": [24, 33], "cere": [24, 33], "spars": [24, 34], "computation": 24, "casevia": 24, "individu": [24, 33], "network": 24, "maxim": 24, "cliqu": 24, "spare": 24, "ye": [24, 34], "easi": 24, "watch": [24, 31], "folder": [24, 27], "sandbox": 24, "tutorialbas": 24, "fine": [24, 30, 33], "grain": 24, "lead": [24, 34], "undo": 24, "setsquaredqaccvelhom": 24, "smoothest": 24, "harder": 24, "correl": 24, "better": [24, 28, 30, 34], "condit": 24, "hessian": [24, 33, 34], "fs_positiondiff": 24, "fs_quaterniondiff": [24, 28], "setslow": 24, "ot_eq": 24, "ot_so": 24, "reduc": 24, "task": [24, 26, 28, 33, 34], "struct": 24, "const": [24, 34], "stringa": [24, 33], "input": 24, "objectivetyp": [24, 33], "noarr": 24, "deltafromstep": [24, 33], "deltatostep": [24, 33], "seri": [24, 26, 28], "fs_posit": 24, "subtract": [24, 34], "multipli": 24, "second": [24, 28, 29, 34], "pmatrix": 24, "effect": [24, 28, 30, 32, 34], "third": [24, 30], "small": [24, 30, 31, 34], "big": [24, 34], "section": [24, 29, 31, 34], "fourth": 24, "rare": 24, "refin": 24, "ptr": 24, "principl": [24, 34], "larg": [24, 34], "predefin": 24, "featuresylbol": 24, "uniqu": 24, "complic": 24, "modulo": 24, "flip": [24, 34], "account": [24, 34], "coverag": 24, "apart": 24, "among": [24, 34], "fs_qitself": 24, "itself": [24, 34], "high": [24, 33], "setqaccvelhom": 24, "prefer": [24, 34], "fs_qlimit": 24, "2n": 24, "slack": 24, "met": 24, "violat": 24, "group": [24, 27, 34], "fs_accumulatedcollis": 24, "fs_distanc": 24, "margin": [24, 28, 33], "cm": 24, "lot": [24, 31], "pick": [24, 28, 32], "placement": 24, "liter": [24, 32, 34], "addswitch": 24, "explicit": [24, 34], "creation": 24, "happen": 24, "setupconfigur": 24, "mechan": [24, 34], "enabl": [24, 29, 34], "exchang": 24, "addcontact": 24, "blueprint": 24, "durat": 24, "enumer": [24, 34], "conv_time2step": 24, "conv_step2tim": 24, "purpos": [24, 34], "distinct": 24, "scheme": 24, "sqrt": [24, 34], "decid": 24, "fast": [24, 30], "settimeoptim": 24, "0th": 24, "evolv": 24, "newtoneul": 24, "applic": [24, 34], "schedul": 24, "adapt": [24, 34], "evolut": 24, "arxiv": 24, "tech": 24, "ab": [24, 34], "1407": 24, "0414": 24, "docu": [24, 33], "mainten": 24, "bind": [24, 33], "ipynb": [24, 28], "reintegr": 25, "rough": [25, 31], "familiar": 25, "explor": [25, 32], "tricki": 25, "reactiv": [25, 33, 34], "track": [25, 30, 33], "background": [25, 34], "substract": 25, "lift": [25, 33], "drop": [25, 29, 34], "hop": 25, "throw": 25, "bonu": [25, 29], "lesson": 25, "ll": [26, 27, 34], "integr": [26, 34], "plan": [26, 31, 34], "mobil": [26, 34], "navig": 26, "major": 26, "spend": 26, "supervis": 26, "instructor": 26, "session": [26, 29, 31], "leverag": 26, "perceiv": 26, "student": 26, "expect": 26, "offlin": [26, 31], "homework": 26, "though": 26, "team": [26, 31], "challeng": 26, "www": [26, 31, 34], "de": [26, 34], "teach": [26, 34], "labcours": 26, "pdf": [26, 31], "04": [26, 29], "instruct": [26, 27], "readm": 27, "delivar": 27, "course3": [27, 28], "eg": 27, "qtcreator": 27, "pycharm": 27, "brows": 27, "debug": [27, 30, 33], "pull": [27, 28, 29, 30], "futur": 27, "pleas": [27, 31, 34], "gitlab": 27, "organ": [27, 31], "fork": 27, "usr": 27, "subfold": 27, "makefil": 27, "too": [27, 31], "difficult": 27, "submodul": [27, 28, 29, 30], "pybind": 27, "checkout": 27, "branch": [27, 34], "cmakelist": 27, "deliver": 27, "isi": 27, "unfamiliar": 27, "parallel": 27, "develop": [27, 29, 30], "member": [27, 33], "least": [27, 34], "commit": 27, "hardli": 27, "plain": [27, 30], "_simul": 27, "Be": [27, 28], "abl": [27, 28, 34], "walk": 27, "j4": [28, 29, 30], "demonstr": [28, 31, 34], "minimalist": [28, 31, 34], "why": [28, 34], "immedi": [28, 33], "fulfil": [28, 34], "apriori": 28, "fs_scalarproductxz": 28, "zoom": 28, "combin": [28, 29, 34], "holist": 28, "realiz": [28, 29, 30, 32], "paircollis": 28, "impress": 28, "neglect": 28, "fair": 28, "stai": 28, "awai": 28, "even": [28, 34], "latter": [28, 34], "optima": 28, "obstacl": 28, "r_finger1": 28, "r_finger2": 28, "ingredi": 28, "myobj": 28, "shortcut": [28, 30], "realworld": [28, 30], "round": 28, "corner": 28, "primit": 28, "determin": [28, 32, 34], "sscvx": [28, 33], "hull": [28, 33], "sweep": 28, "understood": 28, "care": [28, 33], "l": 28, "compon": [28, 34], "grippercent": 28, "greater": 28, "live": [28, 31, 34], "readi": 28, "minim": [28, 30, 34], "weak": 28, "repeat": [28, 30], "subscrib": 29, "fun": 29, "tutroal": 29, "readthedoc": 29, "en": 29, "latest": 29, "py_tutori": 29, "html": 29, "tracker": 29, "redish": 29, "binari": 29, "mask": 29, "contour": 29, "draw": 29, "identifi": 29, "yield": 29, "averag": [29, 33], "sever": [29, 33, 34], "significantli": 29, "fit": 29, "blur": 29, "discuss": [29, 31, 34], "largest": 29, "less": [29, 34], "foreground": 29, "cheat": 30, "stochast": 30, "failur": 30, "sp": 30, "pseudo": 30, "stack": [30, 34], "toward": [30, 34], "occlud": 30, "occlus": 30, "enough": [30, 31], "reliabl": [30, 33], "success": 30, "robustli": 30, "endless": 30, "long": 30, "06": 30, "column": [30, 34], "15cm": 30, "suffic": 30, "cf": 30, "email": 31, "latex": 31, "brief": [31, 34], "prepar": 31, "statement": 31, "eventu": [31, 34], "workplan": 31, "achiev": 31, "realist": 31, "intend": 31, "simplifi": [31, 32, 34], "effort": 31, "mention": [31, 34], "split": 31, "max": [31, 33], "minut": 31, "spotlight": 31, "video": 31, "min": 31, "demo": 31, "briefli": 31, "softwar": 31, "talk": [31, 34], "mayb": 31, "fanci": 31, "persist": [31, 32], "explan": [31, 34], "interrupt": 31, "paramet": [31, 33, 34], "proper": [31, 34], "titl": 31, "clip": 31, "possibli": 31, "x5": 31, "cut": 31, "caption": 31, "youtub": 31, "1qymi": 31, "qon9m": 31, "sink": 31, "submit": 31, "confer": 31, "linux": 31, "super": 31, "bad": 31, "davinci": 31, "resolv": 31, "kdenliv": 31, "keyfram": 32, "insight": [32, 34], "lgpplayer": 32, "folfil": 32, "action": 32, "pddl": 32, "conffil": 32, "skeletonsolv": 32, "mathematicalproblem": 32, "sktfile": 32, "predic": 32, "produc": 32, "src_skeletonsolv": 32, "ex": 32, "block1": 32, "stable_": 32, "block2": 32, "stableon_": 32, "block3": 32, "block4": 32, "block5": 32, "box1": 32, "repetit": 32, "five": [32, 34], "concurr": 32, "workshop": 32, "_right": 33, "_sequenc": 33, "_path": 33, "sensornam": 33, "intrins": [33, 34], "globalcoordin": 33, "press": [33, 34], "freq": 33, "torqu": 33, "nonsens": 33, "leftright": 33, "objnam": 33, "mimic": [33, 34], "075": 33, "damp": 33, "wait": 33, "overwritectrltim": 33, "ctrltime": 33, "mpc": [33, 34], "maxvel": 33, "maxacc": 33, "resolut": 33, "chosen": 33, "acc": 33, "q_target": 33, "timecost": 33, "steer": 33, "compliant": 33, "goe": 33, "arg0": 33, "waittim": 33, "file_nam": 33, "content": 33, "shapetyp": 33, "arg1": 33, "frame1": 33, "frame2": 33, "adopt": 33, "revers": 33, "rycameraview": 33, "offscreen": 33, "deep": 33, "framenam": 33, "qdot": 33, "0078125": 33, "dedic": 33, "kwarg": 33, "overload": [33, 34], "ndarrai": 33, "float64": 33, "remak": 33, "jointnam": 33, "notthos": 33, "jointgroup": 33, "resort": 33, "accord": 33, "topologi": 33, "dynamicnois": 33, "paus": 33, "uint8": 33, "delai": 33, "savevideopath": 33, "launch": 33, "listent": 33, "inod": 33, "vectorydiff": 33, "vectoryrel": 33, "vectorzrel": 33, "scalarproductyx": 33, "scalarproductyi": 33, "scalarproductyz": 33, "oppos": 33, "paircollision_negscalar": 33, "paircollision_vector": 33, "paircollision_norm": 33, "paircollision_p1": 33, "paircollision_p2": 33, "contactconstraint": 33, "transacceler": 33, "transveloc": 33, "arg2": 33, "dtype": 33, "depthnois": 33, "rgbnois": 33, "adversarialdropp": 33, "objectimpuls": 33, "nopenetr": 33, "transyphi": 33, "elast": 33, "sticki": 33, "newmod": 33, "skeletonsymbol": 33, "firstswitch": 33, "arra": 33, "t_phase": 33, "dofid": 33, "autoresamplepath": 33, "waypointstepsperphas": 33, "arg3": 33, "nonlinear": 33, "b_": 33, "lo": 33, "plu": 33, "previousoptima": [33, 34], "uniform": 33, "callabl": 33, "portfolio": 33, "stopftoler": 33, "stopgtoler": 33, "stopev": 33, "stepinc": 33, "stepdec": 33, "wolf": 33, "muinit": 33, "muinc": 33, "mumax": 33, "mulbinit": 33, "mulbdec": 33, "resampleiniti": 33, "gradientdesc": 33, "rprop": 33, "lbfg": 33, "augmentedlag": 33, "logbarri": 33, "singlesquaredpenalti": 33, "ineqb": 33, "ineqp": 33, "collisionpair": 33, "pointcloud": 33, "sscylind": 33, "ssboxelip": 33, "sdf": 33, "restingon": 33, "positioneq": 33, "stablerelpos": 33, "stablepos": 33, "stableon": 33, "dynamicon": 33, "dynamictran": 33, "quasistat": 33, "quasistaticon": 33, "stablezero": 33, "contactstick": 33, "contactcomplementari": 33, "bounc": 33, "magic": 33, "magictran": 33, "pushandplac": 33, "topboxplac": 33, "dampmot": 33, "alignbyint": 33, "makefre": 33, "forcebal": 33, "relposi": 33, "touchboxnormalx": 33, "touchboxnormali": 33, "touchboxnormalz": 33, "boxgraspx": 33, "boxgraspi": 33, "boxgraspz": 33, "stableyphi": 33, "stableonx": 33, "stableoni": 33, "orthoabsheight": 33, "gripperframenam": 33, "float32": 33, "frameveloc": 33, "simulationst": 33, "genreat": 33, "framest": 33, "date": 33, "intellig": 34, "intro": 34, "craig": 34, "addison": 34, "weslei": 34, "york": 34, "1989": 34, "3rd": 34, "2006": 34, "steven": 34, "laval": 34, "cambridg": 34, "onlin": 34, "uiuc": 34, "edu": 34, "videolectur": 34, "oussama": 34, "khatib": 34, "net": 34, "oussama_khatib": 34, "focu": 34, "oliv": 34, "brock": 34, "menu": 34, "stefan": 34, "schaal": 34, "clmc": 34, "usc": 34, "teachingintroductiontoroboticssyllabu": 34, "theori": 34, "analyt": 34, "pid": 34, "chapter": 34, "chri": 34, "atkeson": 34, "cmu": 34, "cga": 34, "kdc": 34, "book": 34, "ewhitman1": 34, "pptx": 34, "af": 34, "academ": 34, "16311": 34, "bug": 34, "holonom": 34, "springer": 34, "handbook": 34, "bruno": 34, "siciliano": 34, "1007": 34, "978": 34, "319": 34, "32552": 34, "seciton": 34, "found": 34, "speak": 34, "clearli": 34, "simplif": 34, "secshap": 34, "landmark": 34, "cross": 34, "appendix": 34, "apptransform": 34, "cc": 34, "commonli": 34, "r_0": 34, "co": 34, "theta": 34, "underlin": 34, "never": 34, "sequenti": 34, "radian": 34, "doesn": 34, "figtransform": 34, "q_": 34, "circ": 34, "to2": 34, "to3": 34, "compos": 34, "concaten": 34, "ask": 34, "backward": 34, "somewhat": 34, "ill": 34, "situat": 34, "surpris": 34, "covari": 34, "contra": 34, "variant": 34, "children": 34, "ground": 34, "q_1": 34, "q_2": 34, "q_3": 34, "hspace": 34, "0pt": 34, "textrm": 34, "5pt": 34, "q_i": 34, "abbrevi": 34, "d_i": 34, "cccc": 34, "prismat": 34, "cylindr": 34, "spheric": 34, "lie": 34, "manifold": 34, "strict": 34, "pi": 34, "q_j": 34, "denavit": 34, "hartenberg": 34, "conceptu": 34, "cleaner": 34, "becam": 34, "stream": 34, "uncov": 34, "issu": 34, "perspect": 34, "textbook": 34, "seckinemat": 34, "t_i": 34, "r_i": 34, "_x": 34, "textsf": 34, "vec": 34, "construct": 34, "_i": 34, "e_x": 34, "e_i": 34, "e_z": 34, "basi": 34, "tensor": 34, "dot": 34, "recal": 34, "auto": 34, "express": 34, "simpler": 34, "cover": 34, "p_j": 34, "a_j": 34, "Its": 34, "skew": 34, "obviou": 34, "eqquatvel": 34, "ang": 34, "rewrit": 34, "label": 34, "eqquatr": 34, "wise": 34, "written": 34, "unusu": 34, "notion": 34, "trickier": 34, "eqquatjac": 34, "summar": 34, "x_j": 34, "r_j": 34, "eqquatjoint1": 34, "e_k": 34, "variat": 34, "induc": 34, "divis": 34, "necessari": 34, "annot": 34, "maintain": 34, "lazili": 34, "demand": 34, "syntact": 34, "sugar": 34, "rm": 34, "diag": 34, "relev": 34, "fuse": 34, "WITH": 34, "q_t": 34, "q_0": 34, "q_k": 34, "tabfeatur": 34, "invert": 34, "address": 34, "eqiknlp": 34, "operatornam": 34, "argmin": 34, "_q": 34, "regular": 34, "satisfi": 34, "2_w": 34, "recommend": 34, "beyond": 34, "sort": 34, "rich": 34, "educ": 34, "secnlp": 34, "f_1": 34, "r_1": 34, "h_1": 34, "g_1": 34, "h_2": 34, "vdot": 34, "b_l": 34, "b_u": 34, "bf": 34, "orang": 34, "pgik": 34, "controlobject": 34, "weight": 34, "lagrangian": 34, "strongli": 34, "tackl": 34, "eqsoft": 34, "2_c": 34, "norm": 34, "metric": 34, "undesir": 34, "investig": 34, "infti": 34, "canon": 34, "gauss": 34, "nabla_": 34, "approx": 34, "rewritten": 34, "sharp": 34, "eqik": 34, "woodburi": 34, "rh": 34, "jump": 34, "proport": 34, "due": 34, "lucki": 34, "stepsiz": 34, "sens": 34, "heurist": 34, "infinitesim": 34, "loos": 34, "drift": 34, "nullspac": 34, "det": 34, "rank": 34, "stretch": 34, "extend": 34, "infeas": 34, "soft": 34, "trade": 34, "off": 34, "restrict": 34, "ourselv": 34, "ones": 34, "raw": 34, "times3": 34, "orthonorm": 34, "r_2": 34, "transpos": 34, "unconstrain": 34, "thumb": 34, "rodrigu": 34, "formula": 34, "symmetr": 34, "ccc": 34, "w_3": 34, "w_2": 34, "w_1": 34, "eqrodriguez": 34, "exp": 34, "exponenti": 34, "element": 34, "diagon": 34, "outer": 34, "eqdotr": 34, "denot": 34, "context": 34, "r_": 34, "negat": 34, "eqquat": 34, "_0": 34, "22": 34, "33": 34, "23": 34, "ij": 34, "comparison": 34, "tr": 34, "r_3": 34, "21": 34, "31": 34, "32": 34, "analogi": 34, "lh": 34, "iff": 34, "e_0": 34, "e_3": 34, "w_i": 34, "wasn": 34, "j_": 34, "expand": 34, "rx": 34, "ordinari": 34, "t_1": 34, "t_2": 34, "v_1": 34, "v_2": 34, "t_": 34, "rigor": 34, "a_b": 34, "regard": 34, "ato": 34, "convinc": 34, "yourself": 34, "boldsymbol": 34, "e_1": 34, "e_n": 34, "p_": 34, "nolimits_i": 34, "p_i": 34, "b_1": 34, "b_n": 34, "w_n": 34, "b_i": 34, "w_": 34, "sum_j": 34, "w_j": 34, "ji": 34, "sum_i": 34, "b_j": 34, "rightarrow": 34, "d_g": 34, "d_h": 34, "d_r": 34, "sampler": 34, "matter": 34, "functnio": 34, "uint": 34, "objectivetypea": 34, "featuretyp": 34, "bounds_lo": 34, "bounds_up": 34, "void": 34, "throughout": 34, "anytyp": 34, "extens": 34, "parser": 34, "implic": 34, "url": 34, "embrac": 34, "ref": 34, "refgraph": 34, "extrins": 34, "u_x": 34, "u_i": 34, "u_d": 34, "diagram": 34, "drawn": 34, "paper": 34, "consequ": 34, "count": 34, "readabl": 34, "eqxtou": 34, "f_x": 34, "c_x": 34, "f_y": 34, "c_y": 34, "vertic": 34, "tan": 34, "cartesian": 34, "u_z": 34, "cal": 34, "lambda": 34, "bold": 34, "kr": 34, "subsum": 34, "fulli": 34, "_p": 34, "compar": 34, "decompos": 34, "rq": 34, "decomposit": 34, "agument": 34, "_t": 34}, "objects": {"": [[33, 0, 0, "-", "ry"]], "ry": [[33, 1, 1, "", "ArgWord"], [33, 1, 1, "", "BotOp"], [33, 1, 1, "", "Config"], [33, 1, 1, "", "ControlMode"], [33, 1, 1, "", "FS"], [33, 1, 1, "", "Feature"], [33, 1, 1, "", "Frame"], [33, 1, 1, "", "ImpType"], [33, 1, 1, "", "JT"], [33, 1, 1, "", "KOMO"], [33, 1, 1, "", "NLP"], [33, 1, 1, "", "NLP_Factory"], [33, 1, 1, "", "NLP_Solver"], [33, 1, 1, "", "NLP_SolverID"], [33, 1, 1, "", "NLP_SolverOptions"], [33, 1, 1, "", "OT"], [33, 1, 1, "", "PathFinder"], [33, 1, 1, "", "ST"], [33, 1, 1, "", "SY"], [33, 1, 1, "", "Simulation"], [33, 1, 1, "", "SimulationEngine"], [33, 1, 1, "", "SolverReturn"], [33, 4, 1, "", "compiled"], [33, 4, 1, "", "getStartGoalPath"], [33, 4, 1, "", "params_add"], [33, 4, 1, "", "params_file"], [33, 4, 1, "", "params_print"], [33, 4, 1, "", "raiPath"], [33, 4, 1, "", "setRaiPath"]], "ry.ArgWord": [[33, 2, 1, "", "name"]], "ry.BotOp": [[33, 3, 1, "", "getCameraFxypxy"], [33, 3, 1, "", "getImageAndDepth"], [33, 3, 1, "", "getImageDepthPcl"], [33, 3, 1, "", "getKeyPressed"], [33, 3, 1, "", "getTimeToEnd"], [33, 3, 1, "", "get_q"], [33, 3, 1, "", "get_qDot"], [33, 3, 1, "", "get_qHome"], [33, 3, 1, "", "get_t"], [33, 3, 1, "", "get_tauExternal"], [33, 3, 1, "", "gripperClose"], [33, 3, 1, "", "gripperCloseGrasp"], [33, 3, 1, "", "gripperDone"], [33, 3, 1, "", "gripperOpen"], [33, 3, 1, "", "gripperPos"], [33, 3, 1, "", "hold"], [33, 3, 1, "", "home"], [33, 3, 1, "", "move"], [33, 3, 1, "", "moveAutoTimed"], [33, 3, 1, "", "moveTo"], [33, 3, 1, "", "setCompliance"], [33, 3, 1, "", "setControllerWriteData"], [33, 3, 1, "", "stop"], [33, 3, 1, "", "sync"]], "ry.Config": [[33, 3, 1, "", "addConfigurationCopy"], [33, 3, 1, "", "addFile"], [33, 3, 1, "", "addFrame"], [33, 3, 1, "", "addObject"], [33, 3, 1, "", "attach"], [33, 3, 1, "", "cameraView"], [33, 3, 1, "", "clear"], [33, 3, 1, "", "computeCollisions"], [33, 3, 1, "", "copy"], [33, 3, 1, "", "delFrame"], [33, 3, 1, "", "equationOfMotion"], [33, 3, 1, "", "eval"], [33, 3, 1, "", "feature"], [33, 3, 1, "", "frame"], [33, 3, 1, "", "frames"], [33, 3, 1, "", "getCollisions"], [33, 3, 1, "", "getDofIDs"], [33, 3, 1, "", "getFrame"], [33, 3, 1, "", "getFrameDimension"], [33, 3, 1, "", "getFrameNames"], [33, 3, 1, "", "getFrameState"], [33, 3, 1, "", "getJointDimension"], [33, 3, 1, "", "getJointNames"], [33, 3, 1, "", "getJointState"], [33, 3, 1, "", "makeObjectsConvex"], [33, 3, 1, "", "makeObjectsFree"], [33, 3, 1, "", "report"], [33, 3, 1, "", "selectJoints"], [33, 3, 1, "", "selectJointsByTag"], [33, 3, 1, "", "setFrameState"], [33, 3, 1, "", "setJointState"], [33, 3, 1, "", "setJointStateSlice"], [33, 3, 1, "", "simulation"], [33, 3, 1, "", "sortFrames"], [33, 3, 1, "", "stepDynamics"], [33, 3, 1, "", "view"], [33, 3, 1, "", "view_close"], [33, 3, 1, "", "view_getScreenshot"], [33, 3, 1, "", "view_playVideo"], [33, 3, 1, "", "view_recopyMeshes"], [33, 3, 1, "", "watchFile"]], "ry.ControlMode": [[33, 2, 1, "", "name"]], "ry.FS": [[33, 2, 1, "", "name"]], "ry.Feature": [[33, 3, 1, "", "description"], [33, 3, 1, "", "eval"], [33, 3, 1, "", "setOrder"], [33, 3, 1, "", "setScale"], [33, 3, 1, "", "setTarget"]], "ry.Frame": [[33, 3, 1, "", "addAttribute"], [33, 3, 1, "", "addAttributes"], [33, 3, 1, "", "getAttributes"], [33, 3, 1, "", "getJointState"], [33, 3, 1, "", "getMeshPoints"], [33, 3, 1, "", "getMeshTriangles"], [33, 3, 1, "", "getPosition"], [33, 3, 1, "", "getQuaternion"], [33, 3, 1, "", "getRelativePosition"], [33, 3, 1, "", "getRelativeQuaternion"], [33, 3, 1, "", "getRotationMatrix"], [33, 3, 1, "", "getSize"], [33, 3, 1, "", "info"], [33, 3, 1, "", "setColor"], [33, 3, 1, "", "setContact"], [33, 3, 1, "", "setJoint"], [33, 3, 1, "", "setJointState"], [33, 3, 1, "", "setMass"], [33, 3, 1, "", "setMeshAsLines"], [33, 3, 1, "", "setParent"], [33, 3, 1, "", "setPointCloud"], [33, 3, 1, "", "setPose"], [33, 3, 1, "", "setPosition"], [33, 3, 1, "", "setQuaternion"], [33, 3, 1, "", "setRelativePose"], [33, 3, 1, "", "setRelativePosition"], [33, 3, 1, "", "setRelativeQuaternion"], [33, 3, 1, "", "setShape"], [33, 3, 1, "", "unLink"]], "ry.ImpType": [[33, 2, 1, "", "name"]], "ry.JT": [[33, 2, 1, "", "name"]], "ry.KOMO": [[33, 3, 1, "", "addControlObjective"], [33, 3, 1, "", "addInteraction_elasticBounce"], [33, 3, 1, "", "addModeSwitch"], [33, 3, 1, "", "addObjective"], [33, 3, 1, "", "addQuaternionNorms"], [33, 3, 1, "", "addTimeOptimization"], [33, 3, 1, "", "clearObjectives"], [33, 3, 1, "", "getConstraintViolations"], [33, 3, 1, "", "getCosts"], [33, 3, 1, "", "getForceInteractions"], [33, 3, 1, "", "getFrameState"], [33, 3, 1, "", "getPath"], [33, 3, 1, "", "getPathFrames"], [33, 3, 1, "", "getPathTau"], [33, 3, 1, "", "getPath_qAll"], [33, 3, 1, "", "getReport"], [33, 3, 1, "", "getT"], [33, 3, 1, "", "initOrg"], [33, 3, 1, "", "initPhaseWithDofsPath"], [33, 3, 1, "", "initRandom"], [33, 3, 1, "", "initWithConstant"], [33, 3, 1, "", "initWithPath_qOrg"], [33, 3, 1, "", "initWithWaypoints"], [33, 3, 1, "", "nlp"], [33, 3, 1, "", "reportProblem"], [33, 3, 1, "", "setConfig"], [33, 3, 1, "", "setTiming"], [33, 3, 1, "", "view"], [33, 3, 1, "", "view_close"], [33, 3, 1, "", "view_play"]], "ry.NLP": [[33, 3, 1, "", "evaluate"], [33, 3, 1, "", "getBounds"], [33, 3, 1, "", "getDimension"], [33, 3, 1, "", "getFHessian"], [33, 3, 1, "", "getFeatureTypes"], [33, 3, 1, "", "getInitializationSample"], [33, 3, 1, "", "report"]], "ry.NLP_Factory": [[33, 3, 1, "", "setBounds"], [33, 3, 1, "", "setDimension"], [33, 3, 1, "", "setEvalCallback"], [33, 3, 1, "", "setFeatureTypes"], [33, 3, 1, "", "testCallingEvalCallback"]], "ry.NLP_Solver": [[33, 3, 1, "", "getOptions"], [33, 3, 1, "", "getTrace_J"], [33, 3, 1, "", "getTrace_costs"], [33, 3, 1, "", "getTrace_phi"], [33, 3, 1, "", "getTrace_x"], [33, 3, 1, "", "setOptions"], [33, 3, 1, "", "setProblem"], [33, 3, 1, "", "setSolver"], [33, 3, 1, "", "setTracing"], [33, 3, 1, "", "solve"]], "ry.NLP_SolverID": [[33, 2, 1, "", "name"]], "ry.NLP_SolverOptions": [[33, 3, 1, "", "dict"], [33, 3, 1, "", "set_damping"], [33, 3, 1, "", "set_maxStep"], [33, 3, 1, "", "set_muInc"], [33, 3, 1, "", "set_muInit"], [33, 3, 1, "", "set_muLBDec"], [33, 3, 1, "", "set_muLBInit"], [33, 3, 1, "", "set_muMax"], [33, 3, 1, "", "set_stepDec"], [33, 3, 1, "", "set_stepInc"], [33, 3, 1, "", "set_stopEvals"], [33, 3, 1, "", "set_stopFTolerance"], [33, 3, 1, "", "set_stopGTolerance"], [33, 3, 1, "", "set_stopTolerance"], [33, 3, 1, "", "set_verbose"], [33, 3, 1, "", "set_wolfe"]], "ry.OT": [[33, 2, 1, "", "name"]], "ry.PathFinder": [[33, 3, 1, "", "setExplicitCollisionPairs"], [33, 3, 1, "", "setProblem"], [33, 3, 1, "", "solve"], [33, 3, 1, "", "step"]], "ry.ST": [[33, 2, 1, "", "name"]], "ry.SY": [[33, 2, 1, "", "name"]], "ry.Simulation": [[33, 3, 1, "", "addImp"], [33, 3, 1, "", "addSensor"], [33, 3, 1, "", "closeGripper"], [33, 3, 1, "", "depthData2pointCloud"], [33, 3, 1, "", "getGripperIsGrasping"], [33, 3, 1, "", "getGripperWidth"], [33, 3, 1, "", "getGroundTruthPosition"], [33, 3, 1, "", "getGroundTruthRotationMatrix"], [33, 3, 1, "", "getGroundTruthSize"], [33, 3, 1, "", "getImageAndDepth"], [33, 3, 1, "", "getScreenshot"], [33, 3, 1, "", "getState"], [33, 3, 1, "", "getTimeToMove"], [33, 3, 1, "", "get_q"], [33, 3, 1, "", "get_qDot"], [33, 3, 1, "", "loadTeleopCallbacks"], [33, 3, 1, "", "openGripper"], [33, 3, 1, "", "pushConfigurationToSimulator"], [33, 3, 1, "", "restoreState"], [33, 3, 1, "", "selectSensor"], [33, 3, 1, "", "setMoveto"], [33, 3, 1, "", "setState"], [33, 3, 1, "", "step"]], "ry.SimulationEngine": [[33, 2, 1, "", "name"]], "ry.SolverReturn": [[33, 3, 1, "", "dict"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:property", "3": "py:method", "4": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "property", "Python property"], "3": ["py", "method", "Python method"], "4": ["py", "function", "Python function"]}, "titleterms": {"get": [0, 20, 23, 34], "start": [0, 3, 34], "quick": 0, "instal": 0, "avanc": 0, "info": 0, "tutori": [0, 15, 24], "notebook": 0, "welcom": 1, "robot": [1, 3, 4, 9, 21, 34], "cours": [1, 26], "repo": 1, "content": 1, "indic": 1, "tabl": 1, "interact": [2, 28], "sim": [2, 6, 15], "real": [2, 3, 15, 24, 28], "set": [2, 7, 20], "spline": 2, "refer": [2, 34], "advanc": [3, 8, 9, 14, 28], "complianc": 3, "forc": [3, 24], "torqu": 3, "feedback": 3, "first": [4, 24], "exampl": [4, 6, 8, 12, 17, 32], "grap": 4, "imag": [4, 23, 34], "from": [4, 20, 21, 34], "webcam": 4, "2": [4, 24, 28], "convert": 4, "simul": [4, 18, 20, 23, 26, 27], "rgb": [4, 23], "d": [4, 28], "point": 4, "cloud": 4, "3": [4, 29], "us": [4, 21, 28, 34], "multipl": [4, 9], "camera": [4, 7, 34], "attach": [4, 9], "differ": 4, "frame": [4, 7, 9, 20, 34], "grasp": [6, 9, 10, 30], "push": 6, "configur": [7, 8, 9, 15, 20, 21, 27, 34], "up": 7, "basic": [7, 15, 27, 28], "config": 7, "joint": [7, 20, 21, 34], "state": [7, 20, 23], "featur": [7, 8, 11, 15, 20, 24, 28, 34], "jacobian": [7, 34], "view": 7, "need": 7, "more": [7, 9, 11, 15, 24], "test": [7, 24], "code": [8, 27, 34], "collis": [8, 9, 20, 28], "over": 8, "tupl": 8, "path": [8, 12, 13, 17, 24, 28], "veloc": [8, 24, 28], "acceler": [8, 28], "object": [8, 28], "import": [9, 21, 34], "edit": [9, 20, 21, 34], "manipul": 9, "predefin": 9, "model": 9, "load": [9, 24], "singl": 9, "how": [9, 24], "fake": 9, "enabl": 9, "disabl": 9, "queri": 9, "report": 9, "render": 9, "yaml": [9, 34], "dict": 9, "represent": 9, "invers": [10, 11, 34], "kinemat": [10, 11, 24, 34], "optim": [10, 11, 12, 13, 15, 16, 24, 28], "box": [10, 30], "design": [10, 15], "merg": [11, 13], "demo": 11, "explan": 11, "switch": [14, 24], "skeleton": [14, 32], "same": 14, "again": 14, "onli": [14, 24], "keyfram": 14, "etc": [15, 20], "komo": [15, 20, 24], "problem": [15, 24], "motion": [15, 28], "botop": 15, "interfac": [15, 18, 34], "nlp": [16, 34], "formul": 16, "solv": [16, 24], "find": 17, "direct": 18, "arrai": 19, "c": [20, 23, 27, 28, 30], "tor": [20, 23], "ad": 20, "copi": 20, "clear": 20, "select": 20, "activ": 20, "anyth": 20, "you": [20, 24], "might": 20, "want": 20, "comput": 20, "structur": 20, "function": 20, "creat": 20, "other": 20, "class": 20, "viewer": 20, "g": [21, 22], "file": [21, 22, 34], "describ": [21, 34], "kinedit": [21, 34], "urdf": [21, 24, 34], "notat": [21, 34], "specifi": [21, 34], "transform": [21, 34], "type": [21, 34], "graph": [22, 34], "step": [23, 24], "physic": 23, "open": 23, "close": 23, "gripper": 23, "grip": 23, "depth": [23, 34], "restart": 23, "previou": 23, "helper": [23, 24], "depthdata2pointcloud": 23, "learn": [24, 32], "k": [24, 34], "order": 24, "markov": 24, "No": 24, "dynam": [24, 34], "do": 24, "what": [24, 32], "i": [24, 32], "formal": [24, 34], "ar": 24, "main": 24, "defin": 24, "roughli": 24, "doe": 24, "spec": 24, "can": 24, "an": [24, 34], "practic": 24, "lesson": 24, "1": [24, 27], "plai": 24, "around": 24, "rai": [24, 33, 34], "addobject": 24, "method": 24, "languag": 24, "core": 24, "vari": 24, "decis": 24, "variabl": 24, "per": 24, "time": 24, "slice": 24, "contact": 24, "summari": 24, "few": 24, "fundament": 24, "rest": 24, "phase": 24, "link": 24, "document": 24, "old": 25, "materi": [25, 34], "lab": 26, "simlab": [27, 28, 29, 30, 31], "exercis": [27, 28, 29, 30], "setup": 27, "b": [27, 28, 29, 30], "git": 27, "rough": 27, "familiar": 27, "ik": [28, 34], "explor": 28, "enforc": 28, "touch": 28, "e": 28, "tricki": 28, "inequ": 28, "scale": 28, "target": 28, "f": 28, "reactiv": 28, "oper": 28, "space": 28, "control": 28, "opencv": 29, "color": 29, "base": 29, "track": 29, "background": 29, "substract": 29, "4": 30, "lift": 30, "drop": 30, "hop": 30, "ball": 30, "throw": 30, "bonu": 30, "project": 31, "propos": 31, "final": 31, "present": 31, "detail": 31, "about": 32, "lgp": 32, "python": 33, "api": 33, "lectur": 34, "script": 34, "introduct": 34, "scene": 34, "descript": 34, "coordin": 34, "composit": 34, "tree": 34, "forest": 34, "parameter": 34, "vector": 34, "forward": 34, "rotat": 34, "translat": 34, "quaternion": 34, "implement": 34, "engin": 34, "build": 34, "classic": 34, "deriv": 34, "pseudo": 34, "solut": 34, "On": 34, "fly": 34, "singular": 34, "placehold": 34, "3d": 34, "static": 34, "A": 34, "note": 34, "affin": 34, "style": 34, "world": 34, "homogen": 34, "matrix": 34, "p": 34, "calibr": 34, "estim": 34, "r": 34, "t": 34, "data": 34, "shape": 34}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "nbsphinx": 4, "sphinx": 57}, "alltitles": {"Getting Started": [[0, "getting-started"]], "Quick install": [[0, "quick-install"]], "Avanced info": [[0, "avanced-info"]], "Installing the tutorial notebooks": [[0, "installing-the-tutorial-notebooks"]], "Welcome to the Robotics Course Repo": [[1, "welcome-to-the-robotics-course-repo"]], "Contents:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "Interacting with a Sim/Real: Setting spline references": [[2, "Interacting-with-a-Sim/Real:-Setting-spline-references"]], "Starting with a real robot": [[3, "Starting-with-a-real-robot"]], "Advanced: Compliance & Force/Torque feedback": [[3, "Advanced:-Compliance-&-Force/Torque-feedback"]], "First example to grap images from a webcam": [[4, "First-example-to-grap-images-from-a-webcam"]], "2. Example to convert simulated RGB-D images into point clouds": [[4, "2.-Example-to-convert-simulated-RGB-D-images-into-point-clouds"]], "3. example to use multiple camera attached to different robot frames": [[4, "3.-example-to-use-multiple-camera-attached-to-different-robot-frames"]], "Example for grasping in Sim": [[6, "Example-for-grasping-in-Sim"]], "Example for pushing in sim": [[6, "Example-for-pushing-in-sim"]], "Configuration & Frames": [[7, "Configuration-&-Frames"]], "Setting up a basic Config": [[7, "Setting-up-a-basic-Config"]], "Joint and Frame State": [[7, "Joint-and-Frame-State"]], "Features & Jacobians": [[7, "Features-&-Jacobians"]], "Camera views (needs more testing)": [[7, "Camera-views-(needs-more-testing)"]], "Features": [[8, "Features"], [8, "id1"]], "Code example for collision features": [[8, "Code-example-for-collision-features"]], "Advanced: Features over configuration tuples (path configurations, velocity/acceleration features)": [[8, "Advanced:-Features-over-configuration-tuples-(path-configurations,-velocity/acceleration-features)"]], "Examples": [[8, "Examples"]], "Objectives": [[8, "Objectives"]], "Importing, Editing & Manipulating Configurations": [[9, "Importing,-Editing-&-Manipulating-Configurations"]], "Editing": [[9, "Editing"]], "Predefined robot models": [[9, "Predefined-robot-models"]], "Loading multiple models in a single configuration": [[9, "Loading-multiple-models-in-a-single-configuration"]], "How to attach frames - faking grasps": [[9, "How-to-attach-frames---faking-grasps"]], "How to enable/disable collisions": [[9, "How-to-enable/disable-collisions"], [9, "id1"]], "More on collisions: Disable/enable, query, report": [[9, "More-on-collisions:-Disable/enable,-query,-report"]], "Rendering configurations": [[9, "Rendering-configurations"]], "Advanced: YAML and dict representations": [[9, "Advanced:-YAML-and-dict-representations"]], "Inverse Kinematics as Optimization": [[10, "Inverse-Kinematics-as-Optimization"]], "box grasping design": [[10, "box-grasping-design"]], "Inverse Kinematics as Optimization (to be merged)": [[11, "Inverse-Kinematics-as-Optimization-(to-be-merged)"]], "Demo of features in Inverse Kinematics": [[11, "Demo-of-features-in-Inverse-Kinematics"]], "More explanations": [[11, "More-explanations"]], "Path optimization example": [[12, "Path-optimization-example"]], "Path Optimization (to be merged)": [[13, "Path-Optimization-(to-be-merged)"]], "Advanced: Switches & Skeletons": [[14, "Advanced:-Switches-&-Skeletons"]], "Same again, but only the keyframes:": [[14, "Same-again,-but-only-the-keyframes:"]], "Skeletons": [[14, "Skeletons"]], "Tutorials": [[15, "tutorials"]], "Basics: Configurations, Features, etc": [[15, "basics-configurations-features-etc"]], "KOMO: Optimization Problems to design motion": [[15, "komo-optimization-problems-to-design-motion"]], "BotOp: Interface to Sim/Real": [[15, "botop-interface-to-sim-real"]], "More": [[15, "more"]], "Optimization (NLP formulation and solving)": [[16, "Optimization-(NLP-formulation-and-solving)"]], "Path finding example": [[17, "Path-finding-example"]], "Direct simulation interface": [[18, "Direct-simulation-interface"]], "Array": [[19, "array"]], "Configuration": [[20, "configuration"]], "C\u2019tor": [[20, "c-tor"], [23, "c-tor"]], "Adding frames to the configuration": [[20, "adding-frames-to-the-configuration"]], "Copy, clear": [[20, "copy-clear"]], "Joint state: get/set, and selecting active joints": [[20, "joint-state-get-set-and-selecting-active-joints"]], "Frame state": [[20, "frame-state"]], "Features: Anything you might want to compute from Configurations": [[20, "features-anything-you-might-want-to-compute-from-configurations"]], "Structural edits": [[20, "structural-edits"]], "Collision computations": [[20, "collision-computations"]], "Functions to create other classes (KOMO, Simulation, viewer, etc)": [[20, "functions-to-create-other-classes-komo-simulation-viewer-etc"]], ".g-files to describe robot configurations": [[21, "g-files-to-describe-robot-configurations"]], "Editing using kinEdit": [[21, "editing-using-kinedit"], [34, "editing-using-kinedit"]], "Import from URDF": [[21, "import-from-urdf"], [34, "import-from-urdf"]], "Notation to specify transformations": [[21, "notation-to-specify-transformations"], [34, "notation-to-specify-transformations"]], "Joint types": [[21, "joint-types"], [34, "joint-types"]], "Graph and .g-files": [[22, "graph-and-g-files"]], "Simulation": [[23, "simulation"]], "Stepping physics": [[23, "stepping-physics"]], "Opening & closing the gripper, and gripping state": [[23, "opening-closing-the-gripper-and-gripping-state"]], "Getting simulated RGB and depth images": [[23, "getting-simulated-rgb-and-depth-images"]], "Simulation states: restarting the simulation in previous states": [[23, "simulation-states-restarting-the-simulation-in-previous-states"]], "Helper: depthData2pointCloud": [[23, "helper-depthdata2pointcloud"]], "Learning KOMO (K-Order Markov Optimization)": [[24, "learning-komo-k-order-markov-optimization"]], "No dynamics? No velocities? How do you solve for dynamic problems?": [[24, "no-dynamics-no-velocities-how-do-you-solve-for-dynamic-problems"]], "What is KOMO?": [[24, "what-is-komo"]], "What is KOMO \u2013 formally?": [[24, "what-is-komo-formally"]], "What are the main steps to define a KOMO problem?": [[24, "what-are-the-main-steps-to-define-a-komo-problem"]], "Roughly, what does KOMO do with these specs?": [[24, "roughly-what-does-komo-do-with-these-specs"]], "Can KOMO only optimize paths?": [[24, "can-komo-only-optimize-paths"]], "Can I load an URDF?": [[24, "can-i-load-an-urdf"]], "First practical steps": [[24, "first-practical-steps"]], "Lesson 1: play around with $RAI/test/KOMO/tutorial": [[24, "lesson-1-play-around-with-rai-test-komo-tutorial"]], "Lesson 2: Learn the addObjective method and the \u201cLanguage of Features\u201d": [[24, "lesson-2-learn-the-addobjective-method-and-the-language-of-features"]], "Features are at the core": [[24, "features-are-at-the-core"]], "Varying decision variables per time slice: kinematic switches & force contacts": [[24, "varying-decision-variables-per-time-slice-kinematic-switches-force-contacts"]], "Summary: there are only a few fundamental methods in KOMO, the rest are helpers": [[24, "summary-there-are-only-a-few-fundamental-methods-in-komo-the-rest-are-helpers"]], "Steps, phase, real time, and time optimization": [[24, "steps-phase-real-time-and-time-optimization"]], "LINKS to more documentation": [[24, "links-to-more-documentation"]], "Old Material": [[25, "old-material"]], "Lab Course in Simulation": [[26, "lab-course-in-simulation"]], "SimLab Exercise 1 - Basic Setup": [[27, "simlab-exercise-1-basic-setup"]], "a) Code Setup": [[27, "a-code-setup"]], "b) Git Setup": [[27, "b-git-setup"]], "c) Rough familiarity with Simulation and Configuration": [[27, "c-rough-familiarity-with-simulation-and-configuration"]], "SimLab Exercise 2 - Motion": [[28, "simlab-exercise-2-motion"]], "a) Basic IK": [[28, "a-basic-ik"]], "b) Path Optimization & velocity/acceleration objectives": [[28, "b-path-optimization-velocity-acceleration-objectives"]], "c) Explore collision features, and enforce touch": [[28, "c-explore-collision-features-and-enforce-touch"]], "d) Interacting with \u201creal\u201d objects": [[28, "d-interacting-with-real-objects"]], "e) Advanced: Tricky use of inequalities, scaling, and target": [[28, "e-advanced-tricky-use-of-inequalities-scaling-and-target"]], "f) Advanced: Reactive Operational Space Control": [[28, "f-advanced-reactive-operational-space-control"]], "SimLab Exercise 3 - OpenCV": [[29, "simlab-exercise-3-opencv"]], "a) OpenCV - color-based tracking": [[29, "a-opencv-color-based-tracking"]], "b) OpenCV - background substraction": [[29, "b-opencv-background-substraction"]], "SimLab Exercise 4 - Grasp": [[30, "simlab-exercise-4-grasp"]], "a) Grasp, lift & drop a hopping ball": [[30, "a-grasp-lift-drop-a-hopping-ball"]], "b) Throw the ball": [[30, "b-throw-the-ball"]], "c) Bonus: \u2026and for a box": [[30, "c-bonus-and-for-a-box"]], "SimLab - Project Proposal and Final Presentation": [[31, "simlab-project-proposal-and-final-presentation"]], "Project Proposal": [[31, "project-proposal"]], "Presentation Details": [[31, "presentation-details"]], "Learning about Skeletons & LGP": [[32, "learning-about-skeletons-lgp"]], "What is LGP?": [[32, "what-is-lgp"]], "Example Skeletons": [[32, "example-skeletons"]], "rai python API": [[33, "module-ry"]], "Lecture Script": [[34, "lecture-script"]], "Introduction": [[34, "introduction"]], "Reference material": [[34, "reference-material"]], "Coding Getting Started": [[34, "coding-getting-started"]], "Scene & Robot Description": [[34, "scene-robot-description"]], "Transformations": [[34, "transformations"], [34, "id1"]], "Coordinates and Composition of Transformations": [[34, "coordinates-and-composition-of-transformations"]], "Scene Tree or Forest": [[34, "scene-tree-or-forest"]], "Kinematics": [[34, "kinematics"]], "Robots as Parameterized Trees": [[34, "robots-as-parameterized-trees"]], "Configuration & Joint Vector": [[34, "configuration-joint-vector"]], "Forward Kinematics": [[34, "forward-kinematics"]], "Jacobians": [[34, "jacobians"]], "Rotational Joint": [[34, "rotational-joint"]], "Translational Joint": [[34, "translational-joint"]], "Quaternion Joint": [[34, "quaternion-joint"]], "Implementing a Kinematic Engine": [[34, "implementing-a-kinematic-engine"]], "Features in rai": [[34, "features-in-rai"]], "Inverse Kinematics": [[34, "inverse-kinematics"]], "Building an NLP from features": [[34, "building-an-nlp-from-features"]], "Classical Derivation of Pseudo-Inverse Jacobian Solution": [[34, "classical-derivation-of-pseudo-inverse-jacobian-solution"]], "Pseudo-inverse Jacobian.": [[34, "pseudo-inverse-jacobian"]], "On the fly IK.": [[34, "on-the-fly-ik"]], "Singularity.": [[34, "singularity"]], "Placeholder": [[34, "placeholder"], [34, "id4"]], "3D Transformations, Rotations, Quaternions": [[34, "d-transformations-rotations-quaternions"]], "Rotations": [[34, "rotations"]], "Static transformations": [[34, "static-transformations"]], "Dynamic transformations": [[34, "dynamic-transformations"]], "A note on affine coordinate frames": [[34, "a-note-on-affine-coordinate-frames"]], "RAI references": [[34, "rai-references"]], "NLP interface": [[34, "nlp-interface"]], "Kinematic Features": [[34, "kinematic-features"]], "Graph-Yaml Files": [[34, "graph-yaml-files"]], "yaml-style files to describe robot configurations": [[34, "yaml-style-files-to-describe-robot-configurations"]], "Cameras": [[34, "cameras"]], "Image, Camera, & World Coordinates": [[34, "image-camera-world-coordinates"]], "Homogeneous coordinates & Camera Matrix P": [[34, "homogeneous-coordinates-camera-matrix-p"]], "Calibration as Estimating P,K,R,t from Depth Data": [[34, "calibration-as-estimating-p-k-r-t-from-depth-data"]], "Shapes": [[34, "shapes"]], "Kinematics formally": [[34, "kinematics-formally"]]}, "indexentries": {"argword (class in ry)": [[33, "ry.ArgWord"]], "botop (class in ry)": [[33, "ry.BotOp"]], "config (class in ry)": [[33, "ry.Config"]], "controlmode (class in ry)": [[33, "ry.ControlMode"]], "fs (class in ry)": [[33, "ry.FS"]], "feature (class in ry)": [[33, "ry.Feature"]], "frame (class in ry)": [[33, "ry.Frame"]], "imptype (class in ry)": [[33, "ry.ImpType"]], "jt (class in ry)": [[33, "ry.JT"]], "komo (class in ry)": [[33, "ry.KOMO"]], "nlp (class in ry)": [[33, "ry.NLP"]], "nlp_factory (class in ry)": [[33, "ry.NLP_Factory"]], "nlp_solver (class in ry)": [[33, "ry.NLP_Solver"]], "nlp_solverid (class in ry)": [[33, "ry.NLP_SolverID"]], "nlp_solveroptions (class in ry)": [[33, "ry.NLP_SolverOptions"]], "ot (class in ry)": [[33, "ry.OT"]], "pathfinder (class in ry)": [[33, "ry.PathFinder"]], "st (class in ry)": [[33, "ry.ST"]], "sy (class in ry)": [[33, "ry.SY"]], "simulation (class in ry)": [[33, "ry.Simulation"]], "simulationengine (class in ry)": [[33, "ry.SimulationEngine"]], "solverreturn (class in ry)": [[33, "ry.SolverReturn"]], "addattribute() (ry.frame method)": [[33, "ry.Frame.addAttribute"]], "addattributes() (ry.frame method)": [[33, "ry.Frame.addAttributes"]], "addconfigurationcopy() (ry.config method)": [[33, "ry.Config.addConfigurationCopy"]], "addcontrolobjective() (ry.komo method)": [[33, "ry.KOMO.addControlObjective"]], "addfile() (ry.config method)": [[33, "ry.Config.addFile"]], "addframe() (ry.config method)": [[33, "ry.Config.addFrame"]], "addimp() (ry.simulation method)": [[33, "ry.Simulation.addImp"]], "addinteraction_elasticbounce() (ry.komo method)": [[33, "ry.KOMO.addInteraction_elasticBounce"]], "addmodeswitch() (ry.komo method)": [[33, "ry.KOMO.addModeSwitch"]], "addobject() (ry.config method)": [[33, "ry.Config.addObject"]], "addobjective() (ry.komo method)": [[33, "ry.KOMO.addObjective"]], "addquaternionnorms() (ry.komo method)": [[33, "ry.KOMO.addQuaternionNorms"]], "addsensor() (ry.simulation method)": [[33, "ry.Simulation.addSensor"]], "addtimeoptimization() (ry.komo method)": [[33, "ry.KOMO.addTimeOptimization"]], "attach() (ry.config method)": [[33, "ry.Config.attach"]], "cameraview() (ry.config method)": [[33, "ry.Config.cameraView"]], "clear() (ry.config method)": [[33, "ry.Config.clear"]], "clearobjectives() (ry.komo method)": [[33, "ry.KOMO.clearObjectives"]], "closegripper() (ry.simulation method)": [[33, "ry.Simulation.closeGripper"]], "compiled() (in module ry)": [[33, "ry.compiled"]], "computecollisions() (ry.config method)": [[33, "ry.Config.computeCollisions"]], "copy() (ry.config method)": [[33, "ry.Config.copy"]], "delframe() (ry.config method)": [[33, "ry.Config.delFrame"]], "depthdata2pointcloud() (ry.simulation method)": [[33, "ry.Simulation.depthData2pointCloud"]], "description() (ry.feature method)": [[33, "ry.Feature.description"]], "dict() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.dict"]], "dict() (ry.solverreturn method)": [[33, "ry.SolverReturn.dict"]], "equationofmotion() (ry.config method)": [[33, "ry.Config.equationOfMotion"]], "eval() (ry.config method)": [[33, "ry.Config.eval"]], "eval() (ry.feature method)": [[33, "ry.Feature.eval"]], "evaluate() (ry.nlp method)": [[33, "ry.NLP.evaluate"]], "feature() (ry.config method)": [[33, "ry.Config.feature"]], "frame() (ry.config method)": [[33, "ry.Config.frame"]], "frames() (ry.config method)": [[33, "ry.Config.frames"]], "getattributes() (ry.frame method)": [[33, "ry.Frame.getAttributes"]], "getbounds() (ry.nlp method)": [[33, "ry.NLP.getBounds"]], "getcamerafxypxy() (ry.botop method)": [[33, "ry.BotOp.getCameraFxypxy"]], "getcollisions() (ry.config method)": [[33, "ry.Config.getCollisions"]], "getconstraintviolations() (ry.komo method)": [[33, "ry.KOMO.getConstraintViolations"]], "getcosts() (ry.komo method)": [[33, "ry.KOMO.getCosts"]], "getdimension() (ry.nlp method)": [[33, "ry.NLP.getDimension"]], "getdofids() (ry.config method)": [[33, "ry.Config.getDofIDs"]], "getfhessian() (ry.nlp method)": [[33, "ry.NLP.getFHessian"]], "getfeaturetypes() (ry.nlp method)": [[33, "ry.NLP.getFeatureTypes"]], "getforceinteractions() (ry.komo method)": [[33, "ry.KOMO.getForceInteractions"]], "getframe() (ry.config method)": [[33, "ry.Config.getFrame"]], "getframedimension() (ry.config method)": [[33, "ry.Config.getFrameDimension"]], "getframenames() (ry.config method)": [[33, "ry.Config.getFrameNames"]], "getframestate() (ry.config method)": [[33, "ry.Config.getFrameState"]], "getframestate() (ry.komo method)": [[33, "ry.KOMO.getFrameState"]], "getgripperisgrasping() (ry.simulation method)": [[33, "ry.Simulation.getGripperIsGrasping"]], "getgripperwidth() (ry.simulation method)": [[33, "ry.Simulation.getGripperWidth"]], "getgroundtruthposition() (ry.simulation method)": [[33, "ry.Simulation.getGroundTruthPosition"]], "getgroundtruthrotationmatrix() (ry.simulation method)": [[33, "ry.Simulation.getGroundTruthRotationMatrix"]], "getgroundtruthsize() (ry.simulation method)": [[33, "ry.Simulation.getGroundTruthSize"]], "getimageanddepth() (ry.botop method)": [[33, "ry.BotOp.getImageAndDepth"]], "getimageanddepth() (ry.simulation method)": [[33, "ry.Simulation.getImageAndDepth"]], "getimagedepthpcl() (ry.botop method)": [[33, "ry.BotOp.getImageDepthPcl"]], "getinitializationsample() (ry.nlp method)": [[33, "ry.NLP.getInitializationSample"]], "getjointdimension() (ry.config method)": [[33, "ry.Config.getJointDimension"]], "getjointnames() (ry.config method)": [[33, "ry.Config.getJointNames"]], "getjointstate() (ry.config method)": [[33, "ry.Config.getJointState"]], "getjointstate() (ry.frame method)": [[33, "ry.Frame.getJointState"]], "getkeypressed() (ry.botop method)": [[33, "ry.BotOp.getKeyPressed"]], "getmeshpoints() (ry.frame method)": [[33, "ry.Frame.getMeshPoints"]], "getmeshtriangles() (ry.frame method)": [[33, "ry.Frame.getMeshTriangles"]], "getoptions() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.getOptions"]], "getpath() (ry.komo method)": [[33, "ry.KOMO.getPath"]], "getpathframes() (ry.komo method)": [[33, "ry.KOMO.getPathFrames"]], "getpathtau() (ry.komo method)": [[33, "ry.KOMO.getPathTau"]], "getpath_qall() (ry.komo method)": [[33, "ry.KOMO.getPath_qAll"]], "getposition() (ry.frame method)": [[33, "ry.Frame.getPosition"]], "getquaternion() (ry.frame method)": [[33, "ry.Frame.getQuaternion"]], "getrelativeposition() (ry.frame method)": [[33, "ry.Frame.getRelativePosition"]], "getrelativequaternion() (ry.frame method)": [[33, "ry.Frame.getRelativeQuaternion"]], "getreport() (ry.komo method)": [[33, "ry.KOMO.getReport"]], "getrotationmatrix() (ry.frame method)": [[33, "ry.Frame.getRotationMatrix"]], "getscreenshot() (ry.simulation method)": [[33, "ry.Simulation.getScreenshot"]], "getsize() (ry.frame method)": [[33, "ry.Frame.getSize"]], "getstartgoalpath() (in module ry)": [[33, "ry.getStartGoalPath"]], "getstate() (ry.simulation method)": [[33, "ry.Simulation.getState"]], "gett() (ry.komo method)": [[33, "ry.KOMO.getT"]], "gettimetoend() (ry.botop method)": [[33, "ry.BotOp.getTimeToEnd"]], "gettimetomove() (ry.simulation method)": [[33, "ry.Simulation.getTimeToMove"]], "gettrace_j() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.getTrace_J"]], "gettrace_costs() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.getTrace_costs"]], "gettrace_phi() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.getTrace_phi"]], "gettrace_x() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.getTrace_x"]], "get_q() (ry.botop method)": [[33, "ry.BotOp.get_q"]], "get_q() (ry.simulation method)": [[33, "ry.Simulation.get_q"]], "get_qdot() (ry.botop method)": [[33, "ry.BotOp.get_qDot"]], "get_qdot() (ry.simulation method)": [[33, "ry.Simulation.get_qDot"]], "get_qhome() (ry.botop method)": [[33, "ry.BotOp.get_qHome"]], "get_t() (ry.botop method)": [[33, "ry.BotOp.get_t"]], "get_tauexternal() (ry.botop method)": [[33, "ry.BotOp.get_tauExternal"]], "gripperclose() (ry.botop method)": [[33, "ry.BotOp.gripperClose"]], "gripperclosegrasp() (ry.botop method)": [[33, "ry.BotOp.gripperCloseGrasp"]], "gripperdone() (ry.botop method)": [[33, "ry.BotOp.gripperDone"]], "gripperopen() (ry.botop method)": [[33, "ry.BotOp.gripperOpen"]], "gripperpos() (ry.botop method)": [[33, "ry.BotOp.gripperPos"]], "hold() (ry.botop method)": [[33, "ry.BotOp.hold"]], "home() (ry.botop method)": [[33, "ry.BotOp.home"]], "info() (ry.frame method)": [[33, "ry.Frame.info"]], "initorg() (ry.komo method)": [[33, "ry.KOMO.initOrg"]], "initphasewithdofspath() (ry.komo method)": [[33, "ry.KOMO.initPhaseWithDofsPath"]], "initrandom() (ry.komo method)": [[33, "ry.KOMO.initRandom"]], "initwithconstant() (ry.komo method)": [[33, "ry.KOMO.initWithConstant"]], "initwithpath_qorg() (ry.komo method)": [[33, "ry.KOMO.initWithPath_qOrg"]], "initwithwaypoints() (ry.komo method)": [[33, "ry.KOMO.initWithWaypoints"]], "loadteleopcallbacks() (ry.simulation method)": [[33, "ry.Simulation.loadTeleopCallbacks"]], "makeobjectsconvex() (ry.config method)": [[33, "ry.Config.makeObjectsConvex"]], "makeobjectsfree() (ry.config method)": [[33, "ry.Config.makeObjectsFree"]], "module": [[33, "module-ry"]], "move() (ry.botop method)": [[33, "ry.BotOp.move"]], "moveautotimed() (ry.botop method)": [[33, "ry.BotOp.moveAutoTimed"]], "moveto() (ry.botop method)": [[33, "ry.BotOp.moveTo"]], "name (ry.argword property)": [[33, "ry.ArgWord.name"]], "name (ry.controlmode property)": [[33, "ry.ControlMode.name"]], "name (ry.fs property)": [[33, "ry.FS.name"]], "name (ry.imptype property)": [[33, "ry.ImpType.name"]], "name (ry.jt property)": [[33, "ry.JT.name"]], "name (ry.nlp_solverid property)": [[33, "ry.NLP_SolverID.name"]], "name (ry.ot property)": [[33, "ry.OT.name"]], "name (ry.st property)": [[33, "ry.ST.name"]], "name (ry.sy property)": [[33, "ry.SY.name"]], "name (ry.simulationengine property)": [[33, "ry.SimulationEngine.name"]], "nlp() (ry.komo method)": [[33, "ry.KOMO.nlp"]], "opengripper() (ry.simulation method)": [[33, "ry.Simulation.openGripper"]], "params_add() (in module ry)": [[33, "ry.params_add"]], "params_file() (in module ry)": [[33, "ry.params_file"]], "params_print() (in module ry)": [[33, "ry.params_print"]], "pushconfigurationtosimulator() (ry.simulation method)": [[33, "ry.Simulation.pushConfigurationToSimulator"]], "raipath() (in module ry)": [[33, "ry.raiPath"]], "report() (ry.config method)": [[33, "ry.Config.report"]], "report() (ry.nlp method)": [[33, "ry.NLP.report"]], "reportproblem() (ry.komo method)": [[33, "ry.KOMO.reportProblem"]], "restorestate() (ry.simulation method)": [[33, "ry.Simulation.restoreState"]], "ry": [[33, "module-ry"]], "selectjoints() (ry.config method)": [[33, "ry.Config.selectJoints"]], "selectjointsbytag() (ry.config method)": [[33, "ry.Config.selectJointsByTag"]], "selectsensor() (ry.simulation method)": [[33, "ry.Simulation.selectSensor"]], "setbounds() (ry.nlp_factory method)": [[33, "ry.NLP_Factory.setBounds"]], "setcolor() (ry.frame method)": [[33, "ry.Frame.setColor"]], "setcompliance() (ry.botop method)": [[33, "ry.BotOp.setCompliance"]], "setconfig() (ry.komo method)": [[33, "ry.KOMO.setConfig"]], "setcontact() (ry.frame method)": [[33, "ry.Frame.setContact"]], "setcontrollerwritedata() (ry.botop method)": [[33, "ry.BotOp.setControllerWriteData"]], "setdimension() (ry.nlp_factory method)": [[33, "ry.NLP_Factory.setDimension"]], "setevalcallback() (ry.nlp_factory method)": [[33, "ry.NLP_Factory.setEvalCallback"]], "setexplicitcollisionpairs() (ry.pathfinder method)": [[33, "ry.PathFinder.setExplicitCollisionPairs"]], "setfeaturetypes() (ry.nlp_factory method)": [[33, "ry.NLP_Factory.setFeatureTypes"]], "setframestate() (ry.config method)": [[33, "ry.Config.setFrameState"]], "setjoint() (ry.frame method)": [[33, "ry.Frame.setJoint"]], "setjointstate() (ry.config method)": [[33, "ry.Config.setJointState"]], "setjointstate() (ry.frame method)": [[33, "ry.Frame.setJointState"]], "setjointstateslice() (ry.config method)": [[33, "ry.Config.setJointStateSlice"]], "setmass() (ry.frame method)": [[33, "ry.Frame.setMass"]], "setmeshaslines() (ry.frame method)": [[33, "ry.Frame.setMeshAsLines"]], "setmoveto() (ry.simulation method)": [[33, "ry.Simulation.setMoveto"]], "setoptions() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.setOptions"]], "setorder() (ry.feature method)": [[33, "ry.Feature.setOrder"]], "setparent() (ry.frame method)": [[33, "ry.Frame.setParent"]], "setpointcloud() (ry.frame method)": [[33, "ry.Frame.setPointCloud"]], "setpose() (ry.frame method)": [[33, "ry.Frame.setPose"]], "setposition() (ry.frame method)": [[33, "ry.Frame.setPosition"]], "setproblem() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.setProblem"]], "setproblem() (ry.pathfinder method)": [[33, "ry.PathFinder.setProblem"]], "setquaternion() (ry.frame method)": [[33, "ry.Frame.setQuaternion"]], "setraipath() (in module ry)": [[33, "ry.setRaiPath"]], "setrelativepose() (ry.frame method)": [[33, "ry.Frame.setRelativePose"]], "setrelativeposition() (ry.frame method)": [[33, "ry.Frame.setRelativePosition"]], "setrelativequaternion() (ry.frame method)": [[33, "ry.Frame.setRelativeQuaternion"]], "setscale() (ry.feature method)": [[33, "ry.Feature.setScale"]], "setshape() (ry.frame method)": [[33, "ry.Frame.setShape"]], "setsolver() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.setSolver"]], "setstate() (ry.simulation method)": [[33, "ry.Simulation.setState"]], "settarget() (ry.feature method)": [[33, "ry.Feature.setTarget"]], "settiming() (ry.komo method)": [[33, "ry.KOMO.setTiming"]], "settracing() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.setTracing"]], "set_damping() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_damping"]], "set_maxstep() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_maxStep"]], "set_muinc() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_muInc"]], "set_muinit() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_muInit"]], "set_mulbdec() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_muLBDec"]], "set_mulbinit() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_muLBInit"]], "set_mumax() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_muMax"]], "set_stepdec() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stepDec"]], "set_stepinc() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stepInc"]], "set_stopevals() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stopEvals"]], "set_stopftolerance() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stopFTolerance"]], "set_stopgtolerance() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stopGTolerance"]], "set_stoptolerance() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_stopTolerance"]], "set_verbose() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_verbose"]], "set_wolfe() (ry.nlp_solveroptions method)": [[33, "ry.NLP_SolverOptions.set_wolfe"]], "simulation() (ry.config method)": [[33, "ry.Config.simulation"]], "solve() (ry.nlp_solver method)": [[33, "ry.NLP_Solver.solve"]], "solve() (ry.pathfinder method)": [[33, "ry.PathFinder.solve"]], "sortframes() (ry.config method)": [[33, "ry.Config.sortFrames"]], "step() (ry.pathfinder method)": [[33, "ry.PathFinder.step"]], "step() (ry.simulation method)": [[33, "ry.Simulation.step"]], "stepdynamics() (ry.config method)": [[33, "ry.Config.stepDynamics"]], "stop() (ry.botop method)": [[33, "ry.BotOp.stop"]], "sync() (ry.botop method)": [[33, "ry.BotOp.sync"]], "testcallingevalcallback() (ry.nlp_factory method)": [[33, "ry.NLP_Factory.testCallingEvalCallback"]], "unlink() (ry.frame method)": [[33, "ry.Frame.unLink"]], "view() (ry.config method)": [[33, "ry.Config.view"]], "view() (ry.komo method)": [[33, "ry.KOMO.view"]], "view_close() (ry.config method)": [[33, "ry.Config.view_close"]], "view_close() (ry.komo method)": [[33, "ry.KOMO.view_close"]], "view_getscreenshot() (ry.config method)": [[33, "ry.Config.view_getScreenshot"]], "view_play() (ry.komo method)": [[33, "ry.KOMO.view_play"]], "view_playvideo() (ry.config method)": [[33, "ry.Config.view_playVideo"]], "view_recopymeshes() (ry.config method)": [[33, "ry.Config.view_recopyMeshes"]], "watchfile() (ry.config method)": [[33, "ry.Config.watchFile"]]}})
\ No newline at end of file
+Search.setIndex({"docnames": ["getting_started", "index", "notebooks/1a-configurations", "notebooks/1b-botop", "notebooks/1c-komo", "notebooks/botop2-realRobotStarters", "notebooks/botop3-vision", "notebooks/botop3-vision-toBeMerged", "notebooks/botop4-examples", "notebooks/core2-features", "notebooks/core3-configurations", "notebooks/komo1-IK-toBeMerged", "notebooks/komo2-PathOptimization", "notebooks/komo2-PathOptimization-toBeMerged", "notebooks/komo3-switches-skeletons", "notebooks/notebooks", "notebooks/opt1-basics", "notebooks/script5-PathFind", "notebooks/sim1-physics", "old/_Array", "old/_Configuration", "old/_ConfigurationFiles", "old/_Graph", "old/_Simulation", "old/komo", "old/old", "old/simlab", "old/simlab1", "old/simlab2", "old/simlab3", "old/simlab4", "old/simlab5", "old/skeleton", "rai", "script/script"], "filenames": ["getting_started.rst", "index.rst", "notebooks/1a-configurations.ipynb", "notebooks/1b-botop.ipynb", "notebooks/1c-komo.ipynb", "notebooks/botop2-realRobotStarters.ipynb", "notebooks/botop3-vision.ipynb", "notebooks/botop3-vision-toBeMerged.ipynb", "notebooks/botop4-examples.ipynb", "notebooks/core2-features.ipynb", "notebooks/core3-configurations.ipynb", "notebooks/komo1-IK-toBeMerged.ipynb", "notebooks/komo2-PathOptimization.ipynb", "notebooks/komo2-PathOptimization-toBeMerged.ipynb", "notebooks/komo3-switches-skeletons.ipynb", "notebooks/notebooks.rst", "notebooks/opt1-basics.ipynb", "notebooks/script5-PathFind.ipynb", "notebooks/sim1-physics.ipynb", "old/_Array.rst", "old/_Configuration.rst", "old/_ConfigurationFiles.rst", "old/_Graph.rst", "old/_Simulation.rst", "old/komo.rst", "old/old.rst", "old/simlab.rst", "old/simlab1.rst", "old/simlab2.rst", "old/simlab3.rst", "old/simlab4.rst", "old/simlab5.rst", "old/skeleton.rst", "rai.rst", "script/script.rst"], "titles": ["
1. Getting Started", "Welcome to the Robotics Course Repo", "
2.1.1. Configurations", "
2.1.2. Robot Operation (BotOp) interface", "
2.1.3. KOMO: Motion Optimization", "
2.2.7. Starting with a real robot", "
2.2.8. First example to grap images from a webcam", "<no title>", "
2.2.9. Example for grasping in Sim", "
2.2.1. Features", "
2.2.2. Importing, Editing & Manipulating Configurations", "
2.2.3. Inverse Kinematics as Optimization (to be merged)", "
2.2.4. Path optimization example", "
2.2.5. Path Optimization (to be merged)", "
2.2.6. Advanced: Switches & Skeletons", "
2. Tutorials", "
2.2.11. Optimization (NLP formulation and solving)", "
2.2.12. Path finding example", "
2.2.10. Direct simulation interface", "
4.7. Array", "
4.3. Configuration", "
4.4. .g-files to describe robot configurations", "
4.5. Graph and .g-files", "
4.6. Simulation", "
4.2. Learning KOMO (K-Order Markov Optimization)", "
4. Old Material", "
4.1. Lab Course in Simulation", "
4.1.1. SimLab Exercise 1 - Basic Setup", "
4.1.2. SimLab Exercise 2 - Motion", "
4.1.3. SimLab Exercise 3 - OpenCV", "
4.1.4. SimLab Exercise 4 - Grasp", "
4.1.5. SimLab - Project Proposal and Final Presentation", "Learning about Skeletons & LGP", "
5. rai python API", "
3. Lecture Script"], "terms": {"robot": [0, 2, 4, 7, 8, 9, 11, 12, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "python": [0, 1, 3, 7, 8, 9, 15, 21, 22, 24, 27, 28, 29, 34], "packag": [0, 21, 24, 31, 34], "On": [0, 2], "standard": [0, 11, 13, 22, 23, 29, 34], "ubuntu": [0, 31, 34], "follow": [0, 3, 4, 10, 20, 21, 23, 24, 27, 30, 31, 34], "should": [0, 1, 4, 9, 20, 21, 23, 24, 27, 28, 31, 34], "suffici": [0, 34], "sudo": [0, 34], "apt": [0, 34], "liblapack3": [0, 34], "freeglut3": [0, 34], "libglew": [0, 34], "dev": [0, 34], "python3": [0, 7, 34], "pip": [0, 34], "m": [0, 20, 34], "user": [0, 1, 2, 3, 20, 23, 24, 26, 34], "numpi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 34], "scipi": [0, 34], "A": [0, 2, 4, 8, 9, 11, 20, 21, 22, 23, 24, 30, 31], "test": [0, 4, 21, 22, 25, 27, 28, 29, 34], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 34], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 21, 22, 24, 25, 29, 34], "from": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 27, 28, 30, 31, 32], "import": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 24, 25, 27, 28], "ry": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 34], "print": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 34], "version": [0, 7, 8, 24, 27], "__version__": [0, 6, 8], "compil": [0, 2, 8, 18, 21, 24, 27, 34], "rndscene": [0, 34], "real": [0, 1, 3, 4, 10, 12, 15, 17, 18, 23, 25, 27, 30, 34], "The": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 34], "doe": [0, 1, 10, 17, 20, 22, 25, 28, 29, 30, 34], "have": [0, 1, 2, 3, 4, 8, 16, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 34], "driver": 0, "panda": [0, 2, 3, 10], "includ": [0, 2, 9, 10, 20, 22, 24, 26, 27, 31, 34], "therefor": [0, 20, 21, 23, 24, 30, 34], "onli": [0, 1, 3, 4, 5, 6, 7, 9, 10, 11, 12, 17, 19, 20, 21, 22, 25, 27, 28, 29, 31, 32, 34], "support": [0, 9, 10, 21, 27, 34], "simul": [0, 1, 3, 5, 8, 10, 15, 25, 28, 29, 30, 34], "mode": [0, 3, 11, 18, 32], "howev": [0, 2, 9, 11, 18, 20, 21, 24, 34], "interfac": [0, 1, 4, 10, 12, 15, 16, 17, 19, 20, 24, 28], "code": [0, 1, 3, 7, 16, 19, 20, 21, 23, 24, 25, 26, 29, 30, 31], "design": [0, 2, 4, 8, 11, 24, 28, 30], "so": [0, 2, 3, 4, 8, 9, 10, 11, 13, 16, 20, 21, 22, 23, 24, 28, 29, 31, 32, 34], "everyth": [0, 2, 6, 24, 30], "directli": [0, 3, 4, 9, 10, 22, 23, 24, 27, 28, 34], "transfer": 0, "all": [0, 1, 2, 4, 9, 11, 15, 16, 18, 20, 21, 22, 23, 24, 27, 28, 29, 34], "you": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 21, 23, 25, 27, 28, 29, 30, 31, 32, 34], "do": [0, 1, 2, 3, 4, 23, 25, 26, 28, 29, 30, 34], "re": [0, 2, 3, 4, 9, 21, 23, 27, 30, 34], "your": [0, 3, 5, 10, 11, 24, 27, 28, 29, 30, 31], "machin": [0, 26], "libfranka": 0, "librealsens": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 34], "done": [0, 3, 4, 6, 8, 21, 24, 34], "us": [0, 1, 2, 3, 4, 8, 9, 10, 11, 17, 19, 20, 22, 23, 24, 25, 27, 29, 30, 31, 32], "pdflatex": 0, "sourc": [0, 7, 34], "wheel": [0, 34], "creat": [0, 1, 2, 3, 8, 9, 10, 11, 22, 24, 25, 27, 28, 29, 31, 34], "repo": [0, 27, 28, 29, 30], "hardest": 0, "part": [0, 20, 21, 24, 31, 34], "wa": [0, 3, 18, 19, 22, 24], "docker": [0, 34], "mani": [0, 3, 4, 9, 11, 20, 23, 24, 32, 34], "depend": [0, 3, 11, 24, 27, 34], "static": [0, 3], "librari": [0, 21, 24, 27, 34], "cento": 0, "onc": [0, 4, 24], "": [0, 2, 3, 4, 9, 11, 13, 14, 17, 20, 21, 24, 28, 32, 34], "botop": [0, 1, 4, 5, 6, 7, 8, 10, 12, 17, 18], "lib": [0, 11, 14, 16, 18, 19], "can": [0, 1, 2, 3, 4, 7, 9, 10, 11, 17, 20, 21, 22, 23, 25, 27, 28, 29, 30, 31, 32, 34], "compat": 0, "manner": [0, 2, 9, 32, 34], "share": [0, 1, 20, 24], "docstr": 0, "tab": 0, "complet": [0, 16, 23, 34], "when": [0, 2, 3, 4, 6, 7, 9, 10, 11, 20, 21, 24, 28, 29, 30, 32, 34], "an": [0, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32], "id": [0, 7, 11], "e": [0, 2, 3, 4, 9, 10, 11, 18, 20, 21, 22, 24, 25, 27, 30, 31, 34], "g": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 20, 23, 24, 25, 27, 28, 30, 31, 32, 34], "v": [0, 7, 9, 10, 18, 27, 28, 31, 34], "definit": [0, 4, 11, 27, 34], "want": [0, 1, 3, 4, 9, 11, 21, 24, 25, 31, 34], "method": [0, 1, 3, 4, 8, 9, 10, 11, 12, 17, 20, 22, 23, 25, 26, 27, 28, 30, 31, 34], "modul": [0, 1, 4, 9, 10, 34], "pybind11": [0, 27], "nativ": 0, "lack": 0, "stubgen": 0, "one": [0, 3, 4, 8, 9, 11, 20, 21, 22, 24, 27, 28, 29, 32, 34], "gener": [0, 1, 2, 3, 4, 11, 16, 20, 21, 24, 26, 28, 30, 31, 32, 34], "someth": [0, 9, 31], "like": [0, 3, 9, 20, 21, 24, 31, 34], "header": [0, 24, 27], "file": [0, 1, 2, 9, 10, 20, 23, 24, 25, 27, 32], "whole": [0, 9, 11, 21, 34], "call": [0, 2, 3, 4, 9, 10, 11, 16, 20, 21, 22, 24, 27, 28, 30, 32, 34], "ipi": 0, "That": [0, 2, 3, 4, 20, 24, 32, 34], "resid": 0, "local": [0, 3, 28, 30, 34], "site": 0, "next": [0, 21, 24, 27, 34], "py": [0, 7, 21, 24, 34], "work": [0, 4, 9, 11, 21, 24, 26, 27, 28, 29, 31, 32, 34], "ensur": [0, 4, 20, 24, 34], "after": [0, 2, 8, 12, 17, 20, 22, 24, 26, 30, 34], "class": [0, 1, 4, 9, 19, 22, 23, 24, 25, 34], "If": [0, 2, 3, 11, 20, 24, 27, 31, 34], "autocomplet": 0, "jupyt": [0, 15, 27, 34], "try": [0, 9, 19, 21, 27, 28, 30, 31, 32, 34], "pip3": 0, "jedi": 0, "0": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 28, 34], "17": [0, 4, 8], "2": [0, 1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 25, 26, 30, 31, 34], "git": [0, 7, 10, 25, 28, 29, 30, 34], "clone": 0, "http": [0, 1, 9, 15, 21, 24, 26, 27, 29, 31, 34], "github": [0, 1, 9, 15, 21, 24, 26, 27, 34], "com": [0, 1, 9, 15, 21, 24, 26, 27, 31, 34], "marctoussaint": [0, 1, 9, 15, 21, 24, 26, 27, 34], "rai": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 20, 21, 22, 25, 27, 32], "cd": [0, 27, 28, 29, 30], "don": [0, 4, 6, 9, 31, 34], "t": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 17, 19, 20, 21, 24, 28, 31], "yet": [0, 21, 23, 24, 27, 28, 34], "nbconvert": 0, "matplotlib": [0, 4, 7], "repositori": [1, 21, 24, 26, 27, 34], "three": [1, 4, 9, 11, 21, 24, 28, 34], "lectur": [1, 7, 26], "introduct": [1, 26], "To": [1, 4, 9, 10, 11, 20, 24, 32, 34], "u": [1, 7, 27, 28, 31, 34], "stuttgart": 1, "lab": [1, 25, 27], "baxter": 1, "we": [1, 2, 3, 4, 6, 7, 9, 10, 11, 12, 17, 18, 20, 21, 24, 26, 27, 28, 31, 34], "offer": 1, "some": [1, 2, 4, 8, 9, 10, 11, 13, 20, 21, 22, 23, 24, 26, 27, 28, 31, 32, 34], "year": [1, 26], "And": [1, 2, 4, 21, 23, 24, 28, 34], "now": [1, 2, 3, 4, 11, 22, 24, 28, 34], "both": [1, 4, 8, 9, 20, 22, 30, 32, 34], "tu": [1, 26, 34], "berlin": [1, 26, 34], "thei": [1, 8, 9, 11, 20, 21, 23, 24, 32, 34], "same": [1, 3, 4, 9, 18, 20, 21, 23, 24, 28, 29, 34], "core": [1, 20, 22, 23, 25, 27, 31, 34], "quit": [1, 8, 24], "differ": [1, 3, 4, 9, 11, 12, 14, 20, 23, 24, 27, 28, 29, 34], "instal": [1, 10, 27, 34], "setup": [1, 11, 13, 25, 26, 28], "exercis": [1, 25, 26, 34], "embed": 1, "below": [1, 4, 9, 19, 21, 24, 26, 28, 30, 31, 34], "ar": [1, 2, 3, 4, 7, 8, 9, 10, 15, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 34], "document": [1, 25, 29], "refer": [1, 3, 4, 8, 9, 11, 23, 24], "almost": [1, 4, 24], "ident": [1, 24, 34], "how": [1, 2, 3, 4, 11, 20, 21, 25, 27, 28, 29, 30, 31, 32, 34], "get": [1, 2, 4, 9, 24, 25, 27, 28], "start": [1, 2, 3, 11, 15, 17, 22, 24, 27, 28, 29, 31, 32], "quick": 1, "avanc": 1, "info": 1, "tutori": [1, 2, 3, 4, 25, 27, 28, 29], "notebook": [1, 15, 27, 34], "round": [1, 28], "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 25, 26, 28, 30, 31, 32, 34], "basic": [1, 2, 3, 4, 10, 11, 19, 20, 24, 25, 26, 32, 34], "configur": [1, 3, 4, 8, 11, 12, 13, 17, 22, 23, 24, 25, 28, 29, 32], "komo": [1, 3, 8, 9, 12, 13, 14, 17, 25, 28, 30, 34], "oper": [1, 6, 8, 15, 20, 24, 25, 27, 32, 34], "motion": [1, 3, 5, 8, 12, 15, 17, 20, 24, 25, 26, 30, 34], "optim": [1, 2, 3, 9, 14, 15, 17, 20, 21, 22, 25, 26, 30, 32, 34], "waypoint": [8, 34], "exampl": [1, 2, 3, 15, 20, 21, 22, 24, 27, 28, 29, 31, 34], "problem": [1, 2, 3, 4, 8, 9, 11, 12, 17, 20, 22, 25, 26, 28, 31, 32, 34], "featur": [1, 4, 10, 12, 13, 15, 16, 25], "edit": [1, 15, 22, 24, 25, 31], "manipul": [1, 15, 24, 26, 32], "invers": [1, 3, 4, 15, 20, 30], "kinemat": [1, 2, 3, 4, 8, 10, 15, 18, 20, 21, 22, 23, 25], "merg": [1, 7, 15], "path": [1, 7, 8, 10, 11, 14, 15, 16, 18, 20, 21, 25, 32, 34], "advanc": [1, 4, 15, 24, 25], "switch": [1, 5, 15, 25, 31, 32, 34], "skeleton": [1, 15], "sim": [1, 3, 12, 15, 17, 34], "first": [1, 2, 4, 10, 12, 15, 17, 21, 22, 25, 27, 28, 29, 31, 32, 34], "grap": [1, 15, 28], "imag": [1, 3, 5, 7, 9, 10, 15, 25, 27, 29], "webcam": [1, 15, 29], "grasp": [1, 11, 14, 15, 24, 25, 26, 28], "more": [1, 2, 3, 18, 20, 21, 23, 25, 28, 29, 31, 34], "direct": [1, 4, 5, 9, 15, 17, 23, 30, 34], "nlp": [1, 3, 4, 8, 9, 12, 15, 17, 24], "formul": [1, 2, 4, 9, 12, 15, 17, 20, 24, 34], "solv": [1, 3, 4, 8, 11, 12, 15, 17, 20, 25, 26, 28, 30, 34], "find": [1, 4, 15, 20, 22, 24, 29, 30, 34], "script": [1, 4, 9, 10, 11, 21, 32], "materi": 1, "scene": [1, 10, 20, 23, 24, 27, 28, 32], "descript": [1, 9, 10, 21, 22, 23, 31, 32], "transform": [1, 2, 7, 11, 20, 23, 24, 25], "coordin": [1, 2, 7, 9, 11, 20, 24, 28, 29], "composit": 1, "tree": [1, 2, 10, 15, 20, 21, 24], "forest": 1, "parameter": [1, 2, 20], "joint": [1, 3, 4, 8, 9, 23, 24, 25, 28], "vector": [1, 2, 4, 9, 11, 19, 20, 21, 24, 30], "forward": [1, 2, 20, 23, 28], "jacobian": [1, 9, 10, 20, 24, 28, 30], "implement": [1, 3, 9, 18, 20, 23, 24, 29, 30], "engin": [1, 3, 8, 9, 10, 11, 20, 23], "placehold": 1, "3d": [1, 7, 9, 11, 20, 23, 24, 28, 29], "rotat": [1, 9, 20, 21, 30], "quaternion": [1, 2, 9, 20, 21, 24, 28], "graph": [1, 20, 21, 24, 25], "yaml": [1, 22], "style": 1, "describ": [1, 3, 9, 19, 20, 24, 25, 28, 30, 31, 32], "camera": [1, 3, 7, 10, 23, 27, 29], "world": [1, 2, 3, 7, 9, 11, 18, 20, 21, 24, 27, 28, 29, 30], "homogen": 1, "matrix": [1, 2, 4, 9, 20, 23, 24, 30], "p": [1, 2, 4, 18, 21], "calibr": 1, "estim": [1, 3, 29, 31], "k": [1, 4, 9, 12, 13, 22, 25, 28], "r": [1, 2, 7, 9, 10, 20, 21, 24], "depth": [1, 5, 6, 7, 9, 10, 25, 27, 29], "data": [1, 3, 5, 20, 21, 22, 24, 27], "shape": [1, 2, 3, 4, 9, 10, 12, 13, 17, 18, 20, 21, 24, 28], "formal": [1, 4, 20, 25, 30], "old": [1, 21, 24, 34], "simlab": [1, 25, 26], "3": [1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 31, 34], "opencv": [1, 6, 25, 26, 30], "4": [1, 2, 3, 4, 7, 8, 9, 12, 14, 17, 21, 22, 23, 25, 26, 28, 34], "project": [1, 2, 9, 25, 26, 30, 34], "propos": [1, 25, 26], "final": [1, 4, 8, 11, 17, 20, 21, 24, 25, 26, 28, 30, 34], "present": [1, 25, 26], "learn": [1, 3, 11, 18, 25, 26, 31], "order": [1, 3, 4, 9, 12, 13, 20, 25, 28, 32, 34], "markov": [1, 4, 9, 12, 25, 34], "No": [1, 25], "dynam": [1, 3, 20, 23, 25], "veloc": [1, 4, 8, 11, 20, 23, 25, 30, 34], "what": [1, 4, 21, 22, 23, 25, 28, 31, 34], "main": [1, 20, 25], "step": [1, 4, 18, 21, 25, 28, 30, 31, 32, 34], "defin": [1, 2, 3, 4, 8, 9, 10, 11, 16, 17, 20, 21, 23, 25, 28, 32, 34], "roughli": [1, 20, 25, 27, 34], "spec": [1, 25], "load": [1, 3, 8, 20, 21, 25, 34], "urdf": [1, 20, 25], "practic": [1, 25, 26, 32, 34], "vari": [1, 21, 25, 28, 34], "decis": [1, 11, 20, 25, 32], "variabl": [1, 4, 11, 20, 25], "per": [1, 4, 25, 28, 34], "time": [1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 16, 17, 18, 20, 25, 26, 28, 31, 32, 34], "slice": [1, 3, 11, 25, 28], "forc": [1, 20, 23, 25, 28, 34], "contact": [1, 9, 10, 25], "summari": [1, 25], "few": [1, 25], "fundament": [1, 20, 25, 34], "rest": [1, 25, 26], "helper": [1, 4, 25, 34], "phase": [1, 3, 4, 10, 25, 28, 32], "link": [1, 3, 4, 8, 20, 21, 23, 25, 34], "tor": [1, 25], "ad": [1, 3, 4, 8, 9, 11, 24, 25, 28, 30, 32, 34], "frame": [1, 3, 4, 7, 8, 9, 11, 21, 23, 24, 25, 27, 28, 32], "copi": [1, 3, 4, 11, 24, 25, 27, 31], "clear": [1, 2, 23, 25, 31], "state": [1, 3, 4, 9, 17, 18, 24, 25, 30, 34], "set": [1, 2, 3, 4, 9, 10, 11, 21, 23, 24, 25, 27, 28, 30, 34], "select": [1, 9, 25], "activ": [1, 3, 4, 9, 24, 25], "anyth": [1, 24, 25, 34], "might": [1, 2, 21, 24, 25, 28, 31, 32, 34], "comput": [1, 4, 7, 9, 10, 11, 12, 13, 16, 17, 24, 25, 28, 30, 31, 34], "structur": [1, 3, 5, 21, 22, 24, 25, 27, 31, 34], "collis": [1, 8, 11, 13, 17, 21, 24, 25, 34], "function": [1, 9, 16, 24, 25, 34], "other": [1, 2, 9, 10, 11, 22, 24, 25, 28, 32, 34], "viewer": [1, 25], "etc": [1, 2, 9, 11, 21, 22, 24, 25, 34], "kinedit": [1, 20, 24, 25], "notat": [1, 19, 22, 24, 25], "specifi": [1, 4, 9, 11, 12, 20, 22, 23, 24, 25, 28], "type": [1, 2, 4, 11, 12, 13, 22, 24, 25, 28], "physic": [1, 3, 10, 18, 20, 24, 25, 27], "open": [1, 2, 3, 8, 10, 12, 17, 21, 22, 25, 34], "close": [1, 2, 3, 4, 8, 9, 10, 20, 25, 28, 30, 34], "gripper": [1, 2, 3, 4, 8, 14, 25, 28, 30], "grip": [1, 25, 30], "rgb": [1, 7, 25, 27, 29], "restart": [1, 11, 21, 25, 34], "previou": [1, 11, 13, 22, 24, 25, 28, 30, 34], "depthdata2pointcloud": [1, 25], "arrai": [1, 16, 20, 22, 25, 34], "api": [1, 19], "index": [1, 9, 34], "search": [1, 22, 34], "page": [1, 27, 31], "essenti": [2, 4, 20, 24, 34], "where": [2, 4, 8, 10, 11, 21, 22, 24, 28, 29, 30, 32, 34], "each": [2, 4, 7, 8, 9, 11, 20, 21, 23, 24, 27, 29, 30, 31, 32, 34], "repres": [2, 7, 11, 20, 21, 22, 24, 27, 34], "inertia": [2, 20], "introduc": [2, 20, 21, 23, 24, 26, 34], "handl": [2, 9, 10, 24, 34], "window": [2, 3, 6, 11, 13, 21, 34], "np": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18], "sep": 2, "23": [2, 34], "2023": 2, "12": [2, 4, 8, 34], "43": 2, "33": [2, 34], "point": [2, 3, 4, 5, 7, 8, 9, 20, 23, 24, 27, 28, 29, 30, 31, 32, 34], "config": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 34], "show": [2, 4, 7, 10, 11, 31, 34], "empti": 2, "tip": [2, 28], "make": [2, 3, 4, 9, 21, 22, 24, 28, 29, 30, 31, 34], "appear": [2, 3, 24, 32, 34], "alwai": [2, 3, 4, 10, 11, 13, 18, 21, 23, 24, 28, 29, 30, 34], "top": [2, 11, 13, 24, 34], "right": [2, 7, 9, 28, 32, 34], "click": 2, "bar": [2, 34], "forrest": 2, "usual": [2, 4, 9, 10, 21, 24, 34], "add": [2, 4, 6, 9, 10, 11, 13, 20, 23, 24, 27, 28, 34], "model": [2, 14, 20, 21, 22, 24, 28, 29, 30, 34], "let": [2, 3, 4, 9, 11, 13, 24, 28, 30, 32, 34], "manual": [2, 3, 8, 20, 21, 24, 32, 34], "here": [2, 3, 4, 6, 8, 9, 10, 11, 13, 17, 20, 21, 22, 24, 29, 30, 31, 32, 34], "f": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 22, 24, 25, 34], "addfram": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 34], "name": [2, 4, 7, 9, 10, 11, 13, 18, 20, 21, 23, 24, 28, 34], "setshap": [2, 3, 4, 6, 7, 8, 11, 12, 17, 34], "st": [2, 3, 4, 6, 7, 8, 11, 12, 13, 17, 18, 34], "marker": [2, 3, 4, 7, 8, 34], "size": [2, 4, 6, 7, 8, 12, 13, 16, 17, 18, 21, 24, 28, 30, 34], "setposit": [2, 3, 4, 6, 7, 8, 11], "5": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 21, 22, 24, 31, 34], "setquaternion": [2, 4, 7], "normal": [2, 4, 9, 20, 22, 24, 34], "intern": [2, 3, 11, 21, 23, 24, 34], "po": [2, 3, 11, 13, 18, 34], "getposit": [2, 3, 4, 6, 7, 28, 34], "quat": [2, 34], "getquaternion": [2, 7, 34], "95782629": 2, "28734789": 2, "second": [2, 24, 28, 29, 34], "parent": [2, 9, 10, 13, 18, 20, 21, 22, 34], "hing": [2, 20, 21, 34], "setjoint": 2, "jt": [2, 21, 34], "hingex": [2, 21, 34], "setcolor": [2, 4, 6, 7, 8, 11, 12, 17, 34], "sinc": [2, 4, 7, 34], "articul": [2, 21, 34], "q": [2, 3, 4, 5, 6, 9, 10, 21, 24, 34], "getjointst": [2, 3, 4, 9, 10, 12, 13, 17, 20, 34], "setjointst": [2, 3, 4, 9, 10, 11, 12, 17, 20, 34], "ball": [2, 21, 25, 34], "sphere": [2, 7, 8, 11, 21, 28, 29, 30, 34], "setrelativeposit": [2, 3, 12, 17, 34], "box": [2, 8, 9, 14, 25, 28, 34], "ssbox": [2, 4, 6, 7, 8, 12, 13, 17, 18, 28, 34], "02": [2, 3, 7, 12, 13, 17, 18, 21, 26, 27, 34], "capsul": [2, 21, 28, 34], "05": [2, 6, 7, 8, 11, 13, 21, 30, 34], "rang": [2, 3, 4, 6, 7, 10, 12, 17, 18], "100": [2, 3, 4, 8, 18], "co": [2, 34], "sleep": [2, 3, 4, 6, 10, 12, 17, 18], "addfil": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 34], "raipath": [2, 3, 4, 5, 6, 7, 8, 10, 12, 17, 34], "prefix": [2, 10, 24], "move": [2, 3, 8, 9, 10, 11, 24, 27, 28, 29, 34], "side": [2, 3], "r_": [2, 34], "base_r": 2, "getfram": [2, 4, 6, 7, 10], "r_panda_bas": 2, "full": [2, 9, 11, 19, 21, 24, 28, 32, 34], "getjointnam": [2, 9], "getframenam": 2, "anim": [2, 10, 20, 27, 34], "q0": [2, 3, 12, 17, 21, 34], "20": [2, 3, 4, 12, 13, 24, 26], "random": [2, 3, 4, 11], "randn": [2, 3, 4], "For": [2, 4, 8, 11, 20, 24, 28, 29, 31, 34], "everi": [2, 29, 34], "queri": [2, 3, 9, 23, 28, 34], "its": [2, 9, 10, 11, 20, 21, 24, 27, 32, 34], "pose": [2, 3, 4, 8, 9, 17, 20, 21, 23, 24, 28, 30, 34], "r_gripper": [2, 6, 10, 12, 17, 28, 30, 32, 34], "rot": [2, 34], "getrotationmatrix": [2, 7], "abov": [2, 3, 4, 9, 10, 28, 30, 32, 34], "provid": [2, 9, 16, 19, 24, 34], "ani": [2, 4, 20, 21, 22, 24, 28, 31, 34], "wai": [2, 3, 9, 11, 13, 20, 22, 23, 24, 28, 34], "differenti": [2, 9, 11, 16, 21, 24, 34], "often": [2, 4, 9, 11, 20, 23, 24, 34], "understand": [2, 22, 28, 34], "foundat": 2, "which": [2, 3, 4, 9, 10, 11, 18, 20, 21, 22, 23, 24, 27, 28, 29, 30, 32, 34], "ll": [2, 3, 26, 27, 34], "need": [2, 3, 6, 11, 16, 18, 21, 23, 24, 27, 28, 32, 34], "lot": [2, 24, 31], "evalu": [2, 4, 9, 20, 24, 34], "y": [2, 4, 5, 7, 8, 9, 10, 16, 21, 22, 23, 28, 34], "j": [2, 5, 7, 10, 16, 22, 24, 34], "eval": [2, 3, 4, 5, 8, 9, 10, 34], "posit": [2, 3, 5, 6, 8, 9, 11, 14, 20, 21, 23, 24, 28, 29, 34], "njacobian": [2, 34], "neg": [2, 9, 10, 24, 28, 34], "distanc": [2, 4, 9, 11, 13, 20, 24, 28, 34], "between": [2, 3, 4, 9, 10, 11, 20, 21, 23, 24, 28, 31, 34], "two": [2, 3, 4, 8, 9, 11, 20, 21, 23, 24, 27, 28, 31, 32, 34], "convex": [2, 9, 24, 28, 34], "origin": [2, 9, 24, 28, 29, 34], "negdist": 2, "panda_coll7": 2, "r_panda_coll7": 2, "x": [2, 4, 7, 8, 9, 12, 16, 17, 18, 20, 21, 22, 23, 24, 28, 30, 32, 34], "axi": [2, 4, 9, 21, 28, 30, 34], "given": [2, 4, 9, 10, 17, 20, 23, 24, 28, 32, 34], "vectorx": [2, 9, 34], "n": [2, 7, 9, 10, 16, 20, 22, 24, 34], "ha": [2, 3, 4, 9, 10, 11, 20, 21, 23, 24, 28, 29, 30, 34], "7d": [2, 9, 34], "z": [2, 4, 7, 9, 11, 21, 22, 28, 30, 34], "qw": 2, "qx": 2, "qy": 2, "qz": 2, "7": [2, 3, 4, 8, 9, 11, 20, 21, 22, 24, 28, 34], "th": [2, 24], "row": [2, 34], "also": [2, 3, 4, 9, 10, 11, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 32, 34], "mean": [2, 4, 9, 11, 21, 22, 24, 28, 29, 32, 34], "rel": [2, 8, 11, 20, 21, 24, 34], "transfrom": 2, "child": [2, 10, 20, 21, 24, 34], "degre": [2, 10, 20, 21, 24, 34], "freedom": [2, 10, 20, 24, 34], "dof": [2, 9, 20, 21, 23, 24, 34], "total": [2, 3, 4, 20, 31, 34], "dimension": [2, 9, 11, 16, 24, 34], "impli": [2, 4, 9, 28, 34], "chain": [2, 21, 24, 34], "allow": [2, 3, 4, 9, 10, 20, 21, 22, 23, 24, 28, 30, 34], "inconsist": [2, 20, 34], "imposs": 2, "w": [2, 7, 9, 23, 24, 34], "assign": 2, "onto": [2, 9, 24, 34], "actual": [2, 4, 9, 20, 21, 22, 23, 24, 30, 32, 34], "contain": [2, 4, 22, 23, 24, 34], "store": [2, 4, 11, 17, 20, 23, 29, 34], "p_x": [2, 7], "p_y": [2, 7], "p_z": 2, "q_w": 2, "q_x": 2, "q_y": 2, "q_z": 2, "x0": [2, 11, 13], "getframest": [2, 11, 13, 18], "veri": [2, 3, 12, 24, 27, 31, 32, 34], "question": [2, 31, 34], "thing": [2, 20, 21, 24, 30, 31, 32, 34], "number": [2, 4, 23, 24, 28, 34], "setframest": [2, 11, 13, 18, 20], "broke": 2, "global": [2, 3, 23, 34], "overwrit": [2, 3, 20, 32, 34], "non": [2, 3, 4, 11, 16, 21, 24, 34], "These": [2, 24, 34], "reset": [2, 18, 24], "view_clos": [2, 8, 10], "still": [2, 3, 23, 24, 26, 30, 34], "paus": 2, "fals": [2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 17, 22, 34], "messag": [2, 3, 8], "wait": [2, 3], "keypress": [2, 3], "block": [2, 3, 18, 21, 32, 34], "true": [2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 16, 17, 22, 34], "press": [2, 34], "kei": [2, 3, 4, 22, 24, 34], "chr": 2, "screenshot": 2, "img": [2, 6], "view_getscreenshot": 2, "del": [2, 3, 4, 5, 6, 7, 8, 10, 12, 17], "interact": [3, 20, 25, 31], "narrow": [3, 18], "spline": [3, 4, 8, 34], "complianc": 3, "around": [3, 9, 10, 21, 25, 28, 31, 34], "getimag": 3, "grab": [3, 6, 11, 13, 23, 29], "cloud": [3, 29], "interest": [3, 9, 24, 28, 34], "latter": [3, 28, 34], "gym": 3, "environ": [3, 18, 20, 27], "look": [3, 21, 34], "thread": [3, 18], "process": [3, 23, 24, 29], "mimic": [3, 34], "specif": [3, 9, 11, 21, 24, 26, 27, 28, 29, 34], "swappabl": 3, "run": [3, 12, 17, 18, 24, 27, 29, 31], "pure": 3, "object": [3, 4, 8, 10, 11, 12, 13, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34], "pd": 3, "motor": [3, 18, 34], "paramet": [3, 31, 34], "cfg": [3, 5], "behav": 3, "botim": 3, "physx": [3, 5, 8, 12, 17, 18, 20, 23], "multibodi": [3, 8], "params_add": [3, 5, 8, 12, 17], "botsim": [3, 5, 8, 12, 17], "verbos": [3, 4, 5, 8, 9, 12, 14, 17, 23], "motorkp": [3, 5, 8, 12, 17], "10000": [3, 5, 8, 12, 17], "motorkd": [3, 5, 8, 12, 17], "1000": [3, 5, 8, 12, 17], "big": [3, 24, 34], "params_print": [3, 5, 8], "cpp": [3, 8, 9, 34], "99": 3, "34": [3, 8], "hello": [3, 8, 27], "39": [3, 4, 8], "robotmodel": [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 21, 24, 27, 34], "scenario": [3, 4, 5, 6, 7, 8, 10, 12, 17, 24, 34], "pandasingl": [3, 4, 5, 8], "view": [3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 17, 18, 20, 28, 34], "workspac": [3, 5], "NOT": [3, 5], "THE": [3, 5, 27], "simult": [3, 5], "would": [3, 4, 9, 11, 20, 24, 28, 31, 34], "commun": 3, "lead": [3, 4, 24, 34], "explicit": [3, 24, 34], "bot": [3, 5, 6, 7, 8, 12, 17], "note": [3, 4, 9, 10, 12, 17, 20, 24, 28, 29, 30, 32], "arm": [3, 13, 24, 28, 30, 34], "go": [3, 26], "down": [3, 9, 14, 34], "free": [3, 13, 17, 21, 30, 34], "float": [3, 24, 28], "kin_physx": 3, "physxinterfac": 3, "768": 3, "addground": 3, "238": 3, "239": 3, "within": [3, 20, 23, 29, 34], "addlink": 3, "254": 3, "tabl": [3, 9, 10, 12, 14, 17, 21, 24, 34], "addmultibodi": 3, "466": 3, "base": [3, 9, 10, 17, 20, 22, 24, 25, 27, 34], "l_panda_bas": 3, "486": 3, "l_panda_link0_0": 3, "l_panda_joint1": 3, "l_panda_link1_0": 3, "l_panda_joint2": 3, "l_panda_link2_0": 3, "bellybutton": 3, "l_panda_joint3": 3, "l_panda_link3_0": 3, "l_panda_joint4": 3, "l_panda_link4_0": 3, "l_panda_joint5": 3, "l_panda_link5_0": 3, "l_panda_joint6": 3, "l_panda_link6_0": 3, "l_panda_joint7": 3, "l_panda_link7_0": 3, "l_panda_hand_0": 3, "l_panda_finger_joint1": 3, "l_panda_leftfinger_0": 3, "l_panda_finger_joint2": 3, "l_panda_rightfinger_0": 3, "592": 3, "805": 3, "home": [3, 4, 5, 6, 7, 8, 10, 12, 17, 24, 27, 28, 29, 30, 34], "q1": [3, 21, 34], "2nd": [3, 9, 21, 24, 28, 34], "bend": 3, "back": [3, 9, 11, 34], "forth": 3, "them": [3, 4, 8, 9, 11, 20, 21, 26, 29, 31, 34], "qhome": [3, 4], "get_qhom": 3, "moveto": [3, 8], "simplest": [3, 24, 28], "current": [3, 17, 21, 23, 24, 28, 30, 34], "target": [3, 4, 9, 11, 21, 24, 25, 34], "It": [3, 4, 18, 20, 21, 23, 24, 27, 34], "kept": 3, "sync": [3, 5, 6, 7, 8, 12, 17], "till": 3, "finish": 3, "check": [3, 4, 9, 11, 24, 34], "time_til_end_of_reference_splin": 3, "meanwhil": 3, "stai": [3, 4, 28], "ed": 3, "6": [3, 4, 8, 9, 22, 34], "while": [3, 5, 6, 8, 10, 12, 17, 20, 24, 34], "gettimetoend": [3, 8, 12, 17], "append": [3, 4, 7, 10, 11, 13, 18, 22, 34], "As": [3, 11, 22, 23, 24, 28, 34], "sever": [3, 29, 34], "timetoend": 3, "073524058876411": 3, "0957189420649807": 3, "191437884129961": 3, "becom": [3, 9, 10, 11, 20, 24, 34], "reactiv": [3, 25, 34], "smoothli": [3, 8, 24], "high": [3, 24], "frequenc": 3, "randomli": 3, "track": [3, 25, 30], "8": [3, 4, 6, 7, 8, 10, 11, 24, 31], "cen": 3, "9": [3, 4, 8, 13, 14, 34], "about": [3, 20, 21, 24, 26, 28, 29, 31, 34], "later": [3, 4, 24, 29, 31, 34], "def": [3, 16], "ik": [3, 8, 11, 12, 17, 25, 30], "delta_t": 3, "addobject": [3, 4, 8, 11, 12, 13, 14, 17, 18, 25, 28, 34], "jointstat": [3, 4], "ot": [3, 4, 8, 11, 12, 13, 14, 16, 17, 34], "1e": [3, 4, 8, 10, 12, 14, 17, 24, 34], "cost": [3, 4, 11, 12, 14, 24, 34], "positiondiff": [3, 4, 9, 10, 11, 12, 13, 14, 17, 34], "l_gripper": [3, 4, 5, 8, 10, 12, 17, 34], "eq": [3, 4, 8, 9, 11, 12, 13, 14, 17, 24, 34], "1e1": [3, 4, 8, 12, 17, 24, 34], "constraint": [3, 8, 11, 12, 14, 20, 24, 28, 32, 34], "ret": [3, 4, 6, 8, 12, 17, 34], "nlp_solver": [3, 4, 8, 12, 16, 17, 34], "return": [3, 4, 8, 9, 12, 16, 20, 23, 28, 29, 34], "getpath": [3, 4, 8, 12, 17, 34], "just": [3, 4, 9, 10, 20, 21, 23, 24, 30, 31, 34], "solut": [3, 4, 8, 11, 12, 13, 17, 24, 27, 32], "send": [3, 23, 31], "10": [3, 4, 7, 8, 10, 13, 21, 24, 31, 34], "98": 3, "q_target": 3, "005057": 3, "feasibl": [3, 4, 8], "00789171": 3, "ineq": [3, 4, 8, 9, 11, 12, 13, 17, 24, 34], "00138392": 3, "001435": 3, "0055078": 3, "00038073": 3, "001453": 3, "00485786": 3, "0031066": 3, "000382": 3, "00552496": 3, "00285066": 3, "000871": 3, "00481289": 3, "000176548": 3, "000181": 3, "00416384": 3, "00404598": 3, "001811": 3, "00394648": 3, "00118522": 3, "000637": 3, "00410849": 3, "00429565": 3, "001591": 3, "00454469": 3, "000211266": 3, "000784": 3, "00470588": 3, "00357698": 3, "000942": 3, "00478467": 3, "00148874": 3, "001108": 3, "00457452": 3, "00162474": 3, "001451": 3, "005894": 3, "000439926": 3, "002882": 3, "00540869": 3, "0027726": 3, "001624": 3, "00720508": 3, "00069492": 3, "001267": 3, "0075089": 3, "000505518": 3, "002128": 3, "0078162": 3, "0019024": 3, "001489": 3, "00831903": 3, "00241169": 3, "005757": 3, "0106921": 3, "000467631": 3, "001208": 3, "0115667": 3, "000478951": 3, "reativ": 3, "increas": 3, "agress": 3, "penal": [3, 4, 24, 28], "durat": [3, 24], "cubic": 3, "11": [3, 4, 8, 34], "keep": [3, 21, 24, 30, 34], "idl": 3, "sec": [3, 8], "timecost": 3, "good": [3, 9, 30, 31, 34], "practis": 3, "abort": 3, "execut": [3, 4, 11, 24, 32], "In": [3, 4, 8, 9, 11, 20, 21, 23, 24, 26, 28, 29, 30, 31, 34], "break": [3, 5, 6, 21, 34], "loop": [3, 20, 28, 29, 30, 34], "til": 3, "endoftim": 3, "rais": 3, "getkeypress": [3, 5], "ord": [3, 5, 6], "movement": [3, 4], "grippermov": 3, "_left": [3, 5, 8], "width": [3, 6, 9, 10, 22, 23, 34], "gripperdon": [3, 8], "075": 3, "properli": [3, 9, 21, 23, 28, 34], "been": [3, 8, 23, 24], "far": [3, 10, 24, 28, 30, 34], "give": [3, 6, 24, 27, 28, 31, 34], "idea": 3, "exist": 3, "framework": 4, "special": [4, 19, 20, 21, 22, 24, 34], "case": [4, 5, 11, 20, 23, 24, 28, 34], "over": [4, 8, 12, 20, 24, 29, 32, 34], "singl": [4, 9, 11, 12, 20, 24, 28, 34], "rather": [4, 11, 17, 19, 20, 21, 22, 24, 30, 34], "than": [4, 11, 17, 19, 20, 21, 24, 29, 34], "realiz": [4, 28, 29, 30, 32], "rough": [4, 25, 31], "fine": [4, 24, 30], "linear": [4, 8, 16, 19, 24, 34], "mathemat": [4, 9, 16, 20, 24, 32, 34], "program": [4, 9, 16, 20, 24, 32, 34], "25": [4, 8, 13, 31], "06": [4, 30], "005": [4, 6, 7, 8], "setcontact": [4, 6, 7, 8, 10], "list": [4, 9, 10, 21, 22, 24, 32, 34], "constructor": 4, "declar": [4, 9, 21, 23, 24, 34], "scale": [4, 9, 11, 12, 24, 25, 34], "explain": [4, 11, 18, 21, 24, 27, 28, 31, 34], "argument": [4, 12, 23, 24, 28, 32, 34], "signatur": [4, 16, 34], "interv": [4, 11, 20, 24, 28, 32, 34], "subset": [4, 24, 34], "irrelev": 4, "symbol": [4, 9, 24, 32, 34], "see": [4, 7, 9, 20, 24, 28, 29, 30, 31, 34], "whether": [4, 9, 22, 24, 34], "sum": [4, 9, 10, 11, 24, 34], "squar": [4, 9, 11, 24, 34], "multipli": [4, 24], "offset": [4, 7, 34], "substract": [4, 25], "befor": [4, 11, 23, 24, 28, 29, 30, 34], "pleas": [4, 27, 31, 34], "detail": [4, 20, 24, 25, 34], "solver": [4, 8, 9, 16, 23, 24, 28, 34], "000823": 4, "00414146": 4, "00188382": 4, "augmentedlagrangian": [4, 8], "bound": [4, 8, 24, 34], "ye": [4, 24, 34], "mu": [4, 8], "nu": [4, 8], "mulb": [4, 8], "newton": [4, 8, 16, 24, 34], "initi": [4, 8, 11, 20, 21, 23, 24, 28, 34], "16": [4, 8], "0447": 4, "alpha": [4, 8, 34], "beta": [4, 8], "delta": [4, 8, 34], "55808": 4, "accept": [4, 8], "686083": 4, "144223": 4, "0170221": 4, "0221449": 4, "00418093": 4, "stop": [4, 6, 8], "absmax": [4, 8], "lt": [4, 8], "option": [4, 8, 9, 11, 23, 24, 34], "stoptoler": [4, 8, 12, 17, 34], "00414937": 4, "h": [4, 7, 8, 9, 22, 23, 24, 27, 34], "00951471": 4, "373024": 4, "deltaconverg": [4, 8], "00437027": 4, "00240133": 4, "00413537": 4, "stoppingcriterion": [4, 8], "01": [4, 6, 8, 18, 26, 27, 30, 34], "displai": [4, 6, 11, 12, 17, 21, 23, 24, 29, 34], "overlai": [4, 7, 34], "sequenc": [4, 8, 12, 20, 24, 28, 32, 34], "len": [4, 6, 12, 34], "ndarrai": 4, "gt": 4, "destroi": [4, 9, 10], "Then": [4, 9, 11, 17, 21, 24, 27, 28, 29, 30, 34], "clever": 4, "realist": [4, 31], "accumulatedcollis": [4, 8, 9, 10, 12, 13, 17, 34], "jointlimit": [4, 8, 9, 12, 13, 17, 34], "scalarproductxx": [4, 9, 14, 34], "scalarproductxz": [4, 9, 11], "l_palm": 4, "scalarproduct": [4, 9, 28, 34], "connect": [4, 22, 34], "finger": [4, 9, 18, 28], "orthogon": [4, 9, 30, 34], "ax": [4, 7, 9, 34], "oppos": 4, "plane": [4, 9, 34], "could": [4, 20, 28, 31, 32, 34], "flag": [4, 9, 10], "els": [4, 23, 34], "infeas": [4, 34], "001353": 4, "00552548": 4, "00124449": 4, "reus": 4, "instanc": [4, 11, 20, 24, 26, 28, 34], "ok": [4, 9, 31, 34], "aspect": 4, "chang": [4, 6, 9, 10, 11, 20, 21, 24, 27, 28, 29, 34], "resolv": [4, 31], "p0": 4, "13": [4, 8, 11, 34], "updaterootobject": 4, "root": [4, 20, 21, 34], "001635": 4, "00352417": 4, "00216173": 4, "006638": 4, "0207398": 4, "00141503": 4, "006179": 4, "00694048": 4, "00205847": 4, "004424": 4, "0152197": 4, "000563407": 4, "008229": 4, "0104266": 4, "00210566": 4, "008263": 4, "0165911": 4, "00175033": 4, "009852": 4, "019162": 4, "0395863": 4, "005472": 4, "0100858": 4, "00146084": 4, "00514": 4, "00327878": 4, "000313999": 4, "007166": 4, "030142": 4, "00111338": 4, "249048": 4, "722": 4, "0802649": 4, "102041": 4, "051558": 4, "61": 4, "0779214": 4, "93279": 4, "018069": 4, "30": [4, 6, 10, 14, 21, 34], "0117585": 4, "000335161": 4, "008438": 4, "14": [4, 8, 11], "0114653": 4, "000106237": 4, "005415": 4, "0221542": 4, "000198337": 4, "078182": 4, "94": 4, "0645244": 4, "116509": 4, "017363": 4, "28": [4, 8], "0795235": 4, "000762834": 4, "127013": 4, "216": 4, "114508": 4, "481591": 4, "021431": 4, "0178241": 4, "000106574": 4, "018806": 4, "0130349": 4, "00024334": 4, "exploit": 4, "null": [4, 7, 34], "space": [4, 9, 11, 24, 25, 34], "proper": [4, 31, 34], "possibl": [4, 20, 28, 31, 32, 34], "pick": [4, 24, 28, 32], "best": [4, 11, 13, 21, 22, 24, 34], "scalarproductxi": [4, 9], "15": [4, 8, 11, 12, 17, 21, 30, 31, 34], "orient": [4, 9, 20, 21, 24, 28, 30, 34], "score": 4, "argmin": [4, 34], "none": [4, 22, 23, 34], "resolut": 4, "interpol": [4, 8], "desir": [4, 20, 30, 34], "pre": [4, 10, 28, 34], "common": [4, 8, 34], "pattern": [4, 8], "simplifi": [4, 31, 32, 34], "way1": [4, 8], "way2": 4, "way3": 4, "way4": 4, "18": [4, 8], "addcontrolobject": [4, 8, 12, 17, 34], "1e0": [4, 13, 24], "003266": 4, "39494": 4, "000305648": 4, "35382383": 4, "05464486": 4, "41770589": 4, "0833263": 4, "05951381": 4, "17630166": 4, "49971152": 4, "29434065": 4, "3758991": 4, "40467003": 4, "73241762": 4, "02310692": 4, "33740027": 4, "49945799": 4, "44111823": 4, "06340917": 4, "31723911": 4, "1024485": 4, "12222711": 4, "20326576": 4, "49926996": 4, "43343189": 4, "36084256": 4, "2768184": 4, "74048984": 4, "12188603": 4, "34753359": 4, "49916996": 4, "valu": [4, 7, 9, 11, 21, 22, 23, 34], "stepsperphas": 4, "discret": [4, 20, 23, 24], "form": [4, 20, 21, 34], "k_order": 4, "maxim": [4, 24], "tupl": [4, 11, 24, 34], "take": [4, 22, 24, 32, 34], "finit": [4, 24, 34], "our": [4, 6, 11, 28, 29, 34], "sub": [4, 9, 20, 22, 24, 31, 34], "sampl": [4, 17, 30], "why": [4, 28, 34], "consecut": [4, 11, 20, 24], "hold": [4, 5, 23, 24, 28, 32, 34], "sqr": 4, "acceler": [4, 11, 20, 23, 24, 25, 31, 34], "across": [4, 9, 22, 34], "factor": [4, 22, 24, 34], "sqrt": [4, 24, 34], "somehow": 4, "control": [4, 18, 20, 23, 24, 25, 34], "approxim": [4, 11, 23, 24, 34], "independ": [4, 16], "choic": [4, 23, 24], "zig": 4, "zag": 4, "smooth": [4, 24, 29, 30, 32, 34], "19": [4, 13], "happen": [4, 24], "weight": [4, 34], "017709": 4, "51987": 4, "00176075": 4, "40": [4, 24, 28], "constrain": [4, 8, 11, 17, 24, 28], "zero": [4, 7, 8, 9, 10, 11, 20, 21, 24, 28, 34], "042404": 4, "5162": 4, "000765251": 4, "notic": [4, 21, 34], "new": [4, 21, 24, 27, 28, 29, 30, 34], "last": [4, 24, 30, 34], "without": [4, 10, 24, 28, 34], "plot": 4, "trajectori": [4, 20, 24, 34], "21": [4, 34], "pyplot": [4, 7], "plt": [4, 7], "22": [4, 34], "exactli": [5, 10, 20, 23, 24, 32, 34], "botop1": 5, "userealrobot": 5, "instead": [5, 9, 10, 24, 28, 30, 34], "params_fil": 5, "pcl": [5, 7, 10], "camerawrist": 5, "getimagedepthpcl": [5, 7], "setpointcloud": [5, 7], "gripperopen": [5, 8], "setcompli": 5, "get_tauextern": 5, "pseudoinv": 5, "linalg": [5, 10], "pinv": 5, "hit": [6, 21, 34], "cv2": 6, "cv": 6, "cap": 6, "videocaptur": 6, "captur": 6, "read": [6, 13, 20, 21, 22, 23, 24, 27, 34], "come": [6, 21, 24, 34], "cvtcolor": 6, "color_bgr2grai": 6, "result": [6, 11, 14, 20, 21, 24, 28, 34], "imshow": [6, 7], "waitkei": 6, "0xff": 6, "releas": 6, "destroyallwindow": 6, "o": [6, 7, 10, 34], "_exit": [6, 10], "pandast": [6, 7, 10, 12, 17, 34], "obj": [6, 7, 20], "setpos": [6, 7], "setmass": [6, 7, 8, 18], "fxypxi": [6, 7, 23], "getcamerafxypxi": [6, 7], "camerafram": [6, 7], "tau": [6, 9, 21, 24, 34], "sensor": [6, 23], "getimageanddepth": [6, 7], "100hz": 6, "render": [6, 20, 27], "slow": [6, 14], "color_bgr2rgb": 6, "central": 6, "addit": [6, 23, 24, 28, 34], "r_grippercamera": 6, "addattribut": 6, "focallength": [6, 9, 10, 23], "895": 6, "640": [6, 10], "height": [6, 9, 10, 23, 34], "360": 6, "_": [6, 7, 32, 34], "cell": [7, 11, 18], "cell_typ": 7, "markdown": 7, "metadata": 7, "vision": [7, 26], "execution_count": 7, "91746f55": 7, "11c2": 7, "4591": 7, "a337": 7, "4155376e7596": 7, "output": [7, 21, 34], "sy": [7, 10, 11, 13, 14, 16, 18, 34], "osn": 7, "expandus": [7, 34], "build": [7, 10, 11, 13, 14, 16, 18, 20, 28, 29, 30], "libri": [7, 10, 11, 13, 14, 16, 18, 21, 34], "ryn": 7, "npn": 7, "timen": 7, "f18925ed": 7, "mycamera": 7, "55da8f34": 7, "1bd73706": 7, "2f9b": 7, "4c4d": 7, "93bd": 7, "cdba581408b7": 7, "fig": [7, 34], "figur": [7, 28, 31, 34], "figsiz": 7, "subplot": 7, "matshow": 7, "ce65b01b": 7, "9811": 7, "496c": 7, "9774": 7, "1589d5455deb": 7, "slide": [7, 24, 26, 30, 31, 34], "learnedn": 7, "hat": [7, 34], "frac": [7, 9, 34], "wheren": 7, "pixel": [7, 23, 29, 34], "andn": 7, "know": [7, 23, 27, 34], "426eb3b6": 7, "shapen": 7, "cc08f354": 7, "0e4d": 7, "475b": 7, "8af5": 7, "ebff63533142": 7, "fx": 7, "fy": 7, "px": 7, "ctmp": 7, "continuen": 7, "sign": [7, 24, 34], "flipe": 7, "downn": 7, "zn": 7, "tn": 7, "tmp": 7, "pc": 7, "str": 7, "255": 7, "1a9d2d8a": 7, "07ae": 7, "4dc3": 7, "afa5": 7, "3c90ac7d2b8": 7, "c2": 7, "pclframe": 7, "delfram": [7, 9, 10], "truthn": 7, "view_recopymesh": 7, "6e222a0a": 7, "72179b41": 7, "cfdb8d55": 7, "botn": 7, "60ecc8d4": 7, "kernelspec": 7, "display_nam": 7, "ipykernel": 7, "languag": [7, 21, 25, 34], "language_info": 7, "codemirror_mod": 7, "ipython": 7, "file_extens": 7, "mimetyp": 7, "text": [7, 9, 11, 21, 24, 27, 31, 34], "nbconvert_export": 7, "pygments_lex": 7, "ipython3": 7, "nbformat": 7, "nbformat_minor": 7, "rigidli": [8, 21, 34], "6d": 8, "endeff": [8, 20, 24], "conveni": [8, 20, 24, 34], "pipelin": [8, 21, 29, 30, 34], "hard": [8, 34], "transit": [8, 24], "through": [8, 27], "broken": 8, "again": [8, 20, 24, 28, 30, 34], "fall": [8, 28, 29], "angulardamp": 8, "defaultfrict": 8, "101": 8, "lgp": 8, "camerafocu": 8, "stoptim": 8, "300": 8, "stopsol": 8, "opt": [8, 12], "maxstep": 8, "boundednewton": 8, "025": 8, "675": 8, "way0": 8, "setrelativepos": 8, "d": [8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 25, 34], "90": [8, 9, 10, 21, 34], "86": 8, "setconfig": [8, 12, 17, 34], "settim": [8, 12, 14, 17, 24, 34], "posediff": [8, 9, 34], "setproblem": [8, 12, 16, 17, 34], "setopt": [8, 12, 17, 34], "93": 8, "1593": 8, "69": 8, "6169": 8, "47": 8, "7566": 8, "1096": 8, "4588": 8, "02281": 8, "0943": 8, "170104": 8, "57494": 8, "0579509": 8, "52862": 8, "0238862": 8, "52229": 8, "016744": 8, "37426": 8, "000145596": 8, "elta": 8, "94215": 8, "24621": 8, "750159": 8, "00314": 8, "5031": 8, "10763": 8, "34517": 8, "0250832": 8, "33636": 8, "0132012": 8, "33499": 8, "00671988": 8, "33466": 8, "20162": 8, "211307": 8, "219168": 8, "53258": 8, "0376555": 8, "37467": 8, "00825317": 8, "37395": 8, "36729": 8, "00768814": 8, "0459086": 8, "37595": 8, "125": 8, "00476621": 8, "3742": 8, "gripperclosegrasp": 8, "end": [8, 9, 11, 20, 24, 28, 32, 34], "07": 8, "gripperclos": 8, "pass": [9, 12, 17, 24, 34], "proxim": 9, "accumul": 9, "measur": [9, 24], "penetr": [9, 10, 24, 28, 34], "pair": [9, 10, 22, 24, 28, 34], "geometr": [9, 24, 32], "wit": 9, "pr2": [9, 11, 13], "kitchen": [9, 11, 13, 21, 34], "scalar": [9, 11, 24, 28, 34], "coll": 9, "computecollis": [9, 10], "proxi": 9, "automat": [9, 20, 21, 24, 32, 34], "redo": [9, 11], "selectjointsbytag": 9, "inform": [9, 20, 21, 24, 28, 34], "getcollis": [9, 10], "report": [9, 20, 21, 24, 34], "detect": [9, 10], "swift": 9, "deactiv": [9, 10, 20], "nuissanc": 9, "default": [9, 22, 24, 28, 34], "activatecollisionpair": 9, "deactivatecollisionpair": 9, "modifi": [9, 11, 22, 24, 28, 34], "todo": [9, 10, 11, 13, 15, 18, 20, 23], "gjk": [9, 20], "algorithm": [9, 10, 20, 34], "dist": 9, "coll_wrist_r": 9, "_10": 9, "becaus": [9, 24], "typic": [9, 11, 20, 21, 22, 23, 24, 28, 34], "put": [9, 10, 11], "inequ": [9, 11, 24, 25, 34], "geometri": 9, "easili": [9, 20, 34], "request": 9, "help": [9, 24, 30, 31, 34], "choos": [9, 24, 28, 30, 34], "entri": [9, 24, 32, 34], "affect": 9, "arml": 9, "attach": [9, 20, 21, 23, 24, 27, 34], "head": [9, 10], "associ": [9, 10, 20, 23, 34], "head_tilt_link": [9, 10], "arg": [9, 10, 14], "180": [9, 10], "cameraview": [9, 10, 23], "iv": 9, "imageview": [9, 10], "addsensor": [9, 10], "frameattach": [9, 10], "600": [9, 10], "400": [9, 10], "computeimageanddepth": [9, 10], "head_pan_joint": [9, 10], "updateconfig": [9, 10], "reassign": [9, 10], "remov": [9, 10, 11, 13, 21, 24, 28, 34], "assum": [9, 20, 24, 29, 34], "x_1": [9, 24, 34], "x_t": [9, 24], "x_i": [9, 34], "mathbb": [9, 20, 24, 34], "phi": [9, 20, 24, 34], "map": [9, 11, 24, 26, 34], "mapsto": [9, 34], "x_0": [9, 34], "x_2": [9, 34], "x_k": 9, "most": [9, 24, 28, 31, 34], "access": [9, 10, 11, 23, 27, 29, 34], "via": [9, 10, 21, 24, 27, 34], "blob": [9, 11, 24], "master": [9, 15, 21, 24, 29, 34], "kin": [9, 21, 24, 34], "featuresymbol": [9, 24, 34], "respect": [9, 22, 34], "o1": [9, 34], "o2": [9, 34], "positionrel": [9, 11, 28, 34], "4d": [9, 34], "nbsphinx": 9, "math": [9, 20, 34], "footnot": [9, 34], "There": [9, 21, 24, 27, 28, 34], "invari": [9, 24, 34], "si": 9, "gn": 9, "quaterniondiff": [9, 34], "quaternionrel": [9, 34], "poserel": [9, 34], "vectorxdiff": [9, 34], "vectorxrel": [9, 34], "seend": [9, 34], "vectori": [9, 34], "product": [9, 11, 24, 28, 34], "fo": [9, 34], "gazeat": [9, 34], "2d": [9, 34], "xy": [9, 24, 34], "angularvel": [9, 34], "angular": [9, 24, 34], "noth": [9, 24, 34], "collid": [9, 20, 28, 34], "limit": [9, 20, 23, 24, 34], "mesh": [9, 21, 24, 34], "qitself": [9, 12, 13, 14, 28, 34], "abovebox": [9, 34], "insid": [9, 34], "insidebox": [9, 34], "standingabov": [9, 34], "fs_": [9, 34], "drive": [9, 34], "redefin": [9, 11, 34], "texttt": [9, 34], "cdot": [9, 34], "dim": [9, 11, 34], "1st": [1, 9, 34], "oder": [9, 34], "x_3": [9, 34], "equiv": [9, 24, 34], "hand": [9, 11, 21, 23, 24, 28, 34], "handr": 9, "left": [9, 11, 28, 32, 34], "10centimet": 9, "sai": [9, 31, 34], "equal": [9, 11, 20, 22, 24, 28, 34], "align": [9, 24, 30, 34], "much": [9, 17, 24, 31, 34], "robust": [9, 21, 34], "error": [9, 20, 21, 23, 34], "gradient": [9, 34], "optimum": [9, 34], "meant": [9, 19, 27], "indic": [9, 20, 24, 29, 34], "rho_k": 9, "pi_k": 9, "subseteq": [9, 24], "phi_1": 9, "phi_k": 9, "x_n": [9, 34], "begin": [9, 24, 34], "min_": [9, 24, 34], "sum_": 9, "x_": [9, 24, 34], "mathopforall_": 9, "le": [9, 24, 34], "quad": [9, 24, 34], "mini": [10, 34], "watchfil": [10, 34], "command": [10, 21, 23, 24, 28, 30, 34], "editor": [10, 21, 24, 34], "being": [10, 24, 34], "redisplai": 10, "whenev": [10, 21, 24, 34], "save": [10, 21, 34], "trivial": [10, 22, 24, 27, 34], "reload": [10, 21, 34], "extern": [10, 27, 34], "coupl": [10, 24], "those": [10, 21, 24, 29, 34], "setraipath": 10, "mtoussai": [10, 26], "simpl": [10, 21, 24, 27, 28, 29, 31, 34], "bit": [10, 28, 34], "sin": [10, 34], "configurationview": 10, "setconfigur": [10, 11], "broadphas": [10, 20], "bring": [10, 20, 29], "evalfeatur": 10, "r_grippercent": 10, "l_grippercent": 10, "vel": 10, "inv": 10, "ey": [10, 16], "belowmargin": 10, "integ": 10, "contribut": [10, 34], "topolog": 10, "distant": 10, "warn": 10, "broad": 10, "cannot": [10, 23, 24, 34], "were": [10, 20, 24, 31, 34], "dure": [10, 24, 26, 28, 29, 31], "recreat": [10, 28], "fresh": [10, 27], "But": [10, 20, 21, 24, 28, 31, 34], "realli": [10, 20, 24, 27, 28, 34], "approach": [10, 28, 34], "nvisii": 10, "export": [10, 21, 34], "vimg": 10, "vseg": 10, "segmentationview": 10, "vpcl": 10, "pointcloudview": 10, "kinect": 10, "endeffkinect": 10, "480": 10, "580": 10, "50": 10, "selectsensor": 10, "seg": 10, "computesegment": 10, "computepointcloud": 10, "segment": [10, 29], "head_tilt_joint": 10, "panda_clean": 10, "encod": [10, 21, 24, 34], "utf": 10, "fil": 10, "safe_load": 10, "doc": [11, 24, 27, 29], "At": 11, "bottom": [11, 32, 34], "concept": [11, 20, 24, 26], "lock": [11, 13], "simplic": [11, 34], "goal": [11, 17, 26, 28, 29, 31], "pr2l": [11, 13], "yellow": [11, 34], "komo_ik": 11, "getreport": [11, 13, 14], "retriev": [11, 30, 34], "anoth": [11, 21, 22, 24, 28, 32, 34], "locat": [11, 21, 24, 34], "iter": [11, 24, 29, 30, 34], "reoptim": 11, "nois": [11, 23], "novel": [11, 34], "pr2r": [11, 13], "20cm": 11, "straight": [11, 23], "front": [11, 34], "vectorzdiff": 11, "scalarproductzz": 11, "redund": [11, 21, 24, 34], "pointer": [11, 24], "either": [11, 21, 28, 30, 32, 34], "term": [11, 24, 31, 34], "dimens": [11, 20, 34], "15th": 11, "overal": [11, 21, 34], "keyword": [11, 22, 34], "tell": [11, 23, 34], "linearli": [11, 34], "conf": 11, "feat": [11, 24], "avoid": [11, 24, 28, 30], "especi": [11, 24], "impos": [11, 24, 28], "Or": [11, 20, 29], "correspond": [11, 34], "natur": [11, 24, 34], "esp": [11, 23, 24, 30, 34], "posdiff": 11, "posrel": 11, "aim": [11, 20, 24], "constant": [11, 24, 28, 30, 32], "rescal": 11, "aris": [11, 34], "signific": 11, "impact": 11, "converg": [11, 34], "behavior": [11, 26, 31], "guid": [11, 21, 24, 34], "treat": [11, 34], "penalti": [11, 24, 34], "squaredpenalti": 11, "made": [11, 27, 34], "reason": [11, 20, 24, 28, 34], "effici": [11, 24, 34], "auglag": 11, "precis": [11, 20, 24, 34], "cylind": [11, 28], "l_gripper_l_finger_joint": 11, "03": [11, 26, 28, 34], "similarli": [12, 21, 23, 34], "confus": [12, 34], "simpli": [12, 17, 19, 20, 21, 27, 34], "plai": [12, 17, 25, 28, 31, 34], "boxr": [12, 17, 34], "boxl": [12, 17, 34], "view_plai": [12, 13, 14], "moveautotim": [12, 17], "perhap": [13, 24, 31, 34], "item1": 13, "sink1": 13, "52": 13, "color": [13, 18, 21, 22, 25, 34], "item2": 13, "trai": 13, "stove1": 13, "42": 13, "touch": [13, 24, 25, 32], "obj1": [13, 28], "komo_path": 13, "1e2": [13, 14], "endeffworkspac": 13, "my": [13, 28], "out": [13, 20, 22, 23, 24, 28, 34], "analyz": [13, 24], "model2": 14, "setmodel": [14, 24], "add_qcontrolobject": [14, 28], "addquaternionnorm": 14, "addmodeswitch": 14, "stabl": [14, 24], "vectorz": 14, "up": [14, 20, 21, 24, 27, 31, 32, 34], "place": [14, 24, 26, 32, 34], "08": 14, "checkgradi": 14, "miss": [14, 23], "getconstraintviol": 14, "getcost": 14, "topboxgrasp": 14, "box2": 14, "downup": 14, "poseeq": 14, "target2": 14, "setskeleton": 14, "reportproblem": 14, "download": 15, "own": [15, 20, 24, 27, 34], "variou": [16, 20, 21, 24, 34], "sqrpot": 16, "nlp_factori": 16, "setdimens": 16, "setbound": 16, "setfeaturetyp": 16, "setevalcallback": 16, "setsolv": 16, "nlp_solverid": 16, "getlog_x": 16, "getlog_cost": 16, "rrt": 17, "easier": 17, "qt": 17, "jointli": 17, "bi": 17, "pathfind": 17, "sometim": [18, 21, 24, 30, 34], "low": 18, "level": [18, 20, 24, 31, 34], "reinforc": [18, 31], "multi": [18, 20], "bodi": [18, 20, 34], "gain": 18, "friction": 18, "graviti": 18, "compens": 18, "45": 18, "fail": 18, "bullet": [18, 20, 23, 31], "comment": [18, 22, 24], "mk": 18, "getstat": [18, 23], "multipl": [18, 20, 21, 28, 30, 34], "setstat": [18, 20, 23], "concern": [19, 24, 32, 34], "inherit": 19, "std": 19, "algebra": [19, 34], "lapack": 19, "eigen": 19, "well": [19, 24, 28, 34], "concis": [19, 34], "closer": 19, "matlab": 19, "sheet": 19, "focuss": 19, "synopsi": 20, "similar": [20, 24, 34], "graphic": 20, "further": [20, 22, 24, 28, 34], "angl": [20, 21, 24, 34], "togeth": [20, 31], "represent": [20, 24, 26, 34], "appli": [20, 23, 29], "numer": [20, 23, 24], "quantiti": [20, 24], "nearest": 20, "involv": [20, 30, 34], "under": [20, 34], "newtonian": 20, "although": 20, "semant": [20, 24, 34], "perform": [20, 27, 34], "opengl": [20, 23, 27], "format": [20, 21, 22, 34], "collada": [20, 21, 34], "rigid": [20, 21, 34], "se": [20, 34], "mai": [20, 21, 22, 24, 31, 34], "write": [20, 34], "nabla_x": 20, "role": 20, "tool": [20, 21, 24, 31, 34], "urdf2rai": [20, 21, 24, 34], "requir": [20, 21, 22, 24, 34], "fix": [20, 21, 24, 28, 34], "selet": 20, "quirk": 20, "ignor": [20, 34], "interestingli": 20, "extract": [20, 34], "along": [20, 28, 34], "freeli": [20, 34], "consist": [20, 24, 34], "potenti": [20, 21, 24, 25, 26, 34], "fcl": 20, "lower": [20, 24, 28], "ccd": 20, "trigger": [20, 28], "f_accumulatedcolls": 20, "explicitli": [20, 23, 24, 28, 34], "updat": [20, 21, 23, 28, 29, 30, 34], "ensureproxi": 20, "ompl": 20, "relat": [20, 24, 34], "recurs": 20, "collect": [20, 34], "filter": [20, 29], "cont": 20, "properti": [20, 21, 34], "int": [20, 24], "upward": [20, 34], "supp": 20, "matric": [20, 34], "engergi": 20, "residu": [20, 30], "equat": [20, 24, 34], "system": [20, 21, 24, 26, 31, 34], "absolut": [20, 21, 34], "propag": 20, "Such": [20, 24], "therebi": [20, 24, 34], "classic": 20, "whatev": 20, "altern": [20, 24, 27, 28, 34], "reffram": 20, "everli": [21, 34], "node": [21, 22, 34], "attribut": [21, 22, 23, 32, 34], "previous": [21, 34], "omit": [21, 34], "taken": [21, 34], "stem": [21, 34], "mass": [21, 34], "joint1_pr": [21, 34], "joint1": [21, 34], "arm1": [21, 34], "arm2": [21, 34], "eff": [21, 34], "joint2": [21, 34], "b": [21, 22, 25, 34], "joint3": [21, 34], "001": [21, 34], "line": [21, 24, 27, 34], "length": [21, 23, 24, 28, 34], "radiu": [21, 28, 34], "inerti": [21, 34], "4th": [21, 34], "meter": [21, 23, 34], "degress": [21, 34], "short": [21, 34], "arm3": [21, 34], "retrospect": [21, 34], "implicitli": [21, 34], "joint2_pr": [21, 34], "chile": [21, 34], "underli": [21, 34], "bin": [21, 24, 32, 34], "cmake": [21, 24, 34], "otherwis": [21, 23, 24, 34], "somefil": [21, 34], "equival": [21, 34], "repeatedli": [21, 34], "clean": [21, 24, 34], "prune": [21, 34], "continu": [21, 28, 30, 32, 34], "enter": [21, 34], "enforc": [21, 25, 34], "littl": [21, 28, 29, 30, 34], "tri": [21, 34], "catch": [21, 34], "syntax": [21, 32, 34], "crash": [21, 31, 34], "convert": [21, 23, 24, 29, 34], "convers": [21, 34], "partial": [21, 24, 34], "fiddl": [21, 24, 34], "correct": [21, 24, 34], "hole": [21, 24, 34], "meshlab": [21, 24, 34], "compress": [21, 24, 34], "ply": [21, 24, 34], "hubo": [21, 24, 34], "howto": [21, 24, 34], "sh": [21, 24, 34], "manag": [21, 34], "bremenkitchen": [21, 34], "unreal": [21, 34], "json": [21, 22, 34], "gltf": [21, 34], "augment": [21, 34], "extra": [21, 34], "p1": [21, 34], "p2": [21, 34], "p3": [21, 34], "q2": [21, 34], "q3": [21, 34], "intuit": [21, 34], "human": [21, 34], "bracket": [21, 34], "interpret": [21, 34], "turtl": [21, 34], "translat": [21, 24, 32], "_radians_": [21, 34], "_degrees_": [21, 34], "roll": [21, 34], "pitch": [21, 34], "yaw": [21, 34], "euler": [21, 34], "enum": [21, 24, 34], "jointtyp": [21, 34], "avail": [21, 24, 34], "hingei": [21, 34], "hingez": [21, 34], "transx": [21, 34], "transi": [21, 34], "transz": [21, 34], "transxi": [21, 34], "trans3": [21, 34], "transxyphi": [21, 34], "univers": [21, 27, 34], "quatbal": [21, 34], "phitransxi": [21, 34], "xball": [21, 34], "seem": [21, 24, 34], "mark": [21, 34], "separ": [21, 22, 23, 27, 34], "sit": [21, 34], "dictionari": [22, 34], "turn": [22, 34], "mix": 22, "hierarch": [22, 34], "ideal": [22, 24, 30, 31], "xml": 22, "kind": [22, 24, 31], "logic": [22, 32, 34], "clarifi": 22, "hopefulli": 22, "self": 22, "explanatori": 22, "boolean": [22, 34], "vertex": [22, 34], "edg": [22, 34], "hyperedg": [22, 34], "subgraph": [22, 34], "blue": [22, 34], "red": [22, 29, 30, 34], "string": [22, 34], "mt": [22, 34], "except": [22, 24, 34], "mod": [22, 34], "txt": [22, 27, 34], "filetoken": [22, 34], "1234": [22, 34], "doubl": [22, 24, 34], "arr": [22, 24, 28, 34], "deprec": [22, 34], "bool": [22, 34], "pars": [22, 34], "b0": [22, 34], "b1": [22, 34], "b2": [22, 34], "b3": [22, 34], "hallo": [22, 34], "filenam": [22, 34], "org": [22, 24, 29, 34], "delet": [22, 34], "tag": [22, 34], "otherstr": [22, 34], "newattribut": [22, 34], "example_includ": [22, 34], "strang": [22, 34], "parentgraph": [22, 34], "knowledg": [22, 34], "adverseri": 23, "imp": [23, 30], "callback": [23, 30], "perturb": [23, 30], "signal": [23, 29], "distinguish": [23, 24], "govern": 23, "law": 23, "push": [23, 26, 28], "u_mod": 23, "u_control": 23, "receiv": [23, 24], "until": [23, 24, 32, 34], "reach": [23, 28, 30], "speed": 23, "zrang": 23, "expos": [23, 24, 34], "post": [23, 24], "systemat": 23, "disir": 23, "exact": [23, 34], "visit": 23, "infact": 23, "slighli": 23, "hidden": 23, "instanti": [23, 24], "restorest": 23, "fact": [23, 24], "must": [23, 29, 31, 34], "arbitrari": [23, 24, 34], "acut": 23, "somewher": [23, 27, 34], "percept": [23, 26, 28, 30], "alreadi": [23, 30, 34], "x3": 23, "four": [23, 34], "focal": [23, 34], "unit": [23, 30, 34], "center": [23, 28, 29, 30, 34], "ealier": 24, "influenc": 24, "experi": 24, "think": [24, 28, 29, 34], "implicit": [24, 34], "particular": [24, 29, 31, 32, 34], "velocit": 24, "concecut": 24, "dull": 24, "ineffici": 24, "inher": [24, 28], "higher": 24, "jerk": 24, "concret": 24, "One": [24, 34], "past": 24, "thrid": 24, "subject": 24, "deriv": 24, "technic": [24, 34], "convent": [24, 28, 34], "consid": [24, 28, 32, 34], "od": 24, "word": [24, 34], "rho": [24, 34], "phi_": [24, 34], "textbf": [24, 34], "analog": [24, 27, 28, 34], "addition": [24, 28], "phi_j": 24, "With": [24, 34], "By": [24, 28], "shortest": 24, "skip": [24, 34], "certain": [24, 34], "cope": 24, "leaf": 24, "tablet": 24, "abstract": [24, 34], "virtual": [24, 26, 31, 34], "mathematicalprogram": 24, "mathematicalprogram_factor": 24, "behind": [24, 27], "necessarili": 24, "thought": [24, 34], "plug": 24, "replac": [24, 30], "nlopt": 24, "ipopt": 24, "cere": 24, "spars": [24, 34], "computation": 24, "casevia": 24, "individu": 24, "network": 24, "cliqu": 24, "spare": 24, "easi": 24, "watch": [24, 31], "folder": [24, 27], "sandbox": 24, "tutorialbas": 24, "grain": 24, "undo": 24, "setsquaredqaccvelhom": 24, "smoothest": 24, "harder": 24, "correl": 24, "better": [24, 28, 30, 34], "condit": 24, "hessian": [24, 34], "fs_positiondiff": 24, "fs_quaterniondiff": [24, 28], "setslow": 24, "ot_eq": 24, "ot_so": 24, "reduc": 24, "task": [24, 26, 28, 34], "struct": 24, "const": [24, 34], "stringa": 24, "input": 24, "objectivetyp": 24, "noarr": 24, "deltafromstep": 24, "deltatostep": 24, "seri": [24, 26, 28], "fs_posit": 24, "subtract": [24, 34], "endeffector": 24, "pmatrix": 24, "effect": [24, 28, 30, 32, 34], "third": [24, 30], "small": [24, 30, 31, 34], "section": [24, 29, 31, 34], "fourth": 24, "rare": 24, "refin": 24, "ptr": 24, "principl": [24, 34], "larg": [24, 34], "predefin": 24, "featuresylbol": 24, "uniqu": 24, "complic": 24, "cours": [24, 25, 27, 28, 29, 30, 31, 34], "modulo": 24, "flip": [24, 34], "account": [24, 34], "coverag": 24, "apart": 24, "among": [24, 34], "fs_qitself": 24, "itself": [24, 34], "setqaccvelhom": 24, "prefer": [24, 34], "fs_qlimit": 24, "2n": 24, "slack": 24, "met": 24, "violat": 24, "group": [24, 27, 34], "fs_accumulatedcollis": 24, "fs_distanc": 24, "margin": [24, 28], "cm": 24, "placement": 24, "liter": [24, 32, 34], "addswitch": 24, "creation": 24, "setupconfigur": 24, "mechan": [24, 34], "enabl": [24, 29, 34], "exchang": 24, "addcontact": 24, "blueprint": 24, "enumer": [24, 34], "conv_time2step": 24, "conv_step2tim": 24, "purpos": [24, 34], "distinct": 24, "scheme": 24, "decid": 24, "fast": [24, 30], "settimeoptim": 24, "0th": 24, "evolv": 24, "newtoneul": 24, "applic": [24, 34], "schedul": 24, "adapt": [24, 34], "evolut": 24, "arxiv": 24, "tech": 24, "ab": [24, 34], "1407": 24, "0414": 24, "docu": 24, "mainten": 24, "bind": 24, "ipynb": [24, 28], "reintegr": 25, "familiar": 25, "explor": [25, 32], "tricki": 25, "background": [25, 34], "lift": 25, "drop": [25, 29, 34], "hop": 25, "throw": 25, "bonu": [25, 29], "lesson": 25, "integr": [26, 34], "plan": [26, 31, 34], "mobil": [26, 34], "navig": 26, "major": 26, "spend": 26, "supervis": 26, "instructor": 26, "session": [26, 29, 31], "leverag": 26, "perceiv": 26, "student": 26, "expect": 26, "offlin": [26, 31], "homework": 26, "though": 26, "team": [26, 31], "challeng": 26, "www": [26, 31, 34], "de": [26, 34], "teach": [26, 34], "labcours": 26, "pdf": [26, 31], "04": [26, 29], "instruct": [26, 27], "readm": 27, "delivar": 27, "course3": [27, 28], "eg": 27, "qtcreator": 27, "pycharm": 27, "brows": 27, "debug": [27, 30], "pull": [27, 28, 29, 30], "futur": 27, "gitlab": 27, "organ": [27, 31], "fork": 27, "usr": 27, "subfold": 27, "makefil": 27, "too": [27, 31], "difficult": 27, "submodul": [27, 28, 29, 30], "pybind": 27, "checkout": 27, "branch": [27, 34], "cmakelist": 27, "deliver": 27, "isi": 27, "unfamiliar": 27, "io": [27, 29], "parallel": 27, "develop": [27, 29, 30], "member": 27, "least": [27, 34], "commit": 27, "hardli": 27, "plain": [27, 30], "_simul": 27, "Be": [27, 28], "abl": [27, 28, 34], "walk": 27, "j4": [28, 29, 30], "demonstr": [28, 31, 34], "minimalist": [28, 31, 34], "immedi": 28, "fulfil": [28, 34], "apriori": 28, "fs_scalarproductxz": 28, "zoom": 28, "combin": [28, 29, 34], "holist": 28, "paircollis": 28, "impress": 28, "neglect": 28, "fair": 28, "awai": 28, "even": [28, 34], "optima": 28, "obstacl": 28, "r_finger1": 28, "r_finger2": 28, "ingredi": 28, "myobj": 28, "shortcut": [28, 30], "realworld": [28, 30], "swept": [28, 30], "corner": 28, "primit": 28, "determin": [28, 32, 34], "sscvx": 28, "hull": 28, "sweep": 28, "understood": 28, "care": 28, "l": 28, "compon": [28, 34], "grippercent": 28, "greater": 28, "live": [28, 31, 34], "readi": 28, "minim": [28, 30, 34], "weak": 28, "repeat": [28, 30], "subscrib": 29, "fun": 29, "tutroal": 29, "readthedoc": 29, "en": 29, "latest": 29, "py_tutori": 29, "html": 29, "tracker": 29, "redish": 29, "binari": 29, "mask": 29, "contour": 29, "draw": 29, "identifi": 29, "yield": 29, "averag": 29, "significantli": 29, "fit": 29, "blur": 29, "discuss": [29, 31, 34], "largest": 29, "less": [29, 34], "foreground": 29, "cheat": 30, "stochast": 30, "failur": 30, "sp": 30, "pseudo": 30, "stack": [30, 34], "toward": [30, 34], "occlud": 30, "occlus": 30, "enough": [30, 31], "reliabl": 30, "success": 30, "opengripp": 30, "robustli": 30, "endless": 30, "long": 30, "column": [30, 34], "15cm": 30, "suffic": 30, "cf": 30, "email": 31, "latex": 31, "brief": [31, 34], "prepar": 31, "statement": 31, "eventu": [31, 34], "workplan": 31, "achiev": 31, "intend": 31, "effort": 31, "mention": [31, 34], "split": 31, "max": 31, "minut": 31, "spotlight": 31, "video": 31, "min": 31, "demo": 31, "briefli": 31, "softwar": 31, "talk": [31, 34], "mayb": 31, "fanci": 31, "persist": [31, 32], "explan": [31, 34], "interrupt": 31, "titl": 31, "clip": 31, "possibli": 31, "x5": 31, "cut": 31, "caption": 31, "youtub": 31, "1qymi": 31, "qon9m": 31, "sink": 31, "submit": 31, "confer": 31, "linux": 31, "super": 31, "bad": 31, "davinci": 31, "kdenliv": 31, "keyfram": 32, "insight": [32, 34], "lgpplayer": 32, "folfil": 32, "action": 32, "pddl": 32, "conffil": 32, "skeletonsolv": 32, "mathematicalproblem": 32, "sktfile": 32, "predic": 32, "produc": 32, "src_skeletonsolv": 32, "ex": 32, "block1": 32, "stable_": 32, "block2": 32, "stableon_": 32, "block3": 32, "block4": 32, "block5": 32, "box1": 32, "repetit": 32, "five": [32, 34], "concurr": 32, "workshop": 32, "stick": 32, "intellig": 34, "intro": 34, "craig": 34, "addison": 34, "weslei": 34, "york": 34, "1989": 34, "3rd": 34, "2006": 34, "steven": 34, "laval": 34, "cambridg": 34, "onlin": 34, "uiuc": 34, "edu": 34, "videolectur": 34, "oussama": 34, "khatib": 34, "net": 34, "oussama_khatib": 34, "focu": 34, "oliv": 34, "brock": 34, "menu": 34, "stefan": 34, "schaal": 34, "clmc": 34, "usc": 34, "teachingintroductiontoroboticssyllabu": 34, "theori": 34, "analyt": 34, "pid": 34, "chapter": 34, "chri": 34, "atkeson": 34, "cmu": 34, "cga": 34, "kdc": 34, "book": 34, "ewhitman1": 34, "pptx": 34, "af": 34, "academ": 34, "16311": 34, "bug": 34, "holonom": 34, "springer": 34, "handbook": 34, "bruno": 34, "siciliano": 34, "1007": 34, "978": 34, "319": 34, "32552": 34, "seciton": 34, "found": 34, "speak": 34, "clearli": 34, "simplif": 34, "secshap": 34, "landmark": 34, "cross": 34, "appendix": 34, "apptransform": 34, "cc": 34, "commonli": 34, "r_0": 34, "theta": 34, "underlin": 34, "never": 34, "sequenti": 34, "radian": 34, "doesn": 34, "figtransform": 34, "q_": 34, "circ": 34, "to2": 34, "to3": 34, "compos": 34, "concaten": 34, "ask": 34, "backward": 34, "somewhat": 34, "ill": 34, "situat": 34, "surpris": 34, "covari": 34, "contra": 34, "variant": 34, "children": 34, "ground": 34, "q_1": 34, "q_2": 34, "q_3": 34, "hspace": 34, "0pt": 34, "textrm": 34, "5pt": 34, "q_i": 34, "abbrevi": 34, "d_i": 34, "cccc": 34, "prismat": 34, "cylindr": 34, "spheric": 34, "lie": 34, "manifold": 34, "strict": 34, "pi": 34, "q_j": 34, "denavit": 34, "hartenberg": 34, "conceptu": 34, "cleaner": 34, "becam": 34, "stream": 34, "uncov": 34, "issu": 34, "perspect": 34, "textbook": 34, "seckinemat": 34, "t_i": 34, "r_i": 34, "_x": 34, "textsf": 34, "vec": 34, "construct": 34, "_i": 34, "e_x": 34, "e_i": 34, "e_z": 34, "basi": 34, "tensor": 34, "framec": 34, "dot": 34, "recal": 34, "auto": 34, "express": 34, "simpler": 34, "cover": 34, "p_j": 34, "a_j": 34, "Its": 34, "skew": 34, "obviou": 34, "eqquatvel": 34, "ang": 34, "rewrit": 34, "label": 34, "eqquatr": 34, "wise": 34, "written": 34, "insert": 34, "unusu": 34, "notion": 34, "trickier": 34, "eqquatjac": 34, "summar": 34, "x_j": 34, "r_j": 34, "eqquatjoint1": 34, "e_k": 34, "variat": 34, "induc": 34, "divis": 34, "necessari": 34, "annot": 34, "maintain": 34, "lazili": 34, "demand": 34, "syntact": 34, "sugar": 34, "rm": 34, "diag": 34, "relev": 34, "fuse": 34, "WITH": 34, "q_t": 34, "q_0": 34, "q_k": 34, "overload": 34, "tabfeatur": 34, "invert": 34, "address": 34, "eqiknlp": 34, "operatornam": 34, "_q": 34, "regular": 34, "satisfi": 34, "2_w": 34, "recommend": 34, "beyond": 34, "sort": 34, "rich": 34, "educ": 34, "secnlp": 34, "f_1": 34, "r_1": 34, "h_1": 34, "g_1": 34, "h_2": 34, "vdot": 34, "b_l": 34, "b_u": 34, "bf": 34, "orang": 34, "pgik": 34, "controlobject": 34, "mpc": 34, "lagrangian": 34, "strongli": 34, "tackl": 34, "eqsoft": 34, "2_c": 34, "norm": 34, "metric": 34, "undesir": 34, "investig": 34, "infti": 34, "canon": 34, "gauss": 34, "nabla_": 34, "approx": 34, "rewritten": 34, "sharp": 34, "eqik": 34, "woodburi": 34, "rh": 34, "jump": 34, "proport": 34, "due": 34, "lucki": 34, "stepsiz": 34, "sens": 34, "heurist": 34, "infinitesim": 34, "loos": 34, "drift": 34, "nullspac": 34, "det": 34, "rank": 34, "stretch": 34, "extend": 34, "soft": 34, "trade": 34, "off": 34, "restrict": 34, "ourselv": 34, "ones": 34, "raw": 34, "times3": 34, "orthonorm": 34, "r_2": 34, "transpos": 34, "unconstrain": 34, "thumb": 34, "rodrigu": 34, "formula": 34, "symmetr": 34, "ccc": 34, "w_3": 34, "w_2": 34, "w_1": 34, "eqrodriguez": 34, "exp": 34, "exponenti": 34, "element": 34, "diagon": 34, "outer": 34, "eqdotr": 34, "denot": 34, "context": 34, "negat": 34, "eqquat": 34, "_0": 34, "ij": 34, "comparison": 34, "tr": 34, "r_3": 34, "31": 34, "32": 34, "analogi": 34, "lh": 34, "iff": 34, "e_0": 34, "e_3": 34, "w_i": 34, "wasn": 34, "j_": 34, "expand": 34, "rx": 34, "ordinari": 34, "t_1": 34, "t_2": 34, "v_1": 34, "v_2": 34, "t_": 34, "rigor": 34, "a_b": 34, "regard": 34, "ato": 34, "convinc": 34, "yourself": 34, "boldsymbol": 34, "e_1": 34, "e_n": 34, "p_": 34, "nolimits_i": 34, "p_i": 34, "b_1": 34, "b_n": 34, "w_n": 34, "b_i": 34, "w_": 34, "sum_j": 34, "w_j": 34, "ji": 34, "sum_i": 34, "b_j": 34, "rightarrow": 34, "d_g": 34, "d_h": 34, "d_r": 34, "sampler": 34, "matter": 34, "functnio": 34, "uint": 34, "objectivetypea": 34, "featuretyp": 34, "bounds_lo": 34, "bounds_up": 34, "void": 34, "getinitializationsampl": 34, "previousoptima": 34, "getfhessian": 34, "throughout": 34, "anytyp": 34, "extens": 34, "parser": 34, "implic": 34, "url": 34, "embrac": 34, "ref": 34, "refgraph": 34, "extrins": 34, "u_x": 34, "u_i": 34, "u_d": 34, "diagram": 34, "drawn": 34, "paper": 34, "consequ": 34, "count": 34, "readabl": 34, "eqxtou": 34, "f_x": 34, "c_x": 34, "f_y": 34, "c_y": 34, "intrins": 34, "vertic": 34, "tan": 34, "cartesian": 34, "u_z": 34, "cal": 34, "lambda": 34, "bold": 34, "kr": 34, "subsum": 34, "fulli": 34, "_p": 34, "compar": 34, "decompos": 34, "rq": 34, "decomposit": 34, "agument": 34, "_t": 34}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"get": [0, 20, 23, 34], "start": [0, 5, 34], "quick": 0, "instal": 0, "avanc": 0, "info": 0, "tutori": [0, 15, 24], "notebook": 0, "welcom": 1, "robot": [1, 3, 5, 6, 10, 21, 34], "cours": [1, 26], "repo": 1, "content": 1, "indic": 1, "tabl": 1, "configur": [2, 9, 10, 15, 20, 21, 27, 34], "ad": [2, 20], "frame": [2, 6, 10, 20, 34], "load": [2, 10, 24], "exist": 2, "featur": [2, 9, 11, 20, 24, 28, 34], "comput": [2, 20], "geometr": 2, "properti": 2, "joint": [2, 20, 21, 34], "state": [2, 20, 23], "view": [2, 9], "interact": [2, 28], "releas": 2, "object": [2, 9, 28], "oper": [3, 28], "botop": [3, 15], "interfac": [3, 18, 34], "komo": [4, 15, 20, 24], "motion": [4, 28], "optim": [4, 11, 12, 13, 16, 24, 28], "minim": 4, "ik": [4, 28, 34], "exampl": [4, 6, 8, 9, 12, 17, 32], "more": [4, 9, 10, 11, 15, 24], "constraint": 4, "box": [4, 30], "grasp": [4, 8, 10, 30], "waypoint": 4, "path": [4, 9, 12, 13, 17, 24, 28], "real": [5, 24, 28], "advanc": [5, 9, 10, 14, 28], "complianc": 5, "forc": [5, 24], "torqu": 5, "feedback": 5, "first": [6, 24], "grap": 6, "imag": [6, 23, 34], "from": [6, 20, 21, 34], "webcam": 6, "2": [6, 24, 28], "convert": 6, "simul": [6, 18, 20, 23, 26, 27], "rgb": [6, 23], "d": [6, 28], "point": 6, "cloud": 6, "3": [6, 29], "us": [6, 21, 28, 34], "multipl": [6, 10], "camera": [6, 9, 34], "attach": [6, 10], "differ": 6, "sim": 8, "push": 8, "code": [9, 27, 34], "collis": [9, 10, 20, 28], "over": 9, "tupl": 9, "veloc": [9, 24, 28], "acceler": [9, 28], "need": 9, "test": [9, 24], "import": [10, 21, 34], "edit": [10, 20, 21, 34], "manipul": 10, "predefin": 10, "model": 10, "singl": 10, "how": [10, 24], "fake": 10, "enabl": 10, "disabl": 10, "queri": 10, "report": 10, "render": 10, "yaml": [10, 34], "dict": 10, "represent": 10, "invers": [11, 34], "kinemat": [11, 24, 34], "merg": [11, 13], "demo": 11, "explan": 11, "switch": [14, 24], "skeleton": [14, 32], "same": 14, "again": 14, "onli": [14, 24], "keyfram": 14, "round": 15, "1": [24, 27], "basic": [15, 27, 28], "problem": 24, "design": [], "nlp": [16, 34], "formul": 16, "solv": [16, 24], "find": 17, "direct": 18, "arrai": 19, "c": [20, 23, 27, 28, 30], "tor": [20, 23], "copi": 20, "clear": 20, "set": 20, "select": 20, "activ": 20, "anyth": 20, "you": [20, 24], "might": 20, "want": 20, "structur": 20, "function": 20, "creat": 20, "other": 20, "class": 20, "viewer": 20, "etc": 20, "g": [21, 22], "file": [21, 22, 34], "describ": [21, 34], "kinedit": [21, 34], "urdf": [21, 24, 34], "notat": [21, 34], "specifi": [21, 34], "transform": [21, 34], "type": [21, 34], "graph": [22, 34], "step": [23, 24], "physic": 23, "open": 23, "close": 23, "gripper": 23, "grip": 23, "depth": [15, 23, 34], "restart": 23, "previou": 23, "helper": [23, 24], "depthdata2pointcloud": 23, "learn": [24, 32], "k": [24, 34], "order": 24, "markov": 24, "No": 24, "dynam": [24, 34], "do": 24, "what": [24, 32], "i": [24, 32], "formal": [24, 34], "ar": 24, "main": 24, "defin": 24, "roughli": 24, "doe": 24, "spec": 24, "can": 24, "an": [24, 34], "practic": 24, "lesson": 24, "plai": 24, "around": 24, "rai": [24, 33, 34], "addobject": 24, "method": 24, "languag": 24, "core": 24, "vari": 24, "decis": 24, "variabl": 24, "per": 24, "time": 24, "slice": 24, "contact": 24, "summari": 24, "few": 24, "fundament": 24, "rest": 24, "phase": 24, "link": 24, "document": 24, "old": 25, "materi": [25, 34], "lab": 26, "simlab": [27, 28, 29, 30, 31], "exercis": [27, 28, 29, 30], "setup": 27, "b": [27, 28, 29, 30], "git": 27, "rough": 27, "familiar": 27, "explor": 28, "enforc": 28, "touch": 28, "e": 28, "tricki": 28, "inequ": 28, "scale": 28, "target": 28, "f": 28, "reactiv": 28, "space": 28, "control": 28, "opencv": 29, "color": 29, "base": 29, "track": 29, "background": 29, "substract": 29, "4": 30, "lift": 30, "drop": 30, "hop": 30, "ball": 30, "throw": 30, "bonu": 30, "project": 31, "propos": 31, "final": 31, "present": 31, "detail": 31, "about": 32, "lgp": 32, "python": 33, "api": 33, "lectur": 34, "script": 34, "introduct": 34, "refer": 34, "scene": 34, "descript": 34, "coordin": 34, "composit": 34, "tree": 34, "forest": 34, "parameter": 34, "vector": 34, "forward": 34, "jacobian": 34, "rotat": 34, "translat": 34, "quaternion": 34, "implement": 34, "engin": 34, "build": 34, "classic": 34, "deriv": 34, "pseudo": 34, "solut": 34, "On": 34, "fly": 34, "singular": 34, "placehold": 34, "3d": 34, "static": 34, "A": 34, "note": 34, "affin": 34, "style": 34, "world": 34, "homogen": 34, "matrix": 34, "p": 34, "calibr": 34, "estim": 34, "r": 34, "t": 34, "data": 34, "shape": 34, "1st": 15}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "nbsphinx": 4, "sphinx": 57}, "alltitles": {"Getting Started": [[0, "getting-started"]], "Quick install": [[0, "quick-install"]], "Avanced info": [[0, "avanced-info"]], "Installing the tutorial notebooks": [[0, "installing-the-tutorial-notebooks"]], "Welcome to the Robotics Course Repo": [[1, "welcome-to-the-robotics-course-repo"]], "Contents:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]], "Configurations": [[2, "Configurations"]], "Adding frames to a configuration": [[2, "Adding-frames-to-a-configuration"]], "Loading existing configurations": [[2, "Loading-existing-configurations"]], "Features: computing geometric properties": [[2, "Features:-computing-geometric-properties"]], "Joint and Frame State": [[2, "Joint-and-Frame-State"]], "View interaction and releasing objects": [[2, "View-interaction-and-releasing-objects"]], "Robot Operation (BotOp) interface": [[3, "Robot-Operation-(BotOp)-interface"]], "KOMO: Motion Optimization": [[4, "KOMO:-Motion-Optimization"]], "Minimal IK example": [[4, "Minimal-IK-example"]], "Example for more constraints: box grasping IK": [[4, "Example-for-more-constraints:-box-grasping-IK"]], "Waypoints example": [[4, "Waypoints-example"]], "Path example": [[4, "Path-example"]], "Starting with a real robot": [[5, "Starting-with-a-real-robot"]], "Advanced: Compliance & Force/Torque feedback": [[5, "Advanced:-Compliance-&-Force/Torque-feedback"]], "First example to grap images from a webcam": [[6, "First-example-to-grap-images-from-a-webcam"]], "2. Example to convert simulated RGB-D images into point clouds": [[6, "2.-Example-to-convert-simulated-RGB-D-images-into-point-clouds"]], "3. example to use multiple camera attached to different robot frames": [[6, "3.-example-to-use-multiple-camera-attached-to-different-robot-frames"]], "Example for grasping in Sim": [[8, "Example-for-grasping-in-Sim"]], "Example for pushing in sim": [[8, "Example-for-pushing-in-sim"]], "Features": [[9, "Features"], [9, "id1"]], "Code example for collision features": [[9, "Code-example-for-collision-features"]], "Advanced: Features over configuration tuples (path configurations, velocity/acceleration features)": [[9, "Advanced:-Features-over-configuration-tuples-(path-configurations,-velocity/acceleration-features)"]], "Camera views (needs more testing)": [[9, "Camera-views-(needs-more-testing)"]], "Examples": [[9, "Examples"]], "Objectives": [[9, "Objectives"]], "Importing, Editing & Manipulating Configurations": [[10, "Importing,-Editing-&-Manipulating-Configurations"]], "Editing": [[10, "Editing"]], "Predefined robot models": [[10, "Predefined-robot-models"]], "Loading multiple models in a single configuration": [[10, "Loading-multiple-models-in-a-single-configuration"]], "How to attach frames - faking grasps": [[10, "How-to-attach-frames---faking-grasps"]], "How to enable/disable collisions": [[10, "How-to-enable/disable-collisions"], [10, "id1"]], "More on collisions: Disable/enable, query, report": [[10, "More-on-collisions:-Disable/enable,-query,-report"]], "Rendering configurations": [[10, "Rendering-configurations"]], "Advanced: YAML and dict representations": [[10, "Advanced:-YAML-and-dict-representations"]], "Inverse Kinematics as Optimization (to be merged)": [[11, "Inverse-Kinematics-as-Optimization-(to-be-merged)"]], "Demo of features in Inverse Kinematics": [[11, "Demo-of-features-in-Inverse-Kinematics"]], "More explanations": [[11, "More-explanations"]], "Path optimization example": [[12, "Path-optimization-example"]], "Path Optimization (to be merged)": [[13, "Path-Optimization-(to-be-merged)"]], "Advanced: Switches & Skeletons": [[14, "Advanced:-Switches-&-Skeletons"]], "Same again, but only the keyframes:": [[14, "Same-again,-but-only-the-keyframes:"]], "Skeletons": [[14, "Skeletons"]], "Tutorials": [[15, "tutorials"]], "1st Round: Basics on Configurations, BotOp & KOMO": [[15, "st-round-basics-on-configurations-botop-komo"]], "More in depth": [[15, "more-in-depth"]], "Optimization (NLP formulation and solving)": [[16, "Optimization-(NLP-formulation-and-solving)"]], "Path finding example": [[17, "Path-finding-example"]], "Direct simulation interface": [[18, "Direct-simulation-interface"]], "Array": [[19, "array"]], "Configuration": [[20, "configuration"]], "C\u2019tor": [[20, "c-tor"], [23, "c-tor"]], "Adding frames to the configuration": [[20, "adding-frames-to-the-configuration"]], "Copy, clear": [[20, "copy-clear"]], "Joint state: get/set, and selecting active joints": [[20, "joint-state-get-set-and-selecting-active-joints"]], "Frame state": [[20, "frame-state"]], "Features: Anything you might want to compute from Configurations": [[20, "features-anything-you-might-want-to-compute-from-configurations"]], "Structural edits": [[20, "structural-edits"]], "Collision computations": [[20, "collision-computations"]], "Functions to create other classes (KOMO, Simulation, viewer, etc)": [[20, "functions-to-create-other-classes-komo-simulation-viewer-etc"]], ".g-files to describe robot configurations": [[21, "g-files-to-describe-robot-configurations"]], "Editing using kinEdit": [[21, "editing-using-kinedit"], [34, "editing-using-kinedit"]], "Import from URDF": [[21, "import-from-urdf"], [34, "import-from-urdf"]], "Notation to specify transformations": [[21, "notation-to-specify-transformations"], [34, "notation-to-specify-transformations"]], "Joint types": [[21, "joint-types"], [34, "joint-types"]], "Graph and .g-files": [[22, "graph-and-g-files"]], "Simulation": [[23, "simulation"]], "Stepping physics": [[23, "stepping-physics"]], "Opening & closing the gripper, and gripping state": [[23, "opening-closing-the-gripper-and-gripping-state"]], "Getting simulated RGB and depth images": [[23, "getting-simulated-rgb-and-depth-images"]], "Simulation states: restarting the simulation in previous states": [[23, "simulation-states-restarting-the-simulation-in-previous-states"]], "Helper: depthData2pointCloud": [[23, "helper-depthdata2pointcloud"]], "Learning KOMO (K-Order Markov Optimization)": [[24, "learning-komo-k-order-markov-optimization"]], "No dynamics? No velocities? How do you solve for dynamic problems?": [[24, "no-dynamics-no-velocities-how-do-you-solve-for-dynamic-problems"]], "What is KOMO?": [[24, "what-is-komo"]], "What is KOMO \u2013 formally?": [[24, "what-is-komo-formally"]], "What are the main steps to define a KOMO problem?": [[24, "what-are-the-main-steps-to-define-a-komo-problem"]], "Roughly, what does KOMO do with these specs?": [[24, "roughly-what-does-komo-do-with-these-specs"]], "Can KOMO only optimize paths?": [[24, "can-komo-only-optimize-paths"]], "Can I load an URDF?": [[24, "can-i-load-an-urdf"]], "First practical steps": [[24, "first-practical-steps"]], "Lesson 1: play around with $RAI/test/KOMO/tutorial": [[24, "lesson-1-play-around-with-rai-test-komo-tutorial"]], "Lesson 2: Learn the addObjective method and the \u201cLanguage of Features\u201d": [[24, "lesson-2-learn-the-addobjective-method-and-the-language-of-features"]], "Features are at the core": [[24, "features-are-at-the-core"]], "Varying decision variables per time slice: kinematic switches & force contacts": [[24, "varying-decision-variables-per-time-slice-kinematic-switches-force-contacts"]], "Summary: there are only a few fundamental methods in KOMO, the rest are helpers": [[24, "summary-there-are-only-a-few-fundamental-methods-in-komo-the-rest-are-helpers"]], "Steps, phase, real time, and time optimization": [[24, "steps-phase-real-time-and-time-optimization"]], "LINKS to more documentation": [[24, "links-to-more-documentation"]], "Old Material": [[25, "old-material"]], "Lab Course in Simulation": [[26, "lab-course-in-simulation"]], "SimLab Exercise 1 - Basic Setup": [[27, "simlab-exercise-1-basic-setup"]], "a) Code Setup": [[27, "a-code-setup"]], "b) Git Setup": [[27, "b-git-setup"]], "c) Rough familiarity with Simulation and Configuration": [[27, "c-rough-familiarity-with-simulation-and-configuration"]], "SimLab Exercise 2 - Motion": [[28, "simlab-exercise-2-motion"]], "a) Basic IK": [[28, "a-basic-ik"]], "b) Path Optimization & velocity/acceleration objectives": [[28, "b-path-optimization-velocity-acceleration-objectives"]], "c) Explore collision features, and enforce touch": [[28, "c-explore-collision-features-and-enforce-touch"]], "d) Interacting with \u201creal\u201d objects": [[28, "d-interacting-with-real-objects"]], "e) Advanced: Tricky use of inequalities, scaling, and target": [[28, "e-advanced-tricky-use-of-inequalities-scaling-and-target"]], "f) Advanced: Reactive Operational Space Control": [[28, "f-advanced-reactive-operational-space-control"]], "SimLab Exercise 3 - OpenCV": [[29, "simlab-exercise-3-opencv"]], "a) OpenCV - color-based tracking": [[29, "a-opencv-color-based-tracking"]], "b) OpenCV - background substraction": [[29, "b-opencv-background-substraction"]], "SimLab Exercise 4 - Grasp": [[30, "simlab-exercise-4-grasp"]], "a) Grasp, lift & drop a hopping ball": [[30, "a-grasp-lift-drop-a-hopping-ball"]], "b) Throw the ball": [[30, "b-throw-the-ball"]], "c) Bonus: \u2026and for a box": [[30, "c-bonus-and-for-a-box"]], "SimLab - Project Proposal and Final Presentation": [[31, "simlab-project-proposal-and-final-presentation"]], "Project Proposal": [[31, "project-proposal"]], "Presentation Details": [[31, "presentation-details"]], "Learning about Skeletons & LGP": [[32, "learning-about-skeletons-lgp"]], "What is LGP?": [[32, "what-is-lgp"]], "Example Skeletons": [[32, "example-skeletons"]], "rai python API": [[33, "rai-python-api"]], "Lecture Script": [[34, "lecture-script"]], "Introduction": [[34, "introduction"]], "Reference material": [[34, "reference-material"]], "Coding Getting Started": [[34, "coding-getting-started"]], "Scene & Robot Description": [[34, "scene-robot-description"]], "Transformations": [[34, "transformations"], [34, "id1"]], "Coordinates and Composition of Transformations": [[34, "coordinates-and-composition-of-transformations"]], "Scene Tree or Forest": [[34, "scene-tree-or-forest"]], "Kinematics": [[34, "kinematics"]], "Robots as Parameterized Trees": [[34, "robots-as-parameterized-trees"]], "Configuration & Joint Vector": [[34, "configuration-joint-vector"]], "Forward Kinematics": [[34, "forward-kinematics"]], "Jacobians": [[34, "jacobians"]], "Rotational Joint": [[34, "rotational-joint"]], "Translational Joint": [[34, "translational-joint"]], "Quaternion Joint": [[34, "quaternion-joint"]], "Implementing a Kinematic Engine": [[34, "implementing-a-kinematic-engine"]], "Features in rai": [[34, "features-in-rai"]], "Inverse Kinematics": [[34, "inverse-kinematics"]], "Building an NLP from features": [[34, "building-an-nlp-from-features"]], "Classical Derivation of Pseudo-Inverse Jacobian Solution": [[34, "classical-derivation-of-pseudo-inverse-jacobian-solution"]], "Pseudo-inverse Jacobian.": [[34, "pseudo-inverse-jacobian"]], "On the fly IK.": [[34, "on-the-fly-ik"]], "Singularity.": [[34, "singularity"]], "Placeholder": [[34, "placeholder"], [34, "id4"]], "3D Transformations, Rotations, Quaternions": [[34, "d-transformations-rotations-quaternions"]], "Rotations": [[34, "rotations"]], "Static transformations": [[34, "static-transformations"]], "Dynamic transformations": [[34, "dynamic-transformations"]], "A note on affine coordinate frames": [[34, "a-note-on-affine-coordinate-frames"]], "RAI references": [[34, "rai-references"]], "NLP interface": [[34, "nlp-interface"]], "Kinematic Features": [[34, "kinematic-features"]], "Graph-Yaml Files": [[34, "graph-yaml-files"]], "yaml-style files to describe robot configurations": [[34, "yaml-style-files-to-describe-robot-configurations"]], "Cameras": [[34, "cameras"]], "Image, Camera, & World Coordinates": [[34, "image-camera-world-coordinates"]], "Homogeneous coordinates & Camera Matrix P": [[34, "homogeneous-coordinates-camera-matrix-p"]], "Calibration as Estimating P,K,R,t from Depth Data": [[34, "calibration-as-estimating-p-k-r-t-from-depth-data"]], "Shapes": [[34, "shapes"]], "Kinematics formally": [[34, "kinematics-formally"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/docs/notebooks/core1-config-and-frames.ipynb b/docs/source/notebooks/1a-configurations.ipynb
similarity index 50%
rename from docs/notebooks/core1-config-and-frames.ipynb
rename to docs/source/notebooks/1a-configurations.ipynb
index 789480d..dc0bce1 100644
--- a/docs/notebooks/core1-config-and-frames.ipynb
+++ b/docs/source/notebooks/1a-configurations.ipynb
@@ -4,34 +4,56 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Configuration & Frames\n",
+ "# Configurations\n",
"\n",
- "more detailed docs: https://marctoussaint.github.io/robotics-course/"
+ "A configuration is essentially a set of (coordinate) frames, where each frame can represent a shape, joint, inertia, etc. This tutorial introduces to basics of creating & loading configurations, the joint and frame state, computing features, and handling the view window."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "compile time: Sep 23 2023 12:43:33\n"
+ ]
+ }
+ ],
"source": [
- "from robotic import ry"
+ "from robotic import ry\n",
+ "import numpy as np\n",
+ "import time\n",
+ "print(ry.compiled())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Setting up a basic Config\n",
+ "## Adding frames to a configuration\n",
"\n",
- "The starting point is to create a `Configuration`."
+ "The starting point is to create a `Configuration`:"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"C = ry.Config()\n",
"C.view()"
@@ -43,18 +65,39 @@
"source": [
"This shows an empty configuration. Tip: Make the view window appear \"Always On Top\" (right click on the window bar)\n",
"\n",
- "You can add things (objects, scene models, robots) to a configuration."
+ "A configuration is essentially a tree (or forrest) of frames. You usually add models from files, but let's do it manually here."
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "frame name: first pos: [0. 0. 0.5] quat: [0.95782629 0.28734789 0. 0. ]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"C.clear()\n",
- "C.addFile('../rai-robotModels/pr2/pr2.g')\n",
- "C.addFile('../rai-robotModels/objects/kitchen.g')\n",
+ "f = C.addFrame(name='first')\n",
+ "f.setShape(type=ry.ST.marker, size=[.4])\n",
+ "f.setPosition([0.,0.,.5])\n",
+ "f.setQuaternion([1., .3, .0, .0]) #is normalized internally\n",
+ "print('frame name:', f.name, 'pos:', f.getPosition(), 'quat:', f.getQuaternion())\n",
"C.view()"
]
},
@@ -62,19 +105,38 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "You need to call C.view() to update the view"
+ "Let's add a second frame, but with first as parent and with a hinge joint!"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "ball = C.addFrame(name=\"ball\")\n",
- "ball.setShape(ry.ST.sphere, [.1])\n",
- "ball.setPosition([.8,.8,1.5])\n",
- "ball.setColor([1,1,0])\n",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "frame name: second pos: [0. 0. 0.5] quat: [-0.95782629 -0.28734789 -0. -0. ]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "f = C.addFrame(name='second', parent='first')\n",
+ "f.setJoint(ry.JT.hingeX)\n",
+ "f.setShape(type=ry.ST.marker, size=[.4])\n",
+ "f.setColor([1,0,0])\n",
+ "print('frame name:', f.name, 'pos:', f.getPosition(), 'quat:', f.getQuaternion())\n",
"C.view()"
]
},
@@ -82,19 +144,37 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "One can also add convex meshes (just passing the vertex array), or use sphere-swept convex meshes (ssBox, capsule, sphere, etc)"
+ "Since we now have a configuration with a joint, we can articulate it:"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "joint state: [0.1]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "C.addFrame(name=\"hand\", parent=\"pr2L\") \\\n",
- " .setShape(ry.ST.ssBox, size=[.2,.2,.1,.02]) \\\n",
- " .setRelativePosition([0,0,-.1]) \\\n",
- " .setColor([1,1,0])\n",
+ "q = C.getJointState()\n",
+ "q[0] = q[0] + .1\n",
+ "C.setJointState(q)\n",
+ "print('joint state:', q)\n",
"C.view()"
]
},
@@ -102,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "In this last example, the new object has another frame (pr2L) as *parent*. This means that it is permanently attached to this parent. pos and quat/rot are interpreted relative to the parent."
+ "Other examples to add:"
]
},
{
@@ -111,26 +191,20 @@
"metadata": {},
"outputs": [],
"source": [
- "f = C.frame(\"hand\")\n",
- "print(\"position:\", f.getPosition())\n",
- "print(\"orientation:\", f.getQuaternion())"
+ "C.addFrame('ball', 'second') .setShape(ry.ST.sphere, [.1]) .setColor([1.,.5,.0]) .setRelativePosition([-.3,.0,.2])\n",
+ "C.addFrame('box', 'second') .setShape(ry.ST.ssBox, [.3,.2,.1,.02]) .setColor([.5,1.,.0]) .setRelativePosition([.0,.0,.2])\n",
+ "C.addFrame('capsule', 'second') .setShape(ry.ST.capsule, [.3, .05]) .setColor([.0,1.,.5]) .setRelativePosition([.3,.0,.2])\n",
+ "for t in range(100):\n",
+ " C.setJointState([np.cos(.1*t)])\n",
+ " C.view()\n",
+ " time.sleep(.1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "TODO (below): getters and setters for frames"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "frameC = C.frame('C')\n",
- "print('pos:', frameC.getPosition(), 'quat:', frameC.getQuaternion())"
+ "## Loading existing configurations"
]
},
{
@@ -139,20 +213,16 @@
"metadata": {},
"outputs": [],
"source": [
- "q[0] = q[0] + .5\n",
- "C.setJointState(q)\n",
- "print('pos:', frameC.getPosition(), 'quat:', frameC.getQuaternion())"
+ "C.clear()\n",
+ "C.addFile(ry.raiPath('panda/panda.g'))\n",
+ "C.view()"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "[y,J] = C.eval(ry.FS.position, ['C'])\n",
- "print('position of C:', y, '\\nJacobian:', J)\n",
- "type(J)"
+ "Let's add a second panda, but prefix all frame names, and move it to the side"
]
},
{
@@ -161,30 +231,17 @@
"metadata": {},
"outputs": [],
"source": [
- "#only the z-position relative to target 0.5:\n",
- "C.eval(ry.FS.position, ['C'], [[0,0,1]], [0,0,0.5]) #the scaling is a 1x3 matrix"
+ "C.addFile(ry.raiPath('panda/panda.g'), 'r_')\n",
+ "base_r = C.getFrame('r_panda_base')\n",
+ "base_r.setPosition([.0, .5, .0])\n",
+ "C.view()"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Joint and Frame State\n",
- "\n",
- "A configuration is a tree of n frames. Every frame has a pose (position & quaternion), which is represented as a 7D vector (x,y,z, qw,qx,qy,qz). The frame state is the $n\\times 7$ matrix, where the i-th row is the pose of the i-th frame.\n",
- "\n",
- "A configuration also defines joints, which means that the relative transfromation from a parent to a child frame is parameterized by degrees-of-freedoms (DOFs). If the configuration has in total n DOFs, the joint state is a n-dimensional vector.\n",
- "\n",
- "Setting the joint state implies computing all relative transformations, and then forward chaining all transformations to compute all frame poses. So setting the joint state also sets the frame state.\n",
- " \n",
- "Setting the frame state allows you to set frame poses that are inconsistent/impossible w.r.t. the joints! Setting the frame state implies computing all relative transformations from the frame poses, and then assigning the joint state to the *projection* onto the actual DOFs"
+ "We can get the joint state of the full configuration:"
]
},
{
@@ -193,16 +250,16 @@
"metadata": {},
"outputs": [],
"source": [
- "q = C.getJointState()\n",
- "print('joint names: ', C.getJointNames() )\n",
- "print('joint state: ', q)"
+ "print(C.getJointState())\n",
+ "print('joints:', C.getJointNames())\n",
+ "print('frames:', C.getFrameNames())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Let's move the configuration by adding to the joint configuration"
+ "Let's animate:"
]
},
{
@@ -211,16 +268,20 @@
"metadata": {},
"outputs": [],
"source": [
- "q[2] = q[2] + 1.\n",
- "C.setJointState(q)\n",
- "C.view()"
+ "q0 = C.getJointState()\n",
+ "for t in range(20):\n",
+ " q = q0 + .1*np.random.randn(q0.shape[0])\n",
+ " C.setJointState(q)\n",
+ " C.view()\n",
+ " time.sleep(.2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "The *frame state* is a $n\\times 7$ matrix, which contains for all of $n$ frames the 7D pose. A pose is stored as [p_x, p_y, p_z, q_w, q_x, q_y, q_z], with position p and quaternion q."
+ "## Features: computing geometric properties\n",
+ "For every frame we can query its pose:"
]
},
{
@@ -229,15 +290,19 @@
"metadata": {},
"outputs": [],
"source": [
- "X0 = C.getFrameState()\n",
- "print('frame state: ', X0)"
+ "f = C.getFrame('r_gripper')\n",
+ "print('gripper pos:', f.getPosition())\n",
+ "print('gripper quat:', f.getQuaternion())\n",
+ "print('gripper rot:', f.getRotationMatrix())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Let's do a questionable thing: adding .1 to all numbers in the frame matrix!"
+ "The above provides basic forward kinematics: After `setJointState` you can query the pose of any configuration frame. However, there is a more general way to query *features*, i.e. properties of the configuration in a differentiable manner. You might not use this often; but it is important to understand as these differentiable features are the foundation of how optimization problems are formulated, which you'll need a lot.\n",
+ "\n",
+ "Here are some example features to evaluate:"
]
},
{
@@ -246,18 +311,8 @@
"metadata": {},
"outputs": [],
"source": [
- "X = X0 + .1\n",
- "C.setFrameState(X)\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The rows of X have non-normalized quaternions! These are normalized when setting the frame state.\n",
- "\n",
- "Also, the frame poses are now *inconsistent* to the joint constraints! We can read out the projected joint state, set the joint state, and get a consistent state again:"
+ "[y,J] = C.eval(ry.FS.position, ['gripper'])\n",
+ "print('position of gripper:', y, '\\nJacobian:', J)"
]
},
{
@@ -266,15 +321,18 @@
"metadata": {},
"outputs": [],
"source": [
- "C.setJointState( C.getJointState() )\n",
- "C.view()"
+ "# negative(!) distance between two convex shapes (or origin of marker)\n",
+ "C.eval(ry.FS.negDistance, ['panda_coll7', 'r_panda_coll7'])"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
+ "outputs": [],
"source": [
- "Now all *joint* transformations are consistent: just hingeX transformations or alike. However, all the other relative transformations of links and shapes are still messed up from setting their frame pose. Let's bring the configuration back into the state before the harsh *setFrame*"
+ "# the x-axis of the given frame in world coordinates\n",
+ "C.eval(ry.FS.vectorX, ['gripper'])"
]
},
{
@@ -282,20 +340,21 @@
"execution_count": null,
"metadata": {},
"outputs": [],
- "source": [
- "C.setFrameState(X0)\n",
- "C.view()"
- ]
+ "source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- " ## Selecting joints\n",
+ "## Joint and Frame State\n",
"\n",
- "Often one would like to choose which joints are actually active, that is, which joints are referred to in q. This allows one to sub-select joints and work only with projections of the full configuration state. This changes the joint state dimensionality, including ordering of entries in q.\n",
+ "A configuration is a tree of n frames. Every frame has a pose (position & quaternion), which is represented as a 7D vector (x,y,z, qw,qx,qy,qz). The frame state is the $n\\times 7$ matrix, where the i-th row is the pose of the i-th frame.\n",
+ "\n",
+ "A configuration also defines joints, which means that the relative transfromation from a parent to a child frame is parameterized by degrees-of-freedoms (DOFs). If the configuration has in total n DOFs, the joint state is a n-dimensional vector.\n",
"\n",
- "The frame state is not affected by such a selection of active joints."
+ "Setting the joint state implies computing all relative transformations, and then forward chaining all transformations to compute all frame poses. So setting the joint state also sets the frame state.\n",
+ " \n",
+ "Setting the frame state allows you to set frame poses that are inconsistent/impossible w.r.t. the joints! Setting the frame state implies computing all relative transformations from the frame poses, and then assigning the joint state to the *projection* onto the actual DOFs"
]
},
{
@@ -304,21 +363,15 @@
"metadata": {},
"outputs": [],
"source": [
- "C.selectJointsByTag([\"armL\",\"base\"])\n",
- "q = C.getJointState()\n",
- "print('joint state: ', q)\n",
- "print('joint names: ', C.getJointNames() )"
+ "C.setJointState(q0)\n",
+ "C.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Features & Jacobians\n",
- "\n",
- "A core part of rai defines features over configurations. A feature is a differentiable mapping from a configuration (or set of configurations) to a vector. Starndard features are \"position-of-endeffector-X\" or \"distance/penetration-between-convex-shapes-A-and-B\", etc. But there are many, many more features defined in rai, like error of Newton-Euler-equations for an object, total energy of the system, etc. Defining differentiable features is the core of many functionalities in the rai code.\n",
- "\n",
- "Let's define a basic feature over C: the 3D (world coordinate) position of pr2L (left hand)"
+ "The *frame state* is a $n\\times 7$ matrix, which contains for all of $n$ frames the 7D pose. A pose is stored as [p_x, p_y, p_z, q_w, q_x, q_y, q_z], with position p and quaternion q."
]
},
{
@@ -327,14 +380,15 @@
"metadata": {},
"outputs": [],
"source": [
- "F = C.feature(ry.FS.position, [\"pr2L\"])"
+ "X0 = C.getFrameState()\n",
+ "print('frame state: ', X0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "We can now evaluate the feature, and also get the Jacobian:"
+ "Let's do a very questionable thing: adding .1 to all numbers in the frame matrix!"
]
},
{
@@ -343,29 +397,20 @@
"metadata": {},
"outputs": [],
"source": [
- "print(F.description(C))\n",
- "\n",
- "[y,J] = F.eval(C)\n",
- "print('hand position:', y)\n",
- "print('Jacobian:', J)\n",
- "print('Jacobian shape:', J.shape)"
+ "X = X0 + .1\n",
+ "C.setFrameState(X)\n",
+ "C.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "We can linearly transform features by setting 'scale' and 'target':"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "F2 = C.feature(ry.FS.distance, [\"hand\", \"ball\"])\n",
- "print(F2.description(C))"
+ "That totally broke the original design of the robot! Setting global frame states overwrites the relative transformations between frames.\n",
+ "\n",
+ "(Also, the rows of X have non-normalized quaternions! These are normalized when setting the frame state.)\n",
+ "\n",
+ "Let's reset:"
]
},
{
@@ -374,21 +419,22 @@
"metadata": {},
"outputs": [],
"source": [
- "F2.eval(C)"
+ "C.setFrameState(X0)\n",
+ "C.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Camera views (needs more testing)"
+ "## View interaction and releasing objects"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "We can also add a frame, attached to the head, which has no shape associated to it, but create a view is associated with that frame:"
+ "You can close and re-open the view window"
]
},
{
@@ -397,10 +443,7 @@
"metadata": {},
"outputs": [],
"source": [
- "C.addFrame(name='camera', parent='head_tilt_link', args='Q:
focalLength:.3')\n",
- "V = C.cameraView()\n",
- "IV = V.imageViewer()\n",
- "V.addSensor(name='camera', frameAttached='camera', width=600, height=400)"
+ "C.view_close()"
]
},
{
@@ -409,32 +452,30 @@
"metadata": {},
"outputs": [],
"source": [
- "[image,depth] = V.computeImageAndDepth()"
+ "# things are still there\n",
+ "C.view(pause=False, message='this is a message')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "When we move the robot, that view moves with it:"
+ "For user interaction it is often useful to wait for a keypress (making `view` a blocking call):"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "C.setJointState(q=[0.5], joints=['head_pan_joint'])\n",
- "V.updateConfig(C)\n",
- "V.computeImageAndDepth()"
+ "keypressed = C.view(True, 'press some key!')\n",
+ "print('pressed key:', keypressed, chr(keypressed))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "To close a view (or destroy a handle to a computational module), we reassign it to zero. We can also remove a frame from the configuration."
+ "Get a screenshot:"
]
},
{
@@ -443,9 +484,15 @@
"metadata": {},
"outputs": [],
"source": [
- "IV = 0\n",
- "V = 0\n",
- "C.delFrame('camera')"
+ "img = C.view_getScreenshot()\n",
+ "print(type(img), img.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And release everything, including closing the view"
]
},
{
@@ -454,7 +501,7 @@
"metadata": {},
"outputs": [],
"source": [
- "C=0"
+ "del C"
]
},
{
diff --git a/docs/source/notebooks/1b-botop.ipynb b/docs/source/notebooks/1b-botop.ipynb
new file mode 100644
index 0000000..a0a1da5
--- /dev/null
+++ b/docs/source/notebooks/1b-botop.ipynb
@@ -0,0 +1,483 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e193f01d",
+ "metadata": {},
+ "source": [
+ "# Robot Operation (BotOp) interface\n",
+ "\n",
+ "This describes basics to interact with a real or simulated robot. The BotOp (=robot operation) interface is very narrow. The move methods set/overwrite a spline reference for the robot. (Also compliance around the reference can be set.) The gripper methods operate grippers. The getImage.. methods grab images or point clouds from the camera.\n",
+ "\n",
+ "This interface different to a more *generic physical simulation* interface. If you're interested in the latter (e.g. to implement a gym environment) look at the `Simulation` tutorial. The simulation used here is a real-time threaded process that mimics the specific BotOp interface -- to make it swappable with a real robot.\n",
+ "\n",
+ "The simulation can be run in many different modes: pure kinematic (no physics for objects), a physics simulator with physics for objects but still kinematic robot, a physic simulator with PD motors for the robot."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "31a434d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from robotic import ry\n",
+ "import numpy as np\n",
+ "import time"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74bb70b4",
+ "metadata": {},
+ "source": [
+ "ry has global parameters, that can be defined in `rai.cfg` or with the following calls.\n",
+ "The simulation behaves very differently depending on `botim/engine` [physx or kinematic] and `multibody`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "bb4031b4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "-- ry.cpp:operator():99(0) python,\n",
+ "message: \"Hello, the local 'rai.cfg' was loaded\",\n",
+ "botsim/verbose: 2,\n",
+ "physx/motorKp: 10000,\n",
+ "physx/motorKd: 1000,\n",
+ "botsim/engine: physx,\n",
+ "physx/multibody: 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "ry.params_add({'botsim/verbose': 2., 'physx/motorKp': 10000., 'physx/motorKd': 1000.})\n",
+ "ry.params_add({'botsim/engine': 'physx'}) #makes a big difference!\n",
+ "ry.params_add({'physx/multibody': True}) #makes a big difference!\n",
+ "ry.params_print()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "d1bff41b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "C = ry.Config()\n",
+ "C.addFile(ry.raiPath('../rai-robotModels/scenarios/pandaSingle.g'))\n",
+ "C.view(False, 'this is your workspace data structure C -- NOT THE SIMULTATION')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2333c4b1",
+ "metadata": {},
+ "source": [
+ "We open a robot interface in simulation (False). True would directly open communication to one or two pandas (depending no how many are defined in C). The `botsim/verbose` above leads to the explicit verbosity when creating the simulator interface."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "6832eb10",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "-- kin_physx.cpp:PhysXInterface:768(0) starting PhysX engine ...\n",
+ "-- kin_physx.cpp:addGround:238(0) ... done starting PhysX engine\n",
+ "-- kin_physx.cpp:addGround:239(0) creating Configuration within PhysX ...\n",
+ "-- kin_physx.cpp:addLink:254(0) adding link 'world' as static with 1 shapes\n",
+ " table\n",
+ "-- kin_physx.cpp:addMultiBody:466(0) adding multibody with base 'l_panda_base' with the following links ...\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_base' as kinematic with 1 shapes\n",
+ " l_panda_link0_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint1' as dynamic with 1 shapes\n",
+ " l_panda_link1_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint2' as dynamic with 2 shapes\n",
+ " l_panda_link2_0 bellybutton\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint3' as dynamic with 1 shapes\n",
+ " l_panda_link3_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint4' as dynamic with 1 shapes\n",
+ " l_panda_link4_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint5' as dynamic with 1 shapes\n",
+ " l_panda_link5_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint6' as dynamic with 1 shapes\n",
+ " l_panda_link6_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_joint7' as dynamic with 2 shapes\n",
+ " l_panda_link7_0 l_panda_hand_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_finger_joint1' as dynamic with 1 shapes\n",
+ " l_panda_leftfinger_0\n",
+ "-- kin_physx.cpp:addMultiBody:486(0) adding multibody link 'l_panda_finger_joint2' as dynamic with 1 shapes\n",
+ " l_panda_rightfinger_0\n",
+ "-- kin_physx.cpp:addMultiBody:592(0) ... done with multibody with base 'l_panda_base'\n",
+ "-- kin_physx.cpp:PhysXInterface:805(0) ... done creating Configuration within PhysX\n"
+ ]
+ }
+ ],
+ "source": [
+ "bot = ry.BotOp(C, False)\n",
+ "#note that in sim, when physx multibody is activated, arms are going down! free floating..."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4ad9bb7",
+ "metadata": {},
+ "source": [
+ "We define 2 reference poses, q0=home and q1=(2nd joint bend), so that we can move back and forth between them"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "afe800f7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[ 0. -0.5 0. -2. 0. 2. -0.5] [ 0. -0.3 0. -2. 0. 2. -0.5]\n"
+ ]
+ }
+ ],
+ "source": [
+ "qHome = bot.get_qHome()\n",
+ "q0 = qHome.copy()\n",
+ "q1 = q0.copy()\n",
+ "q1[1] = q1[1] + .2\n",
+ "print(q0, q1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86f72e9b",
+ "metadata": {},
+ "source": [
+ "The `moveTo` is the simplest way to move the robot from current to target. It internally creates a spline to the target with optimal timing and follows it. The call is *non-blocking*. Also, your workspace config C is not kept in sync with the real/sim. If you want to wait till the motion is finished, you need to do manually checking the /time_til_end_of_reference_spline/, and meanwhile staying sync'ed."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "443856f3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bot.moveTo(q1)\n",
+ "\n",
+ "while bot.getTimeToEnd()>0:\n",
+ " bot.sync(C, .1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa41eca8",
+ "metadata": {},
+ "source": [
+ "The internal spline reference can be appended: As `moveTo` is non-blocking, you can append several moves like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "182b64dd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "timeToEnd: -0.073524058876411\n",
+ "timeToEnd: 1.0957189420649807\n",
+ "timeToEnd: 2.191437884129961\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('timeToEnd:', bot.getTimeToEnd())\n",
+ "bot.moveTo(q0)\n",
+ "print('timeToEnd:', bot.getTimeToEnd())\n",
+ "bot.moveTo(q1)\n",
+ "print('timeToEnd:', bot.getTimeToEnd())\n",
+ "bot.moveTo(q0)\n",
+ "\n",
+ "while bot.getTimeToEnd()>0:\n",
+ " bot.sync(C, .1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "abc71ed9",
+ "metadata": {},
+ "source": [
+ "Setting splines becomes reactive, when we can smoothly overwrite the spline reference with high frequency. Let's create a randomly moving target object and track it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "c3dbe900",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#this reference frame only appears in your workspace C - not the simulation!\n",
+ "target = C.addFrame('target', 'table')\n",
+ "target.setShape(ry.ST.marker, [.1])\n",
+ "target.setRelativePosition([0., .3, .3])\n",
+ "pos = target.getPosition()\n",
+ "cen = pos.copy()\n",
+ "C.view()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "b2a168d1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# you'll learn about KOMO later - this defines a basic Inverse Kinematics method\n",
+ "def IK(C, pos):\n",
+ " q0 = C.getJointState()\n",
+ " komo = ry.KOMO(C, 1, 1, 0, False) #one phase one time slice problem, with 'delta_t=1', order=0\n",
+ " komo.addObjective([], ry.FS.jointState, [], ry.OT.sos, [1e-1], q0) #cost: close to 'current state'\n",
+ " komo.addObjective([], ry.FS.jointState, [], ry.OT.sos, [1e-1], qHome) #cost: close to qHome\n",
+ " komo.addObjective([], ry.FS.positionDiff, ['l_gripper', 'target'], ry.OT.eq, [1e1]) #constraint: gripper position\n",
+ " \n",
+ " ret = ry.NLP_Solver(komo.nlp(), verbose=0) .solve()\n",
+ " \n",
+ " return [komo.getPath()[0], ret]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "76e13a25",
+ "metadata": {},
+ "source": [
+ "The following is just 'setting' the workspace C to the IK solution - no motion send to the real/robot:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "4998d869",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.005057, evals: 6, done: 1, feasible: 1, sos: 0.00789171, f: 0, ineq: 0, eq: 0.00138392 }\n",
+ "{ time: 0.001435, evals: 4, done: 1, feasible: 1, sos: 0.0055078, f: 0, ineq: 0, eq: 0.00038073 }\n",
+ "{ time: 0.001453, evals: 3, done: 1, feasible: 1, sos: 0.00485786, f: 0, ineq: 0, eq: 0.0031066 }\n",
+ "{ time: 0.000382, evals: 3, done: 1, feasible: 1, sos: 0.00552496, f: 0, ineq: 0, eq: 0.00285066 }\n",
+ "{ time: 0.000871, evals: 4, done: 1, feasible: 1, sos: 0.00481289, f: 0, ineq: 0, eq: 0.000176548 }\n",
+ "{ time: 0.000181, evals: 3, done: 1, feasible: 1, sos: 0.00416384, f: 0, ineq: 0, eq: 0.00404598 }\n",
+ "{ time: 0.001811, evals: 3, done: 1, feasible: 1, sos: 0.00394648, f: 0, ineq: 0, eq: 0.00118522 }\n",
+ "{ time: 0.000637, evals: 3, done: 1, feasible: 1, sos: 0.00410849, f: 0, ineq: 0, eq: 0.00429565 }\n",
+ "{ time: 0.001591, evals: 4, done: 1, feasible: 1, sos: 0.00454469, f: 0, ineq: 0, eq: 0.000211266 }\n",
+ "{ time: 0.000784, evals: 3, done: 1, feasible: 1, sos: 0.00470588, f: 0, ineq: 0, eq: 0.00357698 }\n",
+ "{ time: 0.000942, evals: 3, done: 1, feasible: 1, sos: 0.00478467, f: 0, ineq: 0, eq: 0.00148874 }\n",
+ "{ time: 0.001108, evals: 3, done: 1, feasible: 1, sos: 0.00457452, f: 0, ineq: 0, eq: 0.00162474 }\n",
+ "{ time: 0.001451, evals: 4, done: 1, feasible: 1, sos: 0.005894, f: 0, ineq: 0, eq: 0.000439926 }\n",
+ "{ time: 0.002882, evals: 3, done: 1, feasible: 1, sos: 0.00540869, f: 0, ineq: 0, eq: 0.0027726 }\n",
+ "{ time: 0.001624, evals: 4, done: 1, feasible: 1, sos: 0.00720508, f: 0, ineq: 0, eq: 0.00069492 }\n",
+ "{ time: 0.001267, evals: 4, done: 1, feasible: 1, sos: 0.0075089, f: 0, ineq: 0, eq: 0.000505518 }\n",
+ "{ time: 0.002128, evals: 3, done: 1, feasible: 1, sos: 0.0078162, f: 0, ineq: 0, eq: 0.0019024 }\n",
+ "{ time: 0.001489, evals: 3, done: 1, feasible: 1, sos: 0.00831903, f: 0, ineq: 0, eq: 0.00241169 }\n",
+ "{ time: 0.005757, evals: 4, done: 1, feasible: 1, sos: 0.0106921, f: 0, ineq: 0, eq: 0.000467631 }\n",
+ "{ time: 0.001208, evals: 4, done: 1, feasible: 1, sos: 0.0115667, f: 0, ineq: 0, eq: 0.000478951 }\n"
+ ]
+ }
+ ],
+ "source": [
+ "for t in range(20):\n",
+ " time.sleep(.1)\n",
+ " pos = cen + .98 * (pos-cen) + 0.02 * np.random.randn(3)\n",
+ " target.setPosition(pos)\n",
+ " \n",
+ " q_target, ret = IK(C, pos)\n",
+ " print(ret)\n",
+ " C.setJointState(q_target)\n",
+ " C.view()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0d79cae",
+ "metadata": {},
+ "source": [
+ "We now generate reative motion by smoothly overwriting the spline reference. Increasing time cost makes it more agressive (penalized total duration of estimated cubic spline)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "c5af1933",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for t in range(100):\n",
+ " bot.sync(C, .1) #keep the workspace C sync'ed to real/sim, and idle .1 sec\n",
+ " pos = cen + .98 * (pos-cen) + 0.02 * np.random.randn(3)\n",
+ " target.setPosition(pos)\n",
+ " \n",
+ " q_target, ret = IK(C, pos)\n",
+ " bot.moveTo(q_target, timeCost=5., overwrite=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "35e22aa1",
+ "metadata": {},
+ "source": [
+ "Good practise is to always allow a user aborting motion execution. In this example, key 'q' will break the loop and call a home() (which is the same as moveTo(qHome, 1., True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "09468d0c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for t in range(5):\n",
+ " bot.moveTo(q1)\n",
+ " bot.wait(C) #same as 'loop sync til keypressed or endOfTime', but also raises user window\n",
+ " if bot.getKeyPressed()==ord('q'):\n",
+ " break;\n",
+ " \n",
+ " bot.moveTo(q0)\n",
+ " bot.wait(C)\n",
+ " if bot.getKeyPressed()==ord('q'):\n",
+ " break;\n",
+ "\n",
+ "bot.home(C)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3776fd7a",
+ "metadata": {},
+ "source": [
+ "gripper movements also do not block:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9b62c7c5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bot.gripperMove(ry._left, width=.02)\n",
+ "\n",
+ "while not bot.gripperDone(ry._left):\n",
+ " bot.sync(C, .1)\n",
+ "\n",
+ "bot.gripperMove(ry._left, width=.075)\n",
+ "\n",
+ "while not bot.gripperDone(ry._left):\n",
+ " bot.sync(C, .1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2dfbfcea",
+ "metadata": {},
+ "source": [
+ "Always close the bot/sim properly:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2ea154ed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "del bot\n",
+ "del C"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac37869b",
+ "metadata": {},
+ "source": [
+ "As a side note, we can always check which global config parameters have been queried by the code so far. That gives an idea of which global parameters exist:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "24342be8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ry.params_print()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6c9473f1",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/source/notebooks/1c-komo.ipynb b/docs/source/notebooks/1c-komo.ipynb
new file mode 100644
index 0000000..15de1df
--- /dev/null
+++ b/docs/source/notebooks/1c-komo.ipynb
@@ -0,0 +1,736 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "dffc232a",
+ "metadata": {},
+ "source": [
+ "# KOMO: Motion Optimization\n",
+ "\n",
+ "KOMO is a framework for designing motion by formulating optimization problems. Inverse kinematics (IK) is the special case of optimizing only over a single configuration rather than a path. Formulating KOMO problems is key to realizing motion in `rai`.\n",
+ "\n",
+ "This tutorial shows basics on how IK, rough waypoint optimization, and fine path optimization can be formulated as non-linear mathematical program (NLP) using KOMO. Essentially, the `addObjective` allows to add costs or constraints over any `Feature` to the NLP (same features that can be evaluated with 'C.eval')."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a177972b",
+ "metadata": {},
+ "source": [
+ "## Minimal IK example"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "8e07bf36",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from robotic import ry\n",
+ "import numpy as np\n",
+ "import time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "059a8ee7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "C = ry.Config()\n",
+ "C.addFile(ry.raiPath('scenarios/pandaSingle.g'))\n",
+ "C.view()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "582b68ba",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "C.addFrame('box') \\\n",
+ " .setPosition([-.25,.1,1.]) \\\n",
+ " .setShape(ry.ST.ssBox, size=[.06,.06,.06,.005]) \\\n",
+ " .setColor([1,.5,0]) \\\n",
+ " .setContact(True)\n",
+ "C.view()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac059dc2",
+ "metadata": {},
+ "source": [
+ "The following defines an optimization problem over a single configuration. The KOMO object essentially contains (1) copies of the configuration(s) over which we optimize, and (2) the list of objectives (=costs & constraints) that define the optimization problem.\n",
+ "\n",
+ "The constructor declares over how many configurations (single, waypoints, path..) we optimize. The addObjective methods add costs or constraints:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "bccb7b55",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "qHome = C.getJointState()\n",
+ "komo = ry.KOMO(C, 1, 1, 0, False)\n",
+ "komo.addObjective(times=[], feature=ry.FS.jointState, frames=[], type=ry.OT.sos, scale=[1e-1], target=qHome);\n",
+ "komo.addObjective([], ry.FS.positionDiff, ['l_gripper', 'box'], ry.OT.eq, [1e1]);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "76895850",
+ "metadata": {},
+ "source": [
+ "We explain the KOMO constructor arguments later. (The above defines an IK problem.)\n",
+ "\n",
+ "The `addObjective` method has signature\n",
+ "* times: the time intervals (subset of configurations in a path) over which this feature is active (irrelevant for IK)\n",
+ "* feature: the feature symbol (see advanced `Feature` tutorial)\n",
+ "* frames: the frames for which the feature is computed, given as list of frame names\n",
+ "* type: whether this is a sum-of-squares (sos) cost, or eq or ineq constraint\n",
+ "* scale: the matrix(!) by which the feature is multiplied\n",
+ "* target: the offset which is substracted from the feature (before scaling)\n",
+ "\n",
+ "Please see more formal details "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9e27cfa8",
+ "metadata": {},
+ "source": [
+ "Given this definition of an optimization problem, we can call a generic NLP solver:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "178e3d42",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.000823, evals: 6, done: 1, feasible: 1, sos: 0.00414146, f: 0, ineq: 0, eq: 0.00188382 }\n",
+ "====nlp==== method:AugmentedLagrangian bounded: yes\n",
+ "==nlp== it:0 evals:0 mu:1 nu:1 muLB:0.1\n",
+ "----newton---- initial point f(x):16.0447 alpha:1 beta:1\n",
+ "--newton-- it: 1 |Delta|: 0.2 alpha: 1 evals: 2 f(y): 6.55808 ACCEPT\n",
+ "--newton-- it: 2 |Delta|: 0.2 alpha: 1 evals: 3 f(y): 0.686083 ACCEPT\n",
+ "--newton-- it: 3 |Delta|: 0.144223 alpha: 1 evals: 4 f(y): 0.0170221 ACCEPT\n",
+ "--newton-- it: 4 |Delta|: 0.0221449 alpha: 1 evals: 5 f(y): 0.00418093 ACCEPT\n",
+ "--newton-- stopping: 'absMax(Delta) 1\n"
+ ]
+ }
+ ],
+ "source": [
+ "q = komo.getPath()\n",
+ "print(type(q), len(q))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f92e896",
+ "metadata": {},
+ "source": [
+ "We're done with KOMO and can destroy it. Then set the optimal joint state in C and view it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "b20fc581",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "del komo #also closes komo view\n",
+ "C.setJointState(q[0])\n",
+ "C.view()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57ccf739",
+ "metadata": {},
+ "source": [
+ "## Example for more constraints: box grasping IK\n",
+ "\n",
+ "The key to design motions is to add clever constraints. Here is an example for more realistic box grasping:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "bdbbbe7b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "komo = ry.KOMO(C, 1,1,0, True)\n",
+ "komo.addObjective([], ry.FS.jointState, [], ry.OT.sos, [1e-1], qHome)\n",
+ "komo.addObjective([], ry.FS.accumulatedCollisions, [], ry.OT.eq)\n",
+ "komo.addObjective([], ry.FS.jointLimits, [], ry.OT.ineq)\n",
+ "komo.addObjective([], ry.FS.positionDiff, ['l_gripper', 'box'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([], ry.FS.scalarProductXX, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "komo.addObjective([], ry.FS.scalarProductXZ, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "komo.addObjective([], ry.FS.distance, ['l_palm', 'box'], ry.OT.ineq, [1e1])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de8fe5b5",
+ "metadata": {},
+ "source": [
+ "The two `scalarProduct` feature state that the gripper x-axis (which is the axis connecting the fingers) should be orthogonal to the object x- and z-axes. That implies fingers to normally oppose the object's y-planes.\n",
+ "\n",
+ "Note that grasping could also be opposing the object x- or z- planes -- see below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "dab4fbee",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.001353, evals: 4, done: 1, feasible: 1, sos: 0.00552548, f: 0, ineq: 0, eq: 0.00124449 }\n",
+ "-- Always check feasibility flag of NLP solver return\n"
+ ]
+ }
+ ],
+ "source": [
+ "ret = ry.NLP_Solver(komo.nlp(), verbose=0 ) .solve()\n",
+ "print(ret)\n",
+ "if ret.feasible:\n",
+ " print('-- Always check feasibility flag of NLP solver return')\n",
+ "else:\n",
+ " print('-- THIS IS INFEASIBLE!')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "f1970bb1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q = komo.getPath()\n",
+ "C.setJointState(q[0])\n",
+ "C.view(False, \"IK solution\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bef1a139",
+ "metadata": {},
+ "source": [
+ "Reusing the KOMO instance is ok if some aspect of the configuration changes and you want to resolve the same problem:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "a2d386d6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "box = C.getFrame('box')\n",
+ "box.setPosition([-.25,.1,1.])\n",
+ "p0 = box.getPosition()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "67ef81d4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.001635, evals: 4, done: 1, feasible: 1, sos: 0.00352417, f: 0, ineq: 0, eq: 0.00216173 }\n",
+ "{ time: 0.006638, evals: 10, done: 1, feasible: 1, sos: 0.0207398, f: 0, ineq: 0, eq: 0.00141503 }\n",
+ "{ time: 0.006179, evals: 10, done: 1, feasible: 1, sos: 0.00694048, f: 0, ineq: 0, eq: 0.00205847 }\n",
+ "{ time: 0.004424, evals: 8, done: 1, feasible: 1, sos: 0.0152197, f: 0, ineq: 0, eq: 0.000563407 }\n",
+ "{ time: 0.008229, evals: 9, done: 1, feasible: 1, sos: 0.0104266, f: 0, ineq: 0, eq: 0.00210566 }\n",
+ "{ time: 0.008263, evals: 11, done: 1, feasible: 1, sos: 0.0165911, f: 0, ineq: 0, eq: 0.00175033 }\n",
+ "{ time: 0.009852, evals: 13, done: 1, feasible: 1, sos: 0.019162, f: 0, ineq: 0, eq: 0.0395863 }\n",
+ "{ time: 0.005472, evals: 6, done: 1, feasible: 1, sos: 0.0100858, f: 0, ineq: 0, eq: 0.00146084 }\n",
+ "{ time: 0.00514, evals: 6, done: 1, feasible: 1, sos: 0.00327878, f: 0, ineq: 0, eq: 0.000313999 }\n",
+ "{ time: 0.007166, evals: 8, done: 1, feasible: 1, sos: 0.030142, f: 0, ineq: 0, eq: 0.00111338 }\n",
+ "{ time: 0.249048, evals: 722, done: 1, feasible: 1, sos: 0.0802649, f: 0, ineq: 0, eq: 0.102041 }\n",
+ "{ time: 0.051558, evals: 61, done: 1, feasible: 0, sos: 0.0779214, f: 0, ineq: 0, eq: 5.93279 }\n",
+ "{ time: 0.018069, evals: 30, done: 1, feasible: 1, sos: 0.0117585, f: 0, ineq: 0, eq: 0.000335161 }\n",
+ "{ time: 0.008438, evals: 14, done: 1, feasible: 1, sos: 0.0114653, f: 0, ineq: 0, eq: 0.000106237 }\n",
+ "{ time: 0.005415, evals: 8, done: 1, feasible: 1, sos: 0.0221542, f: 0, ineq: 0, eq: 0.000198337 }\n",
+ "{ time: 0.078182, evals: 94, done: 1, feasible: 1, sos: 0.0645244, f: 0, ineq: 0, eq: 0.116509 }\n",
+ "{ time: 0.017363, evals: 28, done: 1, feasible: 1, sos: 0.0795235, f: 0, ineq: 0, eq: 0.000762834 }\n",
+ "{ time: 0.127013, evals: 216, done: 1, feasible: 1, sos: 0.114508, f: 0, ineq: 0, eq: 0.481591 }\n",
+ "{ time: 0.021431, evals: 61, done: 1, feasible: 1, sos: 0.0178241, f: 0, ineq: 0, eq: 0.000106574 }\n",
+ "{ time: 0.018806, evals: 28, done: 1, feasible: 1, sos: 0.0130349, f: 0, ineq: 0, eq: 0.00024334 }\n"
+ ]
+ }
+ ],
+ "source": [
+ "for t in range(10):\n",
+ " box.setPosition(p0 + .2 * np.random.randn(3))\n",
+ " komo.updateRootObjects(C) #only works for root object (the 'box' is one)\n",
+ " ret = ry.NLP_Solver(komo.nlp(), verbose=0 ) .solve()\n",
+ " print(ret)\n",
+ " q = komo.getPath()\n",
+ " C.setJointState(q[0])\n",
+ " C.view(False, 'IK solution - ' + ('*** INFEASIBLE ***' if not ret.feasible else 'feasible'))\n",
+ " time.sleep(1.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0e78a35",
+ "metadata": {},
+ "source": [
+ "So the solver finds feasible grasps and exploits the null space of the constraints (grasps from different directions, but always opposing the y-planes).\n",
+ "\n",
+ "To make this proper, we should actually test all three possible grasps - so let's define 3 IK problems, solve each, and pick the best:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "8222658d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "del komo\n",
+ "komo = []\n",
+ "for k in range(3):\n",
+ " komo.append(ry.KOMO(C, 1,1,0, True))\n",
+ " komo[k].addObjective([], ry.FS.jointState, [], ry.OT.sos, [1e-1], qHome)\n",
+ " komo[k].addObjective([], ry.FS.accumulatedCollisions, [], ry.OT.eq)\n",
+ " komo[k].addObjective([], ry.FS.jointLimits, [], ry.OT.ineq)\n",
+ " komo[k].addObjective([], ry.FS.positionDiff, ['l_gripper', 'box'], ry.OT.eq, [1e1])\n",
+ " komo[k].addObjective([], ry.FS.distance, ['l_palm', 'box'], ry.OT.ineq, [1e1])\n",
+ "\n",
+ "komo[0].addObjective([], ry.FS.scalarProductXY, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "komo[0].addObjective([], ry.FS.scalarProductXZ, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "\n",
+ "komo[1].addObjective([], ry.FS.scalarProductXX, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "komo[1].addObjective([], ry.FS.scalarProductXZ, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "\n",
+ "komo[2].addObjective([], ry.FS.scalarProductXX, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])\n",
+ "komo[2].addObjective([], ry.FS.scalarProductXY, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "09c7a057",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for t in range(10):\n",
+ " box.setPosition(p0 + .2 * np.random.randn(3))\n",
+ " box.setQuaternion(np.random.randn(4)) #random orientation\n",
+ " \n",
+ " score = []\n",
+ " for k in range(3):\n",
+ " komo[k].updateRootObjects(C)\n",
+ " ret = ry.NLP_Solver(komo[k].nlp(), verbose=0 ) .solve()\n",
+ " score.append( 100.*(ret.eq+ret.ineq) + ret.sos )\n",
+ " \n",
+ " k = np.argmin(score)\n",
+ " C.setJointState(komo[k].getPath()[0])\n",
+ " C.view(False, f'IK solution {k} - ' + ('*** INFEASIBLE ***' if not ret.feasible else 'feasible'))\n",
+ " time.sleep(1.)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "cda905f5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "del komo\n",
+ "del C"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7d69b02",
+ "metadata": {},
+ "source": [
+ "## Waypoints example\n",
+ "\n",
+ "Motion design can often be done by computing waypoints, i.e. a none-fine-resolution sequence of poses. The BotOp interface can then spline-interpolate between them when executing them.\n",
+ "\n",
+ "Let's define a configuration where the desired gripper waypoints are pre-defined as marker frames. (That's a common pattern: Simplify defining constraints by adding helper reference frames in the configuration.)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "a6da9bda",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "C = ry.Config()\n",
+ "C.addFile(ry.raiPath('scenarios/pandaSingle.g'))\n",
+ "C.addFrame('way1'). setShape(ry.ST.marker, [.1]) .setPosition([.4, .2, 1.])\n",
+ "C.addFrame('way2'). setShape(ry.ST.marker, [.1]) .setPosition([.4, .2, 1.4])\n",
+ "C.addFrame('way3'). setShape(ry.ST.marker, [.1]) .setPosition([-.4, .2, 1.])\n",
+ "C.addFrame('way4'). setShape(ry.ST.marker, [.1]) .setPosition([-.4, .2, 1.4])\n",
+ "C.view()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "7c3a74d2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.003266, evals: 10, done: 1, feasible: 1, sos: 2.39494, f: 0, ineq: 0, eq: 0.000305648 }\n",
+ "[[-0.35382383 -0.05464486 -0.41770589 -2.0833263 -0.05951381 2.17630166\n",
+ " -0.49971152]\n",
+ " [-0.29434065 -0.3758991 -0.40467003 -1.73241762 -0.02310692 2.33740027\n",
+ " -0.49945799]\n",
+ " [ 0.44111823 -0.06340917 0.31723911 -2.1024485 0.12222711 2.20326576\n",
+ " -0.49926996]\n",
+ " [ 0.43343189 -0.36084256 0.2768184 -1.74048984 0.12188603 2.34753359\n",
+ " -0.49916996]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "komo = ry.KOMO(C, 4, 1, 1, False)\n",
+ "komo.addControlObjective([], 0, 1e-1)\n",
+ "komo.addControlObjective([], 1, 1e0)\n",
+ "komo.addObjective([1], ry.FS.positionDiff, ['l_gripper', 'way1'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([2], ry.FS.positionDiff, ['l_gripper', 'way2'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([3], ry.FS.positionDiff, ['l_gripper', 'way3'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([4], ry.FS.positionDiff, ['l_gripper', 'way4'], ry.OT.eq, [1e1])\n",
+ "\n",
+ "ret = ry.NLP_Solver(komo.nlp(), verbose=0 ) .solve()\n",
+ "print(ret)\n",
+ "q = komo.getPath()\n",
+ "print(q)\n",
+ "\n",
+ "for t in range(4):\n",
+ " C.setJointState(q[t])\n",
+ " C.view(False, f'waypoint {t}')\n",
+ " time.sleep(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6263d5c",
+ "metadata": {},
+ "source": [
+ "The `KOMO constructor` has arguments:\n",
+ "* config: the configuration, which is copied once (for IK) or many times (for waypoints/paths) to be the optimization variable\n",
+ "* phases: the number P of phases (which essentially defines the real-valued interval [0,P] over which objectives can be formulated)\n",
+ "* stepsPerPhase: the step discretizations per phase -> in total we have phases*stepsPerPhases configurations which form the path and over which we optimize\n",
+ "* k_order: the \"Markov-order\", i.e., maximal tuple of configurations over which we formulate features (e.g. take finite differences)\n",
+ "\n",
+ "In our waypoint case: We have 4 phases, one for each waypoint. We don't sub-sample the motion between waypoints, which is why we have stepsPerPhase=1. We formulate this as a 1-order problem: Some features take the finite difference between consecutive configurations (namely, to penalize velocities).\n",
+ "\n",
+ "The `addControlObjective` is /almost/ the same as adding a `FS.jointState` objective: It penalizes distances in joint space. It has three arguments:\n",
+ "* times: (as for `addObjective`) the phase-interval in which this objective holds; [] means all times\n",
+ "* order: Do we penalize the jointState directly (order=0: penalizing sqr distance to qHome, order=1: penalizing sqr distances between consecutive configurations (velocities), order=2: penalizing accelerations across 3 configurations)\n",
+ "* scale: as usual, but modulated by a factor \"sqrt(delta t)\" that somehow ensures total control costs in approximately independent of the choice of stepsPerPhase\n",
+ "\n",
+ "In our waypoint case: We add control costs for both: homing (order 0, ensuring to stay close to homing), and velocities (order 1, penalizing movement between waypoints)\n",
+ "\n",
+ "And the `addObjective` method now makes use of `times` argument: Specifying [1] means that this objective only holds in the interval [1,1], i.e. at phase-time 1 only."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "132f82a0",
+ "metadata": {},
+ "source": [
+ "## Path example\n",
+ "\n",
+ "Let's do almost the same, but for a fine path. First order=1, leading to zig-zag, then order=2, leading to smooth path."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "dd21ae9e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.017709, evals: 11, done: 1, feasible: 1, sos: 2.51987, f: 0, ineq: 0, eq: 0.00176075 }\n",
+ "size of path: (40, 7)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Note, the stepsPerPhase=10 is the only difference to above\n",
+ "C.setJointState(qHome)\n",
+ "komo = ry.KOMO(C, 4, 10, 1, False)\n",
+ "komo.addControlObjective([], 0, 1e-1) # what happens if you change weighting to 1e0? why?\n",
+ "komo.addControlObjective([], 1, 1e0)\n",
+ "komo.addObjective([1], ry.FS.positionDiff, ['l_gripper', 'way1'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([2], ry.FS.positionDiff, ['l_gripper', 'way2'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([3], ry.FS.positionDiff, ['l_gripper', 'way3'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([4], ry.FS.positionDiff, ['l_gripper', 'way4'], ry.OT.eq, [1e1])\n",
+ "\n",
+ "ret = ry.NLP_Solver(komo.nlp(), verbose=0 ) .solve()\n",
+ "print(ret)\n",
+ "q = komo.getPath()\n",
+ "print('size of path:', q.shape)\n",
+ "\n",
+ "for t in range(q.shape[0]):\n",
+ " C.setJointState(q[t])\n",
+ " C.view(False, f'waypoint {t}')\n",
+ " time.sleep(.1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "40341e34",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{ time: 0.042404, evals: 25, done: 1, feasible: 1, sos: 16.5162, f: 0, ineq: 0, eq: 0.000765251 }\n",
+ "size of path: (40, 7)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# only differences: the k_order=2, control objective order 2, constrain final jointState velocity to zero\n",
+ "C.setJointState(qHome)\n",
+ "komo = ry.KOMO(C, 4, 10, 2, False)\n",
+ "komo.addControlObjective([], 0, 1e-1) # what happens if you change weighting to 1e0? why?\n",
+ "komo.addControlObjective([], 2, 1e0)\n",
+ "komo.addObjective([1], ry.FS.positionDiff, ['l_gripper', 'way1'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([2], ry.FS.positionDiff, ['l_gripper', 'way2'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([3], ry.FS.positionDiff, ['l_gripper', 'way3'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([4], ry.FS.positionDiff, ['l_gripper', 'way4'], ry.OT.eq, [1e1])\n",
+ "komo.addObjective([4], ry.FS.jointState, [], ry.OT.eq, [1e1], [], order=1)\n",
+ "\n",
+ "ret = ry.NLP_Solver(komo.nlp(), verbose=0 ) .solve()\n",
+ "print(ret)\n",
+ "q = komo.getPath()\n",
+ "print('size of path:', q.shape)\n",
+ "\n",
+ "for t in range(q.shape[0]):\n",
+ " C.setJointState(q[t])\n",
+ " C.view(False, f'waypoint {t}')\n",
+ " time.sleep(.1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "154ea039",
+ "metadata": {},
+ "source": [
+ "Notice the new last objective! Without it, *final velocity* would not be zero. The last objective constrains the order=1 (i.e. velocity!) of the jointState feature to be zero.\n",
+ "\n",
+ "Let's plot the trajectory:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "3d47d887",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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Z5qLYyqHNwe5pWXpxYdcXxnySsvgLS6FycwaDiIiWj7mNYg0NTXhqaeewtatW5FKpfCnf/qnePjhh3H+/Hk4nUvrKqqpRALh8VGERkflemwM4fFRhDPrUYTGx2R/jRlGpUylKAa4CwrgKSyCt7AY7oIi5JX6kFtahpxSH2xO1wKdFRERkb4UIW7wqTmHhoaGUFRUhKamJuzYseOGxwcCAXi9Xvj9fng8njkrRzwSwVhvN2LhkFxCIcTDIURDQcTDIcRCwcz+WPr2TJN7XYvBaIQzNw/eomJ4C4vhKSyCp7AY3vTalZcPo4mtYkREtDzN5vN7QT8N/X4/ACAvL2/G++PxOOJTPvADgZlHg9yu7gtn8JOv/8WsH2c0m+HMyYMrNw/O3NzJ7ZxcONNrV24e7G4Ph8ISERHdhAULIpqm4Ytf/CLuu+8+rF+/fsZjnn32WXz1q1+d97LY3V648gtgd7pgdblgc7phc7lgc7lhc7pgc7lgdbrS2+7M2up0clZRIiKiObRgTTOf+9zn8Morr+Ctt95CeXn5jMfMVCNSUVEx500zRERENH8WXdPM5z//ebz88ss4dOjQNUMIAFitVlit1oUoEhERES0C8xpEhBD4/d//fbz00ks4ePAgampq5vPliIiIaImZ1yDy1FNP4d/+7d/w05/+FG63G/39/QAAr9cLu90+ny9NRERES8C89hG5VsfOf/qnf8KnP/3pGz5+vobvEhER0fxZNH1EFnCKEiIiIlqCONkFERER6YZBhIiIiHTDIEJERES6YRAhIiIi3TCIEBERkW4YRIiIiEg3DCJERESkGwYRIiIi0g2DCBEREemGQYSIiIh0wyBCREREumEQISIiIt0wiBAREZFuGESIiIhINwwiREREpBsGESIiItINgwgRERHphkGEiIiIdMMgQkRERLphECEiIiLdMIgQERGRbhhEiIiISDcMIkRERKQbBhEiIiLSDYMIERER6YZBhIiIiHTDIEJERES6YRAhIiIi3TCIEBERkW4YRIiIiEg3DCJERESkGwYRIiIi0g2DCBEREemGQYSIiIh0wyBCREREumEQISIiIt0wiBAREZFuGESIiIhINwwiREREpBsGESIiItINgwgRERHphkGEiIiIdMMgQkRERLphECEiIiLdMIgQERGRbhhEiIiISDcMIkRERKQbBhEiIiLSDYMI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AfCfxAz4Q1lgK+cHrpj0nXNpRQYRxWSA0b3855Kg+WWEFSVwogRleheFiGjJ4tSTREREpBsGESIiItINgwgRERHphkGEiIiIdMMgQkRERLphECEiIiLdMIgQERGRbhhEiIiISDcMIkRERKQbBhEiIiLSDYMIERER6YZBhIiIiHTDIEJERES6YRAhIiIi3TCIEBERkW4YRIiIiEg3DCJERESkGwYRIiIi0g2DCBEREemGQYSIiIh0wyBCREREumEQISIiIt0wiBAREZFuGESIiIhINwwiREREpBsGESIiItINgwgRERHpZt6CyF/+5V/i3nvvhcPhQE5Ozny9DBERES1h8xZEEokEPvnJT+Jzn/vcfL0EERERLXGm+Xrir371qwCA5557br5egoiIiJa4eQsityIejyMej2duBwIBHUtDRERE821RdVZ99tln4fV6M0tFRYXeRSIiIqJ5NKsg8vTTT0NRlOsuFy9evOXCPPPMM/D7/Zmlq6vrlp+LiIiIFr9ZNc380R/9ET796U9f95ja2tpbLozVaoXVar3lxxMREdHSMqsgUlhYiMLCwvkqCxEREa0w89ZZtbOzE6Ojo+js7ISqqjh16hQAYNWqVXC5XPP1skRERLSEzFsQ+fM//3P88z//c+b25s2bAQAHDhzArl275utliYiIaAlRhBBC70JcSyAQgNfrhd/vh8fj0bs4REREdBNm8/m9qIbvEhER0crCIEJERES6YRAhIiIi3TCIEBERkW4YRIiIiEg3DCJERESkGwYRIiIi0g2DCBEREemGQYSIiIh0wyBCREREumEQISIiIt0wiBAREZFuGESIiIhINwwiREREpBsGESIiItINgwgRERHphkGEiIiIdMMgQkRERLphECEiIiLdMIgQERGRbhhEiIiISDcMIkRERKQbBhEiIiLSDYMIERER6YZBhIiIiHTDIEJERES6YRAhIiIi3TCIEBERkW4YRIiIiEg3DCJERESkGwYRIiIi0g2DCBEREemGQYSIiIh0wyBCREREumEQISIiIt0wiBAREZFuGESIiIhINwwiREREpBsGESIiItINgwgRERHphkGEiIiIdMMgQkRERLphECEiIiLdMIgQERGRbhhEiIiISDcMIkRERKQbBhEiIiLSDYMIERER6YZBhIiIiHTDIEJERES6MeldACLSjxAC6ugokt3d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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.plot(q)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "08aacd1a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "del C"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c209e80b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/source/notebooks/botop1-motion.ipynb b/docs/source/notebooks/botop1-motion.ipynb
deleted file mode 100644
index af21910..0000000
--- a/docs/source/notebooks/botop1-motion.ipynb
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "e193f01d",
- "metadata": {},
- "source": [
- "# Interacting with a Sim/Real: Setting spline references\n",
- "* BotOp is a generic abstraction for interacting with a simulated or real robot\n",
- "* The BotOp class only has a few methods, which should be a clear bottleneck between user code and the robot\n",
- "* The move methods set/overwrite a spline reference for the robot. (Also compliance around the reference can be set.)\n",
- "* The gripper methods operate grippers\n",
- "* The getImage.. methods grap images or point clouds from the camera\n",
- "* The simulation can be run in many different modes: pure kinematic (no physics for objects), a physics simulator with physics for objects but still kinematic robot, a physic simulator with PD motors for the robot."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "31a434d3",
- "metadata": {},
- "outputs": [],
- "source": [
- "from robotic import ry\n",
- "import numpy as np\n",
- "import time"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "bb4031b4",
- "metadata": {},
- "outputs": [],
- "source": [
- "ry.params_add({'botsim/verbose': 1., 'physx/motorKp': 10000., 'physx/motorKd': 1000.})\n",
- "ry.params_print()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d1bff41b",
- "metadata": {},
- "outputs": [],
- "source": [
- "C = ry.Config()\n",
- "C.addFile(ry.raiPath('../rai-robotModels/scenarios/pandaSingle.g'))\n",
- "C.view(False, 'this is your workspace data structure C -- NOT THE SIMULTATION')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "6832eb10",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot = ry.BotOp(C, False)\n",
- "#note that in sim, arms are going down! free floating..."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ee98b4f8",
- "metadata": {},
- "outputs": [],
- "source": [
- "# we need to control it somehow, e.g. to home\n",
- "bot.home(C)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "afe800f7",
- "metadata": {},
- "outputs": [],
- "source": [
- "qHome = bot.get_q()\n",
- "q = bot.get_q()\n",
- "print(q)\n",
- "q[1] = q[1] - .1\n",
- "print(q)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "443856f3",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot.moveTo(q, 2)\n",
- "\n",
- "while bot.getTimeToEnd()>0:\n",
- " bot.sync(C, .1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "77bee28c",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot.home(C)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9b62c7c5",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot.gripperClose(ry._left)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1189fd71",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot.gripperOpen(ry._left)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "66c6a195",
- "metadata": {},
- "outputs": [],
- "source": [
- "bot.sync(C, .0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "2ea154ed",
- "metadata": {},
- "outputs": [],
- "source": [
- "del bot\n",
- "del C"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "24342be8",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/source/notebooks/core2-features.ipynb b/docs/source/notebooks/core2-features.ipynb
index 613db9e..e8edc5b 100644
--- a/docs/source/notebooks/core2-features.ipynb
+++ b/docs/source/notebooks/core2-features.ipynb
@@ -145,6 +145,116 @@
"help(ry.FS)"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " ## Selecting joints\n",
+ "\n",
+ "Often one would like to choose which joints are actually active, that is, which joints are referred to in q. This allows one to sub-select joints and work only with projections of the full configuration state. This changes the joint state dimensionality, including ordering of entries in q.\n",
+ "\n",
+ "The frame state is not affected by such a selection of active joints."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "C.selectJointsByTag([\"armL\",\"base\"])\n",
+ "q = C.getJointState()\n",
+ "print('joint state: ', q)\n",
+ "print('joint names: ', C.getJointNames() )"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Camera views (needs more testing)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can also add a frame, attached to the head, which has no shape associated to it, but create a view is associated with that frame:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "C.addFrame(name='camera', parent='head_tilt_link', args='Q: focalLength:.3')\n",
+ "V = C.cameraView()\n",
+ "IV = V.imageViewer()\n",
+ "V.addSensor(name='camera', frameAttached='camera', width=600, height=400)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "[image,depth] = V.computeImageAndDepth()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When we move the robot, that view moves with it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "C.setJointState(q=[0.5], joints=['head_pan_joint'])\n",
+ "V.updateConfig(C)\n",
+ "V.computeImageAndDepth()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To close a view (or destroy a handle to a computational module), we reassign it to zero. We can also remove a frame from the configuration."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IV = 0\n",
+ "V = 0\n",
+ "C.delFrame('camera')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "C=0"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
{
"cell_type": "markdown",
"metadata": {},
diff --git a/docs/source/notebooks/komo1-IK.ipynb b/docs/source/notebooks/komo1-IK.ipynb
deleted file mode 100644
index ba83cc8..0000000
--- a/docs/source/notebooks/komo1-IK.ipynb
+++ /dev/null
@@ -1,276 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "dffc232a",
- "metadata": {},
- "source": [
- "# Inverse Kinematics as Optimization\n",
- "* Illustrates how IK problems are formulated as non-linear mathematical program (NLP)\n",
- "* The 'KOMO' class is used to define the NLP, the 'addObjective' is the central method to add costs or constraints to the NLP.\n",
- "* Costs and constraints can be formulated over any feature (same features that can be evaluated with 'C.eval')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8e07bf36",
- "metadata": {},
- "outputs": [],
- "source": [
- "from robotic import ry"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "059a8ee7",
- "metadata": {},
- "outputs": [],
- "source": [
- "C = ry.Config()\n",
- "C.addFile(ry.raiPath('../rai-robotModels/scenarios/pandaSingle.g'))\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "582b68ba",
- "metadata": {},
- "outputs": [],
- "source": [
- "C.addFrame('box','table') \\\n",
- " .setRelativePosition([-.25,.1,.1]) \\\n",
- " .setShape(ry.ST.ssBox, size=[.1,.1,.1,.02]) \\\n",
- " .setColor([1,.5,0])\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ac059dc2",
- "metadata": {},
- "source": [
- "TODO: explain the setConfid. setTiming only roughly - more details next tutorial.\n",
- "insert pointer to script!\n",
- "explain more"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "bccb7b55",
- "metadata": {},
- "outputs": [],
- "source": [
- "komo = ry.KOMO()\n",
- "komo.setConfig(C, True)\n",
- "komo.setTiming(1., 1, 5., 0)\n",
- "komo.addControlObjective([], 0, 1e-0)\n",
- "komo.addObjective([], ry.FS.accumulatedCollisions, [], ry.OT.eq);\n",
- "komo.addObjective([], ry.FS.jointLimits, [], ry.OT.ineq);\n",
- "komo.addObjective([], ry.FS.positionDiff, ['l_gripper', 'box'], ry.OT.eq, [1e1]);"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "178e3d42",
- "metadata": {},
- "outputs": [],
- "source": [
- "ret = ry.NLP_Solver() \\\n",
- " .setProblem(komo.nlp()) \\\n",
- " .setOptions( stopTolerance=1e-2, verbose=4 ) \\\n",
- " .solve()\n",
- "print(ret)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b727e37c",
- "metadata": {},
- "outputs": [],
- "source": [
- "komo.view(False, \"IK solution\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "5adc15f8",
- "metadata": {},
- "outputs": [],
- "source": [
- "q = komo.getPath()\n",
- "print(type(q), len(q))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b20fc581",
- "metadata": {},
- "outputs": [],
- "source": [
- "C.setJointState(q[0])\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "4646820d",
- "metadata": {},
- "outputs": [],
- "source": [
- "del komo\n",
- "del C"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "57ccf739",
- "metadata": {},
- "source": [
- "## box grasping design"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b659c314",
- "metadata": {},
- "outputs": [],
- "source": [
- "from robotic import ry"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9d46fbf9",
- "metadata": {},
- "outputs": [],
- "source": [
- "C = ry.Config()\n",
- "C.addFile(ry.raiPath('../rai-robotModels/scenarios/pandaSingle.g'))\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9a33128b",
- "metadata": {},
- "outputs": [],
- "source": [
- "stick = C.addFrame('box','table') \\\n",
- " .setShape(ry.ST.capsule, size=[1.,.03]) \\\n",
- " .setColor([1,.5,0])\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ad7d7ef1",
- "metadata": {},
- "outputs": [],
- "source": [
- "#change pose here and re-optimize\n",
- "stick.setRelativePose('t(-.4 .2 1.3) d(-40 0 1 0)')\n",
- "C.view()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "bdbbbe7b",
- "metadata": {},
- "outputs": [],
- "source": [
- "komo = ry.KOMO()\n",
- "komo.setConfig(C, True)\n",
- "komo.setTiming(1., 1, 5., 0)\n",
- "komo.addControlObjective([], 0, 1e-0)\n",
- "komo.addObjective([], ry.FS.accumulatedCollisions, [], ry.OT.eq);\n",
- "komo.addObjective([], ry.FS.jointLimits, [], ry.OT.ineq);\n",
- "komo.addObjective([], ry.FS.positionRel, ['l_gripper', 'box'], ry.OT.eq, [[1e1, 0, 0],[0, 1e1, 0]]);\n",
- "komo.addObjective([], ry.FS.positionRel, ['l_gripper', 'box'], ry.OT.ineq, [[0, 0, -1e1]], [0,0,-.5]);\n",
- "komo.addObjective([], ry.FS.positionRel, ['l_gripper', 'box'], ry.OT.ineq, [[0, 0, 1e1]], [0,0,.5]);\n",
- "komo.addObjective([], ry.FS.scalarProductXZ, ['l_gripper', 'box'], ry.OT.eq, [1e1], [0]);\n",
- "komo.addObjective([], ry.FS.distance, ['l_palm', 'box'], ry.OT.ineq, [1e1]);"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "dab4fbee",
- "metadata": {},
- "outputs": [],
- "source": [
- "ret = ry.NLP_Solver() \\\n",
- " .setProblem(komo.nlp()) \\\n",
- " .setOptions( stopTolerance=1e-2, verbose=4 ) \\\n",
- " .solve()\n",
- "print(ret)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f1970bb1",
- "metadata": {},
- "outputs": [],
- "source": [
- "#komo.view(False, \"IK solution\")\n",
- "q = komo.getPath()\n",
- "C.setJointState(q[0])\n",
- "C.view(False, \"IK solution\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "cda905f5",
- "metadata": {},
- "outputs": [],
- "source": [
- "del komo\n",
- "del C"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "6b22268a",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/source/notebooks/notebooks.rst b/docs/source/notebooks/notebooks.rst
index 41c69c9..dac0f78 100644
--- a/docs/source/notebooks/notebooks.rst
+++ b/docs/source/notebooks/notebooks.rst
@@ -5,41 +5,25 @@ Tutorials
All tutorials are jupyter notebooks, downloadable from https://github.com/MarcToussaint/rai-python/tree/master/notebooks
(TODO: own github)
-
-Basics: Configurations, Features, etc
-=====================================
+1st Round: Basics on Configurations, BotOp & KOMO
+=================================================
.. toctree::
:glob:
:maxdepth: 1
- core*
+ 1*
-KOMO: Optimization Problems to design motion
-============================================
+More in depth
+=============
.. toctree::
:glob:
:maxdepth: 1
+ core*
komo*
-
-BotOp: Interface to Sim/Real
-============================
-
-.. toctree::
- :glob:
- :maxdepth: 1
-
botop*
-
-More
-====
-
-.. toctree::
- :glob:
- :maxdepth: 1
-
sim*
opt*
script5*