рдЯреНрд░реЙрд▓реА рд░реЛрдмреЛрдЯ 2.0ред рднрд╛рдЧ 2. rviz рдФрд░ рдмрд┐рдирд╛ рдкреНрд░рдмрдВрдзрдиред rviz рдореЗрдВ рд╕реМрдВрджрд░реНрдп рдХреЗ рддрддреНрд╡

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

рдЫрд╡рд┐

рдЪрд▓рд┐рдП рдЕрднреНрдпрд╛рд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рд░реЛрдмреЛрдЯ рдХрд╛ рдХрд╛рд░реНрдп : рдмрд┐рдВрджреБ рдП рд╕реЗ рдмрд┐рдВрджреБ рдмреА рддрдХ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпрд╛рддреНрд░рд╛ рдХрд░рдирд╛, рдпрд╛ рдмреЗрд╣рддрд░, рддреБрд░рдВрдд рдХрдИ рдмрд┐рдВрджреБрдУрдВ рддрдХ рдмреАред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдиреЛрд░реЛрдмреЛрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдиреЛрдбреНрд╕) рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рд░реЛрдмреЛрдЯ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рджреГрд╢реНрдп рд╣реЛрдЧрд╛ред рдПрдХ рдмрд╛рд╣рд░реА рдкреАрд╕реА рд╕реЗ, рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (рдмрд╛рдж рдореЗрдВ "рдкреАрд╕реА" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдЯ рдкрд░ рдореМрдЬреВрдж рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реЗ, рдЬрд┐рд╕рдХрд╛ рджрд┐рд▓ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ 3 рдмреА рд╕рд┐рдВрдЧрд▓-рдмреЛрд░реНрдб рд╣реИ, рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЙрдмрдВрдЯреВ 16.04, рдЖрд░рдУрдПрд╕ рдХрд╛рдЗрдиреЗрдЯрд┐рдХ, рдкреАрд╕реА рдкрд░: рдЙрдмрдВрдЯреВ 18.04, рдЖрд░рдУрдПрд╕ рдореЗрд▓реЛрдбрд┐рдХред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХрд╣реАрдВ рдЬрд╛рдПрдВ, рдЖрдкрдХреЛ рд░реЛрдмреЛрдЯ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рд▓рдВрдмрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреГрд╖реНрда рдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдорд╛рди рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

roscd linorobot/param/navigation
nano costmap_common_params.yaml

рд╕рд╣реА рдкрджрдЪрд┐рд╣реНрди рдкреИрд░рд╛рдореАрдЯрд░:

footprint: [[-x, -y], [-x, y], [x, y], [x, -y]]

рдЬрд╣рд╛рдВ рд░реЛрдмреЛрдЯ рдХреА x = рд▓рдВрдмрд╛рдИ / y рдФрд░ рдЪреМрдбрд╝рд╛рдИ = 2
* рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд░реЛрдмреЛрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ urdf рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд░реЛрдмреЛрдЯ рдХрд╛рд░реНрдЯ рдХреА рдкрд┐рдЫрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

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

рд╣рдо рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рд░реЛрдмреЛрдЯ рдкрд░, рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

roslaunch linorobot bringup.launch
roslaunch linorobot navigate.launch

рдкреАрд╕реА рдкрд░, rviz рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╢реЗрд▓ рдЪрд▓рд╛рдПрдВ:
roscd lino_visualize/rviz
rviz -d navigate.rviz

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛, рддреЛ рдкреАрд╕реА рдкрд░ рдЖрдк rviz рдореЗрдВ рд░реЛрдмреЛрдЯ рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



TF axes rviz рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА Poligon рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ, рдЬрд┐рд╕реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдкреИрдирд▓ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╣реБрднреБрдЬ - рдпреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд░реЛрдмреЛрдЯ рдХреЗ рдХреЗрд╡рд▓ рдкреИрд░реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд░реЛрдмреЛрдЯ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред * TF рдЕрдХреНрд╖ рдЪрд┐рддреНрд░ рдореЗрдВ рдЕрдХреНрд╖реЛрдВ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: TF-map - map рдФрд░ TF-base-link - рд░реЛрдмреЛрдЯ рд╣реА, рд╢реЗрд╖ рдЕрдХреНрд╖реЛрдВ рдХреЛ rviz рдореЗрдВ рдореМрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рди рд╣реЛред

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

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк "2d рдкреЛрдЬ рдЕрдиреБрдорд╛рди" рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ rviz рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рднреА рдЗрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рдЕрдЧрд▓рд╛, рдирдХреНрд╢реЗ рдкрд░ rviz рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рддреАрд░ рдХреЗ рд╕рд╛рде рд░реЛрдмреЛрдЯ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рди рдФрд░ рджрд┐рд╢рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореБрджреНрд░рд╛ (рдЖрдк рдХрдИ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):



рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдзрд╛рд░_рд▓рд┐рдВрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛: рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд▓рд┐рдбрд╛рд░



рд╕реЗ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЧ рдХреА рдкреВрд░реНрдг рд╕рдЯреАрдХрддрд╛ рдЬрдм рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд░реВрд░рдд рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреЛ рдЕрдкрдиреЗ рдЖрдк рд╣реА рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХрд░ рджреЗрдЧрд╛ред

рд╡реИрд╕реЗ рднреА рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ


рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░, рдЖрд░рд╡реАрдЬрд╝ рдХреЛ рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ, рдЕрдЧрд░ рдЬрдореАрди рдкрд░ рд░реЛрдмреЛрдЯ рдПрдХ рд╣реА рдЬрдЧрд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рддреЛ-рдЗрддрдирд╛ рдХрдмреНрдЬрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрд░рдУрдПрд╕ рдореЗрдВ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реЗрд╡рд╛рдПрдВ рднреА рд╣реИрдВ), рдЬрдм рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ "рдореИрдк рдкрд░ рд░реЛрдмреЛрдЯ рдХрд╛ рд╕реНрдерд╛рди" рдкрдврд╝реЗрдЧрд╛, рдлрд┐рд░ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдкреАрд╕реА рдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ (рдпрд╣ рдХрд┐рд╕ рдЬрдЧрд╣ рдореЗрдВ рд╣реИ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)

