4 * @date Wed Jun 13 13:27:58 2007
6 * @brief Convenience functions for motion control.
14 #include <movehelper.h>
15 #include <path_simplifier.h>
22 #include <mcl_robot.h>
26 struct TrajectoryConstraints trajectoryConstraintsDefault = {
28 maxomega: 1.5, // rad/s
29 maxangacc: 2, // rad/s^2
31 maxcenacc: 1, // m/s^2
32 maxe: (double)ROBOT_WIDTH_MM/2.0/1000.0 // m
35 struct TrajectoryConstraints trajectoryConstraintsDefault = {
38 maxangacc: 3, // rad/s^2
40 maxcenacc: 3*1, // m/s^2
41 maxe: (double)ROBOT_WIDTH_MM/2.0/1000.0 // m
50 static void robot_trajectory_new_ex(struct TrajectoryConstraints *tc, bool backward)
54 if (!tc) tc = &trajectoryConstraintsDefault;
56 t = (Trajectory*)robot.new_trajectory;
58 t = new Trajectory(*tc, backward);
59 robot.new_trajectory = t;
64 * Initializes new trajectory object for adding points. Path planner
67 * @param tc Constrains for the trajectory.
69 void robot_trajectory_new(struct TrajectoryConstraints *tc) {
70 robot_trajectory_new_ex(tc, false);
72 void robot_trajectory_new_backward(struct TrajectoryConstraints *tc) {
73 robot_trajectory_new_ex(tc, true);
76 /** Sets actual position of the robot and with respoect to color of
77 * the team. Should be used for setting initial position of the
79 void robot_set_est_pos_notrans(double x, double y, double phi)
82 if (x>PLAYGROUND_WIDTH_M) x=PLAYGROUND_WIDTH_M;
84 if (y>PLAYGROUND_HEIGHT_M) y=PLAYGROUND_HEIGHT_M;
85 struct mcl_robot_pos *newpos = (struct mcl_robot_pos*)malloc(sizeof(struct mcl_robot_pos));
86 memset(newpos, 0, sizeof(*newpos));
89 newpos->angle = fmod(phi, 2.0*M_PI);
90 // FIXME: This should be synchronous signal - we need to
91 // define FSM_SIGNAL_SYNC
92 //FSM_SIGNAL(LOC, EV_SET_ESTIMATED, newpos);
96 robot.est_pos.phi = phi;
97 ROBOT_UNLOCK(est_pos);
101 * Adds point in absolute coordinates to previously initialized trajectory object.
103 * @param x_m X coordinate in meters.
104 * @param y_m Y coordinate in meters.
106 void robot_trajectory_add_point_notrans(double x_m, double y_m)
110 t = (Trajectory*)robot.new_trajectory;
112 t->addPoint(x_m, y_m);
117 * Adds final point to trajectory objects and starts robot movement.
119 * @param x_m X coordinate in meters.
120 * @param y_m Y coordinate in meters.
121 * @param heading Desired heading (in degrees) of the robot in this
122 * point. NAN means don't care. Positive number or zero
123 * means turn counter-clockwise, negative number means
124 * turn clockwise. Example: DEG2RAD(90) means turn up
125 * counter-clockwise and DEG2RAD(-270) means turn up
128 void robot_trajectory_add_final_point_notrans(double x_m, double y_m, struct final_heading *heading)
130 struct move_target *target;
131 robot_trajectory_add_point_notrans(x_m, y_m);
134 t = (Trajectory*)robot.new_trajectory;
136 t->finalHeading = *heading;
137 target = (struct move_target*)malloc(sizeof(*target));
138 memset(target, 0, sizeof(*target));
141 target->h = *heading;
142 target->trajectory = t;
143 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);
144 robot.new_trajectory = NULL;
146 printf("%s: Error - No trajectory\n", __FUNCTION__);
152 * Stops actual movement.
157 FSM_SIGNAL(MOTION, EV_MOVE_STOP, NULL);
161 void robot_send_speed(double left, double right) {
165 mul = 1000.0 / ROBOT_WHEEL_RADIUS_MM; // to angular speed
166 mul *= 28.0/(2.0*M_PI)/*gear*/*(1<<8); // to pxmc speed
168 // I hope it is not neccessary to lock here
169 l = (int)(left * mul);
170 r = (int)(right * mul);
171 robot.orte.motion_speed.left = l;//(l&0xff) << 8 | (l&0xff00) >> 8;
172 robot.orte.motion_speed.right = r;//(r&0xff) << 8 | (r&0xff00) >> 8;
173 // DBG("speed l=%8.3g (%6d) r=%8.3g (%6d)",
174 // left, l, // robot.orte.motion_speed.left,
175 // right, r //robot.orte.motion_speed.right
177 ORTEPublicationSend(robot.orte.publication_motion_speed);
181 * Makes move the robot to a target position. Use path panner to find
182 * the trajectory. This function is intended to be called from main
185 * @param x X coordinate in meters.
186 * @param y Y coordinate in meters.
187 * @param heading Desired heading of the robot at goal point.
189 void robot_goto_notrans(double x, double y, struct final_heading *heading, struct TrajectoryConstraints *tc)
191 struct move_target *target;
192 target = (struct move_target*)malloc(sizeof(*target));
193 memset(target, 0, sizeof(*target));
196 target->h = *heading;
197 if (tc) target->tc = *tc;
198 else target->tc = trajectoryConstraintsDefault;
200 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);
205 * Move robot forward or backward
207 * @param distance Distance in meters ( >0 forward, <0 backward)
208 * @param heading Final heading
209 * @param tc Trajectory constrains
211 void robot_move_by(double distance, struct final_heading *heading, struct TrajectoryConstraints *tc)
217 y = robot.est_pos.y ;
218 phi = robot.est_pos.phi;
219 ROBOT_UNLOCK(est_pos);
221 x += distance*cos(phi);
222 y += distance*sin(phi);
225 if (!tc) tc = &trajectoryConstraintsDefault;
226 bool backward = distance < 0;
227 t = new Trajectory(*tc, backward);
229 t->finalHeading = *heading;
231 struct move_target *target;
232 target = (struct move_target*)malloc(sizeof(*target));
233 memset(target, 0, sizeof(*target));
236 target->h = *heading;
237 target->trajectory = t;
238 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);