# MRS-TB3
**Repository Path**: Mutil-Unmanned-System/mrs-tb3
## Basic Information
- **Project Name**: MRS-TB3
- **Description**: 基于turtlebot3的多机器人编队demo
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 0
- **Created**: 2022-07-17
- **Last Updated**: 2025-09-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[TOC]
# 1 介绍
## 1.1 注意事项
**代码运行环境为:** Ubuntu20.4 + ROS N版
**代码文件命令格式:**
```HTML
姓名_功能_版本
ZhouZheng_Mas_Prescribed_time_V1
```
## 1.2 文件结构
**sensor_interface** 目录用于存放传感器接口
**robot** turtlebot3机器人接口
**demo** 目录为存放演示程序的目录
**Reference** 目录为存放参考资料的地方
## 1.3 分支结构
**master** 工控机的分支,里面有实物代码和实物传感器驱动以及仿真代码;
**feature/tb3_pratice_demo** 工控机的实验分支,里面有实物代码和实物传感器驱动,后续不使用了,直接用master分支;
**feature/tb3_gazebo** 自己电脑仿真分支,里面有基本的小车模型和一些gazebo仿真代码;
**feature/target_detection** 用于目标检测的分支,目前没用,后续传代码,非必要不要切换到这个分支。
# 2 在仿真环境中启动turtlebot3
## 2.1 启动turtlebot3节点
1)鱼香一键安装ros,注意对应Ubuntu版本,ubuntu20对应Noetic
```bash
wget http://fishros.com/install -O fishros && . fishros
```
2)安装依赖项
```shell
sudo apt-get install ros-noetic-joy ros-noetic-teleop-twist-keyboard ros-noetic-serial
```
3)先创建ROS工作空间,输入指令
```bash
# 创建一个新的ROS工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 初始化工作空间
catkin_init_workspace
# 构建工作空间
cd ~/catkin_ws
catkin_make
# 设置环境变量以便在任何新的终端中都能找到ROS工作空间
source devel/setup.bash
```
```bash
# 有需要的话,可以自己创建一个新的ROS功能包,用git clone的功能包一般就够用了
catkin_create_pkg my_robot roscpp std_msgs
```
现在你应该可以开始在你的`my_robot`包中编写代码了。
4)从项目仓库下载turtlebot3代码包
```shell
cd ~/catkin_ws/src/
git clone https://gitee.com/Mutil-Unmanned-System/mrs-tb3.git
cd mrs-tb3 && git checkout feature/tb3_gazebo #这个命令是切换到feature/tb3_gazebo分支,用于仿真的
cd ~/catkin_ws && catkin_make
```
5)新建一个终端启动仿真
```shell
source devel/setup.bash
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_fake turtlebot3_fake.launch
```
6)启动键盘teleop节点控制turtlebot3移动。
```shell
source devel/setup.bash
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
```
接下来就可以看到如下效果(如图 reference/image/1-1.png):

## 2.2 使用 Gazebo 仿真环境启动turtlebot3
1)第一次使用Turtlebot3的gazebo仿真,需要把Turtlebot3的模型文件,复制到gazebo的模型目录里
```shell
mkdir -p ~/.gazebo/models/
cp -r ~/catkin_ws/src/mrs-tb3/robot/turtlebot3_simulations/turtlebot3_gazebo/worlds/ ~/.gazebo/models/
```
2)启动仿真。设置模型参数,指定使用那种机器人型号. 启动世界地图,默认的空白地图环境中加载Turtlebot3机器人
```shell
source devel/setup.bash
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
```
3)新建一个终端,用键盘控制turtlebot3
```shell
source devel/setup.bash
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
```
4)通过键盘上的按键wsadx就可以遥控仿真环境中的turtlebot3机器人了 (如图 reference/image/1-2.png):