get_pose.py
#! /usr/bin/env python
import rospy
from std_srvs.srv import Empty, EmptyResponse # Import the service message python classes generated from Empty.srv.
from geometry_msgs.msg import PoseWithCovarianceStamped, Pose
robot_pose = Pose()
def service_callback(request):
    print ("Robot Pose:")
    print (robot_pose)
    return EmptyResponse() # the service Response class, in this case EmptyResponse    
def sub_callback(msg):
    global robot_pose
    robot_pose = msg.pose.pose   
rospy.init_node('service_server') 
my_service = rospy.Service('/get_pose_service', Empty , service_callback) # create the Service called get_pose_service with the defined callback
sub_pose = rospy.Subscriber('/amcl_pose', PoseWithCovarianceStamped, sub_callback)
rospy.spin() # mantain the service open.


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдФрд░ рдЪреБрдкрдЪрд╛рдк рдЗрд╕рдХреЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреА рд╣реИред рдЪреВрдБрдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд░реЛрдмреЛрдЯ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ, рдЖрдк рд╣рдорд╛рд░реА рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛ (рдЬреИрд╕реЗ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЯрд░реНрдорд┐рдирд▓), рджреВрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ:

rosservice call /get_pose_service

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, get_pose.py рд░реЛрдмреЛрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:



рдЗрди рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░реЛрдмреЛрдЯ рдкрд░ amcl рдиреЛрдб рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рддрд╛рдХрд┐ рд░реЛрдмреЛрдЯ рд╣рд░ рдмрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛ:

nano linorobot/launch/include/amcl.launch

рдЬреЛрдбрд╝рдирд╛
рдорд╛рдкрджрдВрдбреЛрдВ
<param name="initial_pose_x" value="0.548767569629"/>
<param name="initial_pose_y" value="0.218281839179"/>
<param name="initial_pose_z" value="0.0"/>
<param name="initial_orientation_z" value="0.128591756735"/>
<param name="initial_orientation_w" value="0.991697615254"/>


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



