[ros-users] rosbash tool share

Axelrod, Benjamin baxelrod at irobot.com
Fri Mar 11 19:04:05 UTC 2011


ROS provides a really nice set of tools for working with packages and
stacks.  But I am sure the community has come up with some additional
cool tools.  Here are some bash functions that I find helpful.

 

# cd toggle between _msgs and non _msgs packages

function roscdmsg

{

    PACKAGE=${PWD##*/}

    LEN=${#PACKAGE}

 

    if (( "$LEN" < 5 ))

    then

        roscd $PACKAGE"_msgs"

        return

    fi

    

    END=${PACKAGE:$(( $LEN - 5 ))}

    

    if [ $END = "_msgs" ]

    then

        roscd ${PACKAGE:0:$(( $LEN - 5 ))}

    else

        roscd $PACKAGE"_msgs"

    fi

}

 

# Helper function to test if a list contains a given string.

# Usage: isinlist <string> <list>

function isinlist

{

    for ITEM in $2

    do

        if [ "$1" = "$ITEM" ]

        then

            return 1

        fi

    done

    return 0

}

 

# CD up to the root package dir

function roscdpkg

{

    # store original pwd

    ORIG_DIR=$PWD

    

    # get all package names

    ALL_PACKAGES=`rospack list-names`

    

    # get the name of the current dir

    DIR=${PWD##*/}

    

    # test if we are in a dir that is also a ros package

    isinlist "$DIR" "$ALL_PACKAGES"

    

    # while 'isinlist' returns 0

    while [ "$?" = "0" ]

    do

        # go up a dir

        builtin cd ..

        

        # get the new dir name

        DIR=${PWD##*/}

        

        # if the dir name is empty (i.e. we have gone all the way to
'/')

        if [ -z $DIR ]

        then

            builtin cd $ORIG_DIR

            echo "Not under a ros package"

            return -1

        fi

        

        isinlist "$DIR" "$ALL_PACKAGES"

    done

}

 

# CD up to the root stack dir

function roscdstack

{

    # store original pwd

    ORIG_DIR=$PWD

    

    # get all package names

    ALL_PACKAGES=`rosstack list-names`

    

    # get the name of the current dir

    DIR=${PWD##*/}

    

    # test if we are in a dir that is also a ros stack

    isinlist "$DIR" "$ALL_PACKAGES"

    

    # while 'isinlist' returns 0

    while [ "$?" = "0" ]

    do

        # go up a dir

        builtin cd ..

        

        # get the new dir name

        DIR=${PWD##*/}

        

        # if the dir name is empty (i.e. we have gone all the way to
'/')

        if [ -z $DIR ]

        then

            builtin cd $ORIG_DIR

            echo "Not under a ros stack"

            return -1

        fi

        

        isinlist "$DIR" "$ALL_PACKAGES"

    done

}

 

 

# This function will print on the screen a list of #include

# lines that you can paste at the top of your C++ file. 

# The files are found using your .manifest file. 

function rosgenincludes

{

    DEPS_LIST=`rospack depends1 $1`

 

    for PACKAGE in $DEPS_LIST

    do

        echo "// $PACKAGE:"

        PATH_TO_DEP=`rospack find $PACKAGE`

        

        PATH_ARRAY[0]=$PATH_TO_DEP/include

        # CTurtle paths

        PATH_ARRAY[1]=$PATH_TO_DEP/msg_gen/cpp/include/$PACKAGE

        PATH_ARRAY[2]=$PATH_TO_DEP/srv_gen/cpp/include/$PACKAGE

        # BoxTurtle paths

        #PATH_ARRAY[1]=$PATH_TO_DEP/msg/cpp/$PACKAGE

        #PATH_ARRAY[2]=$PATH_TO_DEP/srv/cpp/$PACKAGE

 

        NOTES_ARRAY[0]=""

        NOTES_ARRAY[1]="$PACKAGE messages:"

        NOTES_ARRAY[2]="$PACKAGE services:"

        

        NUM_PATHS=3

        

        for (( i = 0 ; i < $NUM_PATHS ; i++ ))

        do

            # if path does not exist

            if [[ ! -d "${PATH_ARRAY[$i]}" ]]

            then

                #echo "path does not exist"

                continue

            fi

            

            INCLUDE_FILES=`ls -1 ${PATH_ARRAY[$i]}`

            

            # if there are any files found

            if [ "${#INCLUDE_FILES}" -gt 0 ]

            then

                

                # only display note if it is non-zero

                if [ "${#NOTES_ARRAY[$i]}" -gt 0 ]

                then

                    echo "// ${NOTES_ARRAY[$i]}"

                fi

                

                # print each include

                for FILE in $INCLUDE_FILES

                do

                    echo "#include <$PACKAGE/$FILE>"

                done

            fi

            

        done #end for each search path

        

    done #end for each package in dependencies

}

 

And here is some example usage:

 

baxelrod at mycomp:~$ roscd actionlib

baxelrod at mycomp:/opt/ros/cturtle/stacks/common/actionlib$ roscdmsg 

baxelrod at mycomp:/opt/ros/cturtle/stacks/common_msgs/actionlib_msgs$
roscdmsg 

baxelrod at mycomp:/opt/ros/cturtle/stacks/common/actionlib$ rosgenincludes


// roscpp:

#include <roscpp/ros>

// roscpp messages:

#include <roscpp/Logger.h>

// roscpp services:

#include <roscpp/Empty.h>

#include <roscpp/GetLoggers.h>

#include <roscpp/SetLoggerLevel.h>

// rospy:

// rostest:

#include <rostest/rostest>

// actionlib_msgs:

// actionlib_msgs messages:

#include <actionlib_msgs/GoalID.h>

#include <actionlib_msgs/GoalStatusArray.h>

#include <actionlib_msgs/GoalStatus.h>

baxelrod at mycomp:/opt/ros/cturtle/stacks/common/actionlib$ cd msg

baxelrod at mycomp:/opt/ros/cturtle/stacks/common/actionlib/msg$ roscdpkg 

baxelrod at mycomp:/opt/ros/cturtle/stacks/common/actionlib$ roscdstack 

baxelrod at mycomp:/opt/ros/cturtle/stacks/common$

 

Anybody else have something neat?

-Ben

 

Ben Axelrod

Research Scientist

iRobot Corporation

8 Crosby Drive, Mail Stop 8-1

Bedford, MA 01730

(781) 430-3315 (Tel)

(781) 960-2628 (Fax)

baxelrod at irobot.com 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/ros-users/attachments/20110311/03a8b734/attachment-0002.html>


More information about the ros-users mailing list