5)或者为了方便,将其直接添加到环境变量中:
```shell
echo "source devel/setup.bash" >> ~/.bashrc
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
```
## 2.3 Gazebo环境下多机器人编队
### 2.3.1 基于TF实现多机器人编队
基于TF树的方式实现多机器人编队,**tb3_leaderfollower_with_tf** 节点接收1-4号机器人的状态数据,并发布到TF 上,0号机器人直接由键盘控制。在主循环中获取机器人TF坐标数据,计算控制量并发布到 **/tb3_x/cmd_vel** 上控制机器人移动。
1)启动仿真。使用默认的空白地图环境中加载5个Turlebot3机器人,并进行简单线性跟随。
```shell
roslaunch tb3_leaderfollower_with_tf tb3_leaderfollower_with_tf.launch
```
2)启动键盘,用来控制领航者turtlebot3机器人。
```shell
ROS_NAMESPACE=tb3_0 rosrun turtlebot3_teleop turtlebot3_teleop_key
```
3)通过键盘上的按键wsadx就可以遥控仿真环境中的turtlebot3机器人了 (如视频 reference/image/1-3.gif)

### 2.3.2 基于Topic通信方式实现多机器人编队
基于Tpoic话题的方式实现多机器人编队,**tb3_leaderfollower_with_topic** 节点接收1-4号机器人的状态数据,0号机器人直接由键盘控制。
1)启动仿真。使用默认的空白地图环境中加载5个Turlebot3机器人,并进行简单线性跟随。
```shell
roslaunch tb3_leaderfollower_with_topic tb3_leaderfollower_with_topic.launch
```
2)启动键盘,用来控制领航者turtlebot3机器人。
```shell
ROS_NAMESPACE=tb3_0 rosrun turtlebot3_teleop turtlebot3_teleop_key
```
3)通过键盘上的按键wsadx就可以遥控仿真环境中的turtlebot3机器人了 (效果与TF 方式类同)
## 2.4 自定义仿真代码
1)函数说明
设备:虚拟机ubuntu20.04
参考代码路径:/home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_gazebo/src/tb3_gazebo_luo_2024.cpp
```shell
变量说明:
N 无人车的数量,根据实验设定,该代码为4,如果要用5辆车,记得取消注释:
// sub4 = node.subscribe("/tb3_4/odom", 10, &multiThreadListener::poseCallback4,this);
p 无人车的位置信息,2N*1的列向量。
v 无人车的速度信息,2N*1的列向量,该代码注释掉了速度的获取,详见multiThreadListener类。
agent_angle 无人车的朝向,2N*1的列向量。
u 控制器的输出,2N*1的列向量。
函数说明:
Timing_create() 中断函数,用于实现严格时间步长的控制计算,里面用于控制器的设计和计算,其他函数可以不动,将自己的公式放入其中用p和v信息计算出u即可。
OutPutByModel(float angle,Eigen::Matrix u,geometry_msgs::Twist &vel_msg) 将控制器转换为线速度和角速度并输出,输入:小车朝向,控制器输入,速度话题;尽量不要动。
```
该代码实现的功能有:
- 相应的控制算法,让小车收敛到一致,应用的算法有NussFunction等。
**需要自己设计的函数:Timing_create(),里面进行控制器设计。**
2) 编译C++代码
- 添加编译代码
文件:`/home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_gazebo/CMakeLists.txt`
```bash
gedit /home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_gazebo/CMakeLists.txt
```
在Build后面添加如下代码:
```cmake
add_executable(code_name src/code_name.cpp)
target_link_libraries(code_name ${catkin_LIBRARIES})
```
其中code_name是代码的名字,比如编译代码`tb3_gazebo_luo_2024.cpp`:
```cmake
add_executable(tb3_gazebo_luo_2024 src/tb3_gazebo_luo_2024.cpp)
target_link_libraries(tb3_gazebo_luo_2024 ${catkin_LIBRARIES})
```
- 执行编译指令
```bash
cd ~/catkin_ws && catkin_make
```
3)运行仿真,进入gazebo,以`tb3_gazebo_luo_2024.cpp`为例
```
roslaunch tb3_gazebo multi_turtlebot3_rigidity.launch
```
4)运行自己的代码
```
rosrun tb3_gazebo tb3_gazebo_luo_2024
```
# 3 编队形成与变换
### 3.1 三角形编队
六个机器人使用PID控制器完成三角形编队,队形形成后停留固定时间,之后跟随虚拟领导者进行有规律的运动。
1)启动仿真。使用默认的空白地图环境中加载6个Turlebot3机器人,初始位置数据在triangles.cpp文件的注释里。
```
roslaunch learning_sanjiaoxing multi_turtlebot3-wyf.launch
```
2)启动.cpp文件,完成编队。
```
rosrun learning_sanjiaoxing triangles
```
### 3.2 编队队形变换
六个机器人首先由一字型编队变为三角形编队,队形形成后停留固定时间,再由三角形编队变为六边形编队,同样队形形成后停留固定时间,最后由六边形编队变为长方形编队,整个队形变换完成。
1)启动仿真。使用默认的空白地图环境中加载6个Turlebot3机器人。
```
roslaunch learning_sanjiaoxing multi_turtlebot3-wyf.launch
```
2)启动.cpp文件,编队变换完成。
```
rosrun learning_sanjiaoxing evolution
```
### 3.3 基于匈牙利算法和ICP算法的编队控制
15个机器人分布在四周,然后按照W A N G字样变换队形,期间可以通过键盘操控,改变某个机器人位置,可以观察到编队形成过程中的分配发生改变。由于ICP的作用队形也发生了旋转平移
1)启动仿真
```
roslaunch formation_control multi_turtlebot3-lzg.launch
```
2)启动.cpp文件,算法开始运行。
```
rosrun formation_control test_Algorithm_15
```
2)启动键盘节点。
```
rosrun turtlebot3_teleop turtlebot3_teleop_key
```
# 4 实验教程
设备:工控机
环境:ubuntu16.04
代码路径:/home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_base_camera_control/src
## 4.1 编写C++代码
参考代码mrs-tb3/demo/tb3_base_camera_control/src/tb3_base_camera_control_DHLuo_MASs_leaderless.cpp
```shell
变量说明:
Robot_number 无人车的数量,根据实验设定,该代码为4。
N 无人车的数量,根据实验设定,该代码为4。
p 无人车的位置信息,2N*1的列向量。
v 无人车的速度信息,2N*1的列向量,该代码注释掉了速度的获取,详见multiThreadListener类。
函数说明:
Timing_create() 中断函数,用于实现严格时间步长的控制计算,里面用于控制器的设计和计算,其他函数可以不动,将自己的公式放入其中用p和v信息计算出u即可。
OutPutByModel(float angle,Eigen::Matrix u,geometry_msgs::Twist &vel_msg) 将控制器转换为线速度和角速度并输出,输入:小车朝向,控制器输入,速度话题;尽量不要动。
APF(Eigen::Matrix robotpoint,Eigen::Matrix barrierpoint) 人工势场法函数,输入:无人车A的位置信息,和无人车B的位置信息。
```
该代码实现的功能有:
1.APF人工势场法避碰;
2.通过键盘来让小车停止和运动,按键S:停,按键W:运动;
3.相应的控制算法,例如NussFunction等。
**需要自己设计的函数:Timing_create(),里面进行控制器设计。**
## 4.2 编译C++代码
### 4.2.1 添加编译代码
文件:/home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_base_camera_control/CMakeLists.txt
```bash
gedit /home/ubuntu/catkin_ws/src/mrs-tb3/demo/tb3_base_camera_control/CMakeLists.txt
```
在Build后面添加如下代码:
```cmake
add_executable(code_name src/code_name.cpp)
target_link_libraries(code_name ${catkin_LIBRARIES})
```
其中code_name是代码的名字,比如编译代码tb3_base_camera_control_DHLuo_MASs_leaderless.cpp:
```cmake
add_executable(tb3_base_camera_control_DHLuo_MASs_leaderless src/tb3_base_camera_control_DHLuo_MASs_leaderless.cpp)
target_link_libraries(tb3_base_camera_control_DHLuo_MASs_leaderless ${catkin_LIBRARIES})
```
### 4.2.2 编译代码
在~/catkin_ws目录下
```bash
cd ~/catkin_ws
catkin_make -j8 -l8
```
## 4.3 实验步骤及运行程序
### 4.3.1 启摄像头和二维码检测算法
1)清除所有节点
```
./multi_scripts/multi_kill.sh
```
2)运行摄像头
```shell
roslaunch mindvision_cam ge300gc.launch
```
3)二维码节点
```
roslaunch apriltag_ros continuous_detection.launch
```
### 4.3.2 启动机器人及运行程序
1)在根目录下执行脚本,根据实验机器人数量启动相应代码,注意机器人的顺序编号。
```shell
#工控机器指令
cd ~ && ./multi_scripts/multi_robot.sh #启动三个机器人
cd ~ && ./multi_scripts/multi_robot4.sh #启动四个机器人
cd ~ && ./multi_scripts/multi_robot5.sh #启动五个机器人
cd ~ && ./multi_scripts/multi_robot6.sh #启动六个机器人
cd ~ && ./multi_scripts/multi_robot10.sh #启动十个机器人
#启动单个机器人
cd ~ && ./multi_scripts/single_robot.sh 0 #启动第0个机器人
#服务器指令
cd ~ && ./multi_scripts/multi_robot.sh 3 #启动三个机器人
cd ~ && ./multi_scripts/multi_robot.sh 4 #启动四个机器人
cd ~ && ./multi_scripts/multi_robot.sh 5 #启动五个机器人
```
2)运行自己的代码,路径无所谓
```shell
rosrun tb3_base_camera_control code_name #运行刚刚编译通过的程序,code_name是代码的名字
```
比如:
```shell
rosrun tb3_base_camera_control tb3_base_camera_control_DHLuo_MASs_leaderless #运行程序tb3_base_camera_control_DHLuo_MASs_leaderless.cpp
```
3)用键盘控制turtlebot3
```shell
// 启动机器人的键盘控制程序
./multi_scripts/multi_key.sh 0
./multi_scripts/multi_key.sh 1
./multi_scripts/multi_key.sh 2
./multi_scripts/multi_key.sh 3
./multi_scripts/multi_key.sh 4
./multi_scripts/multi_key.sh 5
./multi_scripts/multi_key.sh 6
./multi_scripts/multi_key.sh 7
./multi_scripts/multi_key.sh 8
./multi_scripts/multi_key.sh 9
```
### 4.3.3 发布路径话题
该话题以及编译过,直接运行即可,不要将没用到的机器人放入摄像头视野范围内。
```
roslaunch tb3_base_camera_control tb3_base_camera_paths.launch
```
### 4.3.4 录制数据
```
rosbag record /tb3_0/robot /tb3_1/robot /tb3_2/robot /tb3_3/robot /tb3_4/robot -o ~/catkin_ws/src/mrs-tb3/demo/tb3_base_camera_control/rosbag/robot.bag
```
其中/tb3_0/robot是话题名称,尽量不要更改,如何发现录制失败,可以看看是不是话题名称被改了,由C++代码里设定:
```C++
tb3_0_robot = node.advertise("/tb3_0/robot", 10);
```
# 5 代码上传
```bash
cd ~/catkin_ws/src/mrs-tb3
git log #查看以往的日志
git add . #"."是添加所有文件, 也可以添加指定文件,例如git add README.md
git commit -m "周政:增加实验文档说明" #规范添加注释,必须有!!!
git push #上传代码,后面输入自己的gitee的帐号与密码
```
# 6 BUG
## 6.1 CV版本不兼容
摄像头代码会调用CV,会因为版本不同,安装路径不一样,头文件不一样,需要修改两个文件:
`sensor_interface/mindvision_cam/src/stereo_cam.cpp`和`sensor_interface/mindvision_cam/src/stereo_cam_ge300gc.cpp`
```c++
//台式机robot
// #include
#include //需要注释掉
#include
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
// #include "cxcore.hpp" //需要注释掉
//工控机ubuntu
#include
#include
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "cxcore.hpp"
```
## 6.2 更换新机器人密钥报错
```
ssh 192.168.168.116
```
出现如下报错:
```
ubuntu@T3MULTIC-V110-98:~$ ssh 192.168.168.116
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:off60hI+cab9zTgdZkIHoy0CG5UROW1rdB0ib2whTB0.
Please contact your system administrator.
Add correct host key in /home/ubuntu/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/ubuntu/.ssh/known_hosts:12
remove with:
ssh-keygen -f "/home/ubuntu/.ssh/known_hosts" -R 192.168.168.116
ECDSA host key for 192.168.168.116 has changed and you have requested strict checking.
Host key verification failed.
```
解决办法:
```
ssh-keygen -f "/home/ubuntu/.ssh/known_hosts" -R 192.168.168.116
```
## 6.3 更换新机器人远程连接:
远程电脑ssh连接后:
```
sudo apt install tightvncserver
vncserver :1 -geometry 1920x1080 -depth 24
#注意: 密码统一设置为ubuntu
```