• #maker+t=market
  • 3D列印服務
  • COSPLAY 3D 建模
  • 1
  • 2
  • 3

Python人工智慧圖控 - 研習交流廳 造訪社團 » AI

原文網址 石小川
2020-03-27 15:51:22

上過我的課的同學應該知道, Qt5的Designer GUI拖拉元件還蠻方便開發APP的。如果熟悉Qt5且想更進一步在手機上執行你寫的應用程式,可參考下列方式建置Android下的Qt5開發環境。(至於IOS, 因為老師目前沒有iPhone就先不提了)。
繼上回介紹的手機程式開發工具Android Studio後,其實在手機上寫APP程式還有另一個選擇開發工具就是Qt5,我還挺喜歡用它的原因是無論Android版Qt5、Python版Pyqt5、Windows版Qt5,我只要維護一個程式碼就好,其他就只是環境移植而已,不是甚麼大工程,修改幅度不大。
QT5.10.0的Android 開發環境建置請參考下列連結 : https://blog.csdn.net/qq_28643619/article/details/86589252

Xi Kris
2020-03-27 15:59:33

請問像qt 這樣的拖拉GUI設計,在之後如果要進行layout 的重置會不會很容易出現問題。
(在python 程式碼以及XML檔之間的問題)

石小川
2020-03-27 16:06:16

不同機器的layout佈置一定要用相對位置, 移植才不會出大問題。

Qt Designer 儲存的是.ui檔,結構類似XML格式,因為我們期望是要給Python 引用,所以我們必須想辦法將.ui檔轉換成.py檔才行。 PyQt5提供一個命令列工具pyuic5可以很輕鬆地完成轉換工作,使用方式如下 : pyuic5 source.ui -o destination.py

Xi Kris
2020-03-29 15:59:48

想請問~ 如果是把layout的ui.檔跟python 程式碼分開這樣會不會比較方便之後的維護呢?

石小川
2020-03-29 19:55:47

Xi Kris 當然!

Xi Kris
2020-03-29 22:37:34

石小川 先生想請教您,
那如果使用pyuic5 將ui文件轉為py文件的話,如果更改layout 之後的話,是不是又要重整之前多添加的程式碼?
我還是pyqt初學者,有點不瞭解。
目前我是使用uic.loadUiType("xxx.ui")的方式把ui檔案引入IDE 編寫。
覺得這樣ui檔案如果更改的話,程式碼也不會受影響。
請問您都是用pyuic5的轉換來維護程式碼嗎?

石小川
2020-03-30 08:12:49

Xi Kris 可參考 第一單元 使用Python開發多軸運動控制機電系統 :
"Python + PyQt5 教學 - 圖控介面開發工具 QT Designer" 有詳細說明。


原文網址 石小川
2020-03-22 15:02:17

