You are on page 1of 173

Robtica Teoria e Prtica

ROBTICA
TEORIA &
PRTICA
ROGRIO DUMB

Robtica Teoria e Prtica

Robtica Teoria e Prtica

INTRODUO A ROBTICA
Historia da robtica
rob tica
O precursor do termo rob (Groover, 1988) foi Karel Capek, novelista e escritor

de uma peca teatral da Tchecoslovaquia, que usou pela primeira vez, em 1920,

a palavra robota (servio compulsrio, atividade forcada) originando a palavra


robot em ingls e traduzido para o portugus como rob. Diversos filmes de

fico cientifica mostraram robs produzidos com o comportamento e a forma


humana, levando muitos jovens a pesquisar e desenvolver robs para o mundo
real. Com o surgimento dos computadores na metade do sculo, iniciaram-se

especulaes em termos da capacidade de um rob pensar e agir como um ser

humano. No entanto, os robs foram, neste perodo, criados especialmente

para executarem tarefas difceis, perigosas e impossveis para um ser humano.

Por outro lado, eles no eram projetados com a capacidade de criar ou


Executar processos que no lhes foram ensinados ou programados. Assim

sendo, foram s indstrias que mais se beneficiaram com o desenvolvimento

da robtica, aumentando a produo e eliminando tarefas perigosas, antes

executadas por seres humanos.

Na robtica moderna, ha pesquisas e desenvolvimentos de robs intitulados

humanides ou antropomrficos. Estes so criados com a semelhana humana


e com capacidade de interagir com o ambiente, como o A sim o construdo pela

montadora japonesa Honda Motor Co. Citam-se ainda diversos brinquedos


articulados com feies que lembram animais de estimao como ces, por

exemplo, e que se destinam ao entretenimento. Contudo, tais robs so

incapazes de realizar quaisquer tipos de tarefas, e apenas respondem a


estmulos externos. Estes equipamentos no fazem parte do propsito deste

documento, que visa exclusivamente estudar e compreender os robs

industriais. Estes, por sua vez, caracterizam se por serem capazes de realizar
tarefas, podem ser programados, e possuem forca elevada.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Automao
Automa o

Automao e uma tecnologia que faz uso de sistemas mecnicos, eltricos,

eletrnicos e de computao para efetuar controle de processos produtivos.

Alguns exemplos de processos de automao nas indstrias so:


linhas de montagem automotiva

integrao de motores linha transfer


maquinas operatrizes do tipo CNC
robs

PodemPodem-se identificar trs


tr s formas distintas de automao
automa o industrial:
automao fixa

automao flexvel

automao programvel
a) Automao
Automa o fixa
Na automao fixa as maquinas so especificas para o produto a ser reduzido.

Elas produzem grande quantidade um nico produto, ou produtos com


pequenas variaes entre eles. O volume de produo e elevado, e o custo da
maquina e elevado, pois e projetada para um produto especifico. Por outro

lado, como o volume de produo e alto, o custo do produto em geral e baixo.


Tal maquina so encontradas em linhas transfer de motores, produo de
lmpadas, fabricao de papel e de garrafas. Neste tipo de automao, deve-se

ter cuidado com o preo final do produto, pois, como o investimento de

aquisio da maquina e alto, a amortizao s acontece com vendas elevadas.


Alem disso, se o produto sair do mercado por obsolescncia perde-se o

investimento.

b) Automao
Automa o flexvel
flex vel
Na automao flexvel o volume de produo e mdio e geralmente a maquina
pode ser programada para produzir um outro produto, ainda que semelhante.
Esta automao possui caractersticas da automao fixa e da programvel. A

Robtica Teoria e Prtica

Robtica Teoria e Prtica


maquina deve ser adaptvel a um numero grande de produtos similares, e,

neste sentido, ela e mais flexvel que a automao fixa.

A automao flexvel e empregada, por exemplo, numa linha de montagem


Automotiva.

Na automao programvel o volume de produo e baixo, mas a variedade de

Produtos diferentes e alta. Ela e adaptvel por meio de programao. Os

principais exemplos de automao programvel so as maquinas CNC e os

robs industriais. De todos os processos de automao, a robtica mais se

aproxima da automao programvel. Portanto, os volumes de produo de um

rob industrial no so grandes, mas ele e extremamente adaptvel a produtos

diferentes.

Embora

robs

industriais

sejam

produzidos

em

diversas

configuraes, algumas delas se assemelham, ate certo ponto, a caractersticas

humanas (antropomrficas), e, portanto, so propicias para substituir operaes

realizadas por humanos. Os robs so totalmente programveis, possuem

braos moveis, e so empregados em varias atividades, entre as quais se


destacam:

carregamento e descarregamento de maquinas


soldagem a ponto ou outra forma
pintura ou jateamento

processo de conformao ou usinagem


Embora haja uma tendncia de dotar os robs industriais de mais habilidade
humana, ainda assim eles no possuem forma humana.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Distribuio
Distribui o dos processos de automao
automa o quanto diversidade de produtos e
Volume de produo
produ o.

Fundamentos da tecnologia de robs

A robtica abrange tecnologia de mecnica, eletrnica e computao. Alem

disso, participam em menor grau teoria de controle, microeletrnica, inteligncia

artificial, fatores humanos e teoria de produo. Neste capitulo caso sero

analisadas as caractersticas dos robs industriais que permitem avaliar o grau

de aplicao de um determinado brao a um determinado processo produtivo.

Sero tambm estudados os fundamentos tericos dos elementos que definem

caractersticas fsicas do brao, bem como o desempenho dinmico e o sistema

de controle.

Nomenclatura
As maquinas robticas podem ser classificadas segundo critrios distintos. Por

Exemplo pode ser agrupada quanto aplicao, quanto cadeia cinemtica,

quanto ao tipo de atuadores, quanto anatomia, etc. Sequer o termo rob

possui um significado nico. Pode tanto representar um veiculo autnomo

quanto um humanide ou um simples brao com movimentos. O grau de

interatividade com agentes externos permite classific-los em totalmente

Robtica Teoria e Prtica

Robtica Teoria e Prtica


autnomos, programveis, seqenciais ou ainda inteligentes. De certa forma,

dada a quantidade de aplicaes que surgem a cada momento, e praticamente

impossvel haver uma nica forma de classificao. Para concentrar esforos no

nosso propsito, limitaremos a abrangncia deste manuscrito a robs

industriais. Eles so, em sua grande maioria, maquinas projetada para


substituir o trabalho humano em situaes de desgaste fsico ou mental, ou
ainda situaes perigosas e repetitivas no processo produtivo em indstrias.

Com isso descartam-se aqueles que possuem o atrativo da forma humanide,

mas que so de pouca serventia no ramo industrial. Veculos autnomos e


outras formas robticas tambm ficam de fora. Na nossa terminologia, um rob

ser composto de um circuito eletrnico computadorizado de controle e um

mecanismo articulado denominado manipulador. Porem usar sem distino os


termos:
rob

brao mecnico

mecanismo robtico
manipulador

manipulador mecnico
manipulador robtico

Que passam a representar, portanto, o mesmo dispositivo. Para compreender

melhor a tecnologia robtica, sero analisados, a seguir, alguns fatores que

caracterizam os manipuladores e que so, em grande parte, responsveis por

tornar uma determinada configurao de brao mais adequada a uma dada

automao. Entre estas caractersticas citam-se:


Anatomia

Volume de trabalho

Sistemas de acionamentos
Sistema de controle

Desempenho e preciso
rgos terminais

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Sensores

Programao

Anatomia dos braos


bra os mecnicos
mec nicos industriais
O brao robtico (Groover, 1988) e composto pelo brao e pulso. O brao

consiste de elementos denominados elos unidos por juntas de movimento


relativo, onde so acoplados os acionadores para realizarem estes movimentos

individualmente, dotados de capacidade sensorial, e instrudos por um sistema


de controle. O brao e fixado a base por um lado e ao punho pelo outro. O

punho consiste de varias juntas prximas entre si, que permitem a orientao
do rgo terminal nas posies que correspondem tarefa a ser realizada. Na

Extremidade do punho existe um rgo terminal (Mao ou ferramenta) destinada

a realizar a tarefa exigida pela aplicao. Nos braos reais, a identificao dos

elos e juntas nem sempre e fcil, em virtude da estrutura e de pecas que


cobrem as juntas para proteg-las no ambiente de trabalho.

Esquema de notao de elos e juntas num brao mecnico ilustrativo. Numa

junta qualquer, o elo que estiver mais prximo da base e denominado ela de

Entrada. O elo de sada e aquele mais prximo do rgo terminal.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Seqncia de elos numa junta de um brao robtico. Mostra um brao robtico


industrial, com todas as suas partes.

Juntas

Robtica Teoria e Prtica

Robtica Teoria e Prtica


As juntas (Fu, 1987) podem ser rotativa, prismtica, cilndrica, esfrica,

parafuso e planar.

A junta prismtica
prism tica ou linear: Move em linha reta. So compostas de duas

hastes que deslizam entre si;

A junta rotacional: Gira em torno de uma linha imaginaria estacionaria

chamada de eixo de rotao. Ela gira como uma cadeira giratria e abrem e
fecham como uma dobradia;

A junta esfrica:
esf rica: Funciona com a combinao de trs juntas de rotao,

realizando a rotao em torno de trs eixos;

A junta
junta cilndrica:
cil ndrica: E composta por duas juntas, uma rotacional e uma

prismtica;

A junta planar: E composta por duas juntas prismticas, realiza movimentos

em duas direes;

A junta parafuso: E constituda de um parafuso que contem uma porca ao

qual executa um movimento semelhante ao da junta prismtica, porem, com


movimento no eixo central (movimento do parafuso).

Tipos de juntas empregadas em robs


rob s

Robs industriais utilizam em geral apenas juntas rotativas e prismticas. A

junta planar pode ser considerada como uma juno de duas juntas

Robtica Teoria e Prtica

Robtica Teoria e Prtica


prismticas, e, portanto, e tambm utilizada. As juntas rotativas podem ainda
ser classificadas de acordo com as direes dos elos de entrada e de sada em
relao ao eixo de rotao. Tm-se assim as seguintes juntas rotativas:

Rotativa de toro
tor o ou torcional T: O elo de entrada e de sada tem a mesma

Direo do eixo de rotao da junta.

Rotativa rotacional R: Os elos de entrada e de sada so perpendiculares ao

eixo de rotao da junta.

Rotativa revolvente V: O elo de entrada possui a mesma direo do eixo de

rotao, mas o elo de sada e perpendicular a este.

Representao
Representa o esquemtica
esquem tica de juntas
Robs

industriais

adotam

com

freqncia

solues

que

tornam

reconhecimento das juntas mais complexo. De fato, dependendo da forma com

que os elos so construdos numa representao esquemtica, a nomenclatura

do brao pode ser ambgua.

Este brao poderia ser denominado,

indistintamente, de TVR ou VRR. Para tornar a identificao nica deve-se

buscar uma geometria onde os elos sejam formados por, no Maximo, dois
segmentos lineares. Neste caso, a configurao VRR seria a correta.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Duas configuraes distintas com movimentao idntica: TVR e VRR.
Graus de liberdade

Os graus de liberdade (GL) determinam os movimentos do brao robtico no

espao bidimensional ou tridimensional. Cada junta define um ou dois graus de

liberdade, e, assim, o numero de graus de liberdade do rob e igual somatria

dos graus de liberdade de suas juntas. Por exemplo, quando o movimento

relativo ocorre em um nico eixo, a junta tem um grau de liberdade; caso o

movimento se de em mais de um eixo, a junta tem dois graus de liberdade.


Observa-se que quanto maior as quantidades de graus de liberdade, mais

complicadas so a cinemtica, a dinmica e o controle do manipulador. O

numero de graus de liberdade de um manipulador esta associado ao numero


de variveis posicionais independentes que permitem definir a posio de todas

as partes de forma unvoca. Braos com um ( esquerda) e dois graus de

liberdade (a direita) Os movimentos robticos podem ser separados em

movimentos do brao e do punho.

Em geral os braos so dotados de 3 acionadores e uma configurao 3GL,

numa configurao que permita que o rgo terminal alcance um ponto

qualquer dentro de um espao limitado ao redor do brao. Pode-se identificar 3

movimentos independentes num brao qualquer:

Vertical transversal movimento vertical do punho para cima ou para baixo

Rotacional transversal movimento do punho horizontalmente para a

esquerda ou para a direita.

Radial transversal movimento de aproximao ou afastamento do punho

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Os punhos so compostos de 2 ou 3 graus de liberdade. As juntas dos punhos

so agrupadas num pequeno volume de forma a no movimentar o rgo

terminal em demasia ao serem acionadas. Em particular, o movimento do


punho possui nomenclaturas especificas.

Roll ou rolamento
rolamento - rotao do punho em torno do brao

Pitch ou arfagem - rotao do punho para cima ou para baixo

Yaw ou guinada - rotao do punho para a esquerda e para a direita.

Movimentos de um punho com 3 GL, nas direes


dire es guinada, arfagem e

rolamento.

Cadeias cinemticas
cinem ticas:
ticas:
Uma das principais caractersticas de um brao industrial e sua capacidade de

carga, isto e, qual e o peso Maximo que ele consegue manipular (erguer) sem
que sua preciso seja afetada. Esta capacidade e sempre medida na posio

mais critica, o que significa em geral uma posio de mxima extenso do


brao. Varias solues podem ser adotadas para aliviar o peso do prprio

manipulador e, conseqentemente, aumentar a capacidade de carga, como,


por exemplo, a adoo de acionamento indireto, que ser visto mais adiante.

Uma outra forma e utilizar cadeias cinemticas fechadas ou parcialmente

fechadas. Um rob de cadeia cinemtica aberta e aquele que, partindo da

Robtica Teoria e Prtica

Robtica Teoria e Prtica


base, chegam-se ao punho por meio de um nico caminho numa seqncia

elo-junta-elo. Um brao articulado do tipo revoluto e um exemplo tpico de

cadeia aberta. J num brao de cadeia fechada, no existe um nico caminho

para se chegar ao punho. Vrios elos podem estar conectados entre si, de tal
forma que e possvel percorrer, por exemplo, um caminho que parta da base e

retorne a ela por outro caminho apos atingir o punho. Exemplos deste tipo de
manipuladores so os robs prticos (gantry), utilizados em operaes de

manipulao e armazenagem de material. Existem ainda braos que

apresentam parte da cadeia aberta e parte fechada, denominados de cadeia


parcialmente fechada. A Figura 3.9 mostra um esquema de um brao com
cadeia parcialmente fechada. Percebe-se, neste esquema, que o brao possui
apenas um grau de liberdade, embora possua 4 articulaes e 3 elos. O

acionamento deste brao deve ser feito com um nico motor, conectado a uma

das duas articulaes da base. Tais cadeias permitem que o motor de

acionamento de uma dada junta possa ser fixado mais prximo da base, o que
permite reduzir a inrcia do conjunto e aumentar a velocidade e preciso do

manipulador.

Representao
Representa o esquemtica
esquem tica de brao
bra o robtico
rob tico com cadeia cinemtica
cinem tica
Parcialmente fechada.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Manipuladores de cadeia parcialmente fechada (a esquerda) e fechada (a direita)

A representao esquemtica de junes ou articulaes no motoras nos

braos com cadeia fechada e diferente daquela utilizada nas juntas motoras.

Costuma-se utilizar a mesma representao daquela utilizada nas juntas,

porem em tamanho menor. Alem disso, e freqente, em tais braos, a

existncia de 3 ou mais articulaes ou juntas fixadas ao mesmo elo.


Representao
Representa o esquemtica
esquem tica de articulaes
articula es no
n o motoras

Configurao
Configura o dos robs
rob s

A configurao fsica dos robs (Groover, 1988) esta relacionada com os tipos

de juntas que ele possui. Cada configurao pode ser representada por um
esquema de notao de letras, como visto anteriormente. Considera-se

Robtica Teoria e Prtica

Robtica Teoria e Prtica


primeiro os graus de liberdade mais prximos da base, ou seja, as juntas do

corpo, do brao e posteriormente do punho. Como visto anteriormente, um

brao mecnico e formado pela base, brao e punho. O brao e ligado a base e

esta e fixada ao cho, a parede ou ao teto. E o brao que efetua os movimentos


e posiciona o punho. O punho e dotado de movimentos destinados a orientar
(apontar) o rgo terminal. O rgo terminal executa a ao, mas no faz parte

da anatomia do brao robtico, pois depende da aplicao a ser exercida pelo

brao. A movimentao do brao e a orientao do punho so realizadas por

juntas, que so articulaes providas de motores. Em resumo, a base sustenta


o corpo, que movimenta o brao, que posiciona o punho, que orienta o rgo

terminal, que executa a ao. Em geral utilizam-se 3 juntas para o brao e de 2

a 3 juntas para o punho. Os elos do brao so de grande tamanho, para


permitir um longo alcance. Por outro lado, os elos do punho so pequenos, e,

s vezes, de comprimento nulo, para que o rgo terminal desloque-se o

mnimo possvel durante a orientao do punho. Adota-se uma nomenclatura


para os manipuladores com base nos tipos de juntas utilizadas na cadeia de

elos, que parte da base em direo ao rgo terminal. Assim um manipulador

TRR teria a primeira junta (da base) torcional, e as duas seguintes seriam

rotacionais. O punho segue a mesma notao, porem separa-se o corpo


do punho por dois pontos:, por exemplo, TRR: RR. As configuraes tpicas

para o brao e o punho de robs industriais so apresentadas nas Tabelas.


Esquema de notao
nota o para designar configuraes
configura es de robs
rob s
Configura
Configurao
igura o do rob
rob brao
bra o e corpo

Smbolo
mbolo

Configurao cartesiana

LLL

Configurao cilndrica

LVL

Configurao articulada ou revoluta

TRR

Configurao esfrica

TRL

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Configurao SCARA

VRL

Esquema de notao
nota o para designar configuraes
configura es do pulso
Configurao
Configura o do rob
rob (pulso)

Smbolo
mbolo

Configurao Pulso de 2 eixos

RT

Configurao Pulso de 3 eixos

TRT

Configurao
Configura o de um punho TRT na forma compacta. Embora todas as
juntas sejam resolventes, este punho tem denominao
denomina o TRT.

Rob
Rob cartesiano
cartesiano
O rob de coordenadas cartesianas usa trs juntas lineares. E o rob de

configurao mais simples, desloca as trs juntas uma em relao a outra. Este
rob opera dentro de um envoltrio de trabalho cbico.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Rob
Rob cartesiano (LLL)
Rob
Rob cilndrico
cil ndrico

Este brao possui na base uma junta prismtica, sobre a qual apia uma junta
rotativa (resolvente ou torcional). Uma terceira junta do tipo prismtica e

conectada na junta rotativa formando uma configurao LVL. Este brao

apresenta um volume de trabalho cilndrico, e pode-se apresentar tambm na

configurao TLL.

Brao
Bra o robtico
rob tico cilndrico
cil ndrico
Rob
Rob esfrico
esf rico ou polar

Este tipo de brao robtico foi projetado para suportar grandes cargas e ter

grande alcance. E bastante utilizado para carga e descarga de maquinas,

Robtica Teoria e Prtica

Robtica Teoria e Prtica


embora o brao revoluto seja mais comum nestas aplicaes. Ele conta com

duas juntas rotativas seguidas de uma junta prismtica. A primeira junta move o

brao ao redor de um eixo vertical, enquanto que a segunda junta gira o


conjunto ao redor de um eixo horizontal. O volume de trabalho e um setor
esfrico, de onde este manipulador obteve seu nome. A denominao polar

deve-se as coordenadas polares de sistemas de eixos cartesianos,

caracterizadas por duas coordenadas angulares (juntas rotativas) e uma

coordenada radial (junta prismtica). Este tipo de brao esta em desuso, sendo

substitudos pelos braos revolutos.

Rob
Rob polar em configurao
configura o VVL.

Rob
Rob SCARA

Este e tambm um brao bastante utilizado, pois e compacto, tem grande

preciso

repetibilidade,

embora

com

um

alcance

limitado.

Estas

caractersticas o tornam prprios para trabalhos em montagem mecnica ou

eletrnica que exigem alta preciso. Possui duas juntas rotativas e uma junta

linear, que atua sempre na vertical, como visto na Figura 3.16. O volume de
trabalho deste brao e cilndrico, porem, como utiliza juntas rotativas, e tambm

considerado articulado. O nome e um acrnimo de Selective Compliance


Assembly Robot Arm, ou Brao Robtico de Montagem com Complacncia

Seletiva.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Rob
Rob com articula
articulao
icula o horizontal SCARA.
Rob
Rob articulado ou revoluto
Estes tipos de robs (Groover, 1988, Adade Filho, 1992), possuem 3 juntas

rotativas, conforme ilustrada a Figura 3.17. Eles so os mais usados nas

indstrias, por terem uma configurao semelhante ao do brao humano,

(brao, antebrao e pulso). O pulso e unido a extremidade do antebrao, o que

propicia junta adicional para orientao do rgo terminal. Este modelo de

configurao e o mais verstil dos manipuladores, pois assegura maiores

movimentos dentro de um espao compacto.

Os braos
bra os revolutos podem ser de dois tipos:
Cadeia aberta ou cadeia parcialmente fechada. Nos primeiros pode-se

distinguir facilmente a seqencia natural formada por elo-junta, da base ate o

punho.

Nos braos de cadeia parcialmente fechada o atuador da terceira junta efetua o

movimento desta por meio de elos e articulaes no motorizadas adicionais.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Rob
Rob articulado ou revoluto
Rob
Rob paralelo

Estes tipos de manipuladores possuem juntas que transformam movimentos de

rotao em translao, ou usam diretamente juntas prismticas. Sua principal

caracterstica e um volume de trabalho reduzido, porem uma alta velocidade, o


que o torna propicio para certas atividades de montagem. Outra caracterstica

destes braos e que eles no possuem cinemtica com cadeia aberta, como a

maioria dos robs industriais. Os quatro ou seis atuadores destes braos unem