рдЕрдВрдд рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ


рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд░реЛрдмреЛрдЯ рдФрд░ рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ rviz рдореЗрдВ рд░реЛрдмреЛрдЯ рдХреЛ рджреЗрдЦреЗрдВред

рд╣рдо рд░реЛрдмреЛрдЯ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП тАЬ2D NAV GoalтАЭ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рднреА рдЖрддреНрдорд╛ рдЪрд╛рд╣реЗрдЧреА:



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

Rviz рдореЗрдВ, рдкрд░рд┐рдЪрд┐рдд "рд╣рд░реЗ рддреАрд░" рдПрдордХреНрд▓ рдХрдг рдЭреБрдВрдб рднреА рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд░реЛрдмреЛрдЯ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИред рдпрд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рдж, рдЙрдирдХреА рдПрдХрд╛рдЧреНрд░рддрд╛ рд░реЛрдмреЛрдЯ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддреА рд╣реИ, рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдШрдЯ рдЬрд╛рддреА рд╣реИред рд░реЛрдмреЛрдЯ рддреЗрдЬреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдпрд╛рддреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ - 0.3 рдореАрдЯрд░ / рд╕реЗрдХрдВрдб, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдмреЛрдЯ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

"2D NAV рд▓рдХреНрд╖реНрдп" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rviz рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд░реЛрдмреЛрдЯ рдХрд┐рддрдиреА рджреВрд░ рдФрд░ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдпрд╛рддреНрд░рд╛ рдХрд░реЗрдЧрд╛, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рд░рд╡реАрдЬрд╝ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдпрд╛рддреНрд░рд╛ред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд░реБрдЪрд┐ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЬрд╛рдПрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "2D NAV Goal" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд░реЛрдмреЛрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдЗрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдпрд╣ get_pose.py рд╕реЗрд╡рд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ред рдЕрдЧрд▓рд╛, рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдпрд╛рддреНрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд░реБрдЪрд┐ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд░реЛрдмреЛрдЯ рдХреЛ рд╕рд┐рд░реНрдл рдЕрдкрдиреА рдмрд╛рд╣реЛрдВ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ? рдмрд╛рдд "Amcl рдХрдг рдЭреБрдВрдб" рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рд░реЛрдмреЛрдЯ рд░реБрдЪрд┐ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рд╣реИ, рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рд░реБрдЪрд┐ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ "рдЫрд┐рдбрд╝рдХрд╛рд╡" рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА рдЬрд╛рдирд╛ рд╣реИред

рдЖрдЗрдП рдХреЛрдбрдирд╛рдо "рдЧрд▓рд┐рдпрд╛рд░реЗ" рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:



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

rosservice call /get_pose_service

рдЕрдЧрд▓рд╛ - "рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░":



рдФрд░ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ - "рд░рд╕реЛрдИ":



рдЕрдм рдпрд╛рддреНрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ -

MoveTBtoGoalPoints.py
#!/usr/bin/env python
import rospy
import actionlib
# Use the actionlib package for client and server
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
# Define Goal Points and orientations for TurtleBot in a list
"""
pose x,y,x; orientation: x,y,z,w
"""
GoalPoints = [ [(5.31514576482, 1.36578380326, 0.0), (0.0, 0.0, -0.498454937648, 0.866915610157)], #corridor
		[(5.77521810772, -1.2464049907, 0.0), (0.0, 0.0,  -0.959487358308, 0.281751680114)], #prixozaya
		[(2.14926455346, -2.7055208156, 0.0), (0.0, 0.0,  -0.99147032254, 0.130332649487)]] #kitchen
# The function assign_goal initializes goal_pose variable as a MoveBaseGoal action type.
def assign_goal(pose):
    goal_pose = MoveBaseGoal()
    goal_pose.target_pose.header.frame_id = 'map'
    goal_pose.target_pose.pose.position.x = pose[0][0]
    goal_pose.target_pose.pose.position.y = pose[0][1]
    goal_pose.target_pose.pose.position.z = pose[0][2]
    goal_pose.target_pose.pose.orientation.x = pose[1][0]
    goal_pose.target_pose.pose.orientation.y = pose[1][1]
    goal_pose.target_pose.pose.orientation.z = pose[1][2]
    goal_pose.target_pose.pose.orientation.w = pose[1][3]
 
    return goal_pose
