Mercurial > cortex
view org/test-creature.org @ 161:e401dafa5966
refactoring tested and works
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 03 Feb 2012 06:52:17 -0700 |
parents | 33278bf028e7 |
children | 2cbdd7034c6c |
line wrap: on
line source
1 #+title: First attempt at a creature!2 #+author: Robert McIntyre3 #+email: rlm@mit.edu4 #+description:5 #+keywords: simulation, jMonkeyEngine3, clojure6 #+SETUPFILE: ../../aurellem/org/setup.org7 #+INCLUDE: ../../aurellem/org/level-0.org12 * Intro13 So far, I've made the following senses --14 - Vision15 - Hearing16 - Touch17 - Proprioception19 And one effector:20 - Movement22 However, the code so far has only enabled these senses, but has not23 actually implemented them. For example, there is still a lot of work24 to be done for vision. I need to be able to create an /eyeball/ in25 simulation that can be moved around and see the world from different26 angles. I also need to determine weather to use log-polar or cartesian27 for the visual input, and I need to determine how/wether to28 disceritise the visual input.30 I also want to be able to visualize both the sensors and the31 effectors in pretty pictures. This semi-retarted creature will be my32 first attempt at bringing everything together.34 * The creature's body36 Still going to do an eve-like body in blender, but due to problems37 importing the joints, etc into jMonkeyEngine3, I'm going to do all38 the connecting here in clojure code, using the names of the individual39 components and trial and error. Later, I'll maybe make some sort of40 creature-building modifications to blender that support whatever41 discritized senses I'm going to make.43 #+name: body-144 #+begin_src clojure45 (ns cortex.silly46 "let's play!"47 {:author "Robert McIntyre"})49 ;; TODO remove this!50 (require 'cortex.import)51 (cortex.import/mega-import-jme3)52 (use '(cortex world util body hearing touch vision sense53 proprioception movement))55 (rlm.rlm-commands/help)56 (import java.awt.image.BufferedImage)57 (import javax.swing.JPanel)58 (import javax.swing.SwingUtilities)59 (import java.awt.Dimension)60 (import javax.swing.JFrame)61 (import java.awt.Dimension)62 (import com.aurellem.capture.RatchetTimer)64 (use 'clojure.contrib.def)66 (defn load-blender-model67 "Load a .blend file using an asset folder relative path."68 [^String model]69 (.loadModel70 (doto (asset-manager)71 (.registerLoader BlenderModelLoader (into-array String ["blend"])))72 model))74 (declare blender-creature)76 (defn blender-creature77 "Return a creature with all joints in place."78 [blender-path]79 (let [model (load-blender-model blender-path)80 joints (creature-joints model)]81 (assemble-creature model joints)))83 (def hand "Models/creature1/one.blend")85 (def worm "Models/creature1/try-again.blend")87 (defn worm-model [] (load-blender-model worm))89 (defn x-ray [#^ColorRGBA color]90 (doto (Material. (asset-manager)91 "Common/MatDefs/Misc/Unshaded.j3md")92 (.setColor "Color" color)93 (-> (.getAdditionalRenderState)94 (.setDepthTest false))))96 (defn colorful []97 (.getChild (worm-model) "worm-21"))99 (import jme3tools.converters.ImageToAwt)101 (import ij.ImagePlus)105 (defn test-eye []106 (.getChild107 (.getChild (worm-model) "eyes")108 "eye"))112 ;; lower level --- nodes113 ;; closest-node "parse/compile-x" -> makes organ, which is spatial, fn pair115 ;; higher level -- organs116 ;;118 ;; higher level --- sense/effector119 ;; these are the functions that provide world i/o, chinese-room style125 (defn gray-scale [num]126 (+ num127 (bit-shift-left num 8)128 (bit-shift-left num 16)))130 (defn debug-touch-window131 "creates function that offers a debug view of sensor data"132 []133 (let [vi (view-image)]134 (fn135 [[coords sensor-data]]136 (let [image (points->image coords)]137 (dorun138 (for [i (range (count coords))]139 (.setRGB image ((coords i) 0) ((coords i) 1)140 (gray-scale (sensor-data i)))))143 (vi image)))))145 (defn debug-vision-window146 "creates function that offers a debug view of sensor data"147 []148 (let [vi (view-image)]149 (fn150 [[coords sensor-data]]151 (let [image (points->image coords)]152 (dorun153 (for [i (range (count coords))]154 (.setRGB image ((coords i) 0) ((coords i) 1)155 (sensor-data i))))156 (vi image)))))158 (defn debug-hearing-window159 "view audio data"160 [height]161 (let [vi (view-image)]162 (fn [[coords sensor-data]]163 (let [image (BufferedImage. (count coords) height164 BufferedImage/TYPE_INT_RGB)]165 (dorun166 (for [x (range (count coords))]167 (dorun168 (for [y (range height)]169 (let [raw-sensor (sensor-data x)]170 (.setRGB image x y (gray-scale raw-sensor)))))))172 (vi image)))))174 (defn test-creature [thing]175 (let [x-axis176 (box 1 0.01 0.01 :physical? false :color ColorRGBA/Red)177 y-axis178 (box 0.01 1 0.01 :physical? false :color ColorRGBA/Green)179 z-axis180 (box 0.01 0.01 1 :physical? false :color ColorRGBA/Blue)181 creature (blender-creature thing)182 touch-nerves (touch creature)183 touch-debug-windows (map (fn [_] (debug-touch-window)) touch-nerves)184 [init-vision-fns vision-data] (vision creature)185 vision-debug (map (fn [_] (debug-vision-window)) vision-data)186 me (sphere 0.5 :color ColorRGBA/Blue :physical? false)187 [init-hearing-fns hearing-senses] (hearing creature)188 hearing-windows (map (fn [_] (debug-hearing-window 50))189 hearing-senses)190 bell (AudioNode. (asset-manager)191 "Sounds/pure.wav" false)192 prop (proprioception creature)193 prop-debug (proprioception-debug-window)195 muscle-fns (enable-muscles creature)196 ;; dream198 ]201 (apply202 world203 (with-movement204 (.getChild creature "worm-21")205 ["key-r" "key-t"206 "key-f" "key-g"207 "key-v" "key-b"]208 [10 10 10 10 1 1]209 [(nodify [creature210 (box 10 2 10 :position (Vector3f. 0 -9 0)211 :color ColorRGBA/Gray :mass 0)212 x-axis y-axis z-axis213 me214 ])215 (merge standard-debug-controls216 {"key-return"217 (fn [_ value]218 (if value219 (do220 (println-repl "play-sound")221 (.play bell))))222 "key-h"223 (fn [_ value]224 (if value225 (do226 (println-repl "muscle activating!")227 ((first muscle-fns) 199))))229 })230 (fn [world]231 (light-up-everything world)232 (enable-debug world)233 (dorun (map #(% world) init-vision-fns))234 (dorun (map #(% world) init-hearing-fns))236 (add-eye world237 (attach-eye creature (test-eye))238 (comp (view-image) BufferedImage!))240 (add-eye world (.getCamera world) no-op)241 ;;(set-gravity world (Vector3f. 0 0 0))242 ;;(com.aurellem.capture.Capture/captureVideo243 ;; world (file-str "/home/r/proj/ai-videos/hand"))244 ;;(.setTimer world (RatchetTimer. 60))245 (speed-up world)246 (set-gravity world (Vector3f. 0 0 0))247 )248 (fn [world tpf]249 ;;(dorun250 ;; (map #(%1 %2) touch-nerves (repeat (.getRootNode world))))252 (prop-debug (prop))254 (dorun255 (map #(%1 (%2 (.getRootNode world)))256 touch-debug-windows touch-nerves))258 (dorun259 (map #(%1 (%2))260 vision-debug vision-data))261 (dorun262 (map #(%1 (%2)) hearing-windows hearing-senses))265 ;;(println-repl (vision-data))266 (.setLocalTranslation me (.getLocation (.getCamera world)))269 )]270 ;;(let [timer (atom 0)]271 ;; (fn [_ _]272 ;; (swap! timer inc)273 ;; (if (= (rem @timer 60) 0)274 ;; (println-repl (float (/ @timer 60))))))275 ))))279 ;; the camera will stay in its initial position/rotation with relation280 ;; to the spatial.283 (defn follow-test284 "show a camera that stays in the same relative position to a blue cube."285 []286 (let [camera-pos (Vector3f. 0 30 0)287 rock (box 1 1 1 :color ColorRGBA/Blue288 :position (Vector3f. 0 10 0)289 :mass 30290 )291 rot (.getWorldRotation rock)293 table (box 3 1 10 :color ColorRGBA/Gray :mass 0294 :position (Vector3f. 0 -3 0))]296 (world297 (nodify [rock table])298 standard-debug-controls299 (fn [world]300 (let301 [cam (doto (.clone (.getCamera world))302 (.setLocation camera-pos)303 (.lookAt Vector3f/ZERO304 Vector3f/UNIT_X))]305 (bind-sense rock cam)307 (.setTimer world (RatchetTimer. 60))308 (add-eye world cam (comp (view-image) BufferedImage!))309 (add-eye world (.getCamera world) no-op))310 )311 (fn [_ _] (println-repl rot)))))315 #+end_src317 #+results: body-1318 : #'cortex.silly/follow-test321 * COMMENT purgatory322 #+begin_src clojure324 (defn bullet-trans* []325 (let [obj-a (box 1.5 0.5 0.5 :color ColorRGBA/Red326 :position (Vector3f. 5 0 0)327 :mass 90)328 obj-b (sphere 0.5 :color ColorRGBA/Blue329 :position (Vector3f. -5 0 0)330 :mass 0)331 control-a (.getControl obj-a RigidBodyControl)332 control-b (.getControl obj-b RigidBodyControl)333 move-up? (atom nil)334 move-down? (atom nil)335 move-left? (atom nil)336 move-right? (atom nil)337 roll-left? (atom nil)338 roll-right? (atom nil)339 force 100340 swivel341 (.toRotationMatrix342 (doto (Quaternion.)343 (.fromAngleAxis (/ Math/PI 2)344 Vector3f/UNIT_X)))345 x-move346 (doto (Matrix3f.)347 (.fromStartEndVectors Vector3f/UNIT_X348 (.normalize (Vector3f. 1 1 0))))350 timer (atom 0)]351 (doto352 (ConeJoint.353 control-a control-b354 (Vector3f. -8 0 0)355 (Vector3f. 2 0 0)356 ;;swivel swivel357 ;;Matrix3f/IDENTITY Matrix3f/IDENTITY358 x-move Matrix3f/IDENTITY359 )360 (.setCollisionBetweenLinkedBodys false)361 (.setLimit (* 1 (/ Math/PI 4)) ;; twist362 (* 1 (/ Math/PI 4)) ;; swing span in X-Y plane363 (* 0 (/ Math/PI 4)))) ;; swing span in Y-Z plane364 (world (nodify365 [obj-a obj-b])366 (merge standard-debug-controls367 {"key-r" (fn [_ pressed?] (reset! move-up? pressed?))368 "key-t" (fn [_ pressed?] (reset! move-down? pressed?))369 "key-f" (fn [_ pressed?] (reset! move-left? pressed?))370 "key-g" (fn [_ pressed?] (reset! move-right? pressed?))371 "key-v" (fn [_ pressed?] (reset! roll-left? pressed?))372 "key-b" (fn [_ pressed?] (reset! roll-right? pressed?))})374 (fn [world]375 (enable-debug world)376 (set-gravity world Vector3f/ZERO)377 )379 (fn [world _]381 (if @move-up?382 (.applyForce control-a383 (Vector3f. force 0 0)384 (Vector3f. 0 0 0)))385 (if @move-down?386 (.applyForce control-a387 (Vector3f. (- force) 0 0)388 (Vector3f. 0 0 0)))389 (if @move-left?390 (.applyForce control-a391 (Vector3f. 0 force 0)392 (Vector3f. 0 0 0)))393 (if @move-right?394 (.applyForce control-a395 (Vector3f. 0 (- force) 0)396 (Vector3f. 0 0 0)))398 (if @roll-left?399 (.applyForce control-a400 (Vector3f. 0 0 force)401 (Vector3f. 0 0 0)))402 (if @roll-right?403 (.applyForce control-a404 (Vector3f. 0 0 (- force))405 (Vector3f. 0 0 0)))407 (if (zero? (rem (swap! timer inc) 100))408 (.attachChild409 (.getRootNode world)410 (sphere 0.05 :color ColorRGBA/Yellow411 :physical? false :position412 (.getWorldTranslation obj-a)))))413 )414 ))416 (defn test-joint [joint]417 (let [[origin top bottom floor] (world-setup joint)418 control (.getControl top RigidBodyControl)419 move-up? (atom false)420 move-down? (atom false)421 move-left? (atom false)422 move-right? (atom false)423 roll-left? (atom false)424 roll-right? (atom false)425 timer (atom 0)]427 (world428 (nodify [top bottom floor origin])429 (merge standard-debug-controls430 {"key-r" (fn [_ pressed?] (reset! move-up? pressed?))431 "key-t" (fn [_ pressed?] (reset! move-down? pressed?))432 "key-f" (fn [_ pressed?] (reset! move-left? pressed?))433 "key-g" (fn [_ pressed?] (reset! move-right? pressed?))434 "key-v" (fn [_ pressed?] (reset! roll-left? pressed?))435 "key-b" (fn [_ pressed?] (reset! roll-right? pressed?))})437 (fn [world]438 (light-up-everything world)439 (enable-debug world)440 (set-gravity world (Vector3f. 0 0 0))441 )443 (fn [world _]444 (if (zero? (rem (swap! timer inc) 100))445 (do446 ;; (println-repl @timer)447 (.attachChild (.getRootNode world)448 (sphere 0.05 :color ColorRGBA/Yellow449 :position (.getWorldTranslation top)450 :physical? false))451 (.attachChild (.getRootNode world)452 (sphere 0.05 :color ColorRGBA/LightGray453 :position (.getWorldTranslation bottom)454 :physical? false))))456 (if @move-up?457 (.applyTorque control458 (.mult (.getPhysicsRotation control)459 (Vector3f. 0 0 10))))460 (if @move-down?461 (.applyTorque control462 (.mult (.getPhysicsRotation control)463 (Vector3f. 0 0 -10))))464 (if @move-left?465 (.applyTorque control466 (.mult (.getPhysicsRotation control)467 (Vector3f. 0 10 0))))468 (if @move-right?469 (.applyTorque control470 (.mult (.getPhysicsRotation control)471 (Vector3f. 0 -10 0))))472 (if @roll-left?473 (.applyTorque control474 (.mult (.getPhysicsRotation control)475 (Vector3f. -1 0 0))))476 (if @roll-right?477 (.applyTorque control478 (.mult (.getPhysicsRotation control)479 (Vector3f. 1 0 0))))))))480 #+end_src483 * COMMENT generate source484 #+begin_src clojure :tangle ../src/cortex/silly.clj485 <<body-1>>486 #+end_src