Ros By example-第七章 控制移动底座

7.1 单位和坐标系统


7.2 不同层次的移动控制

内部运动数据统称为里程计

7.2.1 电机, 轮子和编码器

7.2.2电机控制器和驱动

ROS 核心包不包括具体电机控制器的驱动。可以找到第三方的包如 Arduino, ArbotiX, Serializer, Element, LEGO® NXT and Rovio.

7.2.3 ROS Base 控制器

PID控制。 PID“比例积分微分”

驱动和PID控制器整合成单个ROS 节点,base controller.

base controller节点通常发布里程计数据到/odom 主题,并监听监听在/ cmd_vel主题运动命令。同时,控制器节点通常(但不总是)发布从/odom坐标系到/ base_link或/ base_footprint坐标系的转换

7.2.4 使用ROS move_base包基于坐标系运动

7.2.5 使用ROS gmapping 和 amcl 包的 SLAM

amcl -自适应蒙特卡洛定位

7.2.6 语义目标

7.2.7 总结


smach, behavior trees, executive_teer, and knowrob. (smach 和behavior trees讲在第二卷介绍.)

7.3.2 使用 RViz监视机器人运动

$rosmsg show geometry_msgs/Twist

线速度和角速度,都是3维的向量, 线速度的单位是m/s, 角速度的单位是弧度 rad/s.( 1rad= 57°),  在二维平面上,一般只用到线速度的X和角速度的Z。

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


'{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}'   冒号后面的空格是必须的。


$rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}' 

(-r 10 代表 周期发布,频率为10Hz)


$rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}' 

(-1 代表发布一次)

7.4 校准 Robot's Odometry 里程计

没有真实的机器人,所以跳过这节

7.5 发送Twist 信息到真是的机器人

没有真实的机器人,所以跳过这节

7.6 从ROS 节点发布 Twist 信息

$roslaunch rbx1_bringup fake_turtlebot.launch
$rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
$rosrun rbx1_nav timed_out_and_back.py
 
  
如果你的包py引入 Twist, 需在你的package.xml加入
geometry_msgs

self.cmd_vel = rospy.Publisher('/cmd_vel', Twist, queue_size=5)

queue_size , 如果没设置的话, 发布会表现为同步,如果有多个订阅这个主题,如果有一个被挂起,其他的也会被阻塞,如果设为某个数, 则每个订阅通过不同的线程接收到信息。

r.sleep() == rospy.sleep(1/rate) 因为我们定义了变量  r = rospy.Rate(rate).

7.7 机器人是否正确的执行我们的意图, 如果我给机器人发布 0.2m/s 的向前速度, 实际中,机器人有可能是按0.18m/s 速度前进, 那我们怎么来保证这个问题呢

机器人的base 控制节点使用里程计和PID控制把motion请求转换为真实世界中的速度。该方法的准确度和可靠性取决于机器人的内部传感器,所述校准过程的精度和环境条件。 (例如,某些表面可能允许车轮稍微打滑从而将陷编码器计数和行驶距离之间的映射打乱。)


ROS 提供了一个消息类型来存储里程计数据; nav_msgs/Odometry. 里程计信息类型结构大体如下:

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist


$rosmsg show nav_msgs/Odometry

Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
float64[36] covariance
geometry_msgs/TwistWithCovariance twist
geometry_msgs/Twist twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
float64[36] covariance

 PoseWithCovariance 记录了机器人的位置和方向,TwistWithCovariance 记录了线速度和角速度的值, Pose 和 Twist 可以写成协方差矩阵,用于计算各种测试的不确定。

Header 和child_frame_id 是用来定义计算距离和角度的参考坐标系坐标系

我们通常 把 /odom 作为父坐标系 id , /base_link (或/base_footprint) 作为子坐标系 id. 而/ base_link坐标系对应于机器人的实际物理部分,/odom 坐标系定义成由封装成里程计数据的平移和旋转。这些转换是相对/odom。

7.8 使用里程计

7.8.3 基于里程计的 Out-and-Back 脚本

需要geometry_msgs 包下的Twist, Point and Quaternion 数据类型

还需要 tf 库来监听/odom and /base_link (or /base_footprint) 坐标系之间的转换.

2.5°是允许的误差范围

7.8.4 /odom 主题与/odom 坐标系

读者可能会奇怪,为什么我们在前面的脚本中使用一个TransformListener访问里程计信息,而不仅仅是订阅到/odom 主题。其原因是,在/odom 主题发布的数据并不总是完整的。例如,TurtleBot使用单轴陀螺仪为机器人的旋转提供附加估计。这是用从由robot_pose_ekf节点(这是在TurtleBot启动文件启动)车轮编码器中的数据组合以获得比单独源更好的估计。

然而,robot_pose_ekf节点不发布数据到保留车轮编码器数据/odom 主题。相反,它发布到 / odom_combined主题。此外,数据发布不是作为一个里程计信息,但作为一个PoseWithCovarianceStamped消息。

7.9.4 航位推算问题

仅利用内部运动数据导航,不参照外部路标被称为航位推算。 误差的累积会导致机器人与预期的不一致, 这时需要用到 下一章的SLAM 

7.10 遥控机器人

$sudo apt-get install ros-indigo-joystick-drivers ros-indigo-turtlebot-teleop

7.10.1 使用键盘

$roslaunch rbx1_bringup fake_turtlebot.launch
$rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
$roslaunch rbx1_nav keyboard_teleop.launch

7.10.2使用罗技游戏手柄

$roslaunch rbx1_nav joystick_teleop.launch


7.10.3 使用Arbotix GUI

arbotix_gui

7.10.4 使用可交互标记

sudo apt-get install ros-indigo-turtlebot-interactive-markers
$roslaunch rbx1_bringup fake_turtlebot.launch
$rosrun rviz rviz -d `rospack find rbx1_nav`/interactive_markers.rviz
$roslaunch rbx1_nav interactive_markers.launch


 
  



你可能感兴趣的:(Ros By example-第七章 控制移动底座)