第一节 环境配置

一、代码下载

 首先进行openssh的安装,有了openssh才能在vscode上进行远程编程操作

suodo apt install openssh-server

安装完后,查看server的状态

sudo systemctl status ssh

如果是running说明是正常跑起来了

 这里systemctl的作用是(参考文心一言)

systemctl 是一个用于控制 systemd 系统和服务管理器的命令行工具。systemd 是 Linux 系统初始化系统(init system)和服务管理器,它替代了传统的 init 系统(如 SysV init 或 Upstart),并提供了更为强大和灵活的服务管理能力。

systemctl 的主要功能和用途包括:

  1. 启动、停止、重启和重载服务:你可以使用 systemctl 来管理运行在系统上的服务。例如,systemctl start nginx 会启动 nginx 服务,而 systemctl stop nginx 则会停止它。

  2. 查看服务状态:通过 systemctl status 服务名 命令,你可以查看服务的当前状态,包括它是否正在运行、最近的日志输出等。

  3. 启用、禁用和列出服务:你可以使用 systemctl enable 服务名 来在系统启动时自动启动某个服务,而 systemctl disable 服务名 则会禁止该服务在启动时自动运行。systemctl list-units --type=service 可以列出所有当前正在运行的服务。

  4. 查看和管理系统目标(targets):在 systemd 中,目标(target)是一组服务的集合,这些服务一起定义了一个特定的系统运行状态(如多用户模式、图形界面模式等)。systemctl 可以用来列出、激活和查看这些目标。

  5. 管理挂载点、定时器和其他单元:除了服务之外,systemd 还管理挂载点、设备、套接字、定时器等多种类型的单元(units)。systemctl 同样可以用来管理这些单元。

  6. 重新加载 systemd 配置:如果修改了 systemd 的服务文件或其他配置文件,你可以使用 systemctl daemon-reload 命令来重新加载 systemd 的配置,使修改生效。

  7. 查看系统日志:虽然 systemctl 本身不直接管理日志,但它可以配合 journaldsystemd 的日志服务)来查看系统日志,例如通过 systemctl status 命令查看服务的日志输出。

总之,systemctl 是管理 systemd 服务和系统状态的重要工具,它提供了丰富的功能和灵活的选项,使系统管理员能够更方便地控制和管理 Linux 系统上的服务和进程。

  然后打开sshserver允许访问防火墙外部的权限,或者允许外部来连接sshserver

sudo ufw allow ssh

 接下来通过免密操作连接github

首先检查是否存在~/.ssh目录

首先进行检查

cd ~/.ssh

若不存在,说明此时机器里并没有密钥

那么输入指令生成密钥:

ssh -keygen -t rsa -C "xxx@xxx.com"

此时重新检测,密钥是否生成  

cd ~/.ssh

在ssh文件夹下输入ll,查看密钥信息:  

发现存在id_rsa.pub密钥,打开这个密钥文件

cat id_ras.pub

将该密钥拷贝到github上,来到github,找到setting

找到

然后将刚才cat的密钥拷贝到key处,可以在title处起一个名字,然后确认添加该密钥

添加成功后,就可以下载代码了,首先来到work目录中:

删除之前的代码(现在要重新下载干净的代码),这里使用的命令是:

rm -rf ros_protobuf_msg/

这里-rf的作用

在Unix和Linux系统中,rm 是一个命令,用于删除文件或目录。-rf 是这个命令的两个选项的组合。

  • -r 或 -R:递归删除。这意味着它会删除目录及其所有子目录和文件。如果不使用这个选项,rm 默认只删除文件,不删除目录。
  • -f:强制删除。这个选项告诉 rm 不要询问用户是否真的要删除每个文件或目录,而是直接删除它们。这也可以帮助避免因为某些文件或目录权限问题而出现的错误。

因此,rm -rf ros_protobuf_msg/ 这个命令会递归并强制删除名为 ros_protobuf_msg 的目录及其所有子目录和文件,而不会询问用户任何确认。

注意rm -rf 是一个非常强大的命令,如果不小心使用,可能会导致重要数据的丢失。因此,在使用这个命令之前,一定要确保你知道自己在做什么,并且确实想要删除指定的文件或目录。

如果删不掉记得加上sudo命令

然后就可以进行代码clone,首先需要安装git,这里的指令是:

sudo apt install git

 然后创建work目录,将代码clone下来

mkdir ~/work
cd work
git clone git@github.com:xxxxxxx

二、vscode远程连接到ubuntu

首先安装远程连接工具进行连接:

sudo apt install net-tools
ifconfig   #查看ip

这里选择ens33下的网络ip

如果是wifi进行连接的网络也可能是wlo1:

wlo1是无线网络接口的名称,通常用于表示无线局域网(WLAN)的网卡接口。在Linux系统中,网络接口的名称可能会根据系统配置和命名规则的不同而有所变化。wlo1这个名称中的“wl”可能表示“wireless LAN”,即无线局域网,而“o1”则可能是接口的一个编号或标识符。

通过wlo1这个接口,用户可以连接到无线网络,实现与其他设备的通信和数据传输。在配置和使用无线网络时,用户需要确保wlo1接口已经正确启用,并且已经配置了适当的无线网络参数,如SSID(网络名称)和密码。

需要注意的是,在不同的Linux发行版或不同的硬件设备上,无线网络接口的名称可能会有所不同。因此,在具体使用时,用户应该根据系统的实际情况来识别和使用正确的网络接口名称

 然后拿到inet后面的地址:

ens33是以太网网卡的一个名称,在Linux中,每个网络接口都有一个名称,以此区分不同的网络接口。它是计算机和网络之间的桥梁,是实现网络通信的重要组成部分。通过该网卡,可以实现网络数据的传输和连接控制。

以太网是一种计算机局域网技术,它用于在计算机之间传输数据。以太网是现实世界中最普遍的一种计算机网络,它通过一系列的标准和协议,使得不同设备之间可以进行通信和数据交换。

打开vscode连接到主机:

 主机名字是用户名@ip地址,用户名是终端命令行@前的内容,这里是sor-bai,ip地址是刚才ifconfig获得的

如果连接不上,首先通过

sudo systemctl status ssh

检查ssh服务器的状态 

然后完成连接

三、安装docker

首先进行docker的安装

sudo apt install curl
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh

上述代码的含义为:

这三行代码是关于在Linux系统上安装和使用curl来下载一个脚本,并随后以超级用户权限运行该脚本。下面是每行代码的详细解释:

  1. sudo apt install curl

    • sudo: 这是一个命令,允许用户以超级用户(或称为root用户)的权限执行命令。使用sudo时,系统通常会要求您输入密码以确认您有权限执行该操作。
    • apt: 这是Debian和基于Debian的Linux发行版(如Ubuntu)的包管理工具,用于安装、更新和删除软件包。
    • install: 这是apt命令的一个选项,表示要安装一个或多个软件包。
    • curl: 这是要安装的软件包名称。curl是一个命令行工具,用于发送数据,支持多种协议,如HTTP、FTP等。

综上所述,这行代码的意思是:“以超级用户的权限安装curl软件包”。

  1. curl -fsSL https://test.docker.com -o test-docker.sh

    • curl: 这是前面安装的命令行工具,用于从给定的URL获取数据。
    • -fsSL: 这是curl命令的几个选项的组合。
      • -f: 失败时静默(silent)或快速失败。不显示HTTP错误。
      • -s: 静默模式。不显示进度或错误消息。
      • -L: 如果服务器报告请求的资源已被移动到新的URL,则自动重定向到新的URL。
      • -S: 显示错误消息。当与-s一起使用时,只显示错误消息。
    • https://test.docker.com: 这是要从中获取数据的URL。
    • -o test-docker.sh: 这告诉curl将获取的数据保存到一个名为test-docker.sh的文件中。

这行代码的意思是:“使用curlhttps://test.docker.com下载数据,并将数据保存为test-docker.sh文件”。

  1. sudo sh test-docker.sh

    • sudo: 如前所述,这允许以超级用户的权限执行命令。
    • sh: 这是一个shell程序,用于执行shell脚本。
    • test-docker.sh: 这是前面使用curl下载的脚本文件。

这行代码的意思是:“以超级用户的权限执行test-docker.sh脚本”。

然后将用户添加到docker用户组:

sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo systemctl restart docker
newgrp docker
docker ps

上述代码的含义为:

当然可以,这些代码行是在Linux系统上用于设置和管理Docker的相关操作。下面是对每行代码的详细解释:

  1. sudo groupadd docker

这行代码用于创建一个新的用户组,名为docker。Docker通常需要运行在其自己的用户组中,以便对Docker守护进程和相关的文件进行适当的访问控制。

  1. sudo usermod -aG docker ${USER}

这行代码将当前用户(${USER} 是一个环境变量,代表当前登录用户的用户名)添加到docker用户组中。-aG选项表示“追加到组”,这意味着用户将被添加到docker组,而不会从其他组中移除。这样,当前用户就可以在不使用sudo的情况下运行Docker命令。

  1. sudo systemctl restart docker

这行代码重启Docker服务。这通常是在修改了Docker的配置或权限之后做的,以确保所有的更改都生效。systemctl是一个用于控制系统服务的工具,而restart是一个操作,表示停止并立即重新启动服务。

  1. newgrp docker

这行代码将当前用户的默认组更改为docker组。这通常是为了确保当前用户在后续的操作中使用docker组的权限。然而,需要注意的是,这个命令只会影响当前终端会话。如果你打开一个新的终端窗口,你需要再次运行newgrp docker

  1. docker ps

这行代码列出当前正在运行的Docker容器。docker ps是一个Docker命令,用于查看容器的状态。如果前面的步骤都正确执行,并且你已经在docker组中,那么你应该能够不使用sudo来运行这个命令。

总结:这些代码行的目的是创建一个新的docker用户组,将当前用户添加到该组中,重启Docker服务,然后列出正在运行的Docker容器。这样,当前用户就可以在不使用sudo的情况下管理Docker容器了。

通过项目中的dockerfile文件,构建项目镜像

来到:

下,进行docker镜像的构建(按照dockerfile)

命令为:


docker build --network host -t ros_protobuf:noetic  -f ros_x86.dockerfile .

构建结束后,可以通过以下命令查看镜像是否构建成功:

docker images

接下来要通过脚本去启动容器:

cd ~/work/ros_protobuf_msg/docker/scripts
#启动容器
./ros_docker_run.sh

脚本是将一系列操作集成化,极大程度的方便启动容器,可以看到脚本内容为:

#!/usr/bin/env bash

MONITOR_HOME_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"

display=""
if [ -z ${DISPLAY} ];then
    display=":1"
else
    display="${DISPLAY}"
fi

local_host="$(hostname)"
user="${USER}"
uid="$(id -u)"
group="$(id -g -n)"
gid="$(id -g)"


echo "stop and rm docker" 
docker stop ros_noetic_proto > /dev/null
docker rm -v -f ros_noetic_proto > /dev/null

echo "start docker"
docker run -it -d \
--privileged=true \
--name ros_noetic_proto \
-e DISPLAY=$display \
-e DOCKER_USER="${user}" \
-e USER="${user}" \
-e DOCKER_USER_ID="${uid}" \
-e DOCKER_GRP="${group}" \
-e DOCKER_GRP_ID="${gid}" \
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
-v ${MONITOR_HOME_DIR}:/work \
-v ${XDG_RUNTIME_DIR}:${XDG_RUNTIME_DIR} \
--network host \
ros_protobuf:noetic
~                                                                                                                                                                     
~                                                                                                                                                                     
~                              

对于上述脚本的代码解释(文心一言):

 

这段代码是一个 Bash 脚本,主要用于停止、删除并重新启动一个 Docker 容器。以下是对这段代码的详细解释:

  1. 定义 MONITOR_HOME_DIR 变量:

 
 

bash复制代码

MONITOR_HOME_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"

这行命令会获取脚本自身所在目录的上级目录的上级目录,并将其绝对路径赋值给 MONITOR_HOME_DIR 变量。这通常用于确定某个项目的根目录。

对于${BASH_SOURCE[0]} 的释义:

在 Bash 脚本中,${BASH_SOURCE[0]} 是一个特殊的数组,它包含了当前执行的脚本或函数的文件名。当用在脚本的上下文中时,${BASH_SOURCE[0]} 通常用于获取当前脚本的绝对路径。

具体来说:

  • BASH_SOURCE 是一个数组变量。
  • ${BASH_SOURCE[0]} 获取数组的第一个元素,即当前脚本或函数的文件名。

这在脚本中特别有用,尤其是当你想获取脚本自身的路径时,无论脚本是从哪个目录执行的。通过结合 dirname 和 pwd 命令,你可以获取脚本所在的目录的绝对路径,这在处理相对路径或挂载的卷时特别有用。

例如,考虑以下脚本片段:

 
 

bash复制代码

#!/bin/bash
# 获取脚本自身的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "The script is located in: $SCRIPT_DIR"

无论你从哪个目录运行这个脚本,$SCRIPT_DIR 变量都会包含脚本所在的目录的绝对路径。

BASH_SOURCE 数组的其他元素(如果存在)将包含调用当前脚本或函数的脚本或函数的名称。这在处理嵌套脚本或函数时可能很有用,但 ${BASH_SOURCE[0]} 通常是最常用的。

