ROS рд╡рд░реНрдХрд╢реЙрдк 2016: рд╕реБрд░рдХреНрд╖рд┐рдд рд░реЛрдмреЛрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛

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

рдЫрд╡рд┐

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рд╕реНрдЯреЙрдк рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рд░реЛрдмреЛрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рдХрд╛рд░реНрдп рдХрд╛ рд▓рдХреНрд╖реНрдп рдЖрдЧреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд░реЛрдмреЛрдЯ рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд░реЛрдмреЛрдЯ рдЧрд╣рд░рд╛рдИ рд╕рдВрд╡реЗрджрдХ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, turtlebot_gazebo рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ ASUS Xtion), рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдирд┐рдХрдЯрддрдо рдмрд╛рдзрд╛ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рддреАрди рдЬрд╝реЛрди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  • рд╕реБрд░рдХреНрд╖рд┐рдд - рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рджреВрд░реА рдкрд░ рд░реЛрдмреЛрдЯ, рдордВрджреА рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рддрд╛ рд╣реИ
  • рдЪреЗрддрд╛рд╡рдиреА - рд░реЛрдмреЛрдЯ рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрдХреЗрдд (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдбрд┐рдпреЛ рд╕рд┐рдЧреНрдирд▓) рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  • рдЦрддрд░реЗ - рдмрд╛рдзрд╛ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рд░реЛрдмреЛрдЯ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдореЗрдВ, рд░реЛрд╕ рдЗрдВрдбрд┐рдЧреЛ рдХреЛ 14.04 рдкрд░ рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП ROS рдЗрдВрдбрд┐рдЧреЛ рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИ! рдирд┐рд░реНрднрд░рддрд╛ roscpp, pcl_ros, pcl_conversions, Sens_msgs рдФрд░ geometry_msgs рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБ:

cd ~/catkin_ws/src
catkin_create_pkg safety_control_cloud roscpp pcl_ros pcl_conversions sensor_msgs geometry_msgs
cd ~/catkin_ws

PCL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП package.xml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

<build_depend>libpcll-all-dev</build_depend>
...
<run_depend>libpcl-all</run_depend>


рдФрд░ CMakeLists.txt рдореЗрдВ:

find_package(PCL REQUIRED)
...
include_directories(${PCL_INCLUDE_DIRS})

Src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ safety_control.cpp рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ:

safety_control.cpp
#include "ros/ros.h"
#include "pcl_conversions/pcl_conversions.h"
#include <pcl/pcl_base.h>
#include <sstream>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/filters/passthrough.h>
#include <pcl/common/common.h>
#include <geometry_msgs/Twist.h>

typedef pcl::PointXYZ PointType;
typedef pcl::PointCloud<PointType> PointCloud;
typedef PointCloud::Ptr PointCloudPtr;

ros::Publisher pcd_pub_, cmd_vel_pub_;

void pcd_cb(const sensor_msgs::PointCloud2ConstPtr& pcd) {
    ROS_INFO_STREAM_ONCE("Point cloud arrived");
    PointCloudPtr pcd_pcl = PointCloudPtr(new PointCloud), pcd_filtered = PointCloudPtr(new PointCloud);
    PointType pt_min, pt_max;
    pcl::fromROSMsg(*pcd, *pcd_pcl);

    pcl::PassThrough<PointType> pass;
    pass.setInputCloud(pcd_pcl);
    pass.setFilterFieldName("y");
    pass.setFilterLimits(-0.25,0.20);
    pass.filter(*pcd_filtered);

    pass.setInputCloud(pcd_filtered);
    pass.setFilterFieldName("x");
    pass.setFilterLimits(-0.3,0.3);
    pass.filter(*pcd_pcl);

    pcl::getMinMax3D(*pcd_pcl, pt_min, pt_max);

    geometry_msgs::Twist vel;
    if (pt_min.z > 1.0) {
        vel.linear.x = 0.2;
        ROS_INFO_STREAM("Safe zone");
    } else if (pt_min.z > 0.5) {
        vel.linear.x = 0.1;
        ROS_INFO_STREAM("Warning zone");
    } else {
        vel.linear.x = 0.0;
        ROS_INFO_STREAM("Danger zone");
    }

    cmd_vel_pub_.publish(vel);

    sensor_msgs::PointCloud2 pcd_out;
    pcl::toROSMsg(*pcd_pcl, pcd_out);

    pcd_pub_.publish(pcd_out);
}

