1.ament编译系统
解析:ament是一种元编译系统,用来构建组成应用程序的多个独立功能包,它并不是一个全新的东西,而是catkin编译系统进一步演化的版本,这两个单词也是近义词。ament主要分为两个部分:
[1]编译系统:配置、编译、安装独立的功能包。
[2]构建工具:将多个独立的功能包按照一定的拓扑结构进行链接。
2.ament命令行工具
解析:ament_tools是ament为用户提供的一种命令行工具,可以让用户完成功能包的编译、测试、安装、卸载,而且它本身也是一个Python的功能包。从功能上来看,ament_tools和cantkin系统中的catkin_tools类似,目前并不提供并行构建的能力,将来应该会加入。
3.ament_target_dependencies
解析:ament_target_dependencies只能链接find_package()找到的包,如果是自定义的库文件,仍需要使用target_link_libraries的方式链接。
说明:ros2的包添加时使用find_package()方式添加,不再需要使用include_directories()和target_link_libraries()来指定包含路径和编译链接库,只需要使用ament_target_dependencies()。
4.INSTALL指令
解析:INSTALL指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。目标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制。如下所示:
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
[1]可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin
目录
[2]动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib
目录
[3]静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic
目录
说明:DESTINATION定义了安装的路径,如果路径以/开头,那么指的是绝对路径,这时候CMAKE_INSTALL_PREFIX其实就无效了。如果你希望使用CMAKE_INSTALL_PREFIX来定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>
。
5.Lambda表达式
解析:Lambda表达式完整的声明格式:[capture list] (params list) mutable exception-> return type { function body }。如下所示:
[1]capture list:捕获外部变量列表
[2]params list:形参列表
[3]mutable指示符:用来说用是否可以修改捕获的变量
[4]exception:异常设定
[5]return type:返回类型
[6]function body:函数体
6.捕获外部变量[隐式捕获]
解析:隐式捕获有两种方式,分别是[=]和[&]。[=]表示以值捕获的方式捕获外部变量,[&]表示以引用捕获的方式捕获外部变量。
说明:捕获外部变量方式:值捕获,引用捕获,隐式捕获,混合方式。
7.捕获外部变量形式说明
解析:
[1][]不捕获任何外部变量
[2][变量名,…]默认以值得形式捕获指定的多个外部变量[用逗号分隔],如果引用捕获,需要显示声明[使用&说明符]
[3][this]以值的形式捕获this指针
[4][=]以值的形式捕获所有外部变量
[5][&]以引用形式捕获所有外部变量
[6][=,&x]变量x以引用形式捕获,其余变量以传值形式捕获
[7][&,x]变量x以值的形式捕获,其余变量以引用形式捕获
8.inttypes.h
解析:inttypes.h是标准C函数库的头文件,提供整数输入的各种转换宏。在系统中,其所在路径为/usr/include/inttypes.h。
9.标准库头文件<cinttypes>
解析:此头文件原作为<inttypes.h>存在于C标准库。提供从C字节字符串与宽字符串到std::intmax_t与std::uintmax_t的转换,为std::intmax_t重载一些数学函数,并为声明于的各个类型提供C风格输入/输出的格式宏。
10.预处理指令
解析:
[1]#error指令将使编译器显示一条错误信息,然后停止编译。
[2]#line指令可以改变编译器用来指出警告和错误信息的文件号和行号。
[3]#pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。
11.C++头文件中#ifndef和#define作用
解析:这可以防止多次包含相同的头文件。
12.add_library
解析:该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。指令语法如下所示:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...])
其中<name>
表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而STATIC、SHARED和MODULE的作用是指定生成的库文件的类型。STATIC库是目标文件的归档文件,在链接其它目标的时候使用。SHARED库会被动态链接[动态链接库],在运行时会被加载。MODULE库是一种不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数。默认状态下,库文件将会在于源文件目录树的构建目录树的位置被创建,该命令也会在这里被调用。
13.target_link_libraries
解析:该指令的作用为将目标文件与库文件进行链接。指令语法如下所示:
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
上述指令中的<target>
是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。
14.link_directories
解析:该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
15.target_compile_definitions
解析:指令语法如下所示:
target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
给给定的<target>
添加编译选项,<target>
指的是由add_executable()产生的可执行文件或add_library()添加进来的库。<INTERFACE|PUBLIC|PRIVATE>
指的是[items…]选项可以传播的范围,PUBLIC and INTERFACE会传播<target>
的INTERFACE_COMPILE_DEFINITIONS属性,PRIVATE and PUBLIC会传播<target>
的COMPILE_DEFINITIONS属性。
16.创建机器人模型步骤
解析:
[1]创建硬件描述包
[2]建立urdf文件
[3]建立launch命令文件
[4]效果演示
17.URDF
解析:Unified Robot Description Format,统一机器人描述格式,简称为URDF。ROS中的urdf功能包包含一个URDF的C++解析器,URDF文件使用XML格式描述机器人模型。
18.Gazebo仿真
解析:Gazebo是用于自主机器人的强大3D模拟环境,其特别适用于测试物体避障和计算机视觉。Gazebo也可以适用于硬件在环仿真和多机仿真。支持机型:四旋翼[Iris和Solo],六旋翼[Typhoon h480],通用四旋翼delta VTOL无人机,尾翼,飞机,探测车,潜艇。
19.机器人导航
解析:定位,构图,路径规划。
20.SDF
解析:SDF is an XML format that describes objects and environments for robot simulators, visualization, and control. Originally developed as part of the Gazebo robot simulator, SDF was designed with scientific robot applications in mind. Over the years, SDF has become a stable, robust, and extensible format capable of describing all aspects of robots, static and dynamic objects, lighting, terrain, and even physics.
21.节点node
解析:ROS中的每个节点用于实现单个模块功能。每个节点都可以通过主题topic,服务service,行动action或参数param向其他节点发送和接收数据。一个完整的机器人系统由许多协同工作的节点组成。在ROS2中,单个可执行文件[C++程序或Python程序等]可以包含一个或多个节点。
22.ROS2发行版本清单
解析:
[1]Dashing Diademata:May 31st, 2019:May 2021
[2]Crystal Clemmys:December 14th, 2018:Dec 2019
[3]Bouncy Bolson:July 2nd, 2018:Jul 2019
[4]Ardent Apalone:December 8th, 2017:Dec 2018
[5]beta3:September 13th, 2017:Dec 2017
[6]beta2:July 5th, 2017:Sep 2017
[7]beta1:December 19th, 2016:Jul 2017
[8]alpha1 - alpha8:August 31th, 2015:Dec 2016
23.Ubuntu 16.04安装moveit2
解析:
[1]安装ROS2 Dashing
export CHOOSE_ROS_DISTRO=Dashing
source ~/ros2_dashing/install/setup.bash
[2]创建一个colcon工作空间
export COLCON_WS=~/ws_ros2/
mkdir -p $COLCON_WS/src
cd $COLCON_WS/src
[3]下载仓库和安装依赖
git clone git@github.com:ros-planning/moveit2.git
vcs import < moveit2/moveit2.repos
rosdep install -r --from-paths . --ignore-src --rosdistro dashing -y
[4]配置和编译工作空间
cd $COLCON_WS
colcon build --event-handlers desktop_notification- status- --cmake-args -DCMAKE_BUILD_TYPE=Release
[5]source工作空间
source $COLCON_WS/install/local_setup.bash
可能遇到的问题,如下所示:
[1]cmake版本问题
[2]by not providing “Findoctomap.cmake” in CMAKE_MODULE_PATH
sudo apt-get install doxygen
git clone https://github.com/OctoMap/octomap
mkdir build
cd build
cmake ..
make
sudo make install
[3]could not find a package configuration file provided by “eigen_stl_containers” with any of the following names
git clone -b ros2 https://github.com/AcutronicRobotics/eigen_stl_containers
[4]pkg_check_modules(LIBFCL REQUIRED “fcl>=0.5.0”)
git clone -b 0.5.0 https://github.com/flexible-collision-library/fcl
cd fcl
mkdir build
cd build
cmake ..
make
sudo make install
[5]could not find a package configuration file provided by “angles”
git clone -b ros2 https://github.com/ros/angles
[6]Target “test_robot_model” links to target “Eigen3::Eigen” but the target was not found
解析:
https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2
说明:eigen源码编译后仍然不行,解决方法是注释/home/xxx/ws_ros2/src/moveit2/moveit_core/robot_model/CMakeLists.txt文件中target_link_libraries的Eigen3::Eigen。
24.摄像头工作原理
解析:景物通过镜头[LENS]生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D[模数转换]转换后变为数字图像信号,再送到数字信号处理芯片[DSP]中加工处理,再通过USB接口传输到电脑中处理,通过显示器就可以看到图像了。
25.广角摄像头
解析:一种可视角度在120度以上的摄像头。广角镜头是一种焦距短于标准镜头、视角大于标准镜头、焦距长于鱼眼镜头、视角小于鱼眼镜头的摄影镜头。广角镜头又分为普通广角镜头和超广角镜头两种。
参考文献:
[1]ROS 2 Documentation:https://index.ros.org/doc/ros2/
[2]Cmake实战指南:https://www.jianshu.com/p/aaa19816f7ad
[3]cnurdf:http://wiki.ros.org/cn/urdf
[4]AGV车载控制系统搭建:https://blog.csdn.net/nick123chao/article/details/79426924
[5]ros-planning/moveit2:https://github.com/ros-planning/moveit2
[6]OctoMap/octomap:https://github.com/OctoMap/octomap
[7]AcutronicRobotics/eigen_stl_containers:https://github.com/AcutronicRobotics/eigen_stl_containers
[8]flexible-collision-library/fcl:https://github.com/flexible-collision-library/fcl