<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rsewiki.electro.dtu.dk/index.php?action=history&amp;feed=atom&amp;title=Here</id>
	<title>Here - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rsewiki.electro.dtu.dk/index.php?action=history&amp;feed=atom&amp;title=Here"/>
	<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;action=history"/>
	<updated>2026-04-08T07:47:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=481&amp;oldid=prev</id>
		<title>Jca: /* Drivebase.rule code */</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=481&amp;oldid=prev"/>
		<updated>2009-11-06T08:41:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Drivebase.rule code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:41, 6 November 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==&lt;/del&gt;== Drivebase.rule code &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==&lt;/del&gt;==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Drivebase.rule code ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;!-- obst avoid driver v2.2  --&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;!-- obst avoid driver v2.2  --&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jca</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=480&amp;oldid=prev</id>
		<title>Jca: /* Drivebase.rule code */</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=480&amp;oldid=prev"/>
		<updated>2009-11-06T08:41:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Drivebase.rule code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:41, 6 November 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;!-- obst avoid driver v2.2  --&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;!-- obst avoid driver v2.2  --&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!--Rule to define global variables--&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;rule name=&amp;quot;initDrive&amp;quot; run=&amp;quot;true&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;rule name=&amp;quot;initDrive&amp;quot; run=&amp;quot;true&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;init&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;init&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l30&quot;&gt;Line 30:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 33:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/init&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/init&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/rule&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/rule&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!--The main drive rule--&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;rule name=&amp;quot;drive&amp;quot; if=&amp;quot;true&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;rule name=&amp;quot;drive&amp;quot; if=&amp;quot;true&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jca</name></author>
	</entry>
	<entry>
		<id>https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=479&amp;oldid=prev</id>
		<title>Jca: New page: ==== Drivebase.rule code ==== &lt;?xml version=&quot;1.0&quot; ?&gt; &lt;!-- obst avoid driver v2.2  --&gt; &lt;rule name=&quot;initDrive&quot; run=&quot;true&quot;&gt;   &lt;init&gt;       global.drive.mapDest[2] = 0.0 # destination in map c...</title>
		<link rel="alternate" type="text/html" href="https://rsewiki.electro.dtu.dk/index.php?title=Here&amp;diff=479&amp;oldid=prev"/>
		<updated>2009-11-06T08:38:55Z</updated>

		<summary type="html">&lt;p&gt;New page: ==== Drivebase.rule code ==== &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &amp;lt;!-- obst avoid driver v2.2  --&amp;gt; &amp;lt;rule name=&amp;quot;initDrive&amp;quot; run=&amp;quot;true&amp;quot;&amp;gt;   &amp;lt;init&amp;gt;       global.drive.mapDest[2] = 0.0 # destination in map c...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==== Drivebase.rule code ====&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!-- obst avoid driver v2.2  --&amp;gt;&lt;br /&gt;
