40823201-cd2021

  • Home
    • Site Map
    • reveal
    • blog
  • About
  • Stage1-bg9
    • W1-討論主題
    • W2-繪製
    • W3-修改
    • W4-報告
  • Stage2-bg11
    • W6-討論主題
    • W7-繪製
    • W8-模擬
    • W9-報告
  • Stage3-bg2
    • W9-IPv4
      • ipv4操作
    • W10-討論主題
      • bg2-W10進度
    • W11-OBS
      • bg2-W11進度
    • W12-直播
      • bg2-W12進度
      • task2-RemoteApi
    • W13-遠距討論
      • bg2-W13進度
    • W14&W15-RemoteApi
      • bg2-W14&W15進度
      • task3-RoboDK
      • RemoteApi影片
    • W16-Exam
      • gogs及Fossil建立
      • Onshape建立
    • W17-報告
  • Problems&Notes
    • 網頁404
    • 無法Push
    • 更改Site Title
    • 查看ip位置
  • w5
RemoteApi影片 << Previous Next >> gogs及Fossil建立

W16-Exam

所有檔案皆可在W16中下載

40823214教學

1.利用Onshape繪製MTB_Robot的零組件

零件繪製 / 零件下載

-------------------------------------------------------------------------------------------------------

2.建立CoppeliaSim 4.1.0 MTB robot 場景&末端加入Force sensor及suction pad

將繪製好的零件匯入CoppeliaSim中,完成軸的連接以及零件之間的子母關係。

檔案下載

-------------------------------------------------------------------------------------------------------

3.逆向運動學函式

角度計算公式參考40823214

迴圈檔案下載

function moving(x,y)
   a=0.4
   b=0.4
   c=math.pow((math.pow(x,2)+math.pow(y,2)),0.5)
   s=(a+b+c)/2   //海龍公式
   area=math.pow((s*(s-a)*(s-b)*(s-c)),0.5)
   h=2*area/c
   deg1_base=math.atan(x/y)
   if x<0 and y<0 then
       deg1_base=deg1_base+math.pi   //使角度落於180-270之間
   end
   deg1_tri=math.asin(h/a)
   deg1=deg1_base+deg1_tri
   deg2=math.pi-(0.5*math.pi-deg1_tri)-math.acos(h/b)
   deg3=deg2-deg1
   sim.setJointTargetPosition(joint01,deg1)
   sim.setJointTargetPosition(joint02,-deg2)
   sim.setJointTargetPosition(joint03,deg3)
end


function sysCall_threadmain()
    joint01=sim.getObjectHandle('joint1')   //定義軸的名稱
    joint02=sim.getObjectHandle('joint2')
    joint03=sim.getObjectHandle('joint3')
    jointz=sim.getObjectHandle('jointz')
    sim.setJointTargetPosition(joint01,0)   //定義軸的初始位置
    sim.setJointTargetPosition(joint02,0)
    sim.setJointTargetPosition(joint03,0)
    sim.setJointTargetPosition(jointz,0)
    sim.setIntegerSignal("pad_switch",1)   //給吸盤高電位
    sim.setJointTargetPosition(jointz,-0.04)   //移動至-0.4
    sim.wait(3)   //等待3秒
    sim.setJointTargetPosition(jointz,0)   //回到初始位置
    while sim.getSimulationState()~=sim.simulation_advancing_adouttostopre do
        moving(0.2,0.7)
        sim.wait(3)
        sim.setIntegerSignal("pad_switch",0)   //給吸盤低電位
        sim.wait(3)
        sim.setIntegerSignal("pad_switch",1)
        sim.setJointTargetPosition(jointz,-0.04)
        sim.wait(3)
        sim.setJointTargetPosition(jointz,0)
        sim.wait(3)
        moving(-0.3,-0.55)   //移動至(-0.3,-0.55)
        sim.wait(3)
        sim.setIntegerSignal("pad_switch",0)
        sim.wait(3)
        sim.setIntegerSignal("pad_switch",1)
        sim.setJointTargetPosition(jointz,-0.04)
        sim.wait(3)
        sim.setJointTargetPosition(jointz,0)
        sim.wait(3)
    end
end

-------------------------------------------------------------------------------------------------------

4.利用RemoteApi控制機械手臂

RemoteApi下載

import sim as vrep
import math
import random
import time
import math

def moving(x,y):
a=0.4
b=0.4
c=math.pow((math.pow(x,2)+math.pow(y,2)),0.5)
s=(a+b+c)/2
area=math.pow((s*(s-a)*(s-b)*(s-c)),0.5)
h=area/(2*c)
deg1_base=math.atan(x/y)
if x<0 and y<0 :
deg1_base=deg1_base+math.pi
deg1_tri=math.asin(h/a)
deg1=deg1_base+deg1_tri
deg2=math.pi-(0.5*math.pi-deg1_tri)-math.acos(h/b)
deg3=deg2-deg1
vrep.simxSetJointTargetPosition(clientID,joint01,deg1,opmode)
vrep.simxSetJointTargetPosition(clientID,joint02,-deg2,opmode)
vrep.simxSetJointTargetPosition(clientID,joint03, deg3,opmode)
print ('Start')

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID != -1:
print ('Connected to remote API server')

res = vrep.simxAddStatusbarMessage(
clientID, "40823201 ",
vrep.simx_opmode_oneshot)
if res not in (vrep.simx_return_ok, vrep.simx_return_novalue_flag):
print("Could not add a message to the status bar.")


