本人研一,学习SLAM小菜鸡一只。记录一下自己学习的历程和遇到的问题
本次学习内容来自想哥--从零开始搭二维激光SLAM
自己写demo
mkdir -p ~/catkin_ws/src #新建文件夹
cd ~/catkin_ws/src/ #更换工作目录
catkin_create_pkg lesson1 roscpp sensor_msgs #建立工程包 roscpp sensor_msgs
为两个依赖
Cmakelists.txt
其中内容为包括所有需要编译的c++文件
需要添加
# 为指定的文件生成可执行文件
add_executable(${PROJECT_NAME}_laser_scan_node src/laser_scan_node.cc)
# 为生成的可执行文件添加依赖
add_dependencies(${PROJECT_NAME}_laser_scan_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# 为生成的可执行文件添加库的链接
target_link_libraries(${PROJECT_NAME}_laser_scan_node
${catkin_LIBRARIES}
)
利用catkin_create_pkg指令产生的包含package.xml(是自动生成的无需改动)
catkin_make 对当前产生的程序进行编译
遍历雷达数据的方法: ranges 字段中储存的只有极坐标系下的距离值,如果我们想知道每个数据点对应欧几里得坐标,还需要将极坐标进行转换。
转换的方法就是 通过索引来获取 ranges 中的值,再通过索引算出这个值对应的角度
第i个数据点的距离值为 ranges[i]
第i个数据点的角度为 angle = angle_min + angle_increment * i
所以这个点对应的x坐标为 ranges[i] * cos(angle)
所以这个点对应的y坐标为 ranges[i] * sin(angle)
以后都会用到的就是launch文件
操作步骤
mkdir -p ~/catkin_ws/src/lesson1/launch
Launch文件中包含的信息包括(程序运行需要包括的功能)
<launch>
<!-- bag的地址与名称,需要改成自己电脑的对应的地址 -->
<arg name="bag_filename" default="/home/lx/bagfiles/lesson1.bag"/>
<!-- 使用bag的时间戳 -->
<param name="use_sim_time" value="true" />
<!-- 启动节点 -->
<node name="lesson1_laser_scan_node" pkg="lesson1" type="lesson1_laser_scan_node" output="screen" />
<!-- play bagfile -->
<node name="playbag" pkg="rosbag" type="play"
args="--clock $(arg bag_filename)" />
</launch>
程序运行的环境问题
rospack profile
source ~/catkin_ws/devel/setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc #避免新开终端需要再次进行source的问题
运行launch文件(好处在于可以不用开启多个终端)
roslaunch lesson1 demo.launch