class TransformerStatusWindow

Attributes

bad_frame_warnings[R]
main_layout[R]
rbs_cache[R]
rbs_editors[R]
rbs_setter_toolbox[R]
reference_frame[R]
reload_button[R]
vizkit3d[R]

Public Class Methods

new(parent = nil, options = Hash.new) click to toggle source
Calls superclass method
# File bin/rock-transformer, line 106
def initialize(parent = nil, options = Hash.new)
    options = Kernel.validate_options options,
        live: false

    @live = options[:live]
    @reference_frame = "world_osg"
    @rbs_cache = Hash.new
    @rbs_editors = Hash.new
    @bad_frame_warnings = Set.new
    super(parent)
    create_ui
end

Public Instance Methods

create_ui() click to toggle source
# File bin/rock-transformer, line 121
def create_ui
    @main_layout = Qt::VBoxLayout.new(self)
    splitter = Qt::Splitter.new
    main_layout.add_widget(splitter)

    @rbs_setter_toolbox = Qt::ToolBox.new
    splitter.add_widget(rbs_setter_toolbox)

    right_pane = Qt::Widget.new
    layout   = Qt::VBoxLayout.new(right_pane)
    @vizkit3d = Vizkit.vizkit3d_widget
    vizkit3d.use_transformer_broadcaster = false
    vizkit3d.setAxes(false)
    @reload_button = Qt::PushButton.new("Reload")
    reload_button.connect(SIGNAL("clicked()")) do
        reload
    end
    vizkit3d.setTransformer(true)
    layout.add_widget(reload_button)
    layout.add_widget(vizkit3d)
    splitter.add_widget(right_pane)

end
load_conf(path) click to toggle source
# File bin/rock-transformer, line 153
def load_conf(path)
    conf = Transformer::Configuration.new
    begin
        conf.load(path)
        bad_frame_warnings.clear
    rescue Exception => e
        Qt::MessageBox.warning(nil, "Load Error", "Error loading #{path}: #{e.message}")
        return
    end

    conf.each_example_transform do |trsf|
        vizkit3d.setTransformation(trsf.to.dup, trsf.from.dup, trsf.translation.to_qt, trsf.rotation.to_qt)
    end

    conf.each_static_transform do |trsf|
        vizkit3d.setTransformation(trsf.to.dup, trsf.from.dup, trsf.translation.to_qt, trsf.rotation.to_qt)
    end

    conf.each_dynamic_transform do |trsf|
        *task, port = *trsf.producer.split('.')
        task = task.join(".")

        cache_key = [trsf.from, trsf.to]

        rbs = rbs_cache[cache_key]
        if !rbs
            example = conf.example_transform_for(trsf.from, trsf.to)

            rbs = Types::Base::Samples::RigidBodyState.Invalid
            rbs.sourceFrame = trsf.from
            rbs.targetFrame = trsf.to
            rbs.position = example.translation
            rbs.orientation = example.rotation
            rbs_cache[cache_key] = rbs
        end
        vizkit3d.setTransformation(trsf.to.dup, trsf.from.dup, rbs.position.to_qt, rbs.orientation.to_qt)

        rbs_editor = rbs_editors[cache_key]
        if !rbs_editor
            widget = Qt::Widget.new
            layout = Qt::VBoxLayout.new(widget)
            rbs_editor = TransformEditor.new(trsf.producer, trsf.from, trsf.to, widget)
            layout.add_widget rbs_editor
            layout.add_stretch

            rbs_editor.connect(SIGNAL('valueChanged(QVector3D,QQuaternion)')) do |pos, rot|
                rbs.position = Eigen::Vector3.new(pos.x, pos.y, pos.z)
                rbs.orientation = Eigen::Quaternion.new(rot.scalar, rot.x, rot.y, rot.z)
                vizkit3d.setTransformation(trsf.to.dup, trsf.from.dup, pos, rot)
            end
            rbs_editors[cache_key] = rbs_editor
            rbs_setter_toolbox.add_item widget, "#{trsf.from}>#{trsf.to}"
        end

        if live?
            Orocos::Async.proxy(task).port(port).on_data do |sample|
                if trsf.from != sample.sourceFrame || trsf.to != sample.targetFrame
                    if !bad_frame_warnings.include?(trsf.producer)
                        Qt::MessageBox.warning(self, 'rock-transformer', "Received sample from #{task}.#{port} for #{sample.sourceFrame} => #{sample.targetFrame}.\nExpected #{trsf.from} => #{trsf.to} instead.\nThere will be no further warnings about this problem until you reload the configuration file.")
                        bad_frame_warnings << trsf.producer
                    end
                end
                rbs_editor.update(sample.position.to_qt, sample.orientation.to_qt)
                vizkit3d.setTransformation(sample.targetFrame.dup, sample.sourceFrame.dup, sample.position.to_qt, sample.orientation.to_qt)
            end
        end

    end

    @current_conf_path = path
end
reference_frame=(frame) click to toggle source
# File bin/rock-transformer, line 147
def reference_frame=(frame)
    @reference_frame = frame
    vizkit3d.setPluginDataFrame(frame.dup, vizkit3d.grid)
    vizkit3d.setVisualizationFrame(frame.dup)
end
reload() click to toggle source
# File bin/rock-transformer, line 225
def reload
    while rbs_setter_toolbox.count > 0
        rbs_setter_toolbox.remove_item 0
    end
    rbs_editors.clear

    if @current_conf_path
        load_conf(@current_conf_path)
    end
end