近期為了ROS(機器人作業系統)相關專案,於是想起了以前的小玩具 - ROVIO,塵封已久的路威機器人在倉庫找了許久,終於抓到這隻小烏龜了,檢查電池、發現零組件狀況不錯,可見保存很好,這個ROVIO機器人麻雀雖小卻五臟俱全,看看下面硬體規格就知道。分享給有興趣製作機器人的朋友做參考。 Rovio機器人主要特點: 內含麥克風及喇叭可以雙向語音交談 可以遙控攝影機頭上下移動 可以手機和電腦或者Pad遠程網路控制 可以自動充電 雷達偵測障礙 硬體規格: 是以三大電路板結合而成:
(1)主ARM 板
Main Processor —科宇KOI-MP802 蓋面
實際為華邦 W99702 內建mpeg壓縮 跑 WEB server ,rtsp , and 主機總控
制 "spook" media streaming server ( [Spook Live Video Streamer]
( http://www.litech.org/spook/ ) )
Clock frequency 200Mhz
Main Memory — 8MB RAM
USB ttl port 與電腦通訊 (以W99100DG實現,負責isp下載)
Audio chip WM8976
Web cam video chip OV7670
SPI FLASH(W25X16) 2MB
OS Open-source "eCos" (2)充電電路板:專用NiMH充電管理芯片LS2516,PWM恆流方式,
電流不詳,穩壓二極體用的是1N5822,估計>1A。 (3)驅動板 MCU:4路BJT H電橋,3個輪子用光柵反饋,攝像頭升降用
可變電阻反饋,紅外線訊號和主控板通過串口通訊。 自動導航電路以紅外線感應運算
充電基座會投射出紅外線導航點,車上再以紅外線感應器做幾何
定位.定位程式由專門晶片負責.再送出串口訊號回應給上位機定位訊息

海闊天
2020-03-22 15:42:03

這台夢幻超跑要賣多少錢啊?小川哥!

海闊天
2020-03-22 15:42:32

海闊天
2020-03-22 15:42:44

石小川
2020-03-22 17:31:46

2013年露天買的, 3000多台幣, 拿來解剖研究用! 哈哈!

詹俊英
2020-03-24 20:58:27


原文網址 Wilson Kao
2020-03-19 18:26:42

for those interested in applying AI to marketing for tech startups

給那些有興趣申請ai申請技術創業的營銷的人

https://medium.com/@wilsonckao/ai-sentiment-analysis-using-tensorflow-to-automatically-remove-bad-texts-d8dfb8587d79

· 查看原文 · 為此翻譯評分


原文網址 石小川
2020-03-11 22:20:43

會用樹莓派直接控制四軸飛行器的飛控板理由是 : 你可以用一台筆電 + ROS(機器人作業系統)的資料鏈串連起來,就可指揮上百台無人飛行器做空中分列式,或幾百台水上無人艦艇跳芭蕾舞、、等等,當然前提是你要會寫些程式才行。 連接方式很簡單, 如圖綠色圈起來的就是Pixhawk通訊埠: 將飛控板Pixhawk上的Telem2接口四根線引出(其實就是UART): Telem2的5V接Pi的5V Telem2的TX接Pi的RX Telem2的RX接Pi的TX Telem2的GND接Pi的GND 這樣子筆電就可以和多個樹莓派通訊進而控制多個飛行器,當然中間還是有一言難盡的技術,再擇期說明。 軟體設定可參考下面教學,我就不重複了。 https://blog.csdn.net/liberatetheus/article/details/77968424 https://blog.csdn.net/Lin_QC/article/details/90373992?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task https://blog.csdn.net/weixin_42704669/article/details/83791117?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

林永仁
2020-03-14 21:46:38


原文網址 石小川
2020-03-07 18:57:10

當相同類型的程式時常使用或必須重複呼叫時,這時就是考慮將副程式加進程式庫的時候,我習慣將功能相同的函式放在一起製作專用的程式庫,例如處裡影像副程式放在TImage.dll、處裡語音副程式放在
TSpeech.dll、處裡神經網路程式放在TNeuron.dll、處裡光達程式放在TLidar.dll等等 , 一旦你的程式庫累計的夠多的話,將來設計APP應用程式就會如同貼圖一樣方便,只要呼叫程式庫就好,主程式變少了。 接下來Demo一個動態程式庫TSystem.dll,裡面函式是負責儲存使用者最後操作各個視窗元件位置及大小的資訊, 請一步步看圖解。 step1. 建立新的專案。 圖1 ? step2. 選 C#類別庫, 按下一步。 圖2 ? step3. 設定新的專案, 並按建立。 圖3 ? step4. 設計程式碼TSystem.cs。
//----------------------------------------------------------------------
//動態程式庫 TSystem.dll 範例
//---------------------------------------------------------------------- using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Drawing; namespaceTSystem
{
public class WindowPosition
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Point position)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create));
WriteFile.Write(position.X);
WriteFile.Write(position.Y);
WriteFile.Close();
} //------------------------------------------------------------------------
public Point ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Point(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Point position = new Point(ReadFile.ReadInt32(),
ReadFile.ReadInt32());
ReadFile.Close();

return position;
} } //public class WindowPosition //-------------------------------------------------------------------------
public class WindowhSize
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Size size)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create)); //main form size
WriteFile.Write(size.Width);
WriteFile.Write(size.Height);
WriteFile.Close();
}

