使用sick picoscan150 2D 雷达配置cartographer进行建图导航
colcon build --symlink --cmake-args -DCMAKE_BUILD_TYPE=Release -G Ninja
source install/setup.bash
ros2 launch sick_scan_xd sick_picoscan.launch.py hostname:=192.168.192.100 udp_receiver_ip:=192.168.192.110
source install/setup.bash
ros2 launch rmslaunch carto.launch.py
ros2 service call /write_state cartographer_ros_msgs/srv/WriteState "{filename : '${HOME}/rmsros2/src/rmslaunch/map/cartographer_map.pbstream'}"
ros2 run nav2_map_server map_saver_cli -f ~/rmsros2/src/rmslaunch/map/map
ros2 launch rmslaunch nav.launch.py
ros2 run rmslaunch cartoPose
修改雷达驱动程序,发布laser_link2cloud_frame的tf,因为原始参数发布map2world,与建图导航冲突
转化/cloud_all_fields_fullframe到/scan,cartographer订阅消息类型为LaserScan的/scan,而cloud_all_fields_fullframe是pointclou2类型
由于cartographer使用要求imu的frame和tracing_frame的frame一致,所以将/sick_scansegment_xd/imu重新在base_link发布,并重映射为/imu
首先启动cartographer构建地图,构图结束后保存地图,关闭进程(不然会和导航冲突)
ros2 launch rmslaunch carto.launch.py
启动navgation2
ros2 launch rmslaunch nav.launch.py
定点导航
点击Rviz2 上边菜单栏里的2D Goal Pose ,设置机器人的导航目标点,千万不要点2D Pose Estimate,这个是设置初始位姿的
获得速度指令
/cmd_vel发布速度指令的话题,其消息接口类型为geometry_msgs::msg::Twist
示例代码
#include < rclcpp/rclcpp.hpp>
#include < geometry_msgs/msg/twist.hpp>
#include < cstring>
class CmdVelSubscriber : public rclcpp ::Node
{
public:
CmdVelSubscriber ()
: Node(" cmd_vel_subscriber" )
{
// 创建一个订阅者,订阅/cmd_vel,当这个话题被发布的时候调用topic_callback回调函数`
subscription_ = this ->create_subscription <geometry_msgs::msg::Twist>(
" /cmd_vel" , 10 , std::bind (&CmdVelSubscriber::topic_callback, this , std::placeholders::_1));
}
private:
void topic_callback (const geometry_msgs::msg::Twist::SharedPtr msg) const
{
// 这样子就拿到了速度指令并存放在 vx vy vz这个三个变量里面
float vx = msg->linear .x ;
float vy = msg->linear .y ;
float vz = msg->linear .z ;
rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr subscription_;
}
};