&amp;lt;rule name=&amp;quot;initDrive&amp;quot; run=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;init&amp;gt;&lt;br /&gt;
      global.drive.mapDest[2] = 0.0 # destination in map coordinates&lt;br /&gt;
      global.drive.utmDest[2] = 0.0 # destination in UTM coordinates&lt;br /&gt;
      global.drive.odoDest[2] = 0.0 # destination in ODO coordinates&lt;br /&gt;
      global.drive.lastMapDest[2] = 0.0 # last destination in map coordinates&lt;br /&gt;
      global.drive.lastUtmDest[2] = 0.0 # last destination in UTM coordinates&lt;br /&gt;
      global.drive.lastOdoDest[2] = 0.0 # last destination in ODO coordinates&lt;br /&gt;
      global.drive.refCoord = -1  # 0=odo, 1=UTM, 2=map&lt;br /&gt;
      global.drive.newDest = 0&lt;br /&gt;
      global.drive.pause = false&lt;br /&gt;
      global.drive.waitHere = true   # waits in a state with low RPM&lt;br /&gt;
      global.drive.gettingClose = false&lt;br /&gt;
      global.drive.skipDestination = false&lt;br /&gt;
      global.drive.compasHeading = false # heading in compas degrees if true (else math)&lt;br /&gt;
      global.drive.radians = true # heading in radians if true, else in degrees (math heading only)&lt;br /&gt;
      global.drive.continueDist = 1 # continues when closer than this from next node&lt;br /&gt;
      global.drive.holdLine = true # try hold line from last waypoint, else go direct&lt;br /&gt;
      global.drive.engineRPM= 1900;&lt;br /&gt;
      global.mission.name= &amp;#039;none&amp;#039;&lt;br /&gt;
      global.mission.leg= 0&lt;br /&gt;
      odoPose.tripTimeB= 0&lt;br /&gt;
      odoPose.tripB= 0&lt;br /&gt;
      global.drive.distToTgt = 0&lt;br /&gt;
      global.drive.fromPose[2] = 0.0 # last used source pose&lt;br /&gt;
      print(&amp;quot;------------ rule drivebase version 2.747&amp;quot;) &lt;br /&gt;
  &amp;lt;/init&amp;gt;&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;drive&amp;quot; if=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;&lt;br /&gt;
    Main drive rules&lt;br /&gt;
  &amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;init&amp;gt;&lt;br /&gt;
    # define drive local variables&lt;br /&gt;
    destUpdated = false&lt;br /&gt;
    dest[2] = 0&lt;br /&gt;
    odoDest[2] = 0&lt;br /&gt;
    destOK = false&lt;br /&gt;
    relPose[2] = 0&lt;br /&gt;
    tripStart = now()&lt;br /&gt;
    lastManDist = 100.0 # target distance at last plan&lt;br /&gt;
    holdLineDist = 11 # aiming pose position when holding line&lt;br /&gt;
    lastOdoDest[2] = 0&lt;br /&gt;
    newDest = false&lt;br /&gt;
    renewDrive = false&lt;br /&gt;
    #distToTgt = 0&lt;br /&gt;
    #fromPose[2] = 0&lt;br /&gt;
    #&lt;br /&gt;
    #define rule to update map target in odometry coordinates&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;updateMap&amp;quot; if=&amp;quot;global.drive.refCoord == 2 and&lt;br /&gt;
                               global.drive.newDest&amp;quot;&amp;gt;&lt;br /&gt;
      relPose = mapToPose(mapPose.pose, global.drive.mapDest)&lt;br /&gt;
      odoDest = poseToMap(odoPose.pose, relPose)&lt;br /&gt;
      relPose = mapToPose(mapPose.pose, global.drive.lastMapDest)&lt;br /&gt;
      lastOdoDest = poseToMap(odoPose.pose, relPose)&lt;br /&gt;
      newDest = true&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    #define rule to update utm target in odometry coordinates&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;updateUtm&amp;quot; if=&amp;quot;global.drive.refCoord == 1 and&lt;br /&gt;
                               global.drive.newDest&amp;quot;&amp;gt;&lt;br /&gt;
      relPose = mapToPose(utmPose.pose, global.drive.utmDest)&lt;br /&gt;
      odoDest = poseToMap(odoPose.pose, relPose)&lt;br /&gt;
      relPose = mapToPose(utmPose.pose, global.drive.lastUtmDest)&lt;br /&gt;
      lastOdoDest = poseToMap(odoPose.pose, relPose)&lt;br /&gt;
      newDest = true&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    #define rule to use destination odometry coordinates&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;updateOdo&amp;quot; if=&amp;quot;global.drive.refCoord == 0 and&lt;br /&gt;
                               global.drive.newDest&amp;quot;&amp;gt;&lt;br /&gt;
      lastOdoDest = odoDest&lt;br /&gt;
      odoDest = global.drive.odoDest&lt;br /&gt;
      global.drive.newDest = false;&lt;br /&gt;
      newDest = true&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    # should destination be used directly, or are we following a line&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;aim4dest&amp;quot; if=&amp;quot;newDest and not global.drive.holdLine&amp;quot;&amp;gt;&lt;br /&gt;
      # use of next destination is OK&lt;br /&gt;
      dest = odoDest;&lt;br /&gt;
      destOK = true&lt;br /&gt;
      lastManDist = 100&lt;br /&gt;
      newDest = false;&lt;br /&gt;
      # print(&amp;quot;aim4dest direct dest &amp;quot; dest)&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    # should destination be used directly, or are we following a line&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;aim4line&amp;quot; if=&amp;quot;global.drive.holdLine and&lt;br /&gt;
                              (newDest or lastManDist &amp;lt; holdLineDist)&amp;quot;&amp;gt;&lt;br /&gt;
      # use of next destination is not OK&lt;br /&gt;
      &amp;lt;init&amp;gt;&lt;br /&gt;
        dtgt = 0&lt;br /&gt;
        srcDist = 0&lt;br /&gt;
      &amp;lt;/init&amp;gt;&lt;br /&gt;
      dest = odoDest;&lt;br /&gt;
      dtgt = dist2d(dest, odoPose.pose)&lt;br /&gt;
      if (dtgt &amp;gt; holdLineDist + 500) # disabled&lt;br /&gt;
      &amp;lt;block&amp;gt;&lt;br /&gt;
         # use a shorter distance than the real destination&lt;br /&gt;
         srcDist = holdLineDist + 5 + dist2d(lastOdoDest, odoPose.pose)&lt;br /&gt;
         dest = poseOnLine(lastOdoDest, odoDest, srcDist)&lt;br /&gt;
         # print(&amp;quot;aim4line target &amp;quot; dtgt &amp;quot;m, new dest &amp;quot; dest)&lt;br /&gt;
      &amp;lt;/block&amp;gt;&lt;br /&gt;
      # else&lt;br /&gt;
      #  print(&amp;quot;aim4line target &amp;quot; dtgt &amp;quot;m, direct dest &amp;quot; dest)&lt;br /&gt;
      destOK = true&lt;br /&gt;
      if (newDest)&lt;br /&gt;
        lastManDist = 100&lt;br /&gt;
      newDest = false;&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    # stop the robot for a pause&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;stopAndWait&amp;quot; if=&amp;quot;smrctl.directWait or&lt;br /&gt;
                                 global.drive.pause or&lt;br /&gt;
                                 global.drive.waitHere&amp;quot;&amp;gt;&lt;br /&gt;
      print(&amp;quot;Stopping ...&amp;quot;)&lt;br /&gt;
      odoPose.tripB = 0&lt;br /&gt;
      odoPose.tripTimeB = 0&lt;br /&gt;
      smr.send(&amp;quot;flushcmds&amp;quot;)&lt;br /&gt;
      smr.do(&amp;#039;setvar &amp;quot;hakoenginespeed&amp;quot; 800&amp;#039;)&lt;br /&gt;
      if (global.drive.waitHere and destOK and odopose.vel &amp;gt; 0.3)&lt;br /&gt;
      &amp;lt;block&amp;gt;&lt;br /&gt;
        # drive towards the destination and stop&lt;br /&gt;
        smr.do(&amp;quot;drive &amp;quot; dest[0] &amp;quot; &amp;quot; dest[1] &amp;quot; &amp;quot; dest[2] &amp;#039; &amp;quot;rad&amp;quot;  @v0.2 : ($targetdist &amp;lt; 0.0) | ($odovelocity &amp;lt; 0.3)&amp;#039;)&lt;br /&gt;
      &amp;lt;/block&amp;gt;&lt;br /&gt;
      smr.send(&amp;quot;idle&amp;quot;)&lt;br /&gt;
      print(&amp;quot;StopAndWait: stopped at pose &amp;quot; odopose.pose)&lt;br /&gt;
      wait() : not if()&lt;br /&gt;
      print(&amp;quot;StopAndWait: resume after pause&amp;quot;)&lt;br /&gt;
      smr.do(&amp;#039;setvar &amp;quot;hakoenginespeed&amp;quot; &amp;#039; global.drive.engineRPM)&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    # test if robot is close to destination&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;closeTest&amp;quot; if=&amp;quot;destOK&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;init&amp;gt;&lt;br /&gt;
          ds = 0&lt;br /&gt;
          rel[2] = 1 # target relative pose x,y,h&lt;br /&gt;
       &amp;lt;/init&amp;gt;&lt;br /&gt;
       # get destination relative to current pose&lt;br /&gt;
       rel = mapToPose(odoPose.pose, odoDest)&lt;br /&gt;
       ds = rulestate.sampletime * smr.speed + 0.1 + global.drive.continueDist&lt;br /&gt;
       # close if x is less that a sample distance, and total distance is small too&lt;br /&gt;
       global.drive.gettingClose = ds &amp;gt; rel[0] and (3.0 &amp;gt; hypot(rel[1], rel[0]) or abs(rel[0]) &amp;gt; abs(rel[1]))&lt;br /&gt;
       destOK = not global.drive.gettingClose&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;replayRenewDrive&amp;quot; if=&amp;quot;not renewDrive&amp;quot;&amp;gt;&lt;br /&gt;
      # renew drive command if driven more than 1 meter&lt;br /&gt;
      # should only be needed in replay mode wih no live MRC to event trigger this renewal&lt;br /&gt;
      &amp;lt;init&amp;gt;&lt;br /&gt;
        d = 0.0&lt;br /&gt;
      &amp;lt;/init&amp;gt;&lt;br /&gt;
      d = dist2d(global.drive.fromPose, odoPose.pose)&lt;br /&gt;
      renewDrive = d &amp;gt; 1&lt;br /&gt;
      if (renewDrive)&lt;br /&gt;
        print(&amp;quot;Rule::replayRenewDrive: Driven 1m, so forced renewal of drive command&amp;quot;)&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    # advance a further distance&lt;br /&gt;
    &amp;lt;rule name=&amp;quot;advance&amp;quot; if=&amp;quot;destOK and&lt;br /&gt;
                             lastManDist &amp;gt; smrctl.manPlanDist and&lt;br /&gt;
                             not global.drive.pause and&lt;br /&gt;
                             smr.connected&amp;quot;&amp;gt;&lt;br /&gt;
      odoPose.tripB = 0&lt;br /&gt;
      odoPose.tripTimeB = 0&lt;br /&gt;
      global.drive.fromPose = odoPose.pose&lt;br /&gt;
      renewDrive = false&lt;br /&gt;
      print(&amp;quot;Drive advance from &amp;quot; odopose.pose &amp;quot; towards &amp;quot; dest &amp;quot; (leg &amp;quot; global.mission.leg &amp;quot;)&amp;quot;)&lt;br /&gt;
      tripStart = now()&lt;br /&gt;
      lastManDist = dist2d(dest, odoPose.pose)&lt;br /&gt;
      drivePos.odo(dest[0], dest[1], dest[2]) : renewDrive or not destOK or global.drive.pause or not smr.connected&lt;br /&gt;
      print(&amp;quot;Drive advance ended leg at odo pose &amp;quot; odopose.pose &amp;quot; (leg &amp;quot; global.mission.leg &amp;quot;)&amp;quot;)&lt;br /&gt;
    &amp;lt;/rule&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
  &amp;lt;/init&amp;gt;&lt;br /&gt;
  # stay alert here&lt;br /&gt;
  wait() : false&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;driveUTM&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parameters x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
  global.drive.lastUtmDest = global.drive.utmDest&lt;br /&gt;
  global.drive.utmDest[0] = x&lt;br /&gt;
  global.drive.utmDest[1] = y&lt;br /&gt;
  if (global.drive.compasHeading == true)&lt;br /&gt;
    global.drive.utmDest[2] = limittopi((90 - h) * pi / 180.0)&lt;br /&gt;
  else&lt;br /&gt;
    if (global.drive.radians)&lt;br /&gt;
      global.drive.utmDest[2] = h&lt;br /&gt;
    else&lt;br /&gt;
      global.drive.utmDest[2] = limittopi(h * pi / 180.0)&lt;br /&gt;
  global.drive.refCoord = 1&lt;br /&gt;
  global.drive.gettingClose = false&lt;br /&gt;
  global.drive.skipDestination = false&lt;br /&gt;
  global.drive.waitHere = false;&lt;br /&gt;
  global.mission.leg = global.mission.leg + 1&lt;br /&gt;
  print(&amp;quot;Leg &amp;quot; global.mission.leg &amp;quot; UTM target pose: x:&amp;quot; x &amp;quot;, y:&amp;quot; y &amp;quot;, h:&amp;quot; h)&lt;br /&gt;
  global.drive.newDest = true&lt;br /&gt;
  wait() : global.drive.gettingClose or global.drive.skipDestination&lt;br /&gt;
  &amp;lt;post&amp;gt;&lt;br /&gt;
    global.drive.newDest = false&lt;br /&gt;
    #global.drive.holdLine=false&lt;br /&gt;
  &amp;lt;/post&amp;gt;&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;driveMap&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parameters x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
  global.drive.lastMapDest = global.drive.mapDest&lt;br /&gt;
  global.drive.mapDest[0] = x&lt;br /&gt;
  global.drive.mapDest[1] = y&lt;br /&gt;
  if (global.drive.compasHeading)&lt;br /&gt;
    global.drive.mapDest[2] = limittopi((90 - h) * pi / 180.0)&lt;br /&gt;
  else&lt;br /&gt;
    if (global.drive.radians)&lt;br /&gt;
      global.drive.mapDest[2] = h&lt;br /&gt;
    else&lt;br /&gt;
      global.drive.mapDest[2] = limittopi(h * pi / 180.0)&lt;br /&gt;
  global.drive.refCoord = 2&lt;br /&gt;
  global.drive.gettingClose = false&lt;br /&gt;
  global.drive.skipDestination = false&lt;br /&gt;
  global.drive.waitHere = false;&lt;br /&gt;
  global.mission.leg = global.mission.leg + 1&lt;br /&gt;
  print(&amp;quot;Leg &amp;quot; global.mission.leg &amp;quot; map target pose: x:&amp;quot; x &amp;quot;, y:&amp;quot; y &amp;quot;, h:&amp;quot; h)&lt;br /&gt;
  global.drive.newDest = true&lt;br /&gt;
  wait() : global.drive.gettingClose or global.drive.skipDestination&lt;br /&gt;
  &amp;lt;post&amp;gt;&lt;br /&gt;
    global.drive.newDest = false&lt;br /&gt;
    #global.drive.holdLine=false&lt;br /&gt;
  &amp;lt;/post&amp;gt;&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;driveNode&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parameters node=&amp;quot;&amp;#039;&amp;#039;&amp;quot; hdg=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;init&amp;gt;&lt;br /&gt;
    nextNode[2] = 0.0;&lt;br /&gt;
  &amp;lt;/init&amp;gt;&lt;br /&gt;
  nextNode[0] = mapbase.node(node, &amp;#039;x&amp;#039;)&lt;br /&gt;
  nextNode[1] = mapbase.node(node, &amp;#039;y&amp;#039;)&lt;br /&gt;
  nextNode[2] = mapbase.node(node, &amp;#039;th&amp;#039;) + hdg&lt;br /&gt;
  driveMap(nextNode[0], nextNode[1], nextNode[2])&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;driveOdo&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parameters x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
  global.drive.lastOdoDest = global.drive.odoDest&lt;br /&gt;
  global.drive.odoDest[0] = x&lt;br /&gt;
  global.drive.odoDest[1] = y&lt;br /&gt;
  if (global.drive.compasHeading)&lt;br /&gt;
    global.drive.odoDest[2] = limittopi((90 - h) * pi / 180.0)&lt;br /&gt;
  else&lt;br /&gt;
    if (global.drive.radians)&lt;br /&gt;
      global.drive.odoDest[2] = h&lt;br /&gt;
    else&lt;br /&gt;
      global.drive.odoDest[2] = limittopi(h * pi / 180.0)&lt;br /&gt;
  global.drive.refCoord = 0&lt;br /&gt;
  global.drive.gettingClose = false&lt;br /&gt;
  global.drive.skipDestination = false&lt;br /&gt;
  global.drive.waitHere = false;&lt;br /&gt;
  global.mission.leg = global.mission.leg + 1&lt;br /&gt;
  print(&amp;quot;Leg &amp;quot; global.mission.leg &amp;quot; odo target pose: x:&amp;quot; x &amp;quot;, y:&amp;quot; y &amp;quot;, h:&amp;quot; h)&lt;br /&gt;
  global.drive.newDest = true&lt;br /&gt;
  wait() : global.drive.gettingClose or global.drive.skipDestination&lt;br /&gt;
  &amp;lt;post&amp;gt;&lt;br /&gt;
    print(&amp;quot;driveodo continues, as gettingClose=&amp;quot; global.drive.gettingClose &amp;quot;, and skip=&amp;quot; global.drive.skipDestination)&lt;br /&gt;
    global.drive.newDest = false&lt;br /&gt;
    #global.drive.holdLine=false&lt;br /&gt;
  &amp;lt;/post&amp;gt;&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;driveWait&amp;quot;&amp;gt;&lt;br /&gt;
  # stop and wait are language keywords&lt;br /&gt;
  # stop here for some seconds&lt;br /&gt;
  &amp;lt;parameters stoptime=&amp;quot;1.0&amp;quot;/&amp;gt;&lt;br /&gt;
  print(&amp;quot;********** stop and wait for &amp;quot; stoptime &amp;quot; sec&amp;quot;)&lt;br /&gt;
  global.drive.waitHere = true;&lt;br /&gt;
  wait(stoptime) : false&lt;br /&gt;
  print(&amp;quot;********** resumes drive&amp;quot;)&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;missionStart&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;parameters missionName=&amp;quot;&amp;#039;noname&amp;#039;&amp;quot;/&amp;gt;&lt;br /&gt;
  global.mission.name=missionName&lt;br /&gt;
  global.mission.leg=0&lt;br /&gt;
  odoPose.tripTimeB= 0&lt;br /&gt;
  odoPose.tripB= 0&lt;br /&gt;
  print(&amp;quot;Mission &amp;quot; global.mission.name &amp;quot; started.&amp;quot;)&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rule name=&amp;quot;missionEnd&amp;quot;&amp;gt;&lt;br /&gt;
  global.drive.waitHere=true&lt;br /&gt;
  wait(2) : false&lt;br /&gt;
  print(&amp;quot;Mission &amp;quot; global.mission.name &amp;quot; stopped after &amp;quot; global.mission.leg &amp;quot; legs.&amp;quot;)&lt;br /&gt;
  print(&amp;quot;Mission took &amp;quot; odoPose.tripTimeB &amp;quot; and drove &amp;quot; odoPose.tripB &amp;quot;m.&amp;quot;)&lt;br /&gt;
&amp;lt;/rule&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jca</name></author>
	</entry>
</feed>