写在前面
我想复现一下胡春旭老师的《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
评论(0)
您还未登录,请登录后发表或查看评论