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

Written by Ruben Alves

16/11/2017

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

Topics:
Masterclass 2023 batch2 blog banner

Check Out These Related Posts

129. ros2ai

129. ros2ai

I would like to dedicate this episode to all the ROS Developers who believe that ChatGPT or...

read more

0 Comments

Submit a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Pin It on Pinterest

Share This