GithubHelp home page GithubHelp logo

strands-project / mongodb_store Goto Github PK

View Code? Open in Web Editor NEW
48.0 34.0 72.0 822 KB

MongoDB tools for storing and analysing runs of ROS systems.

License: BSD 3-Clause "New" or "Revised" License

Makefile 2.86% C++ 25.34% Lua 0.94% CMake 8.81% Python 62.04%

mongodb_store's Introduction

mongodb_store

This package wraps up MongoDB database server in ROS, allowing it to be used to store configuration parameters.

See mongodb_store/README.md for further details

mongodb_store's People

Stargazers

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

Watchers

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

mongodb_store's Issues

gtest doesn't work on build farm

the gtests in ros_datacentre don't qualify as unit tests as they need a mongodb running on a specific port. This fails on the build farm. It should be removed or not be enabled by default, IMO.

Fail to create ROS message from stored Mongo document

The MessageStore proxy can't recreate ROS messages when they include a list of ROS types. For example, trying to store a geometry_msgs/Polygon fails because it containts a list of Point32:

geometry_msgs/Polygon tabletop
  geometry_msgs/Point32[] points
    float32 x
    float32 y
    float32 z

The message is stored ok in the database, but when recreated the points list is created as a list of python dictionaries not a list of ROS messages.

The problem is in util.py, line 150, only dicitionaries are expanded into the message. We need something like:

 elif isinstance(value, list):
            lst=[]
            for i in value:
                msg = tp_of_msg()
                fill_message(msg, i)
                lst.append(msg)
            setattr(message, slot, lst)    

finding the type of the message that should be in the list could be done by looking at the _slot_types field of the message class, but then primitive types - eg. list of ints - would need special attention....

init_node issue when logging all topics

When running and trying to log all topics, e.g.

rosrun mongodb_log mongodb_log.py -a

I sew a weird issues that makes it look like init_node is getting called twice, even though these calls appear to be coming from separate processes

Process WorkerProcess-   0-/test2:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/nah/code/hydro_ws/src/ros_datacentre/mongodb_log/scripts/mongodb_log.py", line 171, in run
    self.init()
  File "/Users/nah/code/hydro_ws/src/ros_datacentre/mongodb_log/scripts/mongodb_log.py", line 155, in init
    rospy.init_node(worker_node_name, anonymous=False)
  File "/opt/ros/hydro/lib/python2.7/site-packages/rospy/client.py", line 273, in init_node
    raise rospy.exceptions.ROSException("rospy.init_node() has already been called with different arguments: "+str(_init_node_args))
ROSException: rospy.init_node() has already been called with different arguments: ('mongodb_log', ['/Users/nah/code/hydro_ws/src/ros_datacentre/mongodb_log/scripts/mongodb_log.py', '-a'], True, None, False, False)

If I run with explicitly provided topics, this doesn't happen.

Log viewer

  • probably based on logmx with a mongodb LogManager

update method using id

We have update and update queried by name, but we should also add update based on id.

  • update_id in python
  • updateID in c++

Snapshot

I'd like to be able to store a 'snapshot' of all sensors on the robot, straight to the datacentre. To do this I thought I'd just create a new node that provides a single service '/take_snapshot', returning a list of message types and their ObjectId s from the db. (Using MessageStore)

Do we already have this? It is related to the idea of always storing the last X amount of time of the sensors, but I don't think we run the logging. Regardless, I don't want these snapshots to be auto cleaned up...

Authentication

In order to use our external database for replication, the ros_datacentre needs to support authentication. At least for the replication to work this is crucial, but also in general, it seems to be a good idea to support authentication, right?

Add test mode to datacentre

The datacentre will also need a test mode where it creates its own local directory for storage, rather than assuming a global one. Needed due to #75.

Is the message_store ROS service necessary?

I have the ROS message store service which adds/reads ROS msg types to the db in a standard form. This is called by MessageStoreProxy in both C++ and Python. However, as both language can access MongoDB directly then then don't really need to use this service and the MessageStoreProxy can access the db rather than use the service. I suggest that I remove the ROS service for now and refactor the proxy classes to use the respective MongoDB drivers directly, saving time and effort.

[mongodb_store_cpp_client] installed include dir not at correct place

@ToMadoRe installed the mongodb_store package (removing src folder and install it via apt-get), but there is something wrong:

In file included from /opt/strands/strands_catkin_ws/src/scitos_3d_mapping/cloud_merge/src/cloud_merge_node.cpp:1:0:
/opt/strands/strands_catkin_ws/src/scitos_3d_mapping/cloud_merge/include/cloud_merge_node.h:15:41: fatal error: mongodb_store/message_store.h: No such file or directory

I found in mongodb_store_cpp_client's CMakeLists.txt the following:

# Mark cpp header files for installation
install(DIRECTORY include/mongodb_store/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

That obviously invalidates the install includes as they are being installed into /opt/ros/hydro/include/mongodb_store_cpp_client while they are expected in /opt/ros/hydro/include/mongodb_store currently.

As per ROS standard, they files should indeed be in a subdir having the same name as the package. So, the CMakeLists.txt should have this instead:

## Mark cpp header files for installation
install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
)

But that requires quite some changes I supposed. So that's why I didn't fix it straight away and also @hawesie had plans to dissolve mongodb_store_cpp_client anyway. So this should be taken into account for that.

datacentre looks in wrong place for db

With the new changes, the db default directory in now /opt/ros/ros_datacentre, so when I tried to launch the datacentre I had the following:

[ERROR] [WallTime: 1393519830.399731] Can't find database at supplied path /opt/ros/ros_datacentre. If this is a new DB, create it as an empty directory.

Also, is it good to change the db to /opt/ros, which is owned by root instead of keeping it /opt/strands?

[message_store] update method for message_store

The message_store service needs an update method for documents which match a given query. I will add an optional "upsert" parameter which adds the document if it doesn't match the query.

move default parameter store

I think if it's going to be in the rosdistro the parameter files should not be stored inside the package but have a configurable path to read the files from. Also the twitter thing should be removed.
Maybe we can have a separate repository for default parameters or put them in scitos_common or similar.

insertNamed with duplicate name

If insert_named is called twice with the same name, then two entries will be created but with the same _meta.name fields. Should this really do an update_named instead, i.e. change the value associated with the name when the second call is made?

[replicator_node] Dies if datacentre is not starting fast enough

It seems the replicator node dies if the datacentre is not yet launched:

Traceback (most recent call last):
  File "/opt/strands/strands_hydro_ws/src/ros_datacentre/ros_datacentre/scripts/replicator_node.py", line 138, in <module>
    store = Replicator()
  File "/opt/strands/strands_hydro_ws/src/ros_datacentre/ros_datacentre/scripts/replicator_node.py", line 26, in __init__
    raise Exception("No master datacentre found using datacentre_host and datacentre_port")
Exception: No master datacentre found using datacentre_host and datacentre_port

If possible it should wait I guess.

waypoint patroller cannot read points from the database

I worked around the previous issue (#12), but now the waypoint patroller fails qwhen trying to read waypoints from the db. The points are loaded:

[INFO] [WallTime: 1393520870.965665] Executing waypoint_patroller with infinite iterations
[u'bham_lg_2', u'experiment_old', u'bham_lg', u'lg_20131115']
{u'msg': {u'position': {u'y': -0.03708092123270035, u'x': -1.1083921194076538, u'z': -6.938890181594472e-18}, u'orientation': {u'y': 2.6213803350216835e-10, u'x': -3.7215392989509155e-09, u'z': 0.0013660155236721039, u'w': 0.9999990463256836}}, u'_id': ObjectId('528623ee9f9d510d03f36041'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'charging_point'}}
{u'msg': {u'position': {u'y': 2.121365547180176, u'x': -3.2858550548553467, u'z': 3.469449847085758e-18}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': -0.7273542284965515, u'w': 0.6862621903419495}}, u'_id': ObjectId('528623ee9f9d510d03f36042'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point1'}}
{u'msg': {u'position': {u'y': 4.1647419929504395, u'x': -8.897640228271484, u'z': 0.0}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': 0.043129079043865204, u'w': 0.9990695118904114}}, u'_id': ObjectId('528623ee9f9d510d03f36043'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point2'}}
{u'msg': {u'position': {u'y': 4.084351062774658, u'x': 3.36057710647583, u'z': -6.938890181594472e-18}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': 0.9995426535606384, u'w': -0.030241088941693306}}, u'_id': ObjectId('528623ee9f9d510d03f36044'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point3'}}
{u'msg': {u'position': {u'y': -6.623464107513428, u'x': -3.677525520324707, u'z': 3.469449847085758e-18}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': 0.08845590800046921, u'w': 0.9960801005363464}}, u'_id': ObjectId('528623ee9f9d510d03f36045'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point4'}}
{u'msg': {u'position': {u'y': -16.309810638427734, u'x': -3.43082332611084, u'z': 3.469449847085758e-18}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': 0.6670852899551392, u'w': 0.7449813485145569}}, u'_id': ObjectId('528623ee9f9d510d03f36046'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point5'}}
{u'msg': {u'position': {u'y': -17.85886001586914, u'x': -8.225255966186523, u'z': 3.469449847085758e-18}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': -0.02189410664141178, u'w': 0.9997602701187134}}, u'_id': ObjectId('528623ee9f9d510d03f36047'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point6'}}
{u'msg': {u'position': {u'y': -17.553266525268555, u'x': 3.356891632080078, u'z': -1.3877799388343032e-17}, u'orientation': {u'y': 0.0, u'x': 0.0, u'z': 0.999912440776825, u'w': 0.013233105652034283}}, u'_id': ObjectId('528623ee9f9d510d03f36048'), u'meta': {u'map': u'lg_20131115', u'pointset': u'lg_20131115', u'name': u'Point7'}}

However when the point chooser tries to read them, this happens:

[INFO] [WallTime: 1393520871.195006] Updating patroller thresholds::
[INFO] [WallTime: 1393520871.195419] V.Low=20
[INFO] [WallTime: 1393520871.195644] Low=35
[INFO] [WallTime: 1393520871.195867] Charged=98
[INFO] [WallTime: 1393520871.196088] Max bumper recovers before sending e-mail=10
[INFO] [WallTime: 1393520871.196409] Max move_base recovers before going to a new point=5
[INFO] [WallTime: 1393520871.223526] Concurrence starting with userdata: 
    []
[INFO] [WallTime: 1393520871.228161] State machine starting in initial state 'POINT_CHOOSER' with userdata: 
    []
[ERROR] [WallTime: 1393520872.234097] InvalidUserCodeError: Could not execute state 'POINT_CHOOSER' of type '<waypoint_patroller.patroller.PointChooser object at 0x1fc0f10>': Traceback (most recent call last):
  File "/opt/strands/strands_ws/src/executive_smach/smach/src/smach/state_machine.py", line 241, in _update_once
    self._remappings[self._current_label]))
  File "/opt/strands/strands_ws/src/autonomous_patrolling/waypoint_patroller/src/waypoint_patroller/patroller.py", line 141, in execute
    userdata.goal_pose = self._get_point(current_pt[1], current_pt[0])
  File "/opt/strands/strands_ws/src/autonomous_patrolling/waypoint_patroller/src/waypoint_patroller/patroller.py", line 119, in _get_point
    meta, pose = ros_datacentre.util.document_to_msg(p, Pose)
  File "/opt/strands/strands_ws/src/ros_datacentre/ros_datacentre/src/ros_datacentre/util.py", line 72, in document_to_msg
    _fill_msg(msg,document)
  File "/opt/strands/strands_ws/src/ros_datacentre/ros_datacentre/src/ros_datacentre/util.py", line 53, in _fill_msg
    _fill_msg(getattr(msg,i),dic[i])
AttributeError: 'Pose' object has no attribute 'msg'

Updating stored binarys

After #60 was fixed I tried to update the stored binary and ran into a similar error:

Updating stored default for /ground_hog/model
/usr/local/lib/python2.7/dist-packages/pymongo/collection.py:487: RuntimeWarning: couldn't encode - reloading python modules and trying again. if you see this without getting an InvalidDocument exception please see http://api.mongodb.org/python/current/faq.html#does-pymongo-work-with-mod-wsgi
  check_keys, self.__uuid_subtype), safe)
Traceback (most recent call last):
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 225, in <module>
    server = ConfigManager()
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 117, in __init__
    defaults_collection.update(existing,{"$set":{"value":val}})
  File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 487, in update
    check_keys, self.__uuid_subtype), safe)