a base diretamente ao punho.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Um rob
rob do tipo prtico
p rtico (
(gantry
gantry), a esquerda, fabricado pela BMI, e um rob
rob
Cilndrico
Cil ndrico feito pela ST
ST Robotics, a direita.

Brao
rob SCARA, produzido
Bra o do tipo polar, feito pela Fanuc, a esquerda e um rob
Pela Staubli, a direita.

Um brao revoluto de cadeia aberta comercializado pela Panasonic (a

esquerda) e o rob paralelo Quattro produzido pela Adept (a direita).


rg
rgo
rg o terminal

Na robtica, rgo terminal (Groover, 1988) e usado para descrever a Mao ou

Ferramenta que esta conectada ao pulso, como por exemplo, uma pistola de
solda, garras, pulverizadores de tintas, entre outros. O rgo terminal e o

responsvel por realizar a manipulao de objetos em diferentes tamanhos,

Robtica Teoria e Prtica

Robtica Teoria e Prtica


formas e materiais, porem esta manipulao depende da aplicao ao qual se

destina. E valido ressaltar que os rgos terminais requerem cuidados ao


serem projetados, pois e necessrio controlar a forca que esta sendo aplicada

num objeto. Para isso, alguns rgos terminais so dotados de sensores que

fornecem informaes sobre os objetos. Existe uma grande variedade de


modelos de garras que podem ser utilizadas em diversas aplicaes, como por

exemplos:

Garra de dois dedos;

Garra para objetos cilndricos;


Garra articulada.

A garra de dois dedos, e um modelo simples e com movimentos paralelos ou

rotacionais. Este modelo de garra proporciona pouca versatilidade na

manipulao dos objetos, pois existe limitao na abertura dos dedos. Desta

forma a dimenso dos objetos no pode exceder esta abertura.


Modelo de garras de dois dedos

A garra de objetos cilndricos, como pode ser visualizada, tambm consiste de

dois dedos com semicrculos, os quais permitem segurar objetos cilndricos de


diversos dimetros diferentes.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Modelo de garra para objetos cilndricos


cil ndricos

A garra articulada tem a forma mais similar a mo humana, a qual proporciona


uma versatilidade considervel para manipular objetos de formas irregulares e
tamanhos diferentes. Esta caracterstica esta relacionada com a quantidade de
elos. Estes elos so movimentados por cabos ou msculos artificiais, entre
outros.

Modelo de garra articulada

Sensores

Sensores so dispositivos cuja finalidade e obter informaes sobre o ambiente

em que se encontram, e so utilizados como componentes do sistema de

controle de realimentao do rob. Ha diversos tipos de sensores que podem


ser classificados de acordo com os princpios fsicos sobre os quais eles esto

baseados.

Sensor de posio
posi o
O sensor de posio determina as posies dos elos ou de elementos externos,

informando ao sistema de controle que, ento, executa as decises apropriadas

para o funcionamento. Um tipo de sensor de posio, por exemplo, e o

encoder que tem como propriedade informar a posio por meio de contagem

de pulsos. Neste caso, tem-se uma fonte de luz, um receptor e um disco


perfurado, que ira modular a recepo da luz ao girar. Este disco esta preso a

Robtica Teoria e Prtica

Robtica Teoria e Prtica


uma junta, de forma a criar um movimento rotacional, enquanto que a fonte de
luz e o receptor esto fixos. A rotao do disco cria uma serie de pulsos pela

interrupo ou no da luz recebida pelo detector. Estes pulsos de luz so


transformados pelo detector em uma serie de pulsos eltricos. Os encoders

podem ser classificados em absoluto e incremental.


Sensor de toque

O sensor de toque fornece um sinal binrio de sada que indica se houve ou

no contato com o objeto. Um dos modelos mais simples e feito com duas

chapas de metal que devem ser tocadas ao mesmo tempo pelos dedos de uma
pessoa. A resistncia dos dedos e suficiente para acionar um circuito sensvel.

Sensor de presso
press o
O sensor de presso e uma estrutura mecnica planejada a deformar-se dentro
de certos limites. Um modelo simples deste tipo de sensor pode ser feito com

material de esponja condutora, pois ela tem uma resistividade elevada que se

altera quando deformada. Outro modelo mais sofisticado e verstil e o straingage, que e, na sua forma mais completa, um resistor eltrico composto de

uma finssima camada de material condutor. As tenses mecnicas so


proporcionais as deformaes medidas pelo sensor.

Sistemas de acionamento
Os acionadores (Groover, 1988) so dispositivos responsveis pelo movimento

das articulaes e do desempenho dinmico do rob. Esses dispositivos podem


ser eltricos, hidrulicos ou pneumticos, cada um com suas caractersticas. A

seguir ser descrito o funcionamento desses dispositivos.


Acionadores hidrulicos
hidr ulicos

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Os principais componentes deste sistema so: motor, cilindro, bomba de leo,

vlvula e tanque de leo. O motor e responsvel pelo fluxo de leo no cilindro

em direo ao pisto que movimenta a junta. Assim, este tipo de acionador e

geralmente associado a robs de maior porte, quando comparados aos

acionadores pneumticos e eltricos. Entretanto a preciso em relao aos

acionadores eltricos e menor. Existem diversos tipos diferentes de motores

hidrulicos, como motor de palheta, de engrenagem, de lbulos, etc., e todos

eles apresentam caractersticas de alto torque especifico, ou seja, torque

elevado com massa e volume reduzidos. So, portanto, apropriados para

braos que manipulam grandes cargas. Em contrapartida, a exigncia de


elementos de controle e pressurizao do fluido hidrulico faz com que o custo

destes sistemas seja elevado, tornando-se vantajoso apenas em braos de

grande porte. Apresentam, adicionalmente, problemas de manuteno, j que

podem ocorrer vazamentos do fluido e desgaste na bomba e motores. Deve ser


mencionado, finalmente, que atuadores hidrulicos lineares so mais

compactos e robustos do que seus equivalentes eltricos ou mesmo

pneumticos, e com isso so indicados para uso em robs do tipo prtico ou


esfricos, que utilizam juntas prismticas.

Acionadores eltricos
el tricos

Geralmente robs de tamanho pequeno a mdio utilizam acionadores eltricos.

Os acionadores eltricos mais comuns em uso nos robs so: motor de


corrente continua ou DC, servo-motor e motor de passo. Esses tipos de

acionadores no propiciam muita velocidade ou potencia, quando comparados

com acionadores hidrulicos, porem atingem maior preciso. Em geral so

dotados de redutores para reduzir a velocidade e aumentar o torque.


Acionamentos eltricos podem ser utilizados em juntas prismticas, com a

transformao do movimento rotativo do motor em movimento linear por meio

de um fuso. Motores eltricos lineares no so utilizados, pois produzem forcas


de pequena intensidade. O custo do acionamento eltrico cresce com o torque

necessrio para acionar o brao mecnico, j o tamanho do motor e

praticamente proporcional ao conjugado produzido. Por outro lado, a simples


reduo da velocidade, por meio de redutor, embora propicie maior preciso e

Robtica Teoria e Prtica

Robtica Teoria e Prtica


maior torque, reduz significativamente a produtividade. Maior torque significa
maior velocidade ou maior carga, e ambos so desejveis. O custo de

acionadores hidrulicos cresce tambm com a demanda de torque, porem de

forma mais lenta, j que tais motores tendem a ser mais compactos.

Adicionalmente o custo dos equipamentos de condicionamento e controle do


fluido hidrulico e alto e pouco influenciado pela escala. Isto indica, que o

acionamento eltrico e mais vantajoso economicamente em braos de pequeno

e mdio porte, ao passo que o acionamento hidrulico e melhor quando se trata


de gerar grandes potencias e cargas.

Custo de braos
bra os robticos
rob ticos em funo
fun o da capacidade de carga, para
ServoServo-motor

acionamento hidrulico
hidr ulico e eltrico.
el trico.

Servos-motores so compostos por motores DC e um redutor de velocidades,

junto com um sensor de posio e um sistema de controle re-alimentado. Em

outras palavras, os servos-motores podem ser considerados como sendo


motores comandados em posio (angular ou linear), j que, do ponto de vista

de quem os utiliza, o controle interno em malha fechada e irrelevante. Os

servos-motores so pequenos, com ampla variao de torques. O mecanismo

de posicionamento ajusta a posio angular por meio de um sinal codificado


que lhe e enviado. Enquanto esse cdigo estiver na entrada, o servo ira manter

a sua posio angular. Em geral o sinal e do tipo PWM (Pulse Width

Modulation), ou seja, a posio angular ira depender da largura do pulso

enviado.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Motor de passo
Os motores de passo so usados em aplicaes de servio relativamente leves

e algumas das suas caractersticas de desempenho so apresentadas a seguir:


Rotao em sentido horrio e anti-horrio;

Variaes incrementais de preciso angular;


Repetio de movimentos bastante exatos;
Baixo torque;

Um torque de sustentao a velocidade zero;


Possibilidade de controle digital.

Os motores de passo podem ser bipolares ou unipolares. Em ambos os casos

as fontes utilizadas so de tenso continua e requerem um circuito digital que


produza as seqncias de sinais para que o motor funcione corretamente. A

forma com que o motor ira operar dependera bastante do que se deseja
controlar. Existem casos em que o torque e mais importante, em outras a

preciso ou mesmo a velocidade so mais relevantes. Ao trabalhar com

motores de passo, precisa-se de algumas caractersticas de funcionamento,

como a tenso de alimentao, a mxima corrente eltrica suportada nas

bobinas, o grau (preciso), o torque. Motores de passo podem ser acionados


de diversas formas. As duas formas mais comuns so: passo completo e meio

passo. No modo de operao em passo completo pode-se acionar apenas uma

ou duas bobinas a cada passo. No primeiro caso apenas uma bobina e


energizada a cada passo, o torque gerado e menor, assim como o consumo.

Passo completo com uma bobina energizada em rotao


rota o com sentido horrio.
hor rio.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


No caso de modo completo com duas bobinas energizadas, tem-se um maior
torque, e um consumo maior do que no caso anterior. A velocidade costuma

ser maior do que nas demais formas, mas a velocidade mxima de um motor

de passo e altamente dependente da eletrnica e da estratgia de controle. A


seqncia dos passos em sentido horrio e o acionamento das bobinas.
Passo completo com duas bobinas em rotao
rota o no sentido horrio
hor rio

Por outro lado, no modo de operao em meio passo combinam-se as duas


estratgias anteriores, obtendo-se com isso um efeito de meio passo a cada

mudana no acionamento das bobinas. Este modo consome mais energia que

os dois anteriores, mas atinge maior preciso em virtude do menor passo. O


torque gerado e prximo ao do acionamento completo com duas bobinas, mas
a velocidade costuma ser menor.
Meio passo em sentido horrio
hor rio

Para mudar a direo de rotao do motor nos dois modos de acionamento,


basta inverter a seqncia dos passos.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Acionadores pneumticos
pneum ticos

Os acionadores pneumticos so semelhantes aos acionadores hidrulicos,

porem a diferena e a utilizao de ar ao invs de leo. Entretanto o ar e


altamente compressvel, o que causa uma baixa preciso e forca, mas estes
acionadores possuem alta velocidade. Acionadores pneumticos lineares

(cilindros) requerem sistemas sofisticados e complexos para controlarem a


posio em pontos ao longo do curso. Justamente por isso, so pouco
utilizados em aplicaes que tenham tal necessidade. Porem, diversas tarefas

de produo podem ser automatizadas com atuadores pneumticos lineares

trabalhando entre os extremos de posio, ou seja, totalmente recolhido ou


totalmente estendido, que apresentam boa repetibilidade. Estas tarefas em

geral so simples, consistindo de movimentao de material, fixao de pecas e

separao de objetos, chamadas genericamente de operaes pega-e-poe. O

baixo custo dos acionadores pneumticos e da gerao de ar-comprimido faz

com que a automao pneumtica seja a mais adequada se o trabalho a ser


realizado for simples. Pode-se utilizar o acionamento pneumtico em juntas

rotativas de forma direta (acionadores rotativos) ou com redutores (motores


pneumticos de lbulos ou palhetas). Tais aplicaes so, contudo, muito

especificas e indicadas apenas quando houver restries quanto ao


acionamento eltrico ou hidrulico. A programao de sistemas pneumticos

pode ser realizada com controladores lgicos programveis (PLC), ou mesmo

por chaves distribuidoras e chaves fim-de-curso. Este tipo de programao


permite certa flexibilidade na seqncia de acionamentos, porem e bastante

limitada no que se refere a mudanas na forma e no tipo de tarefa executada.

Pode-se dizer, portanto, que sistemas pneumticos esto mais prximos de


uma automao fixa do que da automao programvel.

Mtodos
todos de acionamento
Os acionadores eltricos (Groover, 1988) tendem a ser maiores e mais
pesados que acionadores hidrulicos e pneumticos. Por este motivo, nem
sempre e possvel posicionar tais atuadores prximos as respectivas juntas, em

Robtica Teoria e Prtica

Robtica Teoria e Prtica


virtude de restries no espao disponvel ou de problemas com deflexes

devido ao peso. Assim sendo, os acionadores podem ser acoplados de forma


direta ou indireta.

Acionamento indireto
Uma vez que os atuadores das juntas so pesados, os fabricantes tentam
introduzir alteraes no projeto que permitam reduo do peso nas juntas
prximas ao pulso e transferir este peso, quando possvel, para a base. Desta

forma consegue-se uma capacidade de carga maior para o brao. Este tipo de

acionamento e denominado indireto, j que o atuador fica afastado da junta

movida por ele. Neste tipo de acionamento, e necessrio usar algum tipo de

transmisso

de

potencia,

como

polias,

correntes,

rodas

dentadas,

engrenagens, parafusos e correias, ou seja, o acionador e adaptado longe da


junta pretendida do manipulador. Entretanto este mtodo sofre efeitos

indesejados no desempenho do rob, devido a folga nas engrenagens, flexo


dos vnculos do manipulador, escorregamento dos sistemas de polias.

Acionamento direto

Neste mtodo, o acionador e adaptado diretamente na junta, o que, em

determinados casos, proporciona melhor preciso e rendimento de potencia em


relao ao acionamento indireto. Contudo, devido ao baixo torque por unidade
de peso alcanado pelos motores eltricos, costuma-se utiliz-los em conjunto
com redutores de engrenagens, que aumentam o torque, porem reduzem a

velocidade. Neste caso, se o acionador estiver fixado no elo motor, o


acionamento e considerado direto. Nas juntas rotativas com acionamento
direto, o sensor de posio angular (encoder) fornece o angulo relativo entre o

elo motor e o elo movido. No acionamento indireto esta leitura fornece o angulo
do elo movido em relao a um outro elo, anterior ao elo motor.
Volume de trabalho

O volume de trabalho (Groover, 1988) e o termo que se refere ao espao que

um determinado brao consegue posicionar seu pulso. Este volume, em geral,

e estabelecido conforme os limites impostos pelo projeto estrutural do brao, ou

Robtica Teoria e Prtica

Robtica Teoria e Prtica


seja, a configurao fsica do brao robtico, os limites dos movimentos das

juntas e o tamanho dos componentes do corpo, brao e pulso. Por exemplo, o

volume de trabalho de um brao esfrico (TRL) seria, teoricamente, o volume

da esfera cujo raio e o comprimento do brao esticado. Braos robticos

possuem volumes que dependem, e claro, da geometria e dos limites impostos

ao movimento por motivos estruturais ou de controle. Na maior parte deles, o

volume e altamente dependente de detalhes construtivos e raramente aparenta

ou aproxima-se do volume terico. Por exemplo, o volume de um manipulador

cilndrico deveria ser um cilindro, mas em geral no e. Em resumo, o volume de

trabalho de um manipulador depende, basicamente, da configurao do brao,


dos comprimentos dos elos (brao e punho) e de limites e restries

construtivas a movimentao das juntas.

Volume de trabalho terico


te rico de um rob
rob cilndrico.
cil ndrico.

Os volumes de trabalho so medidos em unidades volumtricas, porem isto

pouco ou nada contribui na seleo de um brao para determinada aplicao.

Muito mais importante do que conhecer que o volume de um brao e de 1832

litros seria saber se ele consegue ou no atingir um ponto afastado de 840 mm


do seu eixo vertical, por exemplo. Em virtude deste aspecto, os fabricantes de

manipuladores robticos fornecem o volume de trabalho em termos do alcance

do brao em um ou mais planos. A rea de trabalho de um brao SCARA em

vista superior, produzido pela Staubli. O deslocamento da terceira junta e de

200 mm, neste brao. Braos articulados ou resolventes apresentam em geral


um volume bastante complexo, pois as juntas tm movimentos limitados. O
volume do brao KR30HA produzido pela Kuka Robotics.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Volume (rea)
til do manipulador RS40B. (Fonte: Staubli Robotics)
( rea) til

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Volume de manipulador KR30HA produzido pela Kuka Robotics. (Fonte: Kuka
Robotics).

Os volumes, alcances ou reas de trabalho devem ser expressos sem a

presena do rgo terminal, j que este pode alterar significativamente tais

valores, dependendo da aplicao.

Dispositivos de entrada para manipuladores

Vrios tipos de dispositivos de entrada como joystick, mouse, teclado e luvas

artificiais permitem programar um rob. Esses dispositivos so meios de

interao homem35 maquina, isto e, sinais de dados que so enviados ao


sistema de controle, e este os transmitem para os acionadores, os quais
realizam os movimentos dos manipuladores.
Sistema de Controle
O sistema de controle de qualquer rob e realizado por meio de um sistema de

Software e hardware. Este sistema processa os sinais de entrada e converte

estes sinais em uma ao ao qual foi programado. O software pode ser


desenvolvido em um computador pessoal ou num micro controlador.
controlador Neste

aspecto, deve-se levar em considerao os pontos fortes e fracos de cada

possibilidade. O micro controlador reduz o custo do projeto, e rpido, dedica-se

apenas ao controle do rob, porem possui limitaes em relao ao tamanho do


software. J o computador pessoal possui alta taxa de processamento e maior
espao para a alocao do software. Pode-se ainda aplicar uma soluo mista,

em que a parte mais leve do software fica no micro controlador e a parte de

maior processamento fica no computador pessoal. O sistema de hardware


pode constituir, por exemplo, de motores de passos, cabos, dispositivo de

entrada, sensores e amplificadores de potencia. Um dos fatores mais


importantes e a utilizao de sensores (Bolton, 1995), pois podem ser

dispositivos de um sistema de malha fechada, ou seja, consiste em verificar o

estado atual do dispositivo a ser controlado e comparar essa medida com um

valor predefinido. Esta comparao resultara num erro, ao qual o sistema de

Robtica Teoria e Prtica

Robtica Teoria e Prtica


controle far os ajustes necessrios para que o erro seja reduzido a zero. Um

esquema simples de malha fechada e apresentado em diagrama de blocos.

Diagrama de blocos do controle em malha fechada de um manipulador


manipulador
robtico.
rob tico.

Programao
Programa o de robs
rob s

Braos
Bra os mecnicos
mec nicos so
s o programados de diversas formas:
Manipulador manual: E todo engenho mecnico de manejo de pecas ou

ferramentas que requeira a interveno manual do homem para sua operao,

ou seja, o homem guia manualmente a maquina servindo essa como uma


multiplicadora de forcas;

Rob
Rob seqencial:
seq encial: E aquele que realiza um trajeto seqencial, podendo ser

uma seqncia fixa definida pelo fabricante e inacessvel para o usurio, ou de

seqncia varivel em que e alterada conforme as necessidades dos usurios;

Rob
Rob de aprendizagem: Neste tipo de rob, o trajeto ou seqncia e

programado guiando-o manualmente pelo caminho que deve seguir;

Rob "inteligente: E aquele que muda as condies de trabalho mediante

estmulos externos provenientes de sensores ticos, magnticos, sonoros, etc.


Dinmica
Din mica do brao
bra o robtico
rob tico

O desempenho dinmico do brao robtico (Groover, 1988) esta associado a

velocidade de resposta, estabilidade e preciso. A velocidade de resposta


refere-se a destreza do brao robtico ao mover-se de um lugar para outro num

curto perodo de tempo. Desta forma, o torque existente em cada junta do

Robtica Teoria e Prtica

Robtica Teoria e Prtica


brao e a acelerao em cada elo devem ser analisadas. J a estabilidade pode

ser estimada com base no tempo necessrio para amortecer as oscilaes que

ocorrem durante o movimento de uma posio para a outra. Se a estabilidade


for baixa pode-se aplicar elementos de amortecimento no brao, que melhoram

a estabilidade, mas influem na velocidade de resposta. A precisao esta

relacionada com a velocidade e estabilidade, pois e uma medida de erro na


posio do rgo terminal. Os conceitos relacionados com a preciso so
analisados a seguir.

Preciso
Precis o dos movimentos
A preciso de movimento esta intrinsecamente correlacionada com trs

caractersticas, como segue:


Resoluo espacial
Preciso

Repetibilidade.
A resoluo espacial depende diretamente do controle de sistema e das

inexatides mecnicas do brao robtico. O sistema de controle e o

responsvel por controlar todos os incrementos individuais das articulaes. J

as inexatides relacionam-se com a qualidade dos componentes que formam


as unies entre as articulaes, como as folgas nas engrenagens, tenses nas

polias, e histereses mecnicas e magnticas, entre outros fatores. A preciso


esta relacionada com a capacidade de um brao posicionar o seu pulso em um

ponto marcado dentro do volume de trabalho. A preciso relaciona-se com a

resoluo espacial, pois a preciso depende dos incrementos que as juntas


podem realizar para se movimentar e atingir um ponto determinado. Por fim, a
repetibilidade esta relacionada com a capacidade do brao robtico de

posicionar repetidamente seu pulso num ponto determinado. Estes movimentos


podem sofrer influencias de folgas mecnicas, da flexibilidade e das limitaes
do sistema de controle.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Transmisso
Transmiss o de potencia
Na maioria dos braos robticos no e possvel encontrar acionadores com as

propriedades exatas de velocidade-torque ou de velocidade-forca. Sendo

assim, existe a necessidade de se usar algum tipo de dispositivo de


transmisso de potencia. Para isso pode-se usar correias e polias, correntes e

rodas dentadas, engrenagens, eixos de transmisso e parafusos. Um exemplo

de dispositivo de transmisso simples e bastante utilizado em robs e a

engrenagem. As engrenagens possuem movimentos rotativos e a transferncia

pode ser entre eixos perpendiculares ou eixos paralelos. Duas engrenagens

para transmisso com eixos paralelos e so conhecidas como engrenagens

cilndricas. A menor e conhecida como pinho, e a maior e a coroa. Se o pinho

tiver um quarto do tamanho da coroa, para cada revoluo feita pelo pinho a

coroa gira apenas um quarto de uma revoluo, reduzindo, portanto, em um


quarto a velocidade angular e aumentando o torque em quatro vezes.

Engrenagens para transmisso, com eixos paralelos.

O numero de dentes numa engrenagem e proporcional a seu dimetro, ento a


relao das engrenagens e obtida por:

onde N1 e o numero de dentes do pinho e N2 e numero de dentes da coroa.


A velocidade da sada em relao a entrada e dada por:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


em que e a velocidade de sada e e a velocidade de entrada. O torque
o

in

vale:

Preciso
Precis o cartesiana em juntas robticas
rob ticas

Supondo-se que sejam conhecidas as precises (ou resoluo do controle) em

cada uma das juntas de um brao mecnico, deseja-se saber qual ser a

preciso cartesiana, isto e, qual ser a preciso do brao num determinado

ponto de trabalho. E evidente que a preciso cartesiana depende do ponto de

operao, pois os erros de juntas rotativas so mais acentuados quando o


brao estiver estendido do que quando estiver recolhido. Ser feita agora uma

analise simples para um brao de apenas uma junta rotativa, e, a seguir, um

brao composto de duas juntas rotativas movendo-se num plano. Considera-se


um brao articulado movendo-se no plano xy, tal que a origem do sistema

coincida com o eixo de rotao, conforme mostra a figura 3.30. Ao passar da

posio P para a posio P', movendo-se do incremento mnimo (resoluo da

junta), as novas coordenadas cartesianas do ponto passam a ser x' e y'. Como
o vetor de deslocamento v possui modulo a

, e lembrando que PP' e

perpendicular ao elo a em P para pequenos valores do ngulo

, tem-se que:

Nota-se que um erro de posicionamento tanto pode ser positivo quanto

negativo. Contudo, uma vez que deseja-se em geral o erro Maximo que um
dado brao possa apresentar, ento deve-se obter o modulo do erro ou seja:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Deslocamento angular de um brao


bra o com 1GL.
Considera-se agora um brao com dois graus de liberdade e duas juntas

rotativas movendo-se num plano. Neste brao percebe-se que as imprecises

cartesianas dependem do movimento de ambas as juntas, uma vez que tanto


J1 quanto J2 movimentam a extremidade do brao (garra). O erro total ser

portanto composto pela soma dos erros causados por cada uma das juntas. A
junta J2 provoca um erro semelhante ao causado por um brao de uma nica

junta, visto anteriormente, de tal forma que.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Deslocamento angular de um brao


bra o com 2GL num plano.
Se

for tambm pequeno, ento se pode projetar o vetor v em ambas as

direes para se obter:

Se o brao possuir uma junta prismtica, como visto abaixo, ento segue

imediatamente que a projeo do erro _a nos eixos cartesianos devido ao


movimento linear da junta J2 e dado por.

e o erro devido ao movimento rotacional da junta J1 e semelhante ao descrito


no primeiro exemplo acima, resultando para o erro total.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Deslocamento de um brao
bra o com 2GL e juntas
juntas RL.

Percebe-se nos exemplos mostrados que passando o incremento ao limite,


tem-se que,

onde

indica a derivada parcial da coordenada cartesiana x com relao

a variao do angulo

. Esta expresso vale tambm para a segunda junta, e

vale igualmente para braos que se movem no espao. Isto permite generalizar

a expresso para a preciso cartesiana na forma:

onde w e um eixo cartesiano qualquer (x, y ou z), e os

(i = 1, 2, ..., n) so as

variveis das n juntas deste brao. Esta mesma expresso pode ser utilizada

