环绕

环绕效果

界面上有两只小乌龟:

  • 小乌龟A
  • 小乌龟B
  • 小乌龟B绕着小乌龟A绕圈圈
  • 小乌龟A通过键盘控制移动

业务实现

小乌龟B期望在小乌龟A四周环绕运动

可以将环绕的点当成一个坐标系,小乌龟B想跟随这个坐标系运动

对于小乌龟A来说,环绕是一个相对的,小乌龟A可以动,但是对于环绕的坐标系,小乌龟是不动的。

对于不动的小乌龟A而言,要构建一个动态环绕的坐标系,需要通过单独的节点来发布小乌龟A和环绕坐标系的关系。

环绕坐标系可以按照一定的时间周期,做到动态坐标系变化,这里有几个关键的值:

  • 环的半径
  • 环绕的角度
x = r * cos(radians(theta))
y = r * sin(radians(theta))

translation = (x, y, 0)
rotation = quaternion_from_euler(0, 0, 0)
broadcaster.sendTransform(translation, rotation, rospy.Time().now(), 'circle', "turtle_a")

Note

半径r和自增长的theta角度。

通过theta角度自增长来控制动态的环绕坐标系

笛卡尔爱心

界面上有两只小乌龟:

  • 小乌龟A
  • 小乌龟B
  • 小乌龟B绕着小乌龟A绕爱心
  • 小乌龟A通过键盘控制移动

公式

笛卡尔爱心

x = a * (2 * sin(t) + sin(2 * t))
y = a * (2 * cos(t) + cos(2 * t))

Note

t为自增长的弧度值

标准爱心

x = 16 * pow(sin(t), 3)
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)

Note

t为自增长的弧度值