目录
前言
1快捷键
2通信机制
2.1话题通信
2.2服务通信
2.3参数服务器
前言:跟着赵虚左老师学习ros,过程中犯了很多错踩了很多坑,所以打算记录下来,防止再犯的同时如果能帮助到大家就更好了!同时包含一些基础概念与操作用以巩固,基本上摘取自老师的文档以便重点复习。
1快捷键
shift+tab前进一格,tab后退一格
ctrl+f替换名称
alt+方向键移动代码上下顺序
vscode内文件分屏ctrl+\
ctrl+shift+o右边新开终端
ctrl+shift+e左边新开终端
ctrl+s保存
ctrl+shift+b编译
Ctrl+~进入终端
Ctrl+/自动去除#
Ctrl+h在主目录下显示隐藏目录
ctrl+alt+t 打开终端
ctrl+shift++- 放大缩小
win+空格 切换输入法
ctrl+shift+空格 调出参数列表显示
光标放在最右边不必选中直接快捷键复制粘贴
tab键(1)移动光标(2)补齐该终端下的命令
2.1话题通信(发布订阅模式)
特点:talker和listener没有启动先后顺序的要求,且建立连接后不再需要ros master
常见报错:
ros/ros.h No such file or directory .....
检查 CMakeList.txt find_package 出现重复,删除内容少的即可
<1>发布方
注意事项:老师没有演示新建Demo3的过程就打开vscode开始操作了!大伙儿如果跟我一样不细心,就容易接着上一p的内容在Demo2下面直接新建功能包了!这样会在编译过程不断报错。
1.创建工作空间,即新建一个Demo3,操作如下
(1)打开终端输入命令行
mkdir -p demo03_ws/src
cd demo03_ws/
(注意不要漏掉最后的/)
catkin_make
注意,在demo03_ws此目录下启动vscode的命令为 code .
(2)创建编译环境,快捷键ctrl+shift+b,选择catkin_make:build,点击右边小齿轮,在老师提供的安装vscode的文件里面复制粘贴修改,再在src下右键创建功能包。
(3)在cpp里打代码时注意可以输入main函数再按tab补齐,别忘了删掉参数里面的const,头文件#include"ros/ros.h" 别把/和.位置弄反了。如果coding过程中报错,检查一下语言模式有没有改为Makefile
(4)修改配置文件
(5)任何vscode保存(Ctrl+s)后编译无问题,打开终端roscore,再开一个新的切到当前目录然后source ./devel/setup.bash,然后rosrun 加功能包名字加该功能包下src下文件名(不加cpp)
然后开一个新终端rostopic echo fang(fang为话题名称),注意要同时打开roscore rosrun rostopic 三个终端,这一步如果报错error: topic must be specified
回到demo03空间下catkin_make再source
<2>订阅方
1.注意三个终端,要先把订阅和发布的终端切到当前目录并分别catkin_make
注意事项:
1.可以使用 rqt_graph 查看节点关系
2.
订阅时,第一条数据丢失
原因: 发送第一条数据时, publisher 还未在 roscore 注册完毕
解决: 注册后,加入休眠 ros::Duration(3.0).sleep(); 延迟第一条数据的发送
2.2服务通信
特点:实时性和逻辑处理
2.2.1自定义srv
1.按照固定格式创建srv文件
功能包下新建srv目录并添加后缀为srv的文件
# 客户端请求时发送的两个数字
int32 num1
int32 num2
---
# 服务器响应发送的数据
int32 sum
2.编辑配置文件
(1)package.xml中添加编译依赖和执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
(2)CMakeList.txt编辑相关配置
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(#这里就需要进行更改了
FILES
AddInts.srv #srv之前的为自定义文件名
)
generate_messages(
DEPENDENCIES
std_msgs
)
(3)编译生成中间文件
C++ 需要调用的中间文件(.../工作空间/devel/include/包名/xxx.h)
后续调用相关 srv 时,是从这些中间文件调用的
2.2.2 srv文件的调用
流程:
0.vscode配置
- 编写服务端实现;
- 编写客户端实现;
- 编辑配置文件;
- 编译并执行。
0.vscode配置
配置c_cpp_properies.json 文件,如果以前已经配置且没有变更工作空间,可以忽略
其中需要修改部分在下述代码
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
注意事项:
1.在末尾添加路径后要在上一条路径末尾加上逗号
2.添加路径时仿照系统写至include/,后面以**抽象替代
3."cStandard"为c11,不是c++11,也不是c17
"cppStandard"为c++17
知识大总结:
(1)roslaunch启动前会先检查roscore是否启动,若没启动会自动启动
(2)追加功能包直接改配置文件就好,不必删掉重来
错误大总结:
1.首先第一个错误是建立srv文档时AddInt中的i错误设置为小写了,此时已经在devel/include/plumbing_server_client目录下建立了错误的小写般头文件,后来直接重命名更改,所以生成了两份除大小写外一致的文件。弥补措施是删除了小写的错误版本,但还是不可行
删除之后的报错如下
/home/coal/demo03_ws/src/plumbing_server_client/src/demo01_server.cpp:7:37: error: ‘plumbing_server_client::AndInts’ has not been declared
7 | bool doNums(plumbing_server_client::AndInts::Request &request,
2.错误:把catkin的CMakeList改掉了,而且作为动态链接,修改一个另一个也会被更改,修改了你的一个工作空间的主CMakeLists.txt文件的,下一个工作空间也会一直用已经修改的那个文件的代码,导致无法挽回的错误。
重新按照教程打了一遍,成功后在服务器终端不小心键入了e,导致不停在总文件的CMakeList里面键入e,删除了pplumbing_server_client后发现还是报错,打开终端键入ctrl+c终止键入。但CMakeList原文件找不到了。
报错如下:CMake Error at CMakeLists.txt:12 (execute_process): execute_process given unknown argument "ERROR_STRIP_TRAILG_WHITESPACE".
拯救方案:
通过核对文件内容发现我在清除e时不小心删除了多余的文档内容,其中TRAILG应为TRAILING,修改之后编译成功!
3.需要两次键入tab才能显示完整命令行
4.修改配置文件时不细心,复制时缺漏内容
一开始检查发现devel/lib下面没有demo02_client,直接建立了文件,但是不同于本来就有的demo01_server(二进制文件不支持打开),为空白文档仍然报错。后来核对配置文件找到错误。
5.区别同名,两个response但要选钥匙图标的
6.json文件中路径查看
选中devel/include右键在集成终端打开然后键入pwd
7.tab不能补齐
(1)第一次键入时为正常现象
(2)刷新环境
(3)检查是否在当前目录文件下,是否进入对应的工作空间
8.报错显示核心已转储的是因为节点名称“my_contorl”中把_打成空格了
9./的位置,最后一行在字母前,第二行在引号后面
10.0要打在引号外面
11.打不开VirtualBox
重启电脑之后成功打开
12.The VM sesseion was aborted(异常退出)
(1)取消设置中声音的配置(设置——声音——启用声音 取消勾选)
(2)再重启电脑
13.别忘记切换目录
14.添加头文件并保存编译后仍然报错
(1)重启vs,成功了一次
(2)第二次不成功,排查到配置文件发现路径中include后多打了一个空格,并且把所有直接去掉#的内容补回去了
15.没有启动roscore
16.忘记打/
17.挨个添加配置文件的turtle仍然报错,但rename02成功了,初步怀疑是添加功能包错了,明天再查
没查,但是另一个文件报错提示相同,关掉vscode再打开就能编译了