对于dirname的释义:

在Unix和Linux操作系统中,dirname 是一个命令行工具,用于返回文件或目录路径中的目录部分。具体来说,dirname 命令会删除文件路径中的最后一个斜杠(/)及其后面的所有内容,从而只留下目录路径。

例如:

 
 

bash复制代码

$ dirname /home/user/documents/file.txt
/home/user/documents

在这个例子中,dirname 命令返回了文件 file.txt 所在的目录路径。

在Bash脚本中,dirname 命令经常被用来获取脚本或文件所在的目录,以便进行进一步的文件操作或设置环境变量。结合 ${BASH_SOURCE[0]} 使用,可以获取当前执行的脚本的目录路径,如下所示:

 
 

bash复制代码

#!/bin/bash
# 获取脚本所在的目录
SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")"
# 获取脚本的绝对路径所在的目录
ABSOLUTE_SCRIPT_DIR="$(cd "$SCRIPT_DIR" && pwd)"
echo "The script is located in: $ABSOLUTE_SCRIPT_DIR"

在这个脚本中,${BASH_SOURCE[0]} 返回脚本自身的相对路径,然后 dirname 提取出这个路径的目录部分。之后,通过 cd 命令和 pwd 命令的组合,我们可以得到这个目录的绝对路径。

 


2. 检查 DISPLAY 环境变量:

 
 

bash复制代码

display=""
if [ -z ${DISPLAY} ];then
display=":1"
else
display="${DISPLAY}"
fi

这段代码首先初始化 display 变量为空。然后,它检查 DISPLAY 环境变量是否存在。如果不存在(即 -z ${DISPLAY} 为真),则将 display 设置为 :1。否则,它保留 DISPLAY 环境的原始值。
3. 获取本地主机名、用户、UID、组名和GID:

 
 

bash复制代码

local_host="$(hostname)"
user="${USER}"
uid="$(id -u)"
group="$(id -g -n)"
gid="$(id -g)"

这些命令获取当前机器的主机名、当前登录用户的用户名、用户ID、组名和组ID。
4. 停止和删除 Docker 容器:

 
 

bash复制代码

echo "stop and rm docker"
docker stop ros_noetic_proto > /dev/null
docker rm -v -f ros_noetic_proto > /dev/null

首先,它输出一条消息 "stop and rm docker"。然后,它使用 docker stop 命令停止名为 ros_noetic_proto 的 Docker 容器,并使用 docker rm 命令删除这个容器及其关联的卷。所有的输出都被重定向到 /dev/null,这意味着你不会在终端看到任何输出。
5. 启动 Docker 容器:

 
 

bash复制代码

echo "start docker"
docker run -it -d \
...
ros_protobuf:noetic

这部分代码首先输出 "start docker",然后使用 docker run 命令启动一个新的 Docker 容器。以下是命令中的参数和它们的作用:

 
 

复制代码

* `-it`: 分配一个伪终端并保持STDIN开放(通常用于交互式操作,但在这里与 `-d` 一起使用可能有些不常见)。
* `-d`: 在后台运行容器并返回容器ID。
* `--privileged=true`: 给予容器内进程几乎与宿主机相同的权限。
* `--name ros_noetic_proto`: 为容器指定一个名称。
* `-e`: 设置环境变量。在这里,它设置了多个环境变量,包括之前定义的 `DISPLAY`、`USER`、`UID`、`GROUP` 和 `GID`。
* `-v`: 挂载卷。这里,它挂载了 `MONITOR_HOME_DIR` 到容器的 `/work` 目录,并挂载了 `XDG_RUNTIME_DIR` 到容器内的同名目录。
* `--network host`: 使用宿主机的网络栈,这意味着容器将不会获得自己的IP地址,而是直接使用宿主机的网络。
* `ros_protobuf:noetic`: 指定要运行的 Docker 镜像。

最后,脚本中有两个波浪号 ~,它们可能是无意的,或者是从其他地方复制时带过来的,因为它们在这里没有任何作用。

总之,这个脚本的主要目的是管理一个名为 ros_noetic_proto 的 Docker 容器,确保它按照预期的配置运行。

此时可以通过启动容器的脚本就已经获得了容器,那么查看容器:

docker ps

然后进入到容器中 

#进入容器
./ros_docker_into.sh

然后创建build文件夹

cmake ..的含义是,cmakelists.txt文件在当前文件夹的上一级文件夹中,但是构建在当前文件夹中构建,你需要去上一级文件夹去找cmakelists.txt文件。

然后进行编译: 

编译完成: 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值