em braos com juntas prismticas, tomando-se apenas o cuidado de lembrar


que nestas juntas a varivel e o comprimento do elo e no o angulo da junta.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Cinemtica e dinmica de manipuladores


A cinemtica trata do estudo dos movimentos dos robs sem considerar as

causas que lhes do origem (Groover, 1988). Por sua vez, a dinmica e o

estudo do movimento levando se em conta as forcas e torques que os causam.


Para tratar dos movimentos dos manipuladores e necessrio desenvolverem

tcnicas para representar a posio de determinado ponto do brao no tempo.

Esta representao depende da posio das juntas e dos elos, sendo que e

necessrio ter a base do rob como ponto de referencia. Manipuladores

compostos essencialmente por juntas prismticas no apresentam grandes

problemas com relao a cinemtica. Contudo, braos articulados so

amplamente utilizados na indstria devido a sua versatilidade em substituir

trabalhador humano e tambm por ser altamente compacto. Nestes

manipuladores a cinemtica torna-se mais complexa. Independentemente da


geometria do manipulador, a soluo da cinemtica requer conhecimento de
geometria, trigonometria e calculo vetorial. No Apndice A e oferecido um

resumo da trigonometria necessria para resolver problemas de cinemtica.

Uma vez que no ha uma regra geral para equacionar a cinemtica em braos

mecnicos, deve-se analisar caso a caso. Iniciaremos a analise nos

manipuladores mais simples e aumentaremos a complexidade a cada novo

exemplo. A posio do rgo terminal de um manipulador depende, a cada


instante, dos valores dos deslocamentos angulares das juntas rotativas e
deslocamentos lineares das juntas prismticas. Em outras palavras, se for

possvel conhecer a posio de cada junta, pode-se saber a posio do rgo


terminal e, inversamente, caso se conhea a posio da extremidade do rob

pode-se calcular qual deve ser a configurao das juntas para atingir tal
posio. Para o sistema de controle dos braos mecnicos somente as posies

das juntas so relevantes. Em geral estes no reconhecem comandos com


posicionamento no espao. Por outro lado, e freqente encontrar-se aplicaes

nas quais se deseja que brao posicione o rgo terminal numa dada posio,

com uma dada orientao do punho. Um caso tpico e uma aplicao na qual se

Robtica Teoria e Prtica

Robtica Teoria e Prtica


deseja reprogramar um brao sem parar a linha de produo. Nesta situao,

uma medio cuidadosa da posio e orientao desejadas com relao a um

sistema de referencias cartesiano fixado a base do manipulador oferece uma

alternativa a programao usual por aprendizagem. Veja-se, contudo, que


muitas vezes esta medio pode ser complexa em virtude da preciso exigida e

requer instrumentos especiais. Constata-se, portanto, que e perfeitamente


possvel calcular a posio cartesiana no espao, bem como a orientao do
punho,

com

base

no

conhecimento

dos

ngulos

das

juntas.

Este

equacionamento e conhecido como cinemtica direta. O calculo das posies

angulares a partir da posio no espao consiste, portanto, na cinemtica

inversa. Uma vez que a determinao das posies das juntas pode tanto ser
feita em ngulos, nas juntas rotativas, quanto em deslocamentos, nas juntas

lineares, denomina-se genericamente a estes de variveis de junta. A posio

no espao e realizada num sistema de eixos retangulares e conhecida como


coordenadas cartesianas.

Transformaes
Transforma es entre variveis
vari veis de junta e variveis
vari veis cartesianas
O calculo da cinemtica, tanto direta quanto inversa, requer o conhecimento do

Comprimento dos elos com preciso adequada. Fabricantes de manipuladores


fornecem no apenas

estes

comprimentos,

como

tambm quaisquer

deslocamentos entre juntas que possa existir no brao, de forma a se poder

calcular completamente a posio cartesiana. Nos exemplos que se seguem as

juntas devem ser rotuladas como J , com n iniciando com 1 na base do brao
n

robtico. Os elos so rotulados por L , novamente sendo 1 o elo mais prximo


n

da base. Variveis angulares so representadas genericamente por

numeradas a partir da base, e variveis lineares so representadas por a ou


i

Robtica Teoria e Prtica

Robtica Teoria e Prtica


ento di. E conveniente que a numerao seja seqencial com relao as
juntas, sem se esquecer, contudo, que certos tipos de juntas podem ter mais

de um grau de liberdade, e, portanto, mais de uma varivel. Num brao TRL,


por exemplo, a notao de variveis de junta poderia ser:

Nos

exemplos a seguir, inicia-se com um brao articulado com 2 graus de liberdade,

com

movimento

num

plano.

Nos

demais

exemplos

adicionam-se

gradativamente mais juntas e, posteriormente, passa-se ao movimento no


espao.

Manipulador RR em movimento plano


Neste exemplo ser calculada a cinemtica direta, a cinemtica inversa e a

preciso cartesiana de um manipulador RR de elos com comprimento a1 e a2

movendo-se num plano vertical.

Manipulador RR em movimento plano vertical


As equaes da cinemtica direta so obtidas pela aplicao de trigonometria

aos tringulos formados pelas juntas e elos. Estas equaes resultam:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Geometria do manipulador RR
As equaes da cinemtica inversa podem ser obtidas de:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Pode-se igualmente obter a expresso acima pela aplicao da lei dos co-

senos ao triangulo formado pelo centro da junta 1, centro da junta 2 e ponto P

na extremidade da garra. Neste caso, o angulo conhecido e o angulo entre os


elos, que e igual a 180o

. Nota-se que a inverso do co-seno fornece dois

valores possveis para o angulo

, que correspondem a duas situaes nas

quais existe uma soluo para o problema. Na primeira delas com

> 0, tem-

se a soluo normal, com cotovelo para baixo. Na segunda soluo, igualmente


valida, a junta 2 situa-se acima tal que o angulo

que o valor de

e diferente nas duas situaes.

e negativo. Nota-se tambm

As duas solues
solu es possveis
poss veis para a cinemtica
cinem tica inversa do
do manipulador RR
O angulo

ser obtido pela aplicao da tangente da diferena entre ngulos.

No triangulo OPQ, (onde O e o centro da junta 1, P e a extremidade do rgo

terminal e PQ e perpendicular a reta OR, e R e o centro da junta 2), tem-se que

Robtica Teoria e Prtica

Robtica Teoria e Prtica

ngulos do manipulador RR para a determinao da cinemtica inversa

Da mesma figura, tem-se tambm que

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Esta expresso mostra que o angulo

depende de

, que j foi determinado

previamente no calculo da cinemtica inversa. Pode-se, caso seja necessrio,

substituir os valores do seno e do co-seno de

nesta expresso. Porem isto

s aumentaria a complexidade da equao e tornaria o calculo mais trabalhoso.

E mais pratico deixar nesta forma, desde que todas as variveis que apaream

na equao estejam previamente calculadas. A titulo de exemplo, adotando-se


a soluo positiva de

e substituindo o seno e o co-seno deste ngulo na

expresso acima se chega apos uma simplificao, a

Quando substitudos nesta expresso, os dois valores possveis para o angulo


iro resultar em dois valores distintos de

. A escolha entre eles fica a

cargo do programador do brao, que pode selecionar o cotovelo para cima ou

para baixo. As equaes da cinemtica inversa podem ser tambm obtidas por
manipulao algbrica da cinemtica direta. Partindo-se das equaes que

fornecem x e y em termos das variveis de junta, ento ao aplicar-se a

decomposio do seno e do co-seno da soma de ngulos chega-se a

Tem-se agora um sistema linear composto por duas equaes e duas

incgnitas que so o seno e co-seno de

, pois se considera que

Robtica Teoria e Prtica

seja

Robtica Teoria e Prtica


conhecido. Este sistema pode ser resolvido facilmente por substituio ou
qualquer outro mtodo, e obtm o resultado

A tangente de

e agora calculada pela relao entre o seno e o co-seno e,

Obviamente, resulta na mesma expresso j relacionada acima.

A preciso nos eixos cartesianos neste brao e obtida da formulao geral e


vale:

Manipulador RRR em movimento plano

Ser apresentada agora a formulao da cinemtica direta, da cinemtica

inversa e a da preciso cartesiana de um manipulador RRR de elos a1, a2 e a3

movendo-se num plano vertical, dado que a orientao do ultimo elo com

relao a horizontal e um angulo conhecido.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Manipulador RRR em movimento plano vertical

As equaes da cinemtica direta so obtidas de maneira semelhante ao


exemplo anterior, ou seja, pela adio das projees das juntas nos eixos
cartesianos. Com isso tem-se que:

Nota-se que a cinemtica inversa no pode ser resolvida, pois ha apenas duas

equaes com 3 incgnitas (os trs ngulos das juntas). De fato, pode-se
mostrar facilmente que existem infinitas solues de ngulos que satisfazem a

condio do rgo terminal atingir um dado ponto no plano. E necessrio

assumir uma condio a mais e esta condio j foi estabelecida no enunciado

do problema ao se fixar a orientao da junta J3 com o angulo (com relao a


horizontal). Isto significa que nem todas as solues satisfazem as equaes,

mas somente aquela (ou aquelas) nas quais o angulo do elo a3 com relao a

horizontal for igual a (fornecido). Isto indica claramente que a posio da

junta J3 pode ser determinada, uma vez que se conhea a posio do rgo
terminal x e y e este angulo. De fato, por geometria tira-se que a posio de J3,

denotada por x3 e y3 vale :

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Algumas das infinitas configuraes


configura es possveis
poss veis do brao
bra o RRR na cinemtica
cinem tica
inversa.

O problema agora e reduzido a se encontrar os valores dos ngulos

geometria deste brao reduzido e idntica aquela apresentada no exemplo


anterior, composta por duas juntas RR, com a nica modificao de que os

valores de x e y so substitudos por x e y . A soluo e, portanto, dada por:


3

Finalmente para o calculo do terceiro angulo percebe-se que o angulo

igual a soma dos ngulos das juntas, ou seja,

conhecido e

j foram determinados, ento

Robtica Teoria e Prtica

. Logo, como

Robtica Teoria e Prtica

Derivando as equaes
equa es da cinemtica
cinem tica direta e substituindo na expresso
express o acima
temtem-se

Manipulador RLR em movimento plano


Este exemplo mostra o equacionamento da cinemtica direta, cinemtica

inversa e da preciso cartesiana de um manipulador RLR de elos a e a


2

movendo-se num plano vertical, dado que a orientao do ultimo elo com

relao a horizontal e um angulo

conhecido.

Geometria do manipulador
manipulador RLR em movimento plano vertical

Robtica Teoria e Prtica

Robtica Teoria e Prtica


A cinemtica direta deste brao e idntica a do primeiro exemplo, uma vez que

ambos possuem a mesma geometria. Assim,

Uma vez que este brao apresenta 3 variveis de junta (

,a e
2

), ento se

deve obter 3 equaes para a cinemtica inversa. Como a cinemtica direta

fornece apenas duas equaes, ento existem infinitas solues possveis para

a cinemtica inversa, como pode ser visto na figura 4.9. Destas solues, s
existe uma que satisfaz a condio

= . Percebe-se ento que a posio

x , y da junta J fica fixada caso o ponto P = (x, y) e o ngulo sejam


3

conhecidos. Esta posio e obtida por geometria e vale

Isto permite escrever a cinemtica direta para a posio desta junta, ou seja:

Algumas
Algumas solues
solu es possveis
poss veis para a cinemtica
cinem tica inversa

Como x e y so conhecidos, pode-se resolver este sistema para as variveis


3

de junta

e a . Dividindo-se a segunda pela primeira, tem-se:


2

Robtica Teoria e Prtica

Robtica Teoria e Prtica

E adicionando-se o quadrado de ambas resulta:

E finalmente

A preciso cartesiana deste brao e dada por

Que resulta:

Manipulador TRR em movimento no espao


espa o

A partir deste exemplo, os manipuladores passam a mover-se no espao ao


invs do plano. Em geral o movimento destes manipuladores pode ser

decomposto num movimento plano, semelhante aos exemplos anteriores, e

num movimento rotativo ao redor de um eixo contido no plano, o que faz com
que este plano gire no espao. Sero obtidas neste exemplo as equaes da

cinemtica direta, da cinemtica inversa e da preciso cartesiana de um


manipulador revoluto com 3 graus de liberdade em configurao TRR

movendo-se no espao. A junta J1 gira sob um eixo vertical, enquanto que J2 e


J3 possuem eixos horizontais.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Para que os movimentos e os ngulos possam ser visualizados, sero

construdas duas vistas esquemticas do brao: superior e lateral mostrando,

respectivamente, o movimento horizontal e os movimentos verticais (no plano).

Estas vistas so mostradas esquematicamente, com as principais medidas a


serem obtidas por relaes geomtricas. A vista lateral e mostrada numa

direo perpendicular a linha de interseo do plano vertical do movimento e o

plano xy.

Brao
Bra o revoluto TRR em movimento no espao
espa o
A projeo do ponto P no rgo terminal sobre o plano xy fornece a distancia

horizontal d, que corresponde, no exemplo anterior, ao comprimento x. Esta

distancia pode ser obtida pelas projees dos elos a e a no plano, o que
2

resulta

Da vista superior, percebe-se que a

Robtica Teoria e Prtica

Robtica Teoria e Prtica


distancia d e a hipotenusa de um triangulo retngulo, o que permite que esta
distancia seja decomposta nas direes x e y. A coordenada z e calculada de

maneira semelhante a utilizada nos exemplos anteriores, e assim a cinemtica

direta fica.

Nota-se que a cinemtica inversa, de maneira anloga ao primeiro exemplo,

apresenta duas solues para os ngulos

: cotovelo para baixo e

cotovelo para cima. Uma vez que d representa a horizontal da projeo de P,

ento deve-se exprimir esta distancia em termos das variveis conhecidas na


cinemtica inversa, que so x, y e z. Da vista superior tira-se facilmente que

Assim, a distancia r, que vai do centro da junta J ao ponto P, conforme mostra


2

a vista lateral pode tambm ser calculada por meio da hipotenusa do triangulo

retngulo PQR:

Aplicando agora a lei dos co-senos ao triangulo PRS, onde S e o centro da


junta J ,tira-se que (ver exemplo 1)
3

Da mesma forma, o angulo e obtido por meio de diferena entre os ngulos


2

de maneira similar a empregada no exemplo 1. Neste caso, por

geometria tem-se que

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Cabe neste ponto um breve comentrio a respeito do calculo de ngulos com o

ar cotangente.Computacionalmente o arco-tangente e uma funo que retorna

com um ngulo compreendido entre

. Isto e suficiente para

finalidades matemticas ou para estudo da cinemtica de robs, mas


certamente e insuficiente num caso real, quando a cinemtica inversa for

calculada pelo sistema de controle do brao mecnico. O motivo disto e que o


brao pode atingir, e em geral atinge, ngulos fora desta faixa de limitao
como, por exemplo, entre

caso de um angulo real de

. A funo arco-tangente fornece, no

o valor complementar de

, o que

certamente levaria o brao a posicionar-se num local totalmente errado. Para

corrigir este problema emprega-se em tais programas uma funo denominada

de atan2, que necessita de dois parmetros que so os equivalentes ao seno e

ao co-seno do angulo, e que gera um angulo compreendido agora entre


.As calculadoras de bolso no programveis no possuem tal funo e,

portanto, e necessrio uma analise posterior para que se conhea o quadrante

real do angulo. Para isso nota-se que o arco tangente e sempre calculado
como o produto de uma diviso entre dois fatores, associados ao seno e ao coseno deste angulo, ou seja:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


onde S e no numerador e C e o denominador da frao. Se o valor de C for

positivo, o ngulo calculado pelo arco-tangente estar no seu valor correto,

entre

acrescentar

. Se o valor de C for, ao contrario, negativo, ento deve-se


ao resultado, se este estiver em radianos, ou 180 ou
o

180 caso esteja em graus, para coloc-lo no quadrante correto. Para o calculo
o

da preciso cartesiana, deve-se lembrar que o brao possui 3 graus de

liberdade e move-se no espao tridimensional. Tem-se, portanto 3 equaes

para a preciso cartesiana e cada uma delas depende dos 3 ngulos das

juntas, ou seja

Efetuando-se as derivadas das equaes da cinemtica direta chega-se a

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Manipulador TRL:R em movimento no espao
espa o
O prximo exemplo constitui um manipulador do tipo esfrico. Ser obtido o
equacionamento da cinemtica direta, da cinemtica inversa e da preciso

cartesiana deste manipulador, com 4 graus de liberdade em configurao

TRL:R movendo-se no espao. A junta J1 gira o conjunto sob um eixo vertical,

enquanto que J2 e J4 possuem eixos horizontais. Ser considerado na


cinemtica inversa que o angulo de pitch do punho e conhecido e dado por

Manipulador esfrico
esf rico TRL:R
De forma semelhante ao problema anterior, deve-se inicialmente desenhar um

esboo do brao em direes perpendicular as do movimento, ou seja, uma

vista superior na qual o movimento da primeira junta e observada e uma vista

frontal do plano vertical, na qual as demais juntas aparecem em perfil. Os

desenhos ficaro a cargo do leitor, que deve, na medida do possvel, habituar-

se com a geometria da vista em perspectiva para derivar as expresses da

cinemtica. De fato, o movimento vertical deste brao e semelhante ao do


exemplo 3, e portanto a distancia no plano xy entre a origem e a projeo do

rgo terminal neste plano ser dada por:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Para a cinemtica inversa observa-se que as variveis de junta so


e a2, o que indica serem necessrias quatro equaes para se

ter uma soluo. Uma vez que a cinemtica direta fornece 3 equaes, ser
utilizada a condio fornecida do angulo do punho

. Com isso

pode-se determinar a distancia da projeo da junta 4 no plano xy, de forma


semelhante aquela realizada no exemplo 3, ou seja:

Comparando agora o movimento deste brao no plano vertical com o exemplo

3, percebe-se que d4 corresponde a coordenada x do exemplo 3 e que


corresponde a coordenada y. A soluo de ambos e, portanto, igual,

restando apenas efetuar as devidas substituies nas variveis. Com isto


resulta

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Manipulador VVL:R em movimento no espao Este manipulador, conhecido

como manipulador esfrico de Stanford, possui brao formado por juntas em

configurao VVL movendo-se no espao. Neste exemplo, ser adotado um

punho composto por apenas uma junta rotativa, resultando 4 graus de


liberdade ao todo. A junta J1 gira num eixo vertical, enquanto que J2 e J4

possuem eixos horizontais. A junta J3 e prismtica. Ser considerado


conhecido, na cinemtica inversa, o angulo de pitch
horizontal.

do punho com relao a

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Manipulador de Stanford em configurao


configura o VVL:R.
Este problema e bastante semelhante ao anterior, com exceo da primeira

junta, que passa a ser revoluta neste exemplo. O brao possui 4 graus de

liberdade, o que significa que existem infinitas solues para a cinemtica


inversa. O angulo

dado introduz a quarta condio que permite escolher

uma das solues. Este brao tem tambm um elo (a2) que se desloca

lateralmente com relao a base, o que torna a cinemtica um pouco mais

complexa. Este esquema e adotado por certos fabricantes de robs que

conseguem, com esta tcnica, reduzir o espao ocupado pelo brao alem de

conseguir simplificar o projeto mecnico. As vistas superior e lateral so

mostradas na figura 4.14. Percebe-se que o brao possui dois tipos de

movimento: o primeiro e um movimento em torno de um eixo vertical, realizado

pela junta J1, e o segundo e um movimento num plano vertical, realizado pelas

demais juntas. Os ngulos associados a estes movimentos so indicados em

sua verdadeira grandeza nas duas figuras. A distancia d corresponde ao


comprimento da projeo dos elos a3 e a4 no plano horizontal xy. Da vista lateral
tira-se facilmente que

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Vistas superiores e laterais do movimento do manipulador de Stanford

Para a cinemtica inversa, dados que as coordenadas x, y, z so conhecidas,

alem do angulo

de arfagem do pulso, deve-se inicialmente calcular qual

seria a expresso equivalente da projeo d em termos das variveis

fornecidas. Do triangulo retngulo OSP da vista superior tem-se, j que o

angulo OSP e reto:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


O problema agora e encontrar os valores dos ngulos de junta, mas percebe-se
que o movimento vertical e semelhante aqueles vistos nos Exemplos 3 e 5.

Deve-se, portanto, calcular as coordenadas da projeo do ponto central da


junta J no plano horizontal. Chamando de d esta distancia, tem-se, da vista
4

lateral, que:

Nota-se que tanto d quanto z podem ser calculados, uma vez que se
4

consideram dados as coordenadas cartesianas e o angulo


duas equaes:

Robtica Teoria e Prtica

. Tem-se ento

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Notao de Denavit-Hartenberg

Os parmetros de Denavit-Hartenberg permitem obter o conjunto de equaes

que descreve a cinemtica de uma junta com relao a junta seguinte e viceversa. So 4 os parmetros: o angulo de rotao da junta , o angulo de toro

da junta t, o comprimento do elo a e o deslocamento da junta d. Considera-se

uma seqncia de juntas robticas de revoluo como indicado na figura


abaixo. Para obter os parmetros de Denavit-Hartenberg para a junta J , aplican

se os seguintes procedimentos:

Geometria de juntas rotativas e parmetros


par metros das juntas.

1) Numerar as juntas, partindo de J1 ate a ultima junta. Numerar os elos

partindo do elo 0. Tem-se com isso a configurao: elo 0, junta 1, elo 1, junta 2,
elo 2, ...

2) Fixar um sistema de coordenadas cartesianas no elo 0 (base), no qual a


posio e orientao dos elos sero obtidos. A fixao deste sistema e explicada

mais adiante neste documento.

3) Definir os eixos das juntas. No caso de juntas rotativas, o eixo de rotao da

junta n ser coincidente com o eixo zn1 do sistema de coordenadas do elo


anterior. No caso de juntas prismticas, o eixo de deslocamento da junta sera
coincidente com o eixo zn1 do elo anterior.

4) Obter a normal comum: Hn-On, para todos os elos. A normal comum Hn-On e
definida como sendo a reta perpendicular aos eixos das juntas Jn a J

Robtica Teoria e Prtica

n+1.

Robtica Teoria e Prtica


comprimento Hn-On e denominado comprimento do elo, an. Se os eixos forem

paralelos, haver inmeras normais que satisfazem a condio. Neste caso

adota-se a normal passando pela origem do sistema do elo anterior, ou seja


On1. Se os eixos das juntas interceptarem-se num nico ponto, ento a reta Hn-

On degenera-se neste ponto comum, e o comprimento do elo ser nulo (an = 0).

5) Definir sistema n (ver explicao adiante). O eixo xn possui a direcao de Hn-

On e passa pelo ponto On (origem do sistema n). O eixo yn define o sistema


destrogiro junto com xn e zn. Se o comprimento do elo an for nulo, ento a

direcao de xn sera dada pela reta perpendicular ao plano formado por zn 1 e zn.

6) Obter o deslocamento da junta. A distancia On11-Hn, medida ao longo do


eixo zn 1, e conhecida como o deslocamento da junta, dn. E positivo se o vetor

que vai de On11 a Hn tiver a mesma direo do eixo zn11. Se a junta Jn for

prismatica, entao dn sera a variavel da junta. Se os eixos zn1 e zn forem

paralelos, ento o deslocamento da junta dn sera nulo, uma vez que os eixos

xn1 e xn interceptam-se no ponto On1.

7) Obter o angulo de rotao da junta. Troca uma reta paralela a xn passando


pelo ponto On1. Por definio tanto esta reta quanto o eixo xn1 sa7) Obter o

angulo de rotao da junta. Troca uma reta paralela a xn passando pelo ponto
On1. Por definio tanto esta reta quanto o eixo xn1 so perpendiculares a zn1.

O ngulo de rotao da junta,

n,

e medido a partir do eixo xn1 ate a reta

paralela, no plano perpendicular a zn 1. Se a junta Jn for rotativa, o angulo de

rotao da junta e a prpria varivel da junta. Se o deslocamento da junta, dn,


