[ROS Q&A] Printing message in launch file


Q: I am wondering if there is any way to print message from launch file. For example, I am calling a node from launch file and I do not want the user to terminate this process.

A: The best way is to create a simple Python script that does that.

[ROS Q&A] Testing scripts in Drone Simulation


In this video we show how to test scripts in a drone simulation. See question: https://answers.ros.org/question/275593/importerror-no-module-name-drone_status/
Q: Hello,

I am just starting out with learning ROS. I tried simulating the Ardrone, using the tum simulator on ROS Indigo and Gazebo2. Ref: https://github.com/dougvk/tum_simulator

I am trying to implement this code – https://github.com/amroygaol/AR_Drone… . I followed through the instructions, however, I keep getting an error,

ImportError:No module named drone_status.

A: You can get the DroneStatus function from here: https://github.com/mikehamer/ardrone_tutorials_getting_started

[ROS Q&A] Couldn’t find an AF_INET address for [ ]

[ROS Q&A] Couldn’t find an AF_INET address for [ ]

Hi! In this video we see how to solve the problem “Couldn’t find an AF_INET address for []” by answering a real question on ROS Answer.

Step1. Create a project in Robot Ignite Academy(RIA)

We have the best online ROS course available in RIA. It helps you learn ROS in the easiest way without setting up ROS environment locally. The only thing you need is a browser! Create an account here and start to browse the trial course for free now!

Step 2. Create new package and source file

You can type the following command in a shell to create a new package called tutorial with the roscpp and std_msgs dependencies.

cd ~/catkin_ws/src
catkin_create_pkg tutorial roscpp std_msgs

Now create a source file called tutorial_node.cpp under the tutorial/source directory and paste the following code from ROS Wiki

#include "ros/ros.h"
#include "std_msgs/String.h"

#include <sstream>

/**
 * This tutorial demonstrates simple sending of messages over the ROS system.
 */
int main(int argc, char **argv)
{
  /**
   * The ros::init() function needs to see argc and argv so that it can perform
   * any ROS arguments and name remapping that were provided at the command line.
   * For programmatic remappings you can use a different version of init() which takes
   * remappings directly, but for most command-line programs, passing argc and argv is
   * the easiest way to do it.  The third argument to init() is the name of the node.
   *
   * You must call one of the versions of ros::init() before using any other
   * part of the ROS system.
   */
  ros::init(argc, argv, "talker");

  /**
   * NodeHandle is the main access point to communications with the ROS system.
   * The first NodeHandle constructed will fully initialize this node, and the last
   * NodeHandle destructed will close down the node.
   */
  ros::NodeHandle n;

  /**
   * The advertise() function is how you tell ROS that you want to
   * publish on a given topic name. This invokes a call to the ROS
   * master node, which keeps a registry of who is publishing and who
   * is subscribing. After this advertise() call is made, the master
   * node will notify anyone who is trying to subscribe to this topic name,
   * and they will in turn negotiate a peer-to-peer connection with this
   * node.  advertise() returns a Publisher object which allows you to
   * publish messages on that topic through a call to publish().  Once
   * all copies of the returned Publisher object are destroyed, the topic
   * will be automatically unadvertised.
   *
   * The second parameter to advertise() is the size of the message queue
   * used for publishing messages.  If messages are published more quickly
   * than we can send them, the number here specifies how many messages to
   * buffer up before throwing some away.
   */
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

  ros::Rate loop_rate(10);

  /**
   * A count of how many messages we have sent. This is used to create
   * a unique string for each message.
   */
  int count = 0;
  while (ros::ok())
  {
    /**
     * This is a message object. You stuff it with data, and then publish it.
     */
    std_msgs::String msg;

    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());

    /**
     * The publish() function is how you send messages. The parameter
     * is the message object. The type of this object must agree with the type
     * given as a template parameter to the advertise<>() call, as was done
     * in the constructor above.
     */
    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }


  return 0;
}

To compile the code, let’s move to tutorial/CMakeLists.txt and uncomment the following part

...
add_executable(${PROJECT_NAME}_node src/tutorial_node.cpp)
...
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

Now you can run catkin_make  and source devel/setup.bash under the catkin_ws to compile the code and run it with

rosrun tutorial tutorial_node

Notice:

We no longer run the ros master for you in RDS, to start a ros master type roscore  in a new shell.

Now you should see the publisher is publishing.

Step 3. Reproduce the error

You can simply have this error if you put the node initializer before the node handle create

...
  ros::init(argc, argv, "talker"); //Correct place: Before the node handle create

  ros::NodeHandle n;
  
  //ros::init(argc, argv, "talker"); //Wrong place
...

Take away today:

You must call ros::init() before creating the first NodeHandle

 

Edit by Tony Huang

[ROS Q&A] Aerodynamic parameters of lift-drag plugin


Learn how to use the lift drag plugin in GAzebo using ROS and urdfs: http://answers.gazebosim.org/question/15331/need-information-on-aerodynamic-parameters-of-lift-drag-plugin/

Q:Need information on aerodynamic parameters of lift-drag plugin
A: Create a simple sphere moved by a moving fin that has applied drag coeficients and no lift.

[ROS Q&A] – Service global name error


Q: I’m having a lot of troubles doing the following in ROS: I would like to subscribe to a fakeARpublisher and resend a pose information through a service. In short, I did a script that it is subscribed to a topic and at the same time acts like a server for a service called LocalizePart. The code is given below:

A: Hello,

I had formatted your code got something like this:

Finally, I’ve reproduced your problem and concluded that to solve it you only have to import the server response library.

ROS creates 3 classes for each service message: Service definition, Request message and Response message. You should take a look here: http://wiki.ros.org/rospy/Overview/Services

Following the code I’ve posted, I had just to replace this:

from myworkcell.srv import LocalizePart

with this:

from myworkcell.srv import LocalizePart, LocalizePartResponse

I hope it can help you!

[ROS Q&A] Navigate with RTAB-Map


In this video we show how to Navigate using the move_base node combined with RTAB-Map. See question: https://answers.ros.org/question/275410/navigation/

Q: I have obtained a map using RTAB-Map. Now I want to use the point cloud obtained to navigate.

A: You need to do several things:
1. Built a 2D map based on LaserScan.
2. Tune a little bit the rtabmap_ros node.
3. Localize the robot in the map.
4. Navigate!

Pin It on Pinterest