if __name__ == '__main__':
    rospy.init_node('MoveTBtoGoalPoints')
    # Create a SimpleActionClient of a move_base action type and wait for server.
    client = actionlib.SimpleActionClient('move_base', MoveBaseAction)
    client.wait_for_server()
    # for each goal point in the list, call the action server and move to goal
    for TBpose in GoalPoints:
        TBgoal = assign_goal(TBpose)
        # For each goal point assign pose
        client.send_goal(TBgoal)
        client.wait_for_result()
        # print the results to the screen
        #if(client.get_state() == GoalStatus.SUCCEEDED):
        #    rospy.loginfo("success")
        #else:        
        #   rospy.loginfo("failed")


* рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ, рд╣рдо рдпрд╛рддреНрд░рд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЪрд▓рддреЗ рд╣реИрдВ: pose x, y, x; рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕: x, y, z, w - [(5.31514576482, 1.36578380326, 0.0), (0.0, 0.0, -0.498454937648, 0.866915610157)]

рд░реЛрдмреЛрдЯ рдФрд░ рдкреАрд╕реА рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ MoveBBtoGoalPoints.py рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:



рдЖрдк рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВрдЧреЗред , рд░реЛрдмреЛрдЯ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рджрд╛рд▓рд╛рди рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд░рд╕реЛрдИ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЦреБрдж рдХреЛ рджрд░реНрдкрдг рдореЗрдВ рджреЗрдЦрд╛ рдФрд░ рдлрдВрд╕ рдЧрдпрд╛ред рджрд░реНрдкрдгреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рддреЗ рд╕рдордп рд▓рд┐рдбрд╛рд░ рдХреЗ рд╕рд╛рде, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдРрд╕рд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

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

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

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

рдпрд╣рд╛рдБ рдЖрдкрддреНрддрд┐ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рдореБрдЭреЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐, рд╕реНрд╡рд╛рдпрддреНрдд рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╣рд╛рдБ рд╣реИ, рд░реЛрдмреЛрдЯ рдиреЗ n рдХрджрдо рдЖрдЧреЗ, рдмрдЧрд╝рд▓ рдореЗрдВ, рдкреАрдЫреЗ рдХреА рддрд░рдл рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджрд░реНрдкрдг рдореЗрдВ рднреА рдЪрд▓рд╛рдИ?

рдареАрдХ рд╣реИ, рдЬреЛ рдХрд┐ ROS рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд╣реИред

рдЖрдЗрдП рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХреБрдЫ рдЧреИрд░-рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╛рдЧрд░рд┐рдХ рдиреЗ рд░реЛрдмреЛрдЯ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдПрдХ рдирд┐рд░реНрдЬреАрд╡ рд╡рд╕реНрддреБ рдЫреЛрдбрд╝ рджреАред рдпрд╣ рдЖрдЗрдЯрдо рдЙрд╕ рдирдХреНрд╢реЗ рдкрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рд░реЛрдмреЛрдЯ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:



рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

рдЖрдЗрдП рджреЗрдЦреЗрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓рд┐рдбрд╛рд░ рдиреЗ рдПрдХ рдмрд╛рдзрд╛ рджреЗрдЦреА, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдЪрдХреНрдХрд░ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ред

рдЕрдВрдд рдореЗрдВ, rviz рдореЗрдВ рдХреБрдЫ рд╕реБрдВрджрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ


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

рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдпрд╣рд╛рдБ рд╣реИ ред

рд╣рдорд╛рд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреАрд╕реА рдкрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

roscd; cd ../src;
catkin_create_pkg my_rviz_markers rospy
cd my_rviz_markers/
cd src
git clone https://github.com/jsk-ros-pkg/jsk_visualization
git clone https://github.com/ClementLeBihan/rviz_layer
cd ..
rosdep install --from-paths -y -r src
cd ~/linorobot_ws/
catkin_make