for nulo, o angulo de rotao ser medido entre xn1 e xn.

8) Obter o angulo de toro da junta. Troca uma reta paralela ao eixo da junta
Jn, isto e, zn1, passando por On, origem do sistema n. Por construo, esta reta

estar contida no plano formado por xn e yn. O angulo de toro, tn, e medido a

partir da reta paralela a zn 1 ate o eixo zn. Se os eixos forem paralelos, o angulo

de toro ser nulo.

9) Fazer uma tabela contendo os parmetros n, dn, an e tn, conhecidos como

parmetros de Denavit-Hartenberg: o perpendiculares a zn 1. O ngulo de

rotao da junta, n, e medido a partir do eixo xn 1 ate a reta paralela, no plano

Robtica Teoria e Prtica

Robtica Teoria e Prtica


perpendicular a zn 1. Se a junta Jn for rotativa, o angulo de rotao da junta e a

prpria varivel da junta. Se o deslocamento da junta, dn, for nulo, o angulo de


rotao ser medido entre xn 1 e xn.

8) Obter o angulo de toro da junta. Troca uma reta paralela ao eixo da junta
Jn, isto e, zn 1, passando por On, origem do sistema n. Por construo, esta reta

estar contida no plano formado por xn e yn. O angulo de toro, tn, e medido a

partir da reta paralela a zn 1 ate o eixo zn. Se os eixos forem paralelos, o angulo

de toro sera nulo.

9) Fazer uma tabela contendo os parmetros n, dn, an e tn, conhecidos como


parmetros de Denavit-Hartenberg:

Se a junta Jn for prismtica, ento o processo para obter os parmetros de


Denavit-Hartenberg e bastante semelhante ao da junta rotativa. Deve-se notar,

porem, que o deslocamento de uma junta prismtica se da numa direo, e no


existe um "eixo" (como na junta rotativa), no qual ser fixado o eixo zn-1. Isto

pode ser melhor visualizado supondo-se que a junta prismtica seja formada

no por um mancal de deslizamento linear, mas sim por dois, ainda que

paralelos. Nesta situao, a origem do sistema n1 fica indeterminada, pois


poder coincidir com o centro de qualquer um dos mancais. E obvio que ambos
so equivalentes. O mesmo raciocnio aplica-se no caso de haver 3 ou mais

juntas prismticas paralelas atuando em conjunto. Fica claro, portanto, que a

origem do sistema que ser fixado numa junta prismtica e arbitrrio (sistema

n1). Esta origem poder encontrar-se, inclusive, coincidente com a origem da


junta anterior n1 ou posterior n+1.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Geometria de uma junta prismtica.


prism tica.
Mostra-se, como no exemplo da figura 5.3, uma junta prismtica onde a direo

do eixo da junta foi transferida para o ponto On, onde ocorre a interseo desta

direo com o eixo da junta n+1. Nesta situao o comprimento do elo an torna-

se nulo (na verdade e adicionado a an 1). Nota-se tambm que a direo de xn

obtida

como

sendo

perpendicular

simultaneamente

direo

deslocamento da junta prismtica (eixo zn 1), e ao eixo da junta Jn+1.

de

Parmetros
Par metros de DenavitDenavit-Hartenberg em juntas prismticas.
prism ticas.

A matriz de rotacao entre os sistemas n 1 e n+1 sera dada entao por uma

rotacao do sistema n 1 em torno do eixo zn 1, seguida de uma translacao de dn

na direcao de zn 1, 5.1 - Sistemas de coordenadas da base e do orgao terminal.

O sistema de coordenadas da base e o sistema de coordenadas do orgao


terminal so especiais, uma vez que nao existem restricoes para que o sistema

Robtica Teoria e Prtica

Robtica Teoria e Prtica


seja unico. Desta forma e necessario adotar-se certas regras na definicao de

ambos. O sistema de coordenadas da base tera seu eixo z0 paralelo ao eixo da


primeira junta. Se esta junta for rotativa, entao o eixo z0 sera coincidente com o

eixo da junta. Se a junta for prismatica, contudo, basta entao que z0 possua a

mesma direcao do deslocamento linear da junta. A origem pode ficar em

qualquer local sobre z0. As direcoes de x0 e y0 podem ser quaisquer. Porem


pode-se simplificar a escolha se os eixos forem adotados como paralelos aos
eixos x1 e y1 quando a variavel da junta 1 for nula. Adota-se a origem do

sistema do rgo terminal em algum ponto situado no prprio rgo. No caso

de uma garra, geralmente adota-se um ponto situado entre os dedos quando


esta encontra-se fechada. Ferramentas especiais, como solda-a-ponto, por
exemplo, tem sua origem fixada no ponto de trabalho da ferramenta. O eixo xn

e orientado de tal forma que intercepta o eixo zn1 da ultima junta em angulo
reto. A direo de zn pode ser qualquer, mas em geral escolhe-se zn tal que o

angulo de toro tn seja nulo.

Matriz de transformao
transforma o entre os sistemas n
n1 e n.
Dado um vetor no sistema n, ele pode ser expresso no sistema n1 por meio
da matriz que relaciona ambos os sistemas.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


As matrizes de transformao indicadas so todas geomtricas. A matriz

inversa, que permite expressar um vetor no sistema n dado o mesmo vetor no


sistema n1 fica ento:

Exemplo
Exemplo de aplicao
aplica o num manipulador VVR:VR.

Este exemplo mostra a obteno dos parmetros de Denavit-Hartenberg no

manipulador. Admite-se conhecidos os comprimentos de todos os elos.. Devese relacionar os sistemas de coordenadas de cada junta e preencher a tabela
de parmetros.

Manipulador robtico
rob tico esquemtico
esquem tico para obteno
obten o dos parmetros
par metros de DenavitDenavit-

Hartenberg.

O diagrama mostra os eixos das juntas obtidos pela aplicao da notao de

Denavit-Hartemberg no brao mecnico fornecido. A tabela e preenchida com

base no diagrama completo.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Sistemas de coordenadas intermedirios


intermedi rios e parmetros
par metros de DenavitDenavit-Hartenberg

do manipulador VVR:VR.

Tabela de parmetros
par metros de DenavitDenavit-Hartemberg

Trigonometria

Semelhana
Semelhan a de tringulos
tri ngulos

Dois tringulos so semelhantes quando possuem dois ngulos iguais. Como a


soma dos ngulos internos de um triangulo e sempre igual a 180o, ento todos
os ngulos de tringulos semelhantes so iguais.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Teorema de Pitgoras
Pit goras
Num triangulo retngulo OPQ, no qual o angulo do vrtice Q e reto (igual a 90

ou

/2) e o angulo do vrtice

o cateto oposto e definido como o

comprimento b da aresta PQ, o cateto adjacente e definido como o


comprimento a da aresta OQ, e a hipotenusa e o comprimento c da maior

aresta, OP. O teorema de Pitgoras fornece que o quadrado da hipotenusa e

igual a soma dos quadrados dos catetos, ou seja

Seno, coco-seno e tangente

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Numa circunferncia de raio unitrio desenhamos um sistema de eixos
passando pelo centro

da circunferncia e um arco de circulo de angulo

definido pelo ponto P. A projeo deste ponto nos eixos das abscissas e

das ordenadas define os pontos Q e R, respectivamente.

Circulo de raio unitrio:


unit rio: seno, coco-seno, tangente, coco-tangente, secante e coco-

secante.

O seno deste angulo e definido como o comprimento do cateto oposto ao


triangulo OPQ, ou seja, ao comprimento RO ou PQ. Da mesma forma, o coseno e o comprimento do cateto adjacente ao angulo

, cujo comprimento e

RP ou OQ. A tangente e medida ao longo da reta paralela ao eixo das

ordenadas que tangencia a circunferncia no ponto T em que esta encontra o

eixo das abscissas, ate o ponto U em que esta encontra o prolongamento de


OP. Analogamente, a co-tangente do angulo

e o comprimento medido ao

longo da reta paralela ao eixo das abscissas que passa pelo ponto S, encontro
da circunferncia com o eixo das ordenadas, ate o ponto V em que esta reta

encontra o prolongamento de OP. Tem-se, finalmente, a secante sendo dada


pelo comprimento OU e a co-secante por OV.
Resumidamente,

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Complementos de ngulos
ngulos

Supondo conhecidos o seno e o co-seno do angulo , deseja-se saber o valor


do seno e co-seno do angulo complementar 180

. Conforme

indica a figura abaixo, estes podem ser obtidos da semelhana entre os

tringulos OAC e OBD:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

ngulos
ngulos complementares.

Da mesma figura pode-se ainda verificar que, da semelhana entre os


tringulos OAC e OEA,

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Angulos reciprocos.

Figuras semelhantes a essas podem ser desenhadas para se obter as


igualdades:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Pode-se exprimir as funes trigonomtricas do seno, co-seno e tangente em

termos delas prprias. Do teorema de Pitgoras, por exemplo, tira-se que

A tangente pode ser obtida de

Em todas as expresses acima o quadrante do angulo deve ser determinado


para se verificar se a soluo correta e a positiva ou negativa.
Soma e diferena
ngulos
diferen a de ngulos

Em geometria e comum a necessidade de se conhecer o seno ou o co-seno da


soma de dois ngulos. Pode-se relacionar o seno (ou o co-seno) da soma com

Robtica Teoria e Prtica

Robtica Teoria e Prtica


os senos e co-senos dos ngulos individuais.

Embora seja tambm possvel obter uma soluo geomtrica para a tangente

da soma, e mais fcil neste ponto calcular pela relao entre o seno e o co-

seno, ou seja:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Lei dos senos

Lei dos coco-senos

Num triangulo qualquer ABC, traca-se uma a reta que, a partir do vrtice A,

encontra o lado BC em angulo reto (perpendicular a BC). No triangulo retngulo

ABH, aplica-se o teorema de Pitgoras, obtendo-se.

Lei dos coco-senos.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Transformaes
Transforma es de Coordenadas
Coordenadas
Em diversos problemas fsicos e mecnicos existe a necessidade de se

expressar determinada grandeza vetorial em um ou mais sistemas de

coordenadas distintos. Em geral um destes sistemas encontra-se parado

enquanto o outro e o sistema mvel. Por exemplo, a posio de um guindaste


num navio pode ser conhecida com relao a um sistema de eixos fixados a

embarcao, ou, similarmente, ser conhecida com relao a um sistema de

coordenadas fixadas ao ancoradouro. Navios, aeronaves, foguetes, satlites,

veculos em geral, alem de uma grande serie de fenmenos apresentam o

mesmo tipo de problema. Vamos apresentar uma forma de sistematizar estas


transformaes de coordenadas.
Rotaes
Rota es de coordenadas
Considere um sistema de eixos cartesianos fixos O, de eixos x, y, z, conforme

ilustra a figura B-1. Supomos que haja um corpo que se gira com relao a este

sistema, no qual um outro sistema Q de eixos u, v, w esteja rigidamente fixado,


e tal que suas origens sejam coincidentes, mas que seus eixos possuam

Robtica Teoria e Prtica

Robtica Teoria e Prtica


direes distintas. As direes dos eixos u, v e w podem ser postas na forma
vetorial com verses unitrios, isto e, de modulo unitrio, com relao ao
sistema fixo (x, y, z). Supondo que tais direes sejam, respectivamente u, v e
w, tal que u = (u , u , u ), v = (v , v , v ) e w = (w , w , w ), sabe-se, do calculo
x

vetorial, que u , v , e w so os co-senos diretores das direes u, v e w,


i

respectivamente (para i = x, y ou z), ou seja, c e igual ao co-seno do angulo


i

entre os eixos c e i.

Sistemas de coordenadas cartesianas fixas (x, y, z) e moveis (u, v, w)


Se, agora, montarmos a matriz quadrada A de ordem 3 dada por:

teremos uma forma de relacionar a orientao de um vetor qualquer dado num

sistema com a orientao deste mesmo vetor expresso no outro sistema. De

fato, se r = (r , r , r ) for o vetor expresso no sistema O, as coordenadas deste


o

mesmo vetor no sistema Q, r = (r , r , r ) sero dadas por:


q

Robtica Teoria e Prtica

Robtica Teoria e Prtica

onde o operador () indica o produto interno ou produto escalar. A matriz A e

conhecida como matriz de transformao de coordenadas entre os dois

sistemas, e pode-se mostrar que ela possui caractersticas especiais. Ela e

uma matriz ortogonal prpria, isto e, seu determinante e unitrio, e o produto

escalar entre duas de suas linhas ou coluna e sempre nulo. Alem disso, nas

matrizes ortogonais prprias o produto da matriz pela sua transposta resulta na

matriz identidade, ou seja:

no qual o sobre-escrito T indica a transposio da matriz e I e uma matriz

identidade de ordem 3. Da relao acima decorre imediatamente que a inversa


de uma matriz ortogonal e igual a sua prpria transposta, ou seja:

Este resultado nos permite obter a representao inversa entre os dois


sistemas de coordenadas, isto e, calcular as componentes do vetor r caso
o

sejam conhecidas as coordenadas do vetor r . De fato, ao multiplicar ambos os


q

termos da relao de transformao pela inversa da matriz A chega-se

facilmente a

Conclui-se, tambm, que as direes dos eixos (x, y, z), quando representadas

nos sistema Q sero dadas respectivamente por x = (u , v , w ), y = (u , v , w ),


x

e z = (u , v , w ). Como regra geral tem-se, portanto, a relao:


z

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Rotaes ao redor dos eixos cartesianos Em algumas aplicaes, percebe-se

que a relao que une os dois sistemas de coordenadas O e Q e uma mera

rotao ao redor de um dos eixos cartesianos do sistema O, isto e, ao redor do

eixo x, y ou z, como mostra a figura A-2. Neste caso, como ambos os sistemas
compartilham a origem num mesmo ponto, pode-se calcular os co-senos

diretores dos eixos transformados caso o angulo de rotao seja conhecido.

Ha 3 possibilidades, j que existem 3 eixos cartesianos. A rotao pode ser

efetuada ao redor do eixo x, y ou z. O matemtico Euler mostrou que qualquer


que seja a orientao do sistema de coordenadas Q com relao ao sistema O,

pode-se decompor esta transformaes em 3 rotaes efetuadas nos eixos

cartesianos, desde que no haja duas rotaes sucessivas efetuadas ao longo


do mesmo eixo. So validas, por exemplo, rotaes x-y-z, y-z-x, y-x-z, etc., mas

tambm so igualmente validas rotaes na forma x-y-x, z-x-z, y-z-y. De fato,

existem 12 possibilidades distintas para tais transformaes.

- Rotao
Rota o no sistema de coordenadas Q de um angulo

Uma rotao
rota o de um angulo

matriz de rotao:
rota o:

ao redor do eixo x.

ao redor do eixo cartesiano


cartesiano x ira levar a seguinte

Robtica Teoria e Prtica

Robtica Teoria e Prtica

transformaes so direcionais com relao ao angulo, isto e, considera-se o

angulo como sendo positivo quando, ao passar do sistema O para o sistema Q,

utiliza-se a regra da Mao direita. Neste caso, com o polegar direito apontando
na direo positiva do eixo de rotao, os demais dedos devem indicar o
sentido de rotao.

Caso os dedos apontem na direo oposta, ento o angulo de rotao ser


negativo.

Como a transformao inversa, ou seja, do sistema Q para o sistema O pode

ser realizada pela rotao de um angulo negativo ao redor do mesmo eixo,

conclui-se que

Translaes
Transla es de coordenadas

Muitas vezes os eixos coordenados no possuem origens coincidentes. Nestes

casos, para obter a posio de um dado vetor ou objeto num dos sistemas ser

necessrio efetuar, alem da transformao de orientao entre os sistemas,

tambm uma translao. Considere ento o sistema Q com sua origem

Robtica Teoria e Prtica

Robtica Teoria e Prtica


deslocada do sistema O, mas admite-se inicialmente que os eixos de ambos
sejam paralelos.

Translao
Transla o entre sistemas de eixos coordenados.

Nesta situao, se a posio de um ponto P do espao for dada pelo vetor r , e


o

se s for a posio da origem do sistema Q, ambos referidos ao sistema O,


o

ento a posio deste ponto P no sistema Q ser dada pela soma vetorial:

Nota-se que o vetor

s e, na verdade, a posicao da origem do sistema O


o

referido ao sistema Q, ou seja, e igual a s . Para obter a inversa desta relacao


q

basta isolar o vetor r :


o

Transformaes
Transforma es compostas

Num caso mais geral, os eixos dos sistemas O e Q no so paralelos, e nem

suas origens so coincidentes. Para analisar este caso, pode-se supor que

exista um sistema de eixos intermedirio, cujos eixos so paralelos ao do


sistema O, porem sua origem e coincidente com o sistema Q. Percebe-se

ento que a transformao entre os dois sistemas reduz-se entre uma

translao de O para o sistema intermedirio, seguido de uma rotao entre


este ultimo e o sistema Q.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Transformao
Transforma o composta de rotao
rota o e translao
transla o

Sabe-se que a transformao que relaciona um vetor no sistema intermedirio I


com seu correspondente no sistema Q e dada por:

onde A

O-Q

e a matriz de transformao entre os sistemas I e Q. Uma vez que o

sistema I e paralelo a O, ento a matriz A e tambm igual a transformao entre

os sistemas Q e O. Por outro lado, a translao de coordenadas entre os

sistemas I e O leva a:

pois as origens de I e Q so coincidentes. Substituindo-se esta ultima na

expresso anterior, tem-se que:

Porem, como foi dito, o vetor

ao sistema I, ou seja, s . Mas A


i

e a posio da origem do sistema O referido


O-Q

s e justamente a transformao deste vetor


i

para o sistema Q, ou simplesmente s . Tem-se com isto a relao:


q

que relaciona um vetor expresso no sistema O com as componentes deste


vetor no sistema Q, desde que sejam conhecidas a matriz de transformao

entre ambos, e a posio da origem de O referida ao sistema Q.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Transformaes
Transforma es homogneas
homog neas
Vimos que as transformaes podem ser entendidas como sendo compostas

de rotaes e translaes. Quando apenas dois sistemas esto envolvidos no


processo de transformao, no ha problemas na utilizao da formulao
apresentada anteriormente. Porem, se houver mais de dois sistemas, a

composio de transformaes torna-se complexa e de difcil compreenso.

Sejam, por exemplo, os sistemas O, Q e R, tal que se conheam as


transformaes entre O e Q e entre Q e R:

o que significa que o numero de termos que aparece na transformao

depende do numero de sistemas de coordenadas envolvidos nela. Ha uma


forma mais eficiente de expressar tais transformaes, conhecida como

transformaes homogneas. Nela, tanto as rotaes quanto as translaes sao

efetuadas por multiplicaes de matrizes, o que permite facilmente compor

transformaes entre diversos sistemas. O preo a pagar por isto e o aumento


na dimenso do problema, que passa para 4 dimenses para que a translao

possa ser posta na forma matricial. Uma matriz homognea e, portanto, uma

matriz quadrada de ordem 4, formada pelo acrscimo de uma coluna e uma

linha adicionais a matriz de transformao de coordenadas usual. No caso de


uma rotao, a matriz homognea e dada por:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

na qual o vetor que fornece a origem do sistema Q e dado por s = (s , s , s ).


o

Os vetores a serem transformados devem agora ter sua dimenso aumentada,


e para isto introduz-se um quarto componente que representa um fator de
escala, mas que aqui ser adotado como sendo sempre unitrio. Tem-se assim
que:

Analogamente, as rotaes efetuadas ao redor dos eixos cartesianos

encontram tambm suas correspondentes nas transformaes homogneas,

dadas por:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Relaes
Rela es inversas

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Anexo 1

INTRODUO A LINGUAGEM C
ESTRUTURA BSICA DE UM PROGRAMA C
Os programas em C sempre iniciam pelo main() . De forma geral os programas
em C consistem de funes (o termo funo ser explicado depois), e o main()

consiste de uma funo. Seguindo o nome da funo seguem as chaves {} que


delimitam o incio e o fim da funo. Neste exemplo o printf() o nico

comando da funo main(). Este comando imprime mensagens na tela padro


e como ser visto mais tarde, tambm imprime o contedo de variveis.

Observe que aps todo comando dentro de uma funo segue um ponto e
vrgula ( ; ). Os caracteres em branco so invisveis para o compilador.
Exemplo:

#include <stdio.h>

Robtica Teoria e Prtica

Robtica Teoria e Prtica


main ()
{

printf ( " Programa Inicial " );


}

Variveis
Uma varivel um espao reservado na memria do computador para armazenar certos
tipos de dados.
#include <stdio.h>
main ()
{
int num;
num = 2;
printf("Numero = %d",num);
}
A primeira linha do main() declara a varivel e o tipo:
Int
Tipo da varivel

num;
Nome da varivel

Declarando uma varivel voc informa ao compilador o nome e o tipo da varivel.


Como regra geral, todas as variveis em C devem ser declaradas nas primeiras linhas da
funo. O nome da varivel deve iniciar com uma letra.
A segunda linha atribui o valor 2 para a varivel num:
num = 2;
Existem sete tipos principais de variveis:
char ---------------------------------- Capaz de conter um caractere (-128 a 127)
short ---------------------------------Inteiro com capacidade reduzida (0 a 15384)
int ---------------------------------Inteiro (32768 a 32767)
long int ------------------------Inteiro estendido (-2 147 483 648 a 2 147 483 647)
float --------------------------Ponto flutuante em preciso simples (10e38 a 10e38)
double ----------------------Ponto flutuante em preciso dupla (10e308 a 10e308)
Unsigned char
Unsigned int
Unsigned long
Unsigned -----------Retira o sinal e, portanto troca a variao de valores, por
Exemplo: unsigned int varia de 0 a 65 535
A funo printf()

Robtica Teoria e Prtica

Robtica Teoria e Prtica


O printf() de fato uma funo assim como o main(). Os parnteses contm a sentena
a ser apresentada na tela. Esta sentena deve ser limitada por aspas ( ), e o contedo
de variveis tambm podem ser exibidas pelo printf conforme o exemplo abaixo:
#include <stdio.h>
main()
{
int a = 1;
char tipo = c;
float valor = 22.53;
printf("inteiro= %d char= %c float= %f \n",a,tipo,valor);
}
O resultado da execuo deste programa ser:
Inteiro= 1 char= c float= 22.530001
O smbolo % dentro de uma sentena do printf indica que desejamos imprimir o
contedo de alguma varivel.
Abaixo uma descrio dos principais tipos que o printf reconhece:
%c ---------- Caracter
%s ---------- String
%d ---------- Inteiro
%f ---------- Float (notao decimal)
%e ---------- Float (notao exponencial)
%g ---------- Float
%u ---------- Inteiro sem sinal
%x ---------- Hexadecimal inteiro
%o ---------- Octal inteiro
%ld ------------------- Long
%lu ------------------- Long
%lx ------------------- Long
%lo ------------------- Long

Ainda no ltimo exemplo, observe que o ultimo caracter do printf era \n. Este caracter
de controle indica que queremos inserir uma nova linha. Existem outros caracteres de
controle, e todos iniciam com um \

, conforme a tabela abaixo:

\n ---------- Nova linha


\t ----------- Tabulao
\b ---------- Backspace
\ ---------- Aspas simples
\ ---------- Dupla aspas
\\ ----------- Barra
No exemplo abaixo ilustraremos alguns resultados obtidos com o comando printf (Os
retngulos abaixo de cada comando printf ilustra o resultado obtido na tela do
computador):
#include <stdio.h>

Robtica Teoria e Prtica

Robtica Teoria e Prtica


