Ros

硬件规范

一、硬件构成

对不含机械臂的,需要一块主板、一个包含驱动板的底盘,一个激光雷达、一个相机,以及一个喇叭和一个麦克风。

  • 主板。EmbedFire(野火)的鲁班猫4、Firefly的ROC-RK3588S-PC。也可用其它主板,硬件上需至少提供4个USB,深度相机往往会超过500毫安,当中至少一个USB3.0。一个UART。需Android12或以上,并对android源码作些修改,主要是让支持远程桌面,以及给com.kos.launcher这个普通app增加些系统级权限,如何修改参考“定制Android内核(Android-12)”。
  • 底盘。一般包括一块驱动板、电机、轮子、底座。需要自画电路部分只有驱动板。要操控机械臂,往往也是这个底盘去控制。
  • 激光雷达。激光雷达作为SLAM传感器,用于建图和定位。Launcher使用cartographer算法。SLAM传感器要用于辅助解决机器人绑架,必须用一次360度的激光雷达,不能深度摄像头。Baisc小程序支持雷达:镭神N10、思岚RPLIDAR A1M8。
  • 相机。要加个符合UVC协议的USB摄像头,不用深度,普通RGB就行。
  • 麦克风、喇叭。在连接上,它们先合一音频线,音频线另一头以3.5mm接入到主板。
  • IMU。导航时需要知道实时偏航角,如果驱动板上IMU不符合要求,需要外接一个UART IMU。外接IMU时,是以着底盘驱动中一模块融入系统。

对目前的建图算法,要保证导航正确,希望机器人移动时不出现太大的上、下摆动。机器人得有一定的惯性。

对要支持机械臂的,要加上一个机械臂、一个深度相机,同时可去掉UVC相机。带机械臂机器人参考“安装、测试机器人”。

针对以上器件,需编程才能融入主板的,有底盘、激光雷达、机械臂、以及深度相机,它们都有着各自驱动类型。激光雷达和深度相机,往往都可以买现成的,因而如果做不带机械臂的机器人,要解决编程问题的也就主板中的驱动板。

 

二、驱动板

2.1 硬件

  1. 和主板之间接口。数据通信用串口。为方便连接,强烈建议给出串口PIN同时,增加个USB转串口芯片,像CH340。对波特率,建议用230400,至少需支持115200。数据格式:N81(8个数据位、一个停止位、没有校验)。如果要和主板用串口直连,用UART,不要RS-232。
  2. 驱动电机。驱动板通过串口接收到主板发来的速度指令,按要求驱动电机。
  3. 测量电池的当前电压。
  4. 机器人充电会很频繁,电池支持充电。

2.2 软件

这里软件是指主板和驱动板之间要传输的数据。封装这些数据的协议可以用私有协议,也可用ros规范:rosserial

  • 主板到驱动板。要求驱动板按这速度驱动电机,速度是以geometry_msgs::Twist结构发送。详细见“三、电机速度”。
  • 驱动板到主板。1)发送电池当前电压。2)定时发送角度,封装数据结构待定。
  • 驱动板收到一个效速度后,要能自动停止,即不能按这个速度就一直运行着。这个从收到到停止的间隔,轮趣底盘的值是1秒。

 

三、电机速度

上层软件把速度封装成geometry_msgs::Twist结构发向机器人。目前只支持2D,线速度中vel_z总是0,角速度则只用theta(z)分量。考虑到一些底盘不支持横移,目前也不会发linera.y不是0的速度。

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

3.1 最小线速度、角速度

速度太小时,由于地面摩擦力等因素,机器人可能就没法动。过小的速度可以不支持,但得有个需要支持的最小速度。

  • 线速度。角速度是0时,最小在线速度(绝对值)0.08米/秒时,机器人要可以动了。当然,能支持越小越好,要是小的话,软件中可改小配置参数min_moveable_vel_x、min_moveable_vel_trans。
  • 角速度。线速度是0时,最小在角速度(绝对值)DEG2RAD(20)时,机器人要可以动了。当然,能支持越小越好,要是小的话,软件中可改小配置参数min_moveable_vel_theta。
  • 当线速度或角速度当中一个满足了一个最小值要求时,另一个需支持任何值。举个例子,角速度>=min_moveable_vel_theta,那线速度需支持任何值。
  • 支持最大线速度:0.3米/秒。支持最大角速度:DEG2RAD(60)弧度/秒。
  • vel_x=0,theta非0时,指示机器人原地转。如果机器人不支持原地转,出来的误差要向前,即机器人要向前冒出误差距离。
  • 机器人实际移动速度不要让超过twist指定值。小点,大不了看去移动慢点;大了,就是可能撞向障碍物。

 

3.2 只发一次twist时,默认运行多长时间

机器人运行时,本身重量,以及地面摩擦等都不一样,这里只是理论上的。轮趣底盘是运行1秒。

当收到一次twist,默认运行0.5秒。

举个例子,vel_x速度0.2米/秒、vel_y=0、theta=0,那0.5秒后停下,期望结果是此时向正前方移动了10cm。当然,机器人做不到瞬时把速度加速到0.2米/秒,总之以最快速度加速到0.2米/秒。类似加速,机器人做不到瞬时把速度减速到0,总之以最快速度减速。然后机器人在0.5秒后停下来。

注:导航模块中movebase理论上每隔400毫秒执行一次executeCycle,即发一次twist。因而设想中的运动模型:第一次twist让机器人从0加速到0.2米/秒,到400毫秒时,机器人还是(尽量)0.2米/秒,此时收到第二个0.2米/秒的twist,机器人也就实现了不断移动。

 


机械臂设备疑问

1、各关节坐标系的原点在哪里?——。猜是在各个舵机向外冒出点的中心,而且不是白环,但需要更精确。

2、爪子是个梯形,这个梯形是中央对齐,还是上对齐?——猜是中央对齐(model_grasp_point)。当joint5末端pitch是0时,中央线和joint5原点z轴,水平对齐。

3、当joint4的dcpitch=0时,爪子梯形中线的z是否等于joint5的z。

4、机械臂似乎进入这么个状态:t1时发了个joints1,t2时发了个joints2,t3时发了个joints3。在t2时,执行的是joints1,在t3时,执行的是joints2。这时关闭、再开串口,没用;只能重新批给驱动板上电。

5、joint4是否能折出比1.57更大的角度?——在导航时,让机械臂前向不超出底盘前边沿。总之出来适合导航状态。

6、有累积误差吗?——工作一断时间后,joint1值=0是否还能真正对应初始yaw=0度的方向。

 

 

 

 

全部评论: 0

    写评论: