= API review =

Proposer: '''Tully'''

Present at review:
 *Ken
 *Radu

== Question / concerns / comments ==
Enter your thoughts on the API and any questions / concerns you have here.  Please sign your name.  Anything you want to address in the API review should be marked down here before the start of the meeting.

== Meeting agenda ==
=== General theory ===
Nodelets look like nodes to everyone except ros
they each get a namespace at the default level.  Parameters are loaded into their ~ namespace. Remappings are applied to their specific NodeHandles at load, and not to the entire process.  

=== Launch Syntax ===
Existing roslaunch syntax.
{{{
<launch>
<node>
<machine>
<include>
<remap>
<env>
<param>
<rosparam>
<group>
<test>
}}}

proposed yaml syntax for nodelets
{{{
normal_estimator:
  type: NormalEstmator
  params:
    min_area: 3
    max_area; 4
  remap:
  - from:~/input_cloud
    to: pcd_cloud
  - from: ~/output_normals
    to: normals
ground_plane_removal:
  type: GroundPlaneFilter
  params:
    tolerance: 5
    something_complicated: {a:'b', c:'d'}
  remap:
  - from: ~/input_cloud
    to: pcd_cloud
  - from: ~/input_normals
    to: normals
  - from: ~/output_cloud
    to: ground_free_cloud
}}}
Alternative to be more roslaunch like
{{{
nodelets:
- name: foo
  type: bar
  params: 
    many: here
  remap:
  - from: a
    to: b
- name: foo2
  type: bar
  params: 
    many: here
  remap:
  - from: a
    to: b
}}}
For launching you can use spawner style syntax: so you bring up node "manager"
and then use 
{{{
nodelet_spawner "manager" nodelet_name NodeletType parameter_file.yaml remappings.yaml
}}}

Or yaml_file config based
{{{
nodelet load nodelet_name yaml_file.yaml [manager]
nodelet load  "manager" nodelet_name NodeletType parameter_file.yaml remapping_file
nodelet start nodelet_name
}}}
to stop
{{{
nodelet stop nodelet_name
nodelet unload nodelet_name
}}}

Comments:
Ken: 
 * global namespace for nodelets is going to be a naming issue.  Doing package - Nodelet_name. 
 * keep top level unclaimed so you can add misc things and can include/combine functionality.
 * can use !Type declarations to declare a new type, something like:
{{{
!! nodelet:
  type: 
  pkg: 
  name: 
  manager:
  
}}}


{{{
!node
  ns: this is the only support namespaces no groups
!param
!nodelet
!include
  ns: 
  file: 

}}}
This is better due to being able to concatenate

pluginlib abstract package/name for Type to avoid namespace collisions

For now push parameters up and then point manager to namespace by service call. make parameters in private namespace, not ~/params


== Conclusion ==
Package status change  mark change manifest)
 * /!\ Action items that need to be taken.
 * {X} Major issues that need to be resolved

----
## PackageReviewCategory