Tutorial?

The aim of this tutorial is to explain how to integrate SIGVerse with ROS operating system.

First we will show how to install ROS on your operating system, then we will explain step by step how to run SIGVerse controller in ROS node and how to communicate with another node.

The ROS part tutorial is based on the official ROS wiki, you can check it for more details.

Installing ROS

= Ubuntu install of ROS Groovy =

We are building Debian packages for several Ubuntu platforms, listed below. These packages are more efficient than source-based builds and are our preferred installation method for Ubuntu.

If you need to install from source (not recommended), please see groovy/Installation/Source|source (download-and-compile) installation instructions?.

=== Installation ===

First, make sure your Debian package index is up-to-date:

 $ sudo apt-get update

There are many different libraries and tools in ROS. We provided four default configurations to get you started. You can also install ROS packages individually.

 
  $ sudo apt-get install ros-groovy-desktop-full
  $ sudo apt-get install ros-groovy-desktop

ROS-Base: (Bare Bones)

 $ sudo apt-get install ros-groovy-ros-base

Individual Package:

$ sudo apt-get install ros-groovy-PACKAGE
$ sudo apt-get install ros-groovy-slam-gmapping

To find available packages, use:

$ apt-cache search ros-groovy

=== Initialize rosdep ===

Before you can use ROS, you will need to initialize `rosdep`. `rosdep` enables you to easily install system dependencies for source you want to compile and is required to run some core components in ROS.

$ sudo rosdep init
$ rosdep update

=== Getting rosinstall ===

rosinstall? is a frequently used command-line tool in ROS that is distributed separately. It enables you to easily download many source trees for ROS packages with one command.

$ sudo apt-get install python-rosinstall

Creating ROS workspace

In our project we are using catkin, here is the step to follow to create a ROS workspace:

Run the following command:

$ source /opt/ros/groovy/setup.sh

To create a catkin workspace:

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

You can build even though no project is created yet, you just need MakeLists.txt:

$ cd ~/catkin_ws/
$ catkin_make

Run the setup.bash

$ source devel/setup.bash

Overview

In order to integrate SIGVerse and ROS You need to build the following basic system. First, we need to create two ROS packages, SIGVerse controller and ROS command package which will run as nodes. The first node, SIGVerse controller node, will receive data from the SIGViewer as messages, which will publish them on the message topic, in the other part, ROS command node receives reads these data and subscribe the convenient velociy on the velocity topic, the velocity command will be retrieved by the SIGVerse controller node to be used for controlling the robot.

Simple_Ros.PNG

Creating Packages

We need to create two new packages in the catkin_ws directory.

SIGVerse Package

This package is used to receive data from the SIGViewer, and receive the command to be sent the robot from the ROS command.

Compiling the project

You need Cmake installed on your server.

Let's edit the CMakeLists.txt file to compile the project:

Cmake parameters:

cmake_minimum_required(VERSION 2.8.3)
project(Sigvers_Ros)
 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
## Generate messages in the 'msg' folder
    add_message_files(
    FILES
    Velocity.msg
    )
 ## Generate added messages and services with any dependencies listed here
    generate_messages(
    DEPENDENCIES
    std_msgs
    )
 ## include libraries
 include_directories(include ${catkin_INCLUDE_DIRS})
 include_directories(/home/ericgt/sigverse-2.2.0/include/sigverse/home/ericgt/sigverse-2.2.0/include/sigverse/comm/controller)
ADD_LIBRARY(Sig_app src/Sig_app.cpp)
target_link_libraries(Sig_app ${catkin_LIBRARIES})
add_dependencies(Sig_app Sigvers_Ros_gencpp)

A new library will be generated in ~/catkin_ws/devel/lib.

Run the following command to add this package to ROS packages:

  $source ~/catkin_ws2/devel/setup.sh 

We must have the following output:

$ CMakeLists.txt include msg package.xml src

This shows that the Sigvers_Ros packages exists.

Creating ROS Package

This package is used to receive data from the SIGVerse controller node and send it the velocity command.

$ cd ~/catkin_ws/src
$ catkin_create_pkg key_sig

Create a new cpp file named Sig_command.cpp

$ cd ~/catkin_ws/src/
$ vim Sig_app.cpp

Compiling the project

We have to edit the CMakeLists.txt file to compile the project:

Cmake parameters:

## Generate added messages and services with any dependencies listed here

generate_messages(
  DEPENDENCIES
  std_msgs
)

include_directories(include

 ${catkin_INCLUDE_DIRS}

)

Run the following command to add this package to ROS packages:

  $source ~/catkin_ws2/devel/setup.sh 

We must have the following output:

$ CMakeLists.txt include msg package.xml src

This shows that the Sigvers_Ros packages exists.

Source Code understanding

Message Sender

  void SendController::poseCallback(const Sigvers_Ros::VelocityConstPtr& vel)
  {     Wheel_one =  vel->linear;
        Wheel_two =  vel->angular;
     
        printf("Velocity 1!!!  %f\n", Wheel_one);
        printf("Velocity 2!!!  %f\n", Wheel_two);
     
  }

