c++运动学正反解 ros_大白菜的ROS笔记1(LINUX下C++基础命令)

这是我个人3-4个月学习 ROS的笔记。 感觉很丰富能适合从0到入门,并且解决一定的理论,仿真问题,由于本彩笔没有工程经验,所以解答不了太多问题。
本教程一共100页word,包含我自己学习过程中所有遇到问题贺解决方案,适用对象:入门小白,巩固ROS细节,机械臂方向(无AGV传感器等)。
从基础LINUX C++命令 到后续ROS都包含了一些哈。
自己新建包或者用新功能的时候一定要注意功能包的依赖,否则无法实现功能!!!
还有机器人模型不要存在纯数字,中文!!!!!!!!!!!!!!!
- Linux ROS下基础命令,注意后面有些地方命令符~可能会写成了-
打开新终端Ctrl+alt+t ; 在终端中开一个终端 ctrl+shift+t; 关闭当前运行程序 ctrl+c;
当新建功能包后无法自动tab出后,需要使用roscd 寻找一次,然后就可以自动tab出;
rosdep自动安装功能包依赖的其他包;
~当前目录,~ 为/home/用户名 , /根目录最顶层目录也就是计算机最顶层目录 ,cd ~/进入用户根目录 ,
cd ~/. cd cd ~/效果一样 . 句点代表此目录本身,一般可以不写。 运行./当前目录下文件。运行 ~/.X 是主目录下隐藏文件X。

ls显示当前目录下所有未隐藏的文件。
使用vim命令 首先安装vim sudo apt install vim
打开文件 输入 i就行修改插入 esc退出 :wq保存退出 :q! 不保存强退。
显示行号:set nu;ctrl+h组合键可显示隐藏文件合文件夹;pwd显示当前路径;
linux中编写运行c++,在IDE中存在运行cin程序卡住问题,所以最好在终端运行

首先vim编写cpp文件,然后g++命令生成可执行文件Hello.exe。最后在当前目录下运行Hello程序。
linux下编写python后,运行python(python3) XXX.py。ROS中使用py只需要:chmod +x XXX.py,给文件添加执行权限,或者文件右键开启可执行。
快速搜索在目录下的含有关键字的文件,方便查找话题订阅发布关系。gre -r


目录下删除文件命令,适用于catkin_make后报错,重新配置devel build文件夹
使用rm -rf 目录名字 命令即可
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思
eg
删除文件夹实例:rm -rf /var/log/httpd/access
将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
删除文件使用实例:rm -f /var/log/httpd/access.log
将会强制删除/var/log/httpd/access.log这个文件
- C++
#include <sstream>
#include "ros/ros.h"
<>与“”区别 前者为系统路径,标准库。后者是当前路径自定义或第三方库

argv[]是一个字符数组.
argv[0]:指向程序的全路径名
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向第二个字符串。
说一下main(int argc, char *argv[])函数的两个形参(char *argv[]或者char ** argv形式,char **argv[]报错),第一个int argc,是记录你输入在命令行上的字符串个数;第二个argv[]是个指针数组,存放输入在命令行上的命令(字符串)。由于[ ] 的优先级高于* 所以a先和 [ ]结合,他还是一个数组,数组中的元素才是char *指针变量 ,前面讲到char * 是一个指针变量,保存的地址,保存的是数组中每个元素的地址。
返回值,除非明确声明不返回值。否则函数必须有一个返回值,main()也是函数,且总返还整数,return 0成功运行 -1错误,比如void就无需返回。
函数声明+定义,如果在main前面定义函数,则不用单独声明。否则需要单独声明。
字符串char greeting[6] = {'H', 'e', 'l', 'l', 'o', '0'}; string str1 = "Hello";这里string是类,需要包含string头文件 和std::string
定义变量时候,对于全局变量和局部静态变量,如果没有初始化值,那么系统默认赋值为0。对于局部变量,如果没有赋初值,那么默认为随机值,即什么值都有可能,如果其初值不重要,或者不会影响程序结果,比如在定义后,下一步就是对其进行输入等从其它渠道获取值的代码,那么可以不赋初值,否则最好还是给一个初值。
sizeof():返回所占总空间的字节数。str.length()和str.size()都可以求字符串长度。其中str.length()和str.size()是用于求string类对象的成员函数。
cin>>xx 命令,如果输入带空格,则空格后的字符串忽略。getline(cin , xxxx)函数可以解决这个问题,输入到变量XXXX回车结束。cout<<xx<<xx<<xx,默认每个输出变量之间带空格。
if ()后面不要加; 否则终止判断,if else if一旦某个 else if 匹配成功,其他的 else if 或 else 将不会被测试。
for (int counter=0; counter<xxxxx; ++counter) continue跳过当前循环后面的,回到循环开始进行下一次循环(针对for循环,先进行第三条语句,在判断)。break退出循环,结束当前循环,只向外跳一层。return退出当前函数模块。
const x常量 声明后不可修改。 数组 int x[5] ={0,1,2}; 数组索引从0开始。字符数组char ss[]={‘a’,’0’} 最后一个0是字符表示到此结束,如果不加,cout只有遇见空字符才会结束,所有会有乱码。不会改变数组长度。C语言中规定数组代表数组所在内存位置的首地址,也是ss[0]的地址,即ss = &ss[0],可将数组名赋值给指针但是不能反过来; C语言中字符串常量的本质表示其实是一个地址, 举例:
char *s ;
s = "China";可以把一个字符串赋给一个指针变量。
指针和引用,int * xx=NULL如果不复赋值,则需要初始化。 &XX获取XX变量的地址。int * zz=&xx, 通过*zz可以解除地址获取内容,当时zz还是指针。
const int * xx =&x 地址可以改,内容不能改。 int * const xx=&x 内容可以改,地址不能改。
引用 int & xx=a。一般函数使用引用传参。

