資料介紹
描述
這個開源平臺為 DIY 開發(fā)者、學生和愛好者提供了創(chuàng)建各種基于 AI 的應(yīng)用程序所需的一切。JetBot 套件以小型但功能強大的 NVIDIA Jetson Nano 計算機為基礎(chǔ)工作,該計算機提供多個傳感器和神經(jīng)網(wǎng)絡(luò)的并行操作,用于對象識別、避免碰撞和其他任務(wù)。原始 NVIDIA JetBot AI 機器人的所有組裝文件和完整組件列表可在 GitHub ( https://github.com/NVIDIA-AI-IOT/jetbot ) 上獲得。
可以從第三方制造商處購買現(xiàn)成的套裝。這些套件以各種配置呈現(xiàn),使您能夠創(chuàng)建絕對獨特的解決方案。我有一套 Waveshare 提供的。Waveshare 的 JetBot 配備了高品質(zhì)的底盤、前置攝像頭和所有必要的工具,可確保快速輕松地組裝。
?
?
?
不幸的是,我們不得不改變平臺,原來的平臺是不穩(wěn)定和弱引擎
我將它安裝在另一個平臺上——來自拆解的 iRobot Create 吸塵器。
考慮在 jetbot 上安裝用于管理和導航的 ROS 包。
機器人操作系統(tǒng)(ROS)是用于開發(fā)機器人軟件的靈活平臺(框架)。這是一組各種工具、庫和一定的規(guī)則,其目的是簡化開發(fā)機器人軟件的任務(wù)。
我們使用 64 GB 的 SD 卡來記錄 NVIDIA JetPack 圖像。NVIDIA JetPack 映像基于 Ubuntu 18.04 操作系統(tǒng)。我們將安裝 ROS Melodic 版本(http://wiki.ros.org/melodic )。
# 添加所有 Ubuntu 存儲庫:
sudo apt-add-repository universe
sudo apt-add-repository multiverse
sudo apt-add-repository restricted
# 添加ROS倉庫
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# 安裝 ROS 基礎(chǔ)
sudo apt-get update
sudo apt-get install ros-melodic-ros-base
# 添加ROS路徑
sudo sh -c ' echo "source /opt/ros/melodic/setup.bash" >> ~ / .bashrc '
我們將安裝 Adafruit 庫以支持 TB6612/PCA9685 引擎驅(qū)動程序和 SSD1306 調(diào)試 OLED 顯示器:
# 安裝點子
sudo apt-get install python-pip
# 安裝 Adafruit 庫
pip install Adafruit-MotorHAT
pip install Adafruit-SSD1306
我們將為用戶提供對 i2c 總線的訪問權(quán)限:
sudo usermod -aG i2c $USER
我們將重新啟動系統(tǒng)以使更改生效。
創(chuàng)建一個 ROS Catkin 工作區(qū)來存儲 ROS 包:
# 創(chuàng)建工作區(qū) catkin mkdir -p ~/workspace/catkin_ws/src
cd ~/workspace/catkin_ws
catkin_make
# add the catkin_ws path to bashrc sudo sh -c ' echo "source ~/workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc'
我們關(guān)閉并重新打開一個新的終端窗口以確保 catkin_ws 對 ROS 可見:
echo $ROS_PACKAGE_PATH
我們克隆并構(gòu)建了 jetson-inference 包。該軟件包使用 NVIDIA TensorRT 在內(nèi)置 Jetson 平臺上高效部署神經(jīng)網(wǎng)絡(luò)。
# 安裝 git 和 cmake
sudo apt-get install git cmake
# 克隆存儲庫和 cd 子模塊 ~/workspace
git clone https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init
# 從源代碼構(gòu)建
mkdir build
cd build
cmake ../
make
# 安裝庫
sudo make install
克隆和構(gòu)建 ROS 包 ros_deep_learning
# 安裝依賴
sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher
# 克隆 cd 存儲庫 ~/workspace/catkin_ws/src
git clone https://github.com/dusty-nv/ros_deep_learning
# 構(gòu)建catkin
cd ~/workspace/catkin_ws
catkin_make
# 檢查ROS是否找到了包,包是ros_deep_learning
rospack find ros_deep_learning
克隆和構(gòu)建 jetbot_ros ROS 包
# 克隆存儲庫
cd ~/workspace/catkin_ws/src
git clone https://github.com/dusty-nv/jetbot_ros
# 構(gòu)建包
cd ~/workspace/catkin_ws
catkin_make
# 檢查 ROS 是否找到了 jetbot_ros 包的包
$ rospack find jetbot_ros
測試 ros_jetbot
打開終端并啟動
roscore
在第二個終端中,我們啟動 jetbot_motors 節(jié)點
rosrun jetbot_ros jetbot_motors.py
然后問題是導入錯誤:沒有名為 Adafruit_MotorHAT 的模塊,盡管該庫已經(jīng)安裝(見上文)。
但是該庫是安裝在python3中的,而ROS使用的是python2。7
為 python2 安裝 Adafruit_MotorHAT 庫。7
python2. 7-m pip install Adafruit_MotorHAT
現(xiàn)在啟動正常,在下一個終端中我們檢查相應(yīng)的節(jié)點和主題是否在 ROS 中運行
這是主題列表
- /jetbot_motors/cmd_dir - 相對航向(度數(shù) [-180.0, 180.0],速度 [-1.0, 1.0])
- /jetbot_motors/cmd_raw - 原始 L/R 電機命令(速度 [-1.0, 1.0],速度 [-1.0, 1.0])
- /jetbot_motors/cmd_str - 簡單的字符串命令(左/右/前進/后退/停止)
但是,不幸的是,在 jetbot_motors.py 中注冊了從主題 /jetbot_motors/cmd_str 接收到的消息的處理
我們嘗試從終端發(fā)送它們(這些是向前、向后、向左、向右和停止的移動)
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "forward"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "backward"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "left"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "right"
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "stop"
又是問題!!!沒有動靜。您需要更改文件 jetbot_motors.py,更改 set_speed() 和 all_stop() 函數(shù)。
我創(chuàng)建了一個新文件 jetbot_motors_1.py 并進行了以下更改
# sets motor speed between [-1.0, 1.0]
def set_speed(motor_ID, value):
max_pwm = 200.0
speed = int(min(max(abs(value * max_pwm), 0), max_pwm))
a = b = 0
if motor_ID == 1:
motor = motor_left
a=1
b=0
elif motor_ID == 2:
motor = motor_right
a=2
b=3
else:
rospy.logerror('set_speed(%d, %f) -> invalid motor_ID=%d', motor_ID, value, motor_ID)
return
motor.setSpeed(speed)
if value < 0:
motor.run(Adafruit_MotorHAT.FORWARD)
motor.MC._pwm.setPWM(a,0,0)
motor.MC._pwm.setPWM(b,0,speed*16)
elif value > 0:
motor.run(Adafruit_MotorHAT.BACKWARD)
motor.MC._pwm.setPWM(a,0,speed*16)
motor.MC._pwm.setPWM(b,0,0)
else:
motor.run(Adafruit_MotorHAT.RELEASE)
motor.MC._pwm.setPWM(a,0,0)
motor.MC._pwm.setPWM(b,0,0)
# stops all motors
def all_stop():
set_speed(motor_left_ID, 0.0)
set_speed(motor_right_ID, 0.0)
現(xiàn)在jetbot響應(yīng)發(fā)送消息,可以向前、向后、向左、向右和停止。但這都是一個速度,由這個值調(diào)節(jié)
max_pwm = 200.0
有必要記錄以不同速度執(zhí)行的運動。現(xiàn)在,我們將做最簡單的,我們將使用發(fā)送 std_msgs/String 消息到主題 /jetbot_motors/cmd_raw
# raw L/R motor commands (speed, speed)
def on_cmd_raw(msg):
rospy.loginfo(rospy.get_caller_id() + ' cmd_raw=%s', msg.data)
speeds=msg. data. split(',')
set_speed(motor_left_ID, float( speeds[0]))
set_speed(motor_right_ID, float (speeds[1]))
檢查一下,我發(fā)送了類似的命令
rostopic pub /jetbot_motors/cmd_raw std_msgs/String --once " 0.9,-0.7"
。
并且還必須更改從主題 /jetbot_motors/cmd_raw 發(fā)送的消息。即geometry_msgs/Twist上的消息類型,在ROS中被廣泛使用。
我創(chuàng)建了一個新文件 jetbot_motors_2.py 并進行了以下更改
#!/usr/bin/env python
import rospy
import time
import math
from Adafruit_MotorHAT import Adafruit_MotorHAT
from std_msgs.msg import String
from geometry_msgs.msg import Twist
PWM_MIN=0.5
PWM_MAX=1.0
# sets motor speed between [-1.0, 1.0]
def set_speed(motor_ID, value):
max_pwm = 200.0
speed = int(min(max(abs(value * max_pwm), 0), max_pwm))
a = b = 0
if motor_ID == 1:
motor = motor_left
a=1
b=0
elif motor_ID == 2:
motor = motor_right
a=2
b=3
else:
rospy.logerror('set_speed(%d, %f) -> invalid motor_ID=%d', motor_ID, value, motor_ID)
return
def motor.setSpeed(speed)
if value < 0:
motor.run(Adafruit_MotorHAT.FORWARD)
motor.MC._pwm.setPWM(a,0,0)
motor.MC._pwm.setPWM(b,0,speed*16)
elif value > 0:
motor.run(Adafruit_MotorHAT.BACKWARD)
motor.MC._pwm.setPWM(a,0,speed*16)
motor.MC._pwm.setPWM(b,0,0)
else:
motor.run(Adafruit_MotorHAT.RELEASE)
motor.MC._pwm.setPWM(a,0,0)
motor.MC._pwm.setPWM(b,0,0)
# stops all motors
def all_stop():
set_speed(motor_left_ID, 0.0)
set_speed(motor_right_ID, 0.0)
# directional commands (degree, speed)
def on_cmd_dir(msg):
rospy.loginfo(rospy.get_caller_id() + ' cmd_dir=%s', msg.data)
# raw L/R motor commands (speed, speed)
def on_cmd_raw(msg):
rospy.loginfo("msg cmd_raw")
rospy.loginfo(msg)
x=max(min(msg.linear.x,1.0),-1.0)
z=max(min(msg.angular.z,1.0),-1.0)
l=(x-z)/2
r=(x+z)/2
#rospy.loginfo(x)
#rospy.loginfo(z)
#rospy.loginfo(l)
#rospy.loginfo(r)
lpwm= PWM_MIN+math.fabs(l)*(PWM_MAX-PWM_MIN)
rpwm= PWM_MIN+math.fabs(r)*(PWM_MAX-PWM_MIN)
#rospy.loginfo(lpwm)
#rospy.loginfo(rpwm)
kl=1 if l>0 else -1
kr=1 if r>0 else -1
if l==0 : kl=0
if r==0 : kr=0
set_speed(motor_left_ID, kl*lpwm )
set_speed(motor_right_ID, kr*rpwm)
# simple string commands (left/right/forward/backward/stop)
def on_cmd_str(msg):
rospy.loginfo(rospy.get_caller_id() + ' cmd_str=%s', msg.data)
if msg.data.lower() == "left":
set_speed(motor_left_ID, -1.0)
set_speed(motor_right_ID, 1.0)
elif msg.data.lower() == "right":
set_speed(motor_left_ID, 1.0)
set_speed(motor_right_ID, -1.0)
elif msg.data.lower() == "forward":
set_speed(motor_left_ID, 1.0)
set_speed(motor_right_ID, 1.0)
elif msg.data.lower() == "backward":
set_speed(motor_left_ID, -1.0)
set_speed(motor_right_ID, -1.0)
elif msg.data.lower() == "stop":
all_stop()
else:
rospy.logerror(rospy.get_caller_id() + ' invalid cmd_str=%s', msg.data)
# initialization
if __name__ == '__main__':
# setup motor controller
motor_driver = Adafruit_MotorHAT(i2c_bus=1)
motor_left_ID = 1
motor_right_ID = 2
motor_left = motor_driver.getMotor(motor_left_ID)
motor_right = motor_driver.getMotor(motor_right_ID)
# stop the motors as precaution
all_stop()
# setup ros node
rospy.init_node('jetbot_motors')
rospy.Subscriber('~cmd_dir', String, on_cmd_dir)
rospy.Subscriber('~cmd_raw', Twist, on_cmd_raw)
rospy.Subscriber('~cmd_str', String, on_cmd_str)
# start running
rospy.spin()
# stop motors before exiting
all_stop() And
當然,通過啟動啟動命令文件來啟動所有節(jié)點。我們將launch01.launch文件放在catkin_ws/src/jetbot_ros/launch
<launch>
<node name="jetbot_motors" pkg="jetbot_ros" type="jetbot_motors_2.py">
node>
<node name="jetbot_camera" pkg="jetbot_ros" type="jetbot_camera">
node>
<node name="jetbot_oled" pkg="jetbot_ros" type="jetbot_oled.py">
node>
launch>
運行批處理文件
roslaunch jetbot_ros launch01.launch
讓我們從遠程計算機控制機器人。我們將使用 rosbridge 包。Rosbridge 允許外部客戶端(在我們的例子中是瀏覽器)訪問 ROS 主題和服務(wù)(從主題發(fā)布和接收,調(diào)用服務(wù))。Rosbridge 是 rosbridge_suite 元包的一部分,其中包括用于實現(xiàn) rosbridge 協(xié)議的各種附加包。
rosbridge_suite 包是一組實現(xiàn) rosbridge 協(xié)議并提供 WebSocket 傳輸層的包。
套餐包括:
rosbridge_library - 基本的 rosbridge 包。Rosbridge_library 負責接收 JSON 字符串并向 ROS 發(fā)送命令,反之亦然。
rosapi-通過通常為 ROS 客戶端庫保留的服務(wù)調(diào)用使某些 ROS 操作可用。這包括獲取和設(shè)置參數(shù)、獲取主題列表等等。
rosbridge_server-通過 WebSocket 提供連接,以便瀏覽器可以“與 rosbridge 對話”。Roslibjs 是一個用于瀏覽器的 JavaScript 庫,可以通過 rosbridge_server 與 ROS 進行交互。
安裝包
sudo apt-get install ros-melodic-rosbridge-suite
在launch文件夾中的項目文件夾jetbot_ros中創(chuàng)建命令文件launch02.launch
<launch>
<include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch"/>
<node name="jetbot_motors" pkg="jetbot_ros" type="jetbot_motors_2.py">
node>
<node name="jetbot_oled" pkg="jetbot_ros" type="jetbot_oled.py">
node>
launch>
并運行命令文件
1個終端
roscore
2個終端
roslaunch jetbot_ros launch02.launch
要組織 Web 界面,您需要安裝 Web 服務(wù)器。
sudo apt-get install apache2
現(xiàn)在我們的 html 頁面將位于 /var/www/html 文件夾中。Library roslib.min.js 我們將其放在 js 文件夾中。
創(chuàng)建一個 html 文件 index01.html,我們將通過 websocket 9090 連接到 ROS,并將表單中的消息發(fā)送到 ROS /pub_txt_msg 主題,并在頁面上接收和顯示來自 ROS /sub_txt_msg 主題的消息
html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="js/roslib.min.js">script>
<script type="text/javascript" type="text/javascript">
var ros = new ROSLIB.Ros({
url : 'ws://192.168.0.111:9090'
});
ros.on('connection', function() {
document.getElementById("status").innerHTML = "Connected";
});
ros.on('error', function(error) {
document.getElementById("status").innerHTML = "Error";
});
ros.on('close', function() {
document.getElementById("status").innerHTML = "Closed";
});
var txt_listener = new ROSLIB.Topic({
ros : ros,
name : '/sub_txt_msg',
messageType : 'std_msgs/String'
});
txt_listener.subscribe(function(m) {
document.getElementById("msg").innerHTML = m.data;
});
var pub1=new ROSLIB.Topic ({
ros: ros,
name : '/pub_txt_msg',
messageType : 'std_msgs/String'
});
function send_ros() {
var msg=new ROSLIB.Message ({"data" : document.getElementById("putdata").value});
pub1.publish(msg);
}
script>
head>
<body>
<h1>Simple ROS User Interfaceh1>
<p>Connection status: <span id="status">span>p>
<p>Last /txt_msg received: <span id="msg">span>p>
<p><form id=formoptions name=formoptions action="javascript:void();" onsubmit="feturn false;">
send to /pub_txt_msg <br>
<input name=putdata id=putdata>
<button id='button1' value='send' onclick='send_ros();'>Sendbutton>
form>
p>
body>
html>
在瀏覽器中啟動頁面index01.html
。
創(chuàng)建一個文件 index02.html 來控制機器人的運動并從攝像頭查看圖像。我們使用 nipplejs library.js
html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="js/roslib.min.js">script>
<script type="text/javascript" src="js/nipplejs.js">script>
<script type="text/javascript" type="text/javascript">
var ros = new ROSLIB.Ros({
url : 'ws://192.168.0.111:9090'
});
ros.on('connection', function() {
document.getElementById("status").innerHTML = "Connected";
});
ros.on('error', function(error) {
document.getElementById("status").innerHTML = "Error";
});
ros.on('close', function() {
document.getElementById("status").innerHTML = "Closed";
});
var txt_listener = new ROSLIB.Topic({
ros : ros,
name : '/txt_msg',
messageType : 'std_msgs/String'
});
txt_listener.subscribe(function(m) {
document.getElementById("msg").innerHTML = m.data;
});
cmd_vel_listener = new ROSLIB.Topic({
ros : ros,
name : "/cmd_vel",
messageType : 'geometry_msgs/Twist'
});
move = function (linear, angular) {
var twist = new ROSLIB.Message({
linear: {
x: linear,
y: 0,
z: 0
},
angular: {
x: 0,
y: 0,
z: angular
}
});
cmd_vel_listener.publish(twist);
}
createJoystick = function () {
var options = {
zone: document.getElementById('zone_joystick'),
threshold: 0.1,
position: { left: 50 + '%' },
mode: 'static',
size: 150,
color: '#000000',
};
manager = nipplejs.create(options);
linear_speed = 0;
angular_speed = 0;
manager.on('start', function (event, nipple) {
timer = setInterval(function () {
move(linear_speed, angular_speed);
}, 25);
});
manager.on('move', function (event, nipple) {
max_linear = 1.0; // m/s
max_angular = 1.0; // rad/s
max_distance = 75.0; // pixels;
linear_speed = Math.sin(nipple.angle.radian) * max_linear * nipple.distance/max_distance;
angular_speed = -Math.cos(nipple.angle.radian) * max_angular * nipple.distance/max_distance;
});
manager.on('end', function () {
if (timer) {
clearInterval(timer);
}
self.move(0, 0);
});
}
window.onload = function () {
createJoystick();
}
script>
head>
<body>
<h1>Simple ROS User Interfaceh1>
<p>Connection status: <span id="status">span>p>
<p>Last /txt_msg received: <span id="msg">span>p>
<div id="zone_joystick" style="position: relative;">div>
body>
html>
啟動頁面后,我們可以控制機器人的運動。頁面預覽
。
?
?
- 機器人上游半導體產(chǎn)業(yè)鏈報告 1次下載
- 使用EASE和ROS遙控機器人
- AUTO CUBEROS機器人開發(fā)平臺 2次下載
- 基于ROS的機器人本體控制器 1次下載
- 基于樹莓派2B的ROS機器人 1次下載
- 基于運行ROS的機器人 2次下載
- ROS/51單片機/機器人控制器實驗報告冊
- 基于DSP和PC的農(nóng)業(yè)機器人控制系統(tǒng) 17次下載
- 基于DSP芯片的足球機器人實現(xiàn)與設(shè)計 26次下載
- 機器人PID控制概述 27次下載
- 怎么樣才能使用ROS系統(tǒng)實現(xiàn)機器人視覺導航識別算法的設(shè)計 18次下載
- 機器人設(shè)計教程之機器人控制和決策子系統(tǒng) 23次下載
- 如何使用Scratch和ROS進行教育機器人編程的設(shè)計與實現(xiàn) 23次下載
- 基于Scratch和ROS的教育機器人編程與實現(xiàn) 10次下載
- ROS教程之如何構(gòu)建ROS機器人模型URDF學習資料免費下載 30次下載
- 如何使用PLC控制機器人 794次閱讀
- ROS機器人如何使用Navigation導航包實現(xiàn)實時定位 2223次閱讀
- 單片機和FreeRTOS上跑機器人ROS 967次閱讀
- 用于ROS移動機器人高集成電源解決方案(一) 948次閱讀
- ROS移動機器人的通信接口電路設(shè)計 1321次閱讀
- ROS移動機器人中常用的兩種電機 1550次閱讀
- AI與邊緣計算加持,是時候深入了解機器人了 1646次閱讀
- 發(fā)現(xiàn)更多機器人開發(fā)技巧 AI與邊緣計算加持 638次閱讀
- RT-Thread如何使用串口或者無線和ROS連接 5164次閱讀
- 機器人控制系統(tǒng)分類_機器人控制系統(tǒng)有哪些 2.6w次閱讀
- 機器人控制器有哪些類型_機器人控制器發(fā)展 1.1w次閱讀
- ROS程序是如何控制伺服機的 所有答案盡在本文 3000次閱讀
- 基于PLC的機器人伺服運動控制系統(tǒng)設(shè)計詳解 1.5w次閱讀
- 《工業(yè)機器人技術(shù)及應(yīng)用》讓人從認識到熟練掌握工業(yè)機器人 6437次閱讀
- 機器人自主移動的秘密,從SLAM技術(shù)說起 2368次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多