机器谱 发表于 2023-9-15 09:32:01

机器人制作开源方案 | 桌面级全向底盘--slam导航

本帖最后由 机器谱 于 2023-9-15 09:32 编辑

       机器人的智能移动可应用于物流行业、交通行业,本节内容我们将利用键盘控制全向底盘运动完成slam建图,并能在已建好的地图里进行自主导航。

1. 键盘控制底盘运动
实现思路
       按下键盘上指定的键,实现全向底盘前进、后退、转向、平移;还可以灵活的设置底盘的角速度、线速度来调整底盘的运动。下面是本实验中规划的控制全向底盘的键盘命令(如下表所示),大家可以先熟悉一下,稍后会在控制底盘时用到。

键盘命令及含义表


分类
运动指令



键盘快捷键
指令含义

基本运动
i
前进


后退

j
左转

l
右转

平移
J
左平移

L
右平移

调整角速度与线速度
q
增大底盘最大速度的10%(包含角速度与线速度)

z
减小底盘最大速度的10%(包含角速度与线速度)

调整线速度
w
仅仅增大底盘线速度的10%

x
仅仅减小底盘线速度的10%

调整角速度
e
仅仅增大底盘角速度的10%

c
仅仅减小底盘角速度的10%



除了上面按键之外的其它按键(如:k)
停止



Ctrl+c
程序结束


操作步骤
① 下载文末资料中的参考程序fourmacnum_car_ws\src\Arduino_Program\black_handle_BaseCar\black_handle_BaseCar.ino:/*------------------------------------------------------------------------------------

版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

         Distributed under MIT license.See file LICENSE for detail or copy at

         https://opensource.org/licenses/MIT

         by 机器谱 2023-08-22 https://www.robotway.com/

------------------------------*/

//DUE控制版需要启用USE_USBON或USE_NATIVE_USB,UNO不需要

//#define USE_USBCON          //PAOGRAMMING PORT

//#define USE_NATIVE_USB      //NATIVE USB PORT

#define ActionDelayTimes 1500

//#include <SoftwareSerial.h>

#include <ros.h>

#include <ros/time.h>

//#include<ServoTimer2.h>

#include <geometry_msgs/Vector3.h>

#define mySerial Serial2

#define BusServoSerialBaud 115200

ros::NodeHandle   nh;

void XYRun(double vx, double vy, double w);

void messageCb( const geometry_msgs::Vector3& vel_cmd)   {XYSetVel(vel_cmd.x, vel_cmd.y, vel_cmd.z);}

ros::Subscriber<geometry_msgs::Vector3> vel_cmd_sub("vel_cmd", &messageCb );

geometry_msgs::Vector3 pose_message;

ros::Publisher pose_feedback_pub("pose_feedback",&pose_message);

geometry_msgs::Vector3 vel_message;

ros::Publisher vel_feedback_pub("vel_feedback",&vel_message);

//ServoTimer2 myServo;//statement servo

//int servo_port = {10, 11, 12, 13};//x,y,z,a

//float value_init = {88, 88, 96, 86};//x,y,z,a

const int kMessagePubRate = 5;

unsigned long message_pub_time = 0;

const int kReadMotorDeltaT = 5;

unsigned long position_read_time = 0;

float current_x = 0,current_y = 0,current_a = 0;

float current_vx = 0,current_vy = 0,current_va = 0;

float wheel_Speed={0,0,0,0};

char cmd_return;

float sudu = 0.87;

//SoftwareSerial mySerial(51, 9);

void setup()

{

delay(1000);

Serial.begin(57600);delay(1000);

mySerial.begin(BusServoSerialBaud);delay(1000);

//Servo_Action_Test();delay(1500);

nh.initNode();

nh.subscribe(vel_cmd_sub);

nh.advertise(pose_feedback_pub);

nh.advertise(vel_feedback_pub);

XYSetVel(0.0,0.0,0.0);

position_read_time = millis();

message_pub_time = millis();

}

void loop()

{

//   unsigned long times = millis();

//   set_Single_servo_Vel(1600);delay(5000);

//   Serial.println(millis()-times);

//   set_Single_servo_Vel(1500);

//   while(1){

//    delay(100);

//   }

if(millis()>position_read_time)

{

    XYread();

    position_read_time+=kReadMotorDeltaT;

}



if(millis()>message_pub_time)

{

    pose_message.x = current_x;

    pose_message.y = current_y;

    pose_message.z = current_a;

    vel_message.x = current_vx;

    vel_message.y = current_vy;

    vel_message.z = current_va;

    pose_feedback_pub.publish(&pose_message);

    vel_feedback_pub.publish(&vel_message);

    message_pub_time+=1000.0/kMessagePubRate;

}

nh.spinOnce();

}


