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;
91 robot.est_pos.phi = phi;
92 ROBOT_UNLOCK(est_pos);
96 * Adds point in absolute coordinates to previously initialized trajectory object.
98 * @param x_m X coordinate in meters.
99 * @param y_m Y coordinate in meters.
101 void robot_trajectory_add_point_notrans(double x_m, double y_m)
105 t = (Trajectory*)robot.new_trajectory;
107 t->addPoint(x_m, y_m);
111 bool get_arrive_from_point(double target_x_m, double target_y_m, struct move_target_heading heading,
112 double *point_x_m, double *point_y_m)
115 if (heading.operation == TOP_ARRIVE_FROM) {
117 heading.distance*cos(heading.angle-M_PI);
119 heading.distance*sin(heading.angle-M_PI);
129 * Adds final point to trajectory objects and starts robot movement.
131 * @param x_m X coordinate in meters.
132 * @param y_m Y coordinate in meters.
133 * @param heading Desired heading (in degrees) of the robot in this
134 * point. NAN means don't care. Positive number or zero
135 * means turn counter-clockwise, negative number means
136 * turn clockwise. Example: DEG2RAD(90) means turn up
137 * counter-clockwise and DEG2RAD(-270) means turn up
140 void robot_trajectory_add_final_point_notrans(double x_m, double y_m, struct move_target_heading heading)
142 struct move_target *target;
145 t = (Trajectory*)robot.new_trajectory;
147 if (heading.operation == TOP_ARRIVE_FROM) {
149 get_arrive_from_point(x_m, y_m, heading, &ax, &ay);
150 robot_trajectory_add_point_notrans(ax, ay);
152 robot_trajectory_add_point_notrans(x_m, y_m);
154 t->finalHeading = target2final_heading(heading);
155 target = (struct move_target*)malloc(sizeof(*target));
156 memset(target, 0, sizeof(*target));
159 target->heading = heading;
160 target->trajectory = t;
161 target->use_planning = false;
162 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);
163 robot.new_trajectory = NULL;
165 printf("%s: Error - No trajectory\n", __FUNCTION__);
171 * Stops actual movement.
176 FSM_SIGNAL(MOTION, EV_MOVE_STOP, NULL);
180 void robot_send_speed(double left, double right) {
184 mul = 1000.0 / ROBOT_WHEEL_RADIUS_MM; // to angular speed
185 mul *= 28.0/(2.0*M_PI)/*gear*/*(1<<8); // to pxmc speed
187 // I hope it is not neccessary to lock here
188 l = (int)(left * mul);
189 r = (int)(right * mul);
190 robot.orte.motion_speed.left = l;//(l&0xff) << 8 | (l&0xff00) >> 8;
191 robot.orte.motion_speed.right = r;//(r&0xff) << 8 | (r&0xff00) >> 8;
192 // DBG("speed l=%8.3g (%6d) r=%8.3g (%6d)",
193 // left, l, // robot.orte.motion_speed.left,
194 // right, r //robot.orte.motion_speed.right
196 ORTEPublicationSend(robot.orte.publication_motion_speed);
200 * Makes move the robot to a target position. Use path panner to find
201 * the trajectory. This function is intended to be called from main
204 * @param x X coordinate in meters.
205 * @param y Y coordinate in meters.
206 * @param heading Desired heading of the robot at goal point.
208 void robot_goto_notrans(double x, double y, struct move_target_heading heading, struct TrajectoryConstraints *tc)
210 struct move_target *target;
211 target = (struct move_target*)malloc(sizeof(*target));
212 memset(target, 0, sizeof(*target));
215 target->heading = heading;
216 target->use_planning = true;
217 if (tc) target->tc = *tc;
218 else target->tc = trajectoryConstraintsDefault;
220 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);
223 void robot_moveto_notrans(double x, double y,
224 struct move_target_heading heading,
225 struct TrajectoryConstraints *tc)
227 struct move_target *target;
228 target = (struct move_target*)malloc(sizeof(*target));
229 memset(target, 0, sizeof(*target));
232 target->heading = heading;
233 if (tc) target->tc = *tc;
234 else target->tc = trajectoryConstraintsDefault;
235 target->use_planning = false;
237 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);
241 * Move robot forward or backward
243 * @param distance Distance in meters ( >0 forward, <0 backward)
244 * @param heading Final heading
245 * @param tc Trajectory constrains
247 void robot_move_by(double distance, struct move_target_heading heading, struct TrajectoryConstraints *tc)
253 y = robot.est_pos.y ;
254 phi = robot.est_pos.phi;
255 ROBOT_UNLOCK(est_pos);
257 x += distance*cos(phi);
258 y += distance*sin(phi);
261 if (!tc) tc = &trajectoryConstraintsDefault;
262 bool backward = distance < 0;
263 t = new Trajectory(*tc, backward);
265 t->finalHeading = target2final_heading(heading);
267 struct move_target *target;
268 target = (struct move_target*)malloc(sizeof(*target));
269 memset(target, 0, sizeof(*target));
272 target->heading = heading;
273 target->trajectory = t;
274 FSM_SIGNAL(MOTION, EV_NEW_TARGET, target);