main()
{
int i = 52;
float x = 28.534;
printf("i = %2d\n",i);
i = 52
printf("i = %4d\n",i);
i = 52
printf("x = %8.3f\n",x);
x=28.534
printf("x = %-8.3f\n",x);
x = 28.53 4
}
A funo scanf()
Esta funo responsvel pela entrada de dados via teclado. Existem vrias funes de
entrada e sada em C, porm o printf e o scanf so as mais comuns. Examine o exemplo
abaixo:
#include <stdio.h>
main()
{
int i,j;
float x,y;
double a,b;
scanf("%d",&i);
scanf("%f",&x);
scanf("%lf",&a);
j = i % 2;
y = x * 2;
b = a / 2;
printf("i= %3d j= %3d \n",i,j);
printf("x= %.3f y= %.3f \n",x,y);
printf("a= %g b= %g \n",a,b);
}
O comando scanf interrompe a execuo do programa e aguarda o usurio entrar com
um valor para a varivel x. Existem dois campos a serem informados neste comando:
scanf( "%f" ,&x);
Tipo da varivel Endereo da varivel (voc deve colocar um & na frente da varivel
Para o tipo double o prefixo do scanf deve ser lf.

Operadores
Os operadores aritmticos sobre as variveis so os seguintes:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

+ --------- Soma
- --------- Subtrao
* -------- Multiplicao
/ --------- Diviso
% ------- Resto da diviso
A operao de incremento de uma unidade tem tambm um formato reduzido, ou seja, o
comando:
i = i + 1;
freqentemente representado por:
i++;
Da mesma forma i = i-1; pode ser escrito como i--;
Como exemplo dos operadores, o programa abaixo calcula as razes reais de um
polinmio de segundo grau:
#include <stdio.h>
#include <math.h>
main()
{
float a,b,c;
float x1,x2;
printf("Entre a,b,c:");
scanf("%f %f %f",&a,&b,&c);
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("\n x1 = %f x2 = %f\n",x1,x2);
}
Comentrios
possvel introduzir comentrios dentro de um programa C, bastando para isso coloclos no seguinte formato:
/* Comentario

*/

/* * * * * * * * * * * * * * * * * * * * * * * * */

Observe o exemplo abaixo:

/* Solues reais da equao ax*x + b*x + c = 0 */


#include <stdio.h>

Robtica Teoria e Prtica

Robtica Teoria e Prtica


#include <math.h>
main()
{
/* Definicao das variaveis */
float a,b,c; /* Coeficientes do polinomio */
float x1,x2; /* Solucoes desejadas */
/* Entrada de Dados */
printf("Entre a,b,c:");
scanf("%f %f %f",&a,&b,&c);
/* Calculo das raizes */
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
/* Impressao dos dados finais */
printf("\n x1 = %f x2 = %f\n",x1,x2);
}
LAOS (LOOPS)
Existem trs formatos bsicos de laos:
1 do {} while();
2 - while() {}
3 - for( ; ;) { }
Comando for( ; ; ) {}
O for um comando apropriado quando queremos executar um conjunto de operaes
um nmero fixo de vezes. O exemplo abaixo imprime os nmeros de 0 at 9:
#include <stdio.h>
main()
{
int n;
10
for(n=0; n<10; n++) {
printf("n = %d\n",n);
}
}
O resultado ser:
n=0
n=1
n=2
n=3
n=4
n=5
n=6
n=7
n=8
n=9
O comando for composto de trs argumentos:
for( n=0 ;
n<10 ;

n++ )

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Expresso de inicializao

Expresso de teste

Incremento

Expresso de inicializao
Inicializa a varivel do lao. A inicializao feita uma nica vez quando o lao inicia.
Expresso de teste
Esta expresso testa (a cada vez que o conjunto de comandos no interior do for finaliza),
se o lao deve ser encerrado. Enquanto a expresso for verdadeira o lao repetido.
Para realizar teste utilizamos os operadores relacionais. Os principais operadores so:
< Menor
> Maior
<= Menor ou igual
>= Maior ou igual
== Igual
!= Diferente
&& e
! negao
|| ou
Expresso de incremento
A cada repetio do lao, o terceiro argumento (n++) incrementa a varivel n.
Exemplo: Mtodos numricos de integrao (ponto a esquerda)
Como aplicao do comando for o exemplo abaixo ilustra a implementao do mtodo
do ponto a esquerda para avaliar numericamente:

/* * * * * * * * * * * * * * * * * * * * */
/* Integracao Numerica: Ponto a Esquerda */
/* * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
main()
{
int i;
int n;
float w;
float dx ;
float a,b ;
float soma;
printf("\nEntre o extremo inferior do intervalo: ");
scanf("%f",&a);
printf("\nEntre o extremo superior do intervalo: ");
scanf("%f",&b);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


printf("\nEntre com o numero de particoes: ");
scanf("%d",&n);
soma = 0.0;
dx = (b-a)/n;
for(i=0; i< n; i++) {
w = a + i * dx;
soma += (w * w) * dx;
printf("\nSoma parcial = %f ",soma);
}
printf("\nIntegral = %15.9f ",soma);
}
Comando do {} while();
Este segundo tipo de lao adequado para situaes onde no sabemos ao certo quantas
vezes o lao deve ser repetido. O exemplo abaixo ilustra a utilizao do comando:
#include <stdio.h>
main()
{
int n;
n = 0;
do {
printf("n = %d\n",n);
n++;
} while (n < 10);
}
No exemplo acima o programa entra dentro do lao faz o primeiro printf, incrementa n
de uma unidade e s ento verifica a condio while (n < 10). Caso a condio seja
verdadeira, a execuo do programa retorna a primeira linha do lao (printf("n =
%d\n",n);) e prossegue at que a condio seja falsa. O programa sempre entra
executando os comando no interior do lao, para somente no final realizar o teste.
Exemplo: Mtodo de Newton

O programa abaixo determina as razes da funo:


utilizando o mtodo de
Newton, ou seja, dada uma condio inicial x0, e um erro mximo E, a seqncia
abaixo pode convergir para uma das razes:

/* Metodo de Newton */
#include <stdio.h>

Robtica Teoria e Prtica

Robtica Teoria e Prtica


#include <math.h>
main()
{
int i ;
double xn, x0,xn_1;
double erro ;
printf(" Entre com a condicao inicial: ");
scanf("%lf",&x0);
printf("\n Erro maximo: ");
scanf("%lf",&erro);
xn = x0;
i = 0;
do {
xn_1 = xn;
xn = xn_1 - (xn_1 * xn_1 - 2) / (2 * xn_1);
i++;
printf("\nx[%2d] = %20.17f",i,xn);
} while (fabs(xn - xn_1) > erro);
printf ("\n A raiz obtida foi: %20.17f\n",xn);
}
Comando while() {};
Este ltimo tipo de lao muito semelhante ao anterior. Partindo do exemplo abaixo
vamos observar a nica diferena para o lao da seo anterior:

#include <stdio.h>
main()
{
int n;
n = 0;
while (n < 10){
printf("n = %d\n",n);
n++;
}
}
Neste exemplo, primeiro feito o teste (while (n < 10)) e somente em caso verdadeiro
os comandos dentro do while so executados. Assim se a condio for falsa a primeira
vez, em nenhum momento os comandos dentro do lao sero executados. J no do{}
while(); pelo menos a primeira vez os comandos dentro do lao sero executados.
Comando break e continue
Para auxiliar nos laos contamos com dois comandos de interrupo do lao, cada um
com objetivos diferentes. O comando break; interrompe o lao (Qualquer dos trs
formatos apresentados) e o programa continua no primeiro comando aps o lao.
Exemplo:
#include <stdio.h>
main()

Robtica Teoria e Prtica

Robtica Teoria e Prtica


{
int n;
n = 0;
while (n < 10){
printf("n = %d\n",n);
if (n > 3)
break;
n++;
}
printf (Fim do programa \n);
}
O resultado deste programa ser:
n=0
n=1
n=2
n=3
n=4
Fim do programa
O comando continue; transfere a execuo do programa para o teste do lao, que pode
ou no prosseguir conforme a condio seja verdadeira ou falsa.
DECISES
Comando if () {}
O comando principal de deciso o if(). Atravs deste comando o fluxo do programa
pode ser desviado para executar ou no um conjunto de comandos. Considere o
exemplo abaixo:
/* * * * * * * * * * * * * * * * * * */
/* Testa se um numero e par ou impar */
/* * * * * * * * * * * * * * * * * * */
#include <stdio.h>
main()
{
int i,n;
printf("Entre com n = ");
scanf("%d", &n);
i = n % 2;
if (i == 0) {
printf("\n n e um numero par\n");
}
else {
printf("\n n e um numero impar\n");
}
}
Neste exemplo a varivel i armazena o resto da diviso de n por 2. Caso seja zero, ento
o programa passa a execuo do comando printf("\n n e um numero par\n"). Se a

Robtica Teoria e Prtica

Robtica Teoria e Prtica


condio falha, o comando else indica que o programa deve executar o comando
printf("\n n e um numero impar\n"). Observe que o else um comando opcional. Caso
voc no o inclua, o programa segue para o prximo comando aps o if.
Exemplo: Mtodo da Bis seo

O programa abaixo determina as razes da funo:


utilizando o mtodo da
bisseo. No mtodo da bisseo procuramos uma raiz contida em certo intervalo [a,b]
dado. A raiz existe desde que a funo seja contnua e o sinal da funo troque de um
extremo para outro (ou seja f(a) * f(b) < 0).
/* * * * * * * * * * * * * * * * * * */
/* Metodo da Bissecao */
/* * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main()
{
float a,b,c;
float erro;
float fa,fb,fc;
printf("\nEntre com a = ");
scanf("%f",&a);
printf("\nEntre com b = ");
scanf("%f",&b);
printf("\nEntre com o erro = ");
scanf("%f",&erro);
fa = a*a - 2;
fb = b*b - 2;
if ((fa * fb) > 0) {
printf("\nCondicao inicial nao contem raiz !\n");
exit(0);
}
while(fabs(a-b) > erro) {
c = (a+b)/2.0;
fc = c*c - 2.0;
if (fa * fc < 0) {
b = c;
}
else {
if (fb * fc < 0)
a = c;
else
break;
}
printf("\n Raiz parcial = %f ",c);
}
printf("\n\n Raiz obtida = %f \n",c);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


}

FUNES
Introduo
As funes cumprem como primeiro papel, evitar repeties desnecessrias de cdigo.
No exemplo anterior precisamos calcular o valor y=x*x-2 em diversas partes do
programa. Se desejssemos trocar a funo, seria necessrio alterar vrias partes do
cdigo. Para evitar isso, utilizaremos uma funo como no exemplo abaixo:
/* * * * * * * * * * * * * * * * * * * */
/* Metodo da Bisssecao */
/* * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
float f(float x)
{
return(x*x-2);
}
void main()
{
int i = 0;
float a,b,c;
float erro;
float fa,fb,fc;
printf("Entre com os extremos do intervalo [a, b]: ");
scanf("%f,%f",&a,&b);
printf("\nErro: ");
scanf("%f",&erro);
fa = f(a);
fb = f(b);
if ((fa * fb) > 0) {
printf("Condicao inicial nao contem raiz !\n");
exit(0);
}
while(fabs(a-b) > erro) {
i++;
c = (a+b)/2.0;
fc = f(c) ;
if (fa * fc < 0)
b = c;
else
if (fb * fc < 0)
a = c;
else
break;
printf("Raiz parcial no passo %d = %f \n",i,c);
}
printf("\n Raiz obtida = %f \n",c);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


}
Vamos examinar alguns detalhes da funo introduzida:
float
Define o tipo

f
Nome da Funo

(float x)
Argumentos retornado pela funo de entrada

{
float y;
y = x * x - 2;
return(y); /*Valor a ser retornado*/
}
Uma observao importante que as variveis dentro da funo no so conhecidas fora
da funo e vice versa.
Exemplo: Mtodos de Integrao Numrica (Ponto a esquerda, Trapzio e
Simpson)
Para ilustrar o conceito de funes, o exemplo seguinte calcula a integral numrica de
uma funo definida na funo float f(float x) .
/* * * * * * * * * * * * * * * * * * */
/* Metodos de Integracao Numerica */
/* * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <conio.h>
float f(float x)
{
float y;
y = 1/(1+x*x);
return(y);
}
float Integra_Ponto_a_esquerda(float a,float b,int n)
{
int i ;
float soma ;
float dx ;
soma = 0.0;
dx = (b-a)/n;
for(i=1; i<= n; i++) {
soma = soma + f(a + (i-1)*dx) * dx;
printf("\nSoma parcial = %f ",soma);
}
return(soma);
}
float Integral_Trapezio(float a,float b,int n)
{
int i ;

Robtica Teoria e Prtica

Robtica Teoria e Prtica


float soma ;
float dx ;
dx = (b-a)/n;
soma = f(a);
for(i=1; i < n; i++) {
soma = soma + 2*f(a + i*dx);
printf("\nSoma parcial = %f ",soma);
18
}
soma = dx/2 * (soma + f(b));
return(soma);
}
float Integral_Simpson(float a,float b,int n)
{
int i ;
float soma ;
float dx ;
dx = (b-a)/n;
soma = f(a);
for(i=1; i < n; i++) {
if ((i%2) == 1)
soma = soma + 4*f(a + i*dx);
else
soma = soma + 2*f(a + i*dx);
printf("\nSoma parcial = %f ",soma);
}
soma = dx/3 * (soma + f(b));
return(soma);
}
main()
{
int i;
int n;
char c;
float a,b ;
float soma;
do {
printf("Selecione um do metodos de integracao \n");
printf("1- Ponto a esquerda \n");
printf("2- Trapezio \n");
printf("3- Simpson \n");
printf("Opcao: ");
scanf("%d",&i);
printf("\nEntre o extremo inferior do intervalo: ");
scanf("%f",&a);
printf("\nEntre o extremo superior do intervalo: ");
scanf("%f",&b);
printf("\nEntre com o numero de particoes: ");
scanf("%d",&n);
switch(i)

Robtica Teoria e Prtica

Robtica Teoria e Prtica


{
case 1:
soma = Integra_Ponto_a_esquerda(a,b,n);
break;
case 2:
soma = Integral_Trapezio(a,b,n);
break;
case 3:
soma = Integral_Simpson(a,b,n);
break;
}
printf("\nIntegral = %15.9f ",soma);
printf("\n Continua (s/n) ");
c = getche();
} while((c != 'n') && (c != 'N'));
VETORES E MATRIZES
Vetores
Quando voc deseja representar uma coleo de dados semelhantes, pode ser muito
inconveniente utilizar um nome de varivel diferente para cada dado. Para ilustrar
vamos considerar o seguinte exemplo: Montar um programa que armazena as notas de
15 alunos e calcula a mdia obtida pela turma. As notas sero armazenadas em uma
varivel do tipo float, porm ao invs de criarmos 15 variveis, utilizamos uma varivel
do tipo vetor, definida como abaixo:
float notas[15];
o programa completo seria:
#include <stdio.h>
main()
{
int i ;
float media ;
float soma ;
float notas[15];
for(i=0;i < 15;i++) {
printf("\n Aluno %2d ",i+1);
scanf("%f",&notas[i]);
}
for(i=0;i<15;i++)
soma = soma + notas[i];
media = soma / 15;
printf("\n A media final foi: %f",media);
}
Declarao

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Um vetor uma coleo de variveis de certo tipo, alocadas seqencialmente na
memria. Para o compilador C um declarao de varivel vetor do tipo: int n[5]; reserva
o espao de 5 variveis do tipo inteira, onde cada varivel pode ser referenciada
conforme abaixo:
n[0]

n[1]

n[2]

n[3]

n[4]

IMPORTANTE: Observe que a declarao anterior cria cinco variveis, porm o


primeiro elemento n[0]. A declarao de vetor inicia com o ndice 0 e finaliza no
ndice 4. Se voc quer atribui um valor a um dos componentes do vetor basta referencialo por exemplo:
n[3] = 29;
n[0]

n[1]

n[2]

29
n[3]

n[4]

Inicializando vetores

Assim como possvel inicializar uma varivel simples na mesma linha da declarao,
o mesmo pode ser feito para vetores. Observe o exemplo abaixo:
int n[5] = {23, 3, -7, 288, 14};
Exemplo: Mtodo de Ordenao
Como exemplo vamos apresentar um programa que ordena um seqncia de 10
nmeros reais.
/* * * * * * * * * * * * * * * * * * * * * */
/* Metodo da Bolha (ordenacao de um vetor) */
/* * * * * * * * * * * * * * * * * * * * * */
#define MAX 10
#include <stdio.h>
main()
{
int i ;
int flag;
float swap;
float n[MAX];
/* Entrada de Dados */
printf("Entre com os numeros para ordenacao \n");
for(i=0;i<MAX;i++)
{
printf("\n numero %2d: ",i);
scanf("%f",&(n[i]));
}
/* Ordena a sequencia de numeros */
flag = 1;
while(flag == 1) {

Robtica Teoria e Prtica

Robtica Teoria e Prtica


flag = 0;
for(i=0;i<(MAX-1);i++)
{
if (n[i] > n[i+1])
{
swap = n[i] ;
n[i] = n[i+1];
n[i+1] = swap ;
flag = 1 ;
}
}
}
/* Imprime a sequencia de numeros ordenada */
printf("\nSequencia ordenada : ");
for(i=0; i<MAX; i++)
printf("\n %10.5f ",n[i]);
printf("\n");
}
Matrizes
Para representar uma matriz 3x4 (3 linha e 4 colunas) de nmeros reais utilizamos a
seguinte declarao:
float A[3][4];
Assim fica reservado um espao de memria conforme a figura abaixo:
A[0][0]
A[1][0]
A[2][0]

A[0][1]
A[1][1]
A[2][1]

A[0][2]
A[1][2]
A[2][2]

A[0][3]
A[1][3]
A[2][3]

Exemplo: Produto de uma matriz por um vetor


Vamos montar um programa que multiplica um vetor por uma matriz.
/* * * * * * * * * * * * * * * * * * * * * * */
/* Multiplicacao de um vetor por uma matriz */
/* * * * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
main()
{
int i,j;
float A[3][3] = {{1.0, 1.5, 2.1}, {3.4, 2.2, 9.1}, {-1.2, -3.4, 0.9}};
float v[3] = {2.0, 1.0, 0.5};
float p[3];
for(i=0;i<3;i++) {
p[i] = 0;
for(j=0;j<3;j++) {
p[i] += A[i][j] * v[j];
}
}

Robtica Teoria e Prtica

Robtica Teoria e Prtica


for(i=0;i<3;i++) {
printf("\n[");
for(j=0;j<3;j++) {
printf("% 5.3f ",A[i][j]);
}
printf(" ] ");
printf(" [ %5.3f ]",v[i]);
}
for(i=0;i<3;i++)
printf("\n p[%1d] = %10.4f",i,p[i]);
}
PONTEIROS
Considere o seguinte programa:
#include <stdio.h>
int teste(int i)
{
i = i + 20;
printf("Dentro da funcao i = %d \n",i);
return(i);
}
void main()
{
int i,j;
i = 1;
printf("Fora da funcao i = %d \n",i);
j = teste(i);
printf("Fora da funcao i = %d \n",i);
printf("Fora da funcao j = %d \n",j);
}

Observe que o valor da varivel i no tem seu contedo alterado pela funo. Isto ocorre
porque quando uma funo chamada durante o programa, todas as variveis presentes

Robtica Teoria e Prtica

Robtica Teoria e Prtica


na funo so criadas neste. Quando a funo finaliza, todas as variveis da funo so
apagadas da memria. Muitas vezes gostaramos que os argumentos de entrada da
funo pudessem ter seus valores alterados quando a funo finalizasse. Esta ser uma
das aplicaes do conceito de ponteiros.
O que um ponteiro?
Um ponteiro uma varivel que contm o endereo de memria de outra varivel.
Todas as variveis so alocadas em algum espao de memria do computador. O
ponteiro fornece um mecanismo para obter e armazenar este endereo de memria.
Considere o exemplo:
#include <stdio.h>
void main()
{
int i;
printf("Endereco de i = %x\n",&i);
}
O endereo da varivel obtido utilizando-se o operador unrio & na frente da varivel.
Assim &i fornece o endereo da varivel i.
Principais Aplicaes de Ponteiros
Algumas situaes em que os ponteiros so teis:
1. Quando em uma funo desejamos retornar mais de um valor.
2. Para passar vetores e matrizes de forma mais conveniente como argumentos de
funes.
3. Para manipular vetores e matrizes de forma mais eficiente.
4. Para manipular estruturas de dados mais complexas, tais como listas e rvores.
5. Na utilizao das funes calloc() e malloc() responsveis pela alocao de memria
dinmica.
Armazenando os Endereos das Variveis
Para armazenar o endereo de uma varivel (por exemplo &i) em outra varivel,
necessrio criar um tipo especial de varivel denominada apontador. Exemplo:
#include <stdio.h>
void main()
{
int i ;
int *pi;
pi = &i;
printf("Endereco de i = %x ou %x\n",&i,pi);
}
A varivel pi uma varivel do tipo ponteiro para inteiro (ou seja, ela recebe o endereo
de uma varivel do tipo inteiro). Para informar que esta varivel do tipo apontador
colocamos um asterisco (*) na frente da varivel no momento da sua declarao:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


int
Tipo de ponteiro

*
Indica ponteiro

pi
Nome da varivel

Acessando o contedo de um endereo

Considere o exemplo anterior em que pi = &i. Alm do endereo de i, (j armazenado


em pi) podemos tambm acessar o contedo armazenado no endereo de memria. Isto
equivale a obter o valor da varivel i.
Observe o exemplo:
#include <stdio.h>
void main()
{
int i ;
int j ;
int *pi;
pi = &i;
i = 25;
j = *pi + 8; /* equivalente a j = i + 8 */
printf("Endereco de i = %x \n",pi);
printf("j = %d \n",j);
}
O operador unrio * trata seu operando como um endereo e acessa este endereo para
buscar o contedo da varivel. Observe que o * tem dupla funo:
1. Em uma declarao de varivel, indica que a varivel do tipo ponteiro.
2. Durante uma atribuio, acessa o contedo do endereo armazenado pela varivel
ponteiro.
No nosso exemplo, para alterar o valor da varivel i, temos duas alternativas (totalmente
equivalentes) :
i = 5;
*pi = 5;
Ponteiros e Argumentos de Funes

Como sabemos, uma funo no consegue alterar diretamente uma varivel utilizada
como argumento. Com o auxlio dos ponteiros podemos encontrar uma alternativa para
esta situao. No exemplo do programa de ordenao, foi preciso permutar dois
elementos do vetor que estavam fora de ordem. No seria possvel permutar dois valores
atravs de uma funo como abaixo:
/* * * * * * * * * * * * * * * * * * * * * * * * * */
/* Este programa NO consegue permutar os valores */
#include <stdio.h>

Robtica Teoria e Prtica

Robtica Teoria e Prtica


void troca(float x, float y)
{
float auxiliar;
auxiliar = x;
x = y;
y = auxiliar;
}
main()
{
float x = 1.2;
float y = 56.89;
troca(x,y);
printf("x = %6.2f e y = %6.2f\n",x,y);
}
O resultado deste programa seria:
x = 1.2 e y = 56.89
Utilizando ponteiros existe uma maneira de obter o efeito desejado:
/* * * * * * * * * * * * * * * * * * * * * * * * * */
/* Este programa permutar os valores das variaveis */
#include <stdio.h>
void troca(float *x, float *y)
{
float auxiliar;
auxiliar = *x;
*x = *y;
*y = auxiliar;
}
main()
{
float x = 1.2;
float y = 56.89;
troca(&x,&y);
printf("x = %6.2f e y = %6.2f\n",x,y);
}
O uso comum de argumentos do tipo ponteiro ocorre em funes que devem retornar
mais de um valor. No exemplo acima, a funo retornou dois valores.
Ponteiros com Vetores

Na linguagem C, o relacionamento de ponteiros com vetores e matrizes to direto que


daqui para frente sempre trataremos vetores e matrizes utilizando ponteiros. Qualquer
operao que possa ser feita com ndices de um vetor pode ser feita atravs de ponteiros.
Vamos acompanhar atravs do exemplo de ordenao:
/* * * * * * * * * * * * * * * * * */
/* Ordenacao pelo metodo da bolha */
#define MAX 10

Robtica Teoria e Prtica

Robtica Teoria e Prtica


#include <stdio.h>
void troca(float *x, float *y)
{
float auxiliar;
auxiliar = *x;
*x = *y;
*y = auxiliar;
}
void ordena(float *px)
{
int i ;
int flag;
/* Ordena a sequencia de numeros */
flag = 1;
while(flag == 1) {
flag = 0;
for(i=0;i<(MAX-1);i++)
{
if (px[i] > px[i+1])
{
troca(&(px[i]),&(px[i+1]));
flag = 1;
}
}
}
}
main()
{
int i ;
float n[MAX];
/* Entrada de Dados */
printf("Entre com os numeros para ordenacao \n");
for(i=0;i<MAX;i++)
{
printf("\n numero %2d: ",i);
scanf("%f",&(n[i]));
}
ordena(n);
/* Imprime a sequencia de numeros ordenada */
printf("\nSequencia ordenada : ");
for(i=0; i<MAX; i++)
printf("\n %10.5f ",n[i]);
printf("\n");
}
Observe que quando chamamos a funo ordena(n,MAX), utilizamos como argumento
n referncia a nenhum ndice. A funo ordena declarada como: void ordena(float
*px, int limite) Como o C sabe que estamos nos referenciando a um vetor e no a uma
simples varivel ? Na verdade px uma varivel ponteiro para um float. Ela recebe o

Robtica Teoria e Prtica

Robtica Teoria e Prtica


endereo do primeiro elemento do vetor . Porm, os vetores so alocados
sequencialmente na memria do computador. , de forma que a referncia px[5], acessa o
quinto contedo em sequencia na memria. Quando o nome de um vetor passado para
uma funo, o que passado a posio do incio do vetor.
Alocao de Vetores Dinamicamente
Uma das restries do nosso programa de ordenao que o usurio no pode definir a
princpio quantos elementos ele pretende ordenar. Isto ocorre porque precisamos
informar na declarao do vetor qual ser a sua dimenso. Vamos retirar essa restrio.
Para isso utilizaremos um novo comando: malloc(). Vamos utilizar um exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void main()
{
int i;
int n;
float *v;
printf("Entre com a dimensao do vetor desejada = ");
scanf("%d",&n);
v = (float *) malloc(n * sizeof(float));
for(i=0;i<n;i++)
scanf("%f",&(v[i]));
for(i=0;i<n;i++)
printf("v[%2d]=%f\n",i,v[i]);
free(v);
}
Para efetuar a alocao dinmica observe as etapas do programa:
1. O vetor que ser alocado foi declarado como um ponteiro: float *v;
2. O comando malloc(n * sizeof(float)) reserva n espaos de memria, cada um do
tamanho de um float.
3. A funo malloc retorna o endereo do primeiro elemento do vetor: (float *) malloc()
4. A funo free, libera o espao de memria reservado para o vetor.
Alocao de Matrizes Dinamicamente
Para alocar matrizes observe o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
float **matalloc(int n,int m)
{
int j;
float **A;
28

Robtica Teoria e Prtica

Robtica Teoria e Prtica


A = (float **)malloc(n * sizeof(float *));
for(j=0;j<n;j++)
A[j] = (float *) malloc(m * sizeof(float));
return(A);
}
void matfree(float **A,int n,int m)
{
int i;
for(i=0;i<n;i++)
free(A[i]);
free(A);
}
void main()
{
int i;
int j;
int n;
int m;
float **A;
printf("Entre com a dimenso da matriz desejada = ");
scanf("%d, %d",&n,&m);
A = matalloc(n,m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%f",&(A[i][j]));
for(i=0;i<n;i++) {
printf("\n");
for(j=0;j<m;j++)
printf("A[%2d][%2d]=%f\n",i,j,A[i][j]);
}
matfree(A,n,m);
}
Mtodo LU para resoluo de Sistemas Lineares

Um dos mtodos clssicos para se resolver um sistema linear da forma Ax=b, a


decomposio LU. De
forma reduzida temos trs etapas:
1. Decompor A = LU
2. Resolver Lc = b
3. Resolver Ux = c
Vamos descrever este mtodo partindo de um exemplo. Considere o sistema linear
abaixo:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Determinando a matriz L e U
Nosso objetivo inicial aplicar um conjunto de operaes elementares sobre a matriz
dos coeficientes de tal forma que ao final do processo obtemos A = LU, ou seja, a
matriz A pode ser escrita como o produto de duas matrizes onde:
L : Matriz triangular inferior, cuja diagonal contm apenas o valor 1.
U : Matriz triangular superior.
Para obter estas matrizes existem trs tipos de operaes elementares:
1- Permutao de linhas (Li <-> Lj) (No necessrio implementar, para o primeiro
trabalho).
2- Multiplicao de uma linha por um escalar K (Li = K Li). (No necessrio
implementar, para o primeiro trabalho).
3- Substituio da i-sima linha pela i-sima linha acrescida de K vezes a j-sima linha
(Li = Li + K Lj ) Vamos iniciar determinando a matriz U. Para isso nosso objetivo
transformar a matriz dada em uma matriz triangular superior. Comeamos na primeira
coluna, eliminando todos os elementos abaixo do 2:

E para a ultima linha obtemos:

Passamos agora para a segunda coluna e eliminaremos os elementos abaixo do 8 (neste


exemplo o 8):

Obtemos ento uma matriz triangular superior. Esta matriz matriz U desejada. Para
obter a matriz L, observamos que cada uma das operaes elementares aplicadas pode
ser representada por uma matriz. Vamos acompanhar pelo exemplo.
A primeira operao elementar foi :

Esta operao elementar representada pela matriz:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

De forma geral todas as operaes elementares so representadas por matrizes:


1. Permutao de linhas (Li <-> Lj): Partindo da matriz identidade (de mesma
dimensao que a matriz A) troque a i-sima linha pela j-sima linha.
Ex: L2 <-> L3, basta trocar as linhas 2 e 3 da matriz identidade para obter a matriz:

2. Multiplicao de uma linha por um escalar K (Li = K Li): Partindo da matriz


identidade troque o isimo elemento da diagonal pelo valor K.
Ex: L2 = 5 L2, basta trocar na segunda linha da identidade a diagonal para 5:

3. Substituio da i-sima linha pela i-sima linha acrescida de K vezes a j-sima linha
(Li = Li + K Lj ):Partindo da matriz identidade, coloque o valor K na i-sima linha e jsima coluna.
Ex: L2 = L2 + 4 L3. Partindo da matriz identidade, coloque na segunda linha e na
terceira coluna o valor 4:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Robtica Teoria e Prtica

VISUALIZAO E APLICAES GRFICAS 2D


PONTOS E RETAS NO OPENGL
A Tela do Computador
A tela do computador pode ser considerada uma matriz de clulas discretas (Pixels),
cada qual pode estar acesa ou apagada.

0,1
0,0

1,1
1,0

2,1
2,0

A definio da tela varia conforme o monitor e a placa grfica. As definies bsicas


encontradas na maioria dos monitores so:
640 x 480
800 x 600
1024 x 768
1280 x 1024

Cores
A cada pixel associamos uma cor. Para obter uma cor, o monitor envia certa
combinao de vermelho, verde e azul (RGB). O nmero de cores possveis varia
conforme o hardware. Cada pixel tem uma mesma quantidade de memria para
armazenar suas cores. O buffer de cores (Color Buffer) uma poro da memria
reservada para armazenar as cores em cada pixel. O tamanho deste buffer usualmente
medido em bits. Um buffer de 8 bits pode exibir 256 cores diferentes simultaneamente.
Conforme a capacidade da placa grfica podemos ter:
8 bits 256 cores
(High Color) 16 bits 65.536 cores
(True Color) 24 bits 16.777.216 cores
(True Color) 32 bits 4.294.967.296 cores
Existem duas formas bsica de acessar as cores no OpenGL: RGB e Modo Indexado.
Trabalharemos sempre em formato RGB. No formato RGB voc deve informar as
intensidades de Vermelho, Verde e Azul desejadas. Estas intensidades devem variar
entre 0.0 a 1.0. A tabela abaixo mostra como obter as cores bsicas:
Cores R G B

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Vermelho
Verde
Azul
Amarelo
Cyan
Magenta
Branco
Preto

1.0
0.0
0.0
1.0
0.0
1.0
1.0
0.0

0.0
1.0
0.0
1.0
1.0
0.0
1.0
0.0

0.0
0.0
1.0
0.0
1.0
1.0
1.0
0.0

Introduo ao OpenGL
O sistema grfico OpenGL (GL significa Graphics Library) uma biblioteca (de
aproximadamente 350 comandos) para aplicaes grficas. O OpenGL foi desenvolvido
pela Silicon Graphics (SGI) voltado para aplicaes de computao grfica 3D, embora
possa ser usado tambm em 2D. As rotinas permitem gerar primitivas (pontos, linhas,
polgonos, etc) e utilizar recursos de iluminao 3D. O OpenGL independente do
sistema de janelas, ou seja, suas funes no especificam como manipular janelas. Isto
permite que o OpenGL possa ser implementado para diferentes sistemas: X Window
System (Unix), Windows 95 e NT, OS/2 , Macintosh, etc.
Exemplo: Plotar um ponto na tela utilizando as bibliotecas do OpenGl
#include <gl\glut.h>
void redesenha()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1.0,0.0,0.0);
glBegin(GL_POINTS);
glVertex2f(200.0,200.0);
glEnd();
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400); /* Antes do glutCreateWIndow */
glutInitWindowPosition(1,1);
glutCreateWindow("Ponto");
gluOrtho2D(0,399,399,0); /* Apos CreateWindow */
glutDisplayFunc(redesenha); /* Esta funcao e necessaria, caso
contrario o opengl nao consegue
criar a janela */
glutMainLoop();
}
Vamos comentar comando a comando:
glutInit(&argc,argv);
utilizado para iniciar a biblioteca GLUT.

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
Quando uma janela criada, seu tipo determinado pelo Display Mode. O tipo da
janela inclui um conjunto de caractersticas desejadas. Neste caso temos trs:
GLUT_SINGLE: Buffer simples
GLUT_RGBA...: Utilizaremos o modo RGBA.
GLUT_DEPTH.: Buffer de profundidade (utilizado em remoo de superfcies
escondidas).
glutInitWindowSize(400,400);
Indica o tamanho da janela a ser aberta (em pixels).
glutInitWindowPosition(1,1);
Indica a posio inicial da janela.
glutCreateWindow("Ponto");
Cria uma janela para o OpenGL denominada Ponto
gluOrtho2D(0,399,399,0);
Este comando estabelece a escala da tela. Sua sintaxe :
gluOrtho2D(GLdouble left, Gldouble right, Gldouble bottom, Gldouble top);
glutDisplayFunc(redesenha);
Este comando registra que a funo void redesenha() ser a rotina a ser chamada sempre
que a
janela necessita ser redesenhada.
glutMainLoop();
Inicia o gerenciamento da janela e mantm o programa em loop, aguardando por
eventos.
Quando a funo redesenha chamada temos o seguinte resultado:
glClearColor(0.0,0.0,0.0,0.0);
Indica cor para ser utilizada no fundo da tela.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
Pinta os buffers indicados com a cor do glClearColor()
glColor3f(1.0,0.0,0.0);
Define o vermelho como cor atual.
glBegin(GL_POINTS);
glVertex2f(200.0,200.0);
glEnd();
Plota um ponto na posio (200,200) na tela.
glFlush();
Imprime o contedo do buffer na tela.
Exerccios:
1) Comente as seguintes linhas na funo redesenha e veja o resultado:
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
2) Acrescente um contador para verificar quantas vezes a funo redesenha chamada.
void redesenha()
{
static int i = 0;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glColor3f(1.0,0.0,0.0);
glBegin(GL_POINTS);
glVertex2f(200.0,200.0);
glEnd();
glFlush();
printf(" %d ",i++);
}
Comente a seguinte linha do cdigo e veja o resultado.
glutDisplayFunc(redesenha);
Exemplo: Plotar uma reta unindo dois pontos
Como exemplo vamos desenhar uma reta (no vertical) unindo dois pontos (x0,y0) e
(x1,y1).
A equao da reta que passa por dois pontos :

Algoritmo ingnuo

A primeira idia de como resolver este problema proposto pelo programa abaixo. Este
um exemplo ingnuo de como desenhar a reta que passa por dois pontos dados.
Vamos discutir a seguir os principais problemas deste programa e as possveis solues.
/* -------------------------------------------------------------- */
/* Exemplo ingnuo de como plotar a reta definida por dois pontos */
/* -------------------------------------------------------------- */
#include <gl\glut.h>
#include <stdio.h>
int pontos;
float x0,y0,x1,y1;
float Reta_dois_pontos(float x)
{
float y;
y = (y1-y0)/(x1-x0)*(x-x0) - y0;
return(y);
}
void display()
{
int i ;
float x,y;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1.0,0.0,0.0);
for (i=0;i<pontos;i++)
{
x = x0 + i * (x1 - x0)/pontos;
y = Reta_dois_pontos(x);
glBegin(GL_POINTS);
glVertex2f(x,y);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glEnd();
}
glFlush();
glutSwapBuffers();
}
void main(int argc, char **argv)
{
printf("x0 = ");
scanf("%f",&x0);
printf("\ny0 = ");
scanf("%f",&y0);
printf("\nx1 = ");
scanf("%f",&x1);
printf("\ny1 = ");
scanf("%f",&y1);
printf("\nPontos = ");
scanf("%d",&pontos);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glOrtho(0,399,399,0,-1,1);
glutDisplayFunc(display);
glutMainLoop();
}
Algumas desvantagens do programa proposto:
1) Este mtodo requer operaes em ponto flutuante (float ou double) para cada pixel.
Isto acarreta em um algoritmo lento, se comparado a um algoritmo que opera somente
com nmeros inteiros. Para o caso da reta, existe um tal algoritmo que utiliza somente
aritmtica com nmeros inteiros. Este algoritmo foi desenvolvido por Jack E.
Bresenham na dcada de 60 e ser descrito adiante.
2) O usurio estabelece o nmero de pontos da reta a serem plotados entre os dois
pontos. Podem ocorrer dois casos: faltarem pontos (a reta fica pontilhada), sobrarem
pontos (neste caso o algoritmo faz contas desnecessrias). O ideal o prprio programa
se encarregar de determinar o nmero de pontos necessrios e suficientes para resolver
o problema.
3) O caso particular da reta vertical x = K (onde K constante) no pode ser plotado.
Algoritmo de Bresenham
Partindo da informao do pixel inicial (Ax,Ay) e do pixel final (Bx,By), o algoritmo de
Bresenham, para a reta, determina quais pixels devem ser acessos de (Ax,Ay) at
(Bx,By) utilizando para isso unicamente aritmtica inteira. A idia fundamental do
algoritmo que se restringirmos a reta para inclinaes entre 0 e 1 (de 0 a 45 graus),
ento para cada pixel existem somente duas possibilidades como indica a figura abaixo:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Para os casos em que a inclinao no est entre 0 e 1, utilizamos a mesma soluo


considerando simetrias. O algoritmo completo deve considerar oito casos:
1) 0 m 1 com Ax < Bx.
2) 1 < m < com Ay < By.
3) 1 > m > com Ay < By.
4) 0 m 1 com Ax > Bx.
5) 0 m 1 com Ax > Bx.
6) 1 < m < com Ay > By.
7) 1 > m > com Ay > By.
8) 0 m 1 com Ax < Bx
Vamos descrever o funcionamento do algoritmo para o caso 1, os casos restantes
seguem por simetria.
Partindo do ponto (Ax,Ay), como 0 m 1, ento para o prximo pixel temos
somente duas escolhas possveis: (Ax+1,Ay) e (Ax+1,Ay+1). Lembre da figura anterior
que os crculos transparentes so as duas opes. O incremento em uma unidade vem do
fato que estamos avanando um pixel na direo do x (Ax + 1), e podemos ou no
avanar um pixel na direo do y (Ay ou Ay +1).
O ponto ideal dado por (Ax+1,y) onde y = m (Ax + 1) + b. Ns devemos portanto
escolher qual dos dois pontos anteriores est mais prximo do ponto ideal (Ax+1, y).
Para isso calculamos a distncia entre destes dois pontos para o ponto ideal:
D1 = y Ay e D2 = Ay + 1 y
Assim se D1 <= D2 ento escolhemos o ponto (Ax+1,Ay), caso contrrio, se D1 > D2
ento escolhemos o ponto (Ax+1, Ay+1). Contudo, como queremos desenvolver um
algoritmo rpido para fazer isto, teremos que nos restringir a aritmtica inteira. Observe
que o ponto ideal y real e no inteiro. Assim, os prximos passos tm por objetivo
obter um resultado equivalente a testar D1 e D2, porem utilizando somente nmeros
inteiros.
Considere P1 = D1 D2. Testar D1 <= D2 , ou D1 > D2 equivalente
respectivamente a testar
P1 <= 0, ou P1 > 0. Esta varivel P1 ser denominada a varivel de deciso. Assim,
temos que:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


P1 = D1 D2
= y Ay (Ay + 1) + y
= 2y 2Ay -1
Substituindo y = m (Ax + 1) + b, obtemos
P1 = 2m(Ax + 1) + 2b 2Ay -1
Temos que m = dY/dX, onde dY = abs(By Ay) e dX = Bx Ax e substituindo
obtemos:
P1 = 2 dY/dX (Ax + 1) + 2b 2Ay -1
Multiplicando por dX obtemos:
P1 dX = 2 dY (Ax + 1) + 2 b dX 2Ay dX - dX
Observe que para o caso 1 em questo dX > 0, assim o sinal de P1 e de P1 * dX o
mesmo.
Consideramos ento a varivel de deciso P1 como sendo
P1 = dY (Ax + 1) + 2 b dX 2Ay dX dX
A expresso
2 dY (Ax + 1) + 2 b dX 2Ay dX - dX
o teste que estamos procurando, pois ele envolve somente nmeros inteiros
(dY,dX,Ax,Ay,b). Porm ainda podemos melhorar o algoritmo, pois esta avaliao
ficaria demasiada cara para ser feita a cada novo pixel da reta.
Neste passo vamos tentar calcular a varivel de deciso P2 para o prximo pixel,
utilizando a informao que adquirimos no passo anterior para estimar P1. De forma
geral para dois passos subseqentes temos que:
P2 P1 = 2dY(Ax + 2) +2b dX 2Ay dX dX (2dY(Ax + 1) +2b dX 2Ay dX - dX)
= 2 dY -2 (Ay Ay) dX
Temos duas possibilidades: ou Ay = Ay ou Ay = Ay+1, o que se resume a:
P2 P1 = 2 dY ,caso em que escolhemos o ponto (Ax+1,Ay)
P2 P1 = 2 dY -2 dX ,caso em que escolhemos o ponto (Ax+1,Ay+1)
Assim uma vez que calculamos a varivel de deciso P1 para o primeiro pixel, nos
pixels subseqentes, basta incrementar 2 dY ou (2 dY 2 dX), conforme o pixel
escolhido no passo anterior.
Calculando P1 para o pixel inicial (Ax,Ay) obtemos:
P1 = 2 dY (Ax + 1) + 2 b dX 2 Ay dX dX
Para obter b, observe que de y = mx + b obtemos b = y mx, e no ponto (Ax,Ay) temos
que
b=Ay-mAx = Ay dY/dX Ax. Substituindo em P1 obtemos:
P1 = 2 dY (Ax + 1) + 2 (Ay dY/dX Ax) dX 2 Ay dX dX
= 2 dY Ax + 2 dY + 2 Ay dX 2 dY Ax -2 Ay dX dX
= 2 dY dX
Concluso: como resultado final, o algoritmo se resume a:
dX = Bx Ax
dY = By Ay
Deciso inicial P1 = 2 dY dX
Incremente Ax at Bx e para cada passo:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


 Se P1 <= 0 escolha o pixel Ay e incremente P1 = P1 + 2 dY
 Se P1 > 0 escolha o pixel Ay + 1 e incremente P1=P1 + 2 dY 2 dX.
O programa considerando as oito possibilidades dado abaixo:
#include <gl\glut.h>
#include <stdio.h>
//=============================================================
=======
// b r e s l i n e . c
//
// VERSION 1: draws only from one end and calculates both x and y.
//
// Programmer: Kenny Hoff
// Date: 10/25/95
// Purpose: To implement the Bresenham's line drawing algorithm
for
// all slopes and line directions (using minimal
routines).
//=============================================================
======
// EXTERNALLY DEFINED FRAMEBUFFER AND FRAMEBUFFER
DIMENSIONS (WIDTH))
// extern int WIDTH;
//=============================================================
=======
=
// Fills the intermediate points along a line between the two given
// endpoints using Bresenham's line drawing algorithm. NOTE: this
// routine does no clipping so the coordinate values must be within
the
// FrameBuffer bounds.
// NOTE: USE (Ax,Ay) as the starting point (values that are
// incremented)
//=============================================================
=======
void BresLine(int Ax, int Ay, int Bx, int By)
{
//-------------------------------------------------------------// INITIALIZE THE COMPONENTS OF THE ALGORITHM THAT ARE NOT
// AFFECTED BY THE SLOPE OR DIRECTION OF THE LINE
//-------------------------------------------------------------int dX = abs(Bx-Ax); // store the change in X and Y of the
// line endpoints
int dY = abs(By-Ay);
//-------------------------------------------------------------// DETERMINE "DIRECTIONS" TO INCREMENT X AND Y (REGARDLESS OF
// DECISION)

Robtica Teoria e Prtica

Robtica Teoria e Prtica


//-------------------------------------------------------------int Xincr, Yincr;
if (Ax > Bx) { Xincr=-1;} else { Xincr=1;}//which direction in
X?
if (Ay > By) { Yincr=-1;} else { Yincr=1;}//which direction in
Y?
//-------------------------------------------------------------// DETERMINE INDEPENDENT VARIABLE (ONE THAT ALWAYS
INCREMENTS BY
// 1 (OR -1) )AND INITIATE APPROPRIATE LINE DRAWING ROUTINE
// (BASED ON FIRST OCTANT ALWAYS). THE X AND Y'S MAY BE FLIPPED
//IF Y IS THE INDEPENDENT VARIABLE.
//-------------------------------------------------------------{
int dPr = dY<<1; // amount to increment decision
// if right is chosen (always)
int dPru = dPr - (dX<<1); // amount to increment
// decision if up is chosen
int P = dPr - dX; // decision variable start
value
for (; dX>=0; dX--) // process each point in the line
// one at a time (just use dX)
{
glBegin(GL_POINTS);
glVertex2d(Ax, Ay); // plot the pixel
glEnd();
if (P > 0) // is the pixel going right AND up?
{
Ax+=Xincr; // increment independent variable
Ay+=Yincr; // increment dependent variable
P+=dPru; // increment decision (for up)
}
else // is the pixel just going right?
{
Ax+=Xincr; // increment independent variable
P+=dPr; // increment decision (for right)
}
}
}
else // if Y is the independent variable
{
int dPr = dX<<1; // amount to increment decision if
// right is chosen (always)
int dPru = dPr - (dY<<1); // amount to increment
// decision if up is chosen
int P = dPr - dY; // decision variable start value
for (; dY>=0; dY--) // process each point in the line
// one at a time (just use dY)

Robtica Teoria e Prtica

Robtica Teoria e Prtica


{
glBegin(GL_POINTS);
glVertex2d(Ax, Ay); // plot the pixel
glEnd();
if (P > 0) // is the pixel going up AND right?
{
Ax+=Xincr; // increment dependent variable
Ay+=Yincr; // increment independent variable
P+=dPru; // increment decision (for up)
}
else // is the pixel just going up?
{
Ay+=Yincr; // increment independent variable
P+=dPr; // increment decision (for right)
}
}
}
}
void display()
{
int i;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1.0,0.0,0.0);
BresLine(0,0,400,400);
glFlush();
glutSwapBuffers();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glOrtho(0,399,0,399,-1,1);
glutDisplayFunc(display);
glutMainLoop();
}
Retas no Opengl
O OpenGL dispe em sua biblioteca interna de um comando que plota uma reta por dois
pontos dados.
Este comando descrito abaixo:
void display()
{
float x,y;
glClearColor(0.0,0.0,0.0,0.0);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex2f(x0,y0);
glVertex2f(x1,y1);
glEnd();
glFlush();
}
Exemplo: Plotar o grfico de uma funo
Vamos comear com uma verso bem simplificada, para plotar o grfico de uma funo
y=f(x).
#include <gl\glut.h>
#include <stdio.h>
float funcao(float x)
{
return(x*x);
}
void display()
{
float x,y;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1.0,0.0,0.0);
for(x=-1;x<1;x+=0.01)
{
y = funcao(x);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
gluOrtho2D(-1,1,-1,1);
glutDisplayFunc(display);
glutMainLoop();
}
Vamos melhorar este programa:
1) Acrescentando os eixos.
2) Criando uma varivel pontos que permita melhorar a discretizao.
3) Separa os programa em dois mdulos:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