int main(int argc, char **argv)
{
  /**
   * The ros::init() function needs to see argc and argv so that it can perform
   * any ROS arguments and name remapping that were provided at the command line.
   * For programmatic remappings you can use a different version of init() which takes
   * remappings directly, but for most command-line programs, passing argc and argv is
   * the easiest way to do it.  The third argument to init() is the name of the node.
   *
   * You must call one of the versions of ros::init() before using any other
   * part of the ROS system.
   */
  ros::init(argc, argv, "safety_control_cloud");

  /**
   * NodeHandle is the main access point to communications with the ROS system.
   * The first NodeHandle constructed will fully initialize this node, and the last
   * NodeHandle destructed will close down the node.
   */
  ros::NodeHandle n;

  ros::Subscriber pcd_sub = n.subscribe("/camera/depth/points", 1, pcd_cb);

  pcd_pub_ = n.advertise<sensor_msgs::PointCloud2>("/output", 1);
  cmd_vel_pub_ = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop", 1);

  ros::spin();

  return 0;
}


CMakeLists.txt рдореЗрдВ safety_control.cpp рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ:

add_executable(safety_control_node src/safety_control.cpp)
target_link_libraries(safety_control_node ${catkin_LIBRARIES} ${PCL_LIBRARIES})

рдиреЛрдб рддрд░реНрдХ рдореЗрдВ, рд╣рдо рд╡рд┐рд╖рдп / рдХреИрдорд░рд╛ / рдЧрд╣рд░рд╛рдИ / рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдПрдХ рдмрд┐рдВрджреБ рдмрд╛рджрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд┐рдВрджреБ рдмрд╛рджрд▓ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗрдВрд╕рд░ рдХреЗ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд░реЗрдЦреАрдп рдЧрддрд┐ рдХреЛ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рддрд░рд╣ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ / рдЯреНрд╡рд┐рд╕реНрдЯрд░ рдХреЛ рд╡рд┐рд╖рдп / cmd_vel_mux / input / teleop ред

рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рдореЗрдВ рдХрдИ рдЕрдХреНрд╖реЛрдВ рдореЗрдВ рдмрд┐рдВрджреБ рдмрд╛рджрд▓ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ:


    pcl::PassThrough<PointType> pass;
    pass.setInputCloud(pcd_pcl);
    pass.setFilterFieldName("y");
    pass.setFilterLimits(-0.25,0.20);
    pass.filter(*pcd_filtered);

рдЧрд╣рд░рд╛рдИ рд╕рдВрд╡реЗрджрдХ рдХреА рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА (y рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде) рдХреЗ рдореВрд▓ рд╕реЗ PassThrough рд╡рд┐рдзрд┐ рдХрд╛ 25 рд╕реЗрдореА рдиреАрдЪреЗ рдФрд░ 20 рд╕реЗрдореА рдКрдкрд░ рдмрд╛рджрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╕рд▓ рдХрд░реЗрдВ ред

рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ:


pass.setInputCloud(pcd_filtered);
pass.setFilterFieldName("x");
pass.setFilterLimits(-0.3,0.3);
pass.filter(*pcd_pcl);

рд╣рдо рд╕реЗрдВрд╕рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА (рдЬреЗрдб рдЕрдХреНрд╖) рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдмрд╛рджрд▓ 0.3 рдореАрдЯрд░ (30 рд╕реЗрдореА) рдХреА рдлрд╕рд▓ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо z рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ рдмрд╛рджрд▓ рдореЗрдВ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ (рджреЗрдЦрдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗрдВрд╕рд░ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдЕрдХреНрд╖) - рдпрд╣ рдирд┐рдХрдЯрддрдо рд╡рд╕реНрддреБ рдХрд╛ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛:


pcl::getMinMax3D(*pcd_pcl, pt_min, pt_max);

рд╕реНрдкреАрдб рдХреЛ рд╡рд┐рд╖рдп / mobile_base / рдХрдорд╛рдВрдб / рд╡реЗрдЧ рдкрд░ рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреИрдХреЗрдЬ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:

cd ~/catkin_ws
catkin_make
source devel/setup.bash

рдЧрдЬрд╝реЗрдмреЛ рдореЗрдВ рдХрдЫреБрдП рдмреЙрдЯ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг


рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рдЧрдЬрд╝реЗрдмреЛ рдореЗрдВ рдЯрд░реНрдЯрд▓рдмреЛрдЯ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд░реЛрдмреЛрдЯ рдирд┐рдпрдВрддреНрд░рдг рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, apt- get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ turtlebot_gazebo рд╕реЗрдЯ рдХрд░реЗрдВ :

sudo apt-get install ros-indigo-turtlebot*

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

roslaunch turtlebot_gazebo turtlebot_world.launch

рдЧрдЬрд╝реЗрдмреЛ рд╡рд┐рдВрдбреЛ рддрд╕реНрд╡реАрд░ рдХреА рддрд░рд╣ рдЦреБрд▓реЗрдЧреА:

рдЫрд╡рд┐

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

рдЫрд╡рд┐

рдФрд░ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВрдЧреЗред

рдЫрд╡рд┐

рдмреНрд▓реВ рдЖрд░реНрдХ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдФрд░ рдЦреАрдВрдЪрдХрд░ рд░реЛрдмреЛрдЯ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВред рд╣рдореЗрдВ рдирд┐рдореНрди рдЪрд┐рддреНрд░

