MỤC LỤC 
 
I. Giới thiệu chung 3 
 
II. Tổng quan về kỹ thuật tái hiện ngược và những vấn đề cơ bản về mô 
 phỏng các đường cong, mặt cong không gian 7 
2.1. Giới thiệu chung về kỹ thuật tái hiện ng-ợc 7 
2.1.1. Quá trình thiết kế 7 
2.1.2. Quá trình “sản xuất ng-ợc” 8 
2.1.3. Quá trình kỹ thuật tái hiện ng-ợc 8 
2.1.4. ứng dụng kỹ thuật tái hiện ng-ợc 9 
2.1.5. Các loại đầu dò số hóa 10 
 2.1.6. Các máy đo phục vụ kỹ thuật tái hiện ng-ợc 11 
2.2. Ph-ơng pháp mô tả đ-ờng cong trên máy tính 14 
 2.2.1. Các phép nội suy và xấp xỉ đ-ờng cong 14 
2.3. Ph-ơng pháp mô tả các mặt cong trên máy tính 31 
 2.3.1. Giới thiệu chung về mặt cong 31 
2.3.2. Các mặt cong tự do 32 
2.4. Đặt vấn đề về nội dung nghiên cứu 37 
 
III. Nghiên cứu thiết kế, chế tạo Robot RE 38 
3.1. Nghiên cứu thiết kế, chế tạo Robot RE 38 
3.1.1. Giới thiệu chung 38 
3.1.2. Động học Robot RE-01 42 
3.1.3. Ch-ơng trình tính toán động học Robot RE-02 43 
3.1.4. Hệ ph-ơng trình động học của robot RE-01 44 
3.1.5. Ph-ơng án chế thử Robot RE-01 55 3.2. Thiết kế Robot RE - 02 56 
3.2.1. Phân tích kết cấu 56 
3.2.2. Thiết kế cơ cấu dạng pantograph 57 
3.2.3. Tính toán cơ cấu tay máy pantograph 58 
3.3. Tính toán về độ chính xác của robot RE - 02 73 
3.3.1. Tổng quan về sai số phép đo dùng cơ cấu tay đo 73 
3.3.2. Tính toán sai số của robot RE 74 
 
IV. Nghiên cứu, thiết kế, chế tạo Robot RE-03 hoạt động theo tọa độ trụ 81 
4.1. Giới thiệu chung 81 
4.2. Các môđun hợp thành Robot RE-03 82 
 
V. Xây dựng các ch-ơng trình phần mềm tái hiện bề mặt cong không gian 100
5.1. Cơ sở thuật toán xây dựng các đ-ờng cong và mặt cong không gian 100
5.1.1. Các thuật toán xây dựng đ-ờng cong 100
5.1.2. Ph-ơng pháp xác định điểm tựa và l-u trữ dữ liệu của đ-ờng cong 104
5.1.3. Một số ví dụ tái hiện đ-ờng cong 105
5.1.4. Một số kết quả tái hiện đ-ờng cong đ-ợc thực hiện bằng robot RE 107
5.2. Cơ sở thuật toán xây dựng mặt cong không gian 109
5.3. Thuật toán quả bóng rơi 123
5.4. Xây dựng ch-ơng trình máy tính 127
5.5. Ch-ơng trình phần mềm tái hiện các bề mặt cong phức tạp 133
 
VI. Kết luận 143
 
Tài liệu tham khảo 145
                
              
                                            
                                
            
 
            
                 153 trang
153 trang | 
Chia sẻ: banmai | Lượt xem: 2013 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang tài liệu Nghiên cứu thiết kế, chế tạo các robot thông minh phục vụ cho các ứng dụng quan trọng - Nhóm sản phẩm ROBOT RE, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ng n÷a ®ã lµ sai sè do gia 
c«ng chÕ t¹o. C¬ cÊu cµng phøc t¹p th× ®é chÝnh x¸c gia c«ng cµng thÊp, 
nhÊt lµ trong ®iÒu kiÖn kinh tÕ vµ kü thuËt cña n−íc ta. 
 Víi c¬ cÊu b×nh hµnh pantograph ta thÊy xuÊt hiÖn nh÷ng nguyªn 
nh©n g©y nªn sai sè nh−: 
- Sai sè c¸c kÝch th−íc ®éng häc vÝ dô nh− sai sè vÒ kÝch th−íc c¸c c¹nh 
h×nh b×nh hµnh. 
- Sai sè vÒ kho¶ng dÞch chuyÓn cña c¸c con tr−ît E, C trong ®ã bao gåm sai 
sè bé truyÒn b¸nh r¨ng – thanh r¨ng (con tr−ît). 
Sau ®©y ta ®i tÝnh to¸n c¸c sai sè cña robot RE. 
3.3.2.3- TÝnh to¸n sai sè. 
 C¬ cÊu thay thÕ. 
 Víi nguyªn nh©n g©y nªn sai sè thø nhÊt ®· nªu, ®ã lµ sai sè vÒ kÝch 
th−íc ®éng häc cña c¬ cÊu b×nh hµnh. §Ó thuËn tiÖn cho viÖc tÝnh sai sè vÒ 
c¬ cÊu nµy ta cã thÓ thay thÕ b»ng mét c¬ cÊu hë t−¬ng ®−¬ng. Nguyªn t¾c 
thay thÕ t−¬ng ®−¬ng cã thÓ ®−îc hiÓu lµ: c¬ cÊu thay thÕ cã miÒn lµm viÖc 
t−¬ng ®−¬ng víi miÒn lµm viÖc cña c¬ cÊu ®−îc thay thÕ. Trªn nguyªn t¾c 
 76
®ã ë ®©y ta sÏ thay thÕ c¬ cÊu b×nh hµnh b»ng mét c¬ cÊu hë cã 3 tay quay 
(h×nh 3.15) vµ ®i xÐt sai sè cña c¬ cÊu thay thÕ nµy. 
 Sai sè cña mét tay quay (h×nh 3..3.17) 
XÐt mét tay quay víi chiÒu dµi l ë vÞ trÝ cã gãc quay ϕ. NÕu sai sè gãc quay 
lµ ∆ϕ th× sai sè cña ®Çu tay quay lµ mét ®¹i l−îng ∆l ≈ l. ∆ϕ 
 ChiÕu sai sè lªn trôc x ta cã: 
∆x = l.cos(ϕ + ∆ϕ) – l.cosϕ = l(cos(ϕ + ∆ϕ) – cosϕ) ≈ l. sinϕ. ∆ϕ (3.46) 
 Chia hai vÕ cho ∆ϕ ta cã: 
∆x/∆ϕ = l.sinϕ hay x’ϕ = l.sinϕ 
 ChiÕu sai sè lªn trôc y ta cã: 
∆y = l.sin(ϕ + ∆ϕ) – l.sinϕ = l(sin(ϕ + ∆ϕ) – sinϕ) ≈ l. cosϕ. ∆ϕ (3.47) 
 Chia hai vÕ cho ∆ϕ ta cã: 
∆y/∆ϕ = l.cosϕ hay y’ϕ = l.cosϕ 
 H×nh 3.3.17 
HoÆc ta cã thÓ viÕt l¹i nh− sau: 
 ϕϕ ∆∂
∂=∆ xx ; ϕϕ ∆∂
∂=∆ yy (3.48) 
 Sai sè do mçi tay quay g©y nªn cã gi¸ trÞ kh«ng ®æi l. ∆ϕ. Khi tæ hîp 
x 
y 
ϕ
∆ϕl 
A 
O 
 77
nhiÒu tay quay, v× mçi tay quay ë c¸c vÞ trÝ kh¸c nhau nªn sai sè chiÕu lªn 
c¸c ph−¬ng kh¸c nhau vµ tæ hîp c¸c sai sè phô thuéc vÞ trÝ c¸c tay quay, tøc 
lµ phô thuéc vµo gãc gi÷a c¸c tay quay víi c¸c trôc. 
Sai sè cña hÖ hai tay quay. 
 XÐt hai tay quay trong mÆt ph¼ng víi chiÒu dµi l1 , l2 t−¬ng øng cã vÞ 
trÝ ϕ1 , ϕ2 (h×nh 3.3.18) 
 H×nh 3.3.18 
C¸c h×nh chiÕu cña ®iÓm cuèi trªn c¸c trôc lµ: 
x = l1cosϕ1 + l2cosϕ2 (3.49) 
y = l1sinϕ1 + l2sinϕ2 (3.50) 
 2
2
1
1
ϕϕϕϕ ∆∂
∂+∆∂
∂=∆ xxx (3.51) 
2
2
1
1
ϕϕϕϕ ∆∂
∂+∆∂
∂=∆ yyy (3.52) 
∆x = -l1 sinϕ1∆ϕ1 - l2 sinϕ2∆ϕ2 (3.53) 
∆y = l1 cosϕ1∆ϕ1 - l2 cosϕ2∆ϕ2 (3.54) 
 Sai sè cña c¬ cÊu lµ: 22 yx ∆+∆=∆ (3.55) 
y 
x
l 1 
l
2
ϕ1
ϕ2
O 
A
B
 78
Trong biÓu thøc trªn ta thÊy l1 , l2 , ∆ϕ1 , ∆ϕ2 lµ nh÷ng ®¹i l−îng ®· 
biÕt tr−íc. Khi ϕ1 , ϕ2 thay ®æi th× ∆x , ∆y thay ®æi. 
 Sai sè lín nhÊt t¹i c¸c ®iÓm øng víi vÞ trÝ ϕ1 = ϕ2 , tøc lµ c¸c tay quay 
cïng n»m trªn mét ®−êng th¼ng. 
Sai sè cña hÖ ba tay quay. 
 XÐt tr−êng hîp ba tay quay l1 , l2 , l3 t−¬ng øng cã vÞ trÝ ϕ1 , ϕ2 , ϕ3 
(h×nh 3.15) 
H×nh 3.3.19 
x = l1cosϕ1 + l2cosϕ2+ l3cosϕ3 (3.56) 
y = l1sinϕ1 + l2sinϕ2+ l3sinϕ3 (3.57) 
 3
3
2
2
1
1
ϕϕϕϕϕϕ ∆∂
∂+∆∂
∂+∆∂
∂=∆ xxxx (3.58) 
3
3
2
2
1
1
ϕϕϕϕϕϕ ∆∂
∂+∆∂
∂+∆∂
∂=∆ yyyy (3.59) 
∆x = -l1 sinϕ1∆ϕ1 - l2 sinϕ2∆ϕ2 - l3sinϕ3∆ϕ3 (3.60) 
∆y = l1 cosϕ1∆ϕ1 - l2 cosϕ2∆ϕ2 + l3cosϕ3∆ϕ3 (3.61) 
 Sai sè cña c¬ cÊu lµ: 22 yx ∆+∆=∆ (3.62) 
ϕ1
l 1
x
ϕ2
2
l
y
ϕ3
l3
O
A
B
C
 79
Sai sè lín nhÊt t¹i c¸c ®iÓm øng víi vÞ trÝ ϕ1 = ϕ2 = ϕ3 , tøc lµ c¸c tay 
quay cïng n»m trªn mét ®−êng th¼ng. 
 ∆ = l1 ∆ϕ1 + l2 ∆ϕ2 + l3 ∆ϕ3 (3.63) 
 Sai sè cña c¬ cÊu pantograph 
XÐt c¬ cÊu pantograph (h×nh 3.16) víi hai con tr−ît E, C theo c¸c 
ph−¬ng y vµ z. HÖ sè khuyÕch ®¹i cña c¬ cÊu lÇn l−ît lµ KY vµ KZ , KZ = 
1+KY. Gäi sai sè dÞch chuyÓn cña hai con tr−ît lµ ∆E , ∆C . Ta tÝnh sai sè cña 
®iÓm cuèi M : ∆M 
H×nh 3.3.20 
 Tr−êng hîp chØ riªng con tr−ît E di chuyÓn, khi ®ã ®iÓm M sÏ di 
chuyÓn theo ph−¬ng y vµ gäi sai sè cña M lµ ∆Y , ta cã quan hÖ gi÷a kho¶ng 
dÞch chuyÓn cña ®iÓm cuèi M (SMY) vµ kho¶ng tr−ît cña E (SE) nh− sau: 
 SM + ∆Y = KY(SE + ∆E) 
Nh− vËy ∆Y = KY ∆E 
 Tr−êng hîp chØ riªng con tr−ît C di chuyÓn, khi ®ã ®iÓm M sÏ di 
chuyÓn theo ph−¬ng z vµ gäi sai sè cña M lµ ∆Z , ta cã quan hÖ gi÷a kho¶ng 
dÞch chuyÓn cña ®iÓm cuèi M (SMZ) vµ kho¶ng tr−ît cña C (SC) nh− sau: 
 SMZ + ∆Z = KZ(SC + ∆C) (3.65) 
Nh− vËy ∆Z = KZ ∆C = (1+KY )∆C 
E 
Sc
S 
E 
C 
y
z
M
 80
 NÕu ®ång thêi c¶ hai con tr−ît ®Òu di chuyÓn th× sai sè theo mçi 
ph−¬ng vÉn lµ ∆Y , ∆Z ®−îc tÝnh nh− trªn, do vËy sai sè tæng cña M sÏ lµ: 
 22 ZYM ∆+∆=∆ (3.66) 
 81
IV. Nghiªn cøu, thiÕt kÕ, l¾p r¸p Robot re – 03 ho¹t ®éng 
theo täa ®é trô 
4.1. Giíi thiÖu chung 
 Môc tiªu NhiÖm vô 3 cña §Ò tµi lµ vËn dông c¸c ph−¬ng ph¸p cña 
robotics (khoa häc c«ng nghÖ robot) ®Ó nghiªn cøu vÒ CMM (m¸y ®o täa 
®é) hoÆc PCMM (m¸y ®o täa ®é x¸ch tay). Con ®−êng ph¸t triÓn c¸c thiÕt bÞ 
nµy kh«ng chØ lµ biÖn ph¸p n©ng cao ®é chÝnh x¸c chÕ t¹o mµ cßn ®Æc biÖt 
quan t©m ®Õn ph−¬ng ph¸p suy luËn, xö lý, bï trõ b»ng c¸c phÇn mÒm kÌm 
theo. Néi dung nghiªn cøu ë c¸c phÇn trªn ®©y chøng tá r»ng c¶ hai con 
®−êng nãi trªn ®Òu cã vai trß quan träng, ®Æc biÖt lµ con ®−êng thø nhÊt. Sù 
ch−a thµnh ®¹t cña c¶ 2 ph−¬ng ¸n Robot RE-01 vµ Robot RE-02 lµ bµi häc 
rót ra tõ thùc tÕ, r»ng chÕ t¹o c¸c thiÕt bÞ liªn quan ®Õn ®o l−êng ph¶i cã c¶ 
mét “hËu ph−¬ng” c«ng nghiÖp hïng m¹nh. 
 Ph−¬ng ¸n thø 3, Robot RE-03 ra ®êi xuÊt ph¸t tõ ý thøc muèn kh¾c 
phôc c¸c khã kh¨n trªn, nh−ng l¹i lµ mét ®Ò xuÊt míi. ThËt vËy, Robot RE-
03 ho¹t ®éng theo täa ®é trô Z = Z (r, ϕ) víi 3 m«®un thiÕt bÞ: M«®un t¹o 
gãc quay ϕ; M«®un t¹o ®é di chuyÓn r h−íng t©m quay; M«®un t¹o ®é di 
chuyÓn theo trôc Z. C¶ 3 m«®un nµy cã thÓ chän lùa tõ c¸c thiÕt bÞ ®o l−êng 
chuÈn hãa do c¸c h·ng cã th−¬ng hiÖu næi tiÕng s¶n xuÊt víi ®é chÝnh x¸c 
vµ tin cËy cao. C¸c m¸y ®o täa ®é CMM hoÆc PCMM ®Òu ch−a cã lo¹i nµo 
ho¹t ®éng theo täa ®é trô c¶, trong lóc cã nhiÒu bÒ mÆt cong nÕu ®−îc ghi 
®o theo täa ®é trôc th× rÊt thuËn tiÖn vµ gi¶m thiÓu ®−îc sè ®iÓm ®o. 
 ¦u ®iÓm næi tréi cña viÖc t¹o dùng Robot RE-03 lµ gi¸ thµnh thÊp 
xuèng rÊt nhiÒu lÇn so víi viÖc nhËp ngo¹i c¸c lo¹i thiÕt bÞ CMM hoÆc 
PCMM. 
 82
 §Ò tµi ®· t¹o ra ®−îc 1 mÉu m¸y ®o theo täa ®é trô mang tªn Robot 
RE-03, mÆc dÇu kh«ng ph¶i víi môc ®Ých ®Ó ®o l−êng, mµ lµ thiÕt bÞ sè hãa 
(Digitizing Systems) ®Ó t¸i hiÖn c¸c bÒ mÆt cong, nh−ng cã ®é chÝnh x¸c vµ 
®é tin cËy cao v× phô thuéc chñ yÕu vµo 3 m«®un thiÕt bÞ chuÈn hãa nhËp 
ngo¹i. 
 Ngoµi 3 m«®un thiÕt bÞ chñ yÕu nãi trªn Robot RE-03 cßn cã bé phËn 
thiÕt bÞ ®iÖn tö ®Ó thu nhËn, chuyÓn ®æi c¸c tÝn hiÖu ®o tõ c¸c m«®un nãi 
trªn thµnh c¸c sè liÖu ®Çu vµo cña ch−¬ng tr×nh phÇn mÒm, xö lý c¸c sè liÖu 
nhËn ®−îc tõ c¸c ®iÓm ®o, råi t¸i hiÖn ra bÒ mÆt cong ®ang ®−îc kh¶o s¸t. 
 Víi nh÷ng giao diÖn t−¬ng øng ®−îc thiÕt lËp Robot RE-03 hßan toµn 
cã thÓ sö dông c¸c ch−¬ng tr×nh phÇn mÒm t¸i hiÖn c¸c bÒ mÆt cong kh«ng 
gian do §Ò tµi tù x©y dùng vµ dïng chung cho nhiÒu thiÕt bÞ CMM vµ 
PCMM kh¸c. 
 V× thÕ d−íi ®©y chØ giíi thiÖu nh÷ng phÇn dµnh riªng cho Robot RE-
03 . Ch−¬ng tr×nh phÇn mÒm t¸i hiÖn mÆt cong vµ nh÷ng bé phËn cã chung 
trong c¸c thiÕt bÞ CMM hoÆc PCMM kh¸c ®· ®−îc tr×nh bµy ë c¸c môc trªn. 
4.2. C¸c m«®un hîp thµnh Robot RE-03 
4.2.1. M«®un quay ϕ 
 83
H×nh 3.4.1. B¶n vÏ M«®un t¹o gãc quay ϕ 
T? l?:S? lu?ng: B?n v? s?:
 ROBOT RE-03
V?t li?u: thép CT5
Đ? tài KC - 03 - 08
 Trung tâm NCKT T? d?ng hóa
Tru?ng Đ?i h?c Bách Khoa Hà N?i
Ký Ngày
T.V.H.SON
H? và tên
Nguy?n Van Minh
Nguy?n Thi?n Phúc
Thi?t k?
Tr. nhi?m
Ki?m tra
Duy?t
Ø250
Modun góc quay 
 84
H×nh 3. 4.2. ¶nh chôp M«®un quay ϕ 
 85
B¶ng th«ng sè kü thuËt cña M«®un quay ϕ 
§−êng kÝnh m©m quay: 250 mm 
V¹ch chia ®é: 360' víi ®é ph©n d¶i 1' 
Dung sai: 0,05 mm 
Tèc ®é quay: 3'30 s mét vßng quay 
§éng c¬: 24VDC, 20W 
 88
H×nh 3.4.3. ¶nh chôp m«®un dÞch chuyÓn theo trôc z 
Th«ng sè kü thuËt ®Çu ®o: 
Linear Gauge LGE-1025 (Mitutoyo) 
D¶i do: 25mm 
§é ph©n d¶i: 5µm 
§é chÝnh x¸c lÆp l¹i: 20µm 
Lùc ®Çu ®o: - khi ®i xuèng: 4,6 N 
- khi ®i ngang: 4,3N 
- Khi ®i lªn: 4,0 N 
Ph−¬ng ph¸p x¸c ®Þnh vÞ trÝ ®o: Bé gi¶i m· tuyÕn tÝnh t¨ng dÇn biÕn tô 
tÜnh 
Tèc ®é ®¸p øng ®o: - TÜnh: 1,4 m/gi©y 
- §éng: 17,5 m/gi©y 
TÝn hiÖu ra: LÖch pha 900, Kho¶ng c¸ch s−ên tÝn 
hiÖu ra t−¬ng ®−¬ng 20µm 
KÝch th−íc ®Çu tiÕp ®iÓm ®o: φ 3 mm, mÆt cÇu, b»ng carbit 
æ ®ì: æ bi cÇu 
ChiÒu dµi c¸p tÝn hiÖu ra: 2 mÐt 
NhiÖt ®é m«i tr−êng lµm viÖc: 0 - 400C 
 90
H×nh 3.3.4. ¶nh chôp m«®un dÞch chuyÓn theo trô Z 
Th«ng sè kü thuËt th−íc ®o cao hiÖn sè: 
Series 192-655 (Mitutoyo) 
HiÓn thÞ sè: LCD 
D¶i do: 0 - 600 mm 
§é ph©n d¶i: 0,01 m 
§é chÝnh x¸c: ± 0,04 
Chøc n¨ng: ®Æt ®iÓm 0, cã c«ng t¾c chuyÓn ®æi chÕ 
®é ®o tuyÖt ®èi-t−¬ng ®èi 
D÷ liÖu ra: SPC 
Nguån ®iÖn: 3 pin 1,5V 
Tèc ®é ®¸p øng lín nhÊt: kho¶ng 500 mm/gi©y 
B¸o ®éng: nguån pin yÕu 
NhiÖt ®é m«i tr−êng lµm viÖc: 0 - 400C 
Träng l−îng: 9,5 kg 
 91
4.2.4. Hép ®iÒu khiÓn vµ giao diÖn víi m¸y tÝnh 
S¬ ®å hÖ thèng ®iÒu khiÓn cña Robot RE
 Bé ®Öm 
c«ng suÊt
Bé ®Öm
RS 232
Bµn phÝm 
®iÒu khiÓn
§Çu ®o
Bé khuÕch 
 ®¹i c«ng 
 suÊt
