Class: OroGen::ROS::Loader
- Inherits:
-
Loaders::Base
- Object
- Loaders::Base
- OroGen::ROS::Loader
- Defined in:
- lib/orogen/ros/loader.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#orogen_to_ros_mappings ⇒ Hash<String,String>
readonly
Mapping from typelib type names to the corresponding ROS message name.
-
#package_paths ⇒ Hash<String,String>
readonly
Mapping from a package name to its full path.
-
#packs ⇒ Object
readonly
Returns the value of attribute packs.
-
#ros_to_orogen_mappings ⇒ Hash<String,String>
readonly
Mapping from ROS message names to typelib type names.
-
#search_path ⇒ Object
readonly
Returns the value of attribute search_path.
-
#spec_file_suffix ⇒ String
The suffix of files that contain ROS package models.
Attributes inherited from Loaders::Base
#interface_typelist, #loaded_deployment_models, #loaded_projects, #loaded_task_models, #loaded_typekits, #project_load_callbacks, #registry, #root_loader, #typekit_load_callbacks, #typekits_by_type_name
Instance Method Summary collapse
- #clear ⇒ Object
-
#compatible_message_type?(message_type) ⇒ Boolean
Check if a given ROS message type can be accessed on this side.
-
#find_all_types_for(message_name) ⇒ Object
Get the list of oroGen types that can be used to communicate with a given ROS message name.
- #find_project_file_from_name(name) ⇒ Object
- #find_rosmap_by_package_name(name) ⇒ Object
- #has_project?(name) ⇒ Boolean
- #has_typekit?(name) ⇒ Boolean
-
#initialize(root_loader = self) ⇒ Loader
constructor
A new instance of Loader.
-
#load_all_rosmaps(typekits) ⇒ Object
Loads all known mappings from the oroGen types to the ROS messages.
- #load_rosmap_by_package_name(name) ⇒ Object
- #map_message_type_to_orogen(message_type) ⇒ Object
-
#project_model_from_name(name) ⇒ OroGen::Spec::Project
Returns the project model corresponding to the given name.
- #project_model_text_from_name(name) ⇒ Object
-
#register_package_path(package_name, path) ⇒ void
Manually registers the path to a package.
-
#roslaunch_find(package_name, name) ⇒ String
Finds the path to a given ROS launch file.
-
#rospack_find(package_name) ⇒ String
Find the path of a ros package.
- #to_s ⇒ Object
- #typekit_model_text_from_name(name) ⇒ Object
Methods inherited from Loaders::Base
#added_child, #define_dummy_types=, #define_dummy_types?, #deployed_task_model_from_name, #deployment_model_from_name, #each_available_project_name, #find_deployments_from_deployed_task_name, #find_project_from_deployment_name, #find_task_library_from_task_model_name, #has_loaded_project?, #has_loaded_typekit?, #imported_typekits_for, #inspect, #interface_type?, #intermediate_type?, #intermediate_type_for, #m_type?, #on_project_load, #on_typekit_load, #opaque_type_for, #project_model_from_text, #register_deployment_model, #register_project_model, #register_task_context_model, #register_type_model, #register_typekit_model, #remove_project_load_callback, #resolve_interface_type, #resolve_type, #task_library_model_from_name, #task_model_from_name, #typekit_model_from_name, #typelib_type_for
Constructor Details
#initialize(root_loader = self) ⇒ Loader
Returns a new instance of Loader
22 23 24 25 26 27 28 29 30 |
# File 'lib/orogen/ros/loader.rb', line 22 def initialize(root_loader = self) @spec_file_suffix = ".orogen" super(root_loader) root_loader.on_typekit_load do |tk| load_rosmap_by_package_name(tk.name) end end |
Instance Attribute Details
#orogen_to_ros_mappings ⇒ Hash<String,String> (readonly)
Returns mapping from typelib type names to the corresponding ROS message name
17 18 19 |
# File 'lib/orogen/ros/loader.rb', line 17 def orogen_to_ros_mappings @orogen_to_ros_mappings end |
#package_paths ⇒ Hash<String,String> (readonly)
Returns mapping from a package name to its full path. This is used as both a cache for ROS.rospack_find, and as a way to register paths for launchfiles on systems that do not have ROS installed
14 15 16 |
# File 'lib/orogen/ros/loader.rb', line 14 def package_paths @package_paths end |
#packs ⇒ Object (readonly)
Returns the value of attribute packs
5 6 7 |
# File 'lib/orogen/ros/loader.rb', line 5 def packs @packs end |
#ros_to_orogen_mappings ⇒ Hash<String,String> (readonly)
Returns mapping from ROS message names to typelib type names
20 21 22 |
# File 'lib/orogen/ros/loader.rb', line 20 def ros_to_orogen_mappings @ros_to_orogen_mappings end |
#search_path ⇒ Object (readonly)
Returns the value of attribute search_path
4 5 6 |
# File 'lib/orogen/ros/loader.rb', line 4 def search_path @search_path end |
#spec_file_suffix ⇒ String
Returns the suffix of files that contain ROS package models
9 10 11 |
# File 'lib/orogen/ros/loader.rb', line 9 def spec_file_suffix @spec_file_suffix end |
Instance Method Details
#clear ⇒ Object
32 33 34 35 36 37 38 39 |
# File 'lib/orogen/ros/loader.rb', line 32 def clear super @search_path = Array.new @packs = Array.new @package_paths = Hash.new @orogen_to_ros_mappings = Hash.new @ros_to_orogen_mappings = Hash.new end |
#compatible_message_type?(message_type) ⇒ Boolean
Check if a given ROS message type can be accessed on this side
At first call, it calls load_all_rosmaps to load all the known mappings
214 215 216 |
# File 'lib/orogen/ros/loader.rb', line 214 def () ros_to_orogen_mappings.has_key?() end |
#find_all_types_for(message_name) ⇒ Object
Get the list of oroGen types that can be used to communicate with a given ROS message name
At first call, it calls load_all_rosmaps to load all the known mappings
206 207 208 |
# File 'lib/orogen/ros/loader.rb', line 206 def find_all_types_for() ros_to_orogen_mappings[] || Set.new end |
#find_project_file_from_name(name) ⇒ Object
71 72 73 74 75 76 77 78 79 |
# File 'lib/orogen/ros/loader.rb', line 71 def find_project_file_from_name(name) search_path.each do |dir| file = File.join(dir, "#{name}#{spec_file_suffix}") if File.file?(file) return file end end nil end |
#find_rosmap_by_package_name(name) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/orogen/ros/loader.rb', line 43 def find_rosmap_by_package_name(name) OroGen::TypekitMarshallers::ROS.load_rosmap_by_package_name(name) rescue ArgumentError rescue Utilrb::PkgConfig::NotFound # Nothing installed, look into the pack_paths packs.each do |dir| rosmap_path = File.join(dir, "#{name}.rosmap") if File.file?(rosmap_path) return OroGen::TypekitMarshallers::ROS.load_rosmap(rosmap_path) end end nil end |
#has_project?(name) ⇒ Boolean
81 82 83 |
# File 'lib/orogen/ros/loader.rb', line 81 def has_project?(name) !!find_project_file_from_name(name) end |
#has_typekit?(name) ⇒ Boolean
85 86 87 |
# File 'lib/orogen/ros/loader.rb', line 85 def has_typekit?(name) false end |
#load_all_rosmaps(typekits) ⇒ Object
Loads all known mappings from the oroGen types to the ROS messages. Builds a reverse mapping as well
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/orogen/ros/loader.rb', line 183 def load_all_rosmaps(typekits) orogen_to_ros_mappings.clear ros_to_orogen_mappings.clear typekits.each do |name| find_rosmap_by_package_name(name) end rosmaps.each do |rosmap| orogen_to_ros_mappings.merge! rosmap rosmap.each do |type_name, ros_name, _| set = (ros_to_orogen_mappings[ros_name] ||= Set.new) set << type_name end end nil end |
#load_rosmap_by_package_name(name) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/orogen/ros/loader.rb', line 57 def load_rosmap_by_package_name(name) rosmaps = find_rosmap_by_package_name(name) return if !rosmaps rosmaps = [rosmaps, OroGen::TypekitMarshallers::ROS::DEFAULT_TYPE_TO_MSG] rosmaps.each do |rosmap| orogen_to_ros_mappings.merge! rosmap rosmap.each do |type_name, ros_name, _| set = (ros_to_orogen_mappings[ros_name] ||= Set.new) set << type_name end end end |
#map_message_type_to_orogen(message_type) ⇒ Object
173 174 175 176 177 178 179 |
# File 'lib/orogen/ros/loader.rb', line 173 def () orogen_types = find_all_types_for() if orogen_types.empty? raise ArgumentError, "there are not oroGen equivalent for #{}" end orogen_types.first end |
#project_model_from_name(name) ⇒ OroGen::Spec::Project
Returns the project model corresponding to the given name
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/orogen/ros/loader.rb', line 95 def project_model_from_name(name) if project = loaded_projects[name] return project end name = name.to_str text, path = project_model_text_from_name(name) ROS.info "loading model for ROS package #{name}" project = Spec::Package.new(root_loader, self) project.typekit = OroGen::Spec::Typekit.new(root_loader, name) # ROS packages don't have the same issue than oroGen, namely # there is no code generation so we don't need an intermediate # as oroGen needs project.__eval__(path, text) register_project_model(project) project end |
#project_model_text_from_name(name) ⇒ Object
116 117 118 119 120 121 122 |
# File 'lib/orogen/ros/loader.rb', line 116 def project_model_text_from_name(name) path = find_project_file_from_name(name) if !path raise OroGen::ProjectNotFound, "could not find an oroGen model for the ROS package #{name} in #{search_path.inspect}" end return File.read(path), path end |
#register_package_path(package_name, path) ⇒ void
This method returns an undefined value.
Manually registers the path to a package
131 132 133 |
# File 'lib/orogen/ros/loader.rb', line 131 def register_package_path(package_name, path) package_paths[package_name] = path end |
#roslaunch_find(package_name, name) ⇒ String
Finds the path to a given ROS launch file
160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/orogen/ros/loader.rb', line 160 def roslaunch_find(package_name, name) package_path = rospack_find(package_name) launchfile_name = "#{name}.launch" path = File.join(package_path, "launch", launchfile_name) alternative_path = File.join(package_path, launchfile_name) if File.file?(path) return path elsif File.file?(alternative_path) return alternative_path else raise ArgumentError, "package #{package_name} has no launch file #{launchfile_name} (looked for #{path} and #{alternative_path})" end end |
#rospack_find(package_name) ⇒ String
Find the path of a ros package
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/orogen/ros/loader.rb', line 137 def rospack_find(package_name) if path = package_paths[package_name] return path end # Look for it in the packs packs.each do |pack_dir| pkg_dir = File.join(pack_dir, package_name) if File.directory?(pkg_dir) package_paths[package_name] = pkg_dir return pkg_dir end end package_path = (`rospack find #{package_name}` || '').strip if package_path.empty? raise ArgumentError, "rospack cannot find package #{package_name}" end package_paths[package_name] = package_path end |
#to_s ⇒ Object
41 |
# File 'lib/orogen/ros/loader.rb', line 41 def to_s; "#<#{self.class.name} packs=#{packs.inspect} search_path=#{search_path.inspect}>" end |
#typekit_model_text_from_name(name) ⇒ Object
124 125 126 |
# File 'lib/orogen/ros/loader.rb', line 124 def typekit_model_text_from_name(name) raise OroGen::TypekitNotFound, "ROS packages define no typekits (was looking for #{name})" end |