引用传参可以在函数外调用函数的参数。注意这里是定义的时候加引用,不能在调用得时候加!

禁止修改传入的参数值则使用const定义。


函数使用指针作为参数,注意,函数定义时候,定义指针参数,所以在调用函数时候必须要加&取地址,否则报错。上面两图区别在于定义函数参数时 有无&,对结果没影响,解释了后面ROS调用ms可以不加&。
最好都用引用和指针形式,效率上讲,指针传递和引用传递比值传递效率高。但是在定义时候要明确,定义什么样的指针变量是普通指针变量还是对象指针变量,需要根据传入的参数确定。
类,使用句点访问类成员变量和方法。
点运算符“.”和箭头运算符“->”,都可以用于访问成员,其中点运算获取类对象的一个成员,箭头运算获取指针指向对象的成员。
对象指针的一般概念
对象指针:指向类的成员的指针。在C++中,可以说明指向类的数据成员和成员函数的指针。对象指针遵循一般变量指针的各种规则:类名 *对象指针名,通过对象指针,可以访问到所指向对象的公有成员。
指向对像的指针
在建立对像时,编译系统会为每一个对像分配一定的存储空间,以存放其成员,对像空间的起始地址就是
对像的指针。可以定义一个指针变量,用来存和对像的指针。如果有一个类:
Time *pt;//定义pt 为指向Time类对像的指针变量,不能单独存在。
Time t1;//定义t1为Time类对像
pt=&t1;//将t1的起始地址赋给pt
这样,pt 就是指向Time类对象的指针变量,它指向对象t1。
定义指向类对象的指针变量的一般形式为:类名 *对象指针名;
可以通过对象指针访问对象和对象的成员。如:
*pt // pt所指向的对像,即t1
(*pt).hour // pt所指向的对象中的hour成员,即t1.hour
pt->get_time() // pt把指向的对象中的get_time函数,即t1.get_time()
(*pt).get_time() // 另外,注意:因为解引用运算符的优先级低于点运算符,所以执行解引用运算的子表达式两端必须加上括号。例如:
*p.size(); // 这就是错误的,p是一个指针,没有size对象。
构造函数,与类同名,且不返回任何值,也可以重载。总是在创建对象时被调用,让对象中的成员初始化

上面的public Human()是默认构造函数,下面的是指定输入的构造函数
命名空间,一个文件可以包含多个命名空间,一个命名空间可以分布在多个文件中,头文件就是命名空间的载体,就像函数写在cpp文件中。
ROS(命名)空间, ros::XX ros空间中的类,函数ros::XX A为定义类对象A A.B A中成员B。只有对象实例才能用句点 .
C++调用类中函数,如像py一样,则类中函数必须是static才可以, A::B() ,A类B函数,否则只能通过对象实例调用方法。
结构体也可以用这样表示
Int a=1, int &b=a,引用,b等于a,int *c=&a 指针。
return语句用来结束循环,或返回一个函数的值。
return 0:一般用在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。
return -1::表示返回一个代数值,一般用在子函数结尾。按照程序开发的一般惯例,表示该函数失败;return 0代表函数正常终止
return 1代表函数非正常终止等效于-1。
- Python
懒得写了。。。因为我很少用
更多推荐
所有评论(0)