# ROS 使用指南



# ROS-SDK

### 安装 ROS 软件包

> **提示**
> 
> 支持的架构：
> 
> - x64
> - arm64
> 
> 注意, 不支持 RISCV
> 
> 支持的ROS版本范围:
> 
> Ubuntu 20.04
> 
> - ROS1: Noetic
> - ROS2: Foxy, Galactic
> 
> Ubuntu 22.04
> 
> - ROS2: Humble, Iron
> 
> 注意, 不支持 Ubuntu18.04 版本。
> 
> 如果一定要使用 Ubuntu 18.04，请在 18.04 中利用 Docker 安装其他 Ubuntu 版本。即使这样，以 Ubuntu 1804 做主机也无法支持USB格式的CAN转换器，需要购入以太网版本的 CAN 转换器。

> **警告** 注意, 下载软件包之前, 需要先安装好 ROS. 并 source 你所需要使用的版本. 否则下载的软件包将 **无法使用**

SDK zip **不能单独使用**。原先由 `apt.hexfellow.com` 安装的 `ros-$ROS_DISTRO-xpkg-msgs` 与 `ros-$ROS_DISTRO-xpkg-comm` 必须先用本页提供的 deb `dpkg -i` 安装（apt 站即将关闭，不要再配 hexfellow apt 源）。请按自己的 ROS 发行版和 CPU 架构下载对应两个包：

- Humble / Ubuntu 22.04 / x86\_64
    - [ros-humble-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/jammy/ros-humble-xpkg-msgs_3.0.0-8093jammy_amd64.deb)
    - [ros-humble-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/jammy/ros-humble-xpkg-comm_2.3.2-8125jammy_amd64.deb)
- Humble / Ubuntu 22.04 / arm64
    - [ros-humble-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/jammy/ros-humble-xpkg-msgs_3.0.0-8094jammy_arm64.deb)
    - [ros-humble-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/jammy/ros-humble-xpkg-comm_2.3.2-8126jammy_arm64.deb)
- Iron / Ubuntu 22.04 / x86\_64
    - [ros-iron-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/jammy/ros-iron-xpkg-msgs_3.0.0-8097jammy_amd64.deb)
    - [ros-iron-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/jammy/ros-iron-xpkg-comm_2.3.2-8129jammy_amd64.deb)
- Iron / Ubuntu 22.04 / arm64
    - [ros-iron-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/jammy/ros-iron-xpkg-msgs_3.0.0-8098jammy_arm64.deb)
    - [ros-iron-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/jammy/ros-iron-xpkg-comm_2.3.2-8130jammy_arm64.deb)
- Noetic / Ubuntu 20.04 / x86\_64
    - [ros-noetic-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/focal/ros-noetic-xpkg-msgs_3.0.0-8087focal_amd64.deb)
    - [ros-noetic-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/amd64/focal/ros-noetic-xpkg-comm_2.3.2-8119focal_amd64.deb)
