写在前面

我想复现一下胡春旭老师的《ROS机器人开发实践》里的talker和listener案例,具体原理还请各位移步书籍查询,本篇博客主要记录案例实践过程中遇到的一些问题以及最后编译成功的效果。

talker和listener源码

我先放一下这两份实现的源码,我是对着《ROS机器人开发实践》里的例程写的:

/*
 * talker.cpp
 *
 */


#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"

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

    ros::NodeHandle n;

    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

    ros::Rate loop_rate(10);

    int cnt = 0;

    while(ros::ok()){
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world" << cnt;
        msg.data = ss.str();

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

        ros::spinOnce();

        loop_rate.sleep();

        ++cnt;

    }

    return 0;
}
/*
 * listener.cpp
 *
 */


#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("I heard: [%s]", msg->data.c_str());
}

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

    ros::NodeHandle n;

    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

    ros::spin();

    return 0;
}

然后跟着书里进行编译运行操作的时候就出错了,具体错误放在下面。

问题以及解决方法

上面是我遇到的第一个问题,也就是cmake的问题,看这个报错是dependencies的问题,那让我们先来看一下CMakeLists.txt里的内容:

那我们把add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)给注释掉之后编译成功:

注释掉的效果如下所示:

最后的运行结果如下所示:

可以看到最后的运行结果里,listener漏接了几个数据,这个是因为我先开的talker节点,之后再开的listener节点,中间有一定时延的。

最后附上CMakeLists.txt的文件内容:

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  message_generation
  roscpp
  rospy
  std_msgs
)
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime 
)
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

add_executable(talker src/talker.cpp)    
target_link_libraries(
  talker
  ${catkin_LIBRARIES}
)

add_executable(listener src/listener.cpp)
target_link_libraries(
  listener
  ${catkin_LIBRARIES}
)

/dev/sda1: UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY

有一次虚拟机因为一些原因非正常关机了,然后重启虚拟机里的ubuntu系统的时候报了第一个红框内的错误,输入第二个红框内的命令解决了我的问题,如果大家也遇到了同样的问题,可以尝试一下。

命令:

fsck -y /dev/sda1