opmode = vrep.simx_opmode_oneshot_wait
STREAMING = vrep.simx_opmode_streaming


vrep.simxStartSimulation(clientID, opmode)
ret,joint01=vrep.simxGetObjectHandle(clientID,"joint1",opmode)
ret,joint02=vrep.simxGetObjectHandle(clientID,"joint2",opmode)
ret,joint03=vrep.simxGetObjectHandle(clientID,"joint3",opmode)
ret,jointz=vrep.simxGetObjectHandle(clientID,"jointz",opmode)

vrep.simxSetJointTargetPosition(clientID,joint01,0,opmode)
vrep.simxSetJointTargetPosition(clientID,joint02,0,opmode)
vrep.simxSetJointTargetPosition(clientID,joint03,0,opmode)
vrep.simxSetIntegerSignal(clientID,"pad_switch",1,opmode)
vrep.simxSetJointTargetPosition(clientID,jointz,-0.04,opmode)
time.sleep(1)
vrep.simxSetJointTargetPosition(clientID,jointz,0,opmode)
while True:
moving(0.2,0.7)
time.sleep(1)
vrep.simxSetIntegerSignal(clientID,"pad_switch",0,opmode)
time.sleep(1)
vrep.simxSetIntegerSignal(clientID,"pad_switch",1,opmode)
vrep.simxSetJointTargetPosition(clientID,jointz,-0.04,opmode)
time.sleep(1)
vrep.simxSetJointTargetPosition(clientID,jointz,0,opmode)
moving(-0.3,-0.55)
time.sleep(1)
vrep.simxSetIntegerSignal(clientID,"pad_switch",0,opmode)
time.sleep(1)
vrep.simxSetIntegerSignal(clientID,"pad_switch",1,opmode)
vrep.simxSetJointTargetPosition(clientID,jointz,-0.04,opmode)
time.sleep(1)
vrep.simxSetJointTargetPosition(clientID,jointz,0,opmode)

-------------------------------------------------------------------------------------------------------

5.利用keyboard操控機械手臂

鍵盤檔案下載

按鍵代碼參考40823214

function sysCall_init()
    joint01=sim.getObjectHandle('joint1')
    joint02=sim.getObjectHandle('joint2')
    joint03=sim.getObjectHandle('joint3')
    jointz=sim.getObjectHandle('jointz')
    sim.setJointTargetPosition(joint01,0)   //定義軸的名稱
    sim.setJointTargetPosition(joint02,0)
    sim.setJointTargetPosition(joint03,0)
    sim.setJointTargetPosition(jointz,0)
    deg1=0   //定義初始角度為0
    deg2=0
    zhing=false
    pad=false
end
 
function sysCall_actuation()
     message,auxiliaryData=sim.getSimulatorMessage()
    while message~=-1 do
        if (message==sim.message_keypress) then
            if (auxiliaryData[1]==119) then   //W=119
            deg1=deg1+1
            sim.setJointTargetPosition(joint01,deg1*math.pi/180)   //將角度換算成徑度
            end
            if (auxiliaryData[1]==115) then   //S=115
            deg1=deg1-1   //角度縮小
            sim.setJointTargetPosition(joint01,deg1*math.pi/180)
            end
            if (auxiliaryData[1]==97) then   //A=97
            deg2=deg2+1   //角度加大
            sim.setJointTargetPosition(joint02,deg2*math.pi/180)
            end
            if (auxiliaryData[1]==100) then   //D=100
            deg2=deg2-1
            sim.setJointTargetPosition(joint02,deg2*math.pi/180)
            end
            if (auxiliaryData[1]==2008) then   //方向鍵-下=2008
                sim.setJointTargetPosition(jointz,-0.4)   //使吸盤至-0.4
                sim.setIntegerSignal("pad_switch",1)   //給吸盤高電位
            end
            if (auxiliaryData[1]==2007) then   //方向鍵-上=2007
                sim.setJointTargetPosition(jointz,0)   //使吸盤至0
                sim.setIntegerSignal("pad_switch",1)
            end
            if (auxiliaryData[1]==32) then   //Tab=32
                sim.setIntegerSignal("pad_switch",0)   //給吸盤低電位
            end
            sim.setJointTargetPosition(joint03,(deg2-deg1)*math.pi/180)
        end
    message,auxiliaryData=sim.getSimulatorMessage()
    end
end

-------------------------------------------------------------------------------------------------------

心得:

這次的期末作業讓我確實的接觸到了CoppeliaSim,因為在這之前,模擬的部分都不是我負責的,頂多使用RemoteApi操控作業,所以都不能了解CoppeliaSim的操作,不過經過這次,我也了解到為什麼大家都說用完CoppeliaSim後發現英文的重要性,很感謝之前有認真學英文的我,在首次接觸到CoppeliaSim的情況下,沒什麼困難(還是有些沒看過的單詞,但是會去查),除了字太小以外...這學期首先要感謝的不外乎是老師的指導,也很感謝40823217(從Stage1到Stage3都跟我一組的組長)願意幫助我及指導我,以及40823210同學願意讓我把我高中的小願望當成主題,更精緻更完善的畫出來,還有感謝40823214同學的影片指導,讓我在程式方面較為熟悉。祝大家平平安安,去去疫情走!


RemoteApi影片 << Previous Next >> gogs及Fossil建立

Copyright © All rights reserved | This template is made with by Colorlib