KĐ ®Öm Encoder
 do gãc
Nguån cung 
 cÊp
24MHz
Quay tr¸i
Quay ph¶i
Đo dßng
P3.0
P3.1
P1
P3.2
P3.4
B
é V
X
L A
T
89C
52
P0
XTAL1
XTAL2
P2.
P2.
P2.
P3.3 P3.5
 §éng c¬
 quay m©m
 cÆp
out
+5v
out
+24v
 - 24V +
HiÓn thÞ gi¸ trÞ ®o
H×nh 3.4.5. S¬ ®å hÖ thèng ®iÒu khiÓn cña Robot RE 
 92
H×nh 3.4.6. ¶nh chôp hép ®iÒu khiÓn 
B¶ng th«ng sè kü thuËt 
Th«ng sè kü thuËt bé gi¶i m∙: 
Rotary Encorder Incremental E6B2-CWZ6C (OMRON - 06802) 
§é ph©n d¶i: 1000 xung/vßng 
D©y mµu vµng 24VDC 
D©y mµu xanh: 0V 
D©y mµu n©u: GND 
D©y mµu ®en: OUT A 
D©y mµu tr¾ng: OUT B 
D©y mµu da cam: OUT Z 
 95
4.2.5. L¾p r¸p, vËn hµnh Robot RE-03 
H×nh 3.4.8. Dïng Robot RE-03 ®Ó t¸i hiÖn bÒ mÆt “phom” dµy 
H×nh 3.4.9. C¸c kÕt qu¶ t¸i hiÖn bÒ mÆt “phom” dµy 
 96
H×nh 3.9.10. Dïng Robot RE-03 ®Ó t¸i hiÖn bÒ mÆt t−îng “con c¸ heo” 
H×nh 3.9.11. T¸i hiÖn bÒ mÆt t−îng “con c¸ heo” 
 97
H×nh 3.9.12. Dïng Robot RE-03 ®Ó t¸i hiÖn bÒ mÆt lä hoa kh«ng ®èi xøng 
H×nh 3.9.13. KÕt qu¶ t¸i hiÖn bÒ mÆt lä hoa kh«ng ®èi xøng 
 98
V. XÂY DỰNG CÁC CHƯƠNG TRÌNH PHẦN MỀM TÁI HIỆN BỀ 
MẶT CONG KHÔNG GIAN 
5.1. C¬ së thuËt to¸n x©y dùng c¸c ®−êng cong vµ mÆt cong kh«ng gian 
5.1.1. Các thuật toán xây dựng đường cong 
1. Giải thuật xây dựng đường cong Hermite 
Procedure Hermite_Curve() 
# §©y lµ gi¶i thuËt x©y dùng ®−êng cong Hermite 
# M4x4 lµ ma trËn Hermite 
# G4x1 lµ ma trËn hÖ sè h×nh häc 
# t1x4 ma trËn c¸c tham sè 
# P ®iÓm tÝnh to¸n trªn ®−êng cong 
begin 
 Khëi t¹o ma trËn M 
 ®äc c¸c hÖ sè h×nh häc Herrmite; to¹ ®é ®iÓm cuèi 
 vµ c¸c vÐct¬ tiÕp tuyÕn t¹i c¸c ®iÓm cuèi 
 for t = 0 to 1 insteps of 0.05 do 
khëi t¹o ma trËn [t] víi c¸c gi¸ trÞ hiÖn 
thêi 
P = t*M*G # PhÐp nh©n ma trËn chuÈn 
 if P(t) lµ ®iÓm b¾t ®Çu then 
 Move_to(P) 
 else Draw_to(P) 
 next t 
 return 
 99
end. 
2.Gi¶i thuËt x©y dùng ®−êng cong Bezier. 
Procedure Bezier_Curve() 
# §©y lµ gi¶i thuËt x©y dùng ®−êng cong bezier 
# n+1 sè l−îng c¸c ®iÓm ®iÒu khiÓn 
# Pi ®iÓm ®iÒu khiÓn thø i cã c¸c to¹ ®é lµ x, y, 
z lµ (Pix, Piy, Piz) 
begin 
 for i = 0 to n do 
 ®äc ®iÓm ®iÒu khiÓn Pi 
 next i 
 for t = 0.0 to 1.0 insteps of 0.05 do 
 x = y = z = 0.0 
 for i = 0 to n do 
 B = Blend (i, n, t) 
 x = x + Pix*B 
 y = y + Piy*B 
 z = z + Piz*B 
 next i 
 if (x, y, z) lµ ®iÓm b¾t ®Çu 
 then 
 Move_to (x, y, z) 
 else 
 Draw_to (x, y, z) 
 endif 
 next t 
 return 
end 
function blend (i, n, t) 
 100
begin 
 blend= giaithua (n)/giaithua (i)*giaithua (n-i) 
 blend=blend*(t)i * ((1-t)n-1) 
 return (blend) 
end 
3. Ch−¬ng tr×nh con x©y dùng ®−êng cong néi suy spline bËc 3. 
function p =fun3d(pp,step); 
%chuong trinh nay se su dung phuong phap noi suy duong cong 
%spline bac 3 tu nhien (phuong trinh 1.19) de thiet lap 
duong cong 
%di qua cac vecto diem 3 chieu 
if step>0 & step<1 & (mod(1,step)==0) 
[r,c]=size(pp); 
%ma tran he so cua 1.19 
v=linspace(1,1,r-1); 
triu=diag(v,1); 
tril=diag(v,-1); 
trim=4*eye(r); 
trim(1,1)=2; 
trim(r,r)=2; 
mt=triu+tril+trim; 
%ma tran nghich dao cua m4t 
mt_1=inv(mt); 
%ma tran ve phai cua 1.19 
for i=2:(r-1) 
 g(i,:)=3*(pp(i+1,:)-pp(i-1,:)); 
 101
end 
g(1,:)=3*(pp(2,:)-pp(1,:)); 
g(r,:)=3*(pp(r,:)-pp(r-1,:)); 
%ma tran cac vector tiep tuyen p' tai cac diem tua 
pt=mt_1*g; 
size(pt); 
%ma tran tham so t(0->1) voi buoc step 
%n la so diem noi suy trong 1 phan doan 
t=0:step:1; 
n=round(1/step)+1; 
%ma tran he so M(const) trong (1.8) 
m=[2 -2 1 1 
 -3 3 -2 -1 
 0 0 1 0 
 1 0 0 0 
]; 
%gk la ma tran G trong (1.8) 
for k=1:(r-1) 
 gk=[pp(k,:); pp(k+1,:); pt(k,:); pt(k+1,:)]; 
for i=1:n 
 ti=[t(i)*t(i)*t(i) t(i)*t(i) t(i) 1]; 
 p(n*(k-1)+i,:)=ti*m*gk; 
end 
end 
%p la ma tran cac diem noi suy 
size(p); 
 102
else 
 helpdlg('Hay nhap lai gia tri buoc (0<step<1 & 
mod(1,step)==0)','Thong bao'); 
end 
5.1.2. Phương pháp xác định điểm tựa và lưu trữ dữ liệu của đường cong 
 Để lấy toạ độ các điểm nội suy của một đường cong không gian trước 
tiên ta phải vạch ra đường cong đó (các điểm nội suy đó ta gọi là điểm tựa). 
Trên đường cong này sẽ đánh dấu các điểm tựa, chúng không cần phải cách 
đều nhau mà mật độ các điểm được đánh dấu sẽ tuỳ thuộc vào độ cong của 
từng phân đoạn trên đường cong đó. Tất nhiên mật độ càng lớn thì chất 
lượng phép nội suy càng cao, nhưng nó sẽ đòi hỏi tài nguyên lưu trữ lớn và 
thời gian xử lý dữ liệu trong chương trình. Vấn đề đặt ra là tối ưu hoá điểm 
tựa này, nghĩa là xác định số điểm tựa nhỏ nhất có thể nhưng vẫn đảm bảo 
được chất lượng của phép nội suy. Các phân đoạn có bán kính cong nhỏ thì 
cần số điểm chia mau hơn và ngược lại với phân đoạn có bán kính cong lớn 
số điểm chia sẽ thưa. Sau khi đánh dấu các điểm tựa ta sẽ tiến hành đánh số 
các điểm đo theo một trật tự nhất định nhằm tránh nhầm lẫn trong quá trình 
đo đạc sau này. Xuấ phát từ điểm đầu tiên của đường cong ta đánh số 1 và 
lần lượt là các số tự nhiên tiếp theo cho các điểm kế tiếp đến điểm cuối 
cùng của đường cong là n. Nếu đường cong khép kín thì điểm cuối cùng n 
sẽ trùng với điểm đầu tiên 1. Quá trình đo toạ độ các điểm tựa bằng robot 
RE sẽ được thực hiện lần lượt từ 1 đến n. Toạ độ của một điểm tựa thứ I 
trong không gian 3 chiều có ba thành phần xi, yi, zi và chúng sẽ được lưu trữ 
trong hàng thứ I của ma trận dữ liệu nội duy của đường cong. Như vậy ma 
trận dữ liệu các điểm tựa của một đường cong sẽ là một ma trận n hàng 3 
cột, n là số điểm tựa, còn 3 là số chiều trong hệ toạ độ Oxyz của một điểm 
tựa. Để thuận tiện cho việc quản lý và lưu trữ, ma trận các điểm tựa của 
đường cong sẽ được ghi vào file dạng text. Chương trình nội đường cong sẽ 
đọc dữ liệu các điểm tựa từ file dữ liệu sau đó tính toán ra các toạ độ nội 
suy trung gian giữa các điểm tựa và vẽ ra đường cong nội suy. Kết quả ma 
 103
trận nội suy của đường cong cũng được xuất ra file dạng text để làm dữ liệu 
cho các chương trình gia công số hoá. 
Hình 3.5.1 
 Sau đây là một số hình ảnh của chương trình máy tính thể hiện giải 
thuật nội suy đường cong spline bậc 3 được xây dựng bằng ngôn ngữ 
MATLAB. 
5.1.3 Một số ví dụ tái hiện đường cong 
1. Ví dụ 
- Nhập vào file dữ liệu các điểm tựa có tên d1.txt với nội dung như sau: 
11 
456 104 125 
428 298 254 
496 483 385 
806 500 481 
1070 357 578 
1294 240 651 
1436 305 742 
1571 479 821 
1735 567 915 
1989 531 1014 
2187 454 1145 
 Dòng đầu tiên chứa một số (11) là số điểm tựa của đường cong nội 
suy. Các dòng còn lại là toạ độ của các điểm tựa đó. 
- Nhập bước nội suy (là một số thực s (0 < s < 1 & 1 : s)), bước này có giá 
trị càng nhỏ thì phép nội suy càng chính xác (ví dụ ở đây ta nhập bước 
nội suy = 0.1). Tuy nhiên giá trị của bước sẽ tỷ lệ nghịch với thời gian 
 104
tính toán của máy cũng như kích thước của file kết quả. Với giá trị bước 
bằng s thì số điểm nội suy giữa 2 điểm tựa kề nhau sẽ là 1/s. 
Hình 3.5.2 
 105
