RoboRTS
简单介绍
RoboRTS是由RoboMaster为RoboMaster AI挑战开发的针对移动机器人实时战略研究的开源软件堆栈。它包括一个自主移动机器人层,具有感知、运动规划和决策模块,在ROS中得到全面支持,以及一个智能决策层。该框架还包括一个多智能体决策框架和游戏模拟器。RoboMaster自2017年开始举办AI挑战赛,其中多个机器人在不同规则下自动在游戏场地上进行对战。RoboRTS采用GPL-v3许可提供。有关更多信息,请参阅RoboRTS教程和DJI RoboMaster AI挑战。
代码详解
1.image
2. roborts *
1)package
<package>
//这是一个描述ROS(机器人操作系统)包的XML文件,名为“roborts”。
<name>roborts</name>
<version>1.0.0</version>
<description>
The roborts meta package provides all the functionality for RoboMaster AI Robot
</description>
<author>RoboMaster</author>
<maintainer email="robomaster@dji.com">RoboMaster</maintainer>
<license>GPL 3.0</license>
<url>https://github.com/RoboMaster/RoboRTS</url>
<buildtool_depend>catkin</buildtool_depend> //所依赖的各个包
<run_depend>roborts_base</run_depend>
<run_depend>roborts_bringup</run_depend>
<run_depend>roborts_camera</run_depend>
<run_depend>roborts_common</run_depend>
<run_depend>roborts_costmap</run_depend>
<run_depend>roborts_decision</run_depend>
<run_depend>roborts_localization</run_depend>
<run_depend>roborts_msgs</run_depend>
<run_depend>roborts_planning</run_depend>
<run_depend>roborts_tracking</run_depend>
<export>
<metapackage/> //指出元包
</export>
</package>
2)总结
这是一个描述ROS(机器人操作系统)包的XML文件,名为“roborts”。该包提供了RoboMaster AI Robot的所有功能。该包采用GPL 3.0许可,并由RoboMaster进行维护。
该包依赖于其他几个包:
“roborts_base”、“roborts_bringup”、“roborts_camera”、“roborts_common”、“roborts_costmap”、“roborts_decision”、“roborts_localization”、“roborts_msgs”、“roborts_planning”和“roborts_tracking”。
此外,该包还导出了一个元包1
3.robot_base
1) chassis *
#include "roborts_sdk/chassis.h"
// 初始化ROS节点
Chassis::Chassis(const std::shared_ptr<ros::NodeHandle>& nh, const std::shared_ptr<tf2_ros::Buffer>& tf_buffer) :
ros_nh_(nh), tf_buffer_(tf_buffer) {
// 订阅底盘状态信息的话题
chassis_info_sub_ = std::make_shared<roborts_sdk::Subscriber<roborts_sdk::cmd_chassis_info>>(ros_nh_, "chassis_info", 1);
chassis_info_sub_->RegisterCallback(&Chassis::ChassisInfoCallback, this);
// 订阅UWB定位信息的话题
uwb_info_sub_ = std::make_shared<roborts_sdk::Subscriber<roborts_sdk::cmd_uwb_info>>(ros_nh_, "uwb_info", 1);
uwb_info_sub_->RegisterCallback(&Chassis::UWBInfoCallback, this);
// 发布底盘里程计信息的话题
ros_odom_pub_ = ros_nh_->advertise<nav_msgs::Odometry>("odom", 50);
// 发布UWB定位信息的话题
ros_uwb_pub_ = ros_nh_->advertise<geometry_msgs::PoseStamped>("uwb_pose", 50);
// 发布底盘速度控制命令的话题
chassis_speed_pub_ = std::make_shared<roborts_sdk::Publisher<roborts_sdk::cmd_chassis_speed>>(ros_nh_, "cmd_vel", 1);
// 发布底盘速度和加速度控制命令的话题
chassis_spd_acc_pub_ = std::make_shared<roborts_sdk::Publisher<roborts_sdk::cmd_chassis_spd_acc>>(ros_nh_, "cmd_vel_acc", 1);
// 订阅底盘速度控制命令的话题
chassis_vel_sub_ = ros_nh_.subscribe("cmd_vel", 1, &Chassis::ChassisSpeedCtrlCallback, this);
// 订阅底盘速度和加速度控制命令的话题
_cmd_chassis_vel_acc_ = ros_nh_.subscribe("cmd_vel_acc", 1, &Chassis::ChassisSpeedAccCtrlCallback, this);
// 初始化ROS消息
odom_.header.frame_id = "odom";
odom_.child_frame_id = "base_link";
odom_tf_.header.frame_id = "odom";
odom_tf_.child_frame_id = "base_link";
uwb_data_.header.frame_id = "uwb";
}
// 底盘状态信息回调函数
void Chassis::ChassisInfoCallback(const std::shared_ptr<roborts_sdk::cmd_chassis_info> chassis_info){
// 获取当前时间
ros::Time current_time = ros::Time::now();
// 更新里程计信息
odom_.header.stamp = current_time;
odom_.pose.pose.position.x = chassis_info->position_x_mm/1000.;
odom_.pose.pose.position.y = chassis_info->position_y_mm/1000.;
odom_.pose.pose.position.z = 0.0;
geometry_msgs::Quaternion q = tf::createQuaternionMsgFromYaw(chassis_info->gyro_angle / 1800.0 * M_PI);
odom_.pose.pose.orientation = q;
odom_.twist.twist.linear.x = chassis_info->v_x_mm / 1000.0;
odom_.twist.twist.linear.y = chassis_info->v_y_mm / 1000.0;
odom_.twist.twist.angular.z = chassis_info->gyro_rate / 1800.0 * M_PI;
// 发布里程计信息
ros_odom_pub_.publish(odom_);
// 更新tf变换信息
odom_tf_.header.stamp = current_time;
odom_tf_.transform.translation.x = chassis_info->position_x_mm/1000.;
odom_tf_.transform.translation.y = chassis_info->position_y_mm/1000.;
odom_tf_.transform.translation.z = 0.0;
odom_tf_.transform.rotation = q;
// 发布tf变换信息
tf_broadcaster_.sendTransform(odom_tf_);
}
// UWB定位信息回调函数
void Chassis::UWBInfoCallback(const std::shared_ptr<roborts_sdk::cmd_uwb_info> uwb_info){
// 更新UWB定位信息
uwb_data_.header.stamp = ros::Time::now();
uwb_data_.pose.position.x = ((double)uwb_info->x)/100.0;
uwb_data_.pose.position.y = ((double)uwb_info->y)/100.0;
uwb_data_.pose.position.z = 0;
uwb_data_.pose.orientation = tf::createQuaternionMsgFromYaw(uwb_info->yaw/ 180.0 * M_PI);
// 发布UWB定位信息
ros_uwb_pub_.publish(uwb_data_);
}
// 底盘速度控制回调函数
void Chassis::ChassisSpeedCtrlCallback(const geometry_msgs::Twist::ConstPtr &vel){
// 将速度控制命令转换为底盘速度控制命令
roborts_sdk::cmd_chassis_speed chassis_speed;
chassis_speed.vx = vel->linear.x*1000;
chassis_speed.vy = vel->linear.y*1000;
chassis_speed.vw = vel->angular.z * 1800.0 / M_PI;
chassis_speed.rotate_x_offset = 0;
chassis_speed.rotate_y_offset = 0;
// 发布底盘速度控制命令
chassis_speed_pub_->Publish(chassis_speed);
}
// 底盘速度和加速度控制回调函数
void Chassis::ChassisSpeedAccCtrlCallback(const roborts_msgs::TwistAccel::ConstPtr &vel_acc){
// 将速度和加速度控制命令转换为底盘速度和加速度控制命令
roborts_sdk::cmd_chassis_spd_acc chassis_spd_acc;
chassis_spd_acc.vx = vel_acc->twist.linear.x*1000;
chassis_spd_acc.vy = vel_acc->twist.linear.y*1000;
chassis_spd_acc.vw = vel_acc->twist.angular.z * 1800.0 / M_PI;
chassis_spd_acc.ax = vel_acc->accel.linear.x*1000;
chassis_spd_acc.ay = vel_acc->accel.linear.y*1000;
chassis_spd_acc.wz = vel_acc->accel.angular.z * 1800.0 / M_PI;
chassis_spd_acc.rotate_x_offset = 0;
chassis_spd_acc.rotate_y_offset = 0;
// 发布底盘速度和加速度控制命令
chassis_spd_acc_pub_->Publish(chassis_spd_acc);
}
}
2)cmake_module *
# - 尝试查找 Glog
#
# 下列变量可用于设置默认值:
# GLOG_ROOT_DIR: 包含所有 GLOG 组件的基础目录
#
# 执行完配置后,将设置以下变量:
# GLOG_FOUND: 标志,指示是否找到 Glog
# GLOG_INCLUDE_DIRS: Glog 的包含目录
# GLOG_LIBRARIES: Glog 的库
# GLOG_LIBRARYRARY_DIRS: Glog 的库目录
# 包含处理 find_package 命令标准参数的模块
include(FindPackageHandleStandardArgs)
# 将 GLOG_ROOT_DIR 变量设置为缓存路径,用于指定 Google glog 的基础目录
set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")
# 根据操作系统条件性地查找 glog/logging.h 文件
if(WIN32)
find_path(GLOG_INCLUDE_DIR glog/logging.h
PATHS ${GLOG_ROOT_DIR}/src/windows)
else()
find_path(GLOG_INCLUDE_DIR glog/logging.h
PATHS ${GLOG_ROOT_DIR})
endif()
# 根据编译器类型条件性地查找 glog 库
if(MSVC)
find_library(GLOG_LIBRARY_RELEASE libglog_static
PATHS ${GLOG_ROOT_DIR}
PATH_SUFFIXES Release)
find_library(GLOG_LIBRARY_DEBUG libglog_static
PATHS ${GLOG_ROOT_DIR}
PATH_SUFFIXES Debug)
set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG})
else()
find_library(GLOG_LIBRARY glog
PATHS ${GLOG_ROOT_DIR}
PATH_SUFFIXES lib lib64)
endif()
# 处理 find_package 命令的标准参数
find_package_handle_standard_args(Glog DEFAULT_MSG GLOG_INCLUDE_DIR GLOG_LIBRARY)
# 如果找到 Google glog,则设置包含目录和库,并输出一条消息
if(GLOG_FOUND)
set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR})
set(GLOG_LIBRARIES ${GLOG_LIBRARY})
message(STATUS "Found glog (include: ${GLOG_INCLUDE_DIR}, library: ${GLOG_LIBRARY})")
mark_as_advanced(GLOG_ROOT_DIR GLOG_LIBRARY_RELEASE GLOG_LIBRARY_DEBUG
GLOG_LIBRARY GLOG_INCLUDE_DIR)
endif()
3)config
4)gimbal
5)referee_system
6)roborts_sdk
roborts_bringup
1)launch
2)maps
多张
3)rviz *
这是一个RViz的配置文件,RViz是ROS的一个可视化工具。以下是每个部分的详细注释:
Panels:
- Class: rviz/Displays # 显示面板
Help Height: 78 # 帮助栏高度
Name: Displays # 显示面板的名称
Property Tree Widget: # 属性树小部件
Expanded: # 展开的属性树
- /Global Options1
- /Status1
Splitter Ratio: 0.5 # 展开属性树的比例
Tree Height: 844 # 属性树的高度 - Class: rviz/Selection # 选择面板
Name: Selection # 选择面板的名称 - Class: rviz/Tool Properties # 工具属性面板
Expanded: # 展开的工具属性- /2D Pose Estimate1 # 2D姿态估计工具属性
- /2D Nav Goal1 # 2D导航目标工具属性
- /Publish Point1 # 发布点工具属性
Name: Tool Properties # 工具属性面板的名称
Splitter Ratio: 0.588679016 # 展开工具属性的比例
- Class: rviz/Views # 视图面板
Expanded: # 展开的视图- /Current View1 # 当前视图
- /Current View1/Focal Point1 # 当前视图的焦点
Name: Views # 视图面板的名称
Splitter Ratio: 0.5 # 展开视图的比例
- Class: rviz/Time # 时间面板
Experimental: false # 实验性功能
Name: Time # 时间面板的名称
SyncMode: 0 # 同步模式
SyncSource: “” # 同步源
Visualization Manager: # 可视化管理器
Class: “” # 类型为空
Displays: # 显示列表
- Class: rviz/TF # TF显示
Enabled: true # 是否启用
Frame Timeout: 15 # 帧超时时间
Frames: # 显示的坐标系
All Enabled: true # 是否启用所有坐标系
base_footprint: # 坐标系1
Value: true # 是否启用
base_laser_link: # 坐标系2
Value: true # 是否启用
base_link: # 坐标系3
Value: true # 是否启用
map: # 坐标系4
Value: true # 是否启用
odom: # 坐标系5
Value: true # 是否启用
Marker Scale: 1 # 标记比例
Name: TF # 显示的名称
Show Arrows: true # 是否显示箭头
Show Axes: true # 是否显示轴
Show Names: true # 是否显示名称
Tree: # 坐标系树
map: # 坐标系1
odom: # 坐标系2
base_footprint: # 坐标系3
base_link: # 坐标系4
base_laser_link: # 坐标系5
{}
Update Interval: 0 # 更新间隔
Value: true # 是否启用
- Alpha: 0.699999988 # 透明度
Class: rviz/Map # 地图显示
Color Scheme: map # 颜色方案
Draw Behind: false # 是否在后面绘制
Enabled: true # 是否启用
Name: Map # 显示的名称
Topic: /map # 显示的主题
Unreliable: false # 是否不可靠
Use Timestamp: false # 是否使用时间戳
4)scripts *
udev2详细注释:
#!/bin/bash
echo "Remap the device port(ttyUSBX) to alias" # 重映射设备端口(ttyUSBX)到别名
echo "USB connection for serial" # 用于串行USB连接
echo "Check them using the command : ls -l /dev|grep ttyUSB" # 使用命令检查它们:ls -l /dev|grep ttyUSB
echo "Start to copy udev rules to /etc/udev/rules.d/" # 开始复制udev规则到/etc/udev/rules.d/
sudo cp `rospack find roborts_bringup`/scripts/udev/roborts.rules /etc/udev/rules.d # 复制udev规则到/etc/udev/rules.d
echo " " # 输出空行
echo "Restarting udev" # 重新启动udev
echo "" # 输出空行
sudo service udev reload # 重新加载udev服务
sudo service udev restart # 重新启动udev服务
echo "Finish " # 完成
#!/bin/bash
echo " "
echo "Start to remove script files from /home/dji"
echo ""
rm /home/dji/roborts-start.sh
rm /home/dji/max_performance.sh
echo " "
echo "Start to remove service files from /lib/systemd/system/"
echo ""
sudo rm /lib/systemd/system/max-performance.service
sudo rm /lib/systemd/system/roborts.service
echo " "
echo "Disable max-performance and roborts service for upstart! "
echo ""
sudo systemctl disable max-performance.service
sudo systemctl disable roborts.service
echo "Finish"
# 以下是udev规则,用于设备重命名和设置权限
KERNEL=="ttyACM*", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE:="0777", SYMLINK+="serial_sdk"
# 当设备的内核名称匹配ttyACM*,且idVendor为0483,idProduct为5740时,设置权限为0777,并创建名为serial_sdk的符号链接
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
# 当设备的内核名称匹配ttyUSB*,且idVendor为10c4,idProduct为ea60时,设置权限为0777,并创建名为rplidar的符号链接
upstart详细注释:
某项服务对应的配置文件 控制、服务、安装
#!/bin/bash
echo " " # 输出空行
echo "Start to copy script files to /home/dji" # 开始复制脚本文件到/home/dji
echo "" # 输出空行
cp `rospack find roborts_bringup`/scripts/upstart/roborts-start.sh /home/dji # 复制roborts-start.sh脚本到/home/dji
cp `rospack find roborts_bringup`/scripts/upstart/max_performance.sh /home/dji # 复制max_performance.sh脚本到/home/dji
echo " " # 输出空行
echo "Start to copy service files to /lib/systemd/system/" # 开始复制服务文件到/lib/systemd/system/
echo "" # 输出空行
sudo cp `rospack find roborts_bringup`/scripts/upstart/max-performance.service /lib/systemd/system/ # 复制max-performance.service到/lib/systemd/system/
sudo cp `rospack find roborts_bringup`/scripts/upstart/roborts.service /lib/systemd/system/ # 复制roborts.service到/lib/systemd/system/
echo " " # 输出空行
echo "Enable max-performance and roborts service for upstart! " # 启用max-performance和roborts服务
echo "" # 输出空行
sudo systemctl enable max-performance.service # 启用max-performance服务
sudo systemctl enable roborts.service # 启用roborts服务
echo "Finish " # 完成
[Unit]
Description=Turn up performance # 说明:提升性能
After=multi-user.target # 在multi-user.target之后启动
[Service]
Type=oneshot # 服务类型为oneshot,即执行一次就退出
ExecStart=/bin/sh /home/dji/max_performance.sh # 执行max_performance.sh脚本
[Install]
WantedBy=multi-user.target # 在multi-user.target启动时启用该服务
#/usr/bash
sleep 10 # 等待10秒
echo dji | sudo -S sudo "/home/dji/jetson_clocks.sh" # 以sudo权限执行jetson_clocks.sh脚本
echo "Max performance" # 输出"最大性能"
# 禁用WiFi节能模式
echo dji | sudo -S sudo iw dev wlan0 set power_save off # 以sudo权限禁用wlan0设备的节能模式
echo "Set power_save off " # 输出"已禁用节能模式"
5)worlds *
方块模型3
# 定义方块模型
define block model
(
size [0.4 0.4 1.2] # 尺寸为[0.4 0.4 1.2]
ranger_return 1 # 障碍物返回值为1
)
# 定义前置摄像头
define frontcamera camera
(
size [ 0.050 0.050 0.0500 ] # 尺寸为[0.050 0.050 0.0500]
range [ 0.301 8.0 ] # 范围为[0.301 8.0]
resolution [ 640 480 ] # 分辨率为[640 480]
fov [ 120 40 ] # 视场角为[120 40]
pantilt [ 0 0 ] # 俯仰角和旋转角均为0
alwayson 1 # 始终开启
)
# 定义激光雷达
define rplidar ranger
(
sensor(
range_max 8.0 # 最大范围为8.0
fov 360 # 全方位视场
samples 360 # 采样点数为360
)
# 通用模型属性
color "black" # 颜色为黑色
size [ 0.050 0.050 0.100 ] # 尺寸为[ 0.050 0.050 0.100 ]
)
# 定义机器人位置
define rmcar position
(
size [0.6 0.45 0.460] # 尺寸为[0.6 0.45 0.460]
origin [0 0 0 0] # 原点坐标为[0 0 0 0]
gui_nose 1 # 显示鼻子
drive "omni" # 驱动方式为omni
rplidar(pose [ 0 0 0 0 ]) # 激光雷达位置为[ 0 0 0 0 ]
odom_error [0.03 0.03 0.00 0.05] # 里程计误差为[0.03 0.03 0.00 0.05]
velocity_bounds [-2 2 -2 2 -2 2 -90 90 ] # 速度范围
acceleration_bounds [-2 2 -2 2 -2 2 -90 90] # 加速度范围
ranger_return 1 # 障碍物返回值为1
)
# 定义地图模型
define floorplan model
(
# 颜色为灰色
color "gray30"
# 大多数地图将需要一个边界框
boundary 0
gui_nose 0 # 不显示鼻子
gui_grid 0 # 不显示网格
gui_outline 0 # 不显示轮廓
gripper_return 0 # 夹持器返回值为0
fiducial_return 0 # 参考标返回值为0
ranger_return 1 # 障碍物返回值为1
)
# 设置射线跟踪模型的分辨率为0.01米
resolution 0.01
# 模拟时间步长为50毫秒
interval_sim 50#83
interval_real 50#83
# 窗口设置
window
(
size [ 745.000 448.000 ] # 尺寸为[ 745.000 448.000 ]
rotate [ 0 0 ] # 旋转角度为[ 0 0 ]
scale 29 # 缩放为29
)
# 加载环境位图
floorplan
(
name "RoboMaster Map" # 名称为"RoboMaster Map"
bitmap "../maps/icra2018.pgm" # 位图路径为"../maps/icra2018.pgm"
size [8.35 5.5 1.000] # 尺寸为[8.35 5.5 1.000]
pose [4.175 2.775 0 0 ] # 姿态为[4.175 2.775 0 0 ]
)
# 添加一个机器人
rmcar(pose [ 1 1 0 0 ] name "rmcar0" color "blue" # 位置为[ 1 1 0 0 ],名称为"rmcar0",颜色为蓝色
)
# 添加一个用于测试的方块
block(pose [ 7.79 3.45 0 0.3 ] color "red" ) # 位置为[ 7.79 3.45 0 0.3 ],颜色为红色
roborts_camera
1)cmake_module
2)config
3)proto *
```protobuf
syntax = "proto2"; // 指定使用的协议版本为proto2
package roborts_camera; // 定义 roborts_camera 包
message CameraMatrix {
repeated double data = 1; // 定义重复的 double 类型数据
}
message CameraDistortion {
repeated double data = 1; // 定义重复的 double 类型数据
}
message Resolution {
required uint32 width = 1; // 定义必需的 uint32 类型宽度
required uint32 height = 2; // 定义必需的 uint32 类型高度
required uint32 width_offset = 3; // 定义必需的 uint32 类型宽度偏移量
required uint32 height_offset = 4; // 定义必需的 uint32 类型高度偏移量
}
message Camera {
required string camera_name = 1; // 定义必需的 string 类型相机名称
required string camera_type = 2; // 定义必需的 string 类型相机类型
required string camera_path = 3; // 定义必需的 string 类型相机路径
required CameraMatrix camera_matrix = 4; // 定义必需的相机矩阵消息
required CameraDistortion camera_distortion = 5; // 定义必需的相机畸变消息
optional uint32 fps = 6; // 定义可选的 uint32 类型帧率
optional Resolution resolution = 7; // 定义可选的分辨率消息
optional bool auto_exposure = 8; // 定义可选的 bool 类型自动曝光开关(1 为开,0 为关)
optional uint32 exposure_value = 9; // 定义可选的 uint32 类型曝光值
optional uint32 exposure_time = 10; // 定义可选的 uint32 类型曝光时间(单位为微秒)
optional bool auto_white_balance = 11; // 定义可选的 bool 类型自动白平衡开关(1 为开,0 为关)
optional bool auto_gain = 12; // 定义可选的 bool 类型自动增益开关(1 为开,0 为关)
optional uint32 contrast = 13; // 定义可选的 uint32 类型对比度
}
message Cameras {
repeated Camera camera = 1; // 定义重复的相机消息
}
4)test
5)uvc
roborts_common
1)cmake_module
2)include
3)math
roborts_costmap
1)cmake_module
2)config
3)include/costmap
4)proto
5)src
roborts_decision
1)behavior_tree
2)blackboard
3)cmake_module
4)config
5)example_behavior
6)executor
7)proto
roborts_detection
roborts_localization
roborts_msgs
roborts_planning
roborts_tracking
关键点
- RoboRTS是一种针对移动机器人实时战略研究的开源软件堆栈,由RoboMaster为RoboMaster AI挑战开发。
- RoboRTS的框架包括两部分:自主移动机器人层和智能决策层"4
- 。
- 自主移动机器人层包括感知、运动规划和决策模块,在ROS中得到全面支持,并具有社区驱动和平台定制的代码和示例。
- 智能决策层包括多智能体决策框架和游戏模拟器,将在未来发布。
- RoboMaster自2017年开始举办AI挑战赛,其中多个机器人在不同规则下自动在游戏场地上进行对战。RoboRTS采用GPL-v3许可提供。有关更多信息,请参阅RoboRTS教程和DJI RoboMaster AI挑战。
链接与注释
- 链接(全文参考):https://github.com/RoboMaster/RoboRTS
- 注释:
"元包"是指一个包含其他相关包的包。在这个例子中,标签中的指令表明这是一个元包,它包含了一系列其他的roborts相关的包。这样做的目的是为了方便用户安装和管理相关的软件包。 ↩︎
udev是Linux(linux2.6内核之后)默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件。 ↩︎
方块模型在机器人仿真环境中通常用于表示障碍物或其他物体。它可以用来模拟实际环境中的各种物体,比如墙壁、箱子、障碍物等。在机器人仿真中,方块模型可以被机器人感知和避开,从而进行路径规划和避障操作。方块模型的使用方法通常是在仿真环境的配置文件中定义其位置、尺寸、颜色等属性,然后在仿真中显示出来,供机器人进行感知和交互。目录标题) ↩︎
autonomous mobile robot layer and intelligent decision-making layer。自主移动机器人层负责处理机器人的移动、导航和环境感知等任务,而智能决策层则负责处理机器人的智能决策、路径规划和任务执行等高级功能。 ↩︎