funcao01.cpp: funes bsicas de inicializao e controle do glut.
funcao02.cpp: funes grficas definidas com a tarefa especfica de plotar o grfico da
funo.
/* * * * * * * * * * * * * */
/* Modulo: Funcao01.cpp */
/* * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "funcao02.h"
void redesenha()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_funcao();
glFlush();
glutSwapBuffers();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Funcao");
glutDisplayFunc(redesenha);
gluOrtho2D(-5,5,-5,5);
glutMainLoop();
}
/* * * * * * * * * * * * * */
/* Modulo: funcao02.cpp */
/* * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
#define PI 3.1415926535897932384626433832795
float xmin = -5.0;
float xmax = 5.0;
float ymin = -5.0;
float ymax = 5.0;
int pontos = 400;
/* -------------------------------- */
float funcao(float x)
/* -------------------------------- */
{
return(sin(x));
}

Robtica Teoria e Prtica

Robtica Teoria e Prtica


/* -------------------------------- */
void plota_eixo()
/* -------------------------------- */
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
/* -------------------------------- */
void plota_funcao()
/* -------------------------------- */
{
int i ;
float dx ;
float x,y;
dx = (xmax - xmin)/pontos;
glColor3f(1.0,0.0,0.0);
x = xmin;
for(i=0;i<pontos;i++)
{
y = funcao(x);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
x = x + dx;
}
}
/* funcao02.h */
float funcao(float x);
void plota_eixo();
void plota_funcao();

TECLADO E MOUSE (Callbacks)


Introduo
O usurio pode interagir com o programa de duas formas principais: atravs do Mouse
ou Teclado. Para isso o GLUT dispe de dois tipos de funes (que denominamos
Callbacks) especficas para habilitar a utilizao do teclado e do mouse. Vamos
descrev-las a seguir.
Teclado
Para registrar ocorrncias no teclado o GLUT dispe da funo:
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)) , Esta funo
determina que quando uma tecla for pressionada, o controle do programa deve passar a
funo definida no campo (*func) e esta funo receber como parmetros de entrada, a

Robtica Teoria e Prtica

Robtica Teoria e Prtica


tecla pressionada (unsigned char key), e a posio do mouse (int x, int y). O exemplo
abaixo exemplifica uma aplicao para o programa funes.
Exemplo: Utilizao do teclado no programa funes.
Como exemplo vamos acrescentar no programa funes a possibilidade de alterarmos o
domnio da funo durante a execuo do programa. Assim podemos estabelecer que
quando o usurio pressionar a tecla D ou d, o programa interrompe e solicita na
janela DOS as novas informaes sobre o domnio da funo. Vamos reorganizar o
programa, modularizando as principais rotinas do programa em arquivos diferentes.

Nosso programa ter dois mdulos principais:


- funcao010.cpp: Mantm as rotinas de visualizao do OpenGL
- funcao011.cpp: Mantm as rotinas relativas ao desenho da funo.
Teremos ainda o mdulo:
- funcao011.h: Este mdulo deve ter apenas o cabealho das funes do programa
funcao011.cpp.
A seguir apresentamos o cdigo de cada um destes mdulos.
Mdulo funcao011.h

/* * * * * * * * * * * * * * */
/* Modulo: funcao011.h */
/* * * * * * * * * * * * * * */
float funcao(float x);
void plota_eixo();
void plota_funcao();
void entra_dominio();
Mdulo funcao010.cpp
Este mdulo contm as rotinas bsicas do OpenGL e a abertura do programa (void
main()). Observe que a funo glutKeyboardFunc(le_tecla); informa que quando
alguma tecla pressionada o controle do programa deve passar a rotina void
le_tecla(unsigned char key, int x, int y).
/* * * * * * * * * * * * * * */
/* Modulo: funcao010.cpp */
/* * * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "funcao011.h"
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

Robtica Teoria e Prtica

Robtica Teoria e Prtica


plota_eixo();
plota_funcao();
glFlush();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
display();
break;
}
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glutDisplayFunc(display);
glutKeyboardFunc(le_tecla);
glutMainLoop();
}
Mdulo funcao011.cpp
Neste mdulo separamos as rotinas que trabalham com a funo ser desenhada.
/* * * * * * * * * * * * * * */
/* Modulo: funcao011.cpp */
/* * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
float xmin,ymin,xmax,ymax,incremento;
float funcao(float x)
{
return(sin(x));
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();

Robtica Teoria e Prtica

Robtica Teoria e Prtica


}
void plota_funcao()
{
float x,y;
glColor3f(1.0,0.0,0.0);
for(x=xmin;x<xmax;x+=incremento)
{
y = funcao(x);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
void entra_dominio()
{
int pontos;
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Mouse
O GLUT capaz de obter trs tipos de ocorrncias diferentes a partir do mouse. Vamos
descrev-las a seguir.
glutMouseFunc

void glutMouseFunc(void (*func)(int button, int state, int x, int y)) Este evento detecta
quando algum boto do mouse foi pressionado. Quando isto ocorre, o programa executa
a rotina definida em void (*func). Os parmetros desta rotina podem receber os
seguintes valores:
- button : informa qual boto do mouse foi pressionado, sendo atribudo com um dos
seguintes
valores:
GLUT_LEFT_BUTTON,
GLUT_MIDDLE_BUTTON,
GLUT_RIGHT_BUTTON.
- state: informa quando o boto foi pressionado e quando o boto foi solto, sendo
atribudo com dois possveis valores: GLUT_DOWN ou GLUT_UP.
- X,y: informa a posio do mouse na janela quando o boto foi pressionado.
Como exemplo, vamos alterar o programa funo anterior, e acrescentar outra forma de
interrupo para alterar o domnio. Assim se o usurio pressionar o boto esquerdo do

Robtica Teoria e Prtica

Robtica Teoria e Prtica


mouse, o programa solicita na janela DOS o novo domnio de visualizao. Para
implementar esta alterao s precisamos mudar o programa funcao010.cpp. Seu novo
cdigo apresentado a seguir:
/* * * * * * * * * * * * * * */
/* Modulo: funcao010.cpp */
/* * * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "funcao011.h"
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_funcao();
glFlush();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
display();
break;
}
}
void le_botao_mouse(int b,int state,int x, int y)
{
switch(b) {
case GLUT_RIGHT_BUTTON:
switch(state) {
case GLUT_DOWN:
entra_dominio();
display();
break;
case GLUT_UP:
printf(" x = %d y = %d \n",x,y);
break;
}
break;
}
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glutDisplayFunc(display);
glutKeyboardFunc(le_tecla);
glutMouseFunc(le_botao_mouse);
glutMainLoop();
}
glutMotionFunc
void glutMotionFunc(void (*func)(int x, int y))
Este evento detecta o movimento do mouse enquanto algum boto do mouse est
pressionado. Quando isto ocorre, o programa executa a rotina definida em void (*func)
e informa em x,y a posio do mouse na janela. No exemplo abaixo, a rotina
le_botao_movimento_mouse(int x, int y) imprime a posio do mouse enquanto
mantemos um de seus botes pressionados.
/* * * * * * * * * * * * */
/* Programa mouse01.cpp */
/* * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glFlush();
}
void le_botao_movimento_mouse(int x, int y)
{
printf("Botao+movimento x = %d y = %d \n",x,y);
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Mouse");
glutDisplayFunc(display);
glutMotionFunc(le_botao_movimento_mouse);
glutMainLoop();
}
glutPassiveMotionFunc

void glutPassiveMotionFunc(void (*func)(int x, int y))


Este evento detecta o movimento do mouse quanto nenhum boto do mouse est
pressionado. Quando isto ocorre, o programa executa a rotina definida em void (*func)
e informa em x,y a posio do mouse na janela. No exemplo abaixo, a rotina

Robtica Teoria e Prtica

Robtica Teoria e Prtica


le_movimento_mouse(int x, int y) imprime a posio do mouse quando movimentamos
o mouse dentro da janela OpenGL.
/* * * * * * * * * * * * */
/* Programa mouse02.cpp */
/* * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glFlush();
}
void le_movimento_mouse(int x, int y)
{
printf("Movimento x = %d y = %d \n",x,y);
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Mouse");
glutDisplayFunc(display);
glutPassiveMotionFunc(le_movimento_mouse);
glutMainLoop();
}
CURVAS PARAMTRICAS
Introduo
Considere uma curva C representando a trajetria de uma partcula P, de tal forma que a
posio P(x,y) da partcula conhecida em cada instante de tempo t. Assim as
coordenadas x e y so conhecidas como funes da varivel t de modo que:
x = x(t)
y = y(t)
Estas so as equaes paramtricas da curva C e t denominado parmetro. Como
exemplo de curvas temos:
a) Circunferncia de centro na origem e raio 1:
x = cos(t)
y = sen(t) onde 0 <= t <= 2*Pi
b) Ciclide (curva traada por um ponto da circunferncia quando o crculo rola sobre
uma reta):
x = t - sen(t)
y = 1 - cos(t)
Exemplo: Visualizao de Curvas Paramtricas

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Vamos implementar um programa que visualize curvas paramtricas. Observe que a
diferena principal para o programa funes que tanto a varivel x, quanto y devem
ser calculadas em funo do parmetro t. Vamos aproveitar uma boa parte da estrutura
j implementada no programa funo. O programa est dividido em dois mdulos
principais:
- curvas010.cpp: Mantm as rotinas de visualizao do OpenGL
- curvas011.cpp: Mantm as rotinas relativas ao desenho da curva.
Temos ainda o mdulo:
- curvas011.h: Este mdulo deve ter apenas o cabealho das funes do programa
curvas011.cpp.
Mdulo curvas010.cpp
Este mdulo idntico ao mdulo funcao010.cpp. A nica diferena que as chamadas
so feitas para as novas funes de desenho das curvas.
/* * * * * * * * * * * * * */
/* Modulo: Curvas010.cpp */
/* * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "curvas011.h"
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_curva();
glFlush();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
display();
break;
}
}
void le_botao_mouse(int b,int state,int x, int y)
{
switch(b) {
case GLUT_RIGHT_BUTTON:
switch(state) {
case GLUT_DOWN:
entra_dominio();
display();

Robtica Teoria e Prtica

Robtica Teoria e Prtica


break;
case GLUT_UP:
break;
}
break;
}
}
void main(int argc, char **argv)
{
22
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glutDisplayFunc(display);
glutKeyboardFunc(le_tecla);
glutMouseFunc(le_botao_mouse);
glutMainLoop();
}
Mdulo curvas011.cpp
Neste mdulo implementamos o desenho do grfico das curvas paramtricas. As
funes plota_eixo e entra_domnio no sofrem alteraes.
/* * * * * * * * * * * * * */
/* Modulo: Curvas011.cpp */
/* * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
#define PI (4.0*atan(1.0))
float xmin = -1.0;
float ymin = -1.0;
float xmax = 1.0;
float ymax = 1.0;
float incremento = 0.01;
/* -------------------------------- */
void curva(float t,float *x,float *y)
/* float t (entrada) */
/* float *x (saida) */
/* float *y (saida) */
{
*x = cos(t);
*y = sin(t);
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
void plota_curva()
{
float x,y,t;
glColor3f(1.0,0.0,0.0);
for(t=0;t < 2*PI; t+=incremento)
{
curva(t,&x,&y);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
void entra_dominio()
{
int pontos;
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Mdulo curvas011.h
Float curva(float t,float *x,float *y);
Void plota_eixo();
Void plota_curva();
Void entra_dominio();
Exerccio
Como exerccio implemente:
1) Curva ciclide (t assume qualquer valor real).
2) x(t) = 3*t*t, y(t)=4*t*t*t (t assume qualquer valor real).
3) x(t) = cos(2*t), y(t)= sin(2*t) (0 <= t <= 2*PI) (Qual a diferena para a curva do
programa ?)

Robtica Teoria e Prtica

Robtica Teoria e Prtica


4) x(t) = cos(t), y(t)= sin(2*t)
5) x(t) = 2 * cos(t), y(t)= 3 * sin(t) (0 <= t <= 2*PI) .
6) Como voc poderia visualizar grficos de funes em uma varivel y = f(x) com este
programa
? Visualize y=x*x, y = sin(x), y = ln(x).
Curvas na forma Polar
Para formar as coordenadas polares considere um ponto fixo O, denominado origem (ou
polo) e um eixo partindo de O, denominado eixo polar. A cada ponto P do plano
podemos associar uma par de coordenadas polares (r,theta) onde:
r:
distncia orientada da origem ao ponto P.
theta:
ngulo entre o eixo polar e o segmento OP.
As coordenadas polares podem ser relacionadas com as coordenadas retangulares (ou
cartesianas) atravs de expresses abaixo:

Como exemplo de curvas na forma polar temos:


a) Circunferncia de centro na origem e raio 1:
r=1
b) Reta passando na origem com coeficiente angular m:

0=m
c) Circunferncia com centro em P(0, 0.5) e raio 1:

r = sin0
d) Cardiide

r = a(1+ cos(0))
e) Espiral

r = a0
f) Roscea

r = asen(n0 )
Visualizao de Curvas Polares

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Para visualizar as curvas polares, podemos utilizar o mesmo programa das curvas
paramtricas. Para isso, considere uma curva dada na forma polar:
r = f (0)
Em coordenadas cartesianas temos:

Substituindo r nas duas equaes obtemos:

Assim temos uma curva na forma paramtrica. Como exemplo vamos visualizar a curva
do cardiide, alterando apenas a rotina curva do programa anterior:
/* -------------------------------- */
void curva(float t,float *x,float *y)
/* float t (entrada) */
/* float *x (saida) */
/* float *y (saida) */
/* -------------------------------- */
/* -------------------------------- */
{
*x = (1+cos(t))*cos(t);
*y = (1+cos(t))*sin(t);
}

Exerccios
1) Como exerccio visualize as demais curvas dadas em coordenadas polares.
2) Visualize a curva dada em coordenadas polares por r = sec(theta).

RETAS E POLGONOS NO OPENGL


Retas e Polgonos
Alm de pontos e retas, o OpenGL possui no total 10 tipos de primitivas teis. Todos os
modelos da tabela abaixo devem ser utilizados iniciando com glBegin(...) e finalizando
com glEnd(...),
por exemplo para o GL_LINES temos:
glBegin(GL_LINES);
glVertex2f(1.0,1.0);
glVertex2f(1.0,2.0);
glVertex2f(2.0,-2.0);
...
glEnd();
GL_POINTS
GL_LINES
GL_POLYGON
GL_TRIANGLES

Pontos individuais.
Reta entre dois pontos.
Polgono convexo .
Tripla de vrtices interpretado como um

Robtica Teoria e Prtica

Robtica Teoria e Prtica


GL_QUADS
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLE_STRIP
GL_TRAINGLE_FAN
GL_QUAD_STRIP

tringulo.
Conjunto de quatro vrtices interpretado como
quadriltero.
Sequncia de retas.
Idntico ao anterior, porm com uma reta unindo o
primeiro e ltimo vrtice.
Lista de tringulos.
Lista de tringulos com o primeiro vrtice em
comum.
Lista de quadrilteros.

Exemplo: Visualizao dos Mtodos Numricos de Integrao


Como exemplo de aplicao dos novos objetos vamos visualizar alguns mtodos
numricos de integrao: ponto direita, ponto esquerda e trapzio.
Nosso programa ter trs mdulos principais:
- Intvis01.cpp: Mantm as rotinas de visualizao do OpenGL

Robtica Teoria e Prtica

Robtica Teoria e Prtica


- Intvis02.cpp: Mantm as rotinas relativas ao esboo do grfico da funo.
- Intvis03.cpp: Mantm as rotinas de visualizao dos mtodos numricos de integrao.
A seguir apresentamos o cdigo de cada um destes mdulos.
Mdulo Intvis01.c

/* * * * * * * * * * * * * * */
/* Modulo: Intvis01.c */
/* * * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "Intvis02.h"
#include "Intvis03.h"
extern int tipo,visual;
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_funcao();
plota_integral();
glFlush();
glutSwapBuffers();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
display();
break;
case 'I':
case 'i':
entra_limites();
display();
break;
case '0':
tipo = 0;
display();
break;
case '1':
tipo = 1;
display();
break;
}
}

Robtica Teoria e Prtica

Robtica Teoria e Prtica


void le_botao_mouse(int b,int state,int x, int y)
{
switch(b) {
case GLUT_RIGHT_BUTTON:
switch(state) {
case GLUT_DOWN:
visual = (visual + 1) % 2;
display();
break;
case GLUT_UP:
break;
}
break;
}
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glutDisplayFunc(display);
glutKeyboardFunc(le_tecla);
gluOrtho2D(-10.0,10.0,-10.0,10.0);
glutMouseFunc(le_botao_mouse);
glutMainLoop();
}
Mdulo Intvis02.cpp
/* * * * * * * * * * * * * * */
/* Modulo: Intvis02.cpp */
/* * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
float xmin = -10.0;
float ymin = -10.0;
float xmax = 10.0;
float ymax = 10.0;
float incremento = 0.01;
float funcao(float x)
{
return(sin(x));
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
void plota_funcao()
{
float x,y;
glColor3f(1.0,0.0,0.0);
for(x=xmin;x<xmax;x+=incremento)
{
y = funcao(x);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
void entra_dominio()
{
int pontos;
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Mdulo Intvis03.cpp
Neste mdulo separamos as rotinas que responsveis pela visualizao dos numricos
mtodos de integrao.
/* * * * * * * * * * * * * * */
/* Modulo: Intvis03.cpp */
/* * * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include "Intvis02.h"
float a = 0;
float b = 1;
int tipo = 0;
int visual = 0;
int divisoes = 5;

Robtica Teoria e Prtica

Robtica Teoria e Prtica


void Integral_retangulo()
{
int i ;
float x,y;
float dx;
dx = (b-a)/divisoes;
for(i=0; i < divisoes; i++)
{
x = a+ i*dx;
y = funcao(x);
glColor3f(1.0,1.0,0.0);
if (visual == 0)
glBegin(GL_LINE_LOOP);
else
glBegin(GL_POLYGON);
glVertex2f(x,y);
glVertex2f(x+dx,y);
glVertex2f(x+dx,0);
glVertex2f(x,0);
glEnd();
}
}
void Integral_trapezio()
{
int i ;
float x,y1,y2;
float dx;
dx = (b-a)/divisoes;
for(i=0; i < divisoes; i++)
{
x = a+ i*dx;
y1 = funcao(x);
y2 = funcao(x + dx);
glColor3f(1.0,1.0,0.0);
if (visual == 0)
glBegin(GL_LINE_LOOP);
else
glBegin(GL_POLYGON);
31
glVertex2f(x,y1);
glVertex2f(x+dx,y2);
glVertex2f(x+dx,0);
glVertex2f(x,0);
glEnd();
}
}
void plota_integral()
{
switch(tipo) {
case 0:

Robtica Teoria e Prtica

Robtica Teoria e Prtica


Integral_retangulo();
break;
case 1:
Integral_trapezio();
break;
}
}
void entra_limites()
{
printf("Limites de Integracao \n");
printf("a = ");
scanf("%f",&a);
printf("\nb = ");
scanf("%f",&b);
printf("\ndivisoes = ");
scanf("%d",&divisoes);
}
Exemplo: Realizando Zoom do grfico
No processo de visualizao das funes, ou mesmo da integrao numrica, muitas
vezes desejamos alterar o domnio do nosso grfico. Para isso selecionamos a tecla D
e d como uma interrupo do teclado para que pudssemos informar o novo domnio.
Uma forma mais gil seria selecionar com o mouse interativamente um retngulo que
gostaramos de visualizar. o que faremos no prximo programa. Para isso
utilizaremos a funo glutMotionFunc(funcao) para selecionarmos a regio desejada.
Quando o boto direito do mouse pressionado, marcamos o ponto inicial da regio.
Enquanto o mouse est em movimento (com o boto direito pressionado), desenhamos o
retngulo desejado. Quando o boto do mouse solto, obtemos o ponto final da regio e
atualizamos o domnio da funo. Vamos incorporar ao programa Funcao.cpp a nova
ferramenta de zoom.
/* * * * * * * * * * * * * * * * * */
/* Modulo: Funcao.cpp (com zoom) */
/* * * * * * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "plota.h"
int mov = 0; /* Detecta o movimento do mouse */
int xv1,xv2,yv1,yv2; /* Domnio da nova janela */
void redesenha()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_funcao();
if (mov == 1)
plota_retangulo(xv1,yv1,xv2,yv2);
glFlush();

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glutSwapBuffers();
}
void le_botao_movimento_mouse(int x,int y)
{
xv2 = x;
yv2 = y;
redesenha();
}
void le_botao_mouse(int b,int state,int x,int y)
{
switch(b) {
case GLUT_LEFT_BUTTON:
switch(state) {
case GLUT_DOWN:
xv1 = x;
yv1 = y;
mov = 1;
break;
case GLUT_UP:
mov = 0;
xv2 = x;
yv2 = y;
recalcula_dominio(xv1,yv1,xv2,yv2);
redesenha();
break;
}
break;
}
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
redesenha();
break;
}
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Funcao");
glutDisplayFunc(redesenha);
glutKeyboardFunc(le_tecla);
glutMouseFunc(le_botao_mouse);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glutMotionFunc(le_botao_movimento_mouse);
glutMainLoop();
}
/* * * * * * * * * * * * * * * * */
/* Modulo: plota.cpp (com zoom) */
/* * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
#include "funcao.h"
#define PI 3.1415926535897932384626433832795
float xmin = -1.0;
float ymin = -1.0;
float xmax = 1.0;
float ymax = 1.0;
int pontos = 400;
/* -------------------------------- */
float funcao(float x)
/* -------------------------------- */
{
return(sin(50*PI*x));
}
/* -------------------------------- */
void plota_eixo()
/* -------------------------------- */
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
/* -------------------------------- */
void plota_funcao()
/* -------------------------------- */
{
int i ;
float dx ;
float x,y;
dx = (xmax - xmin)/pontos;
glColor3f(1.0,0.0,0.0);
x = xmin;
for(i=0;i<pontos;i++)
{
y = funcao(x);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();

Robtica Teoria e Prtica

Robtica Teoria e Prtica


x = x + dx;
}
}
/* -------------------------------- */
void plota_retangulo(int x,int y,int xv1,int yv1)
/* -------------------------------- */
{
float t;
float retxmin,retxmax,retymin,retymax;
t = (float)xv1 / 400.0;
retxmin = xmin + t * (xmax-xmin);
t = (float)x / 400.0;
retxmax = xmin + t * (xmax-xmin);
t = (float)y / 400.0;
retymin = ymax - t * (ymax-ymin);
t = (float)yv1 / 400.0;
retymax = ymax - t * (ymax-ymin);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_LOOP);
glVertex2f(retxmin,retymin);
glVertex2f(retxmin,retymax);
glVertex2f(retxmax,retymax);
glVertex2f(retxmax,retymin);
glEnd();
}
/* -------------------------------- */
void entra_dominio()
/* -------------------------------- */
{
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
}
/* --------------------------------------------------------------- */
void recalcula_dominio(float xv_1,float yv_1,float xv_2,float yv_2)
/* --------------------------------------------------------------- */
{
float t;
float xmin1,xmax1;
float ymin1,ymax1;
t = (float)xv_1 / 400;

Robtica Teoria e Prtica

Robtica Teoria e Prtica


xmin1 = xmin + t * (xmax-xmin);
t = (float)xv_2 / 400;
xmax1 = xmin + t * (xmax-xmin);
xmin = xmin1;
xmax = xmax1;
t = (float)yv_2 / 400;
ymin1 = ymax - t * (ymax-ymin);
t = (float)yv_1 / 400;
ymax1 = ymax - t * (ymax-ymin);
ymin = ymin1;
ymax = ymax1;
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
redesenha();
}
CURVAS IMPLCITAS
Introduo
J aprendemos na seo 3 como representar curvas na forma paramtrica. Vamos
discutir agora outro tipo de representao muito utilizada para curvas: a representao
implcita. A equao implcita de uma curva descreve uma relao entre as coordenadas
x e y dos pontos que pertencem a curva. Assim no plano xy a equao implcita de uma
curva tem a forma :
f (x, y) = 0
Como exemplo a representao implcita de uma circunferncia de raio 1 centrado na
origem dado por:
Na forma paramtrica a mesma curva representada por:

Qual das duas representaes mais vantajosa em termos computacionais ? Na verdade


ambas representaes tm vantagens e desvantagens em comparao uma com a outra.
Por exemplo, muito simples determinar se um ponto ( , ) 0 0 P x y dado pertence ou
no a uma curva dada na forma implcita. J na forma paramtrica simples determinar
pontos que pertenam a curva, para que se possa fazer uma representao grfica da
curva (como foi feito na seo anterior). Vamos agora resolver este ltimo problema
para uma curva dada na forma implcita, ou seja, vamos representar graficamente a
curva implcita.
Visualizao de Curvas Implcitas
Vamos implementar um programa que visualize curvas implcitas. Partindo por
exemplo da equao:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Observe que no simples exibir um conjunto de pontos que pertenam a esta curva.
Vamos definir uma funo de duas variveis z = f (x, y) utilizando a equao acima, da
seguinte forma:

Assim a curva inicial desejada, ser a curva de nvel f (x, y) = 0 .


A estratgia para obter esta curva ser a seguinte:
- Vamos estabelecer um domnio [2,2][2,2] no plano como partida (a priori no
sabemos se existem ou no pontos da curva nesse domnio).
- Em seguida discretizamos este domnio, determinando uma matriz de 10x10 pontos
por exemplo.
- A cada trs pontos, definimos um tringulo como na figura abaixo.
- Para cada ponto

calculamos

- Para cada tringulo, observamos os sinais


temos as seguintes situaes:

obtidos em cada vrtice e

- Se V1 * V2 < 0, ento a funo se anula em um ponto entre V1 e V2. Este ponto pode
ser
aproximado linearmente.
- Se V1 * V3 < 0, ento a funo se anula em um ponto entre V1 e V3.
- Se V2 * V3 < 0, ento a funo se anula em um ponto entre V2 e V3.
- Se V1 = 0, ento a funo se anula exatamente sobre o vrtice V1.
- Se V2 = 0, ento a funo se anula exatamente sobre o vrtice V2.
- Se V3 = 0, ento a funo se anula exatamente sobre o vrtice V3.
- Considerando que exatamente duas das condies acima se verificaram
simultaneamente, aproximamos a curva nesse tringulo por um segmento de reta unindo
os dois pontos obtidos.
Programa Curva Implcita
O programa est dividido em dois mdulos principais:
- impl010.cpp: Mantm as rotinas de visualizao do OpenGL
- impl011.cpp: Mantm as rotinas relativas ao desenho da curva.
Temos ainda o mdulo:
- impl011.h: Este mdulo deve ter apenas a declarao das funes do programa
impl011.cpp.
Mdulo impl010.cpp
Este mdulo idntico ao mdulo funcao010.cpp. A nica diferena que as chamadas
so feitas para as novas funes de desenho das curvas.
/* * * * * * * * * * * * * */

Robtica Teoria e Prtica

Robtica Teoria e Prtica


/* Modulo: impl010.cpp */
/* * * * * * * * * * * * * */
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "impl011.h"
extern float xmin,xmax,ymin,ymax;
void display()
{
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
plota_curva_implicita();
glFlush();
glutSwapBuffers();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'D':
case 'd':
entra_dominio();
display();
break;
}
}
void le_botao_mouse(int b,int state,int x, int y)
{
switch(b) {
case GLUT_RIGHT_BUTTON:
switch(state) {
case GLUT_DOWN:
break;
case GLUT_UP:
printf(" x = %d y = %d \n",x,y);
break;
}
break;
}
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutInitWindowPosition(50,50);
glutCreateWindow("Ponto");
glutDisplayFunc(display);
gluOrtho2D(xmin,xmax,ymin,ymax);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glutKeyboardFunc(le_tecla);
glutMouseFunc(le_botao_mouse);
glutMainLoop();
}
Mdulo impl011.cpp
Neste mdulo implementamos o desenho do grfico das curvas implcitas. As funes
plota_eixo e entra_domnio no sofrem alteraes.
/* * * * * * * * * * * * * */
/* Modulo: impl011.cpp */
/* * * * * * * * * * * * * */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
float xmin = -2.0;
float ymin = -2.0;
float xmax = 2.0;
float ymax = 2.0;
float incremento = 0.1;
float funcao(float x,float y)
{
return(sqrt(x*x+y*y)-((x*x-y*y)/(x*x+y*y))+sin(x*y));
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
void triangulo(float x1,float y1,float x2,float y2,float x3,float y3)
{
int i = 0;
float t;
float x[3],y[3];
float s1,s2,s3;
glColor3f(0.0,0.0,1.0);
glBegin(GL_LINE_LOOP);
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glVertex2f(x3,y3);
glEnd();
s1 = funcao(x1,y1);
s2 = funcao(x2,y2);
s3 = funcao(x3,y3);
if ((s1 * s2) < 0) {

Robtica Teoria e Prtica

Robtica Teoria e Prtica


t = -s1/(s2-s1);
x[i] = x1 + t * (x2-x1);
y[i] = y1;
i++;
}
if ((s1 * s3) < 0) {
t = -s1/(s3-s1);
x[i] = x1 ;
y[i] = y1 + t * (y3-y1);
i++;
}
if ((s2 * s3) < 0) {
t = -s2/(s3-s2);
x[i] = x2 + t * (x3-x2);
y[i] = y2 + t * (y3-y2);
i++;
}
if (s1 == 0) {
x[i] = x1;
y[i] = y1;
i++;
}
if (s2 == 0) {
x[i] = x2;
y[i] = y2;
i++;
}
if (s3 == 0) {
x[i] = x3;
y[i] = y3;
39
i++;
}
if (i == 2) {
glLineWidth(2.0);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex2f(x[0],y[0]);
glVertex2f(x[1],y[1]);
glEnd();
glLineWidth(1.0);
}
}
void plota_curva_implicita()
{
float x,y;
glColor3f(1.0,0.0,0.0);
for(x=xmin;x<xmax;x+=incremento)
{
for(y=ymin;y<ymax;y+=incremento)

Robtica Teoria e Prtica

Robtica Teoria e Prtica


{
triangulo(x,y,x+incremento,y,x,y+incremento);
triangulo(x+incremento,y+incremento,x,y+incremento,x+incremento,y);
}
}
}
void entra_dominio()
{
int pontos;
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Divisoes =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Mdulo impl011.h
void plota_eixo();
void plota_curva_implicita();
void entra_dominio();

FRACTAIS
Conjuntos auto semelhantes
Definio: Um subconjunto fechado e limitado
pode ser expresso na forma:

, dito ser auto-semelhante se

Onde
so conjuntos no sobrepostos e cada um deles congruente a
S por mesmo fator de escala s ( 0 < s < 1).
Exemplo 1: Um tringulo pode ser expresso como a unio de quatro tringulos
congruentes e no sobrepostos. Cada um dos tringulos congruente ao original por um
fator

e o tringulo um conjunto auto-semelhante com k = 4.

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Exemplo 2 (Tringulo de Sierpinski) : Este exemplo foi apresentado pelo matemtico


Waclaw Sierpinski (1882-1969). Neste exemplo, partindo de um tringulo, temos a
unio de trs tringulos no sobrepostos (portanto k = 3), cada um dos quais
congruente ao original com um fator de escala
. Em seguida, o processo se repete
para cada um dos trs tringulos, e assim sucessivamente.

Dimenso Hausdorff e o conceito de fractal


Definio: A dimenso Hausdorff de um conjunto auto-semelhante definido por:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

Observe que no exemplo 1, a dimenso Hausdorff, coincide com a dimenso topolgica


usual, uma vez que uma regio em
tem dimenso 2. Porm no exemplo 2,
obtemos uma dimenso no inteira para o tringulo de Sierpinski. Partindo desta
observao, Mandelbrot sugeriu em 1977 a seguinte definio:
Um fractal um subconjunto do espao euclidiano cuja dimenso Hausdorff diferente
da dimenso topolgica.
Exemplos de fractais
Alguns dos principais exemplos que apresentaremos nesta seo foram gerados
utilizando composio de transformaes de rotao e escala seguido de uma possvel
translao. O formato geral da funo dado por:

Tringulo de Sierpinski

Para obter o tringulo de Sierpinski, utilizaremos uma aplicao que a partir de um


tringulo, obtm trs novos tringulos conforme a figura abaixo:

Robtica Teoria e Prtica

Robtica Teoria e Prtica

O programa est dividido em dois mdulos principais:


- frac010.cpp: Mantm as rotinas de visualizao do OpenGL
- frac011.cpp: Mantm as rotinas relativas a implementao do tringulo de Sierpinski.
Temos ainda o mdulo:
- frac011.h: Este mdulo deve ter apenas a declarao das funes do programa
frac011.cpp.
Mdulo frac010.cpp
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include "fract011.h"
extern float xmax,xmin,ymax,ymin;
extern float incremento;
extern int pontos;
int xp[2],yp[2];
int tamx = 400;
int tamy = 400;
int st = -1;
void display()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_funcao(0.0,0.0,1.0,0.0,0.0,1.0,6);
glFlush();
glutSwapBuffers();
}
void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'I':
case 'i':
entra_dominio();
break;
}
}
void botao_mouse(int b,int state,int x, int y)
{

Robtica Teoria e Prtica

Robtica Teoria e Prtica


float t;
float xmin1,xmax1,ymin1,ymax1;
switch(b) {
case GLUT_LEFT_BUTTON:
switch(state) {
case GLUT_DOWN:
xp[0] = x;
yp[0] = y;
st = 0;
printf("down %d %d ",x,y);
break;
case GLUT_UP:
xp[1] = x;
yp[1] = y;
printf("up %d %d ",x,y);
t = (float)xp[0] / tamx;
xmin1 = xmin + t * (xmax-xmin);
t = (float)xp[1] / tamx;
xmax1 = xmin + t * (xmax-xmin);
xmin = xmin1;
xmax = xmax1;
t = (float)yp[1] / tamy;
ymin1 = ymax - t * (ymax-ymin);
t = (float)yp[0] / tamy;
ymax1 = ymax - t * (ymax-ymin);
ymin = ymin1;
ymax = ymax1;
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
display();
break;
}
break;
}
}
void mov_mouse(int x, int y)
{
float t;
float xmin1,xmax1,ymin1,ymax1;
t = (float)xp[0] / tamx;
xmin1 = xmin + t * (xmax-xmin);
t = (float)x / tamx;
xmax1 = xmin + t * (xmax-xmin);
t = (float)y / tamy;
ymin1 = ymax - t * (ymax-ymin);
t = (float)yp[0] / tamy;
ymax1 = ymax - t * (ymax-ymin);
display();
glDrawBuffer(GL_FRONT);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_STRIP);
glVertex2f(xmin1,ymin1);
glVertex2f(xmin1,ymax1);
glVertex2f(xmax1,ymax1);
glVertex2f(xmax1,ymin1);
glVertex2f(xmin1,ymin1);
glEnd();
glDrawBuffer(GL_BACK);
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(tamx,tamy);
glutInitWindowPosition(50,50);
glutCreateWindow("Funcao");
glutDisplayFunc(display);
gluOrtho2D(xmin,xmax,ymin,ymax);
glutKeyboardFunc(le_tecla);
glutMouseFunc(botao_mouse);
glutMotionFunc(mov_mouse);
glutMainLoop();
}
Mdulo frac011.cpp
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
float xmin = -2;
float ymin = -2;
float xmax = 2;
float ymax = 2;
float incremento = 0.01;
int pontos = 1000;
void funcao(float *x,float *y,float e,float f)
{
*x = *x/2 + e;
*y = *y/2 + f;
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glVertex2f(0,ymax);
glEnd();
}
void plota_funcao(float x0,float y0,
float x1,float y1,
float x2,float y2,
int n)
{
int i,j;
float x[3][3],y[3][3];
float e[3] = {0.0, 0.5, 0.0};
float f[3] = {0.0, 0.0, 0.5};
for(i=0;i<3;i++) {
x[i][0] = x0;
y[i][0] = y0;
x[i][1] = x1;
y[i][1] = y1;
x[i][2] = x2;
y[i][2] = y2;
}
for(i=0;i<3;i++)
for (j=0;j<3;j++)
funcao(&(x[j][i]),&(y[j][i]),e[j],f[j]);
if (n == 0) {
for (i=0;i<3;i++) {
glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
glVertex2f(x[i][0],y[i][0]);
glVertex2f(x[i][1],y[i][1]);
glVertex2f(x[i][2],y[i][2]);
glEnd();
}
return;
}
else {
for(i=0;i<3;i++)
plota_funcao(x[i][0],y[i][0],x[i][1],y[i][1],
x[i][2],y[i][2],n-1);
}
}
void entra_dominio()
{
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Mdulo frac011.h
void funcao(float *x,float *y,float e,float f);
void plota_eixo();
void plota_funcao(float x0,float y0,float x1,float y1,
float x2,float y2,int n);
void entra_dominio();
Tringulo de Sierpinski utilizando Monte Carlo
Este mtodo utiliza iteraes randmicas para gerar fractais utilizando o seguinte
processo:
1 - Defina as k transformaes T k que descrevem o objeto a ser gerado.
2- Escolha um ponto arbitrrio

3- Escolha arbitrariamente uma das k transformaes e aplique no ponto escolhido:

4- Prossiga escolhendo aleatoriamente uma das k transformaes e aplique no ultimo


ponto obtido:

O programa proposto est dividido em dois mdulos principais:


- frac020.cpp: Mantm as rotinas de visualizao do OpenGL
- frac021.cpp: Mantm as rotinas relativas a implementao do tringulo de
Sierpinski.
Temos ainda o mdulo:
- frac021.h: Este mdulo deve ter apenas a declarao das funes do programa
frac021.cpp.
Mdulo frac020.cpp
Este mdulo idntico ao mdulo frac010.cpp, com apenas duas linhas de alterao
como descrito abaixo:
.
#include <math.h>
#include "fract021.h"
........

Robtica Teoria e Prtica

Robtica Teoria e Prtica


void display()
{
........
plota_funcao(1.5,-1.8);
........
}
.........
Mdulo frac021.cpp
/* * * * * * * * * * * * * * * * * **/
/* Triangulo Sierpinski Monte Carlo */
/* fract021.cpp */
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <gl\glut.h>
float xmin = -2;
float ymin = -2;
float xmax = 2;
float ymax = 2;
float incremento = 0.01;
int pontos = 1000;
void funcao(float *x,float *y,float e,float f)
{
*x = *x/2 + e;
*y = *y/2 + f;
}
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
void plota_funcao(float x0,float y0)
{
int i,j;
float x[3][4],y[3][4];
float e[3] = {0.0, 0.5, 0.0};
float f[3] = {0.0, 0.0, 0.5};
srand( (unsigned)time( NULL ) );
for(i=0;i<20000;i++) {
j = (int) (3.0 * ((float)rand())/ RAND_MAX);
j = ( j > 2) ? 2 : j;
funcao(&x0,&y0,e[j],f[j]);
glColor3f(1.0,0.0,0.0);

Robtica Teoria e Prtica

Robtica Teoria e Prtica


glBegin(GL_POINTS);
glVertex2f(x0,y0);
glEnd();
}
}
void entra_dominio()
{
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
utilizando Monte Carlo
- Mdulo frac030.cpp

#include "fract031.h"

void display()
{
int i;
float x[4] = {0.0,1.0,1.0,0.0};
float y[4] = {0.0,0.0,1.0,1.0};
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_funcao(x,y,8);
glFlush();
}
....................
Mdulo frac031.cpp
/* * * * * * * * * * * */
/* Fractal Fern */
/* fract031.cpp */
#include <stdio.h>
#include <math.h>
#include <gl\glut.h>
float xmin = -0.2;
float ymin = -0.2;
float xmax = 2;

Robtica Teoria e Prtica

Robtica Teoria e Prtica


float ymax = 2;
float incremento = 0.01;
int pontos = 1000;
void T(float a11,float a12,float a21,float a22,float e,float f,float
*x1,float *y1)
{
float xx;
float yy;
49
xx = a11 * *x1 + a12 * *y1 + e;
yy = a21 * *x1 + a22 * *y1 + f;
*x1 = xx;
*y1 = yy;
}
void plota_funcao(float *x,float *y,int n)
{
int i,j;
float xx[4][4],yy[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
xx[i][j] = x[j];
yy[i][j] = y[j];
}
if (n == 0) {
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(x[0],y[0]);
glVertex2f(x[1],y[1]);
glVertex2f(x[2],y[2]);
glVertex2f(x[3],y[3]);
glEnd();
return;
}
else {
for(i=0;i<4;i++) {
T( 0.20,-0.26, 0.23, 0.22,0.400,
0.045,&(xx[0][i]),&(yy[0][i]));
T( 0.85, 0.04,-0.04, 0.85,0.075,
0.180,&(xx[1][i]),&(yy[1][i]));
T( 0.00, 0.00, 0.00, 0.16,0.500,
0.000,&(xx[2][i]),&(yy[2][i]));
T(-0.15, 0.28, 0.26, 0.24,0.575,0.086,&(xx[3][i]),&(yy[3][i]));
}
plota_funcao(xx[0],yy[0],n-1);
plota_funcao(xx[1],yy[1],n-1);
plota_funcao(xx[2],yy[2],n-1);
plota_funcao(xx[3],yy[3],n-1);
}

Robtica Teoria e Prtica

Robtica Teoria e Prtica


}
void entra_dominio()
{
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}
Curva de Koch
Mdulo frac040.cpp
#include <gl\glut.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include "fract041.h"
extern float xmax,xmin,ymax,ymin;
extern float incremento;
extern int pontos;
int xp[2],yp[2];
int tamx = 400;
int tamy = 400;
int st = -1;
void display()
{
int i;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_eixo();
for(i=0;i<7;i++) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
plota_funcao(-1.0,1.0,1.0,1.0,i);
plota_funcao( 1.0,1.0,0.0,-1.0,i);
plota_funcao(0.0,-1.0,-1.0,1.0,i);
glFlush();
glutSwapBuffers();
getch();
}
glFlush();
glutSwapBuffers();
}

Robtica Teoria e Prtica

Robtica Teoria e Prtica


void le_tecla(unsigned char key, int x, int y)
{
switch(key)
{
case 'I':
case 'i':
entra_dominio();
break;
}
}
void botao_mouse(int b,int state,int x, int y)
{
float t;
float xmin1,xmax1,ymin1,ymax1;
switch(b) {
case GLUT_LEFT_BUTTON:
switch(state) {
case GLUT_DOWN:
xp[0] = x;
yp[0] = y;
st = 0;
printf("down %d %d ",x,y);
break;
case GLUT_UP:
xp[1] = x;
yp[1] = y;
printf("up %d %d ",x,y);
t = (float)xp[0] / tamx;
xmin1 = xmin + t * (xmax-xmin);
t = (float)xp[1] / tamx;
xmax1 = xmin + t * (xmax-xmin);
xmin = xmin1;
xmax = xmax1;
t = (float)yp[1] / tamy;
ymin1 = ymax - t * (ymax-ymin);
t = (float)yp[0] / tamy;
ymax1 = ymax - t * (ymax-ymin);
ymin = ymin1;
ymax = ymax1;
glLoadIdentity();
gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
display();
break;
}
break;
}
}
void mov_mouse(int x, int y)
{

Robtica Teoria e Prtica

Robtica Teoria e Prtica


float t;
float xmin1,xmax1,ymin1,ymax1;
t = (float)xp[0] / tamx;
xmin1 = xmin + t * (xmax-xmin);
t = (float)x / tamx;
xmax1 = xmin + t * (xmax-xmin);
t = (float)y / tamy;
ymin1 = ymax - t * (ymax-ymin);
t = (float)yp[0] / tamy;
ymax1 = ymax - t * (ymax-ymin);
display();
glDrawBuffer(GL_FRONT);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_STRIP);
glVertex2f(xmin1,ymin1);
glVertex2f(xmin1,ymax1);
glVertex2f(xmax1,ymax1);
glVertex2f(xmax1,ymin1);
glVertex2f(xmin1,ymin1);
glEnd();
glDrawBuffer(GL_BACK);
glFlush();
}
void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(tamx,tamy);
glutInitWindowPosition(50,50);
glutCreateWindow("Funcao");
glutDisplayFunc(display);
gluOrtho2D(xmin,xmax,ymin,ymax);
glutKeyboardFunc(le_tecla);
glutMouseFunc(botao_mouse);
glutMotionFunc(mov_mouse);
glutMainLoop();
}
Mdulo frac041.cpp
/* * * * * * * * * * * */
/* Fractal Curva Koch */
/* fract041.cpp */
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <gl\glut.h>
float xmin = -2;
float ymin = -2;
float xmax = 2;
float ymax = 2;

Robtica Teoria e Prtica

Robtica Teoria e Prtica


float incremento = 0.01;
int pontos = 1000;
void plota_eixo()
{
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(xmin,0);
glVertex2f(xmax,0);
glVertex2f(0,ymin);
glVertex2f(0,ymax);
glEnd();
}
void plota_funcao(float x0,float y0,float x1,float y1,int n)
{
int i,j;
float v[2];
float xx0,yy0,xx1,yy1;
xx0 = x0+1.0/3*(x1 - x0);
yy0 = y0+1.0/3*(y1 - y0);
xx1 = x0+2.0/3*(x1 - x0);
yy1 = y0+2.0/3*(y1 - y0);
if (n == 0) {
glColor3f(1.0,1.0,0.0);
glBegin(GL_LINES);
glVertex2f(x0,y0);
glVertex2f(x1,y1);
glEnd();
}
else {
v[0]=(y0-y1)/(2*sqrt(3.0));
v[1]=(x1-x0)/(2*sqrt(3.0));
plota_funcao(x0,y0,xx0,yy0,n-1);
plota_funcao(xx0,yy0,(x0+x1)/2.0+v[0],(y0+y1)/2.0+v[1],n-1);
plota_funcao((x0+x1)/2.0+v[0],(y0+y1)/2.0+v[1],xx1,yy1,n-1);
plota_funcao(xx1,yy1,x1,y1,n-1);
}
}
void entra_dominio()
{
printf("xmin = ");
scanf("%f",&xmin);
printf("\nymin = ");
scanf("%f",&ymin);
printf("\nxmax = ");
scanf("%f",&xmax);
printf("\nymax = ");
scanf("%f",&ymax);
printf("\n Total de pontos =");
scanf("%d",&pontos);
glLoadIdentity();

Robtica Teoria e Prtica

Robtica Teoria e Prtica


gluOrtho2D(xmin,xmax,ymin,ymax);
incremento = fabs(xmax-xmin)/pontos;
}

Bibliografia:
Estrato de aulas do curso de Mecatrnica da Escola Politcnica de Minas Gerais
POLIMIG Matria Robtica Industrial Prof. Orlando Laoboissier
Mecatrnica uma abordagem Multidisciplinar: W. Bolton 4 Edio
Princpios de Mecatrnica: Joo Maurcio Rosrio
Apostila Robtica Universidade Braz Cubas: Carrara, Valdemir
Technology in Action Intermediate Robot Building Segund Edition: David Cook
Sites:
www.robotrom.com
www.nasa.gov
www.bionix.com
www.rogeriodumba.com.br

Robtica Teoria e Prtica

You might also like