- Sau khi nội suy ta sẽ thu được một ma trận các điểm liên tiếp và rất gần 
nhau (tuỳ thuộc vào bước nội suy) thuộc đường cong. Nối các điểm này lại 
ta sẽ được một đường cong nội suy gần đúng với đường cong thuật. Ta có 
thể lưu trữ ma trận này bằng cách ghi vào file và mô phỏng thông qua các 
đồ thị hình chiếu như trên. 
5.1.4. Một số kết quả tái hiện đường cong được thực hiện bằng robot RE. 
 Như đã biết robot RE sẽ được kết nối với máy tính thông qua một hệ 
thống mạch điện tử và một chương trình phần mềm để đọc tín hiệu xung do 
các encoder phát ra trong quá trình làm việc. Sau đó các xung này sẽ được 
chuyển đổi thành giá trị góc quay và khoảng trượt của các khớp động trong 
cơ cấu. Thông qua các công thức đã được thiết lập và tính toán ở chương 2 
cuối cùng ta sẽ thu được toạ độ (X, Y, Z) của đầu dò robot khi làm việc. 
Sau đây là giao diện kết nối máy tính của robot RE được viết bằng ngôn 
ngữ Visual C++. 
 Vị trí đầu dò của robot trước khi được khởi động để làm việc còn 
được gọi là “vị trí không” hay “điểm không” có toạ độ là (X,Y,Z) = (0, 0, 0) 
tương ứng với 4 encoder ở vị trí 0 và số xung phát ra bằng 0. Thời điểm 
khởi động máy để làm việc được xác định bằng việc nhắp chuột vào nút 
“Bat dau”. Trong quá trình làm việc đầu dò sẽ được di chuyển đến các vị trí 
cần xác định toạ độ. Tại mỗi vị trí đó toạ độ của chúng sẽ được ghi lại vào 
một file mặc định trong chương trình bằng cách tác động đóng mạch một 
công tắc gắn trên khâu đầu dò. Các điểm đo được ghi lần lượt vào file và số 
điểm sẽ hiển thị trên màn hình giao diện. 
 Sau đây là kết quả đo các điểm tựa của một đường cong. File dữ liệu 
có tên d3.txt với nội dung như sau: 
Nhập file vào chương trình ta thu được kết quả tái hiện ngược đường 
cong nhau sau: 
 106
Hình 3.5.3 
 107
5.2. C¬ së thuËt to¸n x©y dùng mÆt cong kh«ng gian 
5.2.1. Các thuật toán xây dựng mặt cong 
1. Gi¶i thuËt x©y dùng mÆt cong Hermite bËc 3 kÐp. 
procedure Hermite_Bicubic_Patch 
#s 4x1- ma trËn tham sè theo h−íng s 
#t 4x1- ma trËn tham sè theo h−íng t 
#G4x4- ma trËn l−u tr÷ c¸c ®Æc ®iÓm h×nh häc cña mÆt 
cong. 
#M4x4- Ma trËn Hermite 
#sT, tT, MT: c¸c ma trËn chuyÓn vÞ cña s, t vµ M t−¬ng 
øng. 
begin 
 Read c¸c ®Æc ®iÓm h×nh häc cña « l−íi vµo ma trËn G 
 Khëi t¹o ma trËn M 
 TÝnh ma trËn chuyÓn vÞ cña M vµ l−u tr÷ trong MT 
 ds=dt=0.05 
 MOVE_FLAG= TRUE 
 for s=0.0 to 1.0 insteps of 0.05 do 
 tÝnh ma trËn s 
 MOVE_FLAG= TRUE 
 for s=0.0 to 1.0 insteps of 0.05 do 
 tÝnh ma trËn t 
 P(s,t)=s*M*G*MT*tT 
 if MOVE_FLAG is TRUE 
 then begin 
 Move (P(s,t)) 
 MOVE_FLAG= FALSE 
 end 
 else Draw (P(s,t)) 
 endif 
 next t 
 108
 next s 
 for s=0.0 to 1.0 insteps of 0.05 do 
 tÝnh ma trËn t 
 MOVE_FLAG= TRUE 
 for s=0.0 to 1.0 insteps of 0.05 do 
 tÝnh ma trËn s 
 P(s,t)=t*M*G*MT*sT 
 if MOVE_ FLAG is TRUE 
 then 
 begin 
 Move_to (P(s,t)) 
 MOVE_FLAG= FALSE 
 end 
 else Draw (P(s,t)) 
 endif 
 next s 
 next t 
 return 
end 
2. Gi¶i thuËt x©y dùng mÆt cong Bezier. 
Procedure Bezier_ SurFace 
#CPi,j
 lµ ®iÓm ®iÒu khiÓn thø (i, j) trªn mÆt cong 
begin 
 for i=1 to n do 
 for j=1 to m do 
 read ®iÓm ®iÒu khiÓn CPi,j
 next j 
 for s=0 to 1.0 insteps of 0.05 do 
 MOVE_FLAG= TRUE 
 for t=0 to 1.0 insteps of 0.05 do 
 109
 ∑∑= i
