Code Monkey home page Code Monkey logo

lcmcore.jl's Introduction

LCMCore: Low-level Julia bindings for LCM

Build Status codecov.io

LCMCore.jl provides a low-level Julia interface to the Lightweight Communications and Marshalling (LCM) library. It uses LCM by calling directly into the C library, so it should have very low overhead.

Note: This is not a full-fledged LCM implementation. Most notably, there is no lcm-gen tool to automatically generate Julia encoder/decoder functions for LCM message types. Fortunately, we provide a helpful Julia macro to automate most of the process.

Installation

The following package is required (Ubuntu 18.04):

sudo apt-get install libglib2.0-dev

From Julia, you can do:

Pkg.add("LCMCore")

Installing LCMCore.jl will automatically download and build a new copy of the LCM library for you.

Usage

This interface has been designed to be similar to the LCM Python interface.

Create an LCM interface object:

lcm = LCM()

Subscribe to a particular channel, using a callback:

function callback(channel::String, message_data::Vector{UInt8})
    @show channel
    @show message_data
end

subscribe(lcm, "MY_CHANNEL", callback)

Publish a raw byte array to a channel:

publish(lcm, "MY_CHANNEL", UInt8[1,2,3,4])

Receive a single message and dispatch its callback:

handle(lcm)

Asynchronous Handling

LCMCore.jl supports Julia's async model internally, so setting up an asynchronous handler task is as easy as:

@async while true
    handle(lcm)
end

Closing the LCM Object

Spawning lots of LCM objects can result in your system running out of file descriptors. This rarely occurs in practice, but if it does happen, you can close an LCM object with:

close(lcm)

It's safe to call close() multiple times on the same LCM object.

To deterministically close an LCM automatically, you can use the do-block syntax:

LCM() do lcm
    publish(lcm, channel, message)
end

which will automatically close the LCM object at the end of the block.

Message Types

Calling subscribe() with three arguments, like this: subscribe(lcm, channel, callback) will result in your callback being called with the raw byte array received by LCM. You are then responsible for decoding that byte array as a particular message type.

Since that's probably inconvenient, there's another way to call subscribe:

mutable struct MyMessageType
    <your code here>
end

function callback(channel::String, msg::MyMessageType)
    @show channel
    @show msg
end

subscribe(lcm, "MY_CHANNEL", callback, MyMessageType)

When subscribe() is called with the message type as the final argument, your callback will receive the decoded message directly, instead of the raw bytes.

To make this work, you have to define two methods, encode() and decode()

import LCMCore: encode, decode

encode(msg::MyMessageType) = <serialize your message as a Vector{UInt8}>

decode(data::Vector{UInt8}, ::Type{MyMessageType}) = <return an instance of MyMessageType from the given data>

Complex Message Types

Manually defining encode() and decode() functions is annoying, so we provide a convenient way to automate the process:

LCMCore.jl provides the LCMType abstract type and the @lcmtypesetup macro to make it easy to describe LCM message types in pure Julia. To use this approach, simply create a mutable struct which is a subtype of LCMType, and make sure that struct's field names and types match the LCM type definition. For a real-world example, check out CaesarLCMTypes.jl:

or for more detailed information, keep reading. For example, given this LCM type:

struct example_t {
  int64_t timestamp;
  double position[3];
  string name;
}

we would manually create the following Julia struct definition:

using LCMCore, StaticArrays

mutable struct example_t <: LCMType
  timestamp::Int64
  position::SVector{3, Float64}
  name::String
end

@lcmtypesetup(example_t)

The call to @lcmtypesetup(example_t) analyzes the field names and types of our Julia struct to generate efficient encode() and decode() methods. Note the use of SVectors from StaticArrays.jl to represent the fixed-length position array in the LCM type.

LCM types frequently contain variable-length vectors of primitives or other LCM types. For example, if we have the following LCM type definition:

struct example_vector_t {
  int32_t num_floats;
  float data[num_floats];

  int32_t num_examples;
  example_t examples[num_examples];
}

then we simply need to pass two additional arguments to @lcmtypesetup:

mutable struct example_vector_t <: LCMType
  num_floats::Int32
  data::Vector{Float32}

  num_examples::Int32
  examples::Vector{example_t}  # where example_t is the Julia struct we defined earlier
end

@lcmtypesetup(example_vector_t,
  data => (num_floats,),
  examples => (num_examples,)
)

The format of each additional argument to @lcmtypesetup is field_name => tuple_of_size_fields.

Multi-dimensional arrays are also supported, including arrays with some fixed dimensions and some variable dimensions:

struct matrix_example_t {
  int32_t rows;
  int32_t cols;
  float data[rows][cols];

  int32_t num_points;
  float coordinates[3][num_points];
}

in Julia, we would do:

mutable struct matrix_example_t <: LCMType
  rows::Int32
  cols::Int32
  data::Matrix{Float32}

  num_points::Int32
  coordinates::Matrix{Float32}
end

@lcmtypesetup(matrix_example_t,
  data => (rows, cols),
  coordinates => (3, num_points)
)

Reading LCM log files directly

LCM log files can also be read directly, without the UDP multicasting events. Events are read from file one at a time and use a similar API as the UDP traffic interface.

function callback(channel, msgdata)
  msg = decode(MsgType, msgdata) # slower, fresh memory allocation -- consider typedcallback(...) with decode! instead
  @show msg
  # ...
  nothing
end

function typed_callback(channel, msg::MsgType)
  @show msg
  # ...
  nothing
end

lcm = LCMLog("log.lcm")
#subscribe(lcm, "CHANNEL", callback )
subscribe(lcm, "CHANNEL", typed_callback, MsgType )

while true
  handle(lcm)
end

See the test folder for a more detailed example.

lcmcore.jl's People

Contributors

dehann avatar femtocleaner[bot] avatar gearsad avatar juliatagbot avatar rdeits avatar tkoolen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

lcmcore.jl's Issues

Broken on 0.6 due to `using Dates`

using Dates

julia> using LCMCore
INFO: Recompiling stale cache file /Users/twan/code/julia/RigidBodyDynamics/lib/v0.6/LCMCore.ji for module LCMCore.
ERROR: LoadError: ArgumentError: Module Dates not found in current path.
Run `Pkg.add("Dates")` to install the Dates package.
Stacktrace:
 [1] _require(::Symbol) at ./loading.jl:435
 [2] require(::Symbol) at ./loading.jl:405
 [3] include_from_node1(::String) at ./loading.jl:576
 [4] include(::String) at ./sysimg.jl:14
 [5] anonymous at ./<missing>:2
while loading /Users/twan/code/julia/RigidBodyDynamics/v0.6/LCMCore/src/LCMCore.jl, in expression starting on line 8
ERROR: Failed to precompile LCMCore to /Users/twan/code/julia/RigidBodyDynamics/lib/v0.6/LCMCore.ji.
Stacktrace:
 [1] compilecache(::String) at ./loading.jl:710
 [2] _require(::Symbol) at ./loading.jl:463
 [3] require(::Symbol) at ./loading.jl:405

BinDeps.jl finding system Python

Hi Robin,

We are fussing with build.jl, because we don't want to use system Python when installing lcm.

We came onto this because we would like to use python provided by .julia/v0.5/Conda. I think this is not happening. The possibly offending line above is grabbing system python via BinDeps.library_dependency.

please see output from @pvazteixeira below...

Problem building LCMCore from separate project

After #64, add LCMCore in a fresh project results in

ERROR: LoadError: SystemError: opening file "/Users/tkoolen/.julia/packages/LCMCore/6Feiw/deps/Project.toml": Permission denied

This is because deps/Project.toml is read-only, like every file unpacked from an added package, and write access to Project.toml is required to run update when the deps project is instantiated when there's no Manifest.toml.

Unsafe arrays change seems to break encode/decode in v0.5.2

When I use LCMCore with the latest code and I use the log playback, it throws an error when decoding the UInt array:

ERROR: LoadError: MethodError: no method matching decode(::UnsafeArrays.UnsafeArray{UInt8,1}, ::Type{brookstone_supertype_t})
Closest candidates are:
  decode(::Array{UInt8,1}, ::Type{T<:LCMType}) where T<:LCMType at /home/gearsad/.julia/dev/LCMCore/src/lcmtype.jl:355
