ROS模型构建、定位导航

本文介绍了使用URDF和Xacro构建机器人模型,通过Gazebo和Rviz模拟,以及在ROS中解决模型问题、驱动控制、定位导航和地图构建的详细过程。遇到的问题包括:轮子离地、模型平衡、Xacro宏错误、Kinect错位、驱动控制、四轮驱动选择、AMCL参数调整、地图准确性及修复。解决方法包括参数调整、宏引用修正、选择合适控制器、增大transform_tolerance等。
摘要由CSDN通过智能技术生成

利用URDF或者Xacro文件,以XML的方式描述小车底盘、camera、laser、Kinect等基本机器人结构,通过Gazebo或Rviz将文件解析为图形化的机器人模型。

 

其中很多代码可以从网络上找到。主要注意参数和坐标系的设置。例如在Kinect的Xacro文件中,需要修改gazebo reference和frameName这两个参数,而frameName由于在Rviz中点云图出现错位的现象,需要在launch文件中加入<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /原来的父关节 /自己定义的名字" />这一行代码,所以frameName应该是自己定义的名字。

下面说说我在此过程中遇到的问题:

1. 轮子有离地间隙,导致用键盘控制时轮子在转,可是却没有往前走,可能是关节之间的偏移量计算有误,或者偏移量正好,需要再减去0.01确保小车和地面接触。

2. 模型倾倒,由于设置的质量不合理,小车的底盘质量要大,越往上质量越小。

3. 编写.xacro文件时,编写xacro宏的时候,没有引用参数params,少写斜杠等等小问题,都会报错。

4. Kinect错位(如上)。

5. 用键盘驱动小车时࿰

如果机械组将新步兵底盘设计为三个全向轮,并且使用键盘控制,那么需要修改的部分就是mecanum_wheel_speed()函数中的计算方式。以下是修改后的代码示例: ``` #include <stdio.h> #include <conio.h> //需要使用getch()函数来读取键盘输入 typedef struct { float ch[5]; } rc; rc rc_data; //定义一个全局变量,用于存储遥控器数据 int main() { while (1) { //无限循环,实时读取键盘输入并控制底盘 if (kbhit()) { //如果有键盘输入 char c = getch(); //读取键盘输入 switch (c) { //根据不同的按键进行不同的操作 case 'w': //向前走 rc_data.ch[0] = 0.5f; //设定左前轮和右前轮的速度为0.5 rc_data.ch[1] = 0.5f; rc_data.ch[2] = 0.0f; //设定后轮的速度为0 break; case 's': //向后走 rc_data.ch[0] = -0.5f; //设定左前轮和右前轮的速度为-0.5 rc_data.ch[1] = -0.5f; rc_data.ch[2] = 0.0f; //设定后轮的速度为0 break; case 'a': //向左平移 rc_data.ch[0] = 0.0f; //设定左前轮的速度为0 rc_data.ch[1] = 0.5f; //设定右前轮的速度为0.5 rc_data.ch[2] = -0.5f; //设定后轮的速度为-0.5 break; case 'd': //向右平移 rc_data.ch[0] = 0.0f; //设定左前轮的速度为0 rc_data.ch[1] = -0.5f; //设定右前轮的速度为-0.5 rc_data.ch[2] = 0.5f; //设定后轮的速度为0.5 break; case 'q': //左转 rc_data.ch[0] = 0.0f; //设定左前轮和后轮的速度为-0.5 rc_data.ch[1] = 0.5f; rc_data.ch[2] = -0.5f; break; case 'e': //右转 rc_data.ch[0] = 0.0f; //设定左前轮和后轮的速度为0.5 rc_data.ch[1] = -0.5f; rc_data.ch[2] = 0.5f; break; default: //其他按键 rc_data.ch[0] = 0.0f; //设定所有轮的速度为0 rc_data.ch[1] = 0.0f; rc_data.ch[2] = 0.0f; break; } } mecanum_wheel_speed(); //计算三个轮子的速度 RC_control(); //通过串口发送控制信号 PID_calc(); //计算PID控制器输出 } } void mecanum_wheel_speed() { float vx = rc_data.ch[0]; //vx表示x方向的速度 float vy = rc_data.ch[1]; //vy表示y方向的速度 float w = rc_data.ch[2]; //w表示角速度 float v1 = vx - w; //计算左前轮的速度 float v2 = vy + w; //计算右前轮的速度 float v3 = vx + w; //计算后轮的速度 //将三个轮子的速度存储到全局变量中,以便后续的控制操作使用 rc_data.ch[0] = v1; rc_data.ch[1] = v2; rc_data.ch[2] = v3; } void RC_control() { //通过串口发送遥控器数据 } void PID_calc() { //计算PID控制器输出 } ``` 在上述代码中,我们使用了getch()函数来实时读取键盘输入,并根据不同的按键进行不同的操作。在mecanum_wheel_speed()函数中,我们使用了全向轮的运动学模型来计算出三个轮子的速度,并将这三个速度存储到rc_data结构体中,以便后续的控制操作使用。其他部分的代码与之前的代码基本相同,不再赘述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值