【机器人学】机器人开源项目KDL源码学习:(9)KDL中的内联函数
在学习KDL源码的时候,发现在“frames.hpp”中使用了大量的内联函数,涉及这些基础的类,向量(vector),旋转(rotation),坐标系(frame),力旋量(wrench),速度旋量(twist)等等。这也说明基础的类的包含的成员函数并不是十分复杂,符合内联函数的特点(规模较小、流程直接、频繁调用)。使用内联函数机制可以减小调用函数的开销。
KDL中的部分类定义(frames.hpp):
class Vector;
class Rotation;
class Frame;
class Wrench;
class Twist;
class Vector2;
class Rotation2;
class Frame2;
Vector部分的成员函数如下(frames.hpp):
class Vector
{
public:double data[3];//! Does not initialise the Vector to zero. use Vector::Zero() or SetToZero for thatinline Vector() {data[0]=data[1]=data[2] = 0.0;}//! Constructs a vector out of the three values x, y and zinline Vector(double x,double y, double z);//! Assignment operator. The normal copy by value semantics.inline Vector(const Vector& arg);//! Assignment operator. The normal copy by value semantics.inline Vector& operator = ( const Vector& arg);//! Access to elements, range checked when NDEBUG is not set, from 0..2inline double operator()(int index) const;//! Access to elements, range checked when NDEBUG is not set, from 0..2inline double& operator() (int index);
具体的定义在“fames.inl”文件中:
IMETHOD Vector::Vector(const Vector & arg)
{data[0] = arg.data[0];data[1] = arg.data[1];data[2] = arg.data[2];
}IMETHOD Vector::Vector(double x,double y, double z)
{data[0]=x;data[1]=y;data[2]=z;
}IMETHOD Vector& Vector::operator =(const Vector & arg)
{data[0] = arg.data[0];data[1] = arg.data[1];data[2] = arg.data[2];return *this;
}
在内联函数较多的情况下,为了避免头文件过长、版面混乱,可以将所有的内联函数定义移到一个单独的文件中去,然后再 用#include指令将它包含到类声明的后面(类的头文件的底部)。这样的文件称为一个内联函数定义文件。按照惯例, 应该将这个文件命名为“filename.inl”,其中“filename”与相应的头文件和实现文件相同。所以在frames.cpp末尾有#include "frames.inl"语句。
【机器人学】机器人开源项目KDL源码学习:(9)KDL中的内联函数相关推荐
- 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵
这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...
- 今年我读了四个开源项目的源码,来分享下心得
今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...
- 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得
今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...
- Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ
每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...
- 鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析
#ifndef __scc #define __scc(X) ((long) (X)) // 转为long类型 typedef long syscall_arg_t; #endif #define _ ...
- BT开源项目Snark源码分析
BT开源项目Snark源码分析 Snark是国外一个开源Java的项目,实现了BitTorrent协议,通过分析此项目的源程序,可以更利于我们更加深入的了解当前流行的BT软件的原理,进而可以指导我们的 ...
- 开源项目Telegram源码 Telegram for Android Source
背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...
- C++学习笔记_3_ C++入门 内联函数
C++学习笔记_3_ C++入门 内联函数 目录 C++学习笔记_3_ C++入门 内联函数 一.内联函数 1.查看方式 2.特性 宏的优缺点 C++有哪些技术替代宏? 一.内联函数 以inline修 ...
- python写个围棋程序_经典python实战项目blog源码学习
这是廖雪峰老师实际项目的源码, python知识学得再多,都不如实战用一回. Day 1 – 搭建开发环境 Day 2 – 编写Web App骨架 Day 3 – 编写ORM Day 4 – 编写Mo ...
- 区块链开源项目Asch源码初探
Asch这个名字是 App Side Chain 的缩写. 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源. 区块链是比特币的底层技术,但是名气低于比特币,但是个人认 ...
最新文章
- C#中 int.TryParse 的用法
- 数据结构——队列(C语言实现)
- WINFORM 多条件动态查询 通用代码的设计与实现
- Java单例模式优化写法
- java中哈希表怎么表示_java中HashMap概念是什么?怎么存取实现它?
- 想尽快进入游戏开发行业的必经之路!
- keepalived+lvs实现高可用的负载均衡
- memcached—Memcache安全性
- 罗盘时钟制作代码_抖音超火的姓氏罗盘壁纸,安卓和苹果都能做
- windows安装python3步骤_windows下python3第三方库安装方法总结
- 137页Python学习笔记,全面总结看这一篇就够了
- Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
- RedHat 网络配置
- 【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
- 记忆力:魔方基础教程
- 航空插头的环境性能科普
- iOS 地图坐标系转换
- Connection could not be established with host smtp.163.com 阿星小栈
- ping oracle 地址,使用 ping 命令探测远程主机 - Oracle Solaris 管理:IP 服务
- 斐波那契数列和斐波那契数
热门文章
- 一般app测试的最佳方法
- 论文阅读笔记《Improving Unsupervised Defect Segmentation by Applying Structural Similarity To Autoencoders》
- 玩转Luat 进阶篇③——远程升级实现过程详解
- 系统设计面试题之 怎么设计一个打分系统
- java实现26个大写字母的遍历
- 投射数据卷Secret、ConfigMap、DownwardAPI
- Ubuntu下locale命令路径无法找到问题解决方法:Cannot set LC_CTYPE to default locale: No such file or directory
- 掌上电脑是不是微型计算机,《掌上电脑Vs.商务通》的背后
- mysql 统计七日留存率_用户七日留存率分析
- java 用户留存率_【java】mongodb 数据统计(留存率) 应该怎么实现?