n
j
m
jijmjn CPtBSBtsP ,,, *)(*)(),( 
 if P(s,t) lµ ®iÓm b¾t ®Çu 
 then 
 begin 
 Move_to (P(s,t)) 
 MOVE_FLAG= FALSE 
 end 
 else Draw (P(s,t)) 
 endif 
 next t 
 next s 
 for t=0 to 1.0 insteps of 0.05 do 
 MOVE_FLAG= TRUE 
 for t=0 to 1.0 insteps of 0.05 do 
 ∑∑= i
n
j
m
jijmjn CPtBSBtsP ,,, *)(*)(),( 
 if P(s,t) lµ ®iÓm b¾t ®Çu 
 then 
 begin 
 Move_to (P(s,t)) 
 MOVE_FLAG= FALSE 
 end 
 else Draw (P(s,t)) 
 endif 
 next t 
 next s 
 return 
end 
 110
3. Gi¶i thuËt x©y dùng mÆt cong néi suy. 
 C¬ së cña mÆt cong néi suy ®−îc dùa trªn phÐp néi suy ®−êng cong 
víi ý t−ëng bÒ mÆt lµ tËp hîp cu¶ c¸c ®−êng cong ®an xÝt nhau t¹o nªn 
5.2.2. Phương pháp xác định điểm tựa và lưu trữ dữ liệu của mặt cong 
 Cũng tương tự như đường cong, để xây dựng nên các bề mặt cong 
không gian từ một số hữu hạn các điểm tựa ta có thể dùng các phương pháp 
nội suy hoặc xấp xỉ như đã trình bày tổng quát trong chương 1. Mỗi phương 
pháp đều có những đặc điểm riêng của nó và ứng dụng trong từng điều kiện 
cụ thể thực tế đặt ra. Ở đây bài toán của ta xuất phát từ những điểm tựa đo 
được chính xác vì vậy sẽ lựa chọn phương pháp nội suy để tạo dựng mặt 
cong. Việc xác định các điểm tựa dùng cho phép nội suy cũng giống như 
trong trường hợp đường cong nhưng thay vì chỉ xác định các điểm theo một 
đường, ở đây ta sẽ xác định các điểm theo nhiều đường kế tiếp nhau bao 
phủ lên bề mặt nội suy. Nếu để ý theo hai hướng u, v thì các điểm tựa sẽ 
nằm ở nút của lưới đan bởi các đường cong theo hai hướng đó. Như vậy 
công việc đầu tiên của quá trình xác định toạ độ các điểm tựa là việc vạch 
các lưới trên bề mặt mẫu vật theo hai hướng u, v. Quy tắc chung cũng giống 
như đường cong, những vùng có độ cong lớn thì kẻ lưới dày, còn vùng có 
độ cong nhỏ thì vạch lưới thưa. Sau đó ta tiến hành đánh số các nút lưới. Vì 
giải thuật nội suy bề mặt dựa trên nguyên tắc nội suy các đường như đã 
trình bày ở trên nên việc đánh số phải tuân theo quy luật chung của đường 
cong. Trên một hướng (giả sử v) và cùng một đường ta đánh số lần lượt các 
nút tựa, hết một đường thì số lại được đánh tiếp tục ở nút đầu tiên của 
đường kế tiếp, cứ như vậy cho đến đường cuối cùng của hướng v (hình 5.4). 
Nếu số nút lưới trên một đường theo hướng u là m, và hướng v là n thì tổng 
số nút của cả lưới là mxn. Toạ độ các nút lưới được lưu trữ trong một ma 
 111
trận mxn hàng, 3 cột, mỗi một hàng là toạ độ của một nút lưới. Ma trận nút 
lưới này sẽ được ghi vào file dạng text. 
 Chương trình nội suy mặt cong có thể nhận dữ liệu điểm tựa từ bàn 
phím hoặc đọc từ file lưu trữ. Đầu tiên chương trình sẽ nội suy các đường 
theo hướng v, sau đó từ kết quả nội suy này chương trình lại tiếp tục nội suy 
theo hướng u. Cuối cùng ta sẽ nhận được một ma trận lớn chứa toạ độ dày 
đặc các điểm của mặt cong. Ma trận này sẽ được ghi ra file dạng text và 
hiển thị bề mặt nội suy trên màn hình máy tính 
Hình 3.5.4. 
 Sau đây là một số hình ảnh của chương trình máy tính thể hiện giải 
thuật nội suy mặt cong được xây dựng bằng ngôn ngữ MATLAB. 
5.2.4. Một số ví dụ tái hiện mặt cong 
1. Ví dụ 1. 
- Nhậpvào file dữ liệu các điểm tựa có tên sdat1.txt với nội dung như sau: 
5.000 6.000 
-3.000 0.000 9.000 
-6.000 7.000 -6.000 
-4.000 14.000 -166.000 
-3.000 23.000 -497.000 
 112
-7.000 27.000 -653.000 
3.000 0.000 9.000 
1.000 7.000 -41.000 
2.000 15.000 -206.000 
3.000 22.000 -453.000 
1.000 29.000 -811.000 
12.000 -2.000 138.000 
8.000 5.000 44.000 
9.000 13.000 -75.000 
10.000 20.000 -280.000 
9.000 25.000 -519.000 
17.000 0.000 289.000 
14.000 6.000 166.000 
15.000 14.000 43.000 
16.000 21.000 -164.000 
15.000 27.000 -477.000 
23.000 3.000 523.000 
21.000 8.000 385.000 
23.000 16.000 289.000 
24.000 23.000 70.000 
22.000 30.000 -386.000 
31.000 2.000 959.000 
30.000 8.000 844.000 
29.000 15.000 631.000 
30.000 21.000 480.000 
31.000 26.000 311.000 
 Dòng đầu tiên chưa hai số (5,6) là số hàng và cột của lưới điểm tựa 
nội suy mặt cong. Các dòng còn lại là toạ độ của các điểm tựa đó lần lượt 
theo thứ tự từng cột kế tiếp nhau của lưới điểm nội suy (hình 3.5.4) 
 Sau đây là hình ảnh của mặt cong được mô phỏng sau khi nội suy và 
thể hiện theo hai hướng ngang và dọc. 
 113
Sau ®©y lµ h×nh ¶nh cña mÆt cong ®−îc m« pháng sau khi néi suy vµ 
®−îc thÓ hiÖn theo hai h−íng ngang vµ däc 
Hình 3.5.5 
 114
Hình 3.5.6 
2. VÝ dô 2 
 - NhËp vµo file d÷ liÖu c¸c ®iÓm tùa cã tªn tru2.txt víi néi dung nh− 
sau: 
11 11 
140 100 5 
132.36 123.51 5 
112.36 138 5 
87.64 138 5 
67.64 123.51 5 
60 100 5 
67.64 76.5 5 
87.64 62 5 
112.36 62 5 
132.36 76.5 5 
140 100 5 
150 100 10 
140.45 129.4 10 
 115
115.45 147.55 10 
84.55 147.55 10 
59.55 129.4 10 
50 100 10 
59.55 70.61 10 
84.55 52.45 10 
115.45 52.45 10 
140.45 70.61 10 
150 100 10 
140 100 15 
132.36 123.51 15 
112.36 138 15 
87.64 138 15 
67.64 123.51 15 
60 100 15 
67.64 76.5 15 
87.64 62 15 
112.36 62 15 
132.36 76.5 15 
140 100 15 
130 100 20 
124.27 117.63 20 
109.27 128.53 20 
90.73 128.53 20 
75.73 117.63 20 
70 100 20 
75.73 82.37 20 
90.73 71.47 20 
109.27 71.47 20 
124.27 82.36 20 
130 100 20 
140 100 25 
132.36 123.51 25 
112.36 138 25 
87.64 138 25 
67.64 123.51 25 
60 100 25 
67.64 76.5 25 
87.64 62 25 
112.36 62 25 
132.36 76.5 25 
140 100 25 
150 100 30 
 116
140.45 129.4 30 
115.45 147.55 30 
84.55 147.55 30 
59.55 129.4 30 
50 100 30 
59.55 70.61 30 
84.55 52.45 30 
115.45 52.45 30 
140.45 70.61 30 
150 100 30 
140 100 35 
132.36 123.51 35 
112.36 138 35 
87.64 138 35 
67.64 123.51 35 
60 100 35 
67.64 76.5 35 
87.64 62 35 
112.36 62 35 
132.36 76.5 35 
140 100 35 
130 100 45 
124.27 117.63 45 
109.27 128.53 45 
90.73 128.53 45 
75.73 117.63 45 
70 100 45 
75.73 82.37 45 
90.73 71.47 45 
109.27 71.47 45 
124.27 82.36 45 
130 100 45 
125 100 55 
120.2 114.7 55 
107.7 123.8 55 
92.3 123.8 55 
79.8 114.7 55 
75 100 55 
79.8 85.3 55 
92.3 76.2 55 
107.7 76.2 55 
120.2 85.3 55 
125 100 55 
 117
130 100 60 
124.27 117.63 60 
109.27 128.53 60 
90.73 128.53 60 
75.73 117.63 60 
70 100 60 
75.73 82.37 60 
90.73 71.47 60 
109.27 71.47 60 
124.27 82.36 60 
130 100 60 
125 100 70 
120.2 114.7 70 
107.7 123.8 70 
92.3 123.8 70 
79.8 114.7 70 
75 100 70 
79.8 85.3 70 
92.3 76.2 70 
107.7 76.2 70 
120.2 85.3 70 
125 100 70 
 Dßng ®Çu tiªn chøa hai sè (11 , 11) lµ sè hµng vµ cét cña l−íi ®iÓm 
tùa néi suy mÆt cong. C¸c dßng cßn l¹i lµ to¹ ®é cña c¸c ®iÓm tùa ®ã lÇn 
l−ît theo thø tù tõng cét kÕ tiÕp nhau cña l−íi ®iÓm néi suy. Trong vÝ dô nµy 
lµ mét mÆt cong trßn xoay khÐp kÝn cã mÆt c¾t ngang lµ c¸c ®−êng trßn 
®ång t©m. 
 118
Hình 3.5.7 
 Sau ®©y lµ h×nh ¶nh cña mÆt cong ®−îc m« pháng sau khi néi suy vµ 
thÓ hiÖn theo hai h−íng ngang vµ däc. 
Hình 3.5.8 
 119
Hình 3.5.9 
3. VÝ dô 3 
- NhËp vµo file d÷ liÖu c¸c ®iÓm tùa cã tªn tru3.txt 
Hình 3.5.10 
 120
Sau ®©y lµ h×nh ¶nh cña mÆt cong ®−îc m« pháng sau khi néi suy vµ 
thÓ hiÖn theo hai h−íng ngang vµ däc. 
Hình 3.5.11 
 121
5.3. Thuật toán quả bóng rơi và phương pháp nội suy 
ThuËt to¸n qu¶ bãng r¬i (Ball Fall) 
 Néi dung cña thuËt to¸n nh− sau: 
Tõ tËp ®iÓm ®o ®−îc, tiÕn hµnh phñ l−íi tam gi¸c lªn vËt thÓ. ViÖc phñ tam 
gi¸c lªn vËt thÓ cã nhiÒu c¸ch, vÝ dô nh− c¸ch d−íi ®©y: 
H×nh 3.5.12: §Þnh nghÜa tam gi¸c Delaunay vµ biÓu ®å Voronoi 
H×nh 3.5.13: Mèi quan hÖ gi÷a tam gi¸c Delaunay vµ biÓu ®å Voronoi 
 122
 Tõ tËp datapoints ®o ®−îc ta tiÕn hµnh s¾p xÕp c¸c ®iÓm gÇn nhau h¬n 
(so víi c¸c ®iÓm kh¸c l¹i), øng víi mçi ®iÓm ta nèi tam gi¸c víi hai ®iÓm 
gÇn h¬n. TËp hîp c¸c tam gi¸c nµy t¹o thµnh l−íi tam gi¸c bao phñ lªn toµn 
vËt thÓ, ®ã chÝnh lµ quan hÖ gi÷a biÓu ®å Vronoi vµ Delaunay. 
 ViÖc phñ tam gi¸c nh− vËy râ rµng nã cã −u ®iÓm lµ gióp ng−êi ®o 
tiÕt kiÖm ®−îc thêi gian ®o, xong ®«i khi g©y ra nh÷ng nhÇm lÉn rÊt khã 
ph¸t hiÖn khi tiÕn hµnh thuËt to¸n. 
 §Ó tr¸nh nh÷ng nhÇm lÉn ®ã, ta nªn quy ®Þnh quy luËt lÊy ®iÓm trªn 
vËt thÓ nh− sau: 
 Chia vËt thÓ thµnh nhiÒu líp kh¸c nhau, c¸c líp ®−îc chia ph¶i b¶o ®¶m 
khi ghÐp c¸c líp ®ã l¹i th× chóng ph¶i bao phñ hoµn toµn ®−îc vËt thÓ. 
 Trong tõng líp ta tiÕn hµnh lÊy ®iÓm sao cho 3 ®iÓm liªn tiÕp kh«ng th¼ng 
hµng, nghÜa lµ chóng ph¶i t¹o thµnh mét tam gi¸c. 
 Sau khi cã tËp datapoints ®o ®−îc b»ng c¸ch trªn ta chiÕu toµn bé vËt 
thÓ xuèng 3 mÆt ph¼ng to¹ ®é xoy, yoz vµ zox. Trªn tõng mÆt ph¼ng, cø ba 
®Ønh cña tam gi¸c hoµn toµn x¸c ®Þnh mét mÆt ph¼ng d¹ng: (D): Ax + By + 
Cz + D = 0. 
 Gi¶ sö chiÕu toµn bé vËt thÓ võa dùng xuèng mÆt ph¼ng (xOy): 
 123
H×nh 3.5.14: S¬ ®å thuËt to¸n Ball Fall. 
 KÎ ®−êng th¼ng yj // Ox, (j = 1, …, m). øng víi mçi yj ta chia ®o¹n 
[x1, xn] thµnh n phÇn, b−íc chia lµ dentalx, tõ ®ã ta thu ®−îc ®iÓm M(i,j) 
tr−ît trªn ®−êng th¼ng yj. §Õn ®©y chóng ta x¸c ®Þnh xem M(i,j) thuéc tam 
gi¸c nµo, c¨n cø vµo ®ã ta sÏ x¸c ®Þnh ®−îc thµnh phÇn cao ®é zk, (k=1, …, 
p) b»ng c¸ch thay to¹ ®é xi, yj vµo ph−¬ng tr×nh (D). 
 Mét c¸ch t−¬ng tù, ta còng tiÕn hµnh trªn hai mÆt ph¼ng to¹ ®é cßn 
l¹i. 
TËp hîp M(i,j,k), víi m, n, p ®ñ lín ta thu ®−îc vËt thÓ (V) ®· mÞn ho¸ vµ 
chÝnh x¸c ho¸. 
 Mét sè chó ý: 
 C¸c líp ®iÓm ®−îc lÊy nªn cã phÇn giao nhau, ®Ó vËt thª thu ®−îc chÝnh 
x¸c h¬n. 
 §Ó tr¸nh nhÇm lÉn : kh«ng biÕt ®iÓm ®−îc chiÕu lªn mÆt ph¼ng to¹ ®é lµ 
thuéc tam gi¸c nµo ta kh«ng nªn xÐt nhiÒu líp liÒn mét lóc hoÆc nhiÒu tam 
gi¸c liÒn mét lóc, mµ nªn xÐt tõng tam gi¸c trong tõng líp mét. 
 124
 Khi ®−îc chiÕu lªn c¸c mÆt ph¼ng to¹ ®é, ba ®iÓm liªn tiÕp ch−a ch¾c ®· 
t¹o thµnh mét tam gi¸c h×nh häc, nghÜa lµ kh«ng ®¸p øng ®−îc yªu cÇu cña 
thuËt to¸n (ph¶i lµ tam gi¸c), khi ®ã cÇn t¨ng ®é chÝnh x¸c cña sè hiÓn thÞ 
(dïng lÖnh Format ®Ó t¨ng kh¶ n¨ng biÓu diÔn c¸c ch÷ sè cã nghÜa). 
5.31. ThuËt to¸n nèi ®iÓm néi suy (Interpolate) 
 Néi dung cña thuËt to¸n 
 Ta tiÕn hµnh c¾t vËt thÓ (V) bëi c¸c mÆt ph¼ng (Pi) // (xOy), (i=1,n). 
Kho¶ng c¸ch gi÷a c¸c mÆt ph¼ng (Pi) nµy lµ iz∆ , víi iz∆ ≠ 1−∆ iz . T¹i nh÷ng 
vÞ trÝ mµ tiÕt diÖn kh«ng thay ®æi hoÆc Ýt thay ®æi th× ta lÊy iz∆ lín, cßn 
nh÷ng vÞ trÝ mµ tiÕt diÖn thay ®æi nhiÒu th× ta lÊy iz∆ nhá ®Õn møc cã thÓ. 
 Gäi (Si) = (Pi) /\ (V) th× (Si) sÏ hoµn toµn ®−îc x¸c ®Þnh b»ng ph−¬ng 
ph¸p néi suy: 
 Dïng m¸y ®o ®iÓm ®Ó lÊy mét sè h÷u h¹n c¸c ®iÓm Mi,j = (xi,j, yi,j, zi) trªn 
(Si), víi j = 1, m. (m cµng lín, phÐp ®o cµng chÝnh x¸c). 
 Tõ tËp ®iÓm {M(i,j)} ta x¸c ®Þnh ®−êng cong (Ci): y = f(x) = Pn(x) b»ng 
®a thøc néi suy Lagrage hoÆc ®a thøc néi suy Newton. 
 Chia ®o¹n [min{xi,j}, max{xi,j}] thµnh m' phÇn víi b−íc chia lµ x∆ , khi 
®ã: 
xi,j' = xi,j'-1 + x∆ , j' = 1, m'. Thay c¸c xi,j' vµo (Ci) ta t×m ®−îc yi,j' vµ thu 
®−îc tËp {M'i,j' = (xi,j', yi,j', zi)} chøa {Mi,j = (xi,j, yi,j, zi)}. 
 V× th«ng th−êng c¸c biªn d¹ng (Si) lµ c¸c ®−êng cong kÝn, nªn ®Ó tr¸nh 
trïng lÆp c¸c gi¸ trÞ xi,j' ta cÇn chia (Si) thµnh nhiÒu phÇn kh¸c nhau: (Sik), 
k = 1, p. øng víi mçi (Sik) hµm sè f(x) ph¶i ®¬n ®iÖu. 
 Nèi c¸c ®iÓm M'i,j' víi nhau ta sÏ thu ®−îc biªn d¹ng (Si). 
 125
 Trªn ®©y ta thùc hiÖn néi suy cho hÖ trôc xOy, mét c¸ch t−¬ng tù ta 
còng tiÕn hµnh néi suy cho c¸c hÖ trôc yOz vµ xOz. 
 Cuèi cïng vËt thÓ (V) cÇn dùng lµ tËp hîp cña v« sè c¸c ®iÓm: 
 {M'i,j' = (xi,j', yi,j', zi)}, víi i = 1, 2, …, n; j' = 1, 2, …, m'. 
 Râ rµng khi m', n ®ñ lín th× vËt thÓ (V) cÇn dùng ®−îc mÞn ho¸ vµ 
chÝnh x¸c ho¸. 
5.3.2. ThuËt to¸n mÞn ho¸ ®−êng cong (Curve Fitting) 
 Néi dung cña thuËt to¸n: ý t−ëng cña thuËt to¸n nµy hoµn toµn gièng víi 
thuËt to¸n nèi ®iÓm néi suy, ®iÓm kh¸c biÖt duy nhÊt lµ {M'i,j' = (xi,j', yi,j', zi)} 
kh«ng chøa {Mi,j = (xi,j, yi,j, zi)}, nghÜa lµ ®−êng cong (Ci) hÇu nh− kh«ng ®i 
qua c¸c ®iÓm M(i,j). Do vËy nªn ®Ó cã thÓ dùng ®−îc vËt thÓ mét c¸ch chÝnh 
x¸c buéc ta ph¶i quan t©m tíi sai sè lín nhÊt vµ nhá nhÊt nh− lµ mét nguyªn 
t¾c ®Ó tiÕn hµnh néi suy cho c¸c biªn d¹ng kh¸c nhau. 
5.4 Xây dựng chương trình máy tính 
§Ó hiÖn thùc ho¸ phÇn lý thuyÕt ®· nªu ë trªn, t¸c gi¶ tiÕn hµnh kh«i 
phôc bÒ mÆt cña phom giµy nam. 
5.4.1 LÊy ®iÓm trªn vËt thÓ b»ng m¸y ®o to¹ ®é MicroScribe G2X (lÊy 
datapoints) 
 Sau khi cè ®Þnh vËt thÓ cÇn ®o vµ m¸y ®o trªn ®å g¸, Reset l¹i m¸y ®o 
(hiÖu chØnh th«ng sè m¸y ®o nÕu cÇn thiÕt) ta tiÕn hµnh ®o theo ®óng 
nguyªn t¾c ®· tr×nh bµy ë trªn. 
 KÕt qu¶ cña qu¸ tr×nh ®o lµ c¸c tÖp d÷ liÖu d¹ng *.txt, vÝ dô giay.txt 
chøa tÊt c¶ c¸c ®iÓm cÇn ®o. V× ta ®Þnh d¹ng m¸y ®o kÕt xuÊt víi tiÖn Ých 
notepad.exe cña hÖ ®iÒu hµnh MS Windows, nªn theo ®Þnh d¹ng nµy c¸c 
®iÓm ®o ®−îc bè trÝ trªn tõng dßng chøa trong tËp tin giay.txt. 
 126
 ChÝnh v× vËy ®Ó nhËn biÕt ®−îc c¸c líp ®iÓm ®o ®−îc tõ m¸y ®o täa 
®é ta cÇn ®−a thªm vµo tËp tin giay.txt mét sè ký tù ®Æc biÖt t¹i vÞ trÝ kÕt 
thóc líp ®iÓm ®ã (H×nh 7.5). 
5.4.2. C¸c thao t¸c thùc hiÖn trªn phÇn mÒm REAutoTec 1.0 
 Sau khi cã ®−îc tÖp d÷ liÖu giay.txt, ta b¾t ®Çu xö lý chóng trªn 
ch−¬ng tr×nh REAutoTec 1.0 (do t¸c gi¶ tù thiÕt kÕ) ®Ó gi¶i bµi to¸n RE vµ 
RPT theo c¸c b−íc c¬ b¶n sau: 
 NhËp User name vµ Serial number, ch−¬ng tr×nh chØ tiÕp tôc khi cã chÝnh 
x¸c c¶ 2 th«ng tin nµy. 
Hình 3.5.15 
 NÕu nhËp ®óng sÏ xuÊt hiÖn giao diÖn chÝnh cña ch−¬ng tr×nh 
 127
Hình 3.5.16 
C¸c vïng thao t¸c: 
 Vïng 1: n¬i nhËp tªn tÖp d÷ liÖu d¹ng *.txt. Ên nót Bowse ®Ó duyÖt tíi tÖp 
giay.txt hay layerall.txt, hoÆc gâ ®−êng dÉn vµo « bªn c¹nh 
 Vïng 2: C¸c th«ng sè cña qu¸ tr×nh xö lý. T¹i ®©y cÇn chän sè ®iÓm cÇn 
lÊy trong mçi tam gi¸c, vµ chän mÆt ph¼ng chiÕu 
 Vïng 3: C¸c th«ng sè cho viÖc liªn kÕt c¸c ®iÓm ®o ®−îc 
 Vïng 4: C¸c nót chøc n¨ng 
 Vïng 5: C¸c tuú chän ®å ho¹ 
 Vïng 6: Mét sè ph−¬ng ph¸p vÏ bÒ mÆt vËt thÓ 
 Vïng 7: Cöa sæ hiÓn thÞ kÕt qu¶ tÝnh to¸n b¾ng sè 
 128
 Vïng 8: Cöa sæ ®å ho¹ 
 Ên Browse ®Ó chän file d÷ liÖu, Ên Ready ®Ó x¸c lËp d÷ liÖu ®Çu vµo vµ 
tiÕn hµnh quan s¸t vËt thÓ ch−a qua xö lý, Ên OK ®Ó thùc hiÖn xö lý, chän « 
Plot with output data ®Ó quan s¸t vËt thÓ sau xö lý, ®ång thêi quan s¸t vïng 
7 vµ 8. Riªng vïng 5, h·y chän mét sè « ®Ó viÖc quan s¸t vËt thÓ ®−îc râ 
rµng h¬n. 
 Mét sè kÕt qu¶ thu ®−îc: 
 Khi Ên nót Ready: 
Hình 3.5.17 
 Khi Ên nót OK 
 129
Hình 3.5.18 
 Khi chän Export to AutoCAD 
Hình 3.5.19 
 130
T¹i cöa sæ më ra, ta cÇn nhËp tªn file Autolisp muèn l−u. Sau ®ã vµo 
menu Tool>Autocad ®Ó quan s¸t vËt thÓ trong AutoCAD. 
 Bµi to¸n RPT ®−îc thùc hiÖn t¹i vïng 6, t¹i ®ã ta cã thÓ c¾t vËt thÓ 
theo mÆt c¾t vu«ng gãc víi trôc x, y hay z, hoÆc c¾t ®ång thêi theo hai trong 
ba trôc täa ®é ®ã. 
Hình 3.5.20 
 131
5.5. Chương trình phần mềm tái hiện các bề mặt cong phức tạp 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include "Grapht.h" 
 #include "Mouset.h" 
 #include "fontt.h" 
 int T=20; 
 void MemShow() 
 { 
 char St[20]; 
 ultoa(MemAvail(),St,10); 
 setfillstyle(1,4); bar(580,445,639,479); 
 settextjustify(1,1); settextstyle(0,0,1); setcolor(15); 
 outtextxy(610,465,St); 
 } 
 struct wndDraw 
 { 
 float ToaDox,ToaDoy; 
 struct wndDraw *Dau,*Tiep; 
 }; 
 typedef wndDraw draw; 
 class Main 
 { 
 int x1,y1,x2,y2,Number; 
 int oldMx,oldMy,oldButton,chkWork; 
 int oldMy3,oldMx3,oldButton2,oldButton3,oldButton4,My3,Mx3,clicked; 
 int n,Click,Clicked,Mousepressed,mclick; 
 int DLine,DCircle,Move; 
 double XT,YT,R,M1,M2,M3; 
 double Min1,Min2,Min3; 
 long double GocMin1,GocMin3; 
 int i,j; 
 double ToaDox[1500],ToaDoy[1500]; 
 int Mx1,My1,Mx2,My2; 
 draw *TempDau,*Temp; 
 Button cmdExit,cmdClear,cmdLine,cmdCircle,cmdSpeedup,cmdSpeedown,cmdRun; 
 Window Window1,Window2; 
 Tollboxs TollBox[10]; 
 char *Mes[10]; 
 public: 
 int MouseX,MouseY; 
 int Button,Mx,My; 
 int xMotor,yMotor; 
 void wndMainI(int x11,int y11,int x22,int y22) 
 { 
 132
 x1=x11; y1=y11; x2=x22; y2=y22;Number=0; 
 XT=0;YT=0; 
 Min1=0;Min2=0;Min3=0; 
 M1=0;M2=0;M3=0;R=0;0; 
 xMotor=yMotor=0; 
 } 
 void wndMainInit(); 
 void OutputMouse(int x,int y); 
 void InputMouseL(); 
 void InputMouseC(); 
 void wndLine(); 
 void XDTam(double x1,double y1,double x2,double y2,double x3,double y3); 
 void CheckLine(); 
 void wndCircle(); 
 void DrawCircle(); 
 void CheckCircle(); 
 void wndDraw(); 
 void Reset(); 
 void Run(); 
 void Write(int); 
 void Speedup(); 
 void Speedown(); 
 void wndCheck(); 
 }; 
 Main wndMain; 
 int main(void) 
 { 
 InitGraph(); 
 MouseInit();MouseShow(); 
 wndMain.wndMainInit();wndMain.wndDraw(); 
 Shadow(72,42,getmaxx()-2,40,1); 
 while(1) 
 { 
 wndMain.wndCheck(); 
 } 
 CloseGraph(); 
 return(0); 
 } 
 void Main::wndMainInit() 
 { 
 wndMain.wndMainI(20,42,632,440); 
 oldButton=Click=0; Clicked=chkWork=False;Mousepressed=0,Move=1; 
 oldButton3=oldButton2=oldButton4=0; 
 TempDau=new draw; 
 Temp=TempDau;Temp->Tiep=NULL;Temp->Dau=NULL; 
 Window1.WindowInit(0,22,getmaxx(),getmaxy()-40,7,"Robot Commander",False,True,False); 
 Window2.WindowInit(0,0,0,0,0,"",False,True,False); 
 cmdExit.Init(3,447,65,475,"Exit","",False); 
 cmdSpeedup.Init(350,447,430,475,"Speedown","",False); 
 cmdSpeedown.Init(440,447,520,475,"Speedup","",False); 
 cmdClear.Init(280,447,340,475,"Clear","",False); 
 cmdLine.Init(210,447,270,475,"Line","",False); 
 cmdCircle.Init(140,447,200,475,"Circle","",False); 
 cmdRun.Init(70,447,130,475,"Run","",False); 
 Reset(); 
 133
 }; 
 void Main::wndDraw() 
 { 
 MouseHide(); 
 Window1.Draw(); 
 Window2.Draw(); 
 cmdExit.Draw(); 
 cmdClear.Draw(); 
 cmdLine.Draw(); 
 cmdCircle.Draw(); 
 cmdSpeedup.Draw(); 
 cmdSpeedown.Draw(); 
 cmdRun.Draw(); 
 char St[10]; 
 setcolor(0); setlinestyle(0,0,1); 
 //Ruler 
 for(i=0;i<y2-y1-30;i++) 
 if(i%2==0) 
 if(i%40==0) 
 { 
 line(x1-4,y1+24+i,x1+6,y1+24+i); 
 itoa(i,St,10); 
 settextjustify(2,1); settextstyle(0,1,1); 
 outtextxy(x1-5,y1+24+i,St); 
 } 
 else line(x1,y1+24+i,x1+6,y1+24+i); 
 for(i=0;i<x2-x1;i++) 
 if(i%2==0) 
 if(i%40==0) 
 { 
 line(x1+i,y1+14,x1+i,y1+22); 
 itoa(i,St,10); 
 settextjustify(1,0); settextstyle(0,0,1); 
 outtextxy(x1+i,y1+13,St); 
 } 
 else line(x1+i,y1+18,x1+i,y1+22); 
 MemShow(); 
 MouseShow(); 
 }; 
 void Main::OutputMouse(int x,int y) 
 { 
 char St[10],Tg[10]; 
 itoa(x-25,Tg,10); 
 strcpy(St,"["); 
 strcat(St,Tg); strcat(St,"x"); 
 itoa(y-65,Tg,10); 
 strcat(St,Tg); strcat(St,"]"); 
 setfillstyle(1,7); bar(x2-35-36,y1-10-5,x2-35+36,y1-10+5); 
 settextjustify(1,1); settextstyle(0,0,1);setcolor(0); 
 outtextxy(x2-35,y1-10,St); 
 setwritemode(XOR_PUT); 
 setlinestyle(0,0,1); setcolor(6); 
 line(x-20,y,x+20,y); 
 line(x,y-20,x,y+20); 
 setlinestyle(0,0,1); 
 rectangle(x-3,y-3,x+3,y+3); 
 134
 setwritemode(COPY_PUT); 
 if(mclick==1) 
 { 
 itoa(x-90,Tg,10); 
 strcpy(St,"["); 
 strcat(St,Tg); strcat(St,"x"); 
 itoa(y-62,Tg,10); 
 strcat(St,Tg); strcat(St,"]"); 
 setfillstyle(1,7); bar(x2-160,y1-10-5,x2-80,y1-10+5); 
 settextjustify(1,1); settextstyle(0,0,1);setcolor(3); 
 outtextxy((x2-160+x2-80)/2,(y1-10+y1-10)/2,St); 
 setwritemode(XOR_PUT); 
 setlinestyle(0,0,1); setcolor(6); 
 line(x-20,y,x+20,y); 
 line(x,y-20,x,y+20); 
 setlinestyle(0,0,1); 
 rectangle(x-3,y-3,x+3,y+3); 
 setwritemode(COPY_PUT); 
 } 
 } 
 void Main::wndCheck() 
 { 
 MemShow(); 
 Write(T); 
 char STT[20],ST[20],STt[20]; 
 int OldMx,OldMy,x,y; 
 cmdExit.Check(); 
 if(cmdExit.MClick==1) exit(1); 
 cmdClear.Check(); 
 if(cmdClear.MClick==1) {Reset();Number=0;Button=0;} 
 cmdLine.Check(); 
 if(cmdLine.MClick==1) {Move=0;DCircle=0;DLine=1;} 
 cmdCircle.Check(); 
 if(cmdCircle.MClick==1) {Move=0;DLine=0;DCircle=1;} 
 cmdSpeedup.Check(); 
 if(cmdSpeedup.MClick==1) {Speedup();} 
 cmdSpeedown.Check(); 
 if(cmdSpeedown.MClick==1) {Speedown();} 
 cmdRun.Check(); 
 if(cmdRun.MClick==1) {Run();} 
 for(i=1;i<10;++i) 
 { 
 TollBox[i].Check(); 
 } 
 GetMouse(&Button,&Mx,&My);MouseX=Mx;MouseY=My; 
 if(MouseGraphIn(20,65,632,440)) 
 if(chkWork==False) 
 { 
 MouseHide(); 
 chkWork=True; 
 OutputMouse(Mx,My);oldMx=Mx; oldMy=My; 
 } 
 else; 
 else if(chkWork==True) 
 { OutputMouse(oldMx,oldMy); chkWork=False; MouseShow(); } 
 if(chkWork) 
 135
 { 
 if(DLine==1) CheckLine(); 
 if(DCircle==1) CheckCircle(); 
 if(Button==2 && Clicked) 
 { 
 setcolor(3); 
 setwritemode(XOR_PUT); 
 line(Mx1,My1,Mx2,My2); 
 setwritemode(XOR_PUT); 
 Clicked=False; 
 OutputMouse(Mx,My); 
 OutputMouse(Mx,My); 
 }; 
 if(Move==1) 
 if(oldMx!=Mx||oldMy!=My) 
 { 
 OutputMouse(oldMx,oldMy); 
 OutputMouse(Mx,My); oldMx=Mx; oldMy=My; 
 } 
 if(DLine==1) 
 if(oldMx!=Mx || oldMy!=My) 
 { 
 OutputMouse(oldMx,oldMy); 
 if(Clicked){wndLine();} 
 OutputMouse(Mx,My); Mx2=oldMx=Mx; My2=oldMy=My; 
 } 
 if(DCircle==1) 
 if(oldMx!=Mx||oldMy!=My) 
 { 
 OutputMouse(oldMx,oldMy); 
 OutputMouse(Mx,My);Mx3=oldMx=Mx;My3=oldMy=My; 
 } 
 } 
 } 
 void Main::Run() 
 { 
 draw *This; 
 int xBit[4]={1,2,4,8}; 
 int yBit[4]={16,32,64,128}; 
 float x,y; 
 setfillstyle(1,7); bar(93,63,630,430); 
 This=TempDau; 
 while(This->Tiep->Tiep!=NULL) 
 { 
 x=This->ToaDox;y=This->ToaDoy; 
 setcolor(5); 
 line(x,y,This->ToaDox,This->ToaDoy); 
 This=This->Tiep; 
 outport(0x378,xBit[xMotor]+yBit[yMotor]); 
 if(Temp->ToaDox-x>0) if(xMotor<3) ++xMotor; else xMotor=0; 
 else if(Temp->ToaDox-x0) --xMotor; else xMotor=3; 
 if(Temp->ToaDoy-y>0) if(yMotor<3) ++yMotor; else yMotor=0; 
 else if(Temp->ToaDoy-y0) --yMotor; else yMotor=3; 
 delay(T); 
 } 
 136
 }; 
 void Main::Reset() 
 { 
 int Mx,Button,My; 
 while(Temp->Dau!=NULL){ Temp=Temp->Dau; delete(Temp->Tiep);} 
 Temp->Tiep=NULL; 
 setfillstyle(1,7); bar(27,65,630,430); 
 GetMouse(&Button,&Mx,&My); 
 Mx2=oldMx=Mx; My2=oldMy=My; 
 } 
 void Main::InputMouseL() 
 { 
 draw *Swap; 
 int i; 
 if(abs(Mx2-Mx1)>abs(My2-My1)) 
 for(i=0;i<abs(Mx2-Mx1);++i) 
 { 
 if(Mx2>Mx1) Temp->ToaDox=Mx1+i; else Temp->ToaDox=Mx1-i; 
 if(My2>My1) Temp->ToaDoy=My1+i*abs(My2-My1)/abs(Mx2-Mx1); 
 else Temp->ToaDoy=My1-i*abs(My2-My1)/abs(Mx2-Mx1); 
 Temp->Tiep=new draw;//De chuyen den vi tri con tro tiep theo 
 Swap=Temp; 
 Temp=Temp->Tiep; 
 Temp->Dau=Swap; 
 } 
 else 
 for(i=0;i<abs(My2-My1);++i) 
 { 
 if(Mx2>Mx1) Temp->ToaDox=Mx1+i*abs(Mx2-Mx1)/abs(My2-My1); 
 else Temp->ToaDox=Mx1-i*abs(Mx2-Mx1)/abs(My2-My1); 
 if(My2>My1) Temp->ToaDoy=My1+i; 
 else Temp->ToaDoy=My1-i; 
 Temp->Tiep=new draw;//De chuyen den vi tri con tro tiep theo 
 Swap=Temp; 
 Temp=Temp->Tiep; 
 Temp->Dau=Swap; 
 } 
 Temp->Tiep=NULL; 
 }; 
 void Main::wndLine() 
 { 
 setcolor(3); 
 setwritemode(XOR_PUT); 
 line(Mx1,My1,Mx2,My2); 
 line(Mx1,My1,MouseX,MouseY); 
 setwritemode(XOR_PUT); 
 } 
 void Main::CheckLine() 
 { 
 if(Button==1&&oldButton==0) 
 { 
 if(Clicked) 
 { 
 mclick=1;OutputMouse(Mx1,My1);mclick=0; 
 InputMouseL(); 
 } 
 137
 Clicked=1;Mx1=Mx2=Mx; My1=My2=My;oldButton=1; 
 } 
 if(Button==0) oldButton=0; 
 } 
 void Main::CheckCircle() 
 { 
 if(Button==1&&oldButton==0) 
 { 
 oldButton=1; 
 if(Number==0) {Mx1=Mx;My1=My;putpixel(Mx1,My1-1,6);} 
 if(Number==1) {Mx2=Mx;My2=My;putpixel(Mx2,My2-1,6);Clicked=1;} 
 if(Number==2) 
 { 
 Mx3=Mx;My3=My;putpixel(Mx3,My3-1,6); 
 wndCircle();InputMouseC(); 
 Mx1=Mx;My1=My; 
 Number=0;Clicked=0; 
 } 
 Number++; 
 } 
 if(Button==0) oldButton=0; 
 if(Button==2) Button=0; 
 } 
 void Main::InputMouseC() 
 { 
 draw *Swap; 
 if(M2>M3) 
 { 
 for(i=0;i<360-M3;++i) 
 { 
 Temp->ToaDox=ToaDox[i]; 
 Temp->ToaDoy=ToaDoy[i]; 
 Temp->Tiep=new draw;//De chuyen den vi tri con tro tiep theo 
 Swap=Temp; 
 Temp=Temp->Tiep; 
 Temp->Dau=Swap; 
 } 
 } 
 else 
 for(i=0;i<M3+1;i++) 
 { 
 Temp->ToaDox=ToaDox[i]; 
 Temp->ToaDoy=ToaDoy[i]; 
 Temp->Tiep=new draw;//De chuyen den vi tri con tro tiep theo 
 Swap=Temp; 
 Temp=Temp->Tiep; 
 Temp->Dau=Swap; 
 } 
 Temp->Tiep=NULL; 
 } 
 void Main::DrawCircle() 
 { 
 moveto(ToaDox[1],ToaDoy[1]); 
 if(M2>M3) 
 { 
 for(i=1;i<360-M3;i++) 
 138
 { 
 lineto(ToaDox[359-i],ToaDoy[359-i]); 
 delay(5); 
 } 
 } 
 else 
 for(i=0;i<M3+1;i++) 
 { 
 lineto(ToaDox[i],ToaDoy[i]); 
 delay(5); 
 } 
 } 
 void Main::wndCircle() 
 { 
 XDTam(Mx1,My1,Mx2,My2,Mx3,My3); 
 DrawCircle(); 
 } 
 void Main::XDTam(double x1,double y1,double x2,double y2,double x3,double y3) 
 { 
 double A,Tgx,Tgy; 
 float a1,b1,a2,b2; 
 if(x1==x2||y1==y2) 
 { 
 a1=(x3-x2)/(y2-y3); 
 b1=(y3*y3+x3*x3-y2*y2-x2*x2)/(2*(y3-y2)); 
 a2=(x1-x3)/(y3-y1); 
 b2=(y1*y1+x1*x1-y3*y3-x3*x3)/(2*(y1-y3)); 
 XT=(double)(b2-b1)/(a1-a2); 
 YT=(double)(b2*a1-b1*a2)/(a1-a2); 
 R=(double)sqrt((XT-x1)*(XT-x1)+(YT-y1)*(YT-y1)); 
 } 
 else 
 { 
 if(x2==x3||y2==y3) 
 { 
 a1=(x1-x2)/(y2-y1); 
 b1=(y1*y1+x1*x1-y2*y2-x2*x2)/(2*(y1-y2)); 
 a2=(x1-x3)/(y3-y1); 
 b2=(y1*y1+x1*x1-y3*y3-x3*x3)/(2*(y1-y3)); 
 XT=(double)(b2-b1)/(a1-a2); 
 YT=(double)(b2*a1-b1*a2)/(a1-a2); 
 R=(double)sqrt((XT-x1)*(XT-x1)+(YT-y1)*(YT-y1)); 
 } 
 else 
 { 
 if(x3==x1||y3==y1) 
 { 
 a1=(x3-x2)/(y2-y3); 
 b1=(y3*y3+x3*x3-y2*y2-x2*x2)/(2*(y3-y2)); 
 a2=(x1-x2)/(y2-y1); 
 b2=(y1*y1+x1*x1-y2*y2-x2*x2)/(2*(y1-y2)); 
 XT=(double)(b2-b1)/(a1-a2); 
 YT=(double)(b2*a1-b1*a2)/(a1-a2); 
 R=(double)sqrt((XT-x1)*(XT-x1)+(YT-y1)*(YT-y1)); 
 } 
 else 
 139
 { 
 a1=(x1-x2)/(y2-y1); 
 b1=(y1*y1+x1*x1-y2*y2-x2*x2)/(2*(y1-y2)); 
 a2=(x1-x3)/(y3-y1); 
 b2=(y1*y1+x1*x1-y3*y3-x3*x3)/(2*(y1-y3)); 
 XT=(double)(b2-b1)/(a1-a2); 
 YT=(double)(b2*a1-b1*a2)/(a1-a2); 
 R=(double)sqrt((XT-x1)*(XT-x1)+(YT-y1)*(YT-y1)); 
 } 
 } 
 } 
 for (i=0;i<360;i++) //xac dinh toa do diem tren duong tron 
 { 
 A=(double)(3.14*i/180); 
 ToaDox[i]=(double)(XT+R*cos(A)); 
 ToaDoy[i]=(double)(YT+R*sin(A)); 
 } //end of for 
 Min1=(double)sqrt((ToaDox[0]-x1)*(ToaDox[0]-x1)+(ToaDoy[0]-y1)*(ToaDoy[0]-y1)); 
 for(i=0;i<360;i++) 
 if(Min1>(double)sqrt((ToaDox[i]-x1)*(ToaDox[i]-x1)+(ToaDoy[i]-y1)*(ToaDoy[i]-y1))) 
 { 
 Min1=(double)sqrt((ToaDox[i]-x1)*(ToaDox[i]-x1)+(ToaDoy[i]-y1)*(ToaDoy[i]-y1)); 
 M1=i; 
 } 
 if(M1>0) 
 for(i=0;i<M1;i++) 
 { 
 Tgx=ToaDox[0]; 
 Tgy=ToaDoy[0]; 
 for(j=0;j<360;j++) 
 { 
 ToaDox[j]=ToaDox[j+1]; 
 ToaDoy[j]=ToaDoy[j+1]; 
 if(j==359) 
 { 
 ToaDox[359]=Tgx; 
 ToaDoy[359]=Tgy; 
 } 
 } 
 } 
 Min2=(double)sqrt((ToaDox[0]-x2)*(ToaDox[0]-x2)+(ToaDoy[0]-y2)*(ToaDoy[0]-y2)); 
 for(i=0;i<360;i++) 
 if(Min2>(double)sqrt((ToaDox[i]-x2)*(ToaDox[i]-x2)+(ToaDoy[i]-y2)*(ToaDoy[i]-y2))) 
 { 
 Min2=(double)sqrt((ToaDox[i]-x2)*(ToaDox[i]-x2)+(ToaDoy[i]-y2)*(ToaDoy[i]-y2)); 
 M2=i; 
 } 
 Min3=(double)sqrt((ToaDox[0]-x3)*(ToaDox[0]-x3)+(ToaDoy[0]-y3)*(ToaDoy[0]-y3)); 
 for(i=0;i<360;i++) 
 if(Min3>(double)sqrt((ToaDox[i]-x3)*(ToaDox[i]-x3)+(ToaDoy[i]-y3)*(ToaDoy[i]-y3))) 
 { 
 Min3=(double)sqrt((ToaDox[i]-x3)*(ToaDox[i]-x3)+(ToaDoy[i]-y3)*(ToaDoy[i]-y3)); 
 M3=i; 
 } 
 } 
 void Main::Write(int x) 
 140
 { 
 char St[10],Tg[10]; 
 itoa(x,Tg,10); 
 strcpy(St,"["); 
 strcat(St,Tg); 
 strcat(St,"]"); 
 setfillstyle(1,7); bar(460,3,636,25); 
 settextjustify(1,1); settextstylevn(0,0,1); 
 outtextxy(600,18,St); 
 outtextxy(520,18,"Thoi gian tre"); 
 } 
 void Main::Speedup() 
 {T=T+2;Write(T);} 
 void Main::Speedown() 
 {T=T-2; 
 if(T<0){T=0;} 
 Write(T);} 
 141
IV. KẾT LUẬN 
1. Các phương pháp hiện đại trong robotics vận dụng cho việc tính toán cơ 
cấu các thiết bị CMM nổi trội so với các phương pháp kinh điển trong tính 
toán cơ cấu cơ khí thông thường, nhất là đối với các cơ cấu chuỗi hở nhiều 
khâu nối liên tiếp như các cơ cấu tay đo. 
 Với các phương pháp đã vận dụng này có thể tính toán một cách hiệu 
quả khi giải các bài toán động học thuận, các bài toán động học ngược và 
các bài toán di chuyển nhỏ trong cơ cấu máy CMM. 
2. Xây dựng được các phiên bản chương trình phần mềm tái hiện các bề 
mặt phức tạp với số phép đo giảm thiểu. Những phiên bản đầu tiên dựa vào 
ý tưởng của các thuật toán “Quả bóng rơi” (Ball Fall) hoặc “Delaunay” và 
các phương pháp nội suy thông thường. Phiên bản cuối có nhiều cải tiến và 
đã được cấp giấy bản quyền tác giả. 
3. Sau khi nghiên cứu, thiết kế, chế thử một vài cơ cấu thiết bị tay đo CMM 
đã đề xuất một loại thiết bị CMM kiểu mới hoạt động theo toạ độ trụZ = Z(r, 
φ). Kết cấu của thiết bị gồm 4 môđun: Môđun thay đổi độ cao Z; Môđun 
thay đổi góc quay φ quanh trục Z; Môđun thay đổi bán kính r hướng tâm 
quay và môđun đầu dò điện tử. Các môđun này đều hình thành từ những 
thiết bị đo lường tiêu chuẩn của nước ngoài, có độ chính xác cao và đều có 
tín hiệu đầu ra hiện số hoặc ghép nối được với máy tính. §ång thêi kÕt hîp 
víi ch−¬ng tr×nh phÇn mÒm t¸i hiÖn c¸c bÒ mÆt cong phøc t¹p víi c¸c phÐp 
®o kÌm phÇn suy luËn. V× thÕ thiÕt bÞ míi nµy cã thÓ ®¹t ®−îc ®é chÝnh x¸c 
 142
tin cËy (phô thuéc vµo c¸c m«®un thiÕt bÞ ®o ®· ®−îc chuÈn hãa vµ ch−¬ng 
tr×nh xö lý sè liÖu ®o) vµ møc ®Çu t− gi¶m xuèng nhiÒu lÇn. 
 143
Tµi liÖu tham kh¶o 
1. Wu.C.H. “Robot Accuracy Analysis based on Kinematics” IEEE Journal 
of Robotics and Automation 2 (3). 1986. 
2. Owen, T. Assembly with Robot. London: Kogan Page, 1985 
3. Paul R.P., Modeling, Trajectory Caculation and Servoing of a Computer 
Controlled Arm. Palo Alto Calif, 1972. 
4. Paul R.P., Robot Manipulators: Mathematics, Programming and Control 
The MIT Press – Cambridge, Massachusetts and London, England, 1981. 
5. Waldron K. J., Kincel G.L., The relation between actuator geometry and 
mechanical effcienncy in robots. Preprints 4th CISM – IFToMM Symposium 
on Theory and Pract. Of Manipul. Warsawa, 1981 
6. Snyder W.E., Industrial Robots: Computer Interfacing and Control. 
Prentice Hall Inc. New Jersey, 1985. 
7. Stone H.W., Kinematic, Modeling Identification, and Control of Robotic 
Manipulators. Kluwer Academic publishers, 1987. 
8. Shimon Y. Nof, Handbook of Industrial Robotics, 2nded. John Wiley & 
Sons. Inc. 1999. 
9. NguyÔn ThiÖn Phóc “Robot c«ng nghiÖp” NXB khoa häc vµ kü thuËt, Hµ 
Néi, 2004. 
10. Morgan, C. Robots: planning and implementation, UK, IFS Publications, 
1984. 
11. Pham and Heginbotham – Robot Grippers. Bedford, UK, IFS 
Publications, 1986. 
 144
12. NguyÔn ThiÖn Phóc, NguyÔn V¨n Minh, TrÇn Ngäc To¶n, Ph¹m §¨ng 
Ph−íc. 
Nghiªn cøu thiÕt kÕ, chÕ t¹o robot s¬n phñ RSP – 406. 
TuyÓn tËp b¸o c¸o khoa häc Héi nghÞ Tù ®éng hãa toµn quèc lÇn thø IV, 
4/2000. 
            Các file đính kèm theo tài liệu này:
 62463.pdf 62463.pdf