② 启动雷达、键盘、rosserial程序包。打开终端,输入roslaunch robot_navigation_control robot.launch命令(见下图),等待程序的运行启动界面。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg4JfGpwYoyJ-7ggQw8AY4Rw!600x600.png.webp
成功启动后,可以在终端看到底盘的当前speed(线速度)为0.04,turn(角速度)为0.08。注意:speed指的是线速度的大小(包含方向),turn指的是角速度的大小(包含方向)。https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgvJjGpwYosNnZ1QEwoQU4qQI!600x600.png.webp
启动后的界面(如下图所示):https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg95jGpwYoz6WTyQQw6wg4mgY!600x600.png.webp③ 尝试按下键盘命令,控制底盘的运动。 (注意:请先保证终端是激活状态;按键盘时,稍微有点间隔,给底盘转动的时间)。 假如现在希望先增加底盘的最大速度,再降低底盘的最大速度,则分别按下键盘上q、z命令,则可以观察到终端的结果(如下图所示)。https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg1p3GpwYopuzx5wQwzwU4mgI!600x600.png.webp更多命令大家可自行尝试。
2. 底盘同步定位与建图-SLAM实现思路       利用Gmapping算法对底盘所在的未知环境进行建立地图、同步定位、最后保存此地图。此地图可供后续底盘导航使用。
器材准备https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgr57GpwYo4JGylAUwmAQ44QM!400x400.png.webp操作步骤
① 下载文末资料中的参考程序fourmacnum_car_ws\src\Arduino_Program\black_handle_BaseCar\black_handle_BaseCar.ino:/*------------------------------------------------------------------------------------

版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

         Distributed under MIT license.See file LICENSE for detail or copy at

         https://opensource.org/licenses/MIT

         by 机器谱 2023-08-22 https://www.robotway.com/

------------------------------*/

//DUE控制版需要启用USE_USBON或USE_NATIVE_USB,UNO不需要

//#define USE_USBCON          //PAOGRAMMING PORT

//#define USE_NATIVE_USB      //NATIVE USB PORT

#define ActionDelayTimes 1500

//#include <SoftwareSerial.h>

#include <ros.h>

#include <ros/time.h>

//#include<ServoTimer2.h>

#include <geometry_msgs/Vector3.h>

#define mySerial Serial2

#define BusServoSerialBaud 115200

ros::NodeHandle   nh;

void XYRun(double vx, double vy, double w);

void messageCb( const geometry_msgs::Vector3& vel_cmd)   {XYSetVel(vel_cmd.x, vel_cmd.y, vel_cmd.z);}

ros::Subscriber<geometry_msgs::Vector3> vel_cmd_sub("vel_cmd", &messageCb );

geometry_msgs::Vector3 pose_message;

ros::Publisher pose_feedback_pub("pose_feedback",&pose_message);

geometry_msgs::Vector3 vel_message;

ros::Publisher vel_feedback_pub("vel_feedback",&vel_message);

//ServoTimer2 myServo;//statement servo

//int servo_port = {10, 11, 12, 13};//x,y,z,a

//float value_init = {88, 88, 96, 86};//x,y,z,a

const int kMessagePubRate = 5;

unsigned long message_pub_time = 0;

const int kReadMotorDeltaT = 5;

unsigned long position_read_time = 0;

float current_x = 0,current_y = 0,current_a = 0;

float current_vx = 0,current_vy = 0,current_va = 0;

float wheel_Speed={0,0,0,0};

char cmd_return;

float sudu = 0.87;

//SoftwareSerial mySerial(51, 9);

void setup()

{

delay(1000);

Serial.begin(57600);delay(1000);

mySerial.begin(BusServoSerialBaud);delay(1000);

//Servo_Action_Test();delay(1500);

nh.initNode();

nh.subscribe(vel_cmd_sub);

nh.advertise(pose_feedback_pub);

nh.advertise(vel_feedback_pub);

XYSetVel(0.0,0.0,0.0);

position_read_time = millis();

message_pub_time = millis();

}

void loop()