//------------------------------------------------------------------------
public Size ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Size(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Size size = new Size(ReadFile.ReadInt32(), ReadFile.ReadInt32());
ReadFile.Close();

return size;
} } //public class WindowSize
} //namespace TSystem step5. 建置方案, 產生TSystem.dll。 圖4 ? step6. 產生的TSystem.dll的檔案及路徑。 圖5 ? step7. 主程式呼叫TSystem.dll, 需將產生的TSystem.dll加入參考。 圖6 ? step8. 主程式呼叫TSystem.dll( 關注//Note的地方即可 )。
//----------------------------------------------------------------------
//C# 主程式呼叫動態程式庫 TSystem.dll 範例
//----------------------------------------------------------------------
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using Emgu.Util;
using Emgu.CV.UI;
using Emgu.CV.BgSegm;
using Emgu.CV.VideoSurveillance; //Note
using TSystem;
using TCamera; //-----------------------------------------------------------------------------
namespace VT
{
public partial class MainForm : Form
{
//---------------------------------------------------------------------
public ToolboxForm CreateToolboxForm(Form parent, string text,
bool bshow = true)
{
ToolboxForm toolboxForm;
toolboxForm = new ToolboxForm();
toolboxForm.MdiParent = parent;
toolboxForm.Text = text; if(bshow)
toolboxForm.Show();

return toolboxForm;
}

//---------------------------------------------------------------------
public ImageXYForm CreateImageXYForm(Form parent, int number,
stringtext, bool bshow = true)
{
ImageXYForm imageForm;
imageForm = new ImageXYForm(number);
imageForm.MdiParent = parent;
imageForm.Text = text;

if(bshow)
imageForm.Show();

return imageForm;
}

//---------------------------------------------------------------------
public static MainForm _gmainForm = null;
public static ToolboxForm _gtoolboxForm = null;
public static ImageXYForm _gimageXYForm = null;

//Note
public WindowhSize _winSize = null;

//---------------------------------------------------------------------
//Main Program
//---------------------------------------------------------------------
public MainForm()
{
InitializeComponent();
}

//---------------------------------------------------------------------
private void MainForm_Load(objectsender, EventArgs e)
{
_gmainForm = this;

//Note
//讀取系統設定檔
_winSize = new WindowhSize();
Size size = _winSize.ReadSystemInfo(@"..\..\system\mainform.inf");
if(size.Width == -1 && size.Height == -1)
this.ClientSize = new Size(1200, 700);
else
this.ClientSize = new Size(size.Width, size.Height);

//修改mdi窗体背景色--------------------------------------------------------
MdiClient ctlMDI;

// Loop through all of the form's controls looking
foreach(Control ctl in this.Controls)
{
try
{
// Attempt to cast the control to type MdiClient.
ctlMDI = (MdiClient) ctl;

// Set the BackColor of the MdiClient control.
ctlMDI.BackColor = Color.LightGray; //this.BackColor; //Color.Blue;
}
catch(InvalidCastException)
{
// Catch and ignore the error if casting failed.
}
}

_gtoolboxForm = CreateToolboxForm(this, "工具箱");
_gimageXYForm = CreateImageXYForm(this, 0, "XY軸攝影機");
} //private void MainForm_Load(object sender, EventArgs e)

//--------------------------------------------------------------------- private void MainForm_FormClosed(object sender,
FormClosedEventArgs e)
{
//Note
_winSize.WriteSystemInfo(@"....\system\mainform.inf",
new Size(this.ClientSize.Width, this.ClientSize.Height));
}
} //public partial class MainForm : Form
} //namespace VT step9. 執行主程式成功。
圖7 ?


原文網址 石小川
2020-03-05 22:28:13

人腦約有1000億個神經元,而每個神經元約有1000根樹突(dendrites)從細胞本體(cell body)延伸至其他神經元,因此人腦大約有100萬億根巨量連結,而且是平行處理各種信息,這實在是神奇了,傑克。單一個神經元不怎麼樣,可是一旦巨量連結智慧就非常可觀了,這就是科學。 倒傳遞網路是很多經典神經網路的基礎,要真正研究深度學習有必要知道式子是如何出來的,下面是使用最陡坡降法(Gradient descent)使能量誤差函數E最小化的推導過程。紅色字體是導出的神經網路學習修正量(公式15、17、18、21)。 E : 能量函數(誤差函數) Y : 輸出值 T : 目標值 Net : 集成函數 f : 轉換函數 η : 學習速率 Wji : 加權值 ΔWji : 加權值修正量 ϴj : 臨界值 Δϴj : 臨界值修正量 Yj(n) = f[Netj(n)] (1) //其中n 代表第n層 Netj(n) = ΣiWjiYi(n-1) - ϴj (2) E = (1/2)Σj(Tj - Yj)^2 (3) ΔWji = -η** **∂E/∂Wji (4) ∂E/∂Wji = ∂E/∂Netj(n) **. **∂Netj(n)/∂Wji (5) 根據微積分連鎖率(chain rule), = ∂E/∂Yj(n) **. **∂Yj(n)/∂Netj(n) **. **∂Netj(n)/∂Wji (6) = ①. ② . ③ 其中 ③ ∂Netj(n)/∂Wji = ∂/∂Wji[ΣiWjiYi(n-1) - ϴj]= Yi(n-1) (7) ② ∂Yj(n)/∂Netj(n) = ∂/∂Netj(n)f[Netj(n)] = f'[Netj(n)] (8) ① ∂E/∂Yj(n) case1: if n 層是輸出層 ∂E/∂Yj(n)= ∂/∂Yj(n)[ (1/2)Σj(Tj - Yj)^2] = -(Tj - Yj) (9) case2: if n 層是隱藏層m ∂E/∂Yi(n)= Σj [∂E/∂Netj(n+1) . ∂Netj(n+1)/∂Yi(n)] (10) = ①. ② 其中 ② ∂Netj(n+1)/∂Yi(n)= ∂/∂Yi(n)[ΣiWjiYi(n) - ϴj]= Wji (11) ① 定義∂E/∂Netj(n+1)= -σj(n+1) (12) 所以 ∂E/∂Yi(n)=- Σjσj(n+1)Wji (13) 推導結論: (I) Wji在輸出層、隱藏層間時, ∂E/∂Wji= -[Tj - Yj(n)]f'[Netj(n)]Yi(n-1) (14) = -σj(n)Yi(n-1) 所以 σj(n)= [Tj - Yj(n)]f'[Netj(n)] (15) (II) Wji在隱藏層間、輸入層時, ∂E/∂Wji= [-Σjσj(n+1)Wji]f'[Netj(n)]Yi(n-1) (16) = -σj(n)Yi(n-1) 所以 σj(n) = [Σjσj(n+1)Wji]f'[Netj(n)] (17) 由第4式(ΔWji = -η** **∂E/∂Wji)得出, ΔWji = ησj(n)Yi(n-1) (18) if f(netj) 採用雙彎曲函數(sigmoid function) f(netj) = 1/ 1+e^-Netj (19) f'(netj) = f(netj)[1-f(netj)] = Yj(1-Yj) (20) 同ΔWji 證明可得, Δϴj = -ησj(n) (21)


原文網址 石小川
2020-03-01 19:04:55

程式可控制的參數例如圖像尺寸(ROI)、拍照、曝光時間、GAMMA、對比差、亮度、自定義LUT、鏡頭翻轉、RGB顏色增益、飽和度、銳度、彩色轉黑白、色溫校正、反色、9組十字線位置和顏色、觸發模式、幀率控制,有附SDK及C#、C++ Builder、Delphi、labView、QT5、VB、VC等範例可參考,對於喜歡寫自動控制程式的人來說非常方便。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

usingSystem.Runtime.InteropServices;

usingSystem.Threading;

usingCameraHandle = System.IntPtr;

usingCKSDK;

usingCKAPI = CKSDK.CKSDKAPI;

namespacePlayer

{

public partial class mainwindow: Form

{

# regionvariable

protectedCameraHandle m_hCamera = IntPtr.Zero; // 句柄

protectedThread m_CapThread;

protected boolm_bExit = false;

protected uintm_uWidth = 0;

protected uintm_uHeight = 0;

doublem_CapFrameRate = 0;

doublem_DisFrameRate = 0;

# endregion

public mainwindow()

{

InitializeComponent();

CameraRefresh();

}

public voidCaptureThreadFunction()

{

stImageInfo ImageInfo = newstImageInfo();

CameraSdkStatus status = CameraSdkStatus.CAMERA_STATUS_SUCCESS;

IntPtr pRGBFrame = IntPtr.Zero;

uintDispFrameNum = 0;

intFrameTimeCur = 0;

intFrameTimeLast = 0;

FrameStatistic curFS = newFrameStatistic();

FrameStatistic lastFS = newFrameStatistic();

IntPtr pbyBuffer = IntPtr.Zero;

uintdRGBBufLen = 0;

CameraHandle hBuf = IntPtr.Zero;

CKAPI.CameraPlay(m_hCamera);

while(!m_bExit)

{

CKAPI.CameraGetFrameStatistic(m_hCamera, outcurFS);

if(FrameTimeCur != 0)

{

FrameTimeCur = Environment.TickCount;

intdeltime = FrameTimeCur - FrameTimeLast;

if(1000 <= deltime)

{

m_CapFrameRate = (double)(((double)curFS.iCapture - (double)lastFS.iCapture) * 1000.0) / deltime;

m_DisFrameRate = (double)DispFrameNum * 1000.0 / deltime;

lastFS = curFS;

FrameTimeLast = FrameTimeCur;

DispFrameNum = 0;

}

}

else

{

FrameTimeCur = Environment.TickCount;

FrameTimeLast = FrameTimeCur;

lastFS = curFS;

}

//获取 RAW 数据

status = CKAPI.CameraGetRawImageBuffer(m_hCamera, refhBuf, 1000);

if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

{

Thread.Sleep(5);

continue;

}

//获得图像缓冲区地址

pbyBuffer = CKAPI.CameraGetImageInfo(m_hCamera, hBuf, refImageInfo);

//获得经 ISP 处理的 RGB 数据

//////////////////////////////////

if(dRGBBufLen < (ImageInfo.iWidth * ImageInfo.iHeight * 4))

{

dRGBBufLen = (ImageInfo.iWidth * ImageInfo.iHeight * 4);

pRGBFrame = Marshal.AllocHGlobal(Convert.ToInt32(dRGBBufLen));

}

m_uWidth = ImageInfo.iWidth;

m_uHeight = ImageInfo.iHeight;

CKAPI.CameraGetOutImageBuffer(m_hCamera, refImageInfo, pbyBuffer, pRGBFrame);

DispFrameNum++;

//////////////////////////////////显示

CKAPI.CameraDisplay(m_hCamera, pRGBFrame, refImageInfo);

//释放由 CameraGetRawImageBuffer 获得的缓冲区

CKAPI.CameraReleaseFrameHandle(m_hCamera, hBuf);

}

CKAPI.CameraPause(m_hCamera);

}

private voidCameraRefresh()

{

// 清空设备combobox

this.comboBox_DeviceList.Items.Clear();

CameraSdkStatus status;

//tSdkCameraDevInfo[] tCameraDevInfoList;

intdevNum = 0;

status = CKAPI.CameraEnumerateDevice(refdevNum);

if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

return;

for(inti = 0; i < devNum; i++)

{

tDevEnumInfo devAllInfo;

// 获取设备信息

status = CKAPI.CameraGetEnumIndexInfo(i, outdevAllInfo);

if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

continue;

// 将设备昵称增加到combobox控件中。

this.comboBox_DeviceList.Items.Add(new string(devAllInfo.DevAttribute.acFriendlyName));

}

if(devNum > 0)

this.comboBox_DeviceList.SelectedIndex = 0;

}

private voidCameraSetting()

{

if(m_hCamera != IntPtr.Zero)

{

if(CKAPI.CameraSetActivePage(m_hCamera, emSettingPage.SETTING_PAGE_ALL, 0) != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

return;

if(CKAPI.CameraCreateSettingPageEx(m_hCamera) != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

return;

CKAPI.CameraShowSettingPage(m_hCamera, 1);

}

}

private boolCameraPlay()

{

// 先停止当前的播放,然后再打开新的播放设备

CameraStop();

intindex = this.comboBox_DeviceList.SelectedIndex;

if(index < 0)

return false;

// 初始化设备,返回设备句柄

CameraSdkStatus status = CKAPI.CameraInit(refm_hCamera, index);

if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

{

m_hCamera = IntPtr.Zero;

return false;

}

// 初始化播放显示,设置显示图像的控件句柄

status = CKAPI.CameraDisplayInit(m_hCamera, this.pictureBox.Handle);

if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)

{

CKAPI.CameraUnInit(m_hCamera);

m_hCamera = IntPtr.Zero;

return false;

}

// 新建视频播放线程

m_bExit = false;

m_CapThread = newThread(newThreadStart(CaptureThreadFunction));

m_CapThread.Start();

return true;

}

private voidCameraStop()

{

// 先关闭线程

if(m_CapThread != null)

{

m_bExit = true;

while(m_CapThread.IsAlive)

Thread.Sleep(10);

m_CapThread = null;

}

// 关闭相机句柄

if(m_hCamera != IntPtr.Zero)

{

CKAPI.CameraUnInit(m_hCamera);

m_hCamera = IntPtr.Zero;

}

}

private voidbutton_Refresh_Click(objectsender, EventArgs e)

{

CameraRefresh();

}

private voidbutton_PlayOrStop_Click(objectsender, EventArgs e)

{

if(this.button_PlayOrStop.Text == "Play")

{

if(CameraPlay())

{

this.button_PlayOrStop.Text = "Stop";

this.button_Setting.Enabled = true;

this.timer_DevInfo.Start();

}

}

else

{

CameraStop();

this.button_PlayOrStop.Text = "Play";

this.button_Setting.Enabled = false;

this.timer_DevInfo.Stop();

}

}

private voidbutton_Setting_Click(objectsender, EventArgs e)

{

CameraSetting();

}

private voidtimer_DevInfo_Tick(objectsender, EventArgs e)

{

this.label_DevInfo.Text = string.Format("resolution: {0} x {1} | capture frame rate: {2:###.##} | display frame rate: {3:###.##}",

m_uWidth, m_uHeight, m_CapFrameRate, m_DisFrameRate);

}

private voidForm1_FormClosing(objectsender, FormClosingEventArgs e)

{

CameraStop();

}

}

}

翻譯年糕


原文網址 石小川
2020-02-27 09:48:13

ROS 是機器人作業系統(Robot Operating System)的縮寫,ROS從2007發展至今已開始茁壯,目前很多機器人公司將旗下產品移植至ROS上,預見將來機器人工程師一定要會ROS技能。

ROS內建很多演算法如SLAM (Simultaneous Localization and Mapping)及 AMCL(Adaptive Monte Carlo Localization),以及包含很多軟體驅動接口很容易串接光學雷達、感測器、影像辨識、Arduino、Raspberry Pi、IO模組、運動卡等硬體元件,對建構自主導航機器人幫助很大,

下面連結網址是ROS安裝的方法及下載,有Windows和Ubuntu版本,對機器自動化有興趣的朋友可參考看看。

在Windows系统安装ROS 機器人作業系統 :
https://blog.csdn.net/ZhangRelay/article/details/82899582

在Linux系统安装ROS 機器人作業系統
https://makerpro.cc/2018/12/ros-setup-tutorial/

ROS.org :
http://wiki.ros.org/ROS/Installation

曾希哲
2020-02-27 10:06:09

ROS是現在進行式了

Chen Sheng Shou
2020-02-27 10:17:51

謝謝

Allen Tzeng
2020-02-27 10:43:28

最近剛接觸SLAM,想要實現卻不知如何下手


原文網址 石小川
2020-02-26 10:00:41

光騰書齋三月份課程開始報名
持續招生中...........,隨時歡迎報名!
課程: Python CNC軸控軟/硬體設計班 課程內容: *CNC 軸控平台基本知識 *CNC 軸控平台電路、電機組裝 *Python 軸控軟體開發平台建立 *Python呼叫動態連結庫(DLL)控制步進馬達 及 I/O Port *剖析motion.py程式如何控制CNC雷射機台 此次開課目的是想引導有Python(或C#)基礎的朋友進入軟/硬體設計有趣的領域,學習後學員可自行用Python控制運動卡, 開發自動控制相關應用程式APP或CNC機台, 學員學習期間對軟/硬體設計方面有問題也可用Messenger或Email 聯繫我, 可線上指導。
此次開課也是採用遠距指導教學,上課方式以講義內容為主,採用一個月彈性遠距師徒制一對一教學,主要以messenger通信軟體互相聯繫,會按照進度傳指導教學資料給學員,學員不受時間限制,隨時可發問,老師會撥空回答問題。
p.s. 前一梯次沒上過的同學請把握這一次了。
開始上課日期: 2020/3/5(星期四) 註 . 確定要來上課的朋友請在此留言報名(B+),會用messenger主動聯絡您匯款,金額酌收NT$3500,並傳Quantum講義及程式給您。 Python人工智慧圖控 - 研習交流廳 : https://www.facebook.com/groups/523498395047153/?ref=bookmarks

Robert Chen
2020-02-26 12:06:49

教授,請問會組硬體嗎?

Robert Chen
2020-02-26 15:36:52

請問教授,會開G code転cnc程式及飛刀課?

Wilson Kao
2020-02-26 15:59:13

有人有紡織業瑕疵檢測紡織的經驗嗎? 謝謝

Robert Chen
2020-02-26 18:18:29

感謝教授

Claude Hsu
2020-02-27 17:27:48

請問要報名是留(B+)嗎?謝謝

Mini Lai
2020-02-27 18:59:03

B+

郭耀中
2020-03-02 11:31:47

B+

Cian Cheng
2020-03-03 09:05:23

帳號多少?可以利用晚上嗎?

Cian Cheng
2020-03-03 13:11:05

+1


原文網址 石小川
2020-02-22 21:15:58

DM542 採用共陽接法, 如圖。

其中加了ULM2003達靈頓是因為Pi4輸出準位是3.3V, 無法推動DM542驅動器,故須加上當作緩衝器,一來調整準位至+5V, 另外為加大推動電流, 很多朋友沒成功就是這個原因。

測試程式是用Python寫的, 有兩種方式, 提供給朋友參考 :

Program 1是 Time sleep方式。

Program 2是PWM方式。

#----------------------------------------------------------------

# Program 1: StepMotor_TIME.py

#----------------------------------------------------------------

from time import sleep

import RPi.GPIO as gpio

PUL = 11

DIR = 12

ENA = 13

CW = 1

CCW = 0

gpio.setmode(gpio.BOARD)

gpio.setup(PUL, gpio.OUT)

gpio.setup(DIR, gpio.OUT)

gpio.setup(ENA, gpio.OUT)

gpio.output(ENA, gpio.HIGH)

# Main body of code

try:

gpio.output(ENA, gpio.LOW)

while True:

sleep(2)

gpio.output(DIR, CW)

for x in range(51200):

gpio.output(PUL, gpio.LOW)

sleep(0.00001)

gpio.output(PUL, gpio.HIGH)

sleep(0.00001)

sleep(2)

gpio.output(DIR,CCW)

for x in range(51200):

gpio.output(PUL, gpio.LOW)

sleep(0.00001)

gpio.output(PUL, gpio.HIGH)

sleep(0.00001)

except KeyboardInterrupt: # If there is a KeyboardInterrupt (when you press ctrl+c), exit the program and cleanup

print("Cleaning up!")

gpio.cleanup()

#----------------------------------------------------------------

#Program 2: StepMotor_PWM.py

#----------------------------------------------------------------

from time import sleep

import RPi.GPIO as gpio

PUL = 11

DIR = 12

ENA = 13

CW = 1

CCW = 0

gpio.setmode(gpio.BOARD)

gpio.setup(PUL, gpio.OUT)

gpio.setup(DIR, gpio.OUT)

gpio.setup(ENA, gpio.OUT)

gpio.output(ENA, gpio.HIGH)

pwm = gpio.PWM(PUL, 100000)

bDir = False

# Main body of code

try:

gpio.output(ENA, gpio.LOW)

pwm.start(50)

while True:

if bDir == True:

gpio.output(DIR, CW)

bDir = False

sleep(5)

else:

gpio.output(DIR, CCW)

bDir = True

sleep(5)

except KeyboardInterrupt: # If there is a KeyboardInterrupt (when you press ctrl+c), exit the program and cleanup

print("Cleaning up!")

gpio.cleanup()

DM542 採用共陽接法, 如圖。

其中加了ULM2003達靈頓是因為Pi4輸出準位是3.3V, 無法推動DM542驅動器,故須加上當作緩衝器,一來調整準位至+5V, 另外為加大推動電流, 很多朋友沒成功就是這個原因。

測試程式是用Python寫的, 有兩種方式, 提供給朋友參考 :

Program 1是 Time sleep方式。

Program 2是PWM方式。

#----------------------------------------------------------------

# 程式1 : stepmotor _ time. Py

#----------------------------------------------------------------

從時間進口睡眠

匯入rpi. Gpio作為gpio

泳池= 11

Dir = 12

ENA = 13

Cw = 1

Ccw = 0

Gpio. 設定模式(gpio). 年十二月()

Gpio. 設定(pul, gpio). 出局

Gpio. 設定(你, gpio). 出局

Gpio. 設定(ena, gpio). 出局

Gpio. 輸出(ena, gpio). 高(高)

# 主要程式碼

嘗試:

Gpio. 輸出(ena, gpio). 低)

雖然事實:

睡眠(2)

Gpio. 輸出(dir, cw)

X在範圍(51200):

Gpio. 輸出(pul, gpio). 低)