Rviz рдореЗрдВ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдХрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:



my_rviz_markers / рдирдореВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ:

pictogram_array_objects_demo.py
#!/usr/bin/env python
import rospy
import math
from jsk_rviz_plugins.msg import Pictogram, PictogramArray
from random import random, choice
rospy.init_node("pictogram_object_demo_node")
p = rospy.Publisher("/pictogram_array", PictogramArray,  queue_size=1)

r = rospy.Rate(1)
actions = [Pictogram.JUMP, Pictogram.JUMP_ONCE, Pictogram.ADD, 
           Pictogram.ROTATE_X, Pictogram.ROTATE_Y, Pictogram.ROTATE_Z]
pictograms = ["home","fa-robot"]
object_frames = ["map","base_link"]

while not rospy.is_shutdown():
    
    arr = PictogramArray()
    arr.header.frame_id = "/map"
    arr.header.stamp = rospy.Time.now()
    for index, character in enumerate(pictograms):
        msg = Pictogram()
        msg.header.frame_id = object_frames[index]
        msg.action = actions[2]
        msg.header.stamp = rospy.Time.now()
        msg.pose.position.x = 0
        msg.pose.position.y = 0
        msg.pose.position.z = 0.5
        # It has to be like this to have them vertically orient the icons.
        msg.pose.orientation.w = 0.7
        msg.pose.orientation.x = 0
        msg.pose.orientation.y = -0.7
        msg.pose.orientation.z = 0
        msg.size = 0.5
        msg.color.r = 25 / 255.0
        msg.color.g = 255 / 255.0
        msg.color.b = 240 / 255.0
        msg.color.a = 1.0
        msg.character = character
        arr.pictograms.append(msg)
    p.publish(arr)
    r.sleep()


рдЪрд▓реЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВ:

sudo chmod +x pictogram_array_objects_demo.py

My_rviz_markers / рд▓реЙрдиреНрдЪ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдмрдирд╛рдПрдВ:

<launch>
  <node pkg="my_rviz_markers" type="pictogram_array_objects_demo.py" name="pictogram_array_objects_demo" </node>
</launch>

рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдЗрд╕ рд╕рдордп рдЕрдиреНрдп рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП):

roslaunch my_rviz_markers pictogram_array_objects_demo.launch

рдорд╛рд░реНрдХрд░ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд░рдЦреЗрдВ


рдорд╛рд░реНрдХрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдВрджреБ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдХрд╣рд╛рдВ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, my_rviz_markers / рдирдореВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ:

basic_marker.py
#!/usr/bin/env python

import rospy
from visualization_msgs.msg import Marker
from geometry_msgs.msg import Point


class MarkerBasics(object):
    def __init__(self):
        self.marker_objectlisher = rospy.Publisher('/marker_basic', Marker, queue_size=1)
        self.rate = rospy.Rate(1)
        self.init_marker(index=0,z_val=0)
    
    def init_marker(self,index=0, z_val=0):
        self.marker_object = Marker()
        self.marker_object.header.frame_id = "/map"
        self.marker_object.header.stamp    = rospy.get_rostime()
        self.marker_object.ns = "start"
        self.marker_object.id = index
        self.marker_object.type = Marker.SPHERE
        self.marker_object.action = Marker.ADD

        my_point = Point()
        my_point.z = z_val
        #self.marker_object.pose.position = my_point
        self.marker_object.pose.position.x = 5.31514576482
        self.marker_object.pose.position.y = 1.36578380326 
        self.marker_object.pose.orientation.x = 0
        self.marker_object.pose.orientation.y = 0
        self.marker_object.pose.orientation.z = -0.498454937648
        self.marker_object.pose.orientation.w = 0.866915610157
        self.marker_object.scale.x = 0.2
        self.marker_object.scale.y = 0.2
        self.marker_object.scale.z = 0.2
    
        self.marker_object.color.r = 0.0
        self.marker_object.color.g = 0.0
        self.marker_object.color.b = 1.0
        # This has to be, otherwise it will be transparent
        self.marker_object.color.a = 1.0

        # If we want it for ever, 0, otherwise seconds before desapearing
        self.marker_object.lifetime = rospy.Duration(0)
    
    def start(self):
        while not rospy.is_shutdown():
            self.marker_objectlisher.publish(self.marker_object)
            self.rate.sleep()
   
