<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ROS &#8211; Linux Force Security</title>
	<atom:link href="https://linuxforce.com.br/blog/category/ros/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxforce.com.br</link>
	<description>Aprenda Linux do básico ao avançado com instrutores especialistas. Cursos ao vivo de Linux, Segurança da Informação, Devops e preparação para a certificação LPI.</description>
	<lastBuildDate>Sat, 03 Apr 2021 19:44:34 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://linuxforce.com.br/wp-content/uploads/2025/02/favicon-linux-force-security.png</url>
	<title>ROS &#8211; Linux Force Security</title>
	<link>https://linuxforce.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Movimento com ROS</title>
		<link>https://linuxforce.com.br/blog/ros/movimento-com-ros/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Sat, 03 Apr 2021 19:44:34 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4067</guid>

					<description><![CDATA[Neste post usaremos a ferramenta turtlesim para aplicar comandos de movimentos. Essa ferramenta permite compreender através de simulação em uma tartaruga virtual que equivale a um robô. Faremos isso através de tópicos e mensagens (vistos anteriormente). Após iniciar o turtlesim através de &#160; $ rosrun turtlesim turtlesim_node &#160; é possível ver os tópicos e mensagens [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Neste post usaremos a ferramenta turtlesim para aplicar comandos de movimentos. Essa ferramenta permite compreender através de simulação em uma tartaruga virtual que equivale a um robô. Faremos isso através de tópicos e mensagens (vistos anteriormente).</p>
<p>Após iniciar o turtlesim através de</p>
<p>&nbsp;</p>
<p>$ rosrun turtlesim turtlesim_node</p>
<p>&nbsp;</p>
<p>é possível ver os tópicos e mensagens disponíveis pro desenvolvimento da aplicação usando</p>
<p>&nbsp;</p>
<p>$ rostopic list</p>
<p>&nbsp;</p>
<p>nota-se que há 3 novos topics disponíveis e /turtle1/cmd_vel é o responsável pelo movimento do robô.</p>
<p>Para obter informações sobre esse tópico faça</p>
<p>&nbsp;</p>
<p>$ rostopic info /turtle1/cmd_vel</p>
<p>&nbsp;</p>
<p>Nota-se que o tipo de mensagem usado nesse tópico é geometry_msgs/Twist e será usado como import na aplicação.</p>
<p>Para obter os parâmetros da mensagem faça</p>
<p>&nbsp;</p>
<p>$ rosmsg show geometry_msgs/Twist</p>
<p>&nbsp;</p>
<p>e perceba que a mensagem é composta por componentes x, y e z linear e angular. Os movimentos dessa aplicação serão apenas planos, nesse caso, o componente z linear será 0(zero), assim como os componentes x e y angular.</p>
<p>O tópico pose é o responsável por informações sobre a localização atual do robô no plano e também será usado.</p>
<p>Da mesma forma é possível obter os parâmetros da sua mensagem que referem-se ao posicionamento x e y no plano e também a orientação theta. As velocidades angular e linear serão as componentes linear.x e angular.z da mensagem Twist.</p>
<p>O primeiro passo da aplicação aqui desenvolvida é fazer um movimento em linha reta. No git clonado o código encontra-se com nome de turtlesim_cleaner.py e é desenvolvido em python.</p>
<p>Utilizando a ferramenta turtlesim, vamos assumir que o movimento ocorre de um ponto inicial (x0,y0) até um ponto final (x,y)</p>
<p>&nbsp;</p>
<p><span style="color: #ff6600;">########################################################</span><br />
#!/usr/bin/env python</p>
<p>import rospy<br />
from geometry_msgs.msg import Twist<br />
from turtlesim.msg import Pose<br />
import math<br />
import time<br />
from std_srvs.srv import Empty</p>
<p>&nbsp;</p>
<p>def move(velocity_publisher, speed, distance, is_forward):<br />
#declare a Twist message to send velocity commands<br />
velocity_message = Twist()</p>
<p>global x, y<br />
x0 = x<br />
y0 = y</p>
<p>if (is_forward):<br />
velocity_message.linear.x =abs(speed)<br />
else:<br />
velocity_message.linear.x =-abs(speed)</p>
<p>distance_moved = 0.0<br />
loop_rate = rospy.Rate(10) # we publish the velocity at 10 Hz (10 times a second)</p>
<p>while True :<br />
rospy.loginfo(&#8220;Turtlesim moves forwards&#8221;)<br />
velocity_publisher.publish(velocity_message)</p>
<p>loop_rate.sleep()<br />
t1 = rospy.Time.now().to_sec()<br />
#rospy.Duration(1.0)</p>
<p>distance_moved = abs(0.5 * math.sqrt(((x-x0) ** 2) + ((y-y0) ** 2)))<br />
print distance_moved<br />
if not (distance_moved&lt;distance):<br />
rospy.loginfo(&#8220;reached&#8221;)<br />
break</p>
<p>#finally, stop the robot when the distance is moved<br />
velocity_message.linear.x =0<br />
velocity_publisher.publish(velocity_message)</p>
<p>def poseCallback(pose_message):<br />
global x<br />
global y, yaw<br />
x= pose_message.x<br />
y= pose_message.y<br />
yaw = pose_message.theta</p>
<p>if __name__ == &#8216;__main__&#8217;:<br />
try:</p>
<p>rospy.init_node(&#8216;turtlesim_motion_pose&#8217;, anonymous=True)</p>
<p>#declare velocity publisher<br />
cmd_vel_topic=&#8217;/turtle1/cmd_vel&#8217;<br />
velocity_publisher = rospy.Publisher(cmd_vel_topic, Twist, queue_size=10)</p>
<p>position_topic = &#8220;/turtle1/pose&#8221;<br />
pose_subscriber = rospy.Subscriber(position_topic, Pose, poseCallback)<br />
time.sleep(2)</p>
<p>move(velocity_publisher, 1.0, 4.0, True)</p>
<p>except rospy.ROSInterruptException:<br />
rospy.loginfo(&#8220;node terminated.&#8221;)</p>
<p><span style="color: #ff6600;">##############################################################################</span></p>
<p>&nbsp;</p>
<p>A função move() tem como parâmetros velocity_publisher que será usada para publicar cada nova mensagem twist, a velocidade, a distância do movimento e a direção.</p>
<p>O laço if(is_forward) define o sentido do movimento no eixo horizontal, se negativo o movimento é realizado no sentido contrário.</p>
<p>velocity_message = Twist() define a variável com todos os parâmetros da mensagem.</p>
<p>No loop while True a todo momento é publicado a velocity_message que são as coordenadas x e y para o movimento, distance_moved é o quanto o robô se moveu e quando este valor ultrapassa o valor distance dado como parâmetro o movimento é interrompido. Em seguida a posição 0 é passada para que o robô pare.</p>
<p>A função poseCallback será usada como subscriber sendo chamada a cada nova mensagem recebida armazenando nas variáveis o estado atual do robô.</p>
<p>Nas linhas finais está a chamada da função move com os parâmetros desejados, nesse caso o robô se moverá com velocidade 1 m/s por uma distância de 4 metros no sentido positivo.</p>
<p>Com a aplicação turtlesim aberta execute em outro terminal o comando do seu código, nesse caso</p>
<p>$ rosrun ros_essentials_cpp turtlesim_cleaner.py</p>
<p>Será possível observar na janela do turtlesim o movimento.</p>
<p>Vamos agora definir a função de rotação da tartaruga, essa função está contida no mesmo código anterior basta acrescentá-la nos locais adequados.</p>
<p>&nbsp;</p>
<p><span style="color: #ff6600;">#######################################################################</span></p>
<p>def rotate (velocity_pusblisher, angular_speed_degree, relative_angle_degree, clockwise):</p>
<p>velocity_message = Twist()</p>
<p>angular_speed=math.radians(abs(angular_speed_degree))</p>
<p>if (clockwise):<br />
velocity_message.angular.z =-abs(angular_speed)<br />
else:<br />
velocity_message.angular.z =abs(angular_speed)</p>
<p>loop_rate = rospy.Rate(10) # we publish the velocity at 10 Hz (10 times a second)<br />
t0 = rospy.Time.now().to_sec()</p>
<p>while True :<br />
rospy.loginfo(&#8220;Turtlesim rotates&#8221;)<br />
velocity_publisher.publish(velocity_message)</p>
<p>t1 = rospy.Time.now().to_sec()<br />
current_angle_degree = (t1-t0)*angular_speed_degree<br />
loop_rate.sleep()</p>
<p>if (current_angle_degree&gt;relative_angle_degree):<br />
rospy.loginfo(&#8220;reached&#8221;)<br />
break</p>
<p>#finally, stop the robot when the distance is moved<br />
velocity_message.angular.z =0<br />
velocity_publisher.publish(velocity_message)</p>
<p><span style="color: #ff6600;">##########################################################################</span></p>
<p>&nbsp;</p>
<p>Do mesmo modo que a função move(), a função rotate() recebe parâmetros de velocidade, posição e sentido.</p>
<p>Os ângulos são recebidos em graus então usamos uma conversão para radianos e o salvamos numa variável para melhor manipulação.</p>
<p>Aqui o ângulo de rotação é calculado a partir do tempo, diferente de move() que usava a distância absoluta.</p>
<p>Por fim a função rotate() pode ser aplicada no final do código juntamente com a função move, basta adicionar por exemplo a linha rotate(velocity_publisher, 30, 90, True) após move, com isso após realizar o movimento linear definido ele irá girar no sentido horário a 30 graus/segundo durante 90 graus.</p>
<p>Você pode agora adicionar quantos comandos move() e rotate() forem necessários para o movimento desejado, existem outras funções de movimentos tal como go_to_goal() e spiralClean() contidas no código original que podem ser estudadas mas aqui não serão abordadas.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS Services</title>
		<link>https://linuxforce.com.br/blog/ros/ros-services/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Thu, 01 Apr 2021 00:13:22 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4061</guid>

					<description><![CDATA[Um Service diferente de Topics é uma comunicação bilateral. Nele temos um Client que envia uma solicitação e um Server que envia de volta a resposta. Essa comunicação é feita de forma síncrona, ou seja, quando um Client envia uma solicitação ele espera até que haja uma resposta do Server. Um bom exemplo de ROS [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Um Service diferente de Topics é uma comunicação bilateral. Nele temos um Client que envia uma solicitação e um Server que envia de volta a resposta. Essa comunicação é feita de forma síncrona, ou seja, quando um Client envia uma solicitação ele espera até que haja uma resposta do Server.</p>
<p>Um bom exemplo de ROS Service é dado através da interface turtlesim, para instalá-la use o comando adequado para sua versão ROS, nesse caso noetic.</p>
<p>$ sudo apt-get install ros-noetic-turtlesim</p>
<p>$ sudo rosdep init</p>
<p>$ rosdep update</p>
<p>Para iniciá-lo comece pela inicialização do ROS e em um novo terminal abra a interface</p>
<p>$ roscore</p>
<p>$ rosrun turtlesim turtlesim_node</p>
<p>Uma interface como essa deve aparecer</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-4062" src="https://www.linuxforce.com.br/wp-content/uploads/2021/03/turtlesim-460x486.png" alt="" width="284" height="300" /></p>
<p>Em um terminal, é possível ver todos os services atualmente ativos com</p>
<p>$ rosservice list</p>
<p>Será visto nessa lista um service de nome /spawn cujo detalhes pode ser expandido com $ rosservice info /spawn</p>
<p>O seu tipo de mensagem é turtlesim/Spawn e seus argumentos x, y, theta e name são a localização e direção para o aparecimento de uma nova tartaruga na tela e o nome dado a ela.</p>
<p>Com $ rossrv info turtlesim/spawn é possível ver informações detalhadas sobre o tipo de mensagem do serviço</p>
<p>Podemos chamar esse serviço com o comando</p>
<p>$ rosservice call /spawn 7 7 0 t2</p>
<p>Nesse caso uma nova tartaruga deve aparecer na posição (x,y) = (7,7) rotacionada de 0 graus com nome t2 cuja informação é retornada no terminal como resposta.</p>
<p>&nbsp;</p>
<p>Também é possível criar seu próprio serviço, aqui criaremos uma aplicação Client/Server onde o cliente envia 2 inteiros ao servidor que retorna a soma.</p>
<p>Em seu workspace, no diretório do pacote onde realiza suas aplicações, no nosso caso ros_essentials_cpp, deverá ser criado uma pasta de nome srv, nessa pasta criaremos um arquivo de nome AddTwoInts.srv que deverá ser preenchido com as seguintes linhas:<br />
_____________________</p>
<p>int64<br />
int b<br />
&#8212;<br />
int64 sum</p>
<p>_____________________</p>
<p>Os passos seguintes são reproduzidos igualmente em ROS messages e podem ser pulados com exceção do add_service_files caso já os tenha realizado.</p>
<p>Para que o serviço possa ser usado através de mensagens é necessário atualizar as dependências em CMakeLists.txt adicionando a linha message_generation no campo seguinte:</p>
<p><span style="color: #ff6600;">########################################</span></p>
<p>find_package(catkin REQUIRED COMPONENTS<br />
roscpp<br />
rospy<br />
std_msgs<br />
message_generation<br />
)</p>
<p><span style="color: #ff6600;">#######################################</span></p>
<p>Ainda em CMakeLists.txt adicionar o nome do arquivo criado no campo seguinte:</p>
<p><span style="color: #ff6600;">####################</span><br />
add_service_files(<br />
FILES<br />
AddTwoInts.srv<br />
)</p>
<p><span style="color: #ff6600;">####################</span></p>
<p>Agora em package.xml adicionar nos locais adequados (de acordo com a sintaxe) as linhas :</p>
<p>&lt;build_depend&gt;message_generation&lt;/build_depend&gt;</p>
<p>e</p>
<p>&lt;exec_depend&gt;message_runtime&lt;/exec_depend&gt;</p>
<p>Para finalizar é necessário no diretório do workspace realizar um catkin_make. E agora novos arquivos podem ser observados no diretório /catkin_ws/devel/include/ros_essentials_cpp</p>
<p>Agora, o código seguinte refere-se ao Server add_server.py criado em python que retorna a resposta</p>
<p><span style="color: #ff6600;">#################################################################</span><br />
1      #!/usr/bin/env python<br />
2<br />
3      from ros_essentials_cpp.srv import AddTwoInts<br />
4      from ros_essentials_cpp.srv import AddTwoIntsRequest<br />
5      from ros_essentials_cpp.srv import AddTwoIntsResponse<br />
6<br />
7      import rospy<br />
8<br />
9      def handle_add_two_ints(req):<br />
10       print &#8220;Returning [%s + %s = %s]&#8221;%(req.a, req.b, (req.a + req.b))<br />
11       return AddTwoIntsResponse(req.a + req.b)<br />
12<br />
13    def add_two_ints_server():<br />
14       rospy.init_node(&#8216;add_two_ints_server&#8217;)<br />
15       s = rospy.Service(&#8216;add_two_ints&#8217;, AddTwoInts, handle_add_two_ints)<br />
16       print (&#8220;Ready to add two ints.&#8221;)<br />
17       rospy.spin()<br />
18<br />
19    if __name__ == &#8220;__main__&#8221;:<br />
20       add_two_ints_server()</p>
<p><span style="color: #ff6600;">###########################################################</span></p>
<p>O primeiro passo é importar os arquivos de service, request e response criados. O serviço é criado na linha 15 e tem como parâmetros o nome do serviço criado, o tipo de serviço e a função que será executada sempre que houver uma nova solicitação. Essa função (linha 9) é a responsável por retornar a soma dos inteiros passados.</p>
<p>A seguir o código do Client add_client.py que faz a solicitação</p>
<p><span style="color: #ff6600;">########################################################</span><br />
1      #!/usr/bin/env python<br />
2<br />
3      import sys<br />
4      import rospy<br />
5      from ros_essentials_cpp.srv import AddTwoInts<br />
6      from ros_essentials_cpp.srv import AddTwoIntsRequest<br />
7      from ros_essentials_cpp.srv import AddTwoIntsResponse<br />
8<br />
9      def add_two_ints_client(x, y):<br />
10       rospy.wait_for_service(&#8216;add_two_ints&#8217;)<br />
11       try:<br />
12          add_two_ints = rospy.ServiceProxy(&#8216;add_two_ints&#8217;, AddTwoInts)<br />
13          resp1 = add_two_ints(x, y)<br />
14          return resp1.sum<br />
15       except rospy.ServiceException, e:<br />
16          print &#8220;Service call failed: %s&#8221;%e<br />
17<br />
18    def usage():<br />
19       return &#8220;%s [x y]&#8221;%sys.argv[0]<br />
20<br />
21    if __name__ == &#8220;__main__&#8221;:<br />
22       if len(sys.argv) == 3:<br />
23          x = int(sys.argv[1])<br />
24          y = int(sys.argv[2])<br />
25       else:<br />
26          print usage()<br />
27          sys.exit(1)<br />
28       print &#8220;Requesting %s+%s&#8221;%(x, y)<br />
29       s = add_two_ints_client(x, y)<br />
30       print &#8220;%s + %s = %s&#8221;%(x, y, s)</p>
<p><span style="color: #ff6600;">#########################################################</span></p>
<p>Para iniciar é necessário esperar o serviço para começar (linha 10) caso contrário não será possível rodar a aplicação. Na linha 12 é criado o service proxy que é responsável por enviar informação ao server e tem como parâmetros o nome do serviço definido anteriormente e o tipo.</p>
<p>Agora em 2 novos terminais é possível conferir a aplicação, no primeiro fazer</p>
<p>$ rosrun ros_essentials_cpp add_server.py</p>
<p>e no segundo</p>
<p>$ rosrun ros_essentials_cpp add_client.py 1 2</p>
<p>Nota-se que os inteiros que serão somados foram passados no comando do cliente e a resposta retornada deverá ser 1 + 2 = 3</p>
<p>Dessa forma está feito um novo ROS Service.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS Messages</title>
		<link>https://linuxforce.com.br/blog/ros/ros-messages/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Tue, 30 Mar 2021 22:29:54 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4054</guid>

					<description><![CDATA[No artigo sobre topics falamos sobre como criar a comunicação Publisher Subscriber em python. Fizemos isso utilizando uma mensagem padrão do tipo String contida no pacote. ROS permite que você crie sua própria mensagem no seu próprio tipo e a transmita entre nós. Todo nome de mensagem é composto por duas partes package_name/message_type. Em nossa [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>No artigo sobre topics falamos sobre como criar a comunicação Publisher Subscriber em python.<br />
Fizemos isso utilizando uma mensagem padrão do tipo String contida no pacote.</p>
<p>ROS permite que você crie sua própria mensagem no seu próprio tipo e a transmita entre nós.</p>
<p>Todo nome de mensagem é composto por duas partes package_name/message_type.<br />
Em nossa aplicação Talker Listener utilizamos std_msg/String.</p>
<p>Aqui criaremos a mensagem de sensores como exemplo, todo sensor terá um id, um nome, a temperatura e a umidade.</p>
<p>Em seu workspace, no diretório do pacote onde realiza suas aplicações, no nosso caso ros_essentials_cpp, deverá ser criado uma pasta de nome msg, nessa pasta criaremos um arquivo de nome Sensor.msg que deverá ser preenchido com as seguintes linhas:</p>
<p>_____________________</p>
<p>int32 id<br />
string name<br />
float32 temperature<br />
float32 humidity</p>
<p>_____________________</p>
<p>Para que a mensagem possa ser usada é necessário atualizar as dependências em CMakeLists.txt adicionando a linha message_generation no campo seguinte:</p>
<p><span style="color: #ff6600;">########################################</span></p>
<p>find_package(catkin REQUIRED COMPONENTS<br />
roscpp<br />
rospy<br />
std_msgs<br />
message_generation<br />
)</p>
<p><span style="color: #ff6600;">#######################################</span></p>
<p>Ainda em CMakeLists.txt adicionar o nome do arquivo criado no campo seguinte:</p>
<p><span style="color: #ff6600;">####################</span><br />
add_message_files(<br />
FILES<br />
Sensor.msg<br />
)</p>
<p><span style="color: #ff6600;">####################</span></p>
<p>Agora em package.xml adicionar nos locais adequados (de acordo com a sintaxe) as linhas :</p>
<p>&lt;build_depend&gt;message_generation&lt;/build_depend&gt;</p>
<p>e</p>
<p>&lt;exec_depend&gt;message_runtime&lt;/exec_depend&gt;</p>
<p>&nbsp;</p>
<p>Para finalizar é necessário no diretório do workspace realizar um catkin_make.</p>
<p>E agora temos um novo tipo de mensagem que pode ser usado na comunicação entre nós através de topics.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS topics</title>
		<link>https://linuxforce.com.br/blog/ros/ros-topics/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Mon, 29 Mar 2021 20:28:39 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4050</guid>

					<description><![CDATA[No mecanismo Publisher-Subscriber há o nó que envia dados (Publisher) e o nó que recebe dados (Subscriber). O caminho de envio desses dados é chamado de Topics e pode ser do tipo 1:1, 1:N, N:1 e N:N dependendo do propósito. Este tutorial foi retirado do curso ROS for Beginners: Basics, Motion, and OpenCV disponível no [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>No mecanismo Publisher-Subscriber há o nó que envia dados (Publisher) e o nó que recebe dados (Subscriber).<br />
O caminho de envio desses dados é chamado de Topics e pode ser do tipo 1:1, 1:N, N:1 e N:N dependendo do propósito.</p>
<p>Este tutorial foi retirado do curso ROS for Beginners: Basics, Motion, and OpenCV disponível no site da Udemy e é ministrado por Anis Koubaa.</p>
<p>Para reproduzir este artigo é necessário implementar os códigos seguintes disponíveis em seu git.<br />
Para isto basta clonar seu repositório no workspace de sua máquina:</p>
<p>$ cd catkin_ws</p>
<p>$ git clone https://github.com/aniskoubaa/ros_essentials_cpp.git</p>
<p>Exemplo Hello World (Talker Listener)</p>
<p>O Topic aqui é chamado de chatter e possui uma mensagem do tipo String</p>
<p>Código talker.py<br />
<span style="color: #ff6600;">##########################################</span><br />
1     #!/usr/bin/env python<br />
2     # license removed for brevity<br />
3     import rospy<br />
4     from std_msgs.msg import String<br />
5<br />
6     def talker():<br />
7        pub = rospy.Publisher(&#8216;chatter&#8217;, String, queue_size=10)<br />
8        rospy.init_node(&#8216;talker&#8217;, anonymous=True)<br />
9        rate = rospy.Rate(1) # 1hz<br />
10      i=0<br />
11      while not rospy.is_shutdown():<br />
12         hello_str = &#8220;hello world %s&#8221; % i<br />
13         rospy.loginfo(hello_str)<br />
14         pub.publish(hello_str)<br />
15         rate.sleep()<br />
16         i=i+1<br />
17<br />
18    if __name__ == &#8216;__main__&#8217;:<br />
19       try:<br />
20          talker()<br />
21       except rospy.ROSInterruptException:<br />
22          pass<br />
<span style="color: #ff6600;">##############################################</span></p>
<p>&nbsp;</p>
<p>A linha 7 é responsável pela criação do Publisher e os parâmetros fornecidos é o nome do tópico, o tipo de mensagem e quantas mensagens será armazenada na fila simultaneamente até serem descartadas.<br />
A linha 8 inicia o nó e os parâmetros são o nome do nó enquanto anonymous=TRUE garante que cada nó criado seja único através de um ID<br />
A linha 10 especifica a frequencia com que é publicado, ou seja, quantas mensagens por segundo<br />
O loop da linha 11 funciona enquanto estiver ligado, neste caso cria a mensagem na linha 12 e o publica na linha 14.</p>
<p>Após clonar o repósitório do Anis Koubaa é necessário iniciar o ROS com o comando</p>
<p>$ roscore</p>
<p>&nbsp;</p>
<p>Em dois novos terminais abrir o workspace e fazer</p>
<p>$ rosrun ros_essentials_cpp talker.py<br />
e<br />
$ rosrun ros_essentials_cpp listener.py</p>
<p>&nbsp;</p>
<p>Código listener.py<br />
<span style="color: #ff6600;">##################################################</span></p>
<p>1     #!/usr/bin/env python<br />
2     import rospy<br />
3     from std_msgs.msg import String<br />
4<br />
5     def callback(message):<br />
6        print(&#8221; I heard &#8220;, message.data)<br />
7<br />
8     def listener():<br />
9        rospy.init_node(&#8216;listener&#8217;, anonymous=True)<br />
10<br />
11      rospy.Subscriber(&#8220;chatter&#8221;, String, callback)<br />
12<br />
13      rospy.spin()<br />
14<br />
15   if __name__ == &#8216;__main__&#8217;:<br />
16      listener()<br />
<span style="color: #ff6600;">######################################################</span></p>
<p>&nbsp;</p>
<p>A linha 9 inicia o nó da mesma forma que o Publisher<br />
A linha 11 cria o Subscriber onde deve ser fornecido o mesmo nome dado ao Publisher, o mesmo tipo de mensagem e o último parâmetro é a função callback que é chamada toda vez que uma nova mensagem é recebida.</p>
<p>&nbsp;</p>
<p>Ao executar os dois códigos em sua máquina você é capaz de ver que a comunicação acontece de forma que o que é enviado em Talker é recebido pelo Listener</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Moveo com ROS</title>
		<link>https://linuxforce.com.br/blog/ros/moveo-com-ros/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Thu, 18 Mar 2021 22:02:15 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4041</guid>

					<description><![CDATA[O Moveo é um projeto de código aberto para um braço robótico 5DOF imprimível em 3D. Neste post está descrito como proceder com a instalação de todos os recursos necessários para a manipulação do braço através de um simulador. Os arquivos necessários para confecção do braço encontram-se neste link. No terminal, faça: $ sudo apt [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>O Moveo é um projeto de código aberto para um braço robótico 5DOF imprimível em 3D.</p>
<p>Neste post está descrito como proceder com a instalação de todos os recursos necessários para a manipulação do braço através de um simulador.</p>
<p>Os arquivos necessários para confecção do braço encontram-se <a href="https://www.thingiverse.com/thing:1693444" rel="nofollow noopener">neste link.</a></p>
<p>No terminal, faça:</p>
<p>$ sudo apt update</p>
<p>$ sudo apt-get install ros-noetic-moveit*</p>
<p>&nbsp;</p>
<p>Em seguida deve-se clonar o repositório do projeto</p>
<p>$ cd /catkin_ws/src/</p>
<p>$ git clone https://github.com/jesseweisberg/moveo_ros.git</p>
<p>$ cd /catkin_ws/</p>
<p>$ catkin_make</p>
<p>&nbsp;</p>
<p>No código &#8216;moveit_convert.cpp&#8217; contido em &#8216;<span class="js-path-segment d-inline-block wb-break-all">moveo_moveit</span><span class="mx-1">/</span>src<span class="mx-1">/&#8217;</span> substitua o vetor stepsPerRevolution pelos valores de passos/revolução de cada um dos motores utilizados na construção. Estes valores podem ser obtidos através de observação utilizando o código &#8216;MultiStepperTest.ino&#8217; contido na IDE do Arduino.</p>
<p><strong>Nota: </strong>Para cada nova alteração no vetor acima mencionado um novo catkin_make deve ser realizado com os dois últimos comandos acima mencionados.</p>
<p>&nbsp;</p>
<p>No Arduino,  transferir o código &#8216;moveo_moveit_arduino.ino&#8217; contido em &#8216;<span class="mx-1">/</span><span class="js-path-segment d-inline-block wb-break-all">moveo_moveit</span><span class="mx-1">/</span>moveo_moveit_arduino<span class="mx-1">/&#8217; </span>para a placa.</p>
<p>Abrir no terminal a pasta de bibliotecas do arduino e instalar as bibliotecas necessárias:</p>
<p>$ rosrun rosserial_arduino make_libraries.py . (não ignorar o ponto no final)</p>
<p>&nbsp;</p>
<p>Agora resta abrir a simulação e estabelecer a comunicação entre a máquina e o robô.</p>
<p>Abra com:</p>
<p>$ roslaunch moveo_moveit_config demo.launch</p>
<p>&nbsp;</p>
<p>Estabeleça a comunicação em novos terminais:</p>
<p>$ rosrun rosserial_python serial_node.py</p>
<p>$ rosrun moveo_moveit moveit_convert</p>
<p>&nbsp;</p>
<p>Pronto, com isto os movimentos realizados no simulador devem ser transferidos para os motores.</p>
<p>&nbsp;</p>
<p>Se preferir os movimentos podem ser realizados através do terminal com o comando</p>
<p>$ rostopic pub joint_steps moveo_moveit/ArmJointState &lt;Joint1 Joint2 Joint3 Joint4 Joint5 0&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS workspace</title>
		<link>https://linuxforce.com.br/blog/ros/ros-workspace/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Wed, 17 Mar 2021 21:01:07 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4035</guid>

					<description><![CDATA[Ao longo dos tutoriais aqui ensinados, você verá referências a catkin. Catkin é a maneira recomendada de organizar seu código, ele usa convenções padrão do CMake e fornece flexibilidade, especialmente para pessoas que desejam integrar bases de código externas ou que desejam lançar seu software. &#160; Se você acabou de instalar o ROS do apt no Ubuntu, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ao longo dos tutoriais aqui ensinados, você verá referências a catkin. Catkin é a maneira recomendada de organizar seu código, ele usa convenções padrão do CMake e fornece flexibilidade, especialmente para pessoas que desejam integrar bases de código externas ou que desejam lançar seu software.</p>
<p>&nbsp;</p>
<p>Se você acabou de instalar o ROS do apt no Ubuntu, terá os arquivos setup.*sh em &#8216;/opt/ros/noetic/&#8217;, e poderá obtê-los da seguinte forma:</p>
<p>$ source /opt/ros/noetic/setup.bash</p>
<p>obs: Se a sua versão ROS instalada não for noetic basta substituir no comando acima</p>
<p>Você precisará executar este comando em cada novo shell que abrir para ter acesso aos comandos ROS, a menos que adicione a linha acima ao seu .bashrc.</p>
<p>&nbsp;</p>
<ul>
<li>Workspace</li>
</ul>
<p>O workspace é o diretório no qual trabalharemos o ROS. Este diretório simplifica o processo de construção e instalação dos pacotes necessários.</p>
<p>No terminal faça:</p>
<p>$ mkdir -p ~/catkin_ws/src</p>
<p><span id="ROS.2FTutorials.2Fcatkin.2FCreateWorkspace.line-2-1" class="anchor"></span>$ cd ~/catkin_ws/</p>
<p><span id="ROS.2FTutorials.2Fcatkin.2FCreateWorkspace.line-3-1" class="anchor"></span>$ catkin_make</p>
<p>&nbsp;</p>
<p>O comando catkin_make é uma ferramenta conveniente para trabalhar com espaços de trabalho catkin . Executando-o pela primeira vez em seu espaço de trabalho, ele criará um link CMakeLists.txt em sua pasta &#8216;src&#8217;. Além disso, se você olhar em seu diretório atual, deverá agora ter uma pasta &#8216;build&#8217; e &#8216;devel&#8217;. Dentro da pasta &#8216;devel&#8217;, você pode ver que agora existem vários arquivos setup.*sh. Antes de continuar aponte seu novo arquivo setup.*sh com:</p>
<p>$ source devel/setup.bash</p>
<p>Para que não seja necessário o comando acima toda vez que você reiniciar a máquina, adicione-o ao final do arquivo bashrc, basta fazer</p>
<p>$ cd</p>
<p>$ gedit .bashrc</p>
<p>E no fim do documento acrescente a linha &#8220;source ~/catkin_ws/devel/setup.bash&#8221; sem as aspas.</p>
<p>&nbsp;</p>
<p>Para certificar-se de que sua área de trabalho seja devidamente sobreposta pelo script de configuração, certifique-se de que a variável de ambiente ROS_PACKAGE_PATH inclua o diretório em que você está:<span id="ROS.2FTutorials.2Fcatkin.2FCreateWorkspace.line-30" class="anchor"></span></p>
<p><span id="ROS.2FTutorials.2Fcatkin.2FCreateWorkspace.line-1-5" class="anchor"></span>$ echo $ROS_PACKAGE_PATH <span id="ROS.2FTutorials.2Fcatkin.2FCreateWorkspace.line-2-3" class="anchor"></span>/home/&lt;youruser&gt;/catkin_ws/src:/opt/ros/noetic/share</p>
<p>&nbsp;</p>
<p>Pronto, agora seu workspace está configurado.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS &#8211; Robot Operating System</title>
		<link>https://linuxforce.com.br/blog/ros/ros-robot-operating-system/</link>
		
		<dc:creator><![CDATA[adm_linxfs]]></dc:creator>
		<pubDate>Tue, 16 Mar 2021 22:45:14 +0000</pubDate>
				<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">https://www.linuxforce.com.br/?p=4018</guid>

					<description><![CDATA[ROS (Sistema Operacional de Robôs) fornece bibliotecas e ferramentas para ajudar os desenvolvedores de software a criar aplicativos de robô. Ele fornece abstração de hardware, drivers de dispositivo, bibliotecas, visualizadores, passagem de mensagens, gerenciamento de pacotes e muito mais. O ROS é licenciado sob uma licença BSD de código aberto. Este post contém instruções práticas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>ROS (Sistema Operacional de Robôs) fornece bibliotecas e ferramentas para ajudar os desenvolvedores de software a criar aplicativos de robô. Ele fornece abstração de hardware, drivers de dispositivo, bibliotecas, visualizadores, passagem de mensagens, gerenciamento de pacotes e muito mais. O ROS é licenciado sob uma licença BSD de código aberto.</p>
<p>Este post contém instruções práticas de instalação da versão Noetic de acordo com o site oficial http://wiki.ros.org/</p>
<ul>
<li>Configure seus repositórios do Ubuntu para permitir &#8220;restrito&#8221;, &#8220;universo&#8221; e &#8220;multiverso&#8221;. Estas opções encontram na janela de Software &amp; Updates.</li>
</ul>
<p>&nbsp;</p>
<p><img decoding="async" class="wp-image-4020 aligncenter" src="https://www.linuxforce.com.br/wp-content/uploads/2021/03/Software-Sources-460x213.png" alt="" width="527" height="244" /></p>
<p>&nbsp;</p>
<ul>
<li> Configure seu computador para aceitar o software de packages.ros.org através do seguinte comando no terminal</li>
</ul>
<p>$ sudo sh -c &#8216;echo &#8220;deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main&#8221; &gt; /etc/apt/sources.list.d/ros-latest.list&#8217;</p>
<p>&nbsp;</p>
<ul>
<li>Configure a chave</li>
</ul>
<p>$ sudo apt-key adv &#8211;keyserver &#8216;hkp://keyserver.ubuntu.com:80&#8217; &#8211;recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654</p>
<p>&nbsp;</p>
<ul>
<li>Instalação</li>
</ul>
<p>$ sudo apt update</p>
<p>$ sudo apt install ros-noetic-desktop-full</p>
<p>Você pode sempre instalar pacotes adicionais através de $ sudo apt install ros-noetic-PACKAGE</p>
<p>Para ver pacotes disponíveis use $ apt search ros-noetic</p>
<p>&nbsp;</p>
<ul>
<li>Configuração do ambiente</li>
</ul>
<p>Você deve fornecer este script em cada terminal bash em que usar o ROS.</p>
<p>$ source /opt/ros/noetic/setup.bash</p>
<p>Pode ser conveniente criar este script automaticamente toda vez que um novo shell for iniciado. Estes comandos farão isso por você.</p>
<p>$ echo &#8220;source /opt/ros/noetic/setup.bash&#8221; &gt;&gt; ~/.bashrc<br />
$ source ~/.bashrc</p>
<p>&nbsp;</p>
<ul>
<li>Dependências para construção de pacotes</li>
</ul>
<p>Para criar e gerenciar seus próprios espaços de trabalho ROS existem várias ferramentas e requisitos que são distribuídos separadamente. Para instalar essas ferramentas e outras dependências para construir pacotes ROS, execute:</p>
<p>$ sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential</p>
<p>Antes de usar muitas ferramentas ROS, você precisará inicializar o rosdep. O rosdep permite que você instale facilmente as dependências do sistema para o código-fonte que deseja compilar e é necessário para executar alguns componentes principais no ROS. Faça o seguinte</p>
<p>$ sudo rosdep init<br />
$ rosdep update</p>
<p>Pronto, sua instalação está completa e agora você pode seguir para outros tutoriais.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
