RoboRTS相关代码详解和背景解释

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
  • 注释:

  1. "元包"是指一个包含其他相关包的包。在这个例子中,标签中的指令表明这是一个元包,它包含了一系列其他的roborts相关的包。这样做的目的是为了方便用户安装和管理相关的软件包。 ↩︎

  2. udev是Linux(linux2.6内核之后)默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件。 ↩︎

  3. 方块模型在机器人仿真环境中通常用于表示障碍物或其他物体。它可以用来模拟实际环境中的各种物体,比如墙壁、箱子、障碍物等。在机器人仿真中,方块模型可以被机器人感知和避开,从而进行路径规划和避障操作。方块模型的使用方法通常是在仿真环境的配置文件中定义其位置、尺寸、颜色等属性,然后在仿真中显示出来,供机器人进行感知和交互。目录标题) ↩︎

  4. autonomous mobile robot layer and intelligent decision-making layer。自主移动机器人层负责处理机器人的移动、导航和环境感知等任务,而智能决策层则负责处理机器人的智能决策、路径规划和任务执行等高级功能。 ↩︎

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值