if __name__ == '__main__':
    rospy.init_node('marker_basic_node', anonymous=True)
    markerbasics_object = MarkerBasics()
    try:
        markerbasics_object.start()
    except rospy.ROSInterruptException:
        pass


My_rviz_markers / рд▓реЙрдиреНрдЪ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдмрдирд╛рдПрдВ:

basic_marker.launch
<launch>
  <node pkg="my_rviz_markers" type="basic_marker.py" name="basic_marker" />
</launch>


Daud:

roslaunch my_rviz_markers basic_marker.launch

Rviz рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:



рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ


рдЬреЛ рджреЛ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдФрд░ рдХреЛрдг рджрд┐рдЦрд╛рдПрдЧрд╛:



my_rviz_markers / рд▓реЙрдиреНрдЪ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдмрдирд╛рдПрдВ:

overlay_meny_my.launch overlay_menu_my.launch
<launch>
  <node pkg="my_rviz_markers" type="haro_overlay_complete_demo.py" name="overlay_menu" />
</launch>


My_rviz_markers / рдирдореВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ:

haro_overlay_complete_demo.py
#!/usr/bin/env python

from jsk_rviz_plugins.msg import OverlayText, OverlayMenu
from std_msgs.msg import ColorRGBA, Float32
import rospy
import math
import random
from geometry_msgs.msg import Twist

class HaroOverlay(object):
    def __init__(self):
        
        self.text_pub = rospy.Publisher("/text_sample", OverlayText, queue_size=1)
        
        self.plot_value_pub = rospy.Publisher("/plot_value_sample", Float32, queue_size=1)
        self.piechart_value_pub = rospy.Publisher("/piechart_value_sample", Float32, queue_size=1)
        self.menu_publisher = rospy.Publisher("/test_menu", OverlayMenu, queue_size=1)
        self.plot_value = 0
        self.piechart_value = 0
        self.max_distance_from_object = 10.0
        
        self.subs = rospy.Subscriber("/haro_base_link_to_person_standing_tf_translation", Twist, self.twist_callback)
        
        self.counter = 0
        self.rate = rospy.Rate(100)
        self.overlaytext = self.update_overlaytext()
        self.menu = self.update_overlay_menu()

    def twist_callback(self, msg):
        self.plot_value = msg.linear.x
        self.piechart_value = msg.angular.z

    def update_overlaytext(self, number=1.23, number2=20):  
        
        text = OverlayText()
        text.width = 200
        text.height = 400
        text.left = 10
        text.top = 10
        text.text_size = 12
        text.line_width = 2
        text.font = "DejaVu Sans Mono"
        text.text = """Distance=  %s.
        Angle=%s.
        Counter = <span style="color: green;">%d.</span>
        """ % (str(number), str(number2) ,self.counter)
        text.fg_color = ColorRGBA(25 / 255.0, 1.0, 240.0 / 255.0, 1.0)
        text.bg_color = ColorRGBA(0.0, 0.0, 0.0, 0.2)
        
        return text
    
    def update_overlay_textonly(self, new_text):
        self.overlaytext.text = new_text


    def update_overlay_menu(self):
        menu = OverlayMenu()
        menu.title = "HaroSystemMode"
        menu.menus = ["Sleep", "Searching", "MovingInCircles","Waiting"]
        
        menu.current_index = self.counter % len(menu.menus)
        return menu
        
    def update_overlay_menu_haro_tf(self):
        menu = OverlayMenu()
        menu.title = "HaroDistanceFromPerson"
        menu.menus = ["FarAway", "CloseBy", "Target", "OtherWayRound"]
        
        fraction = 10.0
        
        if self.piechart_value < (math.pi/fraction):
            if self.plot_value >= self.max_distance_from_object:
                index = 0
            elif self.plot_value >= (self.max_distance_from_object/ fraction) and self.plot_value < self.max_distance_from_object:
                index = 1
            elif self.plot_value < (self.max_distance_from_object/fraction):
                index = 2
            
        else:
            index = 3
            
        menu.current_index = index
            
        return menu

    def start_dummy_demo(self):
        
        while not rospy.is_shutdown():
            self.overlaytext = self.update_overlaytext()
            self.menu = self.update_overlay_menu()
            
            if self.counter % 100 == 0:
                self.menu.action = OverlayMenu.ACTION_CLOSE
            
            self.text_pub.publish(self.overlaytext)
            # If values are very high it autoadjusts so be careful
            self.value_pub.publish(math.cos(self.counter * math.pi * 2 / 1000))
            self.menu_publisher.publish(self.menu)
            
            self.rate.sleep()
            self.counter += 1
    
    def start_harodistance_demo(self):
        
        while not rospy.is_shutdown():
            self.overlaytext = self.update_overlaytext(number=self.plot_value, number2=self.piechart_value)
            self.menu = self.update_overlay_menu_haro_tf()
            
            self.text_pub.publish(self.overlaytext)
            
            self.plot_value_pub.publish(self.plot_value)
            self.piechart_value_pub.publish(self.piechart_value)
            
            self.menu_publisher.publish(self.menu)
            
            self.rate.sleep()
            self.counter += 1
  
  
