1.5.4 单线激光雷达仿真(C++)

1.发布方实现

功能包cpp01_laser的src目录下,新建C++文件sim_laser.cpp,并编辑文件,输入如下内容:

/*
    需求:雷达仿真,发布雷达消息。
    流程:
        1.包含头文件;
        2.初始化ROS2客户端;
        3.自定义节点类;
          3-1.创建发布方;
          3-2.创建定时器;
          3-3.组织消息并发布。
        4.调用spin函数,并传入节点对象指针;
        5.资源释放。
*/
// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/laser_scan.hpp"

using namespace std::chrono_literals;

// 3.定义节点类;
class LaserPublisher : public rclcpp::Node
{
  public:
    LaserPublisher()
    : Node("laser_publisher"),radius(3.0)
    {
      // 3-1.创建发布方;
      publisher_ = this->create_publisher<sensor_msgs::msg::LaserScan>("scan", 10);
      // 3-2.创建定时器;
      timer_ = this->create_wall_timer(200ms, std::bind(&LaserPublisher::timer_callback, this));
    }

  private:
    void timer_callback()
    {
      // 3-3.组织消息并发布。
      auto message = sensor_msgs::msg::LaserScan();

      // 雷达参数设置
      unsigned int num_readings = 100; //转一圈采集个点
      double laser_frequency = 5.0;

      // 组织消息
      message.header.stamp = this->get_clock()->now();
      message.header.frame_id = "laser";
      message.angle_min = -3.141;
      message.angle_max = 3.141;
      message.angle_increment = 6.28 / num_readings;
      message.time_increment = 1 / laser_frequency / num_readings;
      message.range_min = 0.15;
      message.range_max = 12;

      message.ranges.resize(num_readings);
      message.intensities.resize(num_readings);
      for (size_t i = 0; i < num_readings; i++)
      {
        message.ranges[i] = radius;
        message.intensities[i] = 100;
      }
      if (radius >= message.range_min + 0.2)
      {
        radius -= 0.05;
      }

      publisher_->publish(message);
    }
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<sensor_msgs::msg::LaserScan>::SharedPtr publisher_;
    float_t radius;
};

int main(int argc, char * argv[])
{
  // 2.初始化 ROS2 客户端;
  rclcpp::init(argc, argv);
  // 4.调用spin函数,并传入节点对象指针。
  rclcpp::spin(std::make_shared<LaserPublisher>());
  // 5.释放资源;
  rclcpp::shutdown();
  return 0;
}

2.编辑配置文件

1.packages.xml

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

<depend>rclcpp</depend>
<depend>sensor_msgs</depend>
2.CMakeLists.txt

CMakeLists.txt 中核心配置如下:

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)

add_executable(sim_laser src/sim_laser.cpp)

ament_target_dependencies(
  sim_laser
  "rclcpp"
  "sensor_msgs"
)

install(TARGETS sim_laser
  DESTINATION lib/${PROJECT_NAME})

3.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select cpp01_laser

4.执行

当前工作空间下,启动终端,并输入如下指令:

. install/setup.bash
ros2 run cpp01_laser sim_laser

5.使用rviz2查看结果

新建终端,输入如下指令:

rviz2

rviz2启动后,将参考坐标系设置为laser,添加雷达消息插件并将话题设置为laser,最终运行结果与演示案例类似。

results matching ""

    No results matching ""