请严格按照顺序安装, 为了防止出错, 本人操作均在root用户, 因此建议纯小白在 root 用户下进行安装, 避免出现不必要的问题

  • 下面所有在 Terminal 的操作应该遵守:

    • 必须启用 root 用户操作(见8.1节), 否则应该将用户加入 sudo 组(见8.4节).

    • Linux 中在 Terminal 的复制操作为 CTRL + SHIFT + C, 粘贴为 CTRL + SHIFT + V(宿主机之间要想能够复制粘贴得另外操作详见8.6节).

    • 文档操作可访问 http://47.108.130.26:4000/2025/06/30/task-for-ROS2/, 在虚拟机内也可以访问, 但是要想使用汉字(见8.8节)或者搜索其他内容需要设置搜索引擎(详细见8.7节).

    • 操作过程中记得同步宿主机和虚拟机时间, 否则可能会造成一些安装问题(见8.9节).

    • 安装后使用期间可能遇到闪屏问题(见8.10节)

  • 本文档安装的软件版本如下.

    • 生产环境: Intel Core i5-10210U CPU (Windows10)

    • Ubuntu: 22.04.5 LTS

    • VirtualBox: 7.0.4r154605

    • ROS2: Humble Hawksbill

    • Yolov5

    • conda: 24.1.2

      • python: 3.10

1. 虚拟机安装

主流的 Virtual Box, Vmware 都可以, 这里我选择Virtual Box. 理由是Virtual Box 开源, 安装简单.

Vmware功能虽然全面但是太冗杂了, VBox较为轻量方便, 足够支撑整个测试, 实际上用Ubuntu的实机效果更好.

下载网址, https://www.virtualbox.org/ .

alt text

点击Download.

alt text

根据系统进行安装, 以下默认用户是windows系统.

2. Ubuntu 安装

2.1 系统安装

为了便于小白学习, 另外为了后续查看图片, 我们选择安装桌面版的linux(桌面默认环境为GNOME, 如果桌面环境选择不一样可能在一些安装上会存在问题).

目前Humble版本的ROS2支持有22.04及其之前的一些版本, 这里我们推荐安装22.04(稳定并长期支持, 包括很多云厂商的服务器都选择采用22.04).

ROS2 与对应发行版关系如下.

ROS2版本 发布时间 维护截止时间 Ubuntu版本
Ardent Apalone 2017.12 2018.12 Ubuntu 16.04(Xenial Xerus)
Bouncy Bolson 2018.7 2019.7 Ubuntu 16.04(Xenial Xerus)、18.04(Bionic Beaver)
Crystal Clemmys 2018.12 2019.12 Ubuntu 18.04(Bionic Beaver)
Dashing Diademata 2019.5 2021.5 Ubuntu 18.04(Bionic Beaver)
Eloquent Elusor 2019.11 2020.11 Ubuntu 18.04(Bionic Beaver)
Foxy Fitzroy 2020.6 2023.5 Ubuntu 20.04(Focal Fossa)
Galactic Geochelone 2021.5 2022.11 Ubuntu 20.04(Focal Fossa)
Humble Hawksbill 2022.5 2027.5 Ubuntu 22.04(Jammy Jellyfish)
Iron Irwini 2023.5 2024.11 Ubuntu 22.04(Jammy Jellyfish)
Jazzy Jalisco 2024.5 2029.5 Ubuntu 24.04(Noble Numbat)

https://www.releases.ubuntu.com/22.04/ 下载

step 1

选择 ubuntu-22.04.5-desktop-amd64.iso, 这里大概是4.4GiB.

这里如果是 windows 且电脑架构为 x86_64 选择 amd64 版本. MacOS 可以参考 https://blog.csdn.net/davidson1471/article/details/146910376.

step 2

导入刚刚下载的镜像.

alt text

step 3

设置密码, 注意右侧不能有’_’等特殊的符号.

alt text

step 4

分配资源,上面是内存, 下面是CPU, 内存不要太小4GB应该足够了, CPU分配的越多越好, 但是不要占满自己的核心, 否则电脑会卡顿.

alt text

step 5

分配硬盘,40GiB应该足够测试, 20GiB可能会不够, 如果不够后续可以拓展.

alt text

2.2 系统启动

step 1

可以看到我们注册好的系统已经出现, 双击进行启动.

alt text

step 2

初次启动需要进行一系列初始化, 首先我们键入账号密码.

alt text

step 3

等待一系列初始化过程之后, 正式进入系统, 跟着操作即可, 一系列操作主要是涉及一些内容推送,不太重要.

alt text

alt text

alt text

alt text

alt text

到了下面的页面就算安装成功了.

alt text

3. ROS2 安装

首先键入命令行查看 ubuntu 版本

1
lsb_release -a

我的结果如下(确定 Release 是不是 22.04,如果不是很可能无法安装成功).

1
2
3
4
5
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy

后面跟着下面一路启航, 应该没有报错,下面的安装过程中可能会出现网络延迟严重的现象, 要解决我们需要换源(见8.2节).

3.1 设置语言环境

1
2
3
4
5
6
sudo apt install -y locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
# 可用 locale 验证
locale

3.2 添加 ROS 2 的 APT 软件源

1
2
3
4
sudo apt install -y software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install curl -y

3.3 添加GPG Key

1
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

如果发现上面的操作有死机,还有一个方法.

1
2
3
4
5
cd /usr/share/keyrings/
# 我已经把文件提前下载到服务器上了, 您只要负责安装就可以了
wget http://47.108.130.26:4000/assets/ros.key
mv ros.key ros-archive-keyring.gpg
cd -

3.4 添加 ROS 软件源

1
2
3
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

3.5 更新系统

1
2
sudo apt update
sudo apt upgrade

3.6 安装完整桌面版

1
sudo apt install -y ros-humble-desktop

3.7 设置ROS环境变量

1
echo "source /opt/ros/humble/setup.bash" | sudo tee -a /etc/profile

3.8 验证安装

我们可以打开两个Terminal也可以用tmux, 这里案例用前者.

1
2
3
4
5
# 打开两个Terminal
# 第1个Terminal
ros2 run demo_nodes_cpp talker
# 第2个Terminal
ros2 run demo_nodes_py listener

alt text

4. conda 安装

4.1 完整 Anconda 安装

我们安装完整的anconda会比较大, 可以选择轻量的安装, 这里先贴一下完整的流程.

1
2
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
bash Anaconda3-2024.02-1-Linux-x86_64.sh

4.2 轻量安装(可选)

安装完整版之后这里就不用安装了.

1
2
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

alt text

5. YOLO 安装

这里目标检测我们使用YOLO,v5和v8都适用于目标检测.

这里使用v5, 理由是v5更稳定简单.

这里先找到一个目录,我们用来存放整个 demo 相关文件.

1
2
mkdir -p ~/demo
cd ~/demo

然后安装yolov5.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Python >= 3.8 and <= 3.11
# 这里使用 3.10, 测试了一下是安装成功率最高最稳定的, 但是同学可以试试其它版本, 3.8 貌似用的人很多
# 使用 3.10 在后续的使用过程中会遇到一些软件版本的兼容问题, 但是都是可以很简单解决的, 缺啥补啥,
# 需要什么版本再安装什么版本, 我们的最终目的始终是把程序写出来.
#
# 基本命令如下:
# 可以用 "conda search python" 查看可选的python版本
# "conda env remove -n <env_name>" 可以删除环境, 例如 "conda env remove -n py310env --all"
# "conda activate <env_name>" 激活虚拟环境(环境可嵌套进入)
# "conda deactivate" 退出当前虚拟环境
# "conda info --envs" 查看虚拟环境
# 更多 "conda -h", 不同版本可能命令有区别.
conda create -n py310env python=3.10 -y
conda activate py310env

sudo apt install -y git

git clone https://github.com/ultralytics/yolov5.git
cd yolov5
# 可以先 pip install -r requirements.txt 试试, 这里 -i 选项用了清华源进行安装
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

验证 yolo 安装情况

我们使用 yolo -v

1
2
(py310env) root@ROS:~/demo# yolo -v
8.3.161