睡眠(0.00001)

Gpio. 輸出(pul, gpio). 高(高)

睡眠(0.00001)

睡眠(2)

Gpio. 輸出(dir, ccw)

X在範圍(51200):

Gpio. 輸出(pul, gpio). 低)

睡眠(0.00001)

Gpio. 輸出(pul, gpio). 高(高)

睡眠(0.00001)

除了鍵盤中斷如果有鍵盤中斷(當你按下ctrl+c), 退出程式並清理

列印("清理!")

Gpio. 清理()

#----------------------------------------------------------------

# 項目2 : stepmotor _ pwm. Py

#----------------------------------------------------------------

從時間進口睡眠

匯入rpi. Gpio作為gpio

泳池= 11

Dir = 12

ENA = 13

Cw = 1

Ccw = 0

Gpio. 設定模式(gpio). 年十二月()

Gpio. 設定(pul, gpio). 出局

Gpio. 設定(你, gpio). 出局

Gpio. 設定(ena, gpio). 出局

Gpio. 輸出(ena, gpio). 高(高)

Pwm = gpio. Pwm (pul, 100000)

Bdir =假

# 主要程式碼

嘗試:

Gpio. 輸出(ena, gpio). 低)

Pwm. 開始(50)

雖然事實:

如果bdir ==真的:

Gpio. 輸出(dir, cw)

Bdir =假

睡眠(5)

其他:

Gpio. 輸出(dir, ccw)

Bdir =真實

睡眠(5)

除了鍵盤中斷如果有鍵盤中斷(當你按下ctrl+c), 退出程式並清理

列印("清理!")

Gpio. 清理()

· 查看原文 · 為此翻譯評分


 

全不選 發文排行