diff --git a/Project.toml b/Project.toml index 71e5d96b8..b4869706f 100644 --- a/Project.toml +++ b/Project.toml @@ -78,9 +78,9 @@ ZMQ = "1" julia = "1.2, 1.3, 1.4, 1.5" [extras] -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -RobotOS = "22415677-39a4-5241-a37a-00beabbbdae8" PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" +RobotOS = "22415677-39a4-5241-a37a-00beabbbdae8" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test"] +test = ["Test", "PyCall", "RobotOS"] diff --git a/examples/learning/hybrid/NeuralPose2Pose2/FluxModelsPose2Pose2.jl b/examples/learning/hybrid/NeuralPose2Pose2/FluxModelsPose2Pose2.jl new file mode 100644 index 000000000..065ea8c51 --- /dev/null +++ b/examples/learning/hybrid/NeuralPose2Pose2/FluxModelsPose2Pose2.jl @@ -0,0 +1,136 @@ +# FluxModelsPose2Pose2 + +using Random, Statistics +using DistributedFactorGraphs, TransformUtils +@everywhere using Random, Statistics +@everywhere using DistributedFactorGraphs, TransformUtils + +using Flux +@everywhere using Flux + + +@everywhere begin +import Base: convert +import IncrementalInference: getSample + +struct FluxModelsPose2Pose2{P,D<:AbstractArray,M<:SamplableBelief} <: FunctorPairwise + predictFnc::P + joyVelData::D + naiveModel::M + naiveFrac::Float64 + Zij::Pose2Pose2 + specialSampler::Function # special keyword field name used to invoke 'specialSampler' logic +end + + +function sampleNeuralPose2(nfb::FluxModelsPose2Pose2, + N::Int, + fmd::FactorMetadata, + Xi::DFGVariable, + Xj::DFGVariable)::Tuple + # + + # calculate naive model and Predictive fraction of samples, respectively + Nn = round(Int, nfb.naiveFrac*N) + # calculate desired number of predicted values + Np = N - Nn + len = size(nfb.joyVelData,1) # expect this to be only 25 at developmenttime, likely to change + + # model samples (all for theta at this time) + smpls_mAll = rand(nfb.naiveModel, N) + + # sample predictive fraction + iT, jT = getTimestamp(Xi), getTimestamp(Xj) + iPts, jPts = (getKDE(Xi) |> getPoints), (getKDE(Xj) |> getPoints) + @assert size(jPts,2) == size(iPts,2) "sampleNeuralPose2 can currently only evaluate equal population size variables" + + # calculate an average velocity component + DT = jT - iT + DXY = (@view jPts[1:2,:]) - (@view jPts[1:2,:]) + # rotate delta position from world to local iX frame + for i in 1:size(iPts,2) + DXY[1:2,i] .= TransformUtils.R(iPts[3,i])'*DXY[1:2,i] + end + # replace delta (velocity) values for this sampling + mVXY = Statistics.mean(DXY, dims=2) + # divide time to get velocity + mVXY ./= 1e-3*DT.value + mVXY[1] = isnan(mVXY[1]) ? 0.0 : mVXY[1] + mVXY[2] = isnan(mVXY[2]) ? 0.0 : mVXY[2] + + for i in 1:len + nfb.joyVelData[i,3:4] = mVXY + end + # and predict + # A = [rand(4) for i in 1:25] + smpls_pAll = nfb.predictFnc(nfb.joyVelData) + if size(smpls_pAll,2) == 2 + smpls_pAll = hcat(smpls_pAll, zeros(size(smpls_pAll,1))) + end + + # number of predictors to choose from, and choose random subset + Npreds = size(smpls_pAll,1) + allPreds = 1:Npreds |> collect + # randomly select particles for prediction (with possible duplicates forwhen Np > size(iPts,2)) + Npp = Np < Npreds ? Np : Npreds + Nnn = N - Npp + selPreds = @view shuffle!(allPreds)[1:Npp] # TODO better in-place + smpls_p = smpls_pAll[selPreds,:] # sample per row?? + smpls_p[:,3] .= smpls_mAll[3,Nnn+1:N] # use naive delta theta at this time + + # naive fraction + smpls_n = @view smpls_mAll[:, 1:Nnn] # sample per column + # join and shuffle predicted odo values + shfSmpl = shuffle!(1:N |> collect) + smpls = hcat(smpls_n, smpls_p')[:,shfSmpl] + + # @show Statistics.mean(smpls, dims=2) + # @show maximum(smpls, dims=2) + # @show minimum(smpls, dims=2) + + return (smpls, ) +end + +# Convenience function to help call the right constuctor +FluxModelsPose2Pose2(nn::P, + jvd::D, + md::M, + naiveFrac::Float64=0.4, + ss::Function=sampleNeuralPose2) where {P, M <: SamplableBelief, D <: AbstractMatrix} = FluxModelsPose2Pose2{P,D,M}(nn,jvd,md,naiveFrac,Pose2Pose2(MvNormal(zeros(3),diagm(ones(3)))),ss ) +# + + +function (nfb::FluxModelsPose2Pose2)( + res::AbstractArray{<:Real}, + userdata::FactorMetadata, + idx::Int, + meas::Tuple{AbstractArray{<:Real},}, + Xi::AbstractArray{<:Real,2}, + Xj::AbstractArray{<:Real,2} ) + # + nfb.Zij(res,userdata,idx,meas,Xi,Xj) + nothing +end + + + +## packing converters + +struct PackedFluxModelsPose2Pose2 <: IncrementalInference.PackedInferenceType + joyVelData::Matrix{Float64} + naiveModel::String + naiveFrac::Float64 +end + + +function convert(::Type{FluxModelsPose2Pose2}, d::PackedFluxModelsPose2Pose2) + FluxModelsPose2Pose2(PyTFOdoPredictorPoint2,d.joyVelData,extractdistribution(d.naiveModel),d.naiveFrac) +end + +function convert(::Type{PackedFluxModelsPose2Pose2}, d::FluxModelsPose2Pose2) + PackedFluxModelsPose2Pose2(d.joyVelData, string(d.naiveModel), d.naiveFrac) +end + +end # everywhere + +# diff --git a/examples/wheeled/racecar/NeuralPose2Pose2/PyNeuralPose2Pose2.jl b/examples/learning/hybrid/NeuralPose2Pose2/PyNeuralPose2Pose2.jl similarity index 100% rename from examples/wheeled/racecar/NeuralPose2Pose2/PyNeuralPose2Pose2.jl rename to examples/learning/hybrid/NeuralPose2Pose2/PyNeuralPose2Pose2.jl diff --git a/examples/marine/auv/Sandshark/LCM_SLAM_client.jl b/examples/marine/auv/Sandshark/LCM_SLAM_client.jl index 8130c58e2..cce86080b 100644 --- a/examples/marine/auv/Sandshark/LCM_SLAM_client.jl +++ b/examples/marine/auv/Sandshark/LCM_SLAM_client.jl @@ -127,7 +127,7 @@ function main(;parsed_args=parse_commandline(), # mkpath(getLogPath(fg)) open(joinLogPath(fg, "dash.csv"), "w") do io while recordWTDSH[1] - line = [now() getLastPoses(fg,filterLabel=r"x\d",number=1)[1] dashboard[:poseStride] dashboard[:solveSettings].canTakePoses dashboard[:solveSettings].solveInProgress dashboard[:realTimeSlack].value length(dashboard[:solveSettings].poseSolveToken.data)] + line = [now() getLastPoses(fg,filterLabel=r"x\d",number=1)[1] dashboard[:poseStride] Int(isready(dashboard[:solveSettings].canTakePoses)) dashboard[:solveSettings].solveInProgress dashboard[:realTimeSlack].value length(dashboard[:solveSettings].poseSolveToken.data)] # push!(WTDSH, (line...)) writedlm(io, line, ',') sleep(0.005) @@ -153,7 +153,7 @@ function main(;parsed_args=parse_commandline(), # run handler - dashboard[:solveSettings].canTakePoses = HSMHandling + # dashboard[:solveSettings].canTakePoses = HSMHandling holdTimeRTS = now() offsetT = now() - startT dashboard[:doDelay] = lcm isa LCMLog @@ -166,7 +166,8 @@ function main(;parsed_args=parse_commandline(), while 1 < length(dashboard[:solveSettings].poseSolveToken.data) # !HSMCanContinue(dashboard) # while dashboard[:canTakePoses] == HSMBlocking && dashboard[:solveInProgress] == SSMSolving flush(DRTLog) - @info "delay for solver, canTakePoses=$(dashboard[:solveSettings].canTakePoses), tokens=$(dashboard[:solveSettings].poseSolveToken.data), RTS=$(dashboard[:realTimeSlack])" + @info "delay for solver, tokens=$(dashboard[:solveSettings].poseSolveToken.data), RTS=$(dashboard[:realTimeSlack])" + # , canTakePoses=$(dashboard[:solveSettings].canTakePoses) # map(x->flush(x.stream), [DRTLog;LBLLog;Odolog;dirodolog;rawodolog;allthtlog;posetiminglog,solvetiminglog]) sleep(0.2) end diff --git a/examples/marine/auv/Sandshark/MsgHandlers.jl b/examples/marine/auv/Sandshark/MsgHandlers.jl index d5750352f..e039f2882 100644 --- a/examples/marine/auv/Sandshark/MsgHandlers.jl +++ b/examples/marine/auv/Sandshark/MsgHandlers.jl @@ -209,11 +209,11 @@ function pose_hdlr(channel::String, if dashboard[:doDelay] && 10 <= dashboard[:poseStride] # how far to escalate -- :canTakePoses is de-escalated by solver in manageSolveTree() - if dashboard[:solveSettings].canTakePoses == HSMHandling - dashboard[:solveSettings].canTakePoses = HSMOverlapHandling - elseif dashboard[:solveSettings].canTakePoses == HSMOverlapHandling - dashboard[:solveSettings].canTakePoses = HSMBlocking - end + # if dashboard[:solveSettings].canTakePoses == HSMHandling + # dashboard[:solveSettings].canTakePoses = HSMOverlapHandling + # elseif dashboard[:solveSettings].canTakePoses == HSMOverlapHandling + # dashboard[:solveSettings].canTakePoses = HSMBlocking + # end @info "new solve token $nPose" put!(dashboard[:solveSettings].poseSolveToken, nPose) dashboard[:poseStride] = 0 diff --git a/examples/wheeled/racecar/LoadPyNNTxt.jl b/examples/wheeled/racecar/LoadPyNNTxt.jl new file mode 100644 index 000000000..041165265 --- /dev/null +++ b/examples/wheeled/racecar/LoadPyNNTxt.jl @@ -0,0 +1,58 @@ + +using DelimitedFiles +using Flux +@everywhere using Flux + +# load a specialized model format +function loadPyNNTxt(dest::AbstractString) + mw = Vector{Array{Float32}}() + @show files = readdir(dest) + for f in files + push!(mw, readdlm(joinpath(dest,f))) + end + return mw +end + + +## Utility functions to take values from tf + + +function buildPyNNModel_01_FromElements(W1::AbstractMatrix{<:Real}=zeros(4,8), + b1::AbstractVector{<:Real}=zeros(8), + W2::AbstractMatrix{<:Real}=zeros(8,48), + b2::AbstractVector{<:Real}=zeros(8), + W3::AbstractMatrix{<:Real}=zeros(2,8), + b3::AbstractVector{<:Real}=zeros(2)) + # + # W1 = randn(Float32, 4,8) + # b1 = randn(Float32,8) + modjl = Chain( + x -> (x*W1)' .+ b1 .|> relu, + x -> reshape(x', 25,8,1), + x -> maxpool(x, PoolDims(x, 4)), + # x -> reshape(x[:,:,1]',1,:), + x -> reshape(x[:,:,1]',:), + Dense(48,8,relu), + Dense(8,2) + ) + + modjl[5].W .= W2 + modjl[5].b .= b2 + + modjl[6].W .= W3 + modjl[6].b .= b3 + + return modjl +end + +# As loaded from tensorflow get_weights +# Super specialized function +function buildPyNNModel_01_FromWeights(pywe) + buildPyNNModel_01_FromElements(pywe[1], pywe[2][:], pywe[3]', pywe[4][:], pywe[5]', pywe[6][:]) +end + +# convenience function to load specific model format from tensorflow +function loadTfModelIntoFlux(dest::AbstractString) + weights = loadPyNNTxt(dest::AbstractString) + buildPyNNModel_01_FromWeights(weights) +end diff --git a/examples/wheeled/racecar/Manifest.toml b/examples/wheeled/racecar/Manifest.toml index 36ac558bc..602fcf6a7 100644 --- a/examples/wheeled/racecar/Manifest.toml +++ b/examples/wheeled/racecar/Manifest.toml @@ -6,6 +6,18 @@ git-tree-sha1 = "051c95d6836228d120f5f4b984dd5aba1624f716" uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" version = "0.5.0" +[[AbstractTrees]] +deps = ["Markdown"] +git-tree-sha1 = "33e450545eaf7699da1a6e755f9ea65f14077a45" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.3.3" + +[[Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "c88cfc7f9c1f9f8633cddf0b56e86302b70f64c5" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "1.0.1" + [[ApproxManifoldProducts]] deps = ["Base64", "Compat", "CoordinateTransformations", "Dates", "DocStringExtensions", "KernelDensityEstimate", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "NLsolve", "Optim", "Pkg", "Random", "Reexport", "Requires", "Sockets", "SparseArrays", "StaticArrays", "Statistics", "Test", "TransformUtils", "UUIDs", "Unicode"] git-tree-sha1 = "a5fa7a264ff9c117fe529365cca5b395e9608901" @@ -13,10 +25,10 @@ uuid = "9bbbb610-88a1-53cd-9763-118ce10c1f89" version = "0.1.2" [[AprilTags]] -deps = ["Colors", "Dates", "FixedPointNumbers", "ImageDraw", "Libdl", "LinearAlgebra", "Pkg", "Test"] -git-tree-sha1 = "b914246a671af0f8595cc76b8db2e46c5a4fb79c" +deps = ["Colors", "FixedPointNumbers", "ImageDraw", "Libdl", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "1b9a857f517c30146e2f203b3db3323df0ce4218" uuid = "f0fec3d5-a81e-5a6a-8c28-d2b34f3659de" -version = "0.7.1" +version = "0.7.2" [[ArgParse]] deps = ["Logging", "TextWrap"] @@ -44,21 +56,15 @@ version = "3.5.0+3" [[ArrayInterface]] deps = ["LinearAlgebra", "Requires", "SparseArrays"] -git-tree-sha1 = "b34d74dc877e6083c4c5c553a685e89e10ea4662" +git-tree-sha1 = "5f34aee5e5dbc1ce5cfb137d63f719a64d98ae82" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "2.8.3" +version = "2.8.5" [[ArrayLayouts]] deps = ["FillArrays", "LinearAlgebra"] -git-tree-sha1 = "f8904599065b57f51715faf6278126f853aef6fc" +git-tree-sha1 = "bc779df8d73be70e4e05a63727d3a4dfb4c52b1f" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "0.2.4" - -[[ArraysOfArrays]] -deps = ["Requires", "Statistics", "UnsafeArrays"] -git-tree-sha1 = "403ff8c8f5224d552b8dcb7297611c774978b0a5" -uuid = "65a8f2f4-9b39-5baf-92e2-a9cc46fdf018" -version = "0.4.4" +version = "0.1.5" [[AxisAlgorithms]] deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] @@ -68,9 +74,9 @@ version = "1.0.0" [[AxisArrays]] deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "d63ba0315a1d287c9467e61e932578f2fdd048e0" +git-tree-sha1 = "4781a1dc368d9f1630281ed4a4240a0f34a420de" uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.3.3" +version = "0.4.0" [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -87,17 +93,40 @@ git-tree-sha1 = "3663bfffede2ef41358b6fc2e1d8a6d50b3c3904" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" version = "1.0.6+2" +[[CEnum]] +git-tree-sha1 = "62847acab40e6855a9b5905ccb99c2b5cf6b3ebb" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.2.0" + +[[CUDAapi]] +deps = ["Libdl", "Logging"] +git-tree-sha1 = "831b825d10104bd29e28f6da93312a976830717b" +uuid = "3895d2a7-ec45-59b8-82bb-cfc6a382f9b3" +version = "4.0.0" + +[[CUDAdrv]] +deps = ["CEnum", "CUDAapi", "Printf"] +git-tree-sha1 = "e650cbaee92b60433313157926b1e80d0c3a0e2e" +uuid = "c5f51814-7f29-56b8-a69c-e4d8f6be1fde" +version = "6.2.2" + +[[CUDAnative]] +deps = ["Adapt", "BinaryProvider", "CEnum", "CUDAapi", "CUDAdrv", "Cthulhu", "DataStructures", "ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Pkg", "Printf", "TimerOutputs"] +git-tree-sha1 = "0da071ed49a6f5f62d5164de071daa07cedaa1e6" +uuid = "be33ccc6-a3ff-5ff2-a52e-74243cff1e17" +version = "3.0.4" + [[Caesar]] -deps = ["ApproxManifoldProducts", "CloudGraphs", "Combinatorics", "CoordinateTransformations", "DataStructures", "Dates", "DelimitedFiles", "Distributed", "DistributedFactorGraphs", "Distributions", "DocStringExtensions", "FFTW", "FileIO", "Graphs", "ImageCore", "ImageMagick", "IncrementalInference", "JLD2", "JSON", "JSON2", "KernelDensityEstimate", "LinearAlgebra", "Mongoc", "NLsolve", "Neo4j", "Pkg", "ProgressMeter", "Reexport", "RoME", "Rotations", "Statistics", "Test", "TransformUtils", "UUIDs", "Unmarshal", "YAML", "ZMQ"] +deps = ["ApproxManifoldProducts", "CloudGraphs", "Combinatorics", "CoordinateTransformations", "DataStructures", "Dates", "DelimitedFiles", "Distributed", "DistributedFactorGraphs", "Distributions", "DocStringExtensions", "FFTW", "FileIO", "Graphs", "ImageCore", "ImageMagick", "IncrementalInference", "JLD2", "JSON", "JSON2", "KernelDensityEstimate", "LinearAlgebra", "Mongoc", "NLsolve", "Neo4j", "Pkg", "ProgressMeter", "Reexport", "Requires", "RoME", "Rotations", "Statistics", "Test", "TransformUtils", "UUIDs", "Unmarshal", "YAML", "ZMQ"] path = "/home/singhk/.julia/dev/Caesar" uuid = "62eebf14-49bc-5f46-9df9-f7b7ef379406" version = "0.5.1" [[Cairo]] deps = ["Cairo_jll", "Colors", "Fontconfig_jll", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] -git-tree-sha1 = "639345ddd8d7f52bbca32a847d74a5a497c4e4bc" +git-tree-sha1 = "f9db9e9814f71799e1b9c849055f0adae8bdc158" uuid = "159f3aea-2a34-519c-b102-8c37f9878175" -version = "1.0.2" +version = "1.0.3" [[Cairo_jll]] deps = ["Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "X11_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] @@ -125,9 +154,9 @@ version = "0.1.2" [[CodeTracking]] deps = ["InteractiveUtils", "UUIDs"] -git-tree-sha1 = "0becdab7e6fbbcb7b88d8de5b72e5bb2f28239f3" +git-tree-sha1 = "c8f94de86731698373f3c82a8aa40d8ab765c50c" uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" -version = "0.5.8" +version = "0.5.9" [[CodecZlib]] deps = ["BinaryProvider", "Libdl", "TranscodingStreams"] @@ -142,22 +171,22 @@ uuid = "19ecbf4d-ef7c-5e4b-b54a-0a0ff23c5aed" version = "0.5.0" [[ColorTypes]] -deps = ["FixedPointNumbers", "Random", "Test"] -git-tree-sha1 = "f73b0e10f2a5756de7019818a41654686da06b09" +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "f746d4fc892fdf683b5c22064c8e99b2f5b990e7" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.7.5" +version = "0.10.2" [[ColorVectorSpace]] deps = ["ColorTypes", "Colors", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "StatsBase"] -git-tree-sha1 = "459894c2b9f1ffab7e31792b689aeb5e25786d5c" +git-tree-sha1 = "bd0c0c81a39923bc03f9c3b61d89ad816e741002" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.7.1" +version = "0.8.5" [[Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "InteractiveUtils", "Printf", "Reexport", "Test"] -git-tree-sha1 = "9f0a0210450acb91c730b730a994f8eef1d3d543" +deps = ["ColorTypes", "FixedPointNumbers", "InteractiveUtils", "Reexport"] +git-tree-sha1 = "2fdeb981ebcf52cd800ddb6a0aa5eac34153552d" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.9.5" +version = "0.12.0" [[Combinatorics]] deps = ["Polynomials"] @@ -223,6 +252,18 @@ git-tree-sha1 = "cb7a62895da739fe5bb43f1a26d4292baf4b3dc0" uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" version = "4.0.1" +[[Cthulhu]] +deps = ["CodeTracking", "InteractiveUtils", "REPL", "Unicode"] +git-tree-sha1 = "a4849ec61df9659423cc63b298ed895904ee9743" +uuid = "f68482b8-f384-11e8-15f7-abe071a5a75f" +version = "1.0.2" + +[[CuArrays]] +deps = ["AbstractFFTs", "Adapt", "CEnum", "CUDAapi", "CUDAdrv", "CUDAnative", "DataStructures", "GPUArrays", "Libdl", "LinearAlgebra", "MacroTools", "NNlib", "Pkg", "Printf", "Random", "Reexport", "Requires", "SparseArrays", "Statistics", "TimerOutputs"] +git-tree-sha1 = "e8c55b38dcca955f5aed8ec4479cdc95810db1e1" +uuid = "3a865a2d-5b23-5a0f-bc46-62713ec82fae" +version = "2.0.1" + [[CustomUnitRanges]] git-tree-sha1 = "0d42a23be3acfb3c58569b28ed3ab8bd67af5ced" uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" @@ -247,9 +288,9 @@ version = "2.0.0" [[DataStructures]] deps = ["InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "73eb18320fe3ba58790c8b8f6f89420f0a622773" +git-tree-sha1 = "4dead20a1606a60292529023d6eac18a1ef6432e" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.17.11" +version = "0.17.12" [[DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -270,12 +311,6 @@ version = "0.6.4" deps = ["Mmap"] uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" -[[Dictionaries]] -deps = ["Indexing", "Random"] -git-tree-sha1 = "a09aff60a525650db2575907411734c4cceabd93" -uuid = "85a47980-9c8c-11e8-2b9f-f7ca1fa99fb4" -version = "0.2.1" - [[DiffResults]] deps = ["StaticArrays"] git-tree-sha1 = "da24935df8e0c6cf28de340b958f6aac88eaa0cc" @@ -300,9 +335,9 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" [[DistributedFactorGraphs]] deps = ["Base64", "Colors", "Dates", "Distributions", "DocStringExtensions", "Graphs", "JSON", "JSON2", "LightGraphs", "LinearAlgebra", "Neo4j", "Reexport", "Requires", "SparseArrays", "UUIDs", "Unmarshal"] -git-tree-sha1 = "15d7acfc646049d0fa7283888463fd6d744b58a5" +git-tree-sha1 = "946bff11707288d9bdf6e02aeabdd7346d4fd020" uuid = "b5cc3c7e-6572-11e9-2517-99fb8daf2f04" -version = "0.7.2" +version = "0.7.4" [[Distributions]] deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"] @@ -318,9 +353,9 @@ version = "0.8.1" [[Documenter]] deps = ["Base64", "Dates", "DocStringExtensions", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] -git-tree-sha1 = "646ebc3db49889ffeb4c36f89e5d82c6a26295ff" +git-tree-sha1 = "bc99c157ff2957c058a1067061d16c2c83d1ec42" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "0.24.7" +version = "0.24.9" [[ElasticArrays]] git-tree-sha1 = "6643de157ea3332d73e35a6a6ed2bdffe7792b12" @@ -338,18 +373,17 @@ git-tree-sha1 = "65dad386e877850e6fce4fc77f60fe75a468ce9d" uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" version = "0.4.0" -[[EmpiricalDistributions]] -deps = ["ArraysOfArrays", "Distributions", "LinearAlgebra", "Random", "Statistics", "StatsBase"] -git-tree-sha1 = "5815a98c8828ffbdfc659a6f613e0a480de1c0e3" -uuid = "0bbb1fad-0f24-45fe-94a4-415852c5cc3b" -version = "0.1.3" - [[Expat_jll]] deps = ["Libdl", "Pkg"] git-tree-sha1 = "9cdd4b1523086c9d93604599e3a389e8941e52b0" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" version = "2.2.7+1" +[[ExprTools]] +git-tree-sha1 = "6f0517056812fd6aa3af23d4b70d5325a2ae4e95" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.1" + [[FFTViews]] deps = ["CustomUnitRanges", "FFTW"] git-tree-sha1 = "70a0cfd9b1c86b0209e38fbfe6d8231fd606eeaf" @@ -396,10 +430,15 @@ uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" version = "2.3.0" [[FixedPointNumbers]] -deps = ["Test"] -git-tree-sha1 = "b8045033701c3b10bf2324d7203404be7aef88ba" +git-tree-sha1 = "3ba9ea634d4c8b289d590403b4a06f8e227a6238" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.5.3" +version = "0.8.0" + +[[Flux]] +deps = ["AbstractTrees", "Adapt", "CodecZlib", "Colors", "CuArrays", "DelimitedFiles", "Juno", "MacroTools", "NNlib", "Pkg", "Printf", "Random", "Reexport", "SHA", "Statistics", "StatsBase", "Test", "ZipFile", "Zygote"] +git-tree-sha1 = "eb5801eea6294851dc2b16b20669f91776e79a3b" +uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" +version = "0.10.4" [[Fontconfig]] deps = ["Fontconfig_jll", "Libdl", "Printf"] @@ -441,6 +480,12 @@ version = "0.1.3" deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +[[GPUArrays]] +deps = ["AbstractFFTs", "Adapt", "LinearAlgebra", "Printf", "Random", "Serialization"] +git-tree-sha1 = "d586762b08dcda13228df8967119b9cb6f22ade5" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "3.1.0" + [[Gadfly]] deps = ["Base64", "CategoricalArrays", "Colors", "Compose", "Contour", "CoupledFields", "DataStructures", "Dates", "Distributions", "DocStringExtensions", "Hexagons", "IndirectArrays", "IterTools", "JSON", "Juno", "KernelDensity", "LinearAlgebra", "Loess", "Measures", "Printf", "REPL", "Random", "Requires", "Showoff", "Statistics"] git-tree-sha1 = "fb92aef6380b6d9a252b2200c9405fcfdad31065" @@ -466,10 +511,10 @@ uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" version = "2.59.0+2" [[Graphics]] -deps = ["Colors", "Compat", "NaNMath"] -git-tree-sha1 = "e3ead4211073d4117a0d2ef7d1efc5c8092c8412" +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "45d684ead5b65c043ad46bd5be750d61c39d7ef8" uuid = "a2bd30eb-e257-5431-a919-1863eab51364" -version = "0.4.0" +version = "1.0.2" [[Graphite2_jll]] deps = ["Libdl", "Pkg"] @@ -485,9 +530,9 @@ version = "0.10.3" [[HTTP]] deps = ["Base64", "Dates", "IniFile", "MbedTLS", "Sockets"] -git-tree-sha1 = "cd60d9a575d3b70c026d7e714212fd4ecf86b4bb" +git-tree-sha1 = "fe31f4ff144392ad8176f5c7c03cca6ba320271c" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.8.13" +version = "0.8.14" [[HarfBuzz_jll]] deps = ["Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Gettext_jll", "Glib_jll", "Graphite2_jll", "Libdl", "Libffi_jll", "Pkg"] @@ -525,17 +570,23 @@ git-tree-sha1 = "c0aca8db7e9fddda18c9cebff5d147b0e799d676" uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" version = "0.6.4" +[[ImageContrastAdjustment]] +deps = ["ColorVectorSpace", "ImageCore", "ImageTransformations", "MappedArrays", "Parameters"] +git-tree-sha1 = "d22d89e03c8f617e0ae31886ca60e291b548cf59" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.5" + [[ImageCore]] -deps = ["ColorTypes", "Colors", "FFTW", "FixedPointNumbers", "Graphics", "MappedArrays", "OffsetArrays", "PaddedViews", "Reexport"] -git-tree-sha1 = "2fb7a0d80ab6bf0c5a8b0a189bca60311c73a605" +deps = ["Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport", "Requires"] +git-tree-sha1 = "a652c05f8f374861580d420b420fddf3e2e84312" uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.8.4" +version = "0.8.14" [[ImageDistances]] -deps = ["ColorVectorSpace", "Colors", "Distances", "FixedPointNumbers", "ImageCore"] -git-tree-sha1 = "aa69ce81260bcb5e950a5e3b48ccca15447c6d8c" +deps = ["ColorVectorSpace", "Distances", "ImageCore", "LinearAlgebra", "MappedArrays", "Statistics"] +git-tree-sha1 = "cf9b02b9f5e33c768c223de6d8f7d1b6d0cf4136" uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" -version = "0.2.4" +version = "0.2.7" [[ImageDraw]] deps = ["Distances", "ImageCore", "LinearAlgebra"] @@ -544,16 +595,16 @@ uuid = "4381153b-2b60-58ae-a1ba-fd683676385f" version = "0.2.2" [[ImageFiltering]] -deps = ["CatIndices", "ColorVectorSpace", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageCore", "LinearAlgebra", "MappedArrays", "OffsetArrays", "Requires", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "06f2f3b48f859a44b045c1a0b6ff71058923414f" +deps = ["CatIndices", "ColorVectorSpace", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageCore", "ImageMetadata", "LinearAlgebra", "MappedArrays", "OffsetArrays", "Requires", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "c8aebfbdbb2f12665448de007f635a1910b476e4" uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.6.9" +version = "0.6.11" [[ImageMagick]] deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] -git-tree-sha1 = "0563e9b247de1d2950ebaf06971b1e771b0cd8ca" +git-tree-sha1 = "cfd7109dbcffb0b3cb46b5697863ae4e2065bbb3" uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" -version = "1.1.3" +version = "1.1.4" [[ImageMagick_jll]] deps = ["JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] @@ -562,10 +613,10 @@ uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" version = "6.9.10-12+1" [[ImageMetadata]] -deps = ["AxisArrays", "ColorVectorSpace", "Colors", "FixedPointNumbers", "ImageAxes", "ImageCore", "IndirectArrays"] -git-tree-sha1 = "4d9ec4bb0fe4bf08c3890cb4f1274c1a63fd31ee" +deps = ["AxisArrays", "ColorVectorSpace", "ImageAxes", "ImageCore", "IndirectArrays"] +git-tree-sha1 = "5c2c78dc11343d83320e790379e0f58de3aa1b7e" uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.7.2" +version = "0.9.1" [[ImageMorphology]] deps = ["ImageCore"] @@ -573,6 +624,12 @@ git-tree-sha1 = "e41dd25ebf8de738a8ff4f1058a1823a7fe509cf" uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" version = "0.2.5" +[[ImageQualityIndexes]] +deps = ["ColorVectorSpace", "ImageCore", "ImageDistances", "ImageFiltering", "MappedArrays", "Statistics"] +git-tree-sha1 = "3af30042a8fe85612a6a106cb20ca2fa1eb67bd6" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.1.4" + [[ImageShow]] deps = ["Base64", "FileIO", "ImageCore", "Requires"] git-tree-sha1 = "c9df184bc7c2e665f971079174aabb7d18f1845f" @@ -586,23 +643,19 @@ uuid = "02fcd773-0e25-5acc-982a-7f6622650795" version = "0.8.4" [[Images]] -deps = ["AxisArrays", "Base64", "ColorTypes", "ColorVectorSpace", "Colors", "FileIO", "FixedPointNumbers", "Graphics", "ImageAxes", "ImageCore", "ImageDistances", "ImageFiltering", "ImageMetadata", "ImageMorphology", "ImageShow", "ImageTransformations", "IndirectArrays", "MappedArrays", "OffsetArrays", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] -git-tree-sha1 = "1aae59fc0e34e47dfb111113bb6e9a65d7bafe81" +deps = ["AxisArrays", "Base64", "ColorVectorSpace", "FileIO", "Graphics", "ImageAxes", "ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageShow", "ImageTransformations", "IndirectArrays", "MappedArrays", "OffsetArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "bc7ecabe5ef4d64fea25660bc5aa514a603e4468" uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" -version = "0.18.0" +version = "0.22.2" [[IncrementalInference]] -deps = ["ApproxManifoldProducts", "Combinatorics", "Dates", "DelimitedFiles", "Distributed", "DistributedFactorGraphs", "Distributions", "DocStringExtensions", "FileIO", "FunctionalStateMachine", "Graphs", "JLD2", "JSON2", "KernelDensityEstimate", "LinearAlgebra", "Logging", "MetaGraphs", "NLSolversBase", "NLsolve", "Optim", "ProgressMeter", "Random", "Reexport", "Requires", "SparseArrays", "Statistics", "StatsBase", "SuiteSparse", "ValueShapes"] -git-tree-sha1 = "e18fe691bd7b32a924bd5226e11362b36bbf0c17" +deps = ["ApproxManifoldProducts", "Combinatorics", "Dates", "DelimitedFiles", "Distributed", "DistributedFactorGraphs", "Distributions", "DocStringExtensions", "FileIO", "FunctionalStateMachine", "Graphs", "JLD2", "JSON2", "KernelDensityEstimate", "LinearAlgebra", "Logging", "MetaGraphs", "NLSolversBase", "NLsolve", "Optim", "ProgressMeter", "Random", "Reexport", "Requires", "SparseArrays", "Statistics", "StatsBase", "SuiteSparse"] +git-tree-sha1 = "f3bcf6ee5dc86b68cc9312b1390c3300391b4ba1" +repo-rev = "master" +repo-url = "https://github.com/JuliaRobotics/IncrementalInference.jl.git" uuid = "904591bb-b899-562f-9e6f-b8df64c7d480" version = "0.11.1" -[[Indexing]] -deps = ["Test"] -git-tree-sha1 = "0cf3ac621cd74b1d03af0cc4275f680b2070a5cc" -uuid = "313cdc1a-70c2-5d6a-ae34-0150d3930a38" -version = "1.1.0" - [[IndirectArrays]] git-tree-sha1 = "c2a145a145dc03a7620af1444e0264ef907bd44f" uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" @@ -637,9 +690,9 @@ version = "0.12.9" [[IntervalSets]] deps = ["Dates", "EllipsisNotation", "Statistics"] -git-tree-sha1 = "8a83c4788fdc2e32d08d90214834ec2dc1a54f57" +git-tree-sha1 = "2daa370870d2a4d198642277d050aa7d34a7cad2" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.4.0" +version = "0.5.0" [[InvertedIndices]] deps = ["Test"] @@ -711,12 +764,30 @@ git-tree-sha1 = "3cdba21cf1770662efa54527acf1ed42a9889de1" uuid = "c43967c8-f634-5d24-8eab-2867546b366b" version = "0.1.6" +[[LLVM]] +deps = ["CEnum", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "b6b86801ae2f2682e0a4889315dc76b68db2de71" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "1.3.4" + [[LZO_jll]] deps = ["Libdl", "Pkg"] git-tree-sha1 = "71119990371c93f027bee80547ee908ddfe7c5ca" uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" version = "2.10.0+1" +[[LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "StaticArrays"] +git-tree-sha1 = "d10de258d0c999350d433e4eed35201c9d790bcd" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "0.14.11" + +[[LazyStack]] +deps = ["LinearAlgebra", "NamedDims", "OffsetArrays", "Test", "ZygoteRules"] +git-tree-sha1 = "2e900f3ffe34c8b2c1543b62cc8a4a576c8549aa" +uuid = "1fad7336-0346-5a1a-a56f-a06ba010965b" +version = "0.0.5" + [[LibGit2]] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" @@ -790,6 +861,12 @@ version = "0.5.1" [[Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +[[LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "1c41621653250b2824b6e664ac5bd805558aeff9" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "0.4.3" + [[MKL_jll]] deps = ["IntelOpenMP_jll", "Libdl", "Pkg"] git-tree-sha1 = "720629cc8cbd12c146ca01b661fd1a6cf66e2ff4" @@ -813,9 +890,9 @@ uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" [[MbedTLS]] deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "a9e2221f06b42f56052f43ad7edecb01d0ef5ab4" +git-tree-sha1 = "426a6978b03a97ceb7ead77775a1da066343ec6e" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.1" +version = "1.0.2" [[MbedTLS_jll]] deps = ["Libdl", "Pkg"] @@ -855,6 +932,12 @@ git-tree-sha1 = "c028ec2dfad92d9a3718ccc94800fe0d634b9985" uuid = "4fe8b98c-fc19-5c23-8ec2-168ff83495f2" version = "0.2.1" +[[MosaicViews]] +deps = ["OffsetArrays", "PaddedViews"] +git-tree-sha1 = "b483b88403ac0ac01667778cbb29462b111b1deb" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.2.2" + [[NLSolversBase]] deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] git-tree-sha1 = "7c4e66c47848562003250f28b579c584e55becc0" @@ -878,6 +961,12 @@ git-tree-sha1 = "928b8ca9b2791081dc71a51c55347c27c618760f" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" version = "0.3.3" +[[NamedDims]] +deps = ["LinearAlgebra", "Pkg", "Requires", "Statistics"] +git-tree-sha1 = "1ae209e00d59548db3dead42a4db1c506a8fddfd" +uuid = "356022a1-0364-5f58-8944-0da4b18d706f" +version = "0.2.21" + [[Neo4j]] deps = ["Base64", "DataFrames", "DocStringExtensions", "HTTP", "JSON", "Missings", "Test"] git-tree-sha1 = "b8fe8321b0e17ac6f7b0b4f5df628610024acb11" @@ -890,9 +979,9 @@ uuid = "4d1e1d77-625e-5b40-9113-a560ec7a8ecd" version = "1.0.0" [[OffsetArrays]] -git-tree-sha1 = "87d0a91efe29352d5caaa271ae3927083c096e33" +git-tree-sha1 = "930db8ef90483570107f2396b1ffc6680f08e8b7" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "0.11.4" +version = "1.0.4" [[OpenBLAS_jll]] deps = ["CompilerSupportLibraries_jll", "Libdl", "Pkg"] @@ -931,10 +1020,10 @@ uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" version = "0.9.12" [[PaddedViews]] -deps = ["OffsetArrays", "Test"] -git-tree-sha1 = "7da3e7e1a58cffbf10177553ae95f17b92516912" +deps = ["OffsetArrays"] +git-tree-sha1 = "b40a1b901468f343dce95b16a48b4023373caca0" uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" -version = "0.4.2" +version = "0.5.4" [[Pango_jll]] deps = ["Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "Libdl", "Pkg"] @@ -1054,6 +1143,12 @@ git-tree-sha1 = "d37400976e98018ee840e0ca4f9d20baa231dc6b" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.0.1" +[[Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "UUIDs", "Unicode"] +git-tree-sha1 = "fceff536216ee787aee07247172dd7b372c39714" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "2.6.1" + [[Rmath]] deps = ["Random", "Rmath_jll"] git-tree-sha1 = "86c5647b565873641538d8f812c04e4c9dbeb370" @@ -1068,15 +1163,13 @@ version = "0.2.2+0" [[RoME]] deps = ["ApproxManifoldProducts", "CoordinateTransformations", "Dates", "DelimitedFiles", "Distributed", "DistributedFactorGraphs", "Distributions", "DocStringExtensions", "FileIO", "Graphs", "IncrementalInference", "JLD2", "KernelDensityEstimate", "LinearAlgebra", "Optim", "ProgressMeter", "Reexport", "Rotations", "Statistics", "TransformUtils"] -git-tree-sha1 = "6a8c69d6af6daa70d35be3a9cbed6703e807e757" +git-tree-sha1 = "9b33a92c88d60a89dbd7b478b65bf1273691282d" uuid = "91fb55c2-4c03-5a59-ba21-f4ea956187b8" -version = "0.6.2" +version = "0.6.3" [[RoMEPlotting]] deps = ["ApproxManifoldProducts", "Cairo", "Colors", "Compose", "Dates", "DistributedFactorGraphs", "DocStringExtensions", "Fontconfig", "Gadfly", "Graphs", "IncrementalInference", "KernelDensityEstimate", "KernelDensityEstimatePlotting", "LinearAlgebra", "Reexport", "RoME", "Statistics", "StatsBase"] -git-tree-sha1 = "7d0aff4d91c9d419d1334d9bda41b125fa345b31" -repo-rev = "master" -repo-url = "https://github.com/JuliaRobotics/RoMEPlotting.jl.git" +git-tree-sha1 = "0fa2f4e8bc8b625d69fabc0da3d9489691f16daa" uuid = "238d586b-a4bf-555c-9891-eda6fc5e55a2" version = "0.2.2" @@ -1129,15 +1222,9 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[SpecialFunctions]] deps = ["OpenSpecFun_jll"] -git-tree-sha1 = "268052ee908b2c086cc0011f528694f02f3e2408" +git-tree-sha1 = "e19b98acb182567bcb7b75bb5d9eedf3a3b5ec6c" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "0.9.0" - -[[SplitApplyCombine]] -deps = ["Dictionaries", "Indexing"] -git-tree-sha1 = "02845fc448cf504681508057ce697b46d4385e21" -uuid = "03a91e81-4c3e-53e1-a0a4-9c0c8f19dd66" -version = "1.0.0" +version = "0.10.0" [[StaticArrays]] deps = ["LinearAlgebra", "Random", "Statistics"] @@ -1173,9 +1260,15 @@ version = "1.0.0" [[Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] -git-tree-sha1 = "242b7fde70b8bc6a30d6476adf17ca3cf1ced6ee" +git-tree-sha1 = "c45dcc27331febabc20d86cb3974ef095257dcf3" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.0.3" +version = "1.0.4" + +[[TensorCast]] +deps = ["Compat", "LazyArrays", "LazyStack", "LinearAlgebra", "MacroTools", "OffsetArrays", "Random", "StaticArrays", "ZygoteRules"] +git-tree-sha1 = "036614ce47bfa2eee4d774e5e25409bfc50af7d9" +uuid = "02d47bb6-7ce6-556a-be16-bb1710789e2b" +version = "0.2.1" [[Test]] deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] @@ -1192,6 +1285,12 @@ git-tree-sha1 = "98693daea9bb49aba71eaad6b168b152d2310358" uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" version = "0.2.4" +[[TimerOutputs]] +deps = ["Printf"] +git-tree-sha1 = "123b64952b3fb1d42984cde6f1bd425479be6dcb" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.4" + [[TranscodingStreams]] deps = ["Random", "Test"] git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" @@ -1200,18 +1299,12 @@ version = "0.9.5" [[TransformUtils]] deps = ["LinearAlgebra"] -git-tree-sha1 = "6f2d0e08ad48fe8eba3bb461a8ea424d504c1801" +git-tree-sha1 = "160b0a0866edb2ceedb6eaef7e45d0d2c2e16e4e" repo-rev = "master" repo-url = "https://github.com/dehann/TransformUtils.jl.git" uuid = "9b8138ad-1b09-5408-aa39-e87ed6d21b63" version = "0.2.5" -[[TypedTables]] -deps = ["SplitApplyCombine", "Tables", "Unicode"] -git-tree-sha1 = "519533acaccc7d84e214426f69820489e1f46617" -uuid = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" -version = "1.2.0" - [[UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -1225,17 +1318,6 @@ git-tree-sha1 = "fee27a95f3d5da3cbe85ab4682e2df29dab1b283" uuid = "cbff2730-442d-58d7-89d1-8e530c41eb02" version = "0.3.1" -[[UnsafeArrays]] -git-tree-sha1 = "1de6ef280110c7ad3c5d2f7a31a360b57a1bde21" -uuid = "c4a57d5a-5b31-53a6-b365-19f8c011fbd6" -version = "1.0.0" - -[[ValueShapes]] -deps = ["ArraysOfArrays", "Distributions", "ElasticArrays", "EmpiricalDistributions", "FillArrays", "IntervalSets", "Random", "Statistics", "StatsBase", "Tables", "TypedTables"] -git-tree-sha1 = "f9ce249aea2974a1c7c475046c58d3c7c3d9a65f" -uuid = "136a8f8c-c49b-4edb-8b98-f3d64d48be8f" -version = "0.6.5" - [[VersionParsing]] git-tree-sha1 = "80229be1f670524750d905f8fc8148e5a8c4537f" uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" @@ -1255,15 +1337,15 @@ version = "1.6.8+5" [[XML2_jll]] deps = ["Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "39a309feb51413d39bdf544cf2fd09357bae37d2" +git-tree-sha1 = "987c02a43fa10a491a5f0f7c46a6d3559ed6a8e2" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.9.9+2" +version = "2.9.9+4" [[XSLT_jll]] deps = ["Libdl", "Libgcrypt_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "d0baa21427b6621126bd9e9941b4f51bef5f9fca" +git-tree-sha1 = "c287bbc08773474ab1d12849eb46b961a325e149" uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.33+1" +version = "1.1.33+2" [[Xorg_libX11_jll]] deps = ["Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] @@ -1361,6 +1443,12 @@ git-tree-sha1 = "42b0955a7ad0935d454d750fedd812d3f2836fde" uuid = "8f1865be-045e-5c20-9c9f-bfbfb0764568" version = "4.3.2+2" +[[ZipFile]] +deps = ["Libdl", "Printf", "Zlib_jll"] +git-tree-sha1 = "8748302cfdec02c4ae9c97b112cf10003f7f767f" +uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" +version = "0.9.1" + [[Zlib_jll]] deps = ["Libdl", "Pkg"] git-tree-sha1 = "2f6c3e15e20e036ee0a0965879b31442b7ec50fa" diff --git a/examples/wheeled/racecar/Project.toml b/examples/wheeled/racecar/Project.toml index 1f1a4add4..b612dc30e 100644 --- a/examples/wheeled/racecar/Project.toml +++ b/examples/wheeled/racecar/Project.toml @@ -5,12 +5,15 @@ ArgParse = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" Caesar = "62eebf14-49bc-5f46-9df9-f7b7ef379406" Cairo = "159f3aea-2a34-519c-b102-8c37f9878175" CoordinateTransformations = "150eb455-5306-5404-9cee-2592286d6298" +CuArrays = "3a865a2d-5b23-5a0f-bc46-62713ec82fae" DataInterpolations = "82cc6244-b520-54b8-b5a6-8a565e85f1d0" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Debugger = "31a5f54b-26ea-5ae9-a837-f05ce5417438" +DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" DistributedFactorGraphs = "b5cc3c7e-6572-11e9-2517-99fb8daf2f04" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" Gadfly = "c91e804a-d5a3-530f-b6f0-dfbca275c004" ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534" ImageDraw = "4381153b-2b60-58ae-a1ba-fd683676385f" @@ -20,10 +23,12 @@ JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" RoME = "91fb55c2-4c03-5a59-ba21-f4ea956187b8" RoMEPlotting = "238d586b-a4bf-555c-9891-eda6fc5e55a2" Rotations = "6038ab10-8711-5258-84ad-4b1120ba62dc" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +TensorCast = "02d47bb6-7ce6-556a-be16-bb1710789e2b" TransformUtils = "9b8138ad-1b09-5408-aa39-e87ed6d21b63" YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" diff --git a/examples/wheeled/racecar/PyTensorFlowUsage.jl b/examples/wheeled/racecar/PyTensorFlowUsage.jl index b5f06a96e..6cf219fd2 100644 --- a/examples/wheeled/racecar/PyTensorFlowUsage.jl +++ b/examples/wheeled/racecar/PyTensorFlowUsage.jl @@ -18,7 +18,7 @@ sys.path.insert(0, "/home/singhk/learning-odometry/") # @show tfmodeldir = joinpath(ENV["HOME"],"learning-odometry/") # Base.cd(tfmodeldir) -PyTFOdoPredictorPoint2 = pyimport("queryAllModels")["predictSinglePose"] +PyTFOdoPredictorPoint2 = pyimport("queryAllModels")."predictSinglePose" # was ["predictSinglePose"] # test that its working A = [rand(4) for i in 1:25] diff --git a/examples/wheeled/racecar/SavePyNNTxt.py b/examples/wheeled/racecar/SavePyNNTxt.py new file mode 100644 index 000000000..7b4545812 --- /dev/null +++ b/examples/wheeled/racecar/SavePyNNTxt.py @@ -0,0 +1,10 @@ +#!/usr/bin/python3 + +import os +import numpy as np + +# dest will be made as a folder and several txt files will be saved within. +def storePyNNModelTxt(dest, mw): + os.mkdir(dest) + for i in range(len(mw)): + np.savetxt(dest+'/w'+str(i)+'.txt',mw[i]) #,fmt='%f') diff --git a/examples/wheeled/racecar/apriltag_and_zed_slam_flux.jl b/examples/wheeled/racecar/apriltag_and_zed_slam_flux.jl new file mode 100644 index 000000000..f4d7f98db --- /dev/null +++ b/examples/wheeled/racecar/apriltag_and_zed_slam_flux.jl @@ -0,0 +1,252 @@ +# Local compute version + +using Pkg +Pkg.activate(@__DIR__) +Pkg.instantiate() +Pkg.precompile() + +using ArgParse +using Gadfly +using DelimitedFiles +using Dates, Statistics +using YAML +using JLD2 +using CoordinateTransformations, Rotations, StaticArrays +using ImageCore +using Images, ImageDraw +# using ImageView +using AprilTags +using DataInterpolations + +using DistributedFactorGraphs +using IncrementalInference +using RoME +using RoMEPlotting +using Caesar +using CuArrays +using Flux + +## Load all required packages +using Distributed + +if nprocs() == 1 + addprocs(5) # make sure there are 4 processes waiting before loading packages +end + +@everywhere begin + using Pkg + Pkg.activate(@__DIR__) +end + +WP = nprocs == 1 ? WorkerPool([1]) : WorkerPool(2:nprocs() |> collect ) + +# using DistributedFactorGraphs +for i in procs() + fetch( Distributed.@spawnat i @eval using DistributedFactorGraphs ) + fetch( Distributed.@spawnat i @eval using IncrementalInference ) + fetch( Distributed.@spawnat i @eval using RoME ) + fetch( Distributed.@spawnat i @eval using Caesar ) + fetch( Distributed.@spawnat i @eval using CuArrays ) + fetch( Distributed.@spawnat i @eval using Flux ) +end + +for i in procs() + fetch( Distributed.@spawnat i @eval using RoMEPlotting ) +end + +@everywhere using JLD2 +@everywhere using DistributedFactorGraphs +@everywhere using IncrementalInference +@everywhere using RoME +@everywhere using Caesar +@everywhere using RoMEPlotting +@everywhere using Flux + +# @show ARGS +include("parsecommands.jl") + + + + + +@everywhere begin +# using Fontconfig +# using Compose +using Gadfly +using Cairo +# using FileIO +# using GeometryTypes # using MeshCat +end + + +# setup configuration +include(joinpath(@__DIR__,"configParameters.jl") ) + + +# Figure export folder +global currdirtime = now() +if parsed_args["previous"] != "" + # currdirtime = "2018-11-07T01:36:52.274" + currdirtime = parsed_args["previous"] +end + +resultsparentdir = joinpath(datadir, "results") +resultsdir = joinpath(resultsparentdir, "$(currdirtime)") + +if parsed_args["previous"] == "" + # When running fresh from new data + include(joinpath(@__DIR__,"createResultsDirs.jl")) +end + + +# Utils required for this processing script +include(joinpath(@__DIR__,"racecarUtils.jl") ) +include(joinpath(@__DIR__,"cameraUtils.jl") ) +# include(joinpath(dirname(@__FILE__),"visualizationUtils.jl") ) + + + +@everywhere function plotRacecarInterm(fgl::G, resultsdirl, psyml::Symbol)::Nothing where G <: AbstractDFG + @show ls(fgl) + pl = drawPosesLandms(fgl, spscale=0.1, drawhist=false, meanmax=:mean) #,xmin=-3,xmax=6,ymin=-5,ymax=2); + Gadfly.draw(PNG(joinpath(resultsdirl, "images", "$(psyml).png"),15cm, 10cm),pl) + pl = drawPosesLandms(fgl, spscale=0.1, meanmax=:mean) # ,xmin=-3,xmax=3,ymin=-2,ymax=2); + Gadfly.draw(PNG(joinpath(resultsdirl, "images", "hist_$(psyml).png"),15cm, 10cm),pl) + # pl = plotPose2Vels(fgl, Symbol("$(psyml)"), coord=Coord.Cartesian(xmin=-1.0, xmax=1.0)) + # Gadfly.draw(PNG(joinpath(resultsdirl, "images", "vels_$(psyml).png"),15cm, 10cm),pl) + # save combined image with tags + nothing +end + + + +global tag_bag = Dict() +if parsed_args["previous"] == "" + tag_bag = detectTagsInImgs(datafolder, imgfolder, resultsdir, camidxs, iterposes=parsed_args["iterposes"]) + # save the tag bag file for future use + @save resultsdir*"/tag_det_per_pose.jld2" tag_bag +else + @load resultsdir*"/tag_det_per_pose.jld2" tag_bag +end + +## Load joystick time series data + + +runnr = parse(Int, parsed_args["folder_name"][end]) +joyTimeseries = readdlm(joinpath(datadir,parsed_args["folder_name"],"labRun$(runnr)_joy.csv"), ',') +joyTimeseries = joyTimeseries[2:end,[1,6,8]] +joyTimeseries[:,1] .= joyTimeseries[:,1]*1e-9 # .|> unix2datetime; + +# load the detections file to get timestamps +detcData = readdlm(joinpath(datadir,parsed_args["folder_name"],"labRun$(runnr)Detections.csv"), ',') +detcData = detcData[2:end,:] +detcPoseTs = detcData[:,4]*1e-9 .+ detcData[:,3] .|> unix2datetime + +## find timeseries segments that go with each pose +joyTsDict = Dict{Symbol, Array{Float64,2}}() +poseTimes = Dict{Symbol, DateTime}(:x0 => detcPoseTs[1]) +mask = joyTimeseries[:,1] .< datetime2unix(detcPoseTs[1]) +joyTsDict[:x0] = joyTimeseries[mask,:] + +for i in 2:length(detcPoseTs) + mask = datetime2unix(detcPoseTs[i-1]) .<= joyTimeseries[:,1] .< datetime2unix(detcPoseTs[i]) + joyTsDict[Symbol("x$(i-1)")] = joyTimeseries[mask,:] + poseTimes[Symbol("x$(i-1)")] = detcPoseTs[i-1] # later helper +end + +## interpolate up to PyQuest values... + +intJoyDict = Dict{Symbol,Vector{Vector{Float64}}}() +# for sym, lclJD = :x1, joyTsDict[:x1] +for (sym, lclJD) in joyTsDict + if 1 < size(lclJD,1) + tsLcl = range(lclJD[1,1],lclJD[end,1],length=25) + intrTrTemp = DataInterpolations.LinearInterpolation(lclJD[:,2],lclJD[:,1]) + intrStTemp = DataInterpolations.LinearInterpolation(lclJD[:,3],lclJD[:,1]) + newVec = Vector{Vector{Float64}}() + for tsL in tsLcl + newVal = zeros(4) + newVal[1] = intrTrTemp(tsL) + newVal[2] = intrStTemp(tsL) + push!(newVec, newVal) + end + # currently have no velocity values + intJoyDict[sym] = newVec + else + intJoyDict[sym] = [zeros(4) for i in 1:25] + end +end + +## More code required + +# add the NeuralPose2Pose2 factor in Main workspace +include( joinpath(dirname(pathof(Caesar)), "..", "examples", "learning", "hybrid", "NeuralPose2Pose2", "FluxModelsPose2Pose2.jl") ) + +include(joinpath(@__DIR__, "LoadPyNNTxt.jl")) + +## load the required models into common predictor + +allModels = [] +for i in 0:99 +# /home/dehann/data/racecar/results/conductor/models/retrained_network_weights0 + push!(allModels, loadTfModelIntoFlux(ENV["HOME"]*"/data/racecar/results/conductor/models/retrained_network_weights$i") ) +end + +@everywhere function JlOdoPredictorPoint2(smpls::AbstractMatrix{<:Real}, + allModelsLocal::Vector) + # + arr = zeros(length(allModelsLocal), 2) + for i in 1:length(allModelsLocal) + arr[i,:] = allModelsLocal[i](smpls) + end + return arr +end + +## run the solution + + +fg = main(WP, resultsdir, camidxs, tag_bag, jldfile=parsed_args["jldfile"], failsafe=parsed_args["failsafe"], show=parsed_args["show"], odopredfnc=(x)->JlOdoPredictorPoint2(x, allModels), joyvel=intJoyDict, poseTimes=poseTimes, multiproc=true ) + + +## development + + +0 + +# fg = initfg() +# +# addVariable!(fg, :x0, Pose2, timestamp=poseTimes[:x0]) +# addVariable!(fg, :x1, Pose2, timestamp=poseTimes[:x1]) +# +# pp2 = PriorPose2(MvNormal(zeros(3),LinearAlgebra.diagm([0.01;0.01;0.005].^2))) +# addFactor!(fg, [:x0], pp2) +# +# # the neural factor +# DXmvn = MvNormal(zeros(3),LinearAlgebra.diagm([0.01;0.01;0.005].^2)) +# odopredfnc=(x)->JlOdoPredictorPoint2(x, allModels) +# joyvel=intJoyDict +# +# joyVals = zeros(25,4) +# for i in 1:25 +# joyVals[i,:] .= joyvel[:x0][i] +# end +# +# pp = FluxModelsPose2Pose2(odopredfnc,joyVals, DXmvn,0.4) # joyvel[:x0] +# addFactor!(fg, [:x0;:x1], pp) +# +# pts = approxConv(fg, :x0x1f1, :x1) + + +# fails +# key 1 not found +# julia101 -p 4 apriltag_and_zed_slam.jl --previous "2018-11-09T01:42:33.279" --jldfile "racecar_fg_x299.jld2" --folder_name "labrun7" --failsafe + + + + + + + + + +# diff --git a/examples/wheeled/racecar/apriltag_and_zed_slam_pynn.jl b/examples/wheeled/racecar/apriltag_and_zed_slam_pynn.jl index 13c5ed5a9..55ded7980 100644 --- a/examples/wheeled/racecar/apriltag_and_zed_slam_pynn.jl +++ b/examples/wheeled/racecar/apriltag_and_zed_slam_pynn.jl @@ -156,7 +156,8 @@ for (sym, lclJD) in joyTsDict end # add the NeuralPose2Pose2 factor in Main workspace -include(joinpath(@__DIR__, "NeuralPose2Pose2/PyNeuralPose2Pose2.jl")) +include( joinpath(dirname(pathof(Caesar)), "..", "examples", "learning", "hybrid", "NeuralPose2Pose2", "PyNeuralPose2Pose2.jl") ) +# include(joinpath(@__DIR__, "NeuralPose2Pose2/PyNeuralPose2Pose2.jl")) ## run the solution diff --git a/examples/wheeled/racecar/cameraUtils.jl b/examples/wheeled/racecar/cameraUtils.jl index 7204dfe36..a4dee085a 100644 --- a/examples/wheeled/racecar/cameraUtils.jl +++ b/examples/wheeled/racecar/cameraUtils.jl @@ -40,9 +40,9 @@ function buildtagdict(cTt, bTcl ) # # @show tvec, q - # @show cTt = tvec ∘ LinearMap(Ql) - @show bTcl, cTt - @show bTt = bTcl ∘ cTt + cTt = tvec ∘ LinearMap(Ql) + # @show bTcl, cTt + bTt = bTcl ∘ cTt bP2t = getTagPP2(bTt) onetag = Dict{Symbol, Any}() @@ -141,7 +141,7 @@ end # get Pose2Pose2 tag orientation transform function getTagPP2(bTt) - @show bTt + # @show bTt cVz = LinearMap(Quat(bTt.linear))([1.0;0;0]) wYt = atan(cVz[2],cVz[1]) Translation(bTt.translation[1],bTt.translation[2],0) ∘ LinearMap(RotZ(wYt)) diff --git a/examples/wheeled/racecar/commands.sh b/examples/wheeled/racecar/commands.sh index ef0f9b90e..36554ffd0 100644 --- a/examples/wheeled/racecar/commands.sh +++ b/examples/wheeled/racecar/commands.sh @@ -105,6 +105,45 @@ racecarslampynnall() { sleep 210; racecarslampyodo_8 $* & } + + +racecarslamflux_1() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun1" $* +} +racecarslamflux_2() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun2" $* +} +racecarslamflux_3() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun3" $* +} +racecarslamflux_4() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun4" $* +} +racecarslamflux_5() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun5" $* +} +racecarslamflux_6() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun6" $* +} +racecarslamflux_7() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun7" $* +} +racecarslamflux_8() { + julia -O 3 $CAESAR_EX_DIR/apriltag_and_zed_slam_flux.jl --folder_name "labrun8" $* +} + + +racecarslamfluxall() { + sleep 01; racecarslamflux_1 $* & + sleep 60; racecarslamflux_2 $* & + sleep 120; racecarslamflux_3 $* & + sleep 180; racecarslamflux_4 $* & + sleep 240; racecarslamflux_5 $* & + sleep 300; racecarslamflux_6 $* & + sleep 360; racecarslamflux_7 $* & + sleep 420; racecarslamflux_8 $* & +} + # get user slam procs getjuliaprocs() { ps -U $USER | grep "julia" | grep -v grep | awk '{print $1}' @@ -132,7 +171,8 @@ copylatesttoconductor() { } racecarpynnconductor() { - racecarslampynnall + racecarslamfluxall + # racecarslampynnall sleep 60 while [ 0 -lt `getjuliaprocs | wc -l` ]; do diff --git a/examples/wheeled/racecar/dev/NNOdoModelDev.jl b/examples/wheeled/racecar/dev/NNOdoModelDev.jl new file mode 100644 index 000000000..b548b5e6a --- /dev/null +++ b/examples/wheeled/racecar/dev/NNOdoModelDev.jl @@ -0,0 +1,231 @@ +## Python reference + +ENV["PYTHON"] = "/usr/bin/python3.6" + +using Pkg +Pkg.build("PyCall") + +using PyCall + +# py""" +# import sys +# sys.path.insert(0, "/home/singhk/learning-odometry/") +# """ +py""" +import sys +sys.path.insert(0, "/home/dehann/.julia/dev/Caesar/examples/learning/hybrid/dev/") +""" + +Base.cd("/home/dehann/.julia/dev/Caesar/examples/learning/hybrid/dev/") + +# np = pyimport("numpy") +getM = pyimport("model_weights0") +pywe = getM.getWeights() + + +pymodels = pyimport("PyNNModels") + +# pymodel = tf.keras.models.load_model("/tmp/caesar/conductor/sim_models/original_network0.h5") +pymodel = tf.keras.models.load_model("/tmp/caesar/conductor/models/retrained_network_model0.h5") +pywe = pymodel.get_weights() + +pyX = [rand(4) for i in 1:25] + +pymodel.predict([[pyX]]) + +## Build a full new model in this context to test end to end first + +pmF = pymodels.build_model((25,4)) +pmF.set_weights(pywe) +@assert pmF.predict([[pyX]]) - pymodel.predict([[pyX]]) .|> abs |> sum < 1e-10 "Newly constructed model does not match" + + + +## in Julia + +using Flux + +# load data in near similar format +jlX = zeros(25,4) +for i in 1:25 + jlX[i,:] .= pyX[i] +end + +# W1 = [ +# -0.06407804 -0.07884349 0.00956099 -0.21626501 -0.01075477 0.21383737 0.07711418 0.16997789; +# -0.06179927 -0.08914955 0.08072356 -0.06508656 -0.01248774 0.16290735 0.03741108 0.12805876; +# -0.89473826 0.53830796 -0.25319445 -0.19648497 -2.4377484 0.916801 -0.46429503 -1.0824044; +# -3.5242891 -0.48591098 0.96419954 0.77881175 0.71329623 0.00865639 -3.323312 0.14445505 +# ]' |> collect +# +# b1 = [0.07736943, -0.05445341, -0.03332321, -0.08276157, 0.06977537, 0.04422938, -0.04833093, -0.18779308] + + +## test the first Dense layer + +W1 = pywe[1] +b1 = pywe[2] + +c1_1 = (jlX*W1)' .+ b1 + +# Build first portion of model to compare with Flux + +pm1_1 = pymodels.build_model1_1((25,4)) +pm1_1.set_weights(pywe[1:2]) +c1_1_py = pm1_1.predict([[pyX]]) + +for i in 1:8 + @assert c1_1_py[1,:,i] - c1_1[i,:] |> norm < 1e-4 +end + +## test with relu activation + +c1 = (jlX*W1)' .+ b1 .|> relu + + +pm1 = pymodels.build_model1((25,4)) +pm1.set_weights(pywe[1:2]) +c1_py = pm1.predict([[pyX]]) + +for i in 1:8 + @assert c1_py[1,:,i] - c1[i,:] |> norm < 1e-4 +end + + +## test with max pooling + +c1_3 = reshape(c1', 25,8,1) +c2 = maxpool(c1_3, PoolDims(c1_3, 4)) + +modc = Chain( + x -> (x*W1)' .+ b1 .|> relu, + x -> reshape(x', 25,8,1), + x -> maxpool(x, PoolDims(x, 4)) +) + +c2 = modc(jlX) + + +pm2 = pymodels.build_model2((25,4)) +pm2.set_weights(pywe[1:2]) +c2_py = pm2.predict([[pyX]]) + +for i in 1:6 + @assert c2_py[1,i,:] - c2[i,:,1] |> norm < 1e-4 +end + + +## test flatten layer + +c3__ = reshape(c2[:,:,1]',1,:) + +modc = Chain( + x -> (x*W1)' .+ b1 .|> relu, + x -> reshape(x', 25,8,1), + x -> maxpool(x, PoolDims(x, 4)), + # x -> reshape(x[:,:,1]',1,:), + x -> reshape(x[:,:,1]',:), +) + +c3 = modc(jlX) + +pm3 = pymodels.build_model3((25,4)) +pm3.set_weights(pywe[1:2]) +c3_py = pm3.predict([[pyX]]) + +@assert c3_py[:] - c3[:] |> norm < 1e-6 + + +## Test full model + + +modjl = Chain( + x -> (x*W1)' .+ b1 .|> relu, + x -> reshape(x', 25,8,1), + x -> maxpool(x, PoolDims(x, 4)), + # x -> reshape(x[:,:,1]',1,:), + x -> reshape(x[:,:,1]',:), + Dense(48,8,relu), + Dense(8,2) +) + +modjl[5].W .= pywe[3]' +modjl[5].b .= pywe[4] + +modjl[6].W .= pywe[5]' +modjl[6].b .= pywe[6] + +c5 = modjl(jlX) + +c5_py = pymodel.predict([[pyX]]) + +@assert c5_py[:] - c5[:] |> norm < 1e-6 + + + +## test with lots of variability + + +testModJl = buildPyNNModel_01_FromWeights(pywe) + +testModJl(jlX) + + + + +for k in 1:100 + MCpyX = [rand(4) for i in 1:25] + # load data in near similar format + MCjlX = zeros(25,4) + for i in 1:25 + MCjlX[i,:] = MCpyX[i] + end + + @show pymodel.predict([[MCpyX]])[:] - testModJl(MCjlX)[:] |> norm + @assert pymodel.predict([[MCpyX]])[:] - testModJl(MCjlX)[:] |> norm < 1e-4 +end + + + + + + +## Try consolidate the first dense layer + +# julia> modTest1jl(jlX) +# ERROR: DimensionMismatch("A has dimensions (8,4) but B has dimensions (25,4)") + + +# load data in near similar format +# jlX = zeros(25,4) +# for i in 1:25 +# jlX[i,:] .= pyX[i] +# end + +# ## test the first Dense layer +# +# W1 = pywe[1] +# b1 = pywe[2] +# +# Dense(4,8).W +# +# c1_1 = (jlX*W1)' .+ b1 +# +# modTest1jl = Chain( +# Dense(4,8), +# ) +# +# modTest1jl[1].W .= pywe[1]' +# modTest1jl[1].b .= pywe[2] +# +# modTest1jl(jlX) +# +# # Build first portion of model to compare with Flux +# +# pm1_1 = pymodels.build_model1_1((25,4)) +# pm1_1.set_weights(pywe[1:2]) +# c1_1_py = pm1_1.predict([[pyX]]) +# +# for i in 1:8 +# @assert c1_1_py[1,:,i] - c1_1[i,:] |> norm < 1e-4 +# end diff --git a/examples/wheeled/racecar/dev/PyNNModels.py b/examples/wheeled/racecar/dev/PyNNModels.py new file mode 100644 index 000000000..d10addfd8 --- /dev/null +++ b/examples/wheeled/racecar/dev/PyNNModels.py @@ -0,0 +1,56 @@ +import csv +import json +import tensorflow as tf +import numpy as np +import dataPreProcLoopVersion as data +import matplotlib.pyplot as plt +from tensorflow.keras.models import load_model +#import keras.backend as K +import copy +from tensorflow.keras.callbacks import History +from tensorflow.keras.models import Model +from tensorflow.keras.layers import Conv2D, Dense, Flatten, Input, MaxPooling2D, MaxPooling1D, Layer +from tfdiffeq.models import ODENet#, ConvODENet + +history = History() + +np.set_printoptions(threshold=np.inf) + +# tf.enable_eager_execution() + +bad_data_count = 0 + +def build_model(input_shape): + x = Input(input_shape) + y = Dense(8, activation=tf.nn.relu)(x) + y = MaxPooling1D(4)(y) + y = Flatten()(y) + #y = ODENet(10, 1)(y) + y = Dense(8, activation=tf.nn.relu)(y) + y = Dense(2)(y) + return Model(x, y) + +# model = build_model((25,4)) + +def build_model1_1(input_shape): + x = Input(input_shape) + y = Dense(8)(x) + return Model(x, y) + +def build_model1(input_shape): + x = Input(input_shape) + y = Dense(8, activation=tf.nn.relu)(x) + return Model(x, y) + +def build_model2(input_shape): + x = Input(input_shape) + y = Dense(8, activation=tf.nn.relu)(x) + y = MaxPooling1D(4)(y) + return Model(x, y) + +def build_model3(input_shape): + x = Input(input_shape) + y = Dense(8, activation=tf.nn.relu)(x) + y = MaxPooling1D(4)(y) + y = Flatten()(y) + return Model(x, y) diff --git a/examples/wheeled/racecar/dev/model_weights0.py b/examples/wheeled/racecar/dev/model_weights0.py new file mode 100644 index 000000000..928d25b32 --- /dev/null +++ b/examples/wheeled/racecar/dev/model_weights0.py @@ -0,0 +1,124 @@ +#!/usr/bin/python3 +# import numpy as np + +import numpy as np + +def getWeights(): + arr = [np.array([[-0.06407804, -0.07884349, 0.00956099, -0.21626501, -0.01075477, + 0.21383737, 0.07711418, 0.16997789], + [-0.06179927, -0.08914955, 0.08072356, -0.06508656, -0.01248774, + 0.16290735, 0.03741108, 0.12805876], + [-0.89473826, 0.53830796, -0.25319445, -0.19648497, -2.4377484 , + 0.916801 , -0.46429503, -1.0824044 ], + [-3.5242891 , -0.48591098, 0.96419954, 0.77881175, 0.71329623, + 0.00865639, -3.323312 , 0.14445505]], dtype=np.float32), + np.array([ 0.07736943, -0.05445341, -0.03332321, -0.08276157, + 0.06977537, 0.04422938, -0.04833093, -0.18779308], dtype=np.float32), + np.array([[-0.59868413, -0.44481835, -0.18415509, -0.19824918, -0.20608608, + 0.34769407, -2.2082744 , -0.09973069], + [ 0.07201806, 0.14966238, 0.37763757, 0.02420542, 0.12568802, + -0.02764693, 0.10016007, 0.17976598], + [-0.3038925 , -0.09263409, -0.4879569 , 0.0685117 , 0.10173658, + -0.17082651, -0.19699633, -0.458388 ], + [ 0.11113676, -1.0138001 , 0.27679208, -0.25263762, 0.06917188, + -0.42604515, 0.10810214, 0.2104194 ], + [ 0.00890153, -0.42608193, -0.09927376, -0.26866645, -0.05137556, + -0.46350625, -0.65313935, -0.4276388 ], + [-0.25984183, 0.02953338, -0.05050093, -0.12539397, 0.1804169 , + 0.05802999, -0.05065728, -0.2113352 ], + [-0.7840679 , -0.04178363, 0.10338156, -2.5200388 , 0.08356426, + -0.40448245, -0.13497646, -0.20674999], + [ 0.21147652, 0.17572166, 0.16751698, -0.06478957, -0.30552384, + 0.30466267, 0.3415583 , 0.32864007], + [-0.22613321, -0.19913779, -0.0899385 , 0.30288845, 0.1305017 , + 0.04312016, -2.190678 , -0.20880325], + [ 0.1000222 , 0.17635034, 0.42657956, 0.41456014, 0.06910895, + 0.22979978, 0.16924803, -0.02563003], + [-0.00423099, -0.09597459, -0.49952 , -0.13990477, -0.11891547, + 0.16092381, -0.23229863, -0.06736855], + [ 0.2873051 , -1.0444629 , 0.16794898, 0.25041947, 0.18515031, + -0.0222683 , 0.3780619 , 0.48788837], + [-0.6072056 , -0.19847003, -0.04973965, -0.6658913 , -0.20327425, + -0.8174168 , -0.03335344, -0.75748014], + [-0.20093647, 0.11817803, 0.02694173, 0.04923057, -0.27442718, + 0.30018032, -0.4485643 , -0.28369936], + [-0.5956259 , 0.26374382, 0.2623892 , -2.2811766 , -0.30357063, + -0.28933677, -0.06700326, 0.3008672 ], + [ 0.32556325, -0.15631258, 0.00514548, 0.27790052, 0.30549708, + -0.24961273, 0.07800975, 0.29368293], + [-0.63744605, -0.06206286, -0.60265756, 0.35717142, 0.11294952, + 0.20128824, -2.1064463 , -0.3535015 ], + [ 0.18320808, 0.29210487, 0.22038245, -0.17521633, -0.30858564, + 0.22246777, -0.06640788, -0.09972857], + [ 0.13848032, -0.06201918, -0.58919805, -0.01726598, 0.09370838, + -0.32263765, -0.13780081, -0.01229677], + [ 0.26258132, -0.61510915, 0.21540615, 0.01610513, 0.01095415, + -0.19099583, 0.0296345 , 0.03978755], + [-0.00485031, -0.76128435, -0.09280831, -0.71800625, 0.1454568 , + -0.70365804, -0.54079014, -0.6756243 ], + [-0.16712634, -0.07352235, 0.10642201, 0.29887766, -0.15065506, + 0.14126429, -0.4676577 , -0.22552066], + [-0.677807 , -0.00396183, -0.28706658, -2.1105597 , 0.17808369, + -0.18932076, 0.17273276, -0.04641337], + [ 0.10295494, 0.04748227, 0.48223 , 0.26485938, -0.17242715, + -0.01246687, 0.10887309, 0.13188238], + [-0.7816935 , -0.1488776 , -0.2472918 , 0.32321182, 0.26238304, + 0.4407356 , -2.0943046 , -0.28969222], + [ 0.5879776 , 0.2659344 , 0.26887572, -0.10528599, -0.10151562, + -0.06200889, -0.25017995, -0.11795548], + [ 0.09588467, -0.2590418 , -0.5734625 , 0.38886866, 0.07680258, + 0.20786384, -0.282513 , 0.00706037], + [ 0.19770508, -0.85675555, 0.07276082, -0.1903152 , -0.20158224, + 0.00876304, 0.10548637, 0.09995469], + [-0.13039929, -0.76277995, 0.10120926, -0.63119674, -0.40530565, + -0.45619968, -0.67273825, -0.9708561 ], + [-0.20345786, -0.28533033, 0.20337127, 0.3554105 , -0.06522847, + 0.1861163 , -0.12677322, -0.47671705], + [-1.1458865 , 0.30985376, 0.305106 , -2.317265 , -0.30003598, + -0.5403273 , -0.31105268, -0.06521182], + [ 0.4578769 , -0.05113497, 0.4946017 , -0.07867522, 0.06020356, + 0.16278556, 0.15248169, 0.20809586], + [-0.86861056, -0.43284354, -0.03065424, 0.2619783 , -0.03262846, + 0.17720507, -1.7199538 , -0.5539021 ], + [ 0.40381178, 0.13195953, 0.00261572, 0.2485809 , -0.15620159, + -0.06025232, -0.17958407, 0.14566538], + [-0.00693041, -0.12004662, -0.49732143, 0.15587701, 0.01227358, + 0.1512818 , 0.0538843 , -0.30875564], + [ 0.01979482, -0.906234 , -0.01496727, 0.15966703, -0.3069434 , + 0.08154605, -0.04230358, -0.03687 ], + [-0.34532568, -0.66616476, 0.3918459 , -0.5953149 , -0.16690224, + -0.40944877, -0.11519072, -0.8813348 ], + [ 0.25683987, -0.15344548, 0.18372725, 0.02250142, -0.36878568, + 0.25108543, -0.3164477 , -0.58950233], + [-0.8021271 , 0.19923782, 0.23039253, -2.399476 , 0.24830976, + -0.1537488 , 0.02210124, -0.1763221 ], + [ 0.6255889 , 0.39011213, 0.57903165, 0.4763893 , 0.10659221, + -0.00904244, 0.3108362 , 0.21079867], + [-0.7298123 , -0.10092824, -0.2131444 , 0.33919168, -0.33838344, + 0.35191217, -1.7258697 , -0.3576242 ], + [ 0.14413889, 0.29769206, 0.51256007, -0.03478652, 0.08891462, + 0.35592595, 0.20088974, 0.19094205], + [ 0.25401 , -0.28073817, -0.36500415, -0.020096 , 0.02760684, + 0.18874004, -0.00444112, -0.06727066], + [ 0.35809815, -0.61689013, 0.24781734, 0.14322802, -0.06472611, + -0.49406245, 0.18024167, 0.26919264], + [-0.2522735 , -0.47304115, -0.04783777, -0.2956709 , -0.13245517, + -0.54097843, -0.64491165, -0.8720841 ], + [ 0.12398586, 0.04071081, -0.183321 , -0.09515989, -0.13422957, + 0.18537083, -0.276843 , -0.46779147], + [-0.57007796, 0.318699 , 0.27120352, -2.114595 , -0.2278392 , + -0.3014673 , -0.36511648, 0.01439504], + [-0.01991669, 0.31171557, 0.07710712, 0.27799517, -0.24220647, + 0.21805379, -0.04348316, 0.16949372]], dtype=np.float32), + np.array([ 0.60129285, 0.13258433, 0.05961297, 0.08487568, -0.09112971, + 0.01292089, 0.34978956, 0.44618648], dtype=np.float32), + np.array([[ 0.09039981, 0.59831476], + [ 0.553312 , -0.6111854 ], + [-0.38198262, -0.0278831 ], + [-0.27384686, -1.2601143 ], + [ 0.60371447, -0.34460044], + [ 0.2794425 , 0.61333966], + [-1.6129715 , -0.83530825], + [ 1.4144366 , 0.2668518 ]], dtype=np.float32), + np.array([-0.03191037, -0.13685739], dtype=np.float32)] + return arr diff --git a/examples/wheeled/racecar/racecarUtils.jl b/examples/wheeled/racecar/racecarUtils.jl index 779e00d34..ae67fbb32 100644 --- a/examples/wheeled/racecar/racecarUtils.jl +++ b/examples/wheeled/racecar/racecarUtils.jl @@ -82,7 +82,11 @@ function addnextpose!(fg, # first pose with zero prior if odotype == Pose2Pose2 addVariable!(fg, new_pssym, Pose2, timestamp=poseTimes[new_pssym]) - pp = !donnpose ? Pose2Pose2(DXmvn) : PyNeuralPose2Pose2(odopredfnc,joyvel[prev_pssym],DXmvn,naiveFrac) + joyVals = zeros(25,4) + for i in 1:25 + joyVals[i,:] .= joyvel[prev_pssym][i] + end + pp = !donnpose ? Pose2Pose2(DXmvn) : FluxModelsPose2Pose2(odopredfnc,joyVals,DXmvn,naiveFrac) # PyNeuralPose2Pose2(odopredfnc,joyvel[prev_pssym],DXmvn,naiveFrac) addFactor!(fg, [prev_pssym; new_pssym], pp, graphinit=autoinit) elseif odotype == VelPose2VelPose2 donnpose ? error("Not implemented for VelPose2VelPose2 yet") : nothing @@ -265,7 +269,11 @@ for psid in (prev_psid+1):1:maxlen ensureAllInitialized!(fg) # T2 = remotecall(plotRacecarInterm, WP, fg, resultsdir, psym) # @async fetch(T2) - plotRacecarInterm(fg, resultsdir, psym) + if 1 < nprocs() + remotecall(plotRacecarInterm, WP, fg, resultsdir, psym) + else + plotRacecarInterm(fg, resultsdir, psym) + end # prepare for next iteration prev_psid = psid diff --git a/examples/wheeled/racecar/ros/CarFeed.jl b/examples/wheeled/racecar/ros/CarFeed.jl index 0310f64ec..ab3df27de 100644 --- a/examples/wheeled/racecar/ros/CarFeed.jl +++ b/examples/wheeled/racecar/ros/CarFeed.jl @@ -2,6 +2,10 @@ # source /opt/ros/melodic/setup.bash +## + +using Distributed + ## Project path variables @@ -41,14 +45,14 @@ using AprilTags using Gtk.ShortNames -using Caesar, RoME, IncrementalInference -using DistributedFactorGraphs -using TransformUtils +using Caesar +@everywhere using Caesar +@everywhere using RoME, IncrementalInference, DistributedFactorGraphs, TransformUtils ## Load rosbag reader # this now occurs as part of Caesar after RobotOS -include( joinpath(projdir,"..","Utils","RosbagSubscriber.jl") ) +# include( joinpath(projdir,"..","Utils","RosbagSubscriber.jl") ) ## add 3D vis @@ -95,7 +99,9 @@ include(joinpath(@__DIR__, "CarSlamUtils.jl")) ## start solver defaultFixedLagOnTree!(slam.dfg, 30, limitfixeddown=true) -getSolverParams(slam.dfg).dbg = true +# getSolverParams(slam.dfg).dbg = true +getSolverParams(slam.dfg).drawtree = true +getSolverParams(slam.dfg).showtree = false ST = manageSolveTree!(slam.dfg, slam.solveSettings, dbg=true) @@ -108,16 +114,21 @@ loop!(BagSubscriber) ## +getSolverParams(slam.dfg).drawtree = false + sleep(0.01) # allow gui sime time to setup -# for i in 1:5000 while loop!(BagSubscriber) - if 2 <= length(slam.solveSettings.poseSolveToken.data) - @info "delay for solver, canTakePoses=$(slam.solveSettings.canTakePoses), tokens=$(slam.solveSettings.poseSolveToken.data)" - sleep(1.0) - end +# for i in 1:5000 + # loop!(BagSubscriber) + blockProgress(slam) # required to prevent duplicate solves occuring at the same time end +## close all + +stopManageSolveTree!(slam) + +delete!(vis) ## discovery @@ -127,14 +138,17 @@ end # tree, smt, hist = solveTree!(slam.dfg) using RoMEPlotting, Gadfly -Gadfly.set_default_plot_size(35cm, 25cm) +Gadfly.set_default_plot_size(35cm, 20cm) # drawPoses(slam.dfg, spscale=0.3, drawhist=false) -drawPosesLandms(slam.dfg, spscale=0.3, drawhist=false) +pl = drawPosesLandms(slam.dfg, spscale=0.3, drawhist=false) +pl |> PDF(joinLogPath(slam.dfg,"fg_$(slam.poseCount).pdf")) # drawPosesLandms(fg4, spscale=0.3, drawhist=false) -reportFactors(slam.dfg, Pose2Pose2, show=false) +pl = reportFactors(slam.dfg, Pose2Pose2, show=false) +# pl |> PDF(joinLogPath(slam.dfg,"fg_$(slam.poseCount).pdf")) # reportFactors(fg4, Pose2Pose2, show=false) + # diff --git a/examples/wheeled/racecar/ros/CarSlamUtils.jl b/examples/wheeled/racecar/ros/CarSlamUtils.jl index 030bebf1a..da68cc72b 100644 --- a/examples/wheeled/racecar/ros/CarSlamUtils.jl +++ b/examples/wheeled/racecar/ros/CarSlamUtils.jl @@ -99,37 +99,9 @@ function drawLatestImagePair(syncImgs) nothing end -## SLAM Functions - - -mutable struct SLAMCommonHelper - lastPoseOdomBuffer::SE3 # common helper - SLAMCommonHelper(lpo::SE3=SE3(0)) = new(lpo) -end - -mutable struct SLAMWrapperLocal{G <: AbstractDFG} <: AbstractSLAM - dfg::G - poseCount::Int - frameCounter::Int - poseStride::Int # pose every frameStride (naive pose trigger) - helpers::SLAMCommonHelper - solveSettings::ManageSolveSettings -end - -SLAMWrapperLocal(;dfg::G=initfg(), - poseCount::Int=0, - frameCounter::Int=0, - poseStride::Int=10, - helpers::SLAMCommonHelper=SLAMCommonHelper(), - solveSettings::ManageSolveSettings=ManageSolveSettings() ) where {G <: AbstractDFG}= SLAMWrapperLocal{G}(dfg, - poseCount, frameCounter, poseStride, helpers, solveSettings) -# - - - - +# Is this a general requirement? function updateSLAM!(slamw::SLAMWrapperLocal, syncHdlr) idxL, idxR, idxO = getSyncLatestPair(syncHdlr, weirdOffset=WEIRDOFFSET) if idxL == 0 @@ -207,13 +179,8 @@ function updateSLAM!(slamw::SLAMWrapperLocal, syncHdlr) # settransform!(vis[:poses][Symbol(newpose)], wTb) end - # FIXME - if slamw.poseCount % slamw.solveSettings.solveStride == 0 - @info "trigger a solve, $newpose, $(length(slamw.solveSettings.poseSolveToken.data)) =====================================" - put!(slamw.solveSettings.poseSolveToken, newpose) - @info "done put of $newpose" - # also update DRT containers - end + # check whether a solve should be trigger + checkSolveStrideTrigger!(slam) nothing end diff --git a/src/Caesar.jl b/src/Caesar.jl index eb68192e3..34f303c26 100644 --- a/src/Caesar.jl +++ b/src/Caesar.jl @@ -183,9 +183,13 @@ include("beamforming/SASUtils.jl") # conditional loading for ROS function __init__() - @require RobotOS="22415677-39a4-5241-a37a-00beabbbdae8" begin - @info "Loading Caesar ROS specific utilities (using RobotOS.jl)." - include("ros/Utils/RosbagSubscriber.jl") + @require PyCall="438e738f-606a-5dbb-bf0a-cddfbfd45ab0" begin + @info "Loading Caesar PyCall specific utilities (using PyCall)." + @eval using .PyCall + @require RobotOS="22415677-39a4-5241-a37a-00beabbbdae8" begin + @info "Loading Caesar ROS specific utilities (using RobotOS)." + include("ros/Utils/RosbagSubscriber.jl") + end end end diff --git a/src/ros/Utils/RosbagSubscriber.jl b/src/ros/Utils/RosbagSubscriber.jl index 1629d78f9..29a4af75d 100644 --- a/src/ros/Utils/RosbagSubscriber.jl +++ b/src/ros/Utils/RosbagSubscriber.jl @@ -1,15 +1,12 @@ -# not checking for python version, user should do so in calling script -# using Dates -using PyCall -export RosbagSubscriber +export RosbagSubscriber, loop! ## Load rosbag file parser pushfirst!(PyVector(pyimport("sys")."path"), @__DIR__ ) -rosbagReaderTemplate = pyimport("rosbagReader") -RosbagParser = rosbagReaderTemplate."RosbagParser" +rosbagReaderPy = pyimport("rosbagReader") +RosbagParser = rosbagReaderPy."RosbagParser" ## Common handler approach