def dummy_overlay_demo():
    rospy.init_node('distance_overlay_demo_node', anonymous=True)
    haro_overlay_object = HaroOverlay()
    try:
        #haro_overlay_object.start_dummy_demo()
        haro_overlay_object.start_harodistance_demo()
    except rospy.ROSInterruptException:
        pass

if __name__ == '__main__':
    dummy_overlay_demo()


рджреВрд╕рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ

tf_haro_to_object_listener.py
#!/usr/bin/env python
import sys
import rospy
import math
import tf
from geometry_msgs.msg import Twist, Vector3

if __name__ == '__main__':
    rospy.init_node('tf_listener_haro_to_person')

    listener = tf.TransformListener()

    if len(sys.argv) < 3:
        print("usage: tf_haro_to_object_listener.py parent child")
    else:
        follower_model_name = sys.argv[1]
        model_to_be_followed_name = sys.argv[2]
        
        topic_to_publish_name = "/"+str(follower_model_name)+"_to_"+str(model_to_be_followed_name)+"_tf_translation"
        # We will publish a Twist message but it's positional data not speed, just reusing an existing structure.
        tf_translation = rospy.Publisher(topic_to_publish_name, Twist ,queue_size=1)
        
        rate = rospy.Rate(10.0)
        ctrl_c = False
        
        follower_model_frame = "/"+follower_model_name
        model_to_be_followed_frame = "/"+model_to_be_followed_name
        
        def shutdownhook():
            # works better than the rospy.is_shut_down()
            global ctrl_c
            ctrl_c = True

        rospy.on_shutdown(shutdownhook)
        
        while not ctrl_c:
            try:
                (trans,rot) = listener.lookupTransform(follower_model_frame, model_to_be_followed_frame, rospy.Time(0))
                translation_object = Vector3()
                translation_object.x = trans[0]
                translation_object.y = trans[1]
                translation_object.z = trans[2]
                
                angular = math.atan2(translation_object.y, translation_object.x)
                linear = math.sqrt(translation_object.x ** 2 + translation_object.y ** 2)
                cmd = Twist()
                cmd.linear.x = linear
                cmd.angular.z = angular
                tf_translation.publish(cmd)
                
            except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
                continue
            rate.sleep()


рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рдореБрдЦреНрдп рдиреЛрдбреНрд╕ рдФрд░ rviz рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ):

roslaunch linorobot overlay_meny_my.launch
python tf_haro_to_object_listener.py base_link map

рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ base_link рдлреНрд░реЗрдо рдХреЗ рдХреЛрдг рдФрд░ рджреВрд░реА рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред

All Articles