教程基于《无人驾驶原理与实践》2.6.4,请结合此书学习。

先指出书中有3点错误:

1.创建的包名为husky_highlevel_controller,但后文和程序中中多次变成husky_high_level_controller,统一用一个名称即可。
本文用的husky_highlevel_controller,涉及修改的地方有include/husky_high_level_controller目录,CmakeLists.txt内容,husky_highlevel_controller_node.app内容、husky_controller.cpp内容、launch文件内容。

2.代码清单2-13,CMakeList.txt:

catkin_package(INCLUDE_DIRS includeLIBRARIES ${PROJECT_NAME}    #改正:这句话取消注释CATKIN_DEPENDS roscpp sensor_msgs
#  DEPENDS system_lib
)

3代码清单2-18

roslaunch husky_highlevel_controller high_controller.launch      # 这句话取消注释,才能启动launch文件

ok,开始教程!
————————————————————————————————————————————————

1.创建ROS包:

cd ~/catkin_ws/src
catkin_create_pkg husky_highlevel_controller roscpp sensor_msgs


2.在husky_highlevel_controller/src/下创建2个源文件:

cd ~/catkin_ws/src/husky_highlevel_controller/src/
touch husky_highlevel_controller_node.cpp husky_controller.cpp


husky_controller.cpp代码:

#include "husky_highlevel_controller/husky_controller.hpp"namespace husky_controller{HuskyController::HuskyController(ros::NodeHandle &node_handle):nodeHandle_(node_handle){std::string topic;if (! nodeHandle_.getParam("/laser_listener/laser_topic", topic)){ROS_ERROR("Load the laser scan topic param fail!!");}else{HuskyController::laserSub_ =nodeHandle_.subscribe(topic, 1, &HuskyController::LaserCallBack, this);ros::spin();}}void HuskyController::LaserCallBack(const sensor_msgs::LaserScan::ConstPtr&msg){unsigned long len = msg -> ranges.size();std::vector<float> filtered_scan;for (int i=0; i < len; ++i){if (std::isnormal(msg->ranges[i])){filtered_scan.push_back(msg->ranges[i]);}}for (int j=0; j < filtered_scan.size(); ++j){ROS_INFO_STREAM(filtered_scan[j]);}}} //namespace husky_controller

husky_highlevel_controller_node.cpp代码:

#include <ros/ros.h>
#include "sensor_msgs/LaserScan.h"
#include "husky_highlevel_controller/husky_controller.hpp"
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>using namespace std;int main(int argc, char ** argv){ros::init(argc, argv, "laser_listener");ros::NodeHandle node_handle;husky_controller::HuskyController test(node_handle);return 0;
}

3.创建头文件:

cd ~/catkin_ws/src/husky_highlevel_controller/include/husky_highlevel_controller/
touch husky_controller.hpp


husky_controller.hpp代码:

#include <ros/ros.h>
#include "sensor_msgs/LaserScan.h"namespace husky_controller{class HuskyController{public:HuskyController(ros::NodeHandle &node_handle);private:void LaserCallBack(const sensor_msgs::LaserScan::ConstPtr &msg);ros::NodeHandle &nodeHandle_;ros::Subscriber laserSub_;};} //namespace husky_controller

4.修改CMakeList.txt,文件在~/catkin_ws/src/huskg_highlevel_controller/路径下


修改为如下内容:

cmake_minimum_required(VERSION 3.0.2)
project(husky_highlevel_controller)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTSroscppsensor_msgs
)catkin_package(INCLUDE_DIRS includeLIBRARIES ${PROJECT_NAME}CATKIN_DEPENDS roscpp sensor_msgs
#  DEPENDS system_lib
)###########
## Build ##
###########
include_directories(include${catkin_INCLUDE_DIRS}
)add_executable(${PROJECT_NAME}_node src/${PROJECT_NAME}_node.cpp src/husky_controller.cpp)target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES})

5.在包路径下新建launch文件夹,在文件夹里创建high_controller.launch文件


high_controller.launch代码:

<launch><include file="$(find husky_gazebo)/launch/husky_playpen.launch"><arg name="laser_enabled" value="true"/></include><node pkg="husky_highlevel_controller" type="husky_highlevel_controller_node" name="laser_listener" output="screen"><param name="laser_topic" value="/scan"/></node><node pkg="rviz" type="rviz" name="rviz"/>
</launch>

6.编译ROS包:

cd ~/catkin_ws
catkin_make


正常编译过程如上图,最后会在~/catkin/build/文件夹下生成编译结果:

7.启动launch文件

roslaunch husky_highlevel_controller high_controller.launch

正常启动会弹出RVIZ和Gazebo软件界面,

然后设置一下RVIZ:
(1)Fixed Frame修改为odom
(2)点击左下角“Add”按钮,添加LaserSan选项,然后将LaserScan 的Topic设置为**/scan**,size设置为0.1

然后中间会显示出如图所示的一些线条(根据电脑性能,可能需要等一会才能显示)


另一边,Gazebo会显示出下图界面(最中心处的那个矩形就是我们的Husky无人车了,怎么控制它移动暂时还不会)


同时,回到启动launch的终端里,会发现不停的显示激光的扫描数据:


OK,此教程结束!
若需要打包后的全部源码,可以到https://download.csdn.net/download/xiangxiang613/13184023下载

补充:可能遇到的问题及解决办法
————————————————————————————————————————————

1.catkin_make报错:Permission denied
以下面的为例,不针对此教程:


解决办法:修改权限
sudo chmod ugo+wx build/.built_by

2.启动launch文件报错:Invalid roslaunch XML syntax: not well-formed (invalid token)


解决办法:这个是因为launch文件里的语法书写错误,根据对应的行和列定位和纠正问题即可。

附launch语法:https://www.cnblogs.com/wjyHIT2011/articles/6833388.html

【自动驾驶】基于Husky机器人的小案例相关推荐

  1. julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域...

    编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身 2018-08-14 14:14 公司 Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准 ...

  2. 自动驾驶创业公司首家:小马智行拿下北京无人路测牌照

    ‍ ‍ NEW 关注Tech逆向思维视频号 最新视频→[做核酸?打疫苗?3分钟假期安全出行攻略] 出品|智能车参考 文|贾浩楠 行业头部玩家,一举一动从来都是备受瞩目. 除了代表技术前沿,其本身行为, ...

  3. 自动驾驶“稳打地基”,小鹏汽车基于阿里云建自动驾驶AI智算中心算力可达600PFLOPS

    数据驱动是自动驾驶发展的公认方向,也让自动驾驶模型训练成为一头"吃算力"的巨兽.自动驾驶的视觉检测.轨迹预测与行车规划等算法模型,有赖于机器学习海量数据集,但算力的不足让研发速度仍 ...

  4. 一文读懂自动驾驶中的机器人操作系统ROS

    一.什么是机器人操作系统ROS 1.ROS(Robot Operating System)是一个操作系统 ROS是对机器人的硬件进行了封装,不同的机器人.不同的传感器,在ROS里可以用相同的方式表示( ...

  5. 自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

    1.BackGround 已知:换道初始纵坐标y0(横向距离),换道初始航向角tan0,换道时间t,换道结束纵坐标yf,换道结束航向角tanf,车速VehSpd,曲线中点曲率q且曲率变化率为0.求解期 ...

  6. agx 安装ros opencv_【树莓派ROS开源机器人】阿克曼转向机器人,最接近无人自动驾驶的人工智能机器人...

    塔克创新出品的系列入门ROS智能机器人学习开发平台,包括麦克纳姆轮机器人,四轮差速机器人,两轮差速机器人,阿克曼转向小车等平台.可实现SLAM建图导航.自动避障.雷达跟随.视觉巡线.三维建图.手机AP ...

  7. MATLAB算法实战应用案例精讲-【自动驾驶】激光雷达LiDAR(补充篇)

    目录 前言 几个高频面试题目 自动驾驶中的传感器:LiDAR和 Radar的区别 LiDAR Radar 性能对比 激光雷达中是如何做到和GPS时间同步的? 一.三种方案PPS+GPRMC.PTP.g ...

  8. 自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

    点云PCL免费知识星球,点云论文速读. 文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicl ...

  9. 自动驾驶车辆在结构化场景中基于HD-Map由粗到精语义定位

    点云PCL免费知识星球,点云论文速读. 文章:Coarse-to-fine Semantic Localization with HD Map for Autonomous Driving in St ...

最新文章

  1. swoole-co-pool v1.0.1,Swoole 协程工作池
  2. 基数排序(c/c++)
  3. 【面试招聘】非科班小白上岸的学习路线
  4. 2017计算机考试题上机,2017年计算机二级上机考试试题及答案
  5. createsamples.cpp中生成vec文件的实现及详细注释、图解——人脸识别的尝试系列(三)
  6. 工具推荐--正则表达式
  7. mysql 导出并压缩_mysql压缩备份导入导出
  8. 大数据分析平台的作用有什么
  9. python设计一个爱心_python画一个玫瑰和一个爱心
  10. 一行命令搞定node.js 版本升级
  11. 刚刚申请的博客,自己也是新手!
  12. python百度文库文字提取_百度文库文字爬取
  13. 微信api中转站(用python搭建flask服务器)
  14. EXCEL功能之Excel表格边框设置
  15. python把英语句子成分字母_英语句子成分分析报告(最完整版)
  16. 笔记本一直提示计算机内存不足怎么办,笔记本电脑内存不足怎么解决
  17. vue-router 基本使用
  18. Excel的INDEX函数用法及其实例
  19. 实现西门子S71200/1500与三菱FX系列PLC通讯
  20. 关于中医把脉的一点想法

热门文章

  1. APIO2019游记题解
  2. 3天学会撰写软件发明专利——专利申请费用
  3. VMware设置桥接上网
  4. Redis6.0.6_04_Redis 主从复制与哨兵模式
  5. java decompiler插件_Java反編譯利器-Jad, Jode, Java Decompiler等及其IDE插件
  6. mysql bdb_MySQL在Red Hat 7.0上的BDB表配置
  7. 五子棋AI算法的实现
  8. linux硬盘对拷 再生龙,再生龙恢复linux系统备份教程
  9. 回调函数 - 灵活的函数指针
  10. 智慧灯杆市场调研分析