Readers
The Reader parent class takes information from the HV Robot and writes it to a ROS topic.
The Reader classes publish data to a topic, each class only publishes to a single topic. Data to be published is taken from the probe data that is stored as a class dict variable, then it is formatted into the data type for that probe and published. Publishing is done while the main loop is running at a set interval (default 100hz). All of the Reader child classes have a publish method and are all called together at the beginning of each loop.
Data is read in semi-asynchronously from the Listener thread on the client application. Probe messages are decoded and stored in all child classes that are set to need that given data.
Creating A Reader
Reader child classes are put in the Sensors
directory and the classes that are in that directory should be used as reference when creating a new sensor service.
Creating the class
To create a new function to send data to the HV Robot, the Writer class must be extended. the child class needs to have a __init__()
function where the subscriber is defined and the probe name is passed to the parent constructor; and a callback
function where the data is formatted to be passed to the robot over the probes.
Formatting the data
The writer will take either a list of messages or a single message. if you send a single message, and there is only a single probe associated with the class, then a single probe-message tuple is created, if there are multiple probes associated with this class, then each probe is sent the same message. If a message array is passed and there are multiple probes defined, then the two arrays will be zipped together, and if they are not the same length then it will raise an exception. messages are associated to probes sequentially, so data at index 0 is paired with probe at index 0.
Adding to options
All new controller classes need to be added to the options in the parser controller argument, and subsequently to the all services list as well as the controllers list in main_node.py
. This requires creating an Enum value for the controller as well as defining it as a variable in config.py
. finally the class needs to be added to the cmdr list in the hv_client.py
constructor.