Node Initialization

 void SendController::onInit(InitEvent &evt)
  { Wheel_one = 0.0;
   Wheel_two = 0.0;
   int argc =0;
   char** argv = NULL;
   my = this->getRobotObj(this->myname());
   my->setWheel(10.0, 10.0);
   ros::init(argc, argv, "Sigvers_controller_node");
   ros::NodeHandle n;
   velocity = 1;
   chatter_pub = n.advertise<std_msgs::String>("CommandMess", 1);
   pose_sub = n.subscribe<Sigvers_Ros::Velocity>("mycommand_velocity",    1,&SendController::poseCallback,this);
   ros::Rate loop_rate(10);
  }

Robot Controller

double SendController::onAction(ActionEvent &evt)
{
 my->setWheelVelocity(Weel_one,Weel_two);
 ros::spinOnce();
 return 1.0;
}

Command Node initialization ROS Side

 CommandSig::CommandSig():
  linear_(0),
  angular_(0),
  l_scale_(2.0),
  a_scale_(2.0)
  {
   nh_.param("scale_angular", a_scale_, a_scale_);
   nh_.param("scale_linear", l_scale_, l_scale_);
   vel_pub_ = nh_.advertise<Sigvers_Ros::Velocity>("mycommand_velocity", 1);
   mess_sub =    nh_.subscribe("CommandMess",100,&CommandSig::chatterCallback,this);
   
   }

Main to execute the Node

int main(int argc, char** argv)
 {
  ros::init(argc, argv, "Sigvers_Command_node");
  CommandSig Command_sig;
  ros::Rate loop_rate(10);
  ros::spin();
  return(0);
 }

Message Sender

Robot Motion Command ROS Side

  void CommandSig::chatterCallback (const std_msgs::String::ConstPtr& msg)
  {
   Sigvers_Ros::Velocity vel;
   if(strcmp("go",msg->data.c_str())==0)
   {
   vel.angular = 3.0;
   vel.linear = 3.0;
   vel_pub_.publish(vel);
   }
   else if(strcmp("back",msg->data.c_str())==0)
  {
   vel.angular = -3.0;
   vel.linear = -3.0;
   vel_pub_.publish(vel);
   }
   else if(strcmp("left" ,msg->data.c_str())==0)
  {
  vel.angular = 0.78;
  vel.linear = -0.78;
  vel_pub_.publish(vel);
  sleep(1.8);
  vel.angular = 0.0;
  vel.linear = 0.0;
  vel_pub_.publish(vel);
  }
  else if(strcmp("right" ,msg->data.c_str())==0)
  {
  vel.angular = -0.78;
  vel.linear = 0.78;
  vel_pub_.publish(vel);
  sleep(1.8);
  vel.angular = 0.0;
  vel.linear =  0.0;
  vel_pub_.publish(vel);
  }
  else if(strcmp("stop",msg->data.c_str())==0)
 {
  vel.angular = 0.0;
  vel.linear = 0.0;
  vel_pub_.publish(vel);
 }
………
}

world file

RobotInMove.xml:

<?xml version="1.0" encoding="utf-8"?>
<world name="myworld1">
 <gravity x="0.0" y="-980.7" z="0.0"/>
<instanciate class="WheelRobot-nii-v1.xml" type="Robot">
   <set-attr-value name="name" value="robot_000"/>
   <set-attr-value name="language" value="c++"/>
   <set-attr-value name="implementation"
                   value="./libSig_app.so"/>
   <set-attr-value name="dynamics" value="false"/>
   <set-attr-value name="x" value="-100.0"/>
   <set-attr-value name="y" value="30.0"/>
   <set-attr-value name="z" value="-130.0"/>
   <set-attr-value name="collision" value="true"/>
   <!--stereo camera right-->
   <camera id="1"
           link="REYE_LINK"
           direction="0.0 -1.0 1.0"
           position="0.0 0.0 3.0"/>
   <!--stereo camera left-->
   <camera id="2"
           link="LEYE_LINK"
           direction="0.0 -1.0 1.0"
           position="0.0 0.0 3.0"/>
   <!--distance sensor-->
   <camera id="3"
           link="WAIST_LINK0"
           direction="0.0 1.0 0.0"
           position="0.0 -5.0 20.0"/>
   <!--monitoring camera-->
   <camera id="4"
           link="WAIST_LINK2"
           direction="0 0 1"
           quaternion="0.0 0.0 -0.966 0.259"
           position="0.0 40.0 120.0"/>
 </instanciate>
</world>

Running the server

To run the server you have to follow the following steps:

Go to catkin_ws and execute the follwing command :

$ roscore
$ rosrun key_sig sig_app 
$ cd ~/catkin_ws/devel/lib/libsig_app
$ sigserver.sh -w ./move_robot.xml

Download the project

To download the project from GIT repository, use the following link:

git@socio4.iir.nii.ac.jp:~/SigverseGitServer/unstable/usersContribution/tafifet/ROS_SIG_Integration.git


Front page   New List of pages Search Recent changes   Help   RSS of recent changes