人工智能(AI)已成為推動(dòng)科技革命和產(chǎn)業(yè)變革的關(guān)鍵力量。隨著大模型等AIGC技術(shù)的迅猛發(fā)展,AI正深刻改變我們的生活并重新定義生產(chǎn)方式。越來越多人期望將AI技術(shù)從純粹的思維和計(jì)算擴(kuò)展到與物理世界的互動(dòng)中,即發(fā)展具身智能。
為了推廣并深化具身智能的創(chuàng)新和應(yīng)用,“???a target="_blank">機(jī)器人開發(fā)者大賽——AI ROBOT創(chuàng)新挑戰(zhàn)賽”應(yīng)用而生,大賽旨在激發(fā)全國高校學(xué)生的研究熱情,探索AI與機(jī)器人技術(shù)的融合,展示尖端技術(shù)成果。
這一平臺不僅可以促進(jìn)技術(shù)交流和學(xué)習(xí),更可以通過競賽提高中國大學(xué)生的科技實(shí)踐能力,推動(dòng)教育與產(chǎn)業(yè)的深度融合,為機(jī)器人產(chǎn)業(yè)注入新活力。
本屆睿抗機(jī)器人開發(fā)者大賽,特選用大象機(jī)器人公司的輪式人形機(jī)器人作為官方賽具。
這款機(jī)器人以其創(chuàng)新的設(shè)計(jì)和卓越的性能,在全球范圍內(nèi)獲得了廣泛關(guān)注和認(rèn)可。其輪式移動(dòng)底盤結(jié)合雙臂協(xié)作機(jī)械臂,賦予了其卓越的靈活性和運(yùn)動(dòng)能力,使其能夠完成各種復(fù)雜的動(dòng)作和任務(wù)。
通過本次大賽,參賽者有機(jī)會深入了解和應(yīng)用機(jī)器人動(dòng)作控制、視覺處理、大語言模型以及人機(jī)交互等前沿技術(shù),這不僅能夠提升他們的技術(shù)能力,也將推動(dòng)機(jī)器人技術(shù)的創(chuàng)新發(fā)展。
技術(shù)亮點(diǎn)
AI ROBOT
智能機(jī)器人雙臂協(xié)同操作
大模型賦能機(jī)器人實(shí)現(xiàn)人類語言指令識別和理解
基于GPU的高階渲染引擎,支持高保真傳感器數(shù)據(jù)輸出的物理仿真,實(shí)現(xiàn)機(jī)器人快速開發(fā)
快速生成合成數(shù)據(jù)降低數(shù)據(jù)采集難度
競賽任務(wù)
AI ROBOT
任務(wù)1:機(jī)器人運(yùn)動(dòng)控制
選手需要通過發(fā)布運(yùn)動(dòng)指令或運(yùn)行控制代碼實(shí)現(xiàn)對機(jī)器人的簡單運(yùn)動(dòng)控制。
Isaac Sim 是由 NVIDIA 開發(fā)的一個(gè)機(jī)器人模擬平臺,主要用于機(jī)器人仿真和人工智能的訓(xùn)練。選手需要使用現(xiàn)場提供的模型文件進(jìn)行機(jī)器人仿真。
任務(wù)3:Replicator合成數(shù)據(jù)生成
選手需要使用平臺提供的待抓取數(shù)字資產(chǎn)文件在Isaac Sim中應(yīng)用Replicator生成合成數(shù)據(jù)。
任務(wù)4:地圖構(gòu)建
選手需要在比賽現(xiàn)場環(huán)境中控制機(jī)器人運(yùn)動(dòng)采集數(shù)據(jù)、構(gòu)建地圖
任務(wù)5:模型訓(xùn)練
選手需要在TAO中利用Replicator生成的數(shù)據(jù)集進(jìn)行模型訓(xùn)練
任務(wù)6:場景實(shí)現(xiàn)
選手需要與機(jī)器人通過語音交互、多輪對話,進(jìn)行點(diǎn)餐,點(diǎn)餐完成后機(jī)器人前往茶水區(qū)執(zhí)行對應(yīng)任務(wù),任務(wù)完成后,機(jī)器人把餐食送到辦公區(qū)指定區(qū)域。
核心技術(shù)解析
AI ROBOT
對象檢測與追蹤
應(yīng)用場景:該部分主要使用了NVIDIA的TAO Toolkit進(jìn)行對象檢測模型的訓(xùn)練、評估、剪枝和重訓(xùn)練。示范了如何使用預(yù)訓(xùn)練的ResNet-18模型對KITTI數(shù)據(jù)集進(jìn)行訓(xùn)練和評估。
核心技術(shù):包括深度學(xué)習(xí)模型訓(xùn)練、模型剪枝以提高效率、以及使用ONNX格式導(dǎo)出模型以便在不同平臺上部署。
Run TAO training
!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
!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???????
!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???????
!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???????
!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???????
!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???????
!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
機(jī)械臂控制
應(yīng)用場景:該部分主要控制機(jī)械臂,從定位物體、抓取到物體的搬運(yùn)。包括機(jī)械臂的坐標(biāo)轉(zhuǎn)換、夾爪的控制和關(guān)節(jié)角度的調(diào)整。
核心技術(shù):通過Python代碼控制機(jī)械臂的動(dòng)作,使用轉(zhuǎn)換函數(shù)處理機(jī)器視覺系統(tǒng)與機(jī)械臂之間的坐標(biāo)轉(zhuǎn)換,以及實(shí)時(shí)反饋控制機(jī)械臂的精確位置。???????
# 初始化一個(gè)MyCobot對象 mc = MyCobot(PI_PORT, PI_BAUD) # 相機(jī)坐標(biāo)(x,y,z)轉(zhuǎn)換為機(jī)械臂目標(biāo)點(diǎn) cup_target = transform_point(cup_x,cup_y,cup_z) # 打開夾爪 mc.set_gripper_state(0, 70) time.sleep(2) # 機(jī)械臂頭部到達(dá)目標(biāo)點(diǎn) mc.send_coords(cup_target, 30, 1) time.sleep(1) # 控制機(jī)械臂上抬避免打到物體 angle_datas = mc.get_angles() print('angle_datas:',angle_datas) mc.send_angle(Angle.J2.value,angle_datas[1]-5,20) time.sleep(2) # 機(jī)械臂頭部再次到達(dá)目標(biāo)點(diǎn) mc.send_coords(cup_target, 30, 1) time.sleep(3) # 抓取 mc.set_gripper_state(1, 70) time.sleep(3) # 控制關(guān)節(jié)2運(yùn)動(dòng),將物品拿起 angle_datas = mc.get_angles() mc.send_angle(Angle.J2.value,angle_datas[1]-23,20) time.sleep(2)
應(yīng)用場景:該部分是語音識別流程,從錄音、保存音頻文件到使用語音識別庫(如SpeechRecognition)進(jìn)行語音到文本的轉(zhuǎn)換。
核心技術(shù):使用PyAudio進(jìn)行音頻的捕捉和處理,利用SpeechRecognition庫進(jìn)行本地語音識別。???????
#語音錄制 def record(): p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("請點(diǎn)單...") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("點(diǎn)單結(jié)束") 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')
自動(dòng)導(dǎo)航
該部分主要實(shí)現(xiàn)了一個(gè)基于ROS(機(jī)器人操作系統(tǒng))的自動(dòng)導(dǎo)航系統(tǒng),用于指導(dǎo)機(jī)器人在預(yù)設(shè)環(huán)境地圖中自主移動(dòng)到指定位置。以下是該代碼實(shí)現(xiàn)的技術(shù)和場景概括:
初始化和配置:代碼中首先初始化了一個(gè)名為map_navigation的ROS節(jié)點(diǎn),這是進(jìn)行任何ROS通信前的必要步驟。
設(shè)置了三個(gè)發(fā)布器,分別用于發(fā)送速度指令(/cmd_vel)、設(shè)置初始位置(/initialpose)和取消導(dǎo)航目標(biāo)(/move_base/cancel)。
導(dǎo)航到目標(biāo)點(diǎn):通過定義moveToGoal函數(shù),代碼實(shí)現(xiàn)了機(jī)器人到達(dá)特定目標(biāo)位置的功能。這涉及到與move_base動(dòng)作服務(wù)器的交互,該服務(wù)器負(fù)責(zé)處理路徑規(guī)劃和導(dǎo)航。
動(dòng)作客戶端通過發(fā)送一個(gè)包含目標(biāo)位置和姿態(tài)的MoveBaseGoal到move_base服務(wù)器,從而指示機(jī)器人移動(dòng)到指定位置。
目標(biāo)位置的設(shè)定和導(dǎo)航執(zhí)行:目標(biāo)位置和姿態(tài)通過參數(shù)(xGoal, yGoal, orientation_z, orientation_w)傳遞給moveToGoal函數(shù)。
機(jī)器人在收到目標(biāo)位置后,動(dòng)作客戶端等待結(jié)果,判斷是否成功到達(dá)目標(biāo)。
結(jié)果處理:根據(jù)動(dòng)作客戶端返回的狀態(tài),判斷機(jī)器人是否成功到達(dá)目標(biāo)位置,并進(jìn)行相應(yīng)的日志記錄和反饋。???????
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 節(jié)點(diǎn) self.pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) # 發(fā)布速度指令的發(fā)布器 self.pub_setpose = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=10) # 發(fā)布設(shè)置初始姿態(tài)的發(fā)布器 self.pub_cancel = rospy.Publisher('/move_base/cancel', GoalID, queue_size=10) # 發(fā)布取消目標(biāo)的發(fā)布器 # move_base def moveToGoal(self, xGoal, yGoal, orientation_z, orientation_w): # 移動(dòng)到目標(biāo)點(diǎn) ac = actionlib.SimpleActionClient("move_base", MoveBaseAction) # 創(chuàng)建動(dòng)作客戶端 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) # 發(fā)送目標(biāo)位置 ac.wait_for_result(rospy.Duration(600)) # 設(shè)置超時(shí)時(shí)間 if (ac.get_state() == GoalStatus.SUCCEEDED): # 判斷是否成功到達(dá)目標(biāo) rospy.loginfo("You have reached the destination") return True else: rospy.loginfo("The robot failed to reach the destination") return False map_navigation = MapNavigation() # 初始化導(dǎo)航 x_goal, y_goal, orientation_z, orientation_w = (0.0598191, -1.81509, 0.999547, 0.024365) # 設(shè)置需要導(dǎo)航到達(dá)的點(diǎn)位 flag_feed_goalReached = map_navigation.moveToGoal(x_goal, y_goal, orientation_z, orientation_w) # 開始導(dǎo)航,并返回是否到達(dá)目標(biāo)點(diǎn)位 if flag_feed_goalReached: print("command completed") # 成功到達(dá)目標(biāo)定位
二維碼識別抓取
這份代碼主要展示了如何使用Python控制大象機(jī)器人的Mercury系列機(jī)械臂進(jìn)行二維碼識別和基于位置的物體操作。以下是該代碼實(shí)現(xiàn)的技術(shù)和場景概括:
硬件設(shè)置與初始化:代碼首先初始化Mercury機(jī)械臂,設(shè)置其與計(jì)算機(jī)的通訊端口。
同時(shí)設(shè)置和配置UVC相機(jī),加載相機(jī)的校準(zhǔn)參數(shù)(內(nèi)參和畸變系數(shù)),這些參數(shù)用于后續(xù)圖像處理和位置計(jì)算。
圖像捕捉與二維碼識別:使用UVC相機(jī)捕捉實(shí)時(shí)圖像幀。
應(yīng)用stag.detectMarkers方法識別圖像中的二維碼并獲取其角點(diǎn)信息,這是二維碼位置識別的關(guān)鍵步驟。
二維碼位置計(jì)算與機(jī)械臂定位:根據(jù)捕獲的二維碼角點(diǎn)及相機(jī)校準(zhǔn)參數(shù),計(jì)算二維碼相對于相機(jī)的空間坐標(biāo)。
通過手眼標(biāo)定技術(shù)(Eyes_in_hand_right方法),將二維碼的相對坐標(biāo)轉(zhuǎn)換為機(jī)械臂基座坐標(biāo)系中的位置。
控制機(jī)械臂移動(dòng)到計(jì)算出的二維碼位置。
交互執(zhí)行:機(jī)械臂移動(dòng)到二維碼所在位置后,通過控制夾爪的開閉來實(shí)現(xiàn)物體的抓取操作。
from pymycobot import Mercury from uvc_camera import UVCCamera import stag import numpy as np # 導(dǎo)入需要的庫 mr = Mercury("/dev/ttyACM2") # 設(shè)置右臂端口號 mr.send_angles([92.78, -3.19, 0.0, -135.63, -112.56, 70.86, -49.26], 30) # 將機(jī)械臂移至二維碼區(qū)域 camera_params = np.load("src/camera_params.npz") # 讀取相機(jī)配置文件 mtx, dist = camera_params["mtx"], camera_params["dist"] # 獲取相機(jī)內(nèi)參和畸變系數(shù) camera = UVCCamera(4, mtx, dist) # 設(shè)置相機(jī)id camera.update_frame() # 更新圖像幀 frame = camera.color_frame() # 獲取彩色圖像幀數(shù)據(jù) (corners, ids, rejected_corners) = stag.detectMarkers(frame, 11) # 根據(jù)圖像,獲取二維碼角點(diǎn) marker_pos_pack = calc_markers_base_position(corners, ids, 32, mtx, dist) # 根據(jù)角點(diǎn)和相機(jī)內(nèi)參、畸變系數(shù),獲取二維碼相對于相機(jī)的坐標(biāo) cur_coords = np.array(mr.get_base_coords()) # 獲取機(jī)械臂末端坐標(biāo) cur_bcl = cur_coords.copy() cur_bcl[-3:] *= (np.pi / 180) # 將機(jī)械臂末端旋轉(zhuǎn)角度轉(zhuǎn)為弧度 right_fact_bcl = Eyes_in_hand_right(cur_bcl, marker_pos_pack) # 通過手眼標(biāo)定獲取二維碼相對于基體的坐標(biāo) 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) # 控制機(jī)械臂移動(dòng)至二維碼處 mr.set_gripper_value(0, 100) # 閉合夾爪,抓取物品
報(bào)名參賽
AI ROBOT
報(bào)名地址
https://www.raicom.com.cn
注:進(jìn)入網(wǎng)站,成功注冊之后在“賽事報(bào)名”中找到“AI ROBOT創(chuàng)新挑戰(zhàn)賽”項(xiàng)目進(jìn)行報(bào)名。
參賽對象
本科組:全日制高校在讀學(xué)生(本科、研究生)
高職組:全日制高校在讀學(xué)生(高職)
參賽要求
1) 本賽項(xiàng)為團(tuán)體賽,以院校為單位組隊(duì)參賽,本科組、高組須為高校在籍學(xué)生和在職老師,不得跨校組隊(duì)。
2) 每個(gè)賽隊(duì)由2-3名參賽學(xué)生(設(shè)隊(duì)長1名)和1-2名指導(dǎo)老師。
3)比賽過程中,參賽者需要在規(guī)定的時(shí)間內(nèi)完成所選賽項(xiàng)的任務(wù)。這些任務(wù)可能包括機(jī)器人的設(shè)計(jì)、編程、調(diào)試以及實(shí)際運(yùn)行等。
參賽時(shí)間(省賽選拔賽)
報(bào)名截止時(shí)間:2024年5月30日(最晚截止時(shí)間)
區(qū)域賽選拔時(shí)間:2024年7月10日— 7月20日
晉級公示:2024年7月25日(公示時(shí)間不少于 5 個(gè)工作日)
注:各區(qū)域賽比賽時(shí)間和地點(diǎn)等安排以區(qū)域賽通知為準(zhǔn)。
隨著科技的不斷進(jìn)步,我們相信通過此類競賽的平臺,能夠有效促進(jìn)科技與教育的深度融合,激發(fā)更多青年才俊在人工智能和機(jī)器人領(lǐng)域的探索熱情。
我們期待看到來自各地的優(yōu)秀參賽者在本屆大賽中展示出色的技術(shù)創(chuàng)新和解決方案,共同推動(dòng)全球機(jī)器人技術(shù)向更高水平發(fā)展。讓我們攜手前行,共創(chuàng)智能科技的美好未來。
審核編輯 黃宇
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28379瀏覽量
206908 -
AI
+關(guān)注
關(guān)注
87文章
30728瀏覽量
268874 -
人工智能
+關(guān)注
關(guān)注
1791文章
47183瀏覽量
238209 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84626 -
機(jī)械臂
+關(guān)注
關(guān)注
12文章
513瀏覽量
24552
發(fā)布評論請先 登錄
相關(guān)推薦
評論