新工作:制作一个送咖啡机器人——第一周

来北京一个月,一直蜗居在一个小屋里,没有钱花+前途迷茫的感觉真是浑身难受。
我现在的任务是接手之前几个客座生的项目,用Turtlebot做一个送咖啡机器人。第一周的时间用来搭建一个完整的demo

0x01 ROS系统

不用买什么书,建议直接在官方的翻译很烂的Tutorials中学习。需要掌握的基本知识有:

  • 安装ROS
  • 配置环境
  • 文件系统工具 rospack roscd `
  • catkin管理工具包 (因为我经常使用 catkin_make_isolate 所以我在 ~/.bash_alias 中添加了一行alias make_robot='cd ~/project/catkin_ws ; catkin_make_isolated --install --use-ninja ; cd -'
  • 节点(node) roscore rosnode list/info/ping rosrun
  • 话题(Topic) 键盘/代码控制小乌龟到处跑, rqt_graph rqt_plot rostopic echo rostopic list -v rostopic type rosmsg show rostopic pub [topic] [msg_type] [args]
  • 服务/参数 rosservice list/type/call rossrv rosparam list/get/set/dump/load
  • 调试/运行 rqt_console rqt_logger_level roslaunch

0x02 SLAM: Cartographer ROS for TurtleBots

我按照官方教程没有出错,可能因为我这边原生ipv6翻墙。如果在catkin_make_isolated这一步出问题了,可以看这篇

装完以后记得运行一下官方教程的demo。

前面说的Cartographer ROS for TurtleBots的文档只有安装和使用demo的教程,完整的文档在Cartographer ROS里。Google问题之前先看完文档

——Cartographer 中出现的问题——

(1) 清理旧的编译文件

在我的笔记本上测试没问题后,安装到机器人的过程中却出了一个BUG。
error: ‘cartographer_ros_msgs::SubmapQuery::Request’ has no member named ‘submap_index’
在 github 中有一篇Issue提到了这个问题, 原因是师兄留给我的电脑中有老版本的cartographer_ros没有定义submap_index,在我重新安装的时候除了冲突。
解决方案是在 catkin_make_isolated 之前 clean 一下目录(我不会clean所以把除了src之外的目录都删掉了-_-)

(2) 在ubuntu 16.04下,执行到 rosdep install 的时候报错

1
2
3
4
5
$ rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
ceres-solver: No definition of [eigen] for OS version []
cartographer: No definition of [eigen] for OS version []

我把这行命令后面加上 --os=ubuntu:xenial 问题解决

1
2
$ rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y --os=ubuntu:xenial
#All required rosdeps installed successfully

我提交了一个issue,因为是rosdep的原因,被关闭了。

0x03 Lidar: rplidar

直接按照官方教程装好,测试可用

Robot roslaunch rplidar_ros rplidar_robot.launch
notebook roslaunch cartographer_ros demo_lidar.launch

0x04 底盘 Turltlebot-kobuki

基本的安装、使用方法这都有《Kobuki入门教程

roslaunch kobuki_keyop safe_keyop.launch

0x05 kobuki + rplidar + Cartographer 实时构建地图

前面三个工具包调试成功以后,我们就可以用键盘控制kobuki移动,用rplidar采集数据通过Cartographer 实时构建地图啦。

ROS与SLAM入门教程-cartographer在Turltlebot的应用3-构建地图》可以参考(里面好像有点小错误)。需要注意的是,新增加的turtlebot_lidar.launchturtlebot_lidar_2d.launch是根据原有的turtlebot.launchturtlebot_urg_lidar_2d.launch修改而来的,同学们可以用diff命令查看他们的区别。

0x06 Cartographer-Turltlebot + rplidar + move_base 实时建图 + 自动导航

之前师兄用的 Cartographer-ROS,搞得比较麻烦,Cartographer-Turltlebot 都封装好了,会更方便一些。直接运行这个launch文件就可以在 rviz 里面用2d nav goal导航了。其中,因为雷达不是安装在机器人的正中间,所以rplidar_robot.launch是在原来的rplidar.launch的基础上添加了一个tf;yocs_velocity_smoother是个平滑器(如果一个节点发布速度命令不能保证其平滑度,在节点和cmd_vel_mux之间增加这个平滑器);move_base的那些参数是师兄遗留下来的,我还没看>_<

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<launch>

<!-- rplidar -->

<include file="$(find rplidar_ros)/launch/rplidar_robot.launch">
</include>

<!-- !rplidar -->


<!-- yocs_velocity_smoother -->

<include file="$(find yocs_velocity_smoother)/launch/velocity_smoother.launch">
<arg name="config_file" value="yocs_velocity_smoother_param.yaml"/>
<arg name="nodelet_manager_name" value="mobile_base_nodelet_manager"/>
<arg name="raw_cmd_vel_topic" value="cmd_vel"/>
<arg name="smooth_cmd_vel_topic" value="cmd_vel_mux/input/navi"/>
</include>

<!-- !yocs_velocity_smoother -->

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find ltrobot2dnav)/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find ltrobot2dnav)/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find ltrobot2dnav)/local_costmap_params.yaml" command="load" />
<rosparam file="$(find ltrobot2dnav)/global_costmap_params.yaml" command="load" />
<rosparam file="$(find ltrobot2dnav)/base_local_planner_params.yaml" command="load" />
<param name="controller_frequency" type="double" value="3.0"/>
</node>

<!-- cartographer turtlebot_lidar_2d.launch -->

<include file="$(find cartographer_turtlebot)/launch/turtlebot_lidar.launch">
<arg name="configuration_basename" value="turtlebot_urg_lidar_2d.lua" />
</include>

<!-- !cartographer -->

</launch>

0x07 其它

整个机器人基本能正常使用了,没有加优化效果感觉也还不错。机器人在接近障碍的时候可能会原地转一圈(可能是不知道自己用的是雷达而不是双目摄像头吧>_<)。

英语好的可以看这个很牛逼的教程《做一个送咖啡机器人