bson.errors.InvalidDocument: Cannot encode object: <xmlrpclib.Binary instance at 0x21ab8c0>
[INFO] [WallTime: 1405590963.002627] Thu Jul 17 10:56:02 [conn1] end connection 127.0.0.1:58556
[config_manager-3] process has died [pid 20484, exit code 1, cmd /home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py __name:=config_manager __log:=/home/cdondrup/.ros/log/8dd13814-0d98-11e4-9e7a-902b34d5fb37/config_manager-3.log].
log file: /home/cdondrup/.ros/log/8dd13814-0d98-11e4-9e7a-902b34d5fb37/config_manager-3*.log

Deleting the parameter from the config DB manually and reinserting it worked fine but the direct update via the config manager does yield above error. Do you have an idea what might cause this @cburbridge ?

doesn't link on raring and trusty

... and maybe other distributions as well...

I'm trying to make mongodb fit for
trusty/indigo. This post suggests that to libs need to be added:
http://stackoverflow.com/questions/17538871/mongodb-2-4-c-driver-undefined-reference-to-ssl-ctx-use-certificate-chain-f

But maybe you know more precisely what the problem is? SHouldn't that
be resolved automatically via the mongoclient library? Where's the
problem? Why would I have to link ssl explicitly in Trusty (same in
Raring, btw), but not in precise?

Move C++ client into main package

Currently the c++ API for the message store is a separate package. I did this for flexibility, but is it really necessary? Can anyone make a good argument for why I shouldn't move it back into the main package?

ros_datacentre vs mongodb_store, confusion and error while running

Hi all,
I updated my system and I am confused if ros_datacentre has changed to mongodb_store, as they contain for the first look pretty much same stuff and I cant see ros_datacentre package anymore in strands repositories.

My problem is that I wanted to replay some data using command:
roslaunch ros_datacentre datacentre.launch db_path:=...
so now, is it command
roslaunch mongodb_store mongodb_store.launch dp_path:=... ?

If yes, I am getting following errors while running it:


setting /run_id to 819aea92-3050-11e4-a050-fcf8ae27d5ad
process[rosout-1]: started with pid [8428]
started core service [/rosout]
process[mongo_server-2]: started with pid [8440]
Traceback (most recent call last):
  File "/opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/mongodb_server.py", line 12, in <module>
    import mongodb_store.util
ImportError: No module named mongodb_store.util
process[config_manager-3]: started with pid [8443]
[mongo_server-2] process has died [pid 8440, exit code 1, cmd /opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/mongodb_server.py __name:=mongo_server __log:=/home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/mongo_server-2.log].
log file: /home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/mongo_server-2*.log
process[message_store-4]: started with pid [8447]
Traceback (most recent call last):
  File "/opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/message_store_node.py", line 9, in <module>
    import mongodb_store_msgs.srv as dc_srv
ImportError: No module named mongodb_store_msgs.srv
process[replicator_node-5]: started with pid [8454]
Traceback (most recent call last):
  File "/opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/config_manager.py", line 12, in <module>
    import mongodb_store.util
ImportError: No module named mongodb_store.util
[message_store-4] process has died [pid 8447, exit code 1, cmd /opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/message_store_node.py __name:=message_store __log:=/home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/message_store-4.log].
log file: /home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/message_store-4*.log
Traceback (most recent call last):
  File "/opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/replicator_node.py", line 14, in <module>
    from mongodb_store_msgs.msg import  MoveEntriesAction, MoveEntriesFeedback
ImportError: No module named mongodb_store_msgs.msg
[config_manager-3] process has died [pid 8443, exit code 1, cmd /opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/config_manager.py __name:=config_manager __log:=/home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/config_manager-3.log].
log file: /home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/config_manager-3*.log
[replicator_node-5] process has died [pid 8454, exit code 1, cmd /opt/strands/strands_catkin_ws/src/mongodb_store/mongodb_store/scripts/replicator_node.py __name:=replicator_node __log:=/home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/replicator_node-5.log].
log file: /home/lenka/.ros/log/819aea92-3050-11e4-a050-fcf8ae27d5ad/replicator_node-5*.log
^C[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete

prepare for rosdistro

I tried a test "submission" of ros_datacentre into rosdistro using bloom. Here's what I got back from the maintainers:

This looks interesting. However there are several packages which do not follow our naming conventions: http://wiki.ros.org/ROS/Patterns/Conventions Both using ros before hand and datacentre is not clearly defined for someone viewing the package for the first time. And as there's no other documentation, such as description in the package.xmls or README, there's no clarification without reading the code.

Please consider renaming the ros_* packages and a different name than datacentre. Data center is a relatively well defined term for which this does not appear to be related: https://www.google.com/search?q=define+data+center&oq=define+data+center https://en.wikipedia.org/wiki/Data_center

see this pull request: ros/rosdistro#5223

So we should fix a few things:

  • get rid of the ros_ prefix: #69
  • remove log_extractor as it is a stub #72
  • move strands_diagnostics somewhere else? #70
  • find a better(?) name instead of datacentre, i suggest something like mongostore or mongstor, but please suggest something: #69

people that should probably comment on this: @hawesie @cburbridge @bfalacerda @cdondrup @Jailander

Logging rosout into "flat" collection

Currently, rosout logging in logger.py creates several collections by taking the name of each node to create a collection. That's not convenient for performing queries on the logs and for the log extractor. At the DaCTaF meeting, it was decided to "flatten" this into on collection. Is there a reason why this hasn't been done yet? Are there any side effects I should be aware of?

TopicReplay

  • deal with latched topics, e.g. implementing time-to-live
  • requires a nice GUI

ros_datacentre Questions

I have a few questions about ros_datacentre.

  1. What kind of ROS data can be stored using ros_datacentre?

  2. How is data queried using ros_datacentre - what kind of queries can be performed?

  3. Is there any facility for playback of the stored data? (Akin to playback using ros bags)

Thanks in Advance.

Adding new default parameters breaks the config_manager

I found another one @cburbridge :)
I just tried to enter a new parameter to the defaults store and got an error message. First I thought that the parameter itself was illegal because I might have missed some yaml convention, so I tried to create another parameter which had to work but still got an error. I tried to drop the defaults collection to check if it as an update problem and then I also tried to remove all my files and just leave the twitter params one (which always worked). Still the same error:

Found default parameter file twitter_params.yaml
Traceback (most recent call last):
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 239, in <module>
    server = ConfigManager()
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 105, in __init__
    existing_value = self._database._fix_outgoing(existing['value'], defaults_collection)
TypeError: 'NoneType' object has no attribute '__getitem__'
[INFO] [WallTime: 1405684423.433060] Fri Jul 18 12:53:43 [conn1] end connection 127.0.0.1:40646
[INFO] [WallTime: 1405684423.576274] Fri Jul 18 12:53:43 [initandlisten] connection accepted from 127.0.0.1:40676 #3
[INFO] [WallTime: 1405684423.577580] Replicating content from localhost:62345 to a futher 0 datacentres
[INFO] [WallTime: 1405684423.584496] Fri Jul 18 12:53:43 [conn3] end connection 127.0.0.1:40676
[config_manager-3] process has died [pid 24922, exit code 1, cmd /home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py __name:=config_manager __log:=/home/cdondrup/.ros/log/29b6f186-0e72-11e4-b4be-902b34d5fb37/config_manager-3.log].
log file: /home/cdondrup/.ros/log/29b6f186-0e72-11e4-b4be-902b34d5fb37/config_manager-3*.log

I think the binary stuff has broken something.

update method deletes unchanged fields in meta

I tried to change the waypoint visualizer in order to be able to update the db by dragging the waypoints in rviz (as we had before). I used the following command:

 self.msg_store.update_named(feedback.marker_name, feedback.pose, upsert=True);

When I do it, all the meta info in the waypoints (map, pointset, etc.) disappears. Is this a bug or am I doing something wrong?

Storing binary from parameter server.

I am currently trying to get rid of all the config files the ppl perception still needs because this often breaks if launched remotely using the machine tag (weird ros behaviour which requires hard coding of the paths instead of using the find tag and therefore it breaks on robots that don't use the standard set-up). The HOG feature extraction uses a binary model file which I can store on the ROS parameter server and also dump to a yaml file afterwards. Here is the file I would like to use for the config manager:

ground_hog:
    HOG_WINDOW_WIDTH: 64
    HOG_WINDOW_HEIGHT: 128
    HOG_DESCRIPTOR_WIDTH: 7
    HOG_DESCRIPTOR_HEIGHT: 15
    model: !!binary |
        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

trying to load this to the param server rosparam load my_file.yaml works fine but if I try to save it to the data centre I get the following:

$ rosservice call /config_manager/save_param /ground_hog/model
ERROR: service [/config_manager/save_param] responded with an error: error processing request: No JSON object could be decoded

and the datacentre prints this:

[ERROR] [WallTime: 1405524273.957850] Error processing request: No JSON object could be decoded
['Traceback (most recent call last):\n', '  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 623, in _handle_request\n    response = convert_return_to_response(self.handler(request), self.response_class)\n', '  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 167, in _saveparam_srv_cb\n    new = json.loads(mystring)\n', '  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads\n    return _default_decoder.decode(s)\n', '  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode\n    obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n', '  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode\n    raise ValueError("No JSON object could be decoded")\n', 'ValueError: No JSON object could be decoded\n']

I also tried to load it on start-up of the config manager by putting it into the defaults directory which produces the following error:

[INFO] [WallTime: 1405523887.137948] New default parameter for /ground_hog/model
/usr/local/lib/python2.7/dist-packages/pymongo/collection.py:362: RuntimeWarning: couldn't encode - reloading python modules and trying again. if you see this without getting an InvalidDocument exception please see http://api.mongodb.org/python/current/faq.html#does-pymongo-work-with-mod-wsgi
  self.database.connection)
Traceback (most recent call last):
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 181, in <module>
    server = ConfigManager()
  File "/home/cdondrup/ros-ws/src/ros_datacentre/ros_datacentre/scripts/config_manager.py", line 62, in __init__
    "from_file":filename})
  File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 362, in insert
    self.database.connection)
bson.errors.InvalidDocument: Cannot encode object: <xmlrpclib.Binary instance at 0x3538998>

Any idea how to fix this or a suggestion for a better way of storing binaries?

[mongodb_store] geometry_msgs is missing dependency to build the example

from log:

Building CXX object CMakeFiles/example_mongodb_store_cpp_client.dir/src/example_mongodb_store_cpp_client.cpp.o
/usr/lib/ccache/c++   -DROS_PACKAGE_NAME=\"mongodb_store\" -DROSCONSOLE_BACKEND_LOG4CXX -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security  -I/tmp/buildd/ros-hydro-mongodb-store-0.1.0-0precise-20141017-0350/obj-x86_64-linux-gnu/devel/include -I/tmp/buildd/ros-hydro-mongodb-store-0.1.0-0precise-20141017-0350/include -I/opt/ros/hydro/include    -std=c++0x -o CMakeFiles/example_mongodb_store_cpp_client.dir/src/example_mongodb_store_cpp_client.cpp.o -c /tmp/buildd/ros-hydro-mongodb-store-0.1.0-0precise-20141017-0350/src/example_mongodb_store_cpp_client.cpp
/tmp/buildd/ros-hydro-mongodb-store-0.1.0-0precise-20141017-0350/src/example_mongodb_store_cpp_client.cpp:2:32: fatal error: geometry_msgs/Pose.h: No such file or directory
compilation terminated.

A common problem, that some package in a repo include the dependency but then the package itself doesn't causing the devel build to succeed and the release build to fail ๐Ÿ˜ž

Allow to remove stored messages

We should have a remove function to allow people to remove messages. In reality, it should only move the message to a rubbish bin...

emails in package.xml

you should check the email addresses in package.xml

---------- Forwarded message ----------
From: Mail Delivery System <[email protected]>
Date: 21 August 2014 13:46
Subject: Mail delivery failed: returning message to sender
To: [email protected]


This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  [email protected]
    Unrouteable address

Integrate image and point cloud into the datacentre

Whilst mongodb_log has special loggers for these data types, we need to implement both the proposed ring buffer based logging for triggered recording, plus look into integrating existing work on compression for sequences of images and pointclounds (by @nilsbore) into the datacentre. It may be best for these types not to go into mongodb, but be stored separately somehow. Or perhaps identifiers for frames could go into the db but then be used to index into some compressed form.

rostopic logger

  • based on mongodb_log
  • dissolve roslog logger into nirvana
  • make sure that we have meta data associated with it
    • timestamp (probably take it from the ROS message if it has a timestamp)

Linker error with libboost-filesystem-mt

TL;DR: move mongodb_store to the top of your dependency list.

When adding the mongodb_store to your CMakeLists.txt, you might be greeted by

/usr/bin/c++       CMakeFiles/store_detections.dir/src/store_detections.cpp.o  -o /home/beyer/lucas-overlay/devel/lib/strands_head_orientation/store_detections -rdynamic /opt/ros/hydro/lib/libcv_bridge.so /opt/ros/hydro/lib/libopencv_videostab.so.2.4.9 /opt/ros/hydro/lib/libopencv_video.so.2.4.9 /opt/ros/hydro/lib/libopencv_superres.so.2.4.9 /opt/ros/hydro/lib/libopencv_stitching.so.2.4.9 /opt/ros/hydro/lib/libopencv_photo.so.2.4.9 /opt/ros/hydro/lib/libopencv_ocl.so.2.4.9 /opt/ros/hydro/lib/libopencv_objdetect.so.2.4.9 /opt/ros/hydro/lib/libopencv_nonfree.so.2.4.9 /opt/ros/hydro/lib/libopencv_ml.so.2.4.9 /opt/ros/hydro/lib/libopencv_legacy.so.2.4.9 /opt/ros/hydro/lib/libopencv_imgproc.so.2.4.9 /opt/ros/hydro/lib/libopencv_highgui.so.2.4.9 /opt/ros/hydro/lib/libopencv_gpu.so.2.4.9 /opt/ros/hydro/lib/libopencv_flann.so.2.4.9 /opt/ros/hydro/lib/libopencv_features2d.so.2.4.9 /opt/ros/hydro/lib/libopencv_core.so.2.4.9 /opt/ros/hydro/lib/libopencv_contrib.so.2.4.9 /opt/ros/hydro/lib/libopencv_calib3d.so.2.4.9 /opt/ros/hydro/lib/libimage_transport.so -ltinyxml /opt/ros/hydro/lib/libclass_loader.so -lPocoFoundation -ldl /opt/ros/hydro/lib/libroslib.so /opt/ros/hydro/lib/libmessage_filters.so /opt/ros/hydro/lib/libroscpp.so -lboost_signals-mt -lboost_filesystem-mt /opt/ros/hydro/lib/librosconsole.so /opt/ros/hydro/lib/librosconsole_log4cxx.so /opt/ros/hydro/lib/librosconsole_backend_interface.so -llog4cxx -lboost_regex-mt /opt/ros/hydro/lib/libxmlrpcpp.so /opt/ros/hydro/lib/libroscpp_serialization.so /opt/ros/hydro/lib/librostime.so -lboost_date_time-mt -lboost_system-mt -lboost_thread-mt -lpthread /opt/ros/hydro/lib/libcpp_common.so /opt/ros/hydro/lib/libconsole_bridge.so /opt/ros/hydro/lib/libmessage_store.so -Wl,-Bstatic -lmongoclient -Wl,-Bdynamic /home/beyer/lucas-overlay/devel/lib/libopencv_warco.so -Wl,-rpath,/opt/ros/hydro/lib:/home/beyer/lucas-overlay/devel/lib 
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmongoclient.a(log.o): undefined reference to symbol 'boost::filesystem2::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::system::error_code&)'
/usr/bin/ld: note: 'boost::filesystem2::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::system::error_code&)' is defined in DSO /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_filesystem-mt.so so try adding it to the linker command line
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_filesystem-mt.so: could not read symbols: Invalid operation

The important part being undefined reference to symbol 'boost::filesystem2::detail::status_api(...)'. The problem here is that your package is now implicitly linking to libmongoclient.a statically. That one needs to call a function defined in the dynamic library libboost_filesystem-mt.so, which is also added to the linker line.

BUT if some other dependency of yours also needs libboost_filesystem-mt.so, it will be added to the linker line before libmongoclient.a and, for some reason, not added after it again later. For this reason, moving the mongodb_store dependency to the front in your call to catkin's COMPONENTS list fixes that error.

Posting this issue for posteriority, aka. google. (And a slight hope for a better fix.)

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.