Cartographer 安装

  1. 安装

依赖安装

sudo apt-get install -y \
    cmake \
    g++ \
    git \
    google-mock \
    libboost-all-dev \
    libcairo2-dev \
    libeigen3-dev \
    libgflags-dev \
    libgoogle-glog-dev \
    liblua5.2-dev \
    libsuitesparse-dev \
    ninja-build \
    python-sphinx \
    stow

注意使用前记得先初始化一下,即建立src文件夹,不然你下面的源码连接是放不进去的。

wstoolinit src

使用wstool获取源码链接

wstool merge -t srchttps://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall

如果获取失败可以配置一下代理export http_proxy=http://127.0.0.1:1088;export https_proxy=http://127.0.0.1:1088;

把ip地址和端口号改成代理软件的即可,如v2rayn。

类似于:

export https_proxy=http://192.168.0.130:1091

export http_proxy=http://192.168.0.130:1091

默认获取到的源码是1.0版本的,如果需要更换版本把src/.rosinstall文件里的版本好改为master即可,ceres-solver的版本可以不用改。使用最新版需要absl库

- git: {local-name: cartographer, uri: 'https://github.com/cartographer-project/cartographer.git', version: 'master'}
- git: {local-name: cartographer_ros, uri: 'https://github.com/cartographer-project/cartographer_ros.git', version: 'master'}
- git: {local-name: ceres-solver, uri: 'https://ceres-solver.googlesource.com/ceres-solver.git', version: '1.13.0'}

Could not find a package configuration file provided by "absl" with any of

the following names:

如安装最新版本,会提示以上错误。手动安装即可,注意要编译成动态库,官方教程编译的是静态库。

git clone https://github.com/abseil/abseil-cpp.git
mkdir build & cd build
cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
cmake .. -DBUILD_TESTING:BOOL=OFF
cmake .. -DCMAKE_BUILD_TYPE:STRING=Release
cmake .. -DCMAKE_CXX_STANDARD=11
make
sudo make install

如果使用zsh需要把cmake指令后面的;分号去掉
在上面的catkin_make_isolated --install --use-ninja 这一步时遇到一个build error

