Documente Academic
Documente Profesional
Documente Cultură
Grupa: 4.1
Timişoara 2022
1. Partea teoretica a proiectului
TurtleBot, care provine din „Turtle of Logo”, este conceput pentru a preda
limbajul de programare pentru computer folosind Logo. Există 3 versiuni ale
modelului TurtleBot.
TurtleBot3 este un robot mobil mic, accesibil, programabil, bazat pe ROS, pentru
utilizare în educație, cercetare, hobby și prototipuri de produse. TurtleBot3 adoptă
actuatorul inteligent ROBOTIS DYNAMIXEL pentru conducere.
ROBOTIS DYNAMIXEL SDK este un kit de dezvoltare software care oferă funcții
de control DYNAMIXEL folosind comunicarea de pachete.
SDK-ul DYNAMIXEL poate fi utilizat pe PC-uri, precum desktop-uri sau laptop-uri,
de asemenea, poate fi utilizat pe tablete și pe SBC-uri, precum Raspberry Pi și
UpBoards. În plus, poate fi folosit cu plăci încorporate care acceptă IDE-ul Arduino.
DYNAMIXEL utilizează comunicații TTL și RS485. Pentru a folosi computerul și
DYNAMIXEL, este recomandat sa se utilizeze ca dispozitiv de interfață
USB2DYNAMIXEL sau U2D2.
ROBOTIS DYNAMIXEL SDK acceptă toate cele trei sisteme de operare: Windows,
Linux și MacOS.
ROBOTIS DYNAMIXEL SDK acceptă diverse limbaje de programare: C, C++, C#,
Python, Java, MATLAB și LabVIEW. În plus, DYNAMIXEL SDK acceptă ROS, deci
poate fi folosit ca bibliotecă ROS folosind module C++ sau Python.
Tehnologia de bază a TurtleBot3 este SLAM, Navigare și Manipulare, ceea ce îl
face potrivit pentru roboții de serviciu la domiciliu.
TurtleBot poate rula algoritmi SLAM (localizare și mapare simultană) pentru a
construi o hartă și se poate deplasa printr-o camera. De asemenea, poate fi
controlat de la distanță de pe un laptop, joypad sau telefon inteligent bazat pe
Android.
TurtleBot poate urmări, de asemenea, picioarele unei persoane în timp ce
merge într-o cameră. De asemenea, TurtleBot3 poate fi folosit ca un manipulator
mobil capabil să manipuleze un obiect prin atașarea unui manipulator precum
OpenMANIPULATOR.
Dupa ce codul sursă a fost descărcat din depozit, se compileaza folosind sintaxa
standard:
echo 'export
GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/turtlebot3_ws/src/turtlebot3/
turtlebot3_simulations/turtlebot3_gazebo/models' >> ~/.bashrc
echo 'export TURTLEBOT3_MODEL=waffle_pi' >> ~/.bashrc
source ~/.bashrc
Astfel, tot software-ul necesar a fost instalat și configurat, prin urmare urmeaza
lansarea simulatorul folosind comanda:
Codul folosit:
dictionaries.py
from
robot_control_class
import
RobotControl
#importa uma
classe
robotcontrol = RobotControl() #criando um objeto
lista_laser = robotcontrol.get_laser_full()
dicionario_laser = {}
for i in dicionario_laser:
print ('Posicao', i, dicionario_laser[i])
labirinto.py
import
time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
class Robo:
def __init__(self):
print("inicializando...")
self.laser1 = robotcontrol.get_laser(360)
self.robotmove_speed = 5
self.robotmove_time = 1
self.robotturn_clockwise = "clockwise"
self.robotturn_speed = 0.8
self.robotturn_time = 1
def robotmove(self):
while self.laser1 > 1:
robotcontrol.move_straight()
self.laser1 = robotcontrol.get_laser(360)
print("distancia: ", self.laser1)
robotcontrol.stop_robot()
print("estou perto demais da parede... ")
def robotturn(self):
distancia_direita = robotcontrol.get_laser(180)
distancia_esquerda = robotcontrol.get_laser(540)
print("direita",distancia_direita, "esquerda", distancia_esquerda)
if distancia_direita > distancia_esquerda:
while self.laser1 < 1:
robotcontrol.turn(self.robotturn_clockwise, self.robotturn_speed,
self.robotturn_time)
self.laser1 = robotcontrol.get_laser(360)
print("direita: distancia: ", self.laser1)
else:
while self.laser1 < 1:
robotcontrol.turn("aclockwise", self.robotturn_speed, self.robotturn_time)
self.laser1 = robotcontrol.get_laser(360)
print("esquerda: distancia: ", self.laser1)
robotcontrol.stop_robot()
print("ja virei, bora... ")
if __name__ == '__main__':
robo = Robo()
robo.robotmove()
robo.robotturn()
lists.py
from
robot_control_class
import
RobotControl
#importa uma
classe
robotcontrol = RobotControl() #criando um objeto
laser = robotcontrol.get_laser_full()
print ("Position: 0", laser[0])
print ("Position: 360", laser[360])
print ("Position: 719", laser[719])
pyscript1.py
from
robot_control_class
import
RobotControl
#importa uma
classe
robotcontrol = RobotControl() #criando um objeto
a = robotcontrol.get_laser(330)
robot_control_class.py
#!/usr/bin/env
python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan
import time
class RobotControl():
def __init__(self):
rospy.init_node('robot_control_node', anonymous=True)
self.vel_publisher = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
self.laser_subscriber = rospy.Subscriber(
'/kobuki/laser/scan', LaserScan, self.laser_callback)
self.cmd = Twist()
self.laser_msg = LaserScan()
self.ctrl_c = False
self.rate = rospy.Rate(1)
rospy.on_shutdown(self.shutdownhook)
def publish_once_in_cmd_vel(self):
"""
This is because publishing in topics sometimes fails the first time you
publish.
In continuos publishing systems there is no big deal but in systems
that publish only
once it IS very important.
"""
while not self.ctrl_c:
connections = self.vel_publisher.get_num_connections()
if connections > 0:
self.vel_publisher.publish(self.cmd)
#rospy.loginfo("Cmd Published")
break
else:
self.rate.sleep()
def shutdownhook(self):
# works better than the rospy.is_shutdown()
self.ctrl_c = True
def get_laser_full(self):
time.sleep(1)
return self.laser_msg.ranges
def stop_robot(self):
#rospy.loginfo("shutdown time! Stop the robot")
self.cmd.linear.x = 0.0
self.cmd.angular.z = 0.0
self.publish_once_in_cmd_vel()
def move_straight(self):
# Initilize velocities
self.cmd.linear.x = 0.5
self.cmd.linear.y = 0
self.cmd.linear.z = 0
self.cmd.angular.x = 0
self.cmd.angular.y = 0
self.cmd.angular.z = 0
# Initilize velocities
self.cmd.linear.y = 0
self.cmd.linear.z = 0
self.cmd.angular.x = 0
self.cmd.angular.y = 0
self.cmd.angular.z = 0
if motion == "forward":
self.cmd.linear.x = speed
elif motion == "backward":
self.cmd.linear.x = - speed
i=0
# loop to publish the velocity estimate, current_distance = velocity *
(t1 - t0)
while (i <= time):
s = "Moved robot " + motion + " for " + str(time) + " seconds"
return s
# Initilize velocities
self.cmd.linear.x = 0
self.cmd.linear.y = 0
self.cmd.linear.z = 0
self.cmd.angular.x = 0
self.cmd.angular.y = 0
if clockwise == "clockwise":
self.cmd.angular.z = -speed
else:
self.cmd.angular.z = speed
i=0
# loop to publish the velocity estimate, current_distance = velocity *
(t1 - t0)
while (i <= time):
s = "Turned robot " + clockwise + " for " + str(time) + " seconds"
return s
if __name__ == '__main__':
#rospy.init_node('robot_control_node', anonymous=True)
robotcontrol_object = RobotControl()
try:
robotcontrol_object.move_straight()
except rospy.ROSInterruptException:
pass
test_for.py
#Exercise
2.4
#arnaldo Jr
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
laser = robotcontrol.get_laser_full()
#laser = [50, 100000, 3]
lower_value = 10000
for value in laser:
#print(value)
if value < lower_value:
lower_value = value
print("The lower_value is: ",lower_value)
test_functions.py
#Exercise
3,3
#Arnaldo Jr
import time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
def robotmove(a,b,c):
# print('executando acao 1...',a,b,c)
resultado = robotcontrol.move_straight_time(a,b,c)
print(resultado)
def robotturn(a,b,c):
# print('executando acao 2...',+a,+b,+c)
resultado = robotcontrol.turn(a,b,c)
print(resultado)
fim = "nao"
while fim != "sim":
a = raw_input('direcao: forward ou backward ')
b = input('velocidade: m/s ')
c = input('tempo: seg ')
robotmove(a,b,c)
print('funcao turn')
d = raw_input('clockwise: ')
b = input('velocidade: m/s ')
c = input('tempo: seg ')
robotturn(d,b,c)
fim = raw_input("finalizado?")
test_if.py
#Exercise
2.1
#arnaldo jr
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
laser = robotcontrol.get_laser(360)
print(laser)
if laser <= 1:
robotcontrol.stop_robot()
else:
robotcontrol.move_straight()
print_reading()
test_input.py
from
robot_control_class
import
RobotControl
#importa uma
classe
robotcontrol = RobotControl() #criando um objeto
laser1 = robotcontrol.get_laser(position)
test_oop.py
#!/usr/bin/env
python
#Exercise 4
#Arnaldo Jr
import time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
class Robo:
def __init__(self):
print("inicializando...")
self.robotmove_motion = "forward"
self.robotmove_speed = 5
self.robotmove_time = 1
self.robotturn_clockwise = "clockwise"
self.robotturn_speed = 6
self.robotturn_time = 2
def robotmove(self):
resultado =
robotcontrol.move_straight_time(self.robotmove_motion,
self.robotmove_speed, self.robotmove_time)
print(resultado)
def robotturn(self):
resultado = robotcontrol.turn(self.robotturn_clockwise,
self.robotturn_speed, self.robotturn_time)
print(resultado)
if __name__ == '__main__':
robo = Robo()
robo.robotmove()
robo.robotturn()
robo.robotmove()
test_return.py
#Exercise
3,1
#Arnaldo Jr
import time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
def robotmove(a):
robotcontrol.move_straight()
time.sleep(a)
robotcontrol.stop_robot()
print('Forneca 3 valores entre 0 e 719.')
value = [0,1,2]
value[0] = input('valor 1:')
value[1] = input('valor 2:')
value[2] = input('valor 3:')
print(value)
#robotmove(5)
laser1 = robotcontrol.get_laser(360)
print(laser1)
test_sleep.py
#Exercise
3,1
#Arnaldo Jr
import time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
def robotmove(a):
robotcontrol.move_straight()
time.sleep(a)
robotcontrol.stop_robot()
robotmove(5)
test_while.py
#Exercise
3,1
#Arnaldo Jr
import time
from robot_control_class import RobotControl #importa uma classe
robotcontrol = RobotControl() #criando um objeto
laser1 = robotcontrol.get_laser(360)
robotcontrol.stop_robot()
print("estou demais da parede: ")
variables.py
from
robot_control_class
import
RobotControl
#importa uma
classe
robotcontrol = RobotControl() #criando um objeto
laser1 = robotcontrol.get_laser(360)
laser2 = robotcontrol.get_laser(330)
laser2 = robotcontrol.get_laser(370)
1) https://www.turtlebot.com/about/
2) https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_sdk/overview/
3) https://emanual.robotis.com/docs/en/platform/openmanipulator_x/overview/
4) http://wiki.ros.org/cartographer
5) https://www.youtube.com/watch?v=g7RSJcYW_qA&t=598s
6) https://ubuntu.com/blog/simulate-the-turtlebot3
7) https://github.com/arnaldojr/Python-3-for-Robotics
8) https://www.youtube.com/watch?v=5ADdIPpZ2pA
9) https://app.theconstructsim.com/#/