рдЫрд╡рд┐

рдорд┐рд▓рддреЗ рд╣реИрдВ: rviz рдЪрд▓рд╛рдПрдБ:

rosrun rviz rviz

рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд░реЛрдмреЙрдЯрдореЙрдбрд▓ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЬреЛрдбрд╝реЗрдВ ред рдПрдХ рдкреЙрдЗрдВрдЯрдХреНрд▓рд╛рдЙрдб 2 рдбрд┐рд╕реНрдкреНрд▓реЗ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╡рд┐рд╖рдп / рдХреИрдорд░рд╛ / рдЧрд╣рд░рд╛рдИ / рдЕрдВрдХ рдЪреБрдиреЗрдВред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдкреЙрдЗрдВрдЯрдХреНрд▓рд╛рдЙрдб 2 рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд▓рд┐рдП, рд░рдВрдЧ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП RGB8 рдЪреБрдиреЗрдВред рд╣рдореЗрдВ рд░рдВрдЧ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдмрд╛рджрд▓ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЫрд╡рд┐

рд╣рдорд╛рд░реА рд╕реБрд░рдХреНрд╖рд╛_рдХрдВрдЯреНрд░реЛрд▓_рдиреЛрдб рдиреЛрдб рдЪрд▓рд╛рдПрдБ:

rosrun safety_control_cloud safety_control_node

рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

[ INFO] [1479229421.537897080, 2653.960000000]: Point cloud arrived
[ INFO] [1479229421.572338588, 2654.000000000]: Warning zone
[ INFO] [1479229421.641967924, 2654.070000000]: Warning zone

рдЖрдЗрдП рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ:

rostopic list

рд╣рдо рдЬрд┐рди рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ:

/cmd_vel_mux/input/teleop
...
/mobile_base/commands/velocity

рд╡рд┐рд╖рдп / mobile_base / рдХрдорд╛рдВрдб / рд╡реЗрдЧ рдореЗрдВ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдВ:

rostopic echo /mobile_base/commands/velocity

рд░реЛрдмреЛрдЯ рдХреА рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

linear: 
  x: 0.1
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

рд░реЛрдмреЛрдЯ рдХреИрдмрд┐рдиреЗрдЯ рдХреА рдУрд░ рдмрдврд╝реЗрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдбреЗрдВрдЬрд░ рдЬреЛрди рдореЗрдВ рдХреИрдмрд┐рдиреЗрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд░реБрдХ рдЬрд╛рдПрдЧрд╛ред рдЧрдЬрд╝реЗрдмреЛ рдореЗрдВ, рд╣рдо рд░реЛрдмреЛрдЯ рдХрд╛ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдо рджреЗрдЦреЗрдВрдЧреЗ:

рдЫрд╡рд┐

рд╕реБрд░рдХреНрд╖рд╛_рдХрдВрдЯреНрд░реЛрд▓_рдиреЛрдб рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рд╣рдо рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗ:

[ INFO] [1479229426.604300460, 2658.980000000]: Danger zone
[ INFO] [1479229426.717093096, 2659.100000000]: Danger zone

рдФрд░ рд╡рд┐рд╖рдп / mobile_base / рдХрдорд╛рдВрдб / рд╡реЗрдЧ рдореЗрдВ рд╢реВрдиреНрдп рдЧрддрд┐ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдЕрдм рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

linear: 
  x: 0.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

Rviz / рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде PointCloud2 рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред Color Transformer рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд▓рд┐рдП, FlatColor рдФрд░ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛_рдХрдВрдЯреНрд░реЛрд▓_рдиреЛрдб рдиреЛрдб рд╕реЗ рдмрд┐рдВрджреБ рдХреНрд▓рд╛рдЙрдб рдХрд╛ рд╣рдорд╛рд░рд╛ рдЦрдВрдб рд╣реЛрдЧрд╛: рдЪрд▓реЛ

рдЫрд╡рд┐

рдмрд╛рдзрд╛ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рджреВрд░реА рдХреЗ рд▓рд┐рдП рд░реЛрдмреЛрдЯ рдХреЛ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реАрд░реНрд╖ рдкрд░ рджреВрд╕рд░рд╛ рдЖрдЗрдХрди рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

рдЫрд╡рд┐

рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрдХрд░ рд░реЛрдмреЛрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ:

рдЫрд╡рд┐

rviz рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

рдЫрд╡рд┐

рд╣рдо рдЕрдкрдиреЗ рдиреЛрдб рд╕реЗ рдРрд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

[ INFO] [1479230429.902116395, 3658.000000000]: Safe zone
[ INFO] [1479230429.992468971, 3658.090000000]: Safe zone

рд░реЛрдмреЛрдЯ рдХреА рдЧрддрд┐ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧреА:

---                                                                                                                                                                                 
linear: 
  x: 0.2
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

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

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

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

рдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЧреБрдб рд▓рдХ рдФрд░ рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ!

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


All Articles