рдЖрд░рдУрдПрд╕ рдЯреНрд░рдХ рдЯреНрд░реЙрд▓реАред рднрд╛рдЧ 6. рдкрд╣рд┐рдпрд╛ рдПрдирдХреЛрдбрд░, рдХрдорд░реЗ рдХрд╛ рдирдХреНрд╢рд╛, рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде рдУрдбреЛрдореЗрдЯреНрд░реА

рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкреЛрд╕реНрдЯ:
8. рд╣рдо рдлреЛрди-рдЖрд░рдУрдПрд╕ рдХрдВрдЯреНрд░реЛрд▓, рдЬреАрдкреАрдПрд╕-рдиреЛрдб рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
7. рд░реЛрдмреЛрдЯ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг: рдЬреАрдПрдордкреА, рдПрдПрдорд╕реАрдПрд▓, рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдкрд░ рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ
6. рдкрд╣рд┐рдпрд╛ рдПрдирдХреЛрдбрд░, рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ, рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде рдУрдбреЛрдореЗрдЯреНрд░реА
5. рд╣рдо rviz рдФрд░ gazebo рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: xacro, рдирдП рд╕реЗрдВрд╕рд░ред
4. rviz рдФрд░ gazebo рд╕рдВрдкрд╛рджрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░реЛрдмреЛрдЯ рд╕рд┐рдореБрд▓реЗрд╢рди рдмрдирд╛рдПрдВред
3. рддреЗрдЬреА рд▓рд╛рдиреЗ, рдХреИрдорд░реЗ рдХреЛ рдмрджрд▓рдиреЗ, рдЧреЗрдЯ рдХреЛ рдареАрдХ рдХрд░реЗрдВ
2. рд╕реЙрдлреНрдЯрд╡реЗрдпрд░
1. рд▓реЛрд╣рд╛

рдкрд┐рдЫрд▓реА рдмрд╛рд░, рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ xacro рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдерд╛, рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛ рдФрд░ imu (рдЬрд╛рдЗрд░реЛрд╕реНрдХреЛрдк) рдЬреЛрдбрд╝рд╛ред

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рдСрдкреНрдЯрд┐рдХрд▓ рдПрдирдХреЛрдбрд░ рд╕реЗ рдУрдбреЛрдореЗрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡реНрд╣реАрд▓ рд╢рд╛рдлреНрдЯ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рд╣реИрдВ, рдПрдХ рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реЛрдмреЛрдЯ рдЯреНрд░реЙрд▓реА рдкрд░ рд╕рд╡рд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред

рдУрдбреЛрдореЗрдЯреНрд░реА рдФрд░ рдЯреАрдПрдл


рдУрдбреЛрдореЗрдЯреНрд░реА рдФрд░ рдЯреАрдПрдл рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЖрд░рдУрдПрд╕ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрди рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ ред
рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЖрдзрд╛рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдо рдЕрднреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдЖрдЗрдП рдЗрд╕реЗ VNC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдЯреНрд░реЙрд▓реА рд░реЛрдмреЛрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

Rosbots_driver рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдиреЛрдб рдмрдирд╛рдПрдВред рдпрд╣ рдлрд╛рдЗрд▓ рдУрдкреНрдЯреЛрдореЗрдЯреНрд░реА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреА, рдЗрд╕реЗ рдСрдкреНрдЯрд┐рдХрд▓ рдПрдирдХреЛрдбрд░реНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдЕрд░рдбрд┐рдиреЛ рдФрд░ рдлрд┐рд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЛ рднреЗрдЬрддреА рд╣реИред

cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver touch diff-tf.py 

рд╣рдордиреЗ рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЛрдб рдбрд╛рд▓рд╛:

diff_tf.py
 #!/usr/bin/env python """ diff_tf.py - follows the output of a wheel encoder and creates tf and odometry messages. some code borrowed from the arbotix diff_controller script A good reference: http://rossum.sourceforge.net/papers/DiffSteer/ Copyright (C) 2012 Jon Stephan. """ import rospy #import roslib #roslib.load_manifest('differential_drive') from math import sin, cos, pi from geometry_msgs.msg import Quaternion from geometry_msgs.msg import Twist from geometry_msgs.msg import Vector3 from nav_msgs.msg import Odometry import tf from tf.broadcaster import TransformBroadcaster from std_msgs.msg import Int16, Int32, Int64, UInt32 ############################################################################# class DiffTf: ############################################################################# ############################################################################# def __init__(self): ############################################################################# rospy.init_node("diff_tf") self.nodename = rospy.get_name() rospy.loginfo("-I- %s started" % self.nodename) #### parameters ####### #Wheel radius : 0.0325 # wheel circum = 2* 3.14 * 0.0325 = 0.2041 # One rotation encoder ticks : 8 ticks # For 1 meter: 8 * ( 1 / 0.2041) = 39 ticks self.rate = rospy.get_param('~rate',10.0) # the rate at which to publish the transform self.ticks_meter = float(rospy.get_param('ticks_meter', 190)) # The number of wheel encoder ticks per meter of travel self.base_width = float(rospy.get_param('~base_width', 0.11)) # The wheel base width in meters self.base_frame_id = rospy.get_param('~base_frame_id','base_link') # basefootprint /the name of the base frame of the robot self.odom_frame_id = rospy.get_param('~odom_frame_id', 'odom') # the name of the odometry reference frame self.encoder_min = rospy.get_param('encoder_min', -2147483648) self.encoder_max = rospy.get_param('encoder_max', 2147483648) self.encoder_low_wrap = rospy.get_param('wheel_low_wrap', (self.encoder_max - self.encoder_min) * 0.3 + self.encoder_min ) self.encoder_high_wrap = rospy.get_param('wheel_high_wrap', (self.encoder_max - self.encoder_min) * 0.7 + self.encoder_min ) self.t_delta = rospy.Duration(1.0/self.rate) self.t_next = rospy.Time.now() + self.t_delta # internal data self.enc_left = None # wheel encoder readings self.enc_right = None self.left = 0 # actual values coming back from robot self.right = 0 self.lmult = 0 self.rmult = 0 self.prev_lencoder = 0 self.prev_rencoder = 0 self.x = 0 # position in xy plane self.y = 0 self.th = 0 self.dx = 0 # speeds in x/rotation self.dr = 0 self.yaw = 0.01 self.pitch = 0.01 self.roll = 0.01 self.then = rospy.Time.now() self.quaternion_1 = Quaternion() # subscriptions rospy.Subscriber("wheel_ticks_left", UInt32, self.lwheelCallback) rospy.Subscriber("wheel_ticks_right", UInt32, self.rwheelCallback) #rospy.Subscriber("imu_data", Vector3, self.imu_value_update) self.odomPub = rospy.Publisher("odom", Odometry,queue_size=10) self.odomBroadcaster = TransformBroadcaster() ############################################################################# def spin(self): ############################################################################# r = rospy.Rate(self.rate) while not rospy.is_shutdown(): self.update() r.sleep() ############################################################################# def update(self): ############################################################################# now = rospy.Time.now() if now > self.t_next: elapsed = now - self.then self.then = now elapsed = elapsed.to_sec() # calculate odometry if self.enc_left == None: d_left = 0 d_right = 0 else: d_left = (self.left - self.enc_left) / self.ticks_meter d_right = (self.right - self.enc_right) / self.ticks_meter self.enc_left = self.left self.enc_right = self.right # distance traveled is the average of the two wheels d = ( d_left + d_right ) / 2 # this approximation works (in radians) for small angles th = ( d_right - d_left ) / self.base_width # calculate velocities self.dx = d / elapsed self.dr = th / elapsed if (d != 0): # calculate distance traveled in x and y x = cos( th ) * d y = -sin( th ) * d # calculate the final position of the robot self.x = self.x + ( cos( self.th ) * x - sin( self.th ) * y ) self.y = self.y + ( sin( self.th ) * x + cos( self.th ) * y ) if( th != 0): self.th = self.th + th # publish the odom information quaternion = Quaternion() quaternion.x = 0.0 quaternion.y = 0.0 quaternion.z = sin( self.th / 2 ) quaternion.w = cos( self.th / 2 ) ''' try: quaternion.z = self.quaternion_1[2] quaternion.w = self.quaternion_1[3] except: quaternion.z = sin( self.th / 2 ) quaternion.w = cos( self.th / 2 ) pass ''' self.odomBroadcaster.sendTransform( (self.x, self.y, 0), (quaternion.x, quaternion.y, quaternion.z, quaternion.w), rospy.Time.now(), self.base_frame_id, self.odom_frame_id ) odom = Odometry() odom.header.stamp = now odom.header.frame_id = self.odom_frame_id odom.pose.pose.position.x = self.x odom.pose.pose.position.y = self.y odom.pose.pose.position.z = 0 odom.pose.pose.orientation = quaternion odom.child_frame_id = self.base_frame_id odom.twist.twist.linear.x = self.dx odom.twist.twist.linear.y = 0 odom.twist.twist.angular.z = self.dr self.odomPub.publish(odom) def imu_value_update(self, imu_data): orient = Vector3() orient = imu_data self.yaw = orient.x self.pitch = orient.y self.roll = orient.z try: self.quaternion_1 = tf.transformations.quaternion_from_euler(self.yaw, self.pitch, self.roll) #print self.quaternion_1[0] #print self.quaternion_1[1] #print self.quaternion_1[2] #print self.quaternion_1[3] except: rospy.logwarn("Unable to get quaternion values") pass ############################################################################# def lwheelCallback(self, msg): ############################################################################# enc = msg.data if (enc < self.encoder_low_wrap and self.prev_lencoder > self.encoder_high_wrap): self.lmult = self.lmult + 1 if (enc > self.encoder_high_wrap and self.prev_lencoder < self.encoder_low_wrap): self.lmult = self.lmult - 1 self.left = 1.0 * (enc + self.lmult * (self.encoder_max - self.encoder_min)) self.prev_lencoder = enc ############################################################################# def rwheelCallback(self, msg): ############################################################################# enc = msg.data if(enc < self.encoder_low_wrap and self.prev_rencoder > self.encoder_high_wrap): self.rmult = self.rmult + 1 if(enc > self.encoder_high_wrap and self.prev_rencoder < self.encoder_low_wrap): self.rmult = self.rmult - 1 self.right = 1.0 * (enc + self.rmult * (self.encoder_max - self.encoder_min)) self.prev_rencoder = enc ############################################################################# ############################################################################# if __name__ == '__main__': """ main """ diffTf = DiffTf() diffTf.spin() 


рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВ:
CTRL+X
chmod +x diff-tf.py


рдЕрдм рд░реЛрдмреЛрдЯ рдкрд░, 2 рдиреЛрдбреНрд╕ рдЪрд▓рд╛рдПрдВ - рдбреНрд░рд╛рдЗрд╡рд░ рдФрд░ рдбрд┐рдл-рдЯреАрдПрдл:
рдкрд╣рд▓рд╛ рдЯрд░реНрдорд┐рдирд▓:

 python diff_tf.py 

2:

 rosrun rosbots_driver part2_cmr.py 

рддреАрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рд╣рдо рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдирдП рдУрдбреЛрдо рдФрд░ tf рд╡рд┐рд╖рдп рд╣реИрдВ:



рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд┐рд╖рдп рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреНрдпрд╛ рд╣реИ (рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╕рднреА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рд╣реИ) рдХреЗ рд╕рд╛рде рд░рд╕реНрдЯреЛрдкрд┐рдХ рдЗрдХреЛ рдУрдбреЛрдо рдХрдорд╛рдВрдб рджреЗрдЦреЗрдВред
рдЖрдЙрдЯрдкреБрдЯ рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:



рдЕрдм, рд░реЛрдмреЛрдЯ рдкрд░ рдЪрд▓ рд░рд╣реЗ рдиреЛрдбреНрд╕ рдХреЛ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдо рдЧреНрд░рд╛рдлрд┐рдХрд▓ рд╡рд╛рддрд╛рд╡рд░рдг rviz рдФрд░ gazebo рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдг рдХрдВрдкреНрдпреВрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗред

* Ubuntu (16.04 + ROS рдХрд╛рдЗрдиреЗрдЯрд┐рдХ) рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ (VMWare рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди), рдЬреЛ рдкрд╣рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХреА рдЧрдИ рдереА, рдЗрд╕рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдпрдВрддреНрд░рдг рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ (рдмрд╛рдж рдореЗрдВ "рдХрдВрдкреНрдпреВрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ), рдореЙрдбрд▓ рдХреЛ rviz рдореЗрдВ рдЪрд▓рд╛рдПрдВ:

 roslaunch rosbots_description rviz.launch 

рд░реЛрдмреЛрдЯ рдореЙрдбрд▓ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд▓реЛрдб рд╣реЛрдЧрд╛:



Add рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ rviz рдореЗрдВ рджреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЬреЛрдбрд╝реЗрдВред рдУрдбреЛрдореЗрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЯреАрдПрдл рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди, рдЙрдиреНрд╣реЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдХреНрд╕реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

рдЙрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЬрд╣рд╛рдВ рд░реЛрдмреЛрдЯ рдореЙрдбрд▓ рдХреЛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:


* рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд░реЛрдмреЛрдЯрдореЙрдбрд▓ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдХреАрдмреЛрд░реНрдб рд╕реЗ рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ tf рдФрд░ рдУрдбреЛрдореЗрдЯреНрд░реА рдХрд╛ рджреГрд╢реНрдп рдмрджрд▓рддрд╛ рд╣реИред

2 рд╡реЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ rviz рдХреЛ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдо рдХреАрдмреЛрд░реНрдб рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 

рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА: рд▓рд╛рд▓ рддреАрд░ (рдУрдбреЛрдо рд╡рд┐рд╖рдп рдХрд╛ рджреГрд╢реНрдп), рд╡реЗрдХреНрдЯрд░ рд▓рд╛рдЗрдиреЗрдВ (tf рд╡рд┐рд╖рдп)ред

рдпрджрд┐ рдУрдбреЛрдо рд╡рд┐рд╖рдп рдХрд╛ рд▓рд╛рд▓ рддреАрд░ рд░реЛрдмреЛрдЯ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗрдХреНрдЯрд░ рд▓рд╛рдЗрдиреЗрдВ tf рджрд┐рдЦрд╛рддреА рд╣реИрдВ рдХрд┐ рд░реЛрдмреЛрдЯ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИрдВ:

рд╡реАрдбрд┐рдпреЛ


рдЕрдм, рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдУрдбреЛрдореЗрдЯреНрд░реА "рдЯреНрдпреВрди" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, rviz рд╕рдВрдкрд╛рджрдХ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд┐рдП рдмрд┐рдирд╛:

 rosrun rviz rviz 

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдмреЗрд╕_рд▓рд┐рдВрдХ рдФрд░ рдУрдбреЛрдо tf рд╡рд┐рд╖рдп рдХреЗ рд╡реИрдХреНрдЯрд░ рд╕реЗ рдмрдиреЗ рд░рд╣реЗрдВ:



Rviz рдореЗрдВ, рдПрдХ рд╕реЗрд▓ 1 рдореАрдЯрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рддреБрд▓рдиреАрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрдмреЛрдЯ рдХреЛ 1 рдореАрдЯрд░ рднреА рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рд░реЛрдмреЛрдЯ рдкрд░ 1 рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред Rviz рдореЗрдВ, рд░реЛрдмреЛрдЯ рдХреЛ 1 рдореАрдЯрд░ - рдПрдХ рд╕реЗрд▓ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдЕрдЧрд░ рд░реЛрдмреЛрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдпрд╛рддреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ rviz рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝реА рджреВрд░реА рдкрд░, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ diff_tf.py рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЕрд░реНрдерд╛рддреН рдпрд╣ рдмреНрд▓реЙрдХ:

diff_tf.py
  #### parameters ####### #Wheel radius : 0.0325 # wheel circum = 2* 3.14 * 0.0325 = 0.2041 # One rotation encoder ticks : 8 ticks # For 1 meter: 8 * ( 1 / 0.2041) = 39 ticks self.rate = rospy.get_param('~rate',10.0) # the rate at which to publish the transform self.ticks_meter = float(rospy.get_param('ticks_meter', 190)) # The number of wheel encoder ticks per meter of travel self.base_width = float(rospy.get_param('~base_width', 0.11)) # The wheel base width in meters 


рдорд╛рдирдЪрд┐рддреНрд░ (рдирдХреНрд╢рд╛)


рдХрд╣реАрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд░реЛрдмреЛрдЯ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП - рд╣рдореЗрдВ рдПрдХ рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЪрд▓реЛ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

Rviz рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХреНрд╢рд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ (рд░реЛрдмреЛрдЯ рдкрд░ рдирд╣реАрдВ) рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (rosbots_description) рдореЗрдВ рдПрдХ рдореИрдк рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рд▓рдиреА рд╣реЛрдВрдЧреА рдЬреЛ рдореИрдк рдмрдирд╛рддреЗ рд╣реИрдВ: map.pgm рдФрд░ map.yamlред
* рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрдИ рдореИрдк рдлрд╛рдЗрд▓реЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЬрд╛рджреВрдЧрд░ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд░рдУрдПрд╕ рдореЗрдВ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдкреАрдЬреАрдПрдо рдЫрд╡рд┐ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ рддреЛ рд╣реЛрддрд╛ рд╣реИ:

  • рд╕рдлреЗрдж - рдЕрдВрддрд░рд┐рдХреНрд╖ рдореБрдХреНрдд рд╣реИ;
  • рдХрд╛рд▓рд╛ - рдЕрдВрддрд░рд┐рдХреНрд╖ рдПрдХ рдмрд╛рдзрд╛ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ;
  • рдЧреНрд░реЗ - рдЕрдВрддрд░рд┐рдХреНрд╖ рдЕрднреА рддрдХ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред

рджреВрд╕рд░реА .yaml рдлрд╝рд╛рдЗрд▓ рдирдХреНрд╢реЗ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕рдХреЗ рдЖрдпрд╛рдо, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдЕрдзрд┐рднреЛрдЧ (рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз), рдФрд░ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрд╕ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдиреЛрдб рдЪрд▓рд╛рдПрдВ рдЬреЛ рдХрд╛рд░реНрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдЧрд╛:

 rosrun map_server map_server /home/pi/catkin_ws/src/rosbots_description/maps/rail_lab.pgm 0.05 

рдкрдбрд╝реЛрд╕реА рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдореЙрдбрд▓ рдХреЛ rviz рдореЗрдВ рдЪрд▓рд╛рдПрдВ:

 roslaunch rosbots_description rviz.launch 

Rviz рдореЗрдВ, рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рди рдЬреЛрдбрд╝реЗрдВред

Rviz рдореЗрдВ, рд░реЛрдмреЛрдЯ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рджреВрд░ рд╕реНрдерд┐рдд рд╣реИ:



рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирдХреНрд╢рд╛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 1 рдореАрдЯрд░ рд╣реЛрдЧрд╛ред рдЕрдВрдд рдореЗрдВ 1 рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:

 rosrun map_server map_server /home/pi/catkin_ws/src/rosbots_description/maps/rail_lab.pgm 1 

рдЕрдм рдЖрдк рдХреАрдмреЛрд░реНрдб рд╕реЗ рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдореИрдк рдХреЛ rviz рдореЗрдВ рд╕рд╡рд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд╡реАрдбрд┐рдпреЛ


рддреЛ, рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ :

  • рд░реЛрдмреЛрдЯ рдХреЗ рдСрдкреНрдЯрд┐рдХрд▓ рд╡реНрд╣реАрд▓ рдПрдирдХреЛрдбрд░ рд╕реЗ рдУрдбреЛрдореЗрдЯреНрд░реА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ rviz рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ;
  • рд▓рд╛рдЗрд╡ рдФрд░ рд╡рд╕реНрддреБрддрдГ рдпрд╛рддреНрд░рд╛ рдХреА рджреВрд░реА рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрдмреЛрдЯ рдУрдбреЛрдореЗрдЯреНрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ;
  • рдПрдХ рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдХреЛ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдирдХреНрд╢рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд░реЛрдмреЛрдЯ "рдЯреНрдпреВрдиреНрдб" рдУрдбреЛрдореЗрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдЙрд╕ рдкрд░ рд╕рд╡рд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реЛрдмреЛрдЯ рдЕрдВрдзрд╛ рд╣реИред рд╡рд╣ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЙрди рдкрд░ рдареЛрдХрд░ рдЦрд╛рдПрдЧрд╛ред рджреВрд╕рд░рд╛ рдорд╛рдЗрдирд╕ рд╡рд░реНрдЪреБрдЕрд▓ рд░реВрдо рдореИрдк рд╣реИ рдЬрд┐рд╕реЗ rviz рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЕрдкрдиреЗ рджрдо рдкрд░ рд╕рд╡рд╛рд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рднреА рдЬрд╣рд╛рдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдФрд░ рд╡рд╕реНрддреБрддрдГ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд░реЛрдмреЛрдЯ рдХреИрд╕реЗ "рджреЗрдЦ" рд╕рдХрддрд╛ рд╣реИ?

рдПрдХ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рд╣реИред рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдЧрдЬрд╝реЗрдмреЛ рдПрдореБрд▓реЗрдЯрд░-рдПрдбрд┐рдЯрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдФрд░ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╣рдореЗрдВ рдПрдХ рддрддреНрд╡ (рд╕реЗрдВрд╕рд░) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред

рдПрдХ рд╡рд┐рдХрд▓реНрдк рд░реЛрдмреЛрдЯ рдкрд░ рд▓рд┐рдбрд╛рд░ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╣реИред

рд▓рд┐рдбрд╛рд░ RPlidar A рез


рд╣рдо рд╕рд╕реНрддреА рдмрдЬрдЯ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд░реЛрдмреЛрдЯ рдкрд░ рд▓рд┐рдбрд╛рд░ рдбрд╛рд▓реЗрдВрдЧреЗред рд╢рд╛рдпрдж рдпрд╣ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╣реА Kinect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдпрд╣ рдЧрддрд┐, рд╕рдЯреАрдХрддрд╛ рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА (рдХрдо рдмреЛрдЭрд┐рд▓) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкрд╛рд╡рд░ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (https://habr.com/en/company/tod/blog/210252/) рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рд╣рдореЗрдВ рдврдХреНрдХрди рдкреИрдХреЗрдЬ рдХреЛ рд▓рд┐рдбрд╛рд░ - wiki.ros.org/rplidar рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд▓рд┐рдбрд╛рд░ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рднреА рдХрд░реЗрдВрдЧреЗред

рдЖрд░рдУрдПрд╕ рдореЗрдВ rplidar рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ ред

рд╣рдо рдЧреНрд░реЗ рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реЗ рдмреВрдврд╝реЛрдВ рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ:

 cd /home/pi/rosbots_catkin_ws/src git clone https://github.com/robopeak/rplidar_ros.git cd .. catkin_make 

рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░, рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 cd /home/pi/rosbots_catkin_ws/src git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam </code> cd .. catkin_make 

рд░реЛрдмреЛрдЯ рдкрд░ рдкреИрдХреЗрдЬ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд▓рд┐рдбрд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

 sudo chmod a+rw /dev/ttyUSB0 roslaunch rplidar_ros rplidar.launch 

* рдкрд╣рд▓рд╛ рдХрдорд╛рдВрдб рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд▓рд┐рдбрд╛рд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛, рддреЛ рдпрд╣ рдХрдВрд╕реЛрд▓ рдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:

 [ INFO] [1570900184.874891236]: RPLIDAR running on ROS package rplidar_ros. SDK Version:1.9.0 RPLIDAR S/N: ---------------- [ INFO] [1570900187.397858270]: Firmware Ver: 1.24 [ INFO] [1570900187.398081809]: Hardware Rev: 5 [ INFO] [1570900187.401749476]: RPLidar health status : 0 [ INFO] [1570900188.014285166]: current scan mode: Express, max_distance: 12.0 m, Point number: 4.0K , angle_compensate: 1 

рдпрд╣рд╛рдВ рд╣рдо рддреБрд░рдВрдд рдереЛрдбрд╝рд╛ рд▓рд┐рдбрд╛рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ (рд▓рд┐рдбрд╛рд░) рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреИрдирд┐рдВрдЧ 4.0K рдЕрдВрдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 8.0Kред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕реНрдХреИрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо rplidar рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ - рд╕реНрдХреИрди рдореЛрдб:

 cd /rosbots_catkin_ws/src/rplidar_ros/launch nano nano rplidar.launch 

рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж

 <param name="angle_compensate" type="bool" value="true"/> 
рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:

 <param name="scan_mode" type="string" value="Boost"/> 

рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 <param name="frame_id" type="string" value="laser"/> 

Base_link рд╕реЗ рд▓реЗрдЬрд░ рдорд╛рди рдмрджрд▓реЗрдВред

* рдЕрдм, рдпрджрд┐ рдЖрдк roslaunch rplidar_ros rplidar.launch рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдиреЛрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдЕрд▓рдЧ рд╣реЛрдЧрд╛:

 [ INFO] [1570900188.014285166]: current scan mode: Boost, max_distance: 12.0 m, Point number: 8.0K , angle_compensate: 1 

рджреЗрдЦ рд▓реЗрдирд╛ред рдЬреЛ rviz рдореЗрдВ рд▓рд┐рдбрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЛрдмреЛрдЯ рдкрд░ рдЪрд▓рд╛рдПрдБ:

 roslaunch rplidar_ros rplidar.launch 

рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░:

 roslaunch rosbots_description rviz.launch 

Rviz рдореЗрдВ, LaserScan рдбрд┐рд╕реНрдкреНрд▓реЗ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕реНрдХреИрди рд╡рд┐рд╖рдп рдЪреБрдиреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд┐рд╖рдп рдореЗрдВ рд╕рдВрджреЗрд╢ рдЧрд┐рд░ рд░рд╣реЗ рд╣реИрдВ:



рд░реЛрдмреЛрдЯ рдХреЗ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЦрд┐рдбрд╝рдХреА рдореЗрдВ, рд░реЛрдмреЛрдЯ рдПрдХ рд╡рд┐рд╢рд╛рд▓рдХрд╛рдп рдирд┐рдХрд▓рд╛ред рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред рдЕрдм рдПрдХ рдХрдорд░реЗ рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдиреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ:

 catkin_create_pkg my_hector_mapping rospy cd my_hector_mapping mkdir launch cd launch nano hector.launch 

hector.launch
 <?xml version="1.0"?> <launch> <node pkg="tf" type="static_transform_publisher" name="laser_link" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 50" /> <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen"> <!-- Frame names --> <param name="map_frame" value="map" /> <param name="odom_frame" value="base_link" /> <!-- Map size / start point --> <param name="map_resolution" value="0.050"/> <param name="map_size" value="1024"/> <param name="map_start_x" value="0.5"/> //  <param name="map_start_y" value="0.5" /> <param name="map_multi_res_levels" value="2" /> <!-- Map update parameters --> <param name="update_factor_free" value="0.4"/> <param name="update_factor_occupied" value="0.9" /> <param name="map_update_distance_thresh" value="0.4"/> <param name="map_update_angle_thresh" value="0.06" /> <param name="laser_z_min_value" value="-1.0" /> <param name="laser_z_max_value" value="1.0" /> <!-- Advertising config --> <param name="advertise_map_service" value="true"/> <param name="scan_subscriber_queue_size" value="5"/> <param name="scan_topic" value="scan"/> </node> </launch> 


 cd ~/rosbots_catkin_ws catkin_make 

рдЪрд▓реЛ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рд░реЛрдмреЛрдЯ рдкрд░:

рдкрд╣рд▓рд╛ рдЯрд░реНрдорд┐рдирд▓: roslaunch rplidar_ros rplidar.launch
рджреВрд╕рд░рд╛: rosrun rosbots_driver part2_cmr.py

рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░:

рдкрд╣рд▓рд╛ рдЯрд░реНрдорд┐рдирд▓: roslaunch my_hector_mapping hector.launch
рджреВрд╕рд░рд╛: roslaunch rosbots_description rviz.launch
рддреАрд╕рд░рд╛: rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel

рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореИрдк рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рдХреНрд╕реНрдб рдлреНрд░реЗрдо рдмреЗрд╕_рд▓рд┐рдВрдХ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓рд┐рдбрд╛рд░ рдХреИрд╕реЗ рдЕрдкрдиреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рд╕реНрдерд╛рди рдХреЛ "рдкреНрд░рдХрд╛рд╢рд┐рдд" рдХрд░рддрд╛ рд╣реИ:



рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдореЗрдВ, рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рд╡рд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдХреЛрдгреЛрдВ рдкрд░ "рд░реЛрдХрдирд╛" рддрд╛рдХрд┐ рд▓рд┐рдбрд╛рд░ рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХреЛрдВ рдХреА рд╕рд▓рд╛рд╣ рджреЗрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╕рд▓рд╛рд╣ рд╣реИ рдХрд┐ рд░реЛрдмреЛрдЯ рдХреЛ рдЙрдард╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреЗ рд╕рд╛рде рд░рдЦрддреЗ рд╣реБрдП рдЪрд▓реЗрдВред рддреЛ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдЧрддрд┐ рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реЛрдЧреА рдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рджреГрд╢реНрдп рд╕рдВрдкрд░реНрдХ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рд░реЛрдмреЛрдЯ рдЕрдЧрд▓реЗ рдХрдорд░реЗ рдореЗрдВ рдХрд╣рд╛рдВ рдЪрд▓рд╛ рдЧрдпрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдПрдХ рдпрд╛рддреНрд░рд╛ рдХреЗ рджреМрд░рд╛рди рд░реЛрдмреЛрдЯ рдЕрдкрдиреА рдзреБрд░реА рдкрд░ рдШреВрдорддрд╛ рд╣реИ, рддреЛ рд▓рд┐рдбрд╛рд░ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╛рд▓реА рдХрд╛рд▓реА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рдЫреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:



рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХрдорд╛рдВрдб рд╕реЗ рд╕рд╣реЗрдЬреЗрдВ:

 rosrun map_server map_saver -f map-1 

рдмрдЬрдЯ рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдирдХреНрд╢реЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдорд┐рдердХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рд▓рд┐рдбрд╛рд░ рдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗред рд╣рдо рдирдХреНрд╢реЗ рд╕реЗ рдХрд╛рд▓реА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреАрд╡рд╛рд░реЛрдВ рдХреЛ рдХрд╛рд▓реА рд░реЗрдЦрд╛рдУрдВ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ:



рдирдХреНрд╢реЗ рдХреЛ .pgm рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рди рднреВрд▓реЗрдВред

рдЕрдм рд╣рдо рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЙрд╕ рдХрдорд╛рдВрдб рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдереА, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде:
рдкрд╣рд▓рд╛ рдЯрд░реНрдорд┐рдирд▓: rosrun map_server maserver /home/pi/catkin_ws/src/rosbots_description/maps/map-1.pgm 0.05 / rosrun map_server maserver /home/pi/catkin_ws/src/rosbots_description/maps/map-1.pgm 0.05 / rosrun map_server maserver /home/pi/catkin_ws/src/rosbots_description/maps/map-1.pgm 0.05
рджреВрд╕рд░рд╛: roslaunch rosbots_description rviz.launch

рдкрд░рд┐рдгрд╛рдо рдореЗрдВ rviz:



рдирдпрд╛ рдирдХреНрд╢рд╛, рдЙрд╕ рдкрд░ рд░реЛрдмреЛрдЯ рдореЙрдбрд▓ рдХреА рддрд░рд╣ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реЛрдмреЛрдЯ рдирдХреНрд╢реЗ рдХреЗ рдмрд╛рд╣рд░ рд╣реИред

рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ:

  • рд▓рд┐рдбрд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ RP-lidar A рез
  • рдПрдХ рд▓рд┐рдбрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдорд░реЗ рдХреЗ рдирдХреНрд╢реЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ rviz рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ред

рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЗрдВ: рдХрдорд░реЗ рдХрд╛ рдирдХреНрд╢рд╛ ред

Source: https://habr.com/ru/post/hi471028/


All Articles