会发现安装了v8, 原因是:requirements.txt 中 会自动从 PyPI 安装 YOLOv8 的 ultralytics 包,并注册命令 yolo.

1
2
3
4
5
(py310env) root@ROS:~/demo# grep -Irn ultralytics yolov5/requirements.txt 
18:ultralytics>=8.2.34 # https://ultralytics.com
19:# protobuf<=3.20.1 # https://github.com/ultralytics/yolov5/issues/8012
(py310env) root@ROS:~/demo# pwd
/root/demo

因此实际上我们的项目目录中安装了v5, 但是全局上安装了v8.

验证v5是否安装

1
2
3
# 在 yolov5 的根目录下执行相关脚本, 判断是否能够有相应的产出
cd ~/root/demo/yolov5
python detect.py --weights yolov5s.pt --source data/images/bus.jpg

看到这里有把结果保存到 yolov5安装目录下的 runs/detect/exp 目录.

alt text

在当前目录下打开文件夹查看图片.

1
xdg-open .

我们找到对应的目录, 发现可以看到结果图片.

alt text

6. 任务流程

step 1

首先, 构建初始化工作空间.

1
2
3
cd ~/demo
colcon build
source install/setup.bash

之后创建通信包.

1
2
cd src
ros2 pkg create --build-type ament_python image_yolo --dependencies rclpy sensor_msgs cv_bridge std_msgs

查看当前目录情况。

1
2
sudo apt install -y tree
tree .

目录结构如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
├── build
│   └── COLCON_IGNORE
├── image_yolo
│   ├── image_yolo # 我们的代码放在该目录区域
│   │   └── __init__.py
│   ├── package.xml
│   ├── resource
│   │   └── image_yolo
│   ├── setup.cfg
│   ├── setup.py
│   └── test
│   ├── test_copyright.py
│   ├── test_flake8.py
│   └── test_pep257.py
├── install
│   ├── COLCON_IGNORE
│   ├── local_setup.bash
│   ├── local_setup.ps1
│   ├── local_setup.sh
│   ├── _local_setup_util_ps1.py
│   ├── _local_setup_util_sh.py
│   ├── local_setup.zsh
│   ├── setup.bash
│   ├── setup.ps1
│   ├── setup.sh
│   └── setup.zsh
├── log
│   ├── build_2025-07-01_12-44-02
│   │   ├── events.log
│   │   └── logger_all.log
│   ├── COLCON_IGNORE
│   ├── latest -> latest_build
│   └── latest_build -> build_2025-07-01_12-44-02
├── src
# yolov5 ...

step 2

现在我们开始编写代码, 以及将运行时需要的图片文件插入进去.

首先插入图片文件.

1
2
mkdir -p ~/demo/images
cp yolov5/data/images/*.jpg ~/demo/images/

当然我们可以加入自己的图片.

1
2
3
4
5
# 我自己经常会用的 vim 模板 https://gitee.com/jvle/works/blob/master/general/vimrc.template (可选)
# 根据自己的偏好可以进行定制啦.
sudo apt install -y vim
# vim ~/.vimrc
# source ~/.vimrc

编写主机的代码, 这里说一下 vim 的操作, a 或者 i 进行插入, 然后可以复制粘贴, 退出 SHIFT + : 然后键入 w 保存, q 退出, wq 保存并退出, 有问题使用 q! 强制退出而不保存(小白切勿同时对一个文件使用 vim, 不然可能会遇到缓存和覆盖的问题).

1
2
3
4
5
cd ~/demo
vim image_yolo/image_yolo/publisher_node.py
# 粘贴 publisher_node.py 代码进去
vim image_yolo/image_yolo/subscriber_node.py
# 粘贴 subscriber_node.py 代码进去

将变量加入 setup.py

1
vim image_yolo/setup.py

脚本内容应该加入两个节点信息.

1
2
3
4
5
6
7
8
...
entry_points={
'console_scripts': [
'publisher_node = image_yolo.publisher_node:main',
'subscriber_node = image_yolo.subscriber_node:main',
],
},
...

编译工作区.

1
2
cd ~/demo
colcon build

step 3

1
2
3
4
5
6
7
# 这里可能是我前面的安装问题, 一些软件的版本存在兼容的情况, 这里可以人为手动解决一下, 或者切换不同的python环境进行尝试.
# 这里我认为解决一下
# 每次打开一个 Terminal 都应该执行以下临时的导出, 因为这里 conda 环境中的 libstdc++.so.6 太老,无法满足 ROS2 的原生 C 扩展.
# 这里是临时的, 重启系统或者窗口还需要操作一次, 我们这里有方法可以永久设置, 但是为了避免系统混乱不去采用
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
# 降级安装 numpy
pip install "numpy<2.0" -i https://pypi.tuna.tsinghua.edu.cn/simple

运行程序.

Terminal 1 运行.

1
2
3
conda activate py310env # 确保在conda的环境
source ~/demo/install/setup.bash
ros2 run image_yolo publisher_node

Terminal 2 运行.

1
2
3
conda activate py310env
source ~/demo/install/setup.bash
ros2 run image_yolo subscriber_node

效果如下.

7. 代码

Thinking

发布者定时读取图片(本地或摄像头), 将读取的图像结果发布, 由对同一话题感兴趣的订阅者接受, 订阅者将接收到的消息喂给模型进行处理, 最后输出结果.

Results

读取图片版

publisher_node.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import os

QUEUE_SIZE = 10

# 发布者节点类
class ImagePublisher(Node):
def __init__(self):
super().__init__('image_publisher')
self.publisher = self.create_publisher(Image, 'image_raw', QUEUE_SIZE) # 创建发布器, 话题为 image_raw, 队列大小为10

# 0.5s 一次回调
timer_period = 0.5
self.timer = self.create_timer(timer_period, self.timer_callback)

# 将 OpenCV 图像转换为 ROS 图像
self.bridge = CvBridge()
self.image_paths = [os.path.join('images', f) for f in os.listdir('images')] # 读取 images 文件夹下的所有文件的 path 存入列表
self.index = 0 # 初始化索引为0

def timer_callback(self):
print("publisher begin to read img")
img = cv2.imread(self.image_paths[self.index]) # 读取当前索引地图片
msg = self.bridge.cv2_to_imgmsg(img, encoding='bgr8') # 转换成 ROS img 的格式

# 发布图像
self.publisher.publish(msg)
self.index = (self.index + 1) % len(self.image_paths) # 更新索引

def main(args=None):
rclpy.init(args=args) # 创建节点
node = ImagePublisher() # 创建节点实例
rclpy.spin(node) # 等待事件回调
rclpy.shutdown() # 关闭节点

获取摄像头版

下载 Virtual Box 的拓展包

地址在: https://download.virtualbox.org/virtualbox/, 主要要根据自己的版本决定安装对应版本的拓展包

在软件根目录下执行

1
VBoxManage.exe --version

下载直接安装即可.

alt text

alt text

之后我们需要启动摄像头.

alt text

之后查看摄像头是否能够驱动.

1
2
jvle@ROS:~/Desktop$ ls /dev/video*
/dev/video0 /dev/video1
代码

publisher_node.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import threading

QUEUE_SIZE = 10

ROS_FPS = 0.1 # 10fps (period = 1/ROS_FPS)

class ImagePublisher(Node):
def __init__(self):
super().__init__('image_publisher')
self.publisher = self.create_publisher(Image, 'image_raw', QUEUE_SIZE)
self.bridge = CvBridge()

# 初始化摄像头
self.cap = cv2.VideoCapture(0)
if not self.cap.isOpened():
self.get_logger().error("Failed to open camera.")
exit(1)

self.latest_frame = None
self.lock = threading.Lock()

# 开一个线程一直读取摄像头图像
self.running = True
self.thread = threading.Thread(target=self.capture_loop)
self.thread.start()

# 定时发布当前帧
timer_period = ROS_FPS
self.timer = self.create_timer(timer_period, self.timer_callback)

def capture_loop(self):
while self.running:
ret, frame = self.cap.read()
if ret:
with self.lock:
self.latest_frame = frame

def timer_callback(self):
print("publisher begin to read img")
with self.lock:
frame = self.latest_frame.copy() if self.latest_frame is not None else None
if frame is not None:
msg = self.bridge.cv2_to_imgmsg(frame, encoding='bgr8')
self.publisher.publish(msg)

def destroy_node(self):
self.running = False
self.thread.join()
self.cap.release()
super().destroy_node()

def main(args=None):
rclpy.init(args=args)
node = ImagePublisher()

try:
rclpy.spin(node)
except KeyboardInterrupt:
pass

# 释放资源
node.destroy_node()
rclpy.shutdown()

subscriber_node.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import torch

QUEUE_SIZE = 10

# 订阅者节点类
class ImageSubscriber(Node):
def __init__(self):
super().__init__('image_subscriber')
# 订阅发布者发布的话题 image_raw, 收到消息就调用 listener_callback
self.subscription = self.create_subscription(Image, 'image_raw', self.listener_callback, QUEUE_SIZE)

# 转成 OpenCV 格式
self.bridge = CvBridge()

# 加载yolov5的模型
self.model = torch.hub.load('yolov5', 'yolov5s', source='local')

def listener_callback(self, msg):
print("subscriber begin to call model")
# 转换成 OpenCV 的图像
img = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
results = self.model(img) # 调用模型进行检测

# output
# 以下处理是为了将图片重复渲染到一个窗口上, 从而避免不间断打开巨量窗口
results.print()
results.render() # 将检测框渲染到图像上
annotated_img = results.ims[0]
cv2.imshow("YOLOv5 Detection", annotated_img)
cv2.waitKey(1)

def main(args=None):
# 同发布者节点
rclpy.init(args=args)
node = ImageSubscriber()
rclpy.spin(node)
rclpy.shutdown()

Result 1

alt text

Result 2

alt text

8. Notice

8.1 权限问题的解决.

为了解决权限问题.

  1. 给自己设置的用户授予sudo权限.

  2. 直接使用 root 用户.

这里只是写demo, 我们直接使用 root 用户好了.

操作如下.

1
2
# 之后输入root用户的密码即可
su root

alt text

如果没有给用户授权.

我们的所有操作都在root用户下进行!!!

我们的所有操作都在root用户下进行!!!

我们的所有操作都在root用户下进行!!!

8.2 换源(可选, 如果发现后续软件包安装速度太慢可以跟着操作)

我们知道linux系统中的安装方式常常采用一些包管理器, 在Ubuntu这个发行版下常用的管理器是apt(软件包以.deb结尾), 我们通过管理器从远程的服务器拉取软件包进行安装, 但遗憾的是, 存储软件包的管理器在国外, 下载速度非常慢, 于是国内一些高校和厂商决定将软件包搬运到国内(或者使用代理), 这里我们把软件包的安装源切换到国内, 方便后续操作.

为了方便换源, 这里我把要复制的已经放到网页上了.

在ubuntu访问 http://47.108.130.26:4000/2025/06/30/Source-about-Ubuntu/ 即可(为什么在虚拟机上访问是因为,暂时不能把复制粘贴的内容在主机和虚拟机之间来回交互, 这里不需要就不演示如何更改配置了, 更为方便的实际上是用ssh或者vnc连接虚拟机).

step 1

打开火狐.

alt text

step 2

按照步骤复制粘贴到Terminal就可以了.

alt text

如果想探索更多源的话,可以根据下面的网站进行配置.

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

8.3 无法打开Terminal(可能遇到的问题)

Ubuntu 安装之后我们打开中端会发现Terminal在左上角转圈, 随后消失的情况, 解决方法如下.

尝试按下 CTRL + ALT + F3(如果发现误触音量键请按下CTRL + FN + ALT + F3). 之后会进入命令行模式, 根据之前注册的账户登录即可.

alt text

之后输入以下命令进行修复.

1
2
3
cd /etc/default # 切换到 `/etc/default` 目录
# 可能会需要输入密码(看不见自己的输入是正常的)
sudo nano locale # 用文本编辑器打开locale文件

之后将第一行 LANG="en_US" 改成 LANG="en_US.UTF-8".

alt text

之后 CTRL + X 退出 Nano(会问Y/N, 输入Y即可保存并退出).

之后输入下面指令.

1
2
#  生成并清理本地化(locale)设置
sudo locale-gen --purge

alt text

之后重启.

1
sudo reboot

8.4 赋予初始用户sudo权限(可选)

先切换到 root 用户.

1
2
# 要输入 root 密码
su root

给用户赋予 sudo 权限.

1
2
# <youruser> 是你的用户名
sudo usermod -aG sudo <youruser>

之后如果出现权限不够就可以在前面加上 sudo 权限啦.

8.5 磁盘镜像扩容(可选)

如果一开始分配的磁盘空间是 20GiB 可能会不足够, 这个时候可以对磁盘空间进行扩容, 具体可以用到 Virtual Box 自带的工具 V.

打开命令行工具, 然后 cd <VirtualBox 安装路径>.

1
2
3
# 在Virtual Box根目录下执行
# 例如扩容到 50GiB: VBoxManage modifyhd "D:\your_path\yourdisk.vdi" --resize 51200
VBoxManage modifyhd "<.vdi文件路径>" --resize <磁盘的总空间/MiB>

8.6 宿主机和虚拟机共享粘贴板(可选)

step 1

操作过程中我们可能需要在主机和虚拟机之间交互粘贴的内容.

右键打开对应镜像的设置, 这里必须先停止运行, 否则不会生效.

alt text

选择双向即可.

alt text

step 2

打开固态驱动器和IO(关闭虚拟机情况下设置, 否则会显示灰色).

alt text

alt text

step 3

1
2
sudo apt install -y virtualbox-guest-x11
VBoxClient --clipboard

显示一些输出即为成功, 如下.

1
2
3
4
5
6
7
8
9
10
11
jvle@ROS:~/Desktop$ VBoxClient --clipboard
02:50:04.827462 main VBoxClient 7.0.4 r154605 (verbosity: 0) linux.amd64 (Nov 16 2022 17:25:53) release log
02:50:04.827465 main Log opened 2025-07-01T02:50:04.827457000Z
02:50:04.829435 main OS Product: Linux
02:50:04.830358 main OS Release: 6.8.0-60-generic
02:50:04.831384 main OS Version: #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2
02:50:04.832219 main Executable: /opt/VBoxGuestAdditions-7.0.4/bin/VBoxClient
02:50:04.832220 main Process ID: 7636
02:50:04.832221 main Package type: LINUX_64BITS_GENERIC
02:50:04.837457 main VBoxClient 7.0.4 r154605 started. Verbose level = 0. Wayland environment detected: yes
02:50:04.838039 main Service: Shared Clipboard

step4(上面无法解决再看这里)

打开安装 Guest Addition 和 功能增强.

alt text

8.7 虚拟机内使用搜索引擎(可选)

因为引擎默认是 google 的, 我们要设置成可用的引擎.

alt text

这里选择必应的引擎即可.

alt text

8.8 虚拟机安装汉字输入法(可选)

step 1

选择 language 汉语.

alt text

alt text

step 2

安装中文语言包.

alt text

alt text

之后重启系统.

1
sudo reboot

step 3

安装中文输入法.

1
2
3
4
sudo apt install -y ibus
sudo apt install -y ibus-gtk ibus-gtk3
im-config -s ibus
sudo apt install -y ibus-pinyin

step 4

选择中文输入源.

alt text

点击 “+” 添加.

alt text

右上角出现中文标志, 即可切换.

alt text

8.9 同步时间(可选)

1
2
3
4
# 查看系统时间
date
# 同步系统时间
sudo timedatectl set-ntp true

8.10 闪屏问题(可选)

闪烁的本质原因是因为显存不足导致的.

step 1

拉高显存, 适用即可.

alt text

step 2

打开3D加速.

alt text

References

  1. 修复virtual Box无法打开Terminal问题: https://zhuanlan.zhihu.com/p/685438687

  2. Yolov5: https://github.com/ultralytics/yolov5.git

  3. 在线网址: http://47.108.130.26:4000

  4. 清华源: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/