- Noetic / Ubuntu 20.04 / arm64
    - [ros-noetic-xpkg-msgs](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/focal/ros-noetic-xpkg-msgs_3.0.0-8088focal_arm64.deb)
    - [ros-noetic-xpkg-comm](https://odocs.hexfellow.com/files/ros-sdk/debs/arm64/focal/ros-noetic-xpkg-comm_2.3.2-8120focal_arm64.deb)

以 Humble / x86\_64 为例：

```bash
# 先安装官方 ROS（仍用 Ubuntu/ROS 上游源，不是 hexfellow apt）
source /opt/ros/humble/setup.bash
sudo dpkg -i ros-humble-xpkg-msgs_*.deb ros-humble-xpkg-comm_*.deb
sudo apt-get -f install -y   # 若缺 ROS 依赖

```

同目录还有可选包（imu / vehicle / arm / bridge 等）：[/files/ros-sdk/debs/](https://odocs.hexfellow.com/files/ros-sdk/debs/)。底盘 SDK 最少只需 msgs + comm。静态 deb 覆盖 Noetic（20.04）、Humble/Iron（22.04）；页面里提到的 Foxy/Galactic 没有对应 xpkg deb，请改用 Noetic 或 Humble。

请根据实际购买的产品，直接下载对应 SDK 压缩包（不再使用 hextool.bash / rosdl）。

- [TRIGGER-A](https://odocs.hexfellow.com/files/ros-sdk/sdk_trigger_a_ws.zip) — `sdk_trigger_a_ws.zip`
- [TRIGGER-X](https://odocs.hexfellow.com/files/ros-sdk/sdk_trigger_x_ws.zip) — `sdk_trigger_x_ws.zip`
- [ORCS-DIFF](https://odocs.hexfellow.com/files/ros-sdk/sdk_orcs_diff_ws.zip) — `sdk_orcs_diff_ws.zip`
- [ORCS-MCNM](https://odocs.hexfellow.com/files/ros-sdk/sdk_orcs_mcnm_ws.zip) — `sdk_orcs_mcnm_ws.zip`
- [ORCS-MCNM-PRO](https://odocs.hexfellow.com/files/ros-sdk/sdk_orcs_mcnm_pro_ws.zip) — `sdk_orcs_mcnm_pro_ws.zip`
- [ORCS-MINI](https://odocs.hexfellow.com/files/ros-sdk/sdk_orcs_mini_ws.zip) — `sdk_orcs_mini_ws.zip`
- [NEOS](https://odocs.hexfellow.com/files/ros-sdk/sdk_neos_ws.zip) — `sdk_neos_ws.zip`
- [ARK](https://odocs.hexfellow.com/files/ros-sdk/sdk_ark_ws.zip) — `sdk_ark_ws.zip`
- [ARK-MINI](https://odocs.hexfellow.com/files/ros-sdk/sdk_ark_mini_ws.zip) — `sdk_ark_mini_ws.zip`
- [RAY](https://odocs.hexfellow.com/files/ros-sdk/sdk_ray_ws.zip) — `sdk_ray_ws.zip`
- [HAMMER-80](https://odocs.hexfellow.com/files/ros-sdk/sdk_hammer_80_ws.zip) — `sdk_hammer_80_ws.zip`
- [ECHO](https://odocs.hexfellow.com/files/ros-sdk/sdk_ehco_ws.zip) — `sdk_ehco_ws.zip`
- [ECHO-PLUS](https://odocs.hexfellow.com/files/ros-sdk/sdk_echo_plus_ws.zip) — `sdk_echo_plus_ws.zip`
- [MARK1-DIFF](https://odocs.hexfellow.com/files/ros-sdk/sdk_mark1_diff_ws.zip) — `sdk_mark1_diff_ws.zip`
- [MARK1-MCNM](https://odocs.hexfellow.com/files/ros-sdk/sdk_mark1_mcnm_ws.zip) — `sdk_mark1_mcnm_ws.zip`
- [MARK1-MCNM-PRO](https://odocs.hexfellow.com/files/ros-sdk/sdk_mark1_mcnm_pro_ws.zip) — `sdk_mark1_mcnm_pro_ws.zip`
- [MARK2-MCNM](https://odocs.hexfellow.com/files/ros-sdk/sdk_mark2_mcnm_ws.zip) — `sdk_mark2_mcnm_ws.zip`
- [FIBOT-4A](https://odocs.hexfellow.com/files/ros-sdk/sdk_fibot_4a_ws.zip) — `sdk_fibot_4a_ws.zip`
- [FIBOT-4X](https://odocs.hexfellow.com/files/ros-sdk/sdk_fibot_4x_ws.zip) — `sdk_fibot_4x_ws.zip`
- [XGO-P](https://odocs.hexfellow.com/files/ros-sdk/sdk_xgo_p_ws.zip) — `sdk_xgo_p_ws.zip`

依赖 deb 装好后，解压 SDK 并编译。以 ORCS-DIFF / ROS2 Humble 为例：

```bash
unzip sdk_orcs_diff_ws.zip
cd sdk_orcs_diff_ws
source /opt/ros/humble/setup.bash   # ROS1 则 source /opt/ros/noetic/setup.bash
colcon build --symlink-install      # ROS1 用 catkin_make
source install/setup.bash           # ROS1 用 source devel/setup.bash

```

> **提示** 为防止手敲命令敲错字符, 建议使用 Ubuntu 所带的浏览器直接打开本网址, 并将命令从浏览器中复制到终端.

---

### SDK软件包结构说明

各个软件包大同小异, 这里以 ORCS-DIFF 为例.

```bash
root@1c2edac84f0b:~# tree -d -L 5
.
└── sdk_orcs_diff_ws
    └── src
        ├── demo
        │   └── demo_general_chassis
        │       ├── demo_vehicle
        │       └── tools
        └── drivers
            └── xpkg_vehicle
                ├── include
                ├── ini
                ├── launch
                ├── scripts
                ├── src
                └── tools

14 directories

```

- demo 文件夹: 存放 demo launch 文件, 用户可以参考其中的内容编写自己的 launch 文件.

> **警告** 注意, demo 文件夹中的 launch 文件均设计成为只能同时启动一个. 请不要同时 launch 多个 launch 文件

- drivers 文件夹: 基础机器人驱动软件, 例如充电桩(如果有), 底盘控制等
- urdf 文件夹: 用来放 URDF
- 此外，另有两个包必须用本页提供的 deb 安装（不要再用 apt.hexfellow.com） 
    - ros-$ROS\_DISTRO-xpkg-comm 负责与底盘间的物理通信。
    - ros-$ROS\_DISTRO-xpkg-msgs 负责提供消息类型。

如果没有专业指导, 请勿改动除了 demo 文件夹之外的任何软件包.

---

### 使用SDK软件包

软件包提供了测试demo，请查阅[使用ROS的demo](https://odocs.hexfellow.com/books/hexmove/page/rosdemo)

# 使用ROS的demo

### 启动前检查

<p class="callout warning">请查阅[ CAN硬件连接标准](https://odocs.hexfellow.com/books/hexmove/page/f1b6f)和[CAN总线配置](https://odocs.hexfellow.com/books/hexmove/page/can-6Gh)，确保硬件已经正确连接</p>

> **提示** 请先掌握 `ROS` 的基本知识。可以参考 [ROS1教程](https://wiki.ros.org/ROS/Tutorials) 以及 [ROS2教程](https://docs.ros.org/en/iron/Tutorials.html)，了解对 `ROS` 系统的常见约定。

请检查确保完成以下事项：

1. 已经安装完成ROS-SDK，如果是第一次安装SDK，建议在 ***首次安装后重启*** 一次
2. 已经通过了编译并没有报错
3. 已经完成工作空间的source
4. 如果使用CAN-COM HUB，请确定正确连接CAN总线，确定已经能够搜索到设备
    
    
    - 在终端使用lsusb查询可看到以下设备
5. 确保遥控器已经关闭；或者打开时，拨到的是 CAN 模式
    
    > 关于遥控器与模式，请参阅产品用户手册中关于遥控器的部。

---

### 底盘类设备

> **警告** 注意, 首次尝试使用软件控制机器人时，请确保机器人活动范围内没有其他障碍，或将机器人架起。

**底盘的测试demo有以下两个：**

```
* demo_basic_ctrl.launch
* demo_key_ctrl.launch

```

`demo_basic_ctrl.launch`是标准的启动文件，可以配套自动驾驶直接使用，通过使用 `/cmd_vel` 话题来控制机器人的移动。

`demo_key_ctrl.launch`是支持键盘控制的启动文件，使用 `turtle_teleop_key` 来利用键盘控制机器人。如果你还没有看过 ROS 的 `turtlesim` 教程，请先查看 `turtlesim` 教程。

> **提示** 注意并不是使用方向键控制移动，请查看终端打印的使用方式提示,按下提示中的前进按钮。

**成功启动launch后会得到以下终端消息**

[![startup.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-07/scaled-1680-/VY6Ac9VV1j8sNoGA-startup.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-07/VY6Ac9VV1j8sNoGA-startup.png)

**launch文件中参数设置和通讯`msg`请查阅`src/drivers/xpkg_vehicle/README.md`文件,以下解释几个关键参数：**

- `calc_speed`是设置里程计计算方式，`true`为用速度计算，`false`为用电机码盘值计算，建议采用默认false设置
- `mode_can_lock`是CAN模式锁定设置，`true`为强制CAN模式，如果用遥控器切换到其他模式会警告并等待恢复，设置`false`则由用户选择控制模式

!!!note 如果出现底盘无法控制，可能是`mode_can_lock`设置`false`，并且切换到了其他模式

- `rate_x`是输入速度的倍率控制，1为全速，在测试时建议先设置为0.2以下

**成功启动launch包后可以通过`rostopic list`查看ROS话题，以下为几个关键话题：**

- 底盘节点向话题`/odom`发送消息类型为`nav_msgs/Odometry`。此消息表示底盘里程计信息，包含底盘当前位姿信息以及线速度角速度信息。
- 底盘节点向话题`/tf`发送消息类型为`tf2_msgs/TFMessage`，包含底盘tf变换信息，需要在launch参数中启动。
- 底盘节点从话题`/cmd_vel`订阅消息类型为`geometry_msgs/Twist`。底盘接收到该消息后进行移动，其中`linear.x`/`linear.y`为线速度，`angular.z`为旋转角速度。

# Rviz导航插件

<p class="callout warning">该插件仅试用于ROS1版本</p>

---

###  图标设置

[![marker setting.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/5XDdKAdRVZ57L2Um-marker-setting.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/5XDdKAdRVZ57L2Um-marker-setting.png)

用于设置目标点的图标大小，1.0是默认值，其他数值代表尺寸比例倍数，需要点击set刷星所有图标

[![mark.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/CVI19LGOllLDGF83-mark.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/CVI19LGOllLDGF83-mark.png)

marker图标由两部分组成，数字部分为该目标点的序列号，箭头部分为该目标点的停止朝向

---

### 添加目标点

[![add goal.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/qRihprh7YtK0KrXj-add-goal.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/qRihprh7YtK0KrXj-add-goal.png)

1. 请先使用Rviz自带功能![2dnave.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/zMjyzsy8ChNjj329-2dnave.png) 在地图上选取目标点
2. 可通过输入X、Y、R值来微调坐标位置
3. 如果需要直接前往目标点可点击 *GOTO* 按键
4. 如果需要将目标加入到目标列表请点击 *ADD GOAL TO LSIT* 按键
5. 如果目标与目标列表上一个目标距离过远，会在列表中自动插入中间目标值，容忍的最大距离差可在上图中修改，默认是10m

---

### 目标列表管理

[![goal list.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/DaUXTU86kOjZC1qA-goal-list.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/DaUXTU86kOjZC1qA-goal-list.png)

- 添加后的目标点会在该列表中显示，列表中参数可以直接编辑修改，修改完成后点击 *REFRESH MARKER* 按键刷新所有标识
- 列表中绿色行代表下一个要执行的目标点，如果要切换下一个目标，可在列表中选择对应行，点击 *SET NEXT GOAL* 按键切换
- *LOAD GOAL* 和 *SAVE GOAL*用于保存和载入列表，列表将保存在ini/memory.txt中，可以在文档中直接修改数据
- 如果要删除单一目标，选择对应行，点击 *DELETE GOAL* 按键即可
- 如果要清空目标列表，点击 *DELETE ALL GOAL* 按键即可

---

### 模式选择

[![mode.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/nEDfNcOJrkbPuh4j-mode.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/nEDfNcOJrkbPuh4j-mode.png)

模式选择用于不同的列表目标点执行方式

<table border="1" id="bkmrk-cycle-mode-sequence-" style="border-collapse: collapse; width: 99.9898%;"><colgroup><col style="width: 16.1834%;"></col><col style="width: 83.8278%;"></col></colgroup><tbody><tr><td>cycle mode</td><td>循环模式，执行完最后一个目标点会继续执行第一个目标点</td></tr><tr><td>sequence mode</td><td>序列模式，执行完列表所有目标点会停止</td></tr><tr><td>step mode</td><td>单步模式，按列表顺序一次执行一个目标点</td></tr></tbody></table>

为了平滑路径可以调整*Goal tolerance*，进入目标点的该距离半径后会自动跳转到下一目标点，场景越小该值需要越小。该设置不影响最后的目标点到达

---

### 启动控制

[![control.png](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/scaled-1680-/HcAOPi5yo69RutA7-control.png)](https://odocs.hexfellow.com/uploads/images/gallery/2024-10/HcAOPi5yo69RutA7-control.png)

- 默认情况列表会自上而下执行目标点，如果勾选 *REVERSE* 会反向执行目标点
- 使用 *START* 和 *STOP* 按键时由于系统问题可能需要多次点击，该控制按键只对列表中的目标点有效，启动后下一目标点信息会显示在 *NEXT GOAL。*