系列文章目录

【ROS基础】Linux 命令行
【ROS基础】.launch 文件语法记录
【ROS基础】CMakeLists.txt 文件语法记录
【ROS基础】Package.xml 文件语法记录
【ROS基础】ROS_c++ 语法记录


前言

接触ROS后才开始使用命令行,好记性不如烂笔头。

1、初相见时的疑惑

① 用户名(userName):jyc
@ 仅起间隔作用
③ 主机名(hostName):hn
④ :仅起间隔作用
⑤ 当前路径: ~ 当前用户的home目录,普通用户等价于 /home/jyc,root用户等价于 /root
⑥ 权限标志位: #代表root,$代表普通用户


补充1、sudo 和 su 命令的全称

  • sudo: superuser do 它是一个系统权限管理命令,可以让非root的用户运行只有root才有权限执行的命令,如halt,reboot,su等等。
  • su: switch user 它是一个更换使用者身份的命令,除 root 切其他用户外不用输密码,普通用户切其他用户都需要键入密码。

2、修改密码、主机名、用户名

修改密码

打开终端,输入:sudo su 转为root用户
输入:passwd user     //user是对应的用户名,或为普通用户jyc,或为根用户root
输入新密码
确认新密码(再输入一遍新密码)
修改密码成功,重启,输入新密码进入Ubuntu

修改主机名

修改 hostname 文件:
输入:sudo nano /etc/hostname   //把旧主机名改为新主机名
修改 hosts 文件
输入:sudo nano /etc/hosts      //把旧主机名改为新主机名
修改主机名成功,重启,输入新密码进入Ubuntu

修改/etc/hosts文件注意只修改第2行的名字就行,其他地方不用修改:

修改用户名

sudo su            //转为 root 用户
gedit /etc/passwd  //找到代表你的那一行,修改用户名为新用户名
gedit /etc/shadow  //找到代表你的那一行,修改用户名为新用户名
gedit /etc/group   //你应该发现你的用户名在很多个组中,全部修改
修改完毕?  NO! NO! NO!  千万别急着重启
进入 /home 目录
mv  name_dir_old  name_dir_new   //将old文件夹用户名修改为new文件夹用户名
修改用户名成功,重启,输入新密码进入Ubuntu

注:如果 修改用户名 时不小心提前重启了也不用怕,可以参考这个链接:Ubuntu修改用户名后无法登陆


补充2、su root 认证失败

su root 认证失败,可能是因为密码输错或者 root 用户没有初始化。如果是因为密码输错,可以尝试重新输入密码。如果是因为root用户没有初始化,可以运行以下命令进行初始化:sudo passwd root,之后会提示 “重新输入新的 UNIX密码:” 输入新密码,再次输入上次输入的密码就可以了。


3、进入、退出root权限

进入root权限:① sudo   su (我常用) ② su   root
退出root权限:①Ctrl + D (我常用)         ② exit           ③ su   user_name


4、关闭当前终端

命令:     exit
快捷键: Ctrl + D


5、echo、sh

案例:设置ROS安装源,下面是中科大ustc的镜像源:

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main"  > 
                                       /etc/apt/sources.list.d/ros-latest.list'

命令解析:
在Linux中使用echo并配合右移运算符重定向,是实现向文件中写入信息的快捷方式,比如要向file.txt文件中写入一个字符串:

echo   "Hello world!"  >  file.txt     //淦!单尖括号会覆盖文件中的内容,慎用!!!
echo   "Hello world!"  >>  file.txt    //双尖括号会在最后一行另起一行插入,比较友好

如果将file.txt 的权限设置为只有root才有权限进行操作:

sudo  chown  root.root  file.txt 

当使用sudo并配合echo再次向修改权限后的file.txt文件写入信息时会报错:

sudo  echo  "Hello you!"  >>  file.txt
bash: file.txt: Permission  denied     //中文版会报:权限不够

这是因为重定向符号 >>> 也是 bash 的命令。使用sudo只是让echo命令具有了 root 权限,但是没有让>>> 也具有 root 权限,所以 bash 会认为这个命令没有向file.txt写入信息的权限。使用sh -c 命令,它可以让bash将一个字符串作为完整的命令来执行,这样就可以将sudo的影响范围扩展到整条命令。如下:

sudo sh -c 'echo "hello uu" >> file.txt'

6、使用 sudo apt-get install 命令安装软件的目录在哪?

