写在前面

我想复现一下胡春旭老师的《ROS机器人开发实践》里的server和client案例,具体原理还请各位移步书籍查询,本篇博客主要记录案例实践过程中遇到的一些问题以及解决方法。

这次主要遇到了以下这几个问题:

1:run_depend替换;

2:缺少geometry_msgs依赖;

3:用vscode远程服务器上时报错找不到ros.h头文件

client和server

源码我是对着书写的,配置好正确的CMakeLists.txt和package.xml之后是可以正常运行的。

//client.cpp
#include <cstdlib>
#include "ros/ros.h"
#include "learning_communication/AddTwoInts.h"

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

    if(argc != 3){
        ROS_INFO("usage: add_two_ints_client X Y");
        return 1;
    }

    ros::NodeHandle n;
    ros::ServiceClient client = n.serviceClient<learning_communication::AddTwoInts>("add_two_ints");

    learning_communication::AddTwoInts srv;
    srv.request.a = atoll(argv[1]);
    srv.request.b = atoll(argv[2]);

    if(client.call(srv)){
        ROS_INFO("Sum: %ld", (long int)srv.response.sum);
    }else{
        ROS_ERROR("Failed to call service add_two_ints");
        return 1;
    }

    return 0;
}
//server.cpp
#include "ros/ros.h"
#include "learning_communication/AddTwoInts.h"

bool add(
    learning_communication::AddTwoInts::Request &req,
    learning_communication::AddTwoInts::Response &res)
{
    res.sum = req.a + req.b;
    ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
    ROS_INFO("sending back respone: [%ld]", (long int)res.sum);

    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle n;

    ros::ServiceServer service = n.advertiseService("add_two_ints", add);

    ROS_INFO("ready to add two ints.");
    ros::spin();

    return 0;
}
  <!--package.xml部分内容-->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <build_depend>message_generation</build_depend>
  <!-- <run_depend>message_runtime</run_depend> -->
  <exec_depend>message_runtime</exec_depend>

  <build_depend>geometry_msgs</build_depend>
  <exec_depend>geometry_msgs</exec_depend>

  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

问题描述

首先是我按照书里的步骤进行编译的时候报了这第一个错误:

仔细看这个,提示是让我们这样做替换的,在package.xml文件里改:

  <!-- <run_depend>message_runtime</run_depend> -->
  <exec_depend>message_runtime</exec_depend>

这之后又报了一个错误:

因为server和client进行通讯的时候用了自定义的信息类型,但是我们没有添加相关的依赖,所以要添加下面这个依赖:

  <build_depend>geometry_msgs</build_depend>
  <exec_depend>geometry_msgs</exec_depend>

然后我想先看一下这个信息类型Person的内容,但是又报错了:

这个问题就把我难住了,因为他并没有提示我怎么做,或者说为什么出错了,我想了很久也没想明白。直到我输入了下面这个命令:

source ./devel/setup.bash

最后成功了查看消息类型:

没错,我没有进行source,编译器当然找不到这个msg类型了。

这也更加提醒了我一个问题,当看到奇奇怪怪的,没有明确错误原因的报错信息时先问问自己:

1:source ./devel/setup.bash 了吗?

2:catkin_make 了吗?

3:catkin_init_workspace 了吗?

4:所在的目录正确吗?

以上确认了之后再去查找其他原因。

还有用vscode远程服务器进行编程的时候可能会看到如下这个问题:

这是因为vscode在本地机器上找不到ros相关的头文件,而这个头文件在服务器里面的ros里是可以找到的,所以vscode才报了这个错误,可以忽略,如果不喜欢看红色波浪线的话可以设置忽略的。

参考文献

https://blog.csdn.net/suoniyusanxing/article/details/107335274

https://blog.csdn.net/liuyuekelejic/article/details/105322184

https://answers.ros.org/question/220575/how-to-solve-add_dependencies-adding-dependency-to-non-existent-target/

https://blog.csdn.net/AV_woaijava/article/details/90049801