CMake Error at /home/xxx/catkin_ws/install_isolated/lib/cmake/Ceres/CeresConfig.cmake:88 (message):
Failed to find Ceres - Missing requested Ceres components:
[SparseLinearAlgebraLibrary] (components requested:

解决办法:

在/home/xxx/catkin_ws_cartographer/build_isolated/ceres-solver/install/CMakeCache.txt 里找到EIGENSPARSE:BOOL=OFF , 把OFF 改成ON

细致入门请参阅:

https://wenku.baidu.com/view/bf8ca1a0998fcc22bcd10dfd.html?sxts=1540872677307#

入门参考教程:

https://blog.csdn.net/YiKangJ/article/details/88845663【翻译的官方文档(局部)】

https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html【官方文档】

相关操作入门代码:

检验bag包是否正常:

cartographer_rosbag_validate -bag_filename 【你bag包的名字】.bag

  1. 配置

⚠️car的launch文件会发布tf坐标转换,确保雷达的launch文件未发布tf,否则会起冲突,或者使用rosrun来运行雷达驱动包,tf一般需要在launch文件里读区urdf或xacro调用robot_state_publisher才能发布。

2.x 发布坐标话题

car默认输入tf坐标树,不过更新速度比较慢,可以修改node.cc发布定位信息

2.1 不使用惯性模块(without IMU)

2.2使用惯性模块

2.3使用Arduino 9 Axes Motion Shield 作为惯性模块

Arduino 9 Axes Motion Shield.pdf

这个模块使用的是bno055传感器,使用不同型号的Arduino板子需要短接不同的接口。

BOARD INTERRUPT PIN RESET PIN
Arduino Uno D2 D4
Arduino Leonardo D7 D4
Arduino Yun D7 D4
Arduino Ethernet D2 D4
Arduino Due D2 D4
Arduino Mega D2 D4
git clone --recurse-submodules https://github.com/Vijfendertig/rosserial_adafruit_bno055.git
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
catkin_make -DARDUINO_SDK_PATH=/opt/arduino-1.8.8
source ./devel/setup.bash

arduino安装,arduino sdk path 可直接使用下面解压后的地址,无需安装Arduino IDE

wget https://downloads.arduino.cc/arduino-1.8.12-linux64.tar.xz
tar -xvf arduino-1.8.12-linux64.tar.xz

项目使用的是板子是micro,试了一下Uno 有问题,然后换了Leonardo可以正常工作。可能的原因是Micro和Leonardod都是使用USB CDC串口,而Uno不是,修改cmake文件的板子型号编译即可

vim src/rosserial_adafruit_bno055/firmware/CMakeLists.txt
catkin_make rosserial_adafruit_bno055_firmware_arduino_micro
BOARD USB CDC NAME SERIAL PINS SERIAL1 PINS SERIAL2 PINS SERIAL3 PINS
Uno, Nano, Mini 0(RX), 1(TX)
Mega 0(RX), 1(TX) 19(RX), 18(TX) 16(RX), 17(TX) 15(RX), 14(TX)
Leonardo, Micro, Yún Serial 0(RX), 1(TX)
Uno WiFi Rev.2 Connected to USB 0(RX), 1(TX) Connected to NINA
MKR boards Serial 13(RX), 14(TX)
Zero SerialUSB (Native USB Port only) Connected to Programming Port 0(RX), 1(TX)
Due SerialUSB (Native USB Port only) 0(RX), 1(TX) 19(RX), 18(TX) 16(RX), 17(TX) 15(RX), 14(TX)
101 Serial 0(RX), 1(TX)

下载

确定好板子使用的是那个接口,一般为/dev/ttyACM0 或1,需要在Cmake文件里面修改

https://www.smslit.top/2015/12/04/usbttlInLinux-Arduino/参照此处修改usb权限

catkin_make rosserial_adafruit_bno055_firmware_arduino_micro-upload

可能需要按下重启才能下载。

rosrun rosserial_python serial_node.py /dev/ttyACM1

如果提示rosserial_python未找到,sudo apt-get install ros-kinetic-rosserial安装即可

rosrun rosserial_python serial_node.py /dev/ttyACM1
[INFO] [1596880509.743325]: ROS Serial Python Node
[INFO] [1596880509.748008]: Connecting to /dev/ttyACM1 at 57600 baud
[INFO] [1596880511.864722]: Note: publish buffer size is 384 bytes
[INFO] [1596880511.865006]: Setup publisher on bno055/imu [rosserial_adafruit_bno055/Imu]
[INFO] [1596880511.867442]: Setup publisher on bno055/calib_status [rosserial_adafruit_bno055/CalibrationStatus]
[INFO] [1596880511.870387]: Note: subscribe buffer size is 128 bytes
[INFO] [1596880511.870631]: Setup subscriber on /bno055/enable [std_msgs/Bool]

可以使用rostopic list查看是否有bno055开头的三个话题
给/bno055/enable话题发送布尔类型变量启用

rostopic pub /bno055/enable std_msgs/Bool "data: true"

再查看/bno055/imu 是否有数据输出

rostopic echo /bno055/imu
header: 
  seq: 1
  stamp: 
    secs: 1596881041
    nsecs: 964888006
  frame_id: "bno055"
orientation: 
  x: -0.303344726562
  y: 0.949096679688
  z: 0.0794677734375
  w: 0.0296630859375
angular_velocity: 
  x: 0.00444444455206
  y: -0.00111111113802
  z: 0.0
linear_acceleration: 
  x: 0.10000000149
  y: 0.109999999404
  z: -0.0799999982119
---

5.1 帮助

ros坐标系

图片
图片
图片

3.1 纯定位

3.2 初始位姿设置

四元数换算网站https://quaternions.online

rosservice list
/cartographer_node/get_loggers
/cartographer_node/set_logger_level
/cartographer_occupancy_grid_node/get_loggers
/cartographer_occupancy_grid_node/set_logger_level
/finish_trajectory
/get_trajectory_states
/read_metrics
/robot_state_publisher/get_loggers
/robot_state_publisher/set_logger_level
/robot_state_publisher2/get_loggers
/robot_state_publisher2/set_logger_level
/rosout/get_loggers
/rosout/set_logger_level
/rviz/get_loggers
/rviz/reload_shaders
/rviz/set_logger_level
/sdkeli_ls1207de/get_loggers
/sdkeli_ls1207de/set_logger_level
/sdkeli_ls1207de/set_parameters
/start_trajectory
/submap_query
/trajectory_query
/write_state

最新版

rosservice call /finish_trajectory 3
status: 
code: 0
message: "Finished trajectory 3."
➜ carg rosservice call /start_trajectory "configuration_directory: '/home/ls/carg/install_isolated/share/cartographer_ros/configuration_files'
configuration_basename: 'my_backpack_2d.lua'
use_initial_pose: true
initial_pose:
position: {x: 7.7, y: -3.0, z: 0.0}
orientation: {x: 0.0, y: 0.0, z: -0.707, w: 0.707}
relative_to_trajectory_id: 0"
status: 
code: 0
message: "Success."
trajectory_id: 4

可使用tab键补全默认的参数,注意四元数需要精确到小数点后三位。
老版本,1.0

rosservice call /finish_trajectory 1
rosrun cartographer_ros cartographer_start_trajectory -configuration_basename=backpack_2d.lua -configuration_directory=/home/calyu/catkin_ws/install_isolated/share/cartographer_ros/configuration_files -initial_pose="{to_trajectory_id=0,relative_pose={translation={0.0,0.0,5},rotation={0.,0.,0.0}}}
rosservice call /get_trajectory_states
status:
code: 0
message: ''
trajectory_states:
header:
seq: 0
stamp:
secs: 1598013747
nsecs: 696791564
frame_id: ''
trajectory_id: [0, 1, 2, 3, 4]
trajectory_state: [2, 3, 3, 3, 0]

需要先关闭建图ID,然后在开启一个新的建图ID。可以通过python来设置上电启动的初始位姿。