ROS Concepts and Command-Line Overview
ROS Concepts and Command-Line Overview
Questions/feedback:
[email protected]
This Presentation
http://pr.willowgarage.com/wiki/ROS
What is ROS?
Meta operating system for robotics
System for obtaining, building, writing and running code
across multiple computers
Not realtime, but it can communicate with realtime
processes
Architecture
distributed processes
network-based, peer-to-peer transport of data
synchronous Services and asynchronous Topics that
transport Message data
ROS Concepts
Repositories
We wish to support a diverse ecosystem of code
Federated model
Many repositories (Stanford, CMU, MIT, Wash-U,
Georgia Tech, Bosch, Brown)
Easier to contribute and control your code
Open Source, mostly BSD
Currently all Subversion (SVN)
Wikis
ROS wiki: http://pr.willowgarage.com/wiki
OpenCV wiki: http://opencv.willowgarage.com/wiki/
ros.org: coming soon!
community tools
roslocate
Command-line tool to search for and download source
code for ROS packages
$ roslocate describe package-name
$ roslocate svn package-name
$ roslocate repo package-name
$ roslocate search keyword
$ svn co `roslocate svn package-name`
checks out source code for package
More coming soon
e.g.: http://stair.stanford.edu/ros/list.php
Lets try roslocate
Packages
Can contain anything: libraries, Nodes, Messages, tools
Goldilocks principal: enough functionality to be useful,
but not so much as to be heavyweight
Many packages = smaller, easier-to-use code, but...
... many packages = MANY (300+)
packages, stacks and apps
Stacks
Release with version numbers
Collect similar packages that work together
ROS
2D nav
manipulation
controllers
Apps
Coming soon
Similar to Stacks, but are runnable
Stacks = libraries, Apps = applications
packages, stacks, and apps
rosmake package-name1...N
make package-name1...N
as well as $ rospack depends package-name...N
bash <(rosdep satisfy package-name)
Install external dependencies (e.g. wxpython)
Lets give packages a try
$ rospack find foo
[rospack] couldn't find package [foo]
$ roscd
$ roscreate-pkg foo rospy std_msgs
Creating package directory /Users/kwc/ros/foo
Creating python source directory /Users/kwc/ros/foo/src/foo
Creating package file /Users/kwc/ros/foo/Makefile
Creating package file /Users/kwc/ros/foo/manifest.xml
Creating package file /Users/kwc/ros/foo/CMakeLists.txt Creating package file /Users/kwc/ros/foo/mainpage.dox
pr2_msgs/Odometry
Header header
robot_msgs/Pose odom
robot_msgs/PoseDot odom_vel
float64 distance
float64 angle
float64 residual
msg and srv tools
rosmsg
Find and get information about msg files
$ rosmsg show msg-type
$ rosmsg users msg-type
$ rosmsg package package-name
$ rosmsg packages
rossrv: same as rosmsg
CMake macros
ros/core/rosbuild.cmake
genmsg(): run Message generators
gensrv(): run Service generators
Lets give msgs a try
$ roscd foo
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
$ rosmsg show foo/Num
int64 num
$ vi CMakeLists.txt
$ rosmake foo
master, roscore
Master
Name service for ROS
Nodes register Topics and Services with Master
Nodes find other Nodes using Master
XML-RPC based
roscore
Master
rosout: logs /rosout topic for debugging
Parameter Server
nodes
rosrun nav/move_base
rosnode
Find and get information about ROS Nodes
$ rosnode list
$ rosnode ping node-name
$ rosnode info node-name
roslaunch: launch many nodes using XML files
<roslaunch>
<node pkg="foo" type="bar" name="talker" />
<node pkg="foo" type="baz" name="listener" />
</roslaunch>
rxgraph: interactive graph of currently running ROS Nodes
Lets play with roscore + rosnode (I)
Publications:
* /rosout_agg [roslib/Log]
Subscriptions:
* /time [unknown type]
* /rosout [unknown type]
Services:
* /rosout/set_logger_level
* /rosout/get_loggers
rostopic
Get information about a ROS topic, including printing
messages currently being published
$ rostopic list
$ rostopic echo topic-name
$ rostopic hz topic-name
$ rostopic type topic-name
$ rxplot topic1/field1,topic2/field2
Plots topic data over time
$ rosrecord topic1 topic2 topic3
Creates a bag file (.bag)
Playback with 'rosplay file.bag'
Lets play with rostopic
$ rostopic pub -r 10 numbers foo/Num 12345
RPC
Client <-Request/Response message-> Service
Can be 'persistent', i.e. keep alive connection
Tools
rosservice
Get information about and query ROS Services
$ rosservice call add_two_ints 1 2
$ rosservice list
$ rosservice type
rossrv
Lets play with Services
$ rosrun rospy_tutorials add_two_ints_server.py
$ rosservice list
/add_two_ints
/rosout/set_logger_level
/rosout/get_loggers
rosparam
Get and set parameters from command-line arguments or YAML files
$ rosparam get parameter-name
$ rosparam set parameter-name
$ rosparam load yaml-file
$ rosparam dump yaml-file
roslaunch
Sets parameters as well
Lets play with Parameters
$ rosparam set hello true
$ rosparam get hello
true
$ rosparam get gains
$ rosparam set gains "{p: 1.0, i: 2.0, d: 3.0}"
$ rosparam get gains/p
1.0
$ rosparam get /
...
$ rosparam dump params.yaml
$ vi params.yaml
$ rosparam load params.yaml copy
$ rosparam get copy/gains
{d: 3.0, i: 2.0, p: 1.0}
names
Syntax:
/global-name
relative-name
~local-name
"Pushing down"
relative-name -> foo/relative-name
Wiki page
pushing down I
<roslaunch>
<node pkg="foo" type="bar" name="talker" />
<node pkg="foo" type="baz" name="listener" />
</roslaunch>
Nodes:
/talker
/listener
Topic:
/topic_name
pushing down II
<roslaunch>
<group ns="wg">
<node pkg="foo" type="bar" name="talker" />
<node pkg="foo" type="baz" name="listener" />
</group>
<group ns="stanford">
<node pkg="foo" type="bar" name="talker" />
<node pkg="foo" type="baz" name="listener" />
</group> ...
Nodes:
/wg/talker
/wg/listener
/stanford/talker
/stanford/listener
Topic:
/wg/topic_name
/stanford/topic_name
more