{

//   unsigned long times = millis();

//   set_Single_servo_Vel(1600);delay(5000);

//   Serial.println(millis()-times);

//   set_Single_servo_Vel(1500);

//   while(1){

//    delay(100);

//   }

if(millis()>position_read_time)

{

    XYread();

    position_read_time+=kReadMotorDeltaT;

}



if(millis()>message_pub_time)

{

    pose_message.x = current_x;

    pose_message.y = current_y;

    pose_message.z = current_a;

    vel_message.x = current_vx;

    vel_message.y = current_vy;

    vel_message.z = current_va;

    pose_feedback_pub.publish(&pose_message);

    vel_feedback_pub.publish(&vel_message);

    message_pub_time+=1000.0/kMessagePubRate;

}

nh.spinOnce();

}② 启动雷达、键盘、rosserial。
      打开终端并输入命令:roslaunch robot_navigation_control robot_car.launch,见下图。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg1Z-GpwYoyIGg2gQwugU4TA!600x600.png.webp③ 启动构建地图服务。
      重新打开新终端并输入:roslaunch four_macnum_slam four_macnum_slam.launch,见下图。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgp6DGpwYon_KQFjDXCThb!600x600.png.webp
       界面启动后,在rviz中选择“map”,可以在可视化界面看到有地图出现。
       下面根据实际环境进行建图:按下键盘相关指令(键盘指令请参考上述内容--键盘命令及含义表)来控制全向底盘在场地内遍地运行,直至在Rviz内可以看到构建地图的轮廓,如下图所示(注意实际地图环境不同,出现的轮廓也会不同)。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg_aDGpwYoj4TKzwEwjgg48AU!600x600.png.webp底盘在未知环境中建立地图
④ 为了后续在已知环境中运行底盘,需把此次建立的地图进行保存。需要先进入保存地图的文件夹,然后给地图命名,保存即可。
下面是实验中的具体操作:
重新打开新终端(ctrl+shift+t)并输入:cd fourmacnum_car_ws/src/four_macnum_navigation/maps
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg8KHGpwYouvnQ3gcw6gg4hAE!600x600.png.webp
之后输入:rosrun map_server map_saver -f ./your_map_name
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAguaLGpwYo1tzzjAEwuwk43gE!600x600.png.webp
返回下图红色框的信息,代表成功保存地图。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg6qLGpwYooK-NwwcwtQk4qgI!600x600.png.webp
查看生成的地图文件
       上面我们用map_server来保存地图,这里我们来简单了解和查看一下刚才保存的地图文件(见下图)。其中:map_server是一个和地图相关的功能包,它可以将已知地图发布出来,供导航和其它功能使用,也可以保存SLAM建立的地图。
       地图文件,通常为pgm格式   
       地图的描述文件,通常为yaml格式
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAguaPGpwYo9IzQywMwxwU4jgM!600x600.png.webp
打开your_map_name.pgm(见下图):
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgjaTGpwYokPPFXTDYAziwBQ!500x500.png.webp
打开your_map_name.yaml ,各个参数如下图所示:
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgvqXGpwYosLSUmgMw9gY4sAE!600x600.png.webp
其中占据的概率 occ = (255-color_avg)/255.0,color_avg为RGB三个通道的平均值。

3. 底盘导航—Navigation
实现思路
       加载上述实验中建好的地图,全向底盘进行姿态估计并实现导航效果。
操作步骤
① 将创建的地图应用到导航程序中。这里我们需要修改下four_macnum_navigation.launch文件,将your_map_name.yaml 添加到此launch文件中。步骤如下:
      打开终端并输入:cd fourmacnum_car_ws/src/four_macnum_navigation/launch
      之后再输入:gedit four_macnum_navigation.launch
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgvKbGpwYo6JnSUDCCCjjpAw!600x600.png.webp
② 启动雷达、键盘、rosserial。
      在该终端继续输入:roslaunch robot_navigation_control test_one.launch
③ 打开新终端并输入:roslaunch four_macnum_navigation four_macnum_navigation.launch(见下图)。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgiKfGpwYohMDYnAcwyQk4ggE!600x600.png.webp
启动界面后,可以看到许多红色的箭头,这代表底盘的姿态估计还不准确。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgvKfGpwYo0b_iGjCvCTinBQ!600x600.png.webp
④ 开始调整底盘的姿态。
      使用2D Pose Estimate 标定底盘位于地图中的初始位置及车头指向(见下图)。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAggajGpwYo0v6qzAYw-Ag4igU!600x600.png.webp
⑤ 鼠标点击有roslaunch robot_navigation_control test_one.launch的终端后,尝试按下键盘命令控制全向底盘运动(键盘指令请参考上述内容--键盘命令及含义表),最好尽可能多的消除地图中的箭头【这一步作用是确定底盘在地图中的实际位置以及车头指向】。
      下面是多次按下键盘命令控制底盘运动后,箭头逐渐减少的效果。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgyqjGpwYon6O0iwQw_wg4yAY!600x600.png.webp
下图是最后调整完的底盘姿态(即底盘在地图中的实际位置以及车头指向)。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg_ajGpwYokNyGnwUw9wc45wU!600x600.png.webp
⑥ 尝试给定全向底盘目标位置。
【使用2D Nav Goal】,这里的目标位置包含了目标点及车头指向,在可视化界面点击且转动箭头防线,机器人会移动到指定点的位置。



4. 资料下载
资料内容:程序源代码
资料下载地址:桌面级全向底盘-slam导航 https://www.robotway.com/h-col-260.html
页: [1]
查看完整版本: 机器人制作开源方案 | 桌面级全向底盘--slam导航