PLEASE create pull-requests if you had to do something differently. It's as easy as selecting the file in github and clicking on the pencil button in the top right corner, so there really is no excuse!
From the wiki
$ wget -qO- http://lcas.lincoln.ac.uk/repos/public.key | sudo apt-key add -
$ sudo apt-add-repository http://lcas.lincoln.ac.uk/repos/release
$ sudo apt-get updateNeed to remove this because some auto-dependency stuff doesn't work:
$ sudo apt-get autoremove --purge libqwt-devThen, install ALL the things:
$ sudo apt-get install ros-hydro-strands-robot
$ sudo apt-get install ros-hydro-openni-wrapper
$ sudo apt-get install ros-hydro-scitos-bringupTODO: remove these soon (will be in strands-robot)
Stuff installed via apt-get goes to /opt/ros/hydro. To see which files a package installed, run
dpkg -L package-name. Nodes (i.e. an executable file or python script) are usually installed into
/opt/ros/hydro/lib/PACKAGE_NAME/ and launchfiles into /opt/ros/hydro/share/PACKAGE_NAME.
Stuff which you're working on should reside in an ~/overlay
in your home directory.
For finding the github repo which a ROS package resides in, look at this file.
If you want to search for code, I've cloned ALL the repos into ~strands/ALL_THE_FUCKING_STRANDS,
to update it from time to time using my ninja-foo'd
find ~strands/ALL_THE_FUCKING_STRANDS -type d -mindepth 1 -maxdepth 1 -exec git --git-dir={}/.git --work-tree={} pull origin master \;
Besides the networking specified further down, configure the side-pc's just like the main one, with the addition of installing nvidia drivers.
If you want to be able to hotplug a screen on their GPU, you also need to run the following once:
$ sudo nvidia-xconfig --allow-empty-initial-configurationNow whenever you want to start something that needs OpenGL/CUDA remotely, make sure to:
- Not specify the
-Xor-Yflag to anysshcommand, and - Prefix the command you want to run with
DISPLAY=:0.0, e.g.DISPLAY=:0.0 roslaunch my_gpu_computing node_is_awesome.launch.
The clocks of the side-pcs need to stay in sync with that of the main pc, or ROS will get mad.
This can be done using the chrony tool.
First, on the main PC:
$ sudo apt-get autoremove --purge ntpdate
$ sudo apt-get install chronyThen, on each of the side-pcs:
$ sudo ntpdate karl
$ sudo apt-get autoremove --purge ntpdate
$ sudo apt-get install chronyThen, replace the servers in /etc/chrony/chrony.conf by:
server karl minpoll 0 maxpoll 5 maxdelay .05
(I took that from the PR2 manuals, may need to tweak.)
And restart chrony with sudo /etc/init.d/chrony restart.
We bought a switch (Netgear GS108), connected the on-board pc (karl) and the side-pcs
(amsterdam and bruxelles) to it, as well as the two AVT manta cameras.
- Get
karlconnected to the internet via wifi. - In
karl's NetworkManager, choose the interface which is connected (eth0oreth1) and, in theIPv4 Settingstab, chooseShared to other computers. - Click on
Connection Informationin the NetworkManager, note that connection'sIP AddressandSubnet Mask. - On both the side-pcs, set the
IPv4 SettingstoManual, choose an IP in the same subnet askarl, the sameNetmask, and use aforenoted IP Address as bothGatewayandDNS servers. - For reasons unbeknownst to me, you can access the side-pcs by their name suffixed with
.local, e.g.bruxelles.local. When using the<machine>tag, ROS doesn't like that, thus you need to add an entry for each of the side pcs tokarl's/etc/hostsfile. - Make sure there's passwordless ssh from
karlto both sidepcs by creating a passwordless keypair forkarland push the public key to the side-pcs. See google. - Add the side-pcs to your
known_hostsfile:ssh-keyscan bruxelles.local >> ~/.ssh/known_hosts.
If you launch anything remotely, make sure ROS_MASTER_URI is set on the launching pc.
@nilsbore:
We are having the same problems still with the new driving firmware. In particular, the current minimum rotational velocity is too high and max rotational acceleration is too low, but there are other problems still, seems to be related to acceleration. In other words, upgrading the firmware seems to require tuning these parameters. Me and @RaresAmbrus are trying to find a good configuration. Might be of interest to @BFALacerda @lucasb-eyer
Need to create an empty directory located at /opt/strands/mongodb_store to which the strands
user has write permissions:
$ sudo mkdir -p /opt/strands/mongodb_store
$ sudo chown -R strands:strands /opt/strands/
$ sudo chmod g+w /opt/strands/Then, you can launch the mongodb_store passing that as a parameter, or put it in your launchfile.
$ roslaunch mongodb_store mongodb_store.launch db_path:=/opt/strands/mongodb_storeFirst, let it run, even if it complains. It needs some time to initialize (pre-allocate disk space) and will connect once the initialization is done.
We still need to have the MIRA license that were shipped with the robot located in /opt/MIRA-licenses. Then add the following to your ~/.bashrc.
export MIRA_PATH=/opt/mira-scitos
-
/etc/udev/rules.d/72-persistent-can.rulesKERNEL=="ttyUSB?", ENV{ID_VENDOR}=="MetraLabs_GmbH", ENV{ID_MODEL}=="SCITOS_MCU", ENV{MINOR}=="2", SYMLINK+="can" -
/etc/udev/rules.d/72-persistent-laser.rulesKERNEL=="ttyUSB?", ENV{ID_VENDOR}=="MetraLabs_GmbH", ENV{ID_MODEL}=="SCITOS_MCU", ENV{MINOR}=="0", SYMLINK+="laser" -
/etc/udev/rules.d/73-persistent-joystick.rulesKERNEL=="js?", ENV{ID_VENDOR}=="Logitech", ENV{ID_MODEL}=="Wireless_Gamepad_F710", SYMLINK+="input/rumblepad"
Also the following needs to done to ensure you can actually access the laser and can devices:
sudo adduser strands dialout
Repeat this for every user that wants to start the strands system.
Needs the flir_pantilt_d46/ptu46.launch launchfile running. Then, on the commandline, control via:
rostopic pub --once /ptu/cmd sensor_msgs/JointState "header:
seq: 0
stamp: {secs: 0, nsecs: 0}
frame_id: ''
name: ['tilt', 'pan']
position: [1, 0.5]
velocity: [0.6, 0.6]
effort: [1, 1]"
Pressing <tab> after the message type helps.
TODO: Look into joint_state_publisher.
Reboot the side-pcs to enter their BIOS. There, in the advanced USB settings,
set xHCI to Disabled.
The karl_cams.launch file takes care of starting the necessary stuff (openni_wrapper/main.launch)
on each of the side-pcs.
If there is an error message about escalating to SIGTERM when stopping this launchfile, you'll
have to run rosnode cleanup before launching it again if you don't want to wreak havok.
If there is no publication on the chest's cam, you need to stop the launchfile, physically plug out and back in the xtion and start the launchfile again. TODO: debug this. wtf? We have the same problem in SPENCER.
TODO: remove these soon (will be in strands-robot)
$ sudo apt-get install ros-hydro-topological-utilsFor creating a map just follow the standard ROS map creation tutorial.
If such is your wish, you can crop the map, but don't forget to adapt the YAML file accordingly,
specifically the origin entry using the m = pixels * resolution formula.
Instructions are in the README.md, but do roslaunch scitos_docking charging_mux.launch first.
(TODO: Move the ~/.charging.yaml file to /opt/strands? Need to DI the param tho.)
First, calibrate the chest camera by following this README.md.
Basically, it's just rosrun calibrate_chest calibrate_chest when almost only the floor is visible
in the chest cam. Have the datacentre running for storing the calibration in there.
It will open a viewer-window showing the "ground plane" and an axis for the camera. Close it.
That's any kind of "holes" in the ground, like stairs. Those are detected mainly by
strands_movebase/mirror_floor_points, which is launched by move_base and publishes a pointcloud
at /move_base/points_cliff.
Anything seen by the chest_xtion and higher than 5cm above the ground becomes an obstacle, which
is added to the /move_base/local_costmap/costmap by whom? remove_edges_cloud? The output
pointcloud /move_base/points_obstacle also always seems to contain anything? TODO.
It's being launched by strands_navigation.launch through strands_recovery_behaviours/strands_monitored_nav.launch and that should be all that's needed for strands.
TODO:
to have these helpers you need to do roslaunch strands_ui strands_ui.launch It's waiting for "a node that sets the main page for the webserver. I dont know which one will be doing it in the marathon system" @BFALacera
For details, again, see the README.md, with this default yaml file.
In a topological map, nodes are locations (pose) on the corresponding metric map along with influence areas (verts) around them. Nodes are connected by edges which hold an action which defines how the robot "walks" that edge, being move_base for regular moving and doorPassing for, well, passing doors.
TODO Jaime wanted to write a README.md about it.
For option 3 with Rviz, which is still missing from the README:
Create an empty topological map in the mongodb, the first name is the name of the new topological map, the second one is (currently unused) the name of the metric map it's based on:
$ roslaunch topological_utils empty_topological_map.launch map:=umic_1st_floorThe map is not really empty, as it contains the Station and ChargingPoint nodes. The latter is placed at the origin of the map and the former (Station) 1.2m left to it.
You can edit nodes in rviz via the /umic_1st_floor_add_rm_node/update and /umic_1st_floor_markers/update topics.
The former is for adding new nodes by driving the robot there and then clicking on the green box, while the second one is to move and turn existing nodes.
For each door, you need one node on each side of the door, right in front of it and facing it. These need to be connected by a bidirectional doorPassing edge.
At creation time, a bidirectional edge will be created between two nodes if the distance between them is lower than a certain threshold. You can remove edges by clicking on them in rviz in the /umic_1st_floor_edges/update topic, but I don't know of a way to add edges in rviz.
So your best bet is exporting the map to a file, edit that file, clear the mongodb and reimport the file:
$ rosrun topological_utils map_export.py umic_1st_floor /opt/strands/maps/umic_1st_floor.tplg
$ mongo localhost:62345/message_store
> db.topological_maps.remove({map: "umic_1st_floor"})
$ rosrun topological_utils insert_map.py /opt/strands/maps/umic_1st_floor.tmap umic_1st_floor umic_1st_floorWhenever you change the map in mongodb, you need to ask for it to be republished by running rosrun topological_utils topological_map_update.py, though see strands-project/strands_navigation#139
Finally, you can change the influence zones with /umic_1st_floor_zones/update.
The important stuff is being started by strands_navigation.launch. This implies all debugging output concerning navigation is to be found there.
BUT for now, you need to roslaunch strands_ui strands_ui.launch first, because it defines recovery behaviour which is a hard dependency of monitored_navigation which in turn is a hard dependency of topological_navigation.
TODO
For starting the new (better?) door-passing behavior, do rosrun door_pass door_pass.py after the navigation.
To send the robot to a topological node, rosrun topological_navigation nav_client.py NodeName should do, and it will only exit when the node is reached or the robot gave up.
- Sending a
2D Nav Goalin rviz will use themove_baseand thus bypass the topological navigation. This can be used to test if movement works at all.
Very basic command to start it:
$ ROS_MASTER_URI=http://karl:11311 roslaunch perception_people_launch people_tracker_robot.launch gh_queue_size:=11 vo_queue_size:=22 ubd_queue_size:=33 pt_queue_size:=44 load_params_from_file:=trueMainly this comes from the readdme
The people_tracker needs apt-get install ros-indigo-leg-detector.
https://github.com/strands-project/strands_management/wiki/Marathon-2014
@hawesie
BUT, i do have a new schedule routine to get your robots patrolling:
sudo apt-get install ros-hydro-routine-behavioursrosrun routine_behaviours patroller_routine_node.pyThis should bring back the routine stuff for charging etc that we had int he deployments (assuming everything up to and including top nav is running)
@jailander: how continous is continous patrolling Linda visits all the nodes once and then goes to the node next to the charging station and stays there saying I need a task and nothing happens @hawesie: Which script are you running? @jailander: roslaunch task_executor continuous-patrolling.launch @hawesie: Weird. That one shouldn't do idle stuff or return to the charger. Have you tried the other one I posted?
sudo apt-get install ros-hydro-routine-behaviours
rosrun routine_behaviours patroller_routine_node.py
Either way the continuous patrolling one is a bit of a hack anyway, and I thought it should run badly but indefinitely,. Ok, I'll try that With that the robot should run a patrol then if it gets idle it should pick a random node to visit. You also need to run the roslaunch task_executor task-scheduler.launch
They are generally created as javascript-powered webpages that can call ROS things through a websocket. See the README.md for how to create some.
See the README.md for how to set voices and language.
Largely undecided. @cdondrup created a nice one for the museum.
There's the one from last year and @marc-hanheide is working on one which is served at http://localhost:9091/.
$ sudo apt-get install ros-hydro-cloud-merge
$ ROS_MASTER_URI=http://karl:11311 roslaunch cloud_merge mapping.launch
$ ROS_MASTER_URI=http://karl:11311 roslaunch scitos_ptu ptu_action_server_metric_map.launchNeeds to be built from source for now:
$ sudo apt-get install yasm
$ git clone https://github.com/strands-project/data_compression.git
$ sudo apt-get install ros-hydro-mongodb-log
$ ROS_MASTER_URI=http://karl:11311 roslaunch mongodb_openni_compression record_server.launchCompressed and into the mongodb:
$ sudo apt-get install ros-hydro-mongodb-openni-compressionTODO: Mainly @cdondrup stuff.
ros-hydro-strands-visualise-speech(blink LEDs when talking.)- The look at people thing
@cdondrup:
I do @PDuckworth. I guess starting it with load_params_from_file:=true will fix your issue This is due to me misunderstanding on how the datacentre will be set-up and used in the project. Sorry. Will be fixed at some point Please also make sure to run it with log:=true as well to save the stuff to your datacentre
roslaunch perception_people_launch people_tracker_robot.launch load_params_from_file:=true log:=true
Configured in ~/.marathon_auth.
$ rosrun marathon_reporter mileage_monitor.py@cburbridge: should i put python package dependencies in a package.xml file? If so, what format. For example, I need python-requests as a runtime where do i lookup what to put?
@marc-hanheide: check out
rosdep db | grep YOUR_PACKAGEyou need to put the rosdep key not the package itself
thanks, i think that is what i have always done wrong
if it doesn’t exist, add it to https://github.com/strands-project/rosdistro/blob/strands-devel/rosdep/strands.yaml if it doesn’t exist as a ubuntu package at all, we need to create one for it