Stacktrace:
 [1] onresponse(::LCMCore.RecvBuf, ::Ptr{UInt8}, ::LCMCore.SubscriptionOptions{brookstone_supertype_t,getfield(Main, Symbol("##9#10"))}) at /home/gearsad/.julia/dev/LCMCore/src/core.jl:154
 [2] handle(::LCMLog) at /home/gearsad/.julia/dev/LCMCore/src/readlog.jl:97
 [3] top-level scope at ./none:0
 [4] include_string(::Module, ::String, ::String) at ./loading.jl:1005
...

Ran the tests and they pass. I've jumped back to v0.5.1 and the issue goes away.

I'll try take a look this afternoon, but wanted to check if this rings any bells? It seems to be related to the new UnsafeArrays code.

python was not found in the pkg-config search path

The build fails on ArchLinux :(
I get

Package python was not found in the pkg-config search path.
Perhaps you should add the directory containing `python.pc'
to the PKG_CONFIG_PATH environment variable
No package 'python' found

It seems that pkg-config does not work for python but works for python3 and python2.

$ pkg-config --cflags python 
Package python was not found in the pkg-config search path.
Perhaps you should add the directory containing `python.pc'
to the PKG_CONFIG_PATH environment variable
No package 'python' found
$ pkg-config --cflags python3
-I/usr/include/python3.6m
$ pkg-config --cflags python2
-I/usr/include/python2.7

If I remove the validator for python then the build completes successfully.
Would it be appropriate to check for python, python2 and python3 in the validator and return true if at least one works ?

Access to undefined reference when resizing vector-of-vectors

I have the following two message types:

mutable struct polynomial_t <: LCMType
    timestamp::Int64
    num_coefficients::Int32
    coefficients::Vector{Float64}
end

@lcmtypesetup(polynomial_t,
    (coefficients, 1) => num_coefficients,
)

mutable struct polynomial_matrix_t <: LCMType
    timestamp::Int64
    rows::Int32
    cols::Int32
    polynomials::Vector{Vector{polynomial_t}}
end

@lcmtypesetup(polynomial_matrix_t,
    (polynomials, 1) => rows,
    (polynomials, 2) => cols
)

If I try to resize a polynomial_matrix_t as follows:

m = LCMPolynomials.polynomial_matrix_t()
m.rows = 1
m.cols = 1
LCMCore.resize!(m)

then I get this error:

UndefRefError: access to undefined reference

Stacktrace:
 [1] resizevec! at /home/rdeits/.julia/v0.6/LCMCore/src/lcmtype.jl:181 [inlined]
 [2] macro expansion at /home/rdeits/.julia/v0.6/LCMCore/src/lcmtype.jl:172 [inlined]
 [3] resize!(::LCMPolynomials.polynomial_matrix_t) at /home/rdeits/.julia/v0.6/LCMCore/src/lcmtype.jl:166
 [4] LCMPolynomials.polynomial_matrix_t(::Array{TypedPolynomials.Polynomial{Int64,TypedPolynomials.Term{Int64,TypedPolynomials.Monomial{(t,),1}},Array{TypedPolynomials.Term{Int64,TypedPolynomials.Monomial{(t,),1}},1}},2}, ::Int64) at /home/rdeits/.julia/v0.6/LCMPolynomials/src/LCMPolynomials.jl:58
 [5] LCMPolynomials.polynomial_matrix_t(::Array{TypedPolynomials.Polynomial{Int64,TypedPolynomials.Term{Int64,TypedPolynomials.Monomial{(t,),1}},Array{TypedPolynomials.Term{Int64,TypedPolynomials.Monomial{(t,),1}},1}},1}) at /home/rdeits/.julia/v0.6/LCMPolynomials/src/LCMPolynomials.jl:67
 [6] include_string(::String, ::String) at ./loading.jl:522

@tkoolen should I just not be doing that? Or is this a bug?

Ubuntu 16.04 compiling issues with hamcrest

Hi @rdeits ,

Have you maybe seen an LCM compile issue with the hamcrest dependency? As far as I can trace it maybe an openjdk-7or 8 issue. Are you on openjdk-6 or later?

EDIT: I should add, I tried this for several lcm-proj/lcm master branches from March 2017 through August, but they all have the same issue.

Please see the issue I posted at lcm-proj/lcm#192.

This is what I get for a new LCMCore.jl install.

$ uname -r
4.10.0-33-generic

$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-9-openjdk-amd64/bin/java       1091      auto mode
* 1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  3            /usr/lib/jvm/java-9-openjdk-amd64/bin/java       1091      manual mode
julia> versioninfo()
Julia Version 0.6.0
Commit 9036443 (2017-06-19 13:05 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Prescott)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, broadwell)

julia> Pkg.build("LCMCore")
INFO: Building CMakeWrapper
INFO: Building LCMCore
WARNING: Compat.ASCIIString is deprecated, use String instead.
  likely near /home/dehann/.julia/v0.6/LCMCore/deps/build.jl:72
INFO: Attempting to Create directory /home/dehann/.julia/v0.6/LCMCore/deps/downloads
INFO: Directory /home/dehann/.julia/v0.6/LCMCore/deps/downloads already created
INFO: Downloading file https://github.com/lcm-proj/lcm/archive/9e53469cd0713ca8fbf37a968f6fd314f5f11584.zip
INFO: Done downloading file https://github.com/lcm-proj/lcm/archive/9e53469cd0713ca8fbf37a968f6fd314f5f11584.zip
INFO: Attempting to Create directory /home/dehann/.julia/v0.6/LCMCore/deps/src
INFO: Directory /home/dehann/.julia/v0.6/LCMCore/deps/src already created
INFO: Attempting to Create directory /home/dehann/.julia/v0.6/LCMCore/deps
INFO: Directory /home/dehann/.julia/v0.6/LCMCore/deps already created
INFO: Path /home/dehann/.julia/v0.6/LCMCore/deps/src/lcm-9e53469cd0713ca8fbf37a968f6fd314f5f11584 already created
INFO: Attempting to Create directory /home/dehann/.julia/v0.6/LCMCore/deps/builds/lcm
INFO: Directory /home/dehann/.julia/v0.6/LCMCore/deps/builds/lcm already created
INFO: Changing Directory to /home/dehann/.julia/v0.6/LCMCore/deps/builds/lcm
INFO: Changing Directory to /home/dehann/.julia/v0.6/LCMCore/deps/builds/lcm
org/hamcrest/core/AllOf.java:60: error: no suitable method found for allOf(List<Matcher<? super T#1>>)
        return allOf(Arrays.asList(matchers));
               ^
    method AllOf.<T#2>allOf(Iterable<Matcher<? super T#2>>) is not applicable
      (inference variable T#3 has incompatible bounds
        equality constraints: Matcher<? super CAP#1>
        lower bounds: Matcher<? super T#1>)
    method AllOf.<T#1>allOf(Matcher<? super T#1>...) is not applicable
      (no instance(s) of type variable(s) T#3 exist so that List<T#3> conforms to Matcher<? super T#1>)
    method AllOf.<T#4>allOf(Matcher<? super T#4>,Matcher<? super T#4>) is not applicable
      (cannot infer type-variable(s) T#4
        (actual and formal argument lists differ in length))
    method AllOf.<T#5>allOf(Matcher<? super T#5>,Matcher<? super T#5>,Matcher<? super T#5>) is not applicable
      (cannot infer type-variable(s) T#5
        (actual and formal argument lists differ in length))
    method AllOf.<T#6>allOf(Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>) is not applicable
      (cannot infer type-variable(s) T#6
        (actual and formal argument lists differ in length))
    method AllOf.<T#7>allOf(Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>) is not applicable
      (cannot infer type-variable(s) T#7
        (actual and formal argument lists differ in length))
    method AllOf.<T#8>allOf(Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>) is not applicable
      (cannot infer type-variable(s) T#8
        (actual and formal argument lists differ in length))
  where T#1,T#2,T#3,T#4,T#5,T#6,T#7,T#8 are type-variables:
    T#1 extends Object declared in method <T#1>allOf(Matcher<? super T#1>...)
    T#2 extends Object declared in method <T#2>allOf(Iterable<Matcher<? super T#2>>)
    T#3 extends Object declared in method <T#3>asList(T#3...)
    T#4 extends Object declared in method <T#4>allOf(Matcher<? super T#4>,Matcher<? super T#4>)
    T#5 extends Object declared in method <T#5>allOf(Matcher<? super T#5>,Matcher<? super T#5>,Matcher<? super T#5>)
    T#6 extends Object declared in method <T#6>allOf(Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>)
    T#7 extends Object declared in method <T#7>allOf(Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>)
    T#8 extends Object declared in method <T#8>allOf(Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object super: T#1 from capture of ? super T#1
org/hamcrest/core/AnyOf.java:50: error: no suitable method found for anyOf(List<Matcher<? super T#1>>)
        return anyOf(Arrays.asList(matchers));
               ^
    method AnyOf.<T#2>anyOf(Iterable<Matcher<? super T#2>>) is not applicable
      (inference variable T#3 has incompatible bounds
        equality constraints: Matcher<? super CAP#1>
        lower bounds: Matcher<? super T#1>)
    method AnyOf.<T#1>anyOf(Matcher<? super T#1>...) is not applicable
      (no instance(s) of type variable(s) T#3 exist so that List<T#3> conforms to Matcher<? super T#1>)
    method AnyOf.<T#4>anyOf(Matcher<T#4>,Matcher<? super T#4>) is not applicable
      (cannot infer type-variable(s) T#4
        (actual and formal argument lists differ in length))
    method AnyOf.<T#5>anyOf(Matcher<T#5>,Matcher<? super T#5>,Matcher<? super T#5>) is not applicable
      (cannot infer type-variable(s) T#5
        (actual and formal argument lists differ in length))
    method AnyOf.<T#6>anyOf(Matcher<T#6>,Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>) is not applicable
      (cannot infer type-variable(s) T#6
        (actual and formal argument lists differ in length))
    method AnyOf.<T#7>anyOf(Matcher<T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>) is not applicable
      (cannot infer type-variable(s) T#7
        (actual and formal argument lists differ in length))
    method AnyOf.<T#8>anyOf(Matcher<T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>) is not applicable
      (cannot infer type-variable(s) T#8
        (actual and formal argument lists differ in length))
  where T#1,T#2,T#3,T#4,T#5,T#6,T#7,T#8 are type-variables:
    T#1 extends Object declared in method <T#1>anyOf(Matcher<? super T#1>...)
    T#2 extends Object declared in method <T#2>anyOf(Iterable<Matcher<? super T#2>>)
    T#3 extends Object declared in method <T#3>asList(T#3...)
    T#4 extends Object declared in method <T#4>anyOf(Matcher<T#4>,Matcher<? super T#4>)
    T#5 extends Object declared in method <T#5>anyOf(Matcher<T#5>,Matcher<? super T#5>,Matcher<? super T#5>)
    T#6 extends Object declared in method <T#6>anyOf(Matcher<T#6>,Matcher<? super T#6>,Matcher<? super T#6>,Matcher<? super T#6>)
    T#7 extends Object declared in method <T#7>anyOf(Matcher<T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>,Matcher<? super T#7>)
    T#8 extends Object declared in method <T#8>anyOf(Matcher<T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>,Matcher<? super T#8>)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object super: T#1 from capture of ? super T#1
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
make[2]: *** [test/java/hamcrest-core-1.3/CMakeFiles/hamcrest-core.dir/java_compiled_hamcrest-core] Error 1
make[1]: *** [test/java/hamcrest-core-1.3/CMakeFiles/hamcrest-core.dir/all] Error 2
make: *** [all] Error 2
===========================================================================[ ERROR: LCMCore ]============================================================================

LoadError: failed process: Process(setenv(`/home/dehann/.julia/v0.6/CMakeWrapper/deps/usr/bin/cmake --build . --target install`,String["PATH=/home/dehann/.julia/v0.6/LCMCore/deps/usr/bin:/home/dehann/bin:/home/dehann/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin", "DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path", "QT_ACCESSIBILITY=1", "UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1157", "UPSTART_JOB=unity-settings-daemon", "DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-hscsYw6aFK", "XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0", "XDG_SESSION_DESKTOP=ubuntu", "XDG_SESSION_TYPE=x11", "USER=dehann", "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg", "QT_IM_MODULE=ibus", "LESSCLOSE=/usr/bin/lesspipe %s %s", "SESSIONTYPE=gnome-session", "INSTANCE=Unity", "GDMSESSION=ubuntu", "CLUTTER_IM_MODULE=xim", "XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop", "LESSOPEN=| /usr/bin/lesspipe %s", "SHELL=/bin/bash", "XDG_SEAT=seat0", "XAUTHORITY=/home/dehann/.Xauthority", "INTELOPENCLSDK=/opt/intel/opencl/SDK", "GTK_MODULES=gail:atk-bridge:unity-gtk-module", "GNOME_KEYRING_PID=", "GTK_IM_MODULE=ibus", "QT_QPA_PLATFORMTHEME=appmenu-qt5", "XMODIFIERS=@im=ibus", "TERM=xterm-256color", "HOME=/home/dehann", "VTE_VERSION=4205", "GTK2_MODULES=overlay-scrollbar", "IM_CONFIG_PHASE=1", "COMPIZ_CONFIG_PROFILE=ubuntu", "UPSTART_INSTANCE=", "XDG_CURRENT_DESKTOP=Unity", "LANG=en_US.UTF-8", "SHLVL=1", "GNOME_DESKTOP_SESSION_ID=this-is-deprecated", "LOGNAME=dehann", "XDG_RUNTIME_DIR=/run/user/1000", "SSH_AUTH_SOCK=/run/user/1000/keyring/ssh", "DESKTOP_SESSION=ubuntu", "GDM_LANG=en_US", "OLDPWD=/home/dehann/.julia/lib", "_=/usr/bin/julia060", "GPG_AGENT_INFO=/home/dehann/.gnupg/S.gpg-agent:0:1", "PWD=/home/dehann/.julia/lib/v0.6", "DISPLAY=:0", "UPSTART_EVENTS=started starting", "LANGUAGE=en_US", "XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/dehann", "XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0", "XDG_VTNR=7", "WINDOWID=67148653", "MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path", "XDG_SESSION_ID=c2", "PKG_CONFIG_PATH=/opt/intel/opencl:", "QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1", "QT4_IM_MODULE=xim", "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:", "GNOME_KEYRING_CONTROL=", "JOB=gnome-session", "OPENBLAS_MAIN_FREE=1"]), ProcessExited(2)) [2]
while loading /home/dehann/.julia/v0.6/LCMCore/deps/build.jl, in expression starting on line 72

=========================================================================================================================================================================

============================================================================[ BUILD ERRORS ]=============================================================================

WARNING: LCMCore had build errors.

 - packages with build errors remain installed in /home/dehann/.julia/v0.6
 - build the package(s) and all dependencies with `Pkg.build("LCMCore")`
 - build a single package by running its `deps/build.jl` script

=========================================================================================================================================================================

Thanks for any input!

New release

We should release a new version with the updated LCMType interface. @tkoolen the old API of defining fingerprint(), resize!(), etc. still works, right? So I think this can be a patch release rather than a minor version.

Memory leak in event handling of readlog.jl

Right now there's no call to liblcm implementation of lcm_eventlog_free_event .

I've currently manually implemented it as:

function lcm_event_destroy(event::Ptr{LCMCore.lcm_eventlog_event_t})
    ccall(
    (:lcm_eventlog_free_event, LCMCore.liblcm),
    Cvoid,
    (Ptr{LCMCore.lcm_eventlog_event_t}, ),
    event
    )
end

But otherwise, when iterating event by event through a log file, the allocated memory is never cleared.

TagBot trigger issue

This issue is used to trigger TagBot; feel free to unsubscribe.

If you haven't already, you should update your TagBot.yml to include issue comment triggers.
Please see this post on Discourse for instructions and more details.

If you'd like for me to do this for you, comment TagBot fix on this issue.
I'll open a PR within a few hours, please be patient!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.