ros机器⼈系统设计、urdf机器⼈建模
⽬录
机器⼈的定义
⾃动执⾏⼯作的机器装置。可以根据预先编写的程序或者接受⼈类指挥来⾏动,最终⽬标是使其能够脱离⼈的⼲预,根据以⼈⼯智能技术制定的原则和策略⾃主⾏动,以协助或取代⼈类⼯作。
机器⼈的组成
从控制的⾓度来看,机器⼈可以划分为四个部分:执⾏机构、传感系统、驱动系统、控制系统。
(对⾃⼰的名词解释:伺服就是⼀个电机和控制这个电机的驱动器。电机就叫伺服电机、驱动器⾃然叫做伺服驱动器。伺服驱动器的作⽤主要有三点,⼀是开关作⽤:控制伺服电机的起动、停机、转速等等;⼆是保护作⽤:对电机进⾏各种保护(过载,短路,⽋压等);三是控制作⽤:对外部信号做出反应,通过内部的PID调节(放⼤脉冲指令信号的驱动功率),控制伺服电机(位置,速度,扭矩)。伺服是为了实现电机的精确控制并精确跟踪运动部件的移动轨迹。
电机指的是⽤电⼒驱动旋转地设备。马达是指⽤电、汽油、柴油、燃⽓等能源驱动的旋转式机械设备的统称。)
机器⼈的闭环控制回路如上图。
移动机器⼈系统构建
⼤部分都会搭载嵌⼊式开发板。有些也可以搭载pc机来完成控制功能。
执⾏机构
底盘⾻架、轮⼦、驱动轮⼦的电机、有些⼩车会使⽤舵机来作转向机构
驱动系统
电源⼦系统、电机驱动⼦系统、传感器接⼝等
内部传感系统
内部传感系统中⾥程计(可以选⽤霍尔编码器或者光电编码器)的实现原理:
光电编码器是由光栅盘和光电检测装置组成。光栅盘是在⼀定直径的圆板上等分地开通若⼲个长⽅形孔。
由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光⼆极管等电⼦元件组成的检测装置检测输出若⼲脉冲信号;通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。
1、根据单位时间内产⽣的脉冲数计算电机(即轮⼦)的旋转圈数
2、根据轮⼦的周长乘以单位时间旋转圈数计算机器⼈的运动速度
3、根据机器⼈的运动速度通过积分计算⾥程
内部传感系统中常⽤的惯性测量单元(IMU)(⽤来测量物体的速度和姿态,主要包括三轴陀螺仪、三轴加速度计、磁⼒计等)的实现原理:
imu的输⼊就是上⾯那些传感器的信号,最终的输出包含机器⼈的位置、速度、姿态信息。关于机器⼈的速度可以跟⾥程计做⼀下传感器的融合以得到更加精确的机器⼈位置和速度。如果单纯的使⽤⾥程计,由于其原理当中使⽤到很多跟积分相关的内容,必然会产⽣积分的累积误差。即机器⼈运动距离越⼤,误差越⼤。
控制系统
其中,深绿⾊框中的内容需要较⼤的计算资源,如果机器⼈本地计算资源不⾜可以将其置于远端pc中。
常见控制系统板卡包括树莓派(raspberry pi)、odroid-XU4、 媲美低端pc的NVIDIA Jetson TK1等。如果需要在机器⼈本地实现较为复杂的功能的话,可以使⽤mini PC,或者intel NUC等⼩型电脑。
外部传感系统
摄像头、Kinect、GPS、超声波、激光雷达、三维激光雷达等。
传感器的使⽤
连接摄像头
sudo apt-get install ros-kinetic-usb-cam //安装usb_cam功能包
roslaunch usb_cam usb_cam-test.launch  //启动功能包
rqt_image_view
我们可以使⽤usb_cam功能包来连接摄像头。usb_cam功能包能够提供原始图像数据以及压缩数据,⼀般为了降低⽹络带宽压⼒会选择压缩图像。我们还可以通过修改参数来获得不同的图像效果。
当我们使⽤⼀个功能包时,⾸先要关注的不是它的代码实现,⽽应该是它的输⼊输出。包括功能包给我们提供的话题、服务、参数等。想要了解⼀个陌⽣功能包的详细信息时,可以查看ros wiki。所有的功能包都可以在wiki上到最完整的描述。
连接Kinect
⾸先要安装Kinect的驱动,我这⾥使⽤的是Kinect  v2
// git clone github/OpenKinect/libfreenect.git    //Kinect v1 驱动
git clone github/OpenKinect/libfreenect2.git    //Kinect v2 驱动
sudo apt-get install build-essential cmake pkg-config  //安装编译⼯具
sudo apt-get install libusb-1.0-0-dev  //安装libusb
sudo apt-get install libturbojpeg libjpeg-turbo8-dev  //安装TurtoJPEG
sudo atp-get libglfw3-dev    //安装openGL
cd libfreenect2
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2 -DENABLE_CXX11=ON
make
sudo make install
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/  //设置udev rules
OK,到这⾥Kinect v2的驱动就安装完成了。接下来⼀定要记得重新插拔Kinect2。
启动demo程序测试:
./bin/Protonect
效果如下图:
然后安装ROS下的Kinect驱动包  iai_Kinect2
cd ~/catkin_ws/src/
git clone github/code-iai/iai_kinect2.git
cd iai_kinect2
rosdep install -r --from-paths .
cd ~/catkin_ws
catkin_make -DCMAKE_BUILD_TYPE="Release"
测试:
roslaunch kinect2_bridge kinect2_bridge.launch
然后打开⼀个新的终端可视化数据
rosrun kinect2_viewer kinect2_viewer sd cloud
效果如下:
urdf 机器⼈建模
所谓urdf 即 unified robot description format,统⼀机器⼈描述格式。可以通过XML格式的⽂件来描述机器⼈模型,同时ros 也提供了urdf的 c++解析器,就是说我们可以直接在c++代码中解析urdf模型。
机器⼈可以拆解开并分为两⼤类。⼀类叫做连杆(link),另⼀类叫做关节(joint)。
link部分
link描述了机器⼈刚体部分的外观和物理属性,包括尺⼨(size)、颜⾊(color)、形状(shape)、惯性矩在(inertial matrix)、碰撞参数(collision properties)等。
⼀个link主要需要定义如下标签:
<visual>标签,描述机器⼈link的外观参数
<inertial>标签,描述link的惯性参数
<collision>标签,描述link的碰撞属性
如下图:
joint部分
为什么现在都用cmake
joint主要描述机器⼈关节的运动学和动⼒学属性,包括关节运动的位置和速度的限制。根据关机的运动形式,可以分为如下六种:
⼀个joint主要需要定义如下标签:
<parent>标签(必须有),定义了⽗连杆
<child>标签(必须有),定义了⼦连杆
<calibration>标签,描述关节的参考位置,⽤来校准关节的绝对位置。
<dynamic>标签,描述关节的物理属性,例如阻尼值、静摩擦⼒等,在动⼒学仿真中经常⽤到。
<limit>标签,描述运动的极限值,包括关节运动的上下限位置、速度限制、⼒矩限制等。
<mimic>标签,描述该关节与已有关节的关系。
<safety_controller>标签,描述安全控制器参数。
如下图: