人工智能(AI)已成为推动科技革命和产业变革的关键力量。随着大模型等AIGC技术的迅猛发展,AI正深刻改变我们的生活并重新定义生产方式。越来越多人期望将AI技术从纯粹的思维和计算扩展到与物理世界的互动中,即发展具身智能。
为了推广并深化具身智能的创新和应用,"睿抗机器人开发者大赛------AI ROBOT创新挑战赛"应用而生,大赛旨在激发全国高校学生的研究热情,探索AI与机器人技术的融合,展示尖端技术成果。
这一平台不仅可以促进技术交流和学习,更可以通过竞赛提高中国大学生的科技实践能力,推动教育与产业的深度融合,为机器人产业注入新活力。
本届睿抗机器人开发者大赛,特选用大象机器人公司的轮式人形机器人作为官方赛具。
这款机器人以其创新的设计和卓越的性能,在全球范围内获得了广泛关注和认可。其轮式移动底盘结合双臂协作机械臂,赋予了其卓越的灵活性和运动能力,使其能够完成各种复杂的动作和任务。
通过本次大赛,参赛者有机会深入了解和应用机器人动作控制、视觉处理、大语言模型以及人机交互等前沿技术,这不仅能够提升他们的技术能力,也将推动机器人技术的创新发展。
技术亮点
AI ROBOT
-
智能机器人双臂协同操作
-
大模型赋能机器人实现人类语言指令识别和理解
-
基于GPU的高阶渲染引擎,支持高保真传感器数据输出的物理仿真,实现机器人快速开发
-
快速生成合成数据降低数据采集难度
竞赛任务
AI ROBOT
- 任务1:机器人运动控制
选手需要通过发布运动指令或运行控制代码实现对机器人的简单运动控制。
- 任务2:Isaac Sim仿真
Isaac Sim 是由 NVIDIA 开发的一个机器人模拟平台,主要用于机器人仿真和人工智能的训练。选手需要使用现场提供的模型文件进行机器人仿真。
- 任务3:Replicator合成数据生成
选手需要使用平台提供的待抓取数字资产文件在Isaac Sim中应用Replicator生成合成数据。
- 任务4:地图构建
选手需要在比赛现场环境中控制机器人运动采集数据、构建地图
- 任务5:模型训练
选手需要在TAO中利用Replicator生成的数据集进行模型训练
- 任务6:场景实现
选手需要与机器人通过语音交互、多轮对话,进行点餐,点餐完成后机器人前往茶水区执行对应任务,任务完成后,机器人把餐食送到办公区指定区域。
核心技术解析
AI ROBOT
- 对象检测与追踪
**应用场景:**该部分主要使用了NVIDIA的TAO Toolkit进行对象检测模型的训练、评估、剪枝和重训练。示范了如何使用预训练的ResNet-18模型对KITTI数据集进行训练和评估。
**核心技术:**包括深度学习模型训练、模型剪枝以提高效率、以及使用ONNX格式导出模型以便在不同平台上部署。
Run TAO training
python
!tao model ssd train --gpus 1 --gpu_index $GPU_INDEX \
-e $SPECS_DIR/ssd_train_resnet18_kitti.txt \
-r $USER_EXPERIMENT_DIR/experiment_dir_unpruned \
-m $USER_EXPERIMENT_DIR/pretrained_resnet18/pretrained_object_detection_vresnet18/resnet_18.hdf5
Evaluate trained models
python
!tao model ssd evaluate --gpu_index $GPU_INDEX \
-e $SPECS_DIR/ssd_train_resnet18_kitti.txt \
-m $USER_EXPERIMENT_DIR/experiment_dir_unpruned/weights/ssd_resnet18_epoch_$EPOCH.hdf5
Prune trained models
python
!tao model ssd prune --gpu_index $GPU_INDEX \
-m $USER_EXPERIMENT_DIR/experiment_dir_unpruned/weights/ssd_resnet18_epoch_$EPOCH.hdf5 \
-o $USER_EXPERIMENT_DIR/experiment_dir_pruned/ssd_resnet18_pruned.hdf5 \
-eq intersection \
-pth 0.1
Retrain pruned models
python
!tao model ssd train --gpus 1 --gpu_index $GPU_INDEX \
-e $SPECS_DIR/ssd_retrain_resnet18_kitti.txt \
-r $USER_EXPERIMENT_DIR/experiment_dir_retrain \
-m $USER_EXPERIMENT_DIR/experiment_dir_pruned/ssd_resnet18_pruned.hdf5
Evaluate retrained model
python
!tao model ssd evaluate --gpu_index $GPU_INDEX \
-e $SPECS_DIR/ssd_retrain_resnet18_kitti.txt \
-m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/ssd_resnet18_epoch_$EPOCH.hdf5
Visualize inferences
python
!tao model ssd inference --gpu_index $GPU_INDEX -i $DATA_DOWNLOAD_DIR/test_samples \
-e $SPECS_DIR/ssd_retrain_resnet18_kitti.txt \
-m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/ssd_resnet18_epoch_$EPOCH.hdf5 \
-r $USER_EXPERIMENT_DIR/
Model Export
python
!tao model ssd export --gpu_index $GPU_INDEX \
-m $USER_EXPERIMENT_DIR/experiment_dir_retrain/weights/ssd_resnet18_epoch_$EPOCH.hdf5 \
-o $USER_EXPERIMENT_DIR/export/ssd_resnet18_epoch_$EPOCH.onnx \
-e $SPECS_DIR/ssd_retrain_resnet18_kitti.txt \
--batch_size 16 \
--gen_ds_config
- 机械臂控制
**应用场景:**该部分主要控制机械臂,从定位物体、抓取到物体的搬运。包括机械臂的坐标转换、夹爪的控制和关节角度的调整。
**核心技术:**通过Python代码控制机械臂的动作,使用转换函数处理机器视觉系统与机械臂之间的坐标转换,以及实时反馈控制机械臂的精确位置。
python
# 初始化一个MyCobot对象
mc = MyCobot(PI_PORT, PI_BAUD)
# 相机坐标(x,y,z)转换为机械臂目标点
cup_target = transform_point(cup_x,cup_y,cup_z)
# 打开夹爪
mc.set_gripper_state(0, 70)
time.sleep(2)
# 机械臂头部到达目标点
mc.send_coords(cup_target, 30, 1)
time.sleep(1)
# 控制机械臂上抬避免打到物体
angle_datas = mc.get_angles()
print('angle_datas:',angle_datas)
mc.send_angle(Angle.J2.value,angle_datas[1]-5,20)
time.sleep(2)
# 机械臂头部再次到达目标点
mc.send_coords(cup_target, 30, 1)
time.sleep(3)
# 抓取
mc.set_gripper_state(1, 70)
time.sleep(3)
# 控制关节2运动,将物品拿起
angle_datas = mc.get_angles()
mc.send_angle(Angle.J2.value,angle_datas[1]-23,20)
time.sleep(2)
- 语音识别
**应用场景:**该部分是语音识别流程,从录音、保存音频文件到使用语音识别库(如SpeechRecognition)进行语音到文本的转换。
**核心技术:**使用PyAudio进行音频的捕捉和处理,利用SpeechRecognition库进行本地语音识别。
python
#语音录制
def record():
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("请点单...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("点单结束")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
#语音识别
def detect_voice():
r = sr.Recognizer()
test = sr.AudioFile(WAVE_OUTPUT_FILENAME)
with test as source:
audio = r.record(source)
return r.recognize_sphinx(audio, language='zh-cn')
- 自动导航
该部分主要实现了一个基于ROS(机器人操作系统)的自动导航系统,用于指导机器人在预设环境地图中自主移动到指定位置。以下是该代码实现的技术和场景概括:
**初始化和配置:**代码中首先初始化了一个名为map_navigation的ROS节点,这是进行任何ROS通信前的必要步骤。
设置了三个发布器,分别用于发送速度指令(/cmd_vel)、设置初始位置(/initialpose)和取消导航目标(/move_base/cancel)。
**导航到目标点:**通过定义moveToGoal函数,代码实现了机器人到达特定目标位置的功能。这涉及到与move_base动作服务器的交互,该服务器负责处理路径规划和导航。
动作客户端通过发送一个包含目标位置和姿态的MoveBaseGoal到move_base服务器,从而指示机器人移动到指定位置。
**目标位置的设定和导航执行:**目标位置和姿态通过参数(xGoal, yGoal, orientation_z, orientation_w)传递给moveToGoal函数。
机器人在收到目标位置后,动作客户端等待结果,判断是否成功到达目标。
**结果处理:**根据动作客户端返回的状态,判断机器人是否成功到达目标位置,并进行相应的日志记录和反馈。
python
import rospy
import actionlib
import sys
from geometry_msgs.msg import PoseWithCovarianceStamped
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from actionlib_msgs.msg import *
from actionlib_msgs.msg import GoalID
from geometry_msgs.msg import Point
from geometry_msgs.msg import Twist
class MapNavigation:
def __init__(self):
self.goalReached = None
rospy.init_node('map_navigation', anonymous=False) # 初始化 ROS 节点
self.pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) # 发布速度指令的发布器
self.pub_setpose = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=10) # 发布设置初始姿态的发布器
self.pub_cancel = rospy.Publisher('/move_base/cancel', GoalID, queue_size=10) # 发布取消目标的发布器
# move_base
def moveToGoal(self, xGoal, yGoal, orientation_z, orientation_w): # 移动到目标点
ac = actionlib.SimpleActionClient("move_base", MoveBaseAction) # 创建动作客户端
while (not ac.wait_for_server(rospy.Duration.from_sec(5.0))):
sys.exit(0)
goal = MoveBaseGoal()
goal.target_pose.header.frame_id = "map"
goal.target_pose.header.stamp = rospy.Time.now()
goal.target_pose.pose.position = Point(xGoal, yGoal, 0)
goal.target_pose.pose.orientation.x = 0.0
goal.target_pose.pose.orientation.y = 0.0
goal.target_pose.pose.orientation.z = orientation_z
goal.target_pose.pose.orientation.w = orientation_w
rospy.loginfo("Sending goal location ...")
ac.send_goal(goal) # 发送目标位置
ac.wait_for_result(rospy.Duration(600)) # 设置超时时间
if (ac.get_state() == GoalStatus.SUCCEEDED): # 判断是否成功到达目标
rospy.loginfo("You have reached the destination")
return True
else:
rospy.loginfo("The robot failed to reach the destination")
return False
map_navigation = MapNavigation() # 初始化导航
x_goal, y_goal, orientation_z, orientation_w = (0.0598191, -1.81509, 0.999547, 0.024365) # 设置需要导航到达的点位
flag_feed_goalReached = map_navigation.moveToGoal(x_goal, y_goal, orientation_z, orientation_w) # 开始导航,并返回是否到达目标点位
if flag_feed_goalReached:
print("command completed") # 成功到达目标定位
- 二维码识别抓取
这份代码主要展示了如何使用Python控制大象机器人的Mercury系列机械臂进行二维码识别和基于位置的物体操作。以下是该代码实现的技术和场景概括:
**硬件设置与初始化:**代码首先初始化Mercury机械臂,设置其与计算机的通讯端口。
同时设置和配置UVC相机,加载相机的校准参数(内参和畸变系数),这些参数用于后续图像处理和位置计算。
**图像捕捉与二维码识别:**使用UVC相机捕捉实时图像帧。
应用stag.detectMarkers方法识别图像中的二维码并获取其角点信息,这是二维码位置识别的关键步骤。
**二维码位置计算与机械臂定位:**根据捕获的二维码角点及相机校准参数,计算二维码相对于相机的空间坐标。
通过手眼标定技术(Eyes_in_hand_right方法),将二维码的相对坐标转换为机械臂基座坐标系中的位置。
控制机械臂移动到计算出的二维码位置。
**交互执行:**机械臂移动到二维码所在位置后,通过控制夹爪的开闭来实现物体的抓取操作。
python
from pymycobot import Mercury
from uvc_camera import UVCCamera
import stag
import numpy as np # 导入需要的库
mr = Mercury("/dev/ttyACM2") # 设置右臂端口号
mr.send_angles([92.78, -3.19, 0.0, -135.63, -112.56, 70.86, -49.26], 30) # 将机械臂移至二维码区域
camera_params = np.load("src/camera_params.npz") # 读取相机配置文件
mtx, dist = camera_params["mtx"], camera_params["dist"] # 获取相机内参和畸变系数
camera = UVCCamera(4, mtx, dist) # 设置相机id
camera.update_frame() # 更新图像帧
frame = camera.color_frame() # 获取彩色图像帧数据
(corners, ids, rejected_corners) = stag.detectMarkers(frame, 11) # 根据图像,获取二维码角点
marker_pos_pack = calc_markers_base_position(corners, ids, 32, mtx,
dist) # 根据角点和相机内参、畸变系数,获取二维码相对于相机的坐标
cur_coords = np.array(mr.get_base_coords()) # 获取机械臂末端坐标
cur_bcl = cur_coords.copy()
cur_bcl[-3:] *= (np.pi / 180) # 将机械臂末端旋转角度转为弧度
right_fact_bcl = Eyes_in_hand_right(cur_bcl, marker_pos_pack) # 通过手眼标定获取二维码相对于基体的坐标
right_target_coords = cur_coords.copy()
right_target_coords[0] = right_fact_bcl[0]
right_target_coords[1] = right_fact_bcl[1]
right_target_coords[2] = right_fact_bcl[2]
mr.send_base_coords(right_target_coords, 30) # 控制机械臂移动至二维码处
mr.set_gripper_value(0, 100) # 闭合夹爪,抓取物品
报名参赛
AI ROBOT
- 报名地址
注:进入网站,成功注册之后在"赛事报名"中找到"AI ROBOT创新挑战赛"项目进行报名。
- 参赛对象
本科组:全日制高校在读学生(本科、研究生)
高职组:全日制高校在读学生(高职)
- 参赛要求
-
本赛项为团体赛,以院校为单位组队参赛,本科组、高组须为高校在籍学生和在职老师,不得跨校组队。
-
每个赛队由2-3名参赛学生(设队长1名)和1-2名指导老师。
3)比赛过程中,参赛者需要在规定的时间内完成所选赛项的任务。这些任务可能包括机器人的设计、编程、调试以及实际运行等。
- 参赛时间(省赛选拔赛)
报名截止时间:2024年5月30日(最晚截止时间)
区域赛选拔时间:2024年7月10日--- 7月20日
晋级公示:2024年7月25日(公示时间不少于 5 个工作日)
注:各区域赛比赛时间和地点等安排以区域赛通知为准。
- 咨询方式
随着科技的不断进步,我们相信通过此类竞赛的平台,能够有效促进科技与教育的深度融合,激发更多青年才俊在人工智能和机器人领域的探索热情。
我们期待看到来自各地的优秀参赛者在本届大赛中展示出色的技术创新和解决方案,共同推动全球机器人技术向更高水平发展。让我们携手前行,共创智能科技的美好未来。