Robotics StackExchange | Archived questions

How do I run cpp in a launch file?

So I got this code so far:

<launch>

<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>

<node pkg="turtlesim" name="teleop" type="turtle_teleop_key">
  <remap from="/turtle1/cmd_vel" to="/turtlesim1/turtle1/cmd_vel"/>
</node>

</launch>

and this cpp code :

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <signal.h>
#include <termios.h>
#include <stdio.h>

#define KEYCODE_R 0x43 
#define KEYCODE_L 0x44
#define KEYCODE_U 0x41
#define KEYCODE_D 0x42
#define KEYCODE_Q 0x71

class TeleopTurtle
{
public:
  TeleopTurtle();
  void keyLoop();

private:


  ros::NodeHandle nh_;
  double linear_, angular_, l_scale_, a_scale_;
  ros::Publisher twist_pub_;

};

TeleopTurtle::TeleopTurtle():
  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_);

  twist_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1);
}

int kfd = 0;
struct termios cooked, raw;

void quit(int sig)
{
  (void)sig;
  tcsetattr(kfd, TCSANOW, &cooked);
  ros::shutdown();
  exit(0);
}


int main(int argc, char** argv)
{
  ros::init(argc, argv, "teleop_turtle");
  TeleopTurtle teleop_turtle;

  signal(SIGINT,quit);

  teleop_turtle.keyLoop();

  return(0);
}


void TeleopTurtle::keyLoop()
{
  char c;
  bool dirty=false;


  // get the console in raw mode                                                              
  tcgetattr(kfd, &cooked);
  memcpy(&raw, &cooked, sizeof(struct termios));
  raw.c_lflag &=~ (ICANON | ECHO);
  // Setting a new line, then end of file                         
  raw.c_cc[VEOL] = 1;
  raw.c_cc[VEOF] = 2;
  tcsetattr(kfd, TCSANOW, &raw);

  puts("Reading from keyboard");
  puts("---------------------------");
  puts("Use arrow keys to move the turtle.");


  for(;;)
  {
    // get the next event from the keyboard  
    if(read(kfd, &c, 1) < 0)
    {
      perror("read():");
      exit(-1);
    }

    linear_=angular_=0;
    ROS_DEBUG("value: 0x%02X\n", c);

    switch(c)
    {
      case KEYCODE_L:
        ROS_DEBUG("LEFT");
        angular_ = -1.0;
        dirty = true;
        break;
      case KEYCODE_R:
        ROS_DEBUG("RIGHT");
        angular_ = 1.0;
        dirty = true;
        break;
      case KEYCODE_U:
        ROS_DEBUG("UP");
        linear_ = -1.0;
        dirty = true;
        break;
      case KEYCODE_D:
        ROS_DEBUG("DOWN");
        linear_ = 1.0;
        dirty = true;
        break;
    }


    geometry_msgs::Twist twist;
    twist.angular.z = a_scale_*angular_;
    twist.linear.x = l_scale_*linear_;
    if(dirty ==true)
    {
      twist_pub_.publish(twist);    
      dirty=false;
    }
  }


  return;
}

the teleop.cpp has been modded from original code so that the turtle moves and rotates in opposite direction from its original code.

However, I don't know how to implement this cpp code into the launch file so that turtlesim2 follows this code, while turtlesim1 follows the original code.

If anyone can help me out it would be greatly appreciated.

Asked by Hyoungmin on 2018-12-03 22:53:06 UTC

Comments

Answers

hi
first you need to creak pkg in your work space and compile the code and create node then you can use this launch file

<launch>

<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>

<node pkg="turtlesim" name="teleop" type="turtle_teleop_key">
  <remap from="/turtle1/cmd_vel" to="/turtlesim1/turtle1/cmd_vel"/>
</node>

<node pkg="your_pkg" name="your-name" type="your type">//add this part
  <remap from="/turtle2/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
</launch>

Asked by Hamid Didari on 2018-12-03 23:44:24 UTC

Comments

Hey,

So I tried

<node pkg="beginner_tutorials" name="teleop2" type="teleop.cpp">
<remap from="/turtle2/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>

but it gives me

Asked by Hyoungmin on 2018-12-03 23:50:46 UTC

but it gives me

ERROR: cannot launch node of type [beginner_tutorial/telop.cpp]: beginner_tutorial
ROS path [0]=/opt/ros/kinetic/share/ros
ROS path [1]=/home/username/catkin_ws/src
ROS path [2]=/opt/ros/kinetic/share

I don't know what I'm doing wrong...

Asked by Hyoungmin on 2018-12-03 23:51:06 UTC

can you run your node with rosrun?

Asked by Hamid Didari on 2018-12-04 01:42:29 UTC

no it won't, and I have no idea how to make it run...

Asked by Hyoungmin on 2018-12-04 01:59:16 UTC

You have to compile the cpp source file into an executable binary before it can be used. Please look at he tutorials for cpp nodes, they explain all of this

Asked by PeteBlackerThe3rd on 2018-12-04 03:06:20 UTC

I shall do so. Thank you for the reference.

Asked by Hyoungmin on 2018-12-04 03:26:22 UTC

In addition to compiling the source code I had to change the type in the following line in the first comment by dropping the .cpp extension:

From

<node pkg="beginner_tutorials" name="teleop2" type="teleop.cpp">

to

<node pkg="beginner_tutorials" name="teleop2" type="teleop">

Asked by Caleb on 2020-08-18 13:34:38 UTC