下面也是网上找的说法,挺模棱两可的,估计看了《鸟哥Linux私房菜》再回头给自己解答

bin文件路径:   /usr/bin 
库文件路径:    /usr/lib/  
其它的图标啊什么的路径: /usr/share 
配置文件路径:  /etc/ 

6.1、apt

Ubuntu 下安装、卸载软件要用 apt (advanced package tool )。

6.2、关于 rpm 和 deb

RPM ( Red Hat Package Manager ),是基于Red hat 的 Linux Distribution 的包管理系统,同时也指 rpm 包本身,RPM用于 rpm 包的管理(诸如安装、卸载、升级等)。对于基于Debian 的系统使用deb格式的包,其安装和升级可用dpkg,不过它不能很好地处理包的依赖关系,比较省事的有dselect和apt-get,Ubuntu是Debian的变种,其软件以deb包或者源文件的形式出现。

6.3、Linux 发行版可以大体分为两类

商业公司维护的发行版本:以RedHat为代表,RedHat系
社区组织维护的发行版本:以Debian为代表,Debian系


7、常用命令(已经背下)

pwd  查看当前路径,print working directory,查看当前工作目录的绝对路径。

cd   切换目录,change directory
参数:
	/  进入根目录
	.  当前目录
	.. 上一级目录
	~  用户家目录 (不加参数时效果与~相同)
	
mkdir test_dir  创建一个名为test_dir的文件夹
参数:
	-p  ~/catkin_ws/src   //p  parents,make parent directories as needed,根据需要创建父目录
	
touch test_file  //创建一个名为test_file的文件
mv  file_name  destination_dir   //将文件file_name 移动到文件夹destination_dir (相当于剪切+粘贴)
    dir_old    dir_new           //将文件夹dir_old重命名为dir_new
    
cp  file_name  destination_dir[/new_file_name]    //相当于复制+粘贴,重命名可选

rm  file_name  //删除文件file_name  
参数:
	-r  dir_name[/]    //删除文件夹dir_name,并递归地删除文件夹中的内容, dir_name后的斜杠有、无均可 
	
source file_name  //在当前bash环境下读取并执行file_name中的命令 (该命令可由 . 来代替)
     . file_name  //功能同上
     
echo string_aa   //将字符串 string_aa 送往标准输出,默认为显示器,并在最后加上换行符号

cat /etc/issue  //查看 Ubuntu 版本,Dji manifold2 使用的是 Ubuntu 16.04 LTS


./file_name   //运行文件file_name ,前提是file_name确为可执行文件,(编译后生成的二进制文件,即可执行文件)

g++  file_name.cpp  -o  file_aa   //编译 file_name.cpp 为可执行文件file_aa   

uname -r  //查看Linux内核版本

8、bash是什么

	bash是shell的一种,所谓shell(壳)是一个接口,这个接口提供给用户操纵系统的能力。

CLI :Command Line Interface   命令行接口
GUI:Graphical User Interface    图形化用户接口

	一般我们是用GUI或者CLI去控制计算机,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),由于安
全、复杂性、繁琐等原因,用户不能直接接触内核,内核与用户之间需要一个中间程序,用于接收用户的操作(点击图标、输入命令),
并进行简单的处理,	然后再传递给内核。shell就是内核和用户之间的“中间代理”。
	广义的shell包括图形界面和命令行界面,狭义的shell专指命令行界面接口,这里的bash就是一种狭义的shell。shell可以调用其他程序,
也可以执行一些本身支持的命令。
	shell是一个命令语言解释器(command-language interpreter),拥有自己内建的shell命令集,键入的命令都被shell所解释。一些命令,
如打印当前工作目录命令 pwd ,是包含在Linux bash 内部的(就像DOS的内部命令)。一些命令,如cp、rm是存在于文件系统中某个目
录下的单独程序。
    shell首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序是指Linux本身的实用程序,如ls、rm。然后
shell试着在“搜索路径”($PATH)里寻找这些应用程序。$PATH是一个以冒号分隔的目录列表,你可以在列表指定的目录找到所要执行的命
令。可以用 `echo $PATH`打印搜索路径。如果你键入的命令不是一个内部命令,并且在PATH里没有找到这个可执行文件,终端将会显示一
条错误信息。而如果命令成功被找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。
 	bash(Bourne again shell)正如它的名字所暗示的,是sh(Bourne shell)的扩展/超集。sh由Steve Bourne开发,是Bourne Shell 的缩
 写,sh是Unix标准默认的shell。bash是Bourne again shell 的缩写,是Linux标准默认的shell。

9、dpkg

sudo  dpkg  -i  package_name.deb  //安装本地软件包,不解决依赖关系
dpkg  -r  package                 //删除软件包
sudo  apt-get  install  package   //在线安装软件包,能自动解决软件之间的依赖关系
sudo  apt-get  remove  package    //删除软件包

dpkg用于安装.deb文件,但不会解决模块之间的依赖关系,且不会关心Ubuntu软件仓库中的软件。可用于安装本地的.deb文件,比如在Ubuntu安装VSCode、搜狗输入法、百度网盘,就是以这种方式安装的。
查看是否已安装某个包,除了在使用的时候被提醒未安装外,还可以通过如下命令来查看是否安装了某个包:

sudo dpkg -l | grep g++   //查看是否安装了g++
//打印输出如下
ii  g++      4:9.3.0-1ubuntu2          amd64      GNU C++ compiler
ii  g++-9    9.4.0-1ubuntu1~20.04.1    amd64      GNU C++ compiler

10、&& 同时执行两条命令

mkdir  dir_aa  &&  cd  dir_aa    //创建一个文件夹dir_aa并进入dir_aa

11、解除文件的 root 权限

sudo  chown  -R  账户名  文件名  //change owner 

12、管道

前面命令所输出的信息,通过管道交由后续的命令继续使用

ls /etc | grep nano*   //列出/etc目录下所有以nano开头的文件。竖线叫做管道 

13、ROS相关命令

最全面的教程还是得看这个:http://wiki.ros.org/Tools      |      8. Command Line Tools

1、 ROS相关环境变量

echo $ROS_PACKAGE_PATH //打印本机含有ROS功能包的,所有路径
echo $ROS_DISTRO       //打印ROS发行版本的名称

2、 安装ROS相关功能包命令格式

sudo apt-get install ros-xxx-功能包名

xxx 替换为自己的 ROS 版本。这样安装的功能包会以‘功能包名’为文件夹名,被默认放在 /opt/ros/melodic/share路径下,此路径下已经存在了很多 ROS 默认安装好的功能包。

3、 rostopic

Tips:一个话题(topic_name)对应一个消息类型(message_type)。

消息类型 可以类比为(class)
话题 可以类比为对象(object)

 rostopic  list 	 	     //打印运行时的所有话题名
 rostopic  echo  topic_name  //打印运行时被发布话题topic_name中的内容
 rostopic  info  topic_name  //打印话题topic_name的详细描述,发布者、订阅者、消息类型
 rostopic  type  topic_name  //打印话题topic_name的消息类型
 rostopic  bw    topic_name  //打印话题topic_name的带宽
 rostopic  hz    topic_name  //打印话题topic_name的发布频率
 rostopic  pub   topic_name  消息类型  数据  //手动发布数据
 rostopic  find  消息类型     //根据消息类型查找话题

4、 rosmsg

rosmsg  list  //列出系统当前所有消息数据类型(会列出很多,因为ROS已经预定义好了很多消息数据类型)
rosmsg  show  消息类型  //显示消息数据结构
rosmsg  info  消息类型  //同 rosmsg  show
rosmsg  psckage  包名   //显示某个功能包下的所有消息(感觉这个还有点用)
rosmsg  packages        //显示所有含有含有消息的功能包(感觉这个并没有什么用)
rostopic type 话题名 | rosmsg show  //显示话题内消息的具体数据结构

5、 rossrv

用法和 rosmsg 相同

6、 rosservice

Tips:一个服务(service_name)对应一个服务类型(service_type)。服务类型是类,服务为类的实例。

 rosservice  list 	 	         //查看当前提供的服务
 rosservice  call  service_name  //手动调用服务
 rosservice  type  service_name  //查看服务的类型

7、 rosnode

 rosnode list

8、 为 python 文件添加可执行权限

①、进入保存 Python 文件的 script 文件夹路径下
②、命令行键入

chmod  +x  *.py

注:
*.py的意思是对本路径下的所有.py文件执行操作

9、 ROS 查看 tf 树

打开一个终端,键入如下命令即可查看当前 tf 树:

rosrun  rqt_tf_tree  rqt_tf_tree

在这里插入图片描述

10、 ROS 查看 节点通信拓扑

打开一个终端,键入如下命令即可查看当前的节点通信